
//***************************************************************************
//
//  (c) 1999 by Microsoft Corp. All Rights Reserved.
//
//  REPOSIT.IDL
//
//  raymcc      18-Mar-99       Created as prototype for Quasar.
//  raymcc      23-Mar-99       Misc. corrections; added IWmiDbIterator
//  cvadai      31-Mar-99       Added Cancel and timeout to IWmiDbIterator
//  cvadai      02-Apr-99       Modified IWmiDbBatchSession parameters.
//  cvadai      06-Apr-99       Changed Logon out parameter to IWmiDbSession.
//  raymcc      06-May-99       New handle type for duplication
//  cvadai      13-May-99       New flags for logon, security.
//  cvadai      29-Jul-99       Removed SetNamespacePath, added Logon param.
//
//***************************************************************************

import "..\wmiutils.idl";

[uuid(2af77340-dd7b-11d2-9217-00aa001f98b5)]

library WmiRepository_v0
{
    importlib("stdole32.tlb");

    interface IWmiDbSession;

    typedef BYTE *PNTSECURITY_DESCRIPTOR;

    typedef enum
    {
        WMIDB_HANDLE_TYPE_INVALID       = 0,

        // Lock level
        WMIDB_HANDLE_TYPE_COOKIE        = 0x1,
        WMIDB_HANDLE_TYPE_VERSIONED     = 0x2,
        WMIDB_HANDLE_TYPE_PROTECTED     = 0x3,
        WMIDB_HANDLE_TYPE_EXCLUSIVE     = 0x4,

        // Cache levels
        WMIDB_HANDLE_TYPE_NO_CACHE      = 0x100,
        WMIDB_HANDLE_TYPE_WEAK_CACHE    = 0x200,
        WMIDB_HANDLE_TYPE_STRONG_CACHE  = 0x300,

        // Special behavior
        WMIDB_HANDLE_TYPE_PERSISTENT    = 0x1000,
        WMIDB_HANDLE_TYPE_AUTODELETE    = 0x2000,

        // Open Context
        WMIDB_HANDLE_TYPE_SCOPE         = 0x10000,
        WMIDB_HANDLE_TYPE_CONTAINER     = 0x20000,

        WMIDB_HANDLE_TYPE_SUBSCOPED     = 0x80000000

    }   WMIDB_HANDLE_TYPE;

    typedef enum
    {
        // Batch operation flags

        WMIDB_FLAG_BEST_EFFORT      = 0x1,
        WMIDB_FLAG_ATOMIC           = 0x2,
        WMIDB_FLAG_LOOKAHEAD        = 0x10

    }  WMIDB_BATCH_FLAGS;

    typedef enum
    {
        // Statistics flags

        WMIDB_FLAG_TOTAL_HANDLES    = 0x1,
        WMIDB_FLAG_CACHE_SATURATION = 0x2,
        WMIDB_FLAG_CACHE_HIT_RATE   = 0x3

    }  WMIDB_STATISTICS_FLAGS;

    typedef enum
    {
        // Logon flags

        WMIDB_FLAG_ADMIN_VERIFIED   = 0x10,
        WMIDB_FLAG_NO_INIT          = 0x20

    }  WMIDB_LOGON_FLAGS;

    typedef enum
    {
        // Security flags

        WMIDB_FLAG_SECURITY_LOCAL_ONLY   = 0x1,
        WMIDB_FLAG_SECURITY_PROPOGATED   = 0x2

    }  WMIDB_SECURITY_FLAGS;

    typedef enum
    {
        // Query flags

        WMIDB_FLAG_QUERY_SHALLOW         = 0x0,
        WMIDB_FLAG_QUERY_DEEP            = 0x1

    }  WMIDB_QUERY_FLAGS;

    typedef enum
    {
        WMIDB_ENABLE_EVENTS             = 0x0,
        WMIDB_DISABLE_EVENTS            = 0x1000

    } WMIDB_EVENT_PUT_DELETE_FLAGS;

	typedef enum
	{
	    // shutdown flags
		WMIDB_SHUTDOWN_NET_STOP         = 0x0,
		WMIDB_SHUTDOWN_MACHINE_DOWN     = 0x1
	} WMIDB_SHUTDOWN_FLAGS;

//***************************************************************************
//
//***************************************************************************


[uuid(89B9BAF8-6A06-11d3-A5FE-00105A0A3102)]
coclass WmiRepository_SQL
{
   interface IWmiDbController;
};

[uuid(89B9BAFC-6A06-11d3-A5FE-00105A0A3102)]
coclass WmiRepository_Jet
{
    interface IWmiDbController;
};

[object, uuid(0bc53e37-dd83-11d2-9217-00aa001f98b5)]

interface IWmiDbHandle : IUnknown
{
    HRESULT GetHandleType([out] DWORD *pdwType);
};

//***************************************************************************
//
//  Logon template definitions
//
//***************************************************************************


typedef struct
{
    DWORD   dwId;
    DWORD   dwFlags;
    BSTR    strParmDisplayName;
    VARIANT Value;
}   WMIDB_LOGON_PARAMETER;

typedef struct
{
    DWORD dwArraySize;
    [size_is(dwArraySize)] WMIDB_LOGON_PARAMETER *pParm;
}   WMIDB_LOGON_TEMPLATE;

//***************************************************************************
//
//***************************************************************************

[object, uuid(2af77343-dd7b-11d2-9217-00aa001f98b5)]

interface IWmiDbController : IUnknown
{
    HRESULT Logon(
        [in]  WMIDB_LOGON_TEMPLATE *pLogonParms,
        [in]  DWORD dwFlags,
        [in]  DWORD dwRequestedHandleType,
        [out] IWmiDbSession **ppSession,
        [out] IWmiDbHandle **ppRootNamespace
        );

    HRESULT GetLogonTemplate(
        [in]   LCID  lLocale,
        [in]   DWORD dwFlags,
        [out]  WMIDB_LOGON_TEMPLATE **ppLogonTemplate
        );

    HRESULT FreeLogonTemplate(
        [in, out] WMIDB_LOGON_TEMPLATE **ppTemplate
        );

    HRESULT Shutdown(
        [in] DWORD dwFlags
        );

    HRESULT SetCallTimeout(
        [in] DWORD dwMaxTimeout
        );

    HRESULT SetCacheValue(
        [in] DWORD dwMaxBytes
        );

    HRESULT FlushCache(
        [in] DWORD dwFlags
        );

    HRESULT GetStatistics(
        [in]  DWORD  dwParameter,
        [out] DWORD *pdwValue
        );

    HRESULT Backup(
		[in] LPCWSTR szBackupFile,
        [in] long lFlags
        );

    HRESULT Restore(
		[in] LPCWSTR szBackupFile,
        [in] long lFlags
        );

	HRESULT LockRepository();

	HRESULT UnlockRepository();

	HRESULT GetRepositoryVersions(
		[out] DWORD *pdwOldVersion, 
		[out] DWORD *pdwCurrentVersion
		);
};

//***************************************************************************
//
//***************************************************************************

[object, uuid(2380c7e0-e14b-11d2-9220-00aa001f98b5)]

interface IWmiDbIterator : IUnknown
{
    HRESULT Cancel (
        [in] DWORD dwFlags,
        [in] void* pFiber);

    HRESULT NextBatch(
        [in] DWORD dwNumRequested,
        [in] DWORD dwTimeOutSeconds,
        [in] DWORD dwFlags,
        [in] DWORD dwRequestedHandleType,
        [in] REFIID riid,
        [in] void* pFiber,
        [out] DWORD *pdwNumReturned,
        [out, size_is(dwNumRequested), length_is(*pdwNumReturned), iid_is(riid)]
            LPVOID *ppObjects
        );
};

//***************************************************************************
//
//***************************************************************************


[object, uuid(2af77345-dd7b-11d2-9217-00aa001f98b5)]

interface IWmiDbSession : IUnknown
{
    HRESULT GetObject(
        [in]  IWmiDbHandle *pScope,
        [in]  IWbemPath *pPath,
        [in]  DWORD dwFlags,
        [in]  DWORD dwRequestedHandleType,
        [out] IWmiDbHandle **ppResult
        );

    HRESULT GetObjectDirect(
        [in]  IWmiDbHandle *pScope,
        [in]  IWbemPath *pPath,
        [in]  DWORD dwFlags,
        [in]  REFIID riid,
        [out, iid_is(riid)] LPVOID *pObj
        );

    HRESULT PutObject(
        [in]  IWmiDbHandle *pScope,
        [in]  REFIID riid,
        [in, iid_is(riid)] LPVOID pObj,
        [in]  DWORD dwFlags,
        [in]  DWORD dwRequestedHandleType,
        [out] IWmiDbHandle **ppResult
        );

    HRESULT DeleteObject(
        [in]  IWmiDbHandle *pScope,
        [in]  DWORD dwFlags,
        [in]  REFIID riid,
        [in, iid_is(riid)]  LPVOID pObj
        );

    HRESULT ExecQuery(
        [in]  IWmiDbHandle *pScope,
        [in]  IWbemQuery *pQuery,
        [in]  DWORD dwFlags,
        [in]  DWORD dwRequestedHandleType,
        [out] DWORD *dwMessageFlags,
        [out] IWmiDbIterator **ppQueryResult
        );

    HRESULT RenameObject(
        [in]  IWbemPath *pOldPath,
        [in]  IWbemPath *pNewPath,
        [in]  DWORD dwFlags,
        [in]  DWORD dwRequestedHandleType,
        [out] IWmiDbHandle **ppResult
        );

    HRESULT Enumerate(
        [in]  IWmiDbHandle *pScope,
        [in]  DWORD dwFlags,
        [in]  DWORD dwRequestedHandleType,
        [out] IWmiDbIterator **ppQueryResult
        );

    HRESULT AddObject(
        [in]  IWmiDbHandle *pScope,
        [in]  IWbemPath *pPath,
        [in]  DWORD dwFlags,
        [in]  DWORD dwRequestedHandleType,
        [out] IWmiDbHandle **ppResult
        );

    HRESULT RemoveObject (
        [in]  IWmiDbHandle *pScope,
        [in]  IWbemPath *pPath,
        [in]  DWORD dwFlags
        );

    HRESULT SetDecoration(
        [in]  LPWSTR lpMachineName,
        [in]  LPWSTR lpNamespacePath
        );

    HRESULT SupportsQueries(
        [in]  DWORD *dwQuerySupportLevel
        );
};

[object, uuid(4b3cca15-0e03-44cb-9b7a-822f9faf6ec0)]
interface IWmiDbSessionEx : IWmiDbSession
{
    HRESULT GetObjectByPath(
        [in]  IWmiDbHandle *pScope,
        [in, string]  LPCWSTR wszPath,
        [in]  DWORD dwFlags,
        [in]  REFIID riid,
        [out, iid_is(riid)] LPVOID *pObj
        );

    HRESULT DeleteObjectByPath(
        [in]  IWmiDbHandle *pScope,
        [in, string]  LPCWSTR wszPath,
        [in]  DWORD dwFlags
        );

	HRESULT BeginWriteTransaction([in] DWORD dwFlags);
	HRESULT BeginReadTransaction([in] DWORD dwFlags);
	HRESULT CommitTransaction([in] DWORD dwFlags);
	HRESULT AbortTransaction([in] DWORD dwFlags);
};

// Dummy interface to work around MIDL not stripping all the interface
// attributes for IWmiDbSession (MIDL 6.00.0328)

[object, uuid(15e6e24f-7432-4da9-9bd4-c33db0df06c0)]
interface I15e6e24f74324da99bd4c33db0df06c0 : IUnknown
{
    HRESULT foo();
};

//***************************************************************************
//
//***************************************************************************

typedef struct
{
    HRESULT hRes;
    DWORD   dwFlags;
    IWbemPath *pPath;
    IUnknown *pHandle;
    IWmiDbHandle *pReturnHandle;
}   WMI_BATCH_OBJECT_ACCESS;

typedef struct
{
    DWORD dwArraySize;
    [size_is(dwArraySize)] WMI_BATCH_OBJECT_ACCESS *pElements;
}   WMIOBJECT_BATCH;

//***************************************************************************
//
//***************************************************************************

[object, uuid(0bc53e39-dd83-11d2-9217-00aa001f98b5)]

interface IWmiDbBatchSession : IUnknown
{
    HRESULT GetObjects(
        [in] IWmiDbHandle *pScope,
        [in] DWORD dwFlags,
        [in] DWORD dwRequestedHandleType,
        [in, out] WMIOBJECT_BATCH *pBatch
        );

    HRESULT PutObjects(
        [in] IWmiDbHandle *pScope,
        [in] DWORD dwFlags,
        [in]  DWORD dwRequestedHandleType,
        [in, out] WMIOBJECT_BATCH *pBatch
        );

    HRESULT DeleteObjects(
        [in] IWmiDbHandle *pScope,
        [in] DWORD dwFlags,
        [in] WMIOBJECT_BATCH *pBatch
        );
};

[object, uuid(843180D9-8489-42d7-BB07-3A5D91818E2E)]

interface IWmiDbBackupRestore : IUnknown
{
    HRESULT Backup (
        [in] LPCWSTR lpBackupPath,
        [in] DWORD dwFlags
        );

    HRESULT Restore (
        [in] LPCWSTR lpRestorePath,
        [in] LPCWSTR lpDestination,
        [in] DWORD dwFlags
        );
};


}; // End of lib

