/*++

Copyright (C) 1996-2001 Microsoft Corporation

Module Name:

    WBEMPROV.IDL

Abstract:

  This IDL file defines the interfaces that WBEM providers need in addition
  to the client interfaces defined in WBEMCLI.IDL

History:

--*/

import "objidl.idl";
import "oleidl.idl";
import "oaidl.idl";
import "wbemcli.idl";


typedef VARIANT WBEM_VARIANT;
typedef [string] WCHAR* WBEM_WSTR;
typedef [string] const WCHAR* WBEM_CWSTR;

typedef [v1_enum] enum tag_WBEM_PROVIDER_REQUIREMENTS_TYPE
{
    WBEM_REQUIREMENTS_START_POSTFILTER = 0,
    WBEM_REQUIREMENTS_STOP_POSTFILTER = 1,
    WBEM_REQUIREMENTS_RECHECK_SUBSCRIPTIONS = 2
} WBEM_PROVIDER_REQUIREMENTS_TYPE;

[uuid(092df710-7010-11d1-ad90-00c04fd8fdff)]
library WbemProviders_v1
{
    interface IWbemPropertyProvider;
    interface IWbemUnboundObjectSink;
    interface IWbemEventProvider;
    interface IWbemEventProviderQuerySink;
    interface IWbemEventProviderSecurity;
    interface IWbemEventConsumerProvider;
    interface IWbemEventConsumerProviderEx;

    interface IWbemProviderInitSink;
    interface IWbemProviderInit;
    interface IWbemHiPerfProvider;

	interface IWbemDecoupledRegistrar ;

    /////////////////////////////////////////////////////////////////
    //

    [uuid(cb8555cc-9128-11d1-ad9b-00c04fd8fdff)]
    coclass WbemAdministrativeLocator
    {
        interface IWbemLocator;
    };

	// this assumes that the transport has verified that
	// the user has access.  Unlike the Administrative locator,
	// it increases the count of external connections

    [uuid(cd184336-9128-11d1-ad9b-00c04fd8fdff)]
    coclass WbemAuthenticatedLocator
    {
        interface IWbemLocator;
    };

	// this is used by providers who dont know if a user
	// has access or not.

    [uuid(443E7B79-DE31-11d2-B340-00104BCC4B4A)]
    coclass WbemUnauthenticatedLocator
    {
        interface IWbemLocator;
    };

	// this is used by providers that do not wish to be instantiated
	// by winmgmt, rather the provider registers it's participation 
	// in servicing client requests as and when desired. This is 
	// primarily used by providers that act on the part of application
	// hosts and that export management information only when they are activated
	// via some application scenario. 

    [uuid(4cfc7932-0f9d-4bef-9c32-8ea2a6b56fcb)]
    coclass WbemDecoupledRegistrar
    {
        interface IWbemDecoupledRegistrar ;
    };

    [uuid(f5f75737-2843-4f22-933d-c76a97cda62f)]
    coclass WbemDecoupledBasicEventProvider
    {
        interface IWbemDecoupledBasicEventProvider ;
    };


};

#define OPTIONAL in, unique

[restricted, object, uuid(e246107b-b06e-11d0-ad61-00c04fd8fdff)]
interface IWbemUnboundObjectSink : IUnknown
{
    HRESULT IndicateToConsumer(
        [in] IWbemClassObject* pLogicalConsumer,
        [in] long lNumObjects,
        [in, size_is(lNumObjects)] IWbemClassObject** apObjects);
};


/////////////////////////////////////////////////////////////////
//
//

[restricted, object, uuid(CE61E841-65BC-11d0-B6BD-00AA003240C7)]

interface IWbemPropertyProvider : IUnknown
{
    HRESULT GetProperty(
        [in] long lFlags,
        [in] const BSTR strLocale,
        [in] const BSTR strClassMapping,
        [in] const BSTR strInstMapping,
        [in] const BSTR strPropMapping,
        [out] VARIANT* pvValue
        );
        
    HRESULT PutProperty(
        [in] long lFlags,
        [in] const BSTR strLocale,
        [in] const BSTR strClassMapping,
        [in] const BSTR strInstMapping,
        [in] const BSTR strPropMapping,
        [in] const VARIANT* pvValue
        );        
};

[restricted, object, uuid(e245105b-b06e-11d0-ad61-00c04fd8fdff)]
interface IWbemEventProvider : IUnknown
{
    HRESULT ProvideEvents(
                [in] IWbemObjectSink* pSink,
                [in] long lFlags
            );
};

[restricted, object, uuid(580acaf8-fa1c-11d0-ad72-00c04fd8fdff)]
interface IWbemEventProviderQuerySink : IUnknown
{
    HRESULT NewQuery(
                [in] unsigned long dwId,
                [in] WBEM_WSTR wszQueryLanguage,
                [in] WBEM_WSTR wszQuery
            );
    HRESULT CancelQuery(
                [in] unsigned long dwId);
};

[restricted, object, uuid(631f7d96-d993-11d2-b339-00105a1f4aaf)]
interface IWbemEventProviderSecurity : IUnknown
{
    HRESULT AccessCheck(
                [in] WBEM_CWSTR wszQueryLanguage,
                [in] WBEM_CWSTR wszQuery,
                [in] long lSidLength,
                [in, size_is(lSidLength), unique] const BYTE* pSid);
};

[restricted, object, uuid(631f7d97-d993-11d2-b339-00105a1f4aaf)]
interface IWbemProviderIdentity : IUnknown
{
    HRESULT SetRegistrationObject(
                [in] long lFlags,
                [in] IWbemClassObject* pProvReg);
};


[restricted, object, uuid(e246107a-b06e-11d0-ad61-00c04fd8fdff)]
interface IWbemEventConsumerProvider : IUnknown
{
     HRESULT FindConsumer(
                [in] IWbemClassObject* pLogicalConsumer,
                [out] IWbemUnboundObjectSink** ppConsumer);
};

[object, restricted, uuid(17cf534a-d8a3-4ad0-ac92-5e3d01717151)]
interface IWbemEventConsumerProviderEx : IWbemEventConsumerProvider
{
    HRESULT ValidateSubscription(
                [in] IWbemClassObject* pLogicalConsumer);
};

typedef enum tag_WBEM_EXTRA_RETURN_CODES
{
    WBEM_S_INITIALIZED = 0,
    WBEM_S_LIMITED_SERVICE = 0x43001,
    WBEM_S_INDIRECTLY_UPDATED,
    WBEM_S_SUBJECT_TO_SDS,
    

    WBEM_E_RETRY_LATER = 0x80043001,
    WBEM_E_RESOURCE_CONTENTION,
} WBEM_EXTRA_RETURN_CODES;

typedef enum tag_WBEM_PROVIDER_FLAGS
{
    WBEM_FLAG_OWNER_UPDATE = 0x10000,
} WBEM_PROVIDER_FLAGS;



[object, uuid(1be41571-91dd-11d1-aeb2-00c04fb68820)]

interface IWbemProviderInitSink : IUnknown
{
    HRESULT SetStatus(
        [in] LONG lStatus,
        [in] LONG lFlags 
        );
};



[object, uuid(1be41572-91dd-11d1-aeb2-00c04fb68820)]

interface IWbemProviderInit : IUnknown
{
    HRESULT Initialize(
        [in, unique, string] LPWSTR wszUser,
        [in] LONG lFlags,
        [in, string] LPWSTR wszNamespace,
        [in, unique, string] LPWSTR wszLocale,
        [in] IWbemServices* pNamespace,
        [in] IWbemContext* pCtx,
        [in] IWbemProviderInitSink* pInitSink    
        );
};

[local, restricted, object, uuid(49353c93-516b-11d1-aea6-00c04fb68820)]
interface IWbemHiPerfProvider : IUnknown
{
    HRESULT QueryInstances(
            [in] IWbemServices* pNamespace,
            [in, string] WCHAR* wszClass,
            [in] long lFlags,
            [in] IWbemContext* pCtx,
            [in] IWbemObjectSink* pSink     // Return IWbemClassObject ptrs 
        );

    HRESULT CreateRefresher(
            [in] IWbemServices* pNamespace,
            [in] long lFlags,
            [out] IWbemRefresher** ppRefresher);

    HRESULT CreateRefreshableObject(
            [in] IWbemServices* pNamespace,
            [in] IWbemObjectAccess* pTemplate,
            [in] IWbemRefresher* pRefresher,
            [in] long lFlags,
            [in] IWbemContext* pContext,
            [out] IWbemObjectAccess** ppRefreshable,
            [out] long* plId);

    HRESULT StopRefreshing(
            [in] IWbemRefresher* pRefresher,
            [in] long lId,
            [in] long lFlags);

	HRESULT CreateRefreshableEnum(
            [in] IWbemServices* pNamespace,
            [in, string] LPCWSTR wszClass,
            [in] IWbemRefresher* pRefresher,
            [in] long lFlags,
            [in] IWbemContext* pContext,
            [in] IWbemHiPerfEnum* pHiPerfEnum,
            [out] long* plId);

	HRESULT GetObjects(
            [in] IWbemServices* pNamespace,
			[in] long lNumObjects,
			[in,out,size_is(lNumObjects)] IWbemObjectAccess** apObj,
            [in] long lFlags,
            [in] IWbemContext* pContext);

};

[object, local, uuid(1005cbcf-e64f-4646-bcd3-3a089d8a84b4)]
interface IWbemDecoupledRegistrar : IUnknown
{
	HRESULT Register (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in] LPCWSTR a_User ,
		[in] LPCWSTR a_Locale ,
		[in] LPCWSTR a_Scope ,
		[in] LPCWSTR a_Registration ,
		[in] IUnknown *a_Unknown
	) ;

	HRESULT UnRegister () ;
} ;

[object, local, uuid(86336d20-ca11-4786-9ef1-bc8a946b42fc)]
interface IWbemDecoupledBasicEventProvider : IWbemDecoupledRegistrar
{
	HRESULT GetSink (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[out] IWbemObjectSink **a_Sink
	) ;

	HRESULT GetService (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[out] IWbemServices **a_Service
	) ;

} ;

typedef [v1_enum] enum tag_WBEM_BATCH_TYPE
{
    WBEM_FLAG_BATCH_IF_NEEDED = 0,
    WBEM_FLAG_MUST_BATCH = 0x1,
    WBEM_FLAG_MUST_NOT_BATCH = 0x2
} WBEM_BATCH_TYPE;


[object, restricted, uuid(3ae0080a-7e3a-4366-bf89-0feedc931659)]
interface IWbemEventSink : IWbemObjectSink
{
    HRESULT SetSinkSecurity(
                [in] long lSDLength,
                [in, size_is(lSDLength)] BYTE* pSD);

    HRESULT IsActive();

    HRESULT GetRestrictedSink(
                [in] long lNumQueries,
                [in, size_is(lNumQueries), string] const LPCWSTR* awszQueries,
                [in] IUnknown* pCallback,
                [out] IWbemEventSink** ppSink);

    HRESULT SetBatchingParameters(
                [in] LONG lFlags,
                [in] DWORD dwMaxBufferSize,
                [in] DWORD dwMaxSendLatency);
};

