//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace System.ServiceModel.ComIntegration
{
    using System;
    using System.Collections;
    using System.Runtime.InteropServices;

    /*
     * Stolen from ES.
     * I removed SuppressUnmanagedCodeSecurity. We can re-add it later.
     */

    enum COMAdminThreadingModel
    {
        Apartment = 0,
        Free = 1,
        Main = 2,
        Both = 3,
        Neutral = 4,
        NotSpecified = 5
    }

    enum COMAdminIsolationLevel
    {
        Any = 0,
        ReadUncommitted = 1,
        ReadCommitted = 2,
        RepeatableRead = 3,
        Serializable = 4
    }

    [ComImport]
    [Guid("790C6E0B-9194-4cc9-9426-A48A63185696")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    internal interface ICatalog2
    {
        [DispId(0x00000001)]
        [return: MarshalAs(UnmanagedType.Interface)]
        Object GetCollection([In, MarshalAs(UnmanagedType.BStr)] 
            String bstrCollName);

        [DispId(0x00000002)]
        [return: MarshalAs(UnmanagedType.Interface)]
        Object Connect([In, MarshalAs(UnmanagedType.BStr)] String connectStr);

        [DispId(0x00000003)]
        int MajorVersion();

        [DispId(0x00000004)]
        int MinorVersion();

        [DispId(0x00000005)]
        [return: MarshalAs(UnmanagedType.Interface)]
        Object GetCollectionByQuery([In, MarshalAs(UnmanagedType.BStr)] 
            String collName,
            [In, MarshalAs(UnmanagedType.SafeArray)] 
            ref Object[] aQuery);

        [DispId(0x00000006)]
        void ImportComponent([In, MarshalAs(UnmanagedType.BStr)] String bstrApplIdOrName,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrCLSIDOrProgId);

        [DispId(0x00000007)]
        void InstallComponent([In, MarshalAs(UnmanagedType.BStr)] String bstrApplIdOrName,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrDLL,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrTLB,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrPSDLL);

        [DispId(0x00000008)]
        void ShutdownApplication([In, MarshalAs(UnmanagedType.BStr)] String bstrApplIdOrName);

        [DispId(0x00000009)]
        void ExportApplication([In, MarshalAs(UnmanagedType.BStr)] String bstrApplIdOrName,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationFile,
            [In] int lOptions);

        [DispId(0x0000000a)]
        void InstallApplication([In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationFile,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrDestinationDirectory,
            [In] int lOptions,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrUserId,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrPassword,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrRSN);

        [DispId(0x0000000b)]
        void StopRouter();

        [DispId(0x0000000c)]
        void RefreshRouter();

        [DispId(0x0000000d)]
        void StartRouter();

        [DispId(0x0000000e)]
        void Reserved1();

        [DispId(0x0000000f)]
        void Reserved2();

        [DispId(0x00000010)]
        void InstallMultipleComponents([In, MarshalAs(UnmanagedType.BStr)] String bstrApplIdOrName,
            [In, MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] fileNames,
            [In, MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] CLSIDS);

        [DispId(0x00000011)]
        void GetMultipleComponentsInfo([In, MarshalAs(UnmanagedType.BStr)] String bstrApplIdOrName,
            [In] Object varFileNames,
            [Out, MarshalAs(UnmanagedType.SafeArray)] out Object[] varCLSIDS,
            [Out, MarshalAs(UnmanagedType.SafeArray)] out Object[] varClassNames,
            [Out, MarshalAs(UnmanagedType.SafeArray)] out Object[] varFileFlags,
            [Out, MarshalAs(UnmanagedType.SafeArray)] out Object[] varComponentFlags);

        [DispId(0x00000012)]
        void RefreshComponents();

        [DispId(0x00000013)]
        void BackupREGDB([In, MarshalAs(UnmanagedType.BStr)] String bstrBackupFilePath);

        [DispId(0x00000014)]
        void RestoreREGDB([In, MarshalAs(UnmanagedType.BStr)] String bstrBackupFilePath);

        [DispId(0x00000015)]
        void QueryApplicationFile([In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationFile,
            [Out, MarshalAs(UnmanagedType.BStr)] out String bstrApplicationName,
            [Out, MarshalAs(UnmanagedType.BStr)] out String bstrApplicationDescription,
            [Out, MarshalAs(UnmanagedType.VariantBool)] out bool bHasUsers,
            [Out, MarshalAs(UnmanagedType.VariantBool)] out bool bIsProxy,
            [Out, MarshalAs(UnmanagedType.SafeArray)] out Object[] varFileNames);

        [DispId(0x00000016)]
        void StartApplication([In, MarshalAs(UnmanagedType.BStr)] String bstrApplIdOrName);

        [DispId(0x00000017)]
        int ServiceCheck([In] int lService);

        [DispId(0x00000018)]
        void InstallMultipleEventClasses([In, MarshalAs(UnmanagedType.BStr)] String bstrApplIdOrName,
            [In, MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] fileNames,
            [In, MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] CLSIDS);

        [DispId(0x00000019)]
        void InstallEventClass([In, MarshalAs(UnmanagedType.BStr)] String bstrApplIdOrName,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrDLL,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrTLB,
            [In, MarshalAs(UnmanagedType.BStr)] String bstrPSDLL);

        [DispId(0x0000001a)]
        void GetEventClassesForIID([In] String bstrIID,
            [In, Out, MarshalAs(UnmanagedType.SafeArray)] ref Object[] varCLSIDS,
            [In, Out, MarshalAs(UnmanagedType.SafeArray)] ref Object[] varProgIDs,
            [In, Out, MarshalAs(UnmanagedType.SafeArray)] ref Object[] varDescriptions);

        [DispId(0x0000001b)]
        [return: MarshalAs(UnmanagedType.Interface)]
        Object GetCollectionByQuery2(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrCollectionName,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarQueryStrings);

        [DispId(0x0000001c)]
        [return: MarshalAs(UnmanagedType.BStr)]
        String GetApplicationInstanceIDFromProcessID([In, MarshalAs(UnmanagedType.I4)] int lProcessID);

        [DispId(0x0000001d)]
        void ShutdownApplicationInstances([In, MarshalAs(UnmanagedType.LPStruct)] Object pVarApplicationInstanceID);

        [DispId(0x0000001e)]
        void PauseApplicationInstances([In, MarshalAs(UnmanagedType.LPStruct)] Object pVarApplicationInstanceID);

        [DispId(0x0000001f)]
        void ResumeApplicationInstances([In, MarshalAs(UnmanagedType.LPStruct)] Object pVarApplicationInstanceID);

        [DispId(0x00000020)]
        void RecycleApplicationInstances(
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarApplicationInstanceID,
                                [In, MarshalAs(UnmanagedType.I4)] int lReasonCode);

        [DispId(0x00000021)]
        [return: MarshalAs(UnmanagedType.VariantBool)]
        bool AreApplicationInstancesPaused([In, MarshalAs(UnmanagedType.LPStruct)] Object pVarApplicationInstanceID);

        [DispId(0x00000022)]
        [return: MarshalAs(UnmanagedType.BStr)]
        String DumpApplicationInstance(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationInstanceID,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrDirectory,
                                [In, MarshalAs(UnmanagedType.I4)] int lMaxImages);

        [DispId(0x00000023)]
        [return: MarshalAs(UnmanagedType.VariantBool)]
        bool IsApplicationInstanceDumpSupported();

        [DispId(0x00000024)]
        void CreateServiceForApplication(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationIDOrName,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrServiceName,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrStartType,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrErrorControl,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrDependencies,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrRunAs,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrPassword,
                                [In, MarshalAs(UnmanagedType.VariantBool)] bool bDesktopOk);

        [DispId(0x00000025)]
        void DeleteServiceForApplication([In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationIDOrName);

        [DispId(0x00000026)]
        [return: MarshalAs(UnmanagedType.BStr)]
        String GetPartitionID([In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationIDOrName);

        [DispId(0x00000027)]
        [return: MarshalAs(UnmanagedType.BStr)]
        String GetPartitionName([In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationIDOrName);

        [DispId(0x00000028)]
        void CurrentPartition([In, MarshalAs(UnmanagedType.BStr)]String bstrPartitionIDOrName);

        [DispId(0x00000029)]
        [return: MarshalAs(UnmanagedType.BStr)]
        String CurrentPartitionID();

        [DispId(0x0000002A)]
        [return: MarshalAs(UnmanagedType.BStr)]
        String CurrentPartitionName();

        [DispId(0x0000002B)]
        [return: MarshalAs(UnmanagedType.BStr)]
        String GlobalPartitionID();

        [DispId(0x0000002C)]
        void FlushPartitionCache();

        [DispId(0x0000002D)]
        void CopyApplications(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrSourcePartitionIDOrName,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarApplicationID,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrDestinationPartitionIDOrName);

        [DispId(0x0000002E)]
        void CopyComponents(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrSourceApplicationIDOrName,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarCLSIDOrProgID,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrDestinationApplicationIDOrName);

        [DispId(0x0000002F)]
        void MoveComponents(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrSourceApplicationIDOrName,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarCLSIDOrProgID,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrDestinationApplicationIDOrName);

        [DispId(0x00000030)]
        void AliasComponent(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrSrcApplicationIDOrName,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrCLSIDOrProgID,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrDestApplicationIDOrName,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrNewProgId,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrNewClsid);

        [DispId(0x00000031)]
        [return: MarshalAs(UnmanagedType.Interface)]
        Object IsSafeToDelete([In, MarshalAs(UnmanagedType.BStr)] String bstrDllName);

        [DispId(0x00000032)]
        void ImportUnconfiguredComponents(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationIDOrName,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarCLSIDOrProgID,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarComponentType);

        [DispId(0x00000033)]
        void PromoteUnconfiguredComponents(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationIDOrName,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarCLSIDOrProgID,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarComponentType);

        [DispId(0x00000034)]
        void ImportComponents(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationIDOrName,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarCLSIDOrProgID,
                                [In, MarshalAs(UnmanagedType.LPStruct)] Object pVarComponentType);

        [DispId(0x00000035)]
        [return: MarshalAs(UnmanagedType.VariantBool)]
        bool Is64BitCatalogServer();

        [DispId(0x00000036)]
        void ExportPartition(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrPartitionIDOrName,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrPartitionFileName,
                                [In, MarshalAs(UnmanagedType.I4)] int lOptions);

        [DispId(0x00000037)]
        void InstallPartition(
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrFileName,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrDestDirectory,
                                [In, MarshalAs(UnmanagedType.I4)] int lOptions,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrUserID,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrPassword,
                                [In, MarshalAs(UnmanagedType.BStr)] String bstrRSN);

        [DispId(0x00000038)]
        [return: MarshalAs(UnmanagedType.IDispatch)]
        Object QueryApplicationFile2([In, MarshalAs(UnmanagedType.BStr)] String bstrApplicationFile);

        [DispId(0x00000039)]
        [return: MarshalAs(UnmanagedType.I4)]
        int GetComponentVersionCount([In, MarshalAs(UnmanagedType.BStr)] String bstrCLSIDOrProgID);
    }

    [ComImport]
    [Guid("6EB22871-8A19-11D0-81B6-00A0C9231C29")]
    internal interface ICatalogObject
    {
        [DispId(0x00000001)]
        Object GetValue([In, MarshalAs(UnmanagedType.BStr)] String propName);

        [DispId(0x00000001)]
        void SetValue([In, MarshalAs(UnmanagedType.BStr)] String propName,
                      [In] Object value);

        [DispId(0x00000002)]
        Object Key();

        [DispId(0x00000003)]
        Object Name();

        [DispId(0x00000004)]
        [return: MarshalAs(UnmanagedType.VariantBool)]
        bool IsPropertyReadOnly([In, MarshalAs(UnmanagedType.BStr)] String bstrPropName);

        bool Valid
        {
            [DispId(0x00000005)]
            [return: MarshalAs(UnmanagedType.VariantBool)]
            get;
        }

        [DispId(0x00000006)]
        [return: MarshalAs(UnmanagedType.VariantBool)]
        bool IsPropertyWriteOnly([In, MarshalAs(UnmanagedType.BStr)] String bstrPropName);
    }

    [ComImport]
    [Guid("6EB22872-8A19-11D0-81B6-00A0C9231C29")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    internal interface ICatalogCollection
    {
        [DispId(unchecked((int)0xfffffffc))]
        void GetEnumerator(out IEnumerator pEnum);

        [DispId(0x00000001)]
        [return: MarshalAs(UnmanagedType.Interface)]
        Object Item([In] int lIndex);

        [DispId(0x60020002)]
        int Count();

        [DispId(0x60020003)]
        void Remove([In] int lIndex);

        [DispId(0x60020004)]
        [return: MarshalAs(UnmanagedType.Interface)]
        Object Add();

        [DispId(0x00000002)]
        void Populate();

        [DispId(0x00000003)]
        int SaveChanges();

        [DispId(0x00000004)]
        [return: MarshalAs(UnmanagedType.Interface)]
        Object GetCollection([In, MarshalAs(UnmanagedType.BStr)] String bstrCollName,
                             [In] Object varObjectKey);

        [DispId(0x00000006)]
        Object Name();

        bool IsAddEnabled
        {
            [DispId(0x00000007)]
            [return: MarshalAs(UnmanagedType.VariantBool)]
            get;
        }

        bool IsRemoveEnabled
        {
            [DispId(0x00000008)]
            [return: MarshalAs(UnmanagedType.VariantBool)]
            get;
        }

        [DispId(0x00000009)]
        [return: MarshalAs(UnmanagedType.Interface)]
        Object GetUtilInterface();

        int DataStoreMajorVersion
        {
            [DispId(0x0000000a)]
            get;
        }

        int DataStoreMinorVersion
        {
            [DispId(0x0000000b)]
            get;
        }

        void PopulateByKey([In, MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
                           Object[] aKeys);

        [DispId(0x0000000d)]
        void PopulateByQuery([In, MarshalAs(UnmanagedType.BStr)] String bstrQueryString,
                             [In] int lQueryType);
    }

    [ComImport]
    [Guid("F618C514-DFB8-11D1-A2CF-00805FC79235")]
    internal class xCatalog { }
}