//*************************************************************************** // // Copyright © Microsoft Corporation. All rights reserved. // // Provider.h // // Purpose: declaration of Provider class // //*************************************************************************** #if _MSC_VER > 1000 #pragma once #endif #ifndef _PROVIDER_H__ #define _PROVIDER_H__ ///////////////////////////////////////////////////// // INSTANCE Provider // // pure virtual base class for providers // holds instances // gathers information and instantiates instances ///////////////////////////////////////////////////// class POLARITY Provider : public CThreadBase { // CWbemProviderGlue needs to access some protected/private methods // which we don't want to publish to just anyone. friend class CWbemProviderGlue; public: Provider( LPCWSTR a_pszName, LPCWSTR a_pszNameSpace = NULL ); ~Provider(); protected: /* Override These Methods To Implement Your Provider */ // This is the entrypoint for changes. // You are handed a changed instance. // If you can make the changes - do so. // If you cannot return an appropriate error code (WBEM_E_XXXXXXX) // base object returns WBEM_E_PROVIDER_NOT_CAPABLE virtual HRESULT PutInstance(const CInstance& newInstance, long lFlags = 0L); // entrypoint to delete an instance // examine the instance passed in, determine whether you can delete it virtual HRESULT DeleteInstance(const CInstance& newInstance, long lFlags = 0L); // execute a method virtual HRESULT ExecMethod(const CInstance& cInstance, const BSTR bstrMethodName, CInstance *pInParams, CInstance *pOutParams, long lFlags = 0L); // find and create all instances of your class virtual HRESULT EnumerateInstances(MethodContext *pMethodContext, long lFlags = 0L); // you will be given an object with the key properties filled in // you need to fill in all of the rest of the properties, or // return WBEM_E_NOT_FOUND if the object doesn't exist. virtual HRESULT GetObject(CInstance *pInstance, long lFlags = 0L); // You will be given an object with the key properties filled in. // You can either fill in all the properties, or check the Query object // to see what properties are required. If you don't implement this method, the // GetObject(CInstance, long) method will be called instead. virtual HRESULT GetObject(CInstance *pInstance, long lFlags, CFrameworkQuery &Query); // If a provider wants to process queries, they should override this virtual HRESULT ExecQuery(MethodContext *pMethodContext, CFrameworkQuery& cQuery, long lFlags = 0L); // flushes cache // only override if you allocate memory that could be flushed virtual void Flush(void); /* Helpers - Use These, Do Not Override */ // allocate a new instance & return pointer to it // the memory is your responsibility to Release() // UNLESS you pass it off to Provider::Commit CInstance *CreateNewInstance(MethodContext *pMethodContext); // used to send your new instance back to the framework // set bCache to true to cache object // !! caching is NOT IMPLEMENTED in this release !! // do not delete or release the pointer once committed. HRESULT Commit(CInstance *pInstance, bool bCache = false); // Helper function for building a WBEM Object Path for a local Instance bool GetLocalInstancePath( const CInstance *pInstance, CHString& strPath ); // Builds a full instance path from a relative path CHString MakeLocalPath( const CHString &strRelPath ); // Returns the computer name as a CHString. Save yourself the os call, // since we've got it hanging around anyway. const CHString &GetLocalComputerName() {return s_strComputerName;} const CHString &GetNamespace() {return m_strNameSpace;} // sets the CreationClassName property to the name of this provider bool SetCreationClassName(CInstance *pInstance); // accesses the name of the provider const CHString &GetProviderName() {return m_name;} // Flag validation constants enum FlagDefs { EnumerationFlags = (WBEM_FLAG_DIRECT_READ | WBEM_FLAG_SEND_STATUS), GetObjFlags = (WBEM_FLAG_SEND_STATUS | WBEM_FLAG_DIRECT_READ), MethodFlags = WBEM_FLAG_SEND_STATUS, DeletionFlags = WBEM_FLAG_SEND_STATUS, PutInstanceFlags = (WBEM_FLAG_CREATE_ONLY | WBEM_FLAG_CREATE_OR_UPDATE | WBEM_FLAG_UPDATE_ONLY | WBEM_FLAG_SEND_STATUS), QueryFlags = WBEM_FLAG_SEND_STATUS | WBEM_FLAG_DIRECT_READ }; // returns WBEM_E_UNSUPPORTED_PARAMETER or WBEM_S_NO_ERROR HRESULT ValidateFlags(long lFlags, FlagDefs lAcceptableFlags); // you can override the following to support flags // above and beyond those listed in FlagDefs above virtual HRESULT ValidateEnumerationFlags(long lFlags); virtual HRESULT ValidateGetObjFlags(long lFlags); virtual HRESULT ValidateMethodFlags(long lFlags); virtual HRESULT ValidateQueryFlags(long lFlags); virtual HRESULT ValidateDeletionFlags(long lFlags); virtual HRESULT ValidatePutInstanceFlags(long lFlags); private: IWbemServices *m_pIMosProvider; // provides instances CHString m_name; // name of this provider CHString m_strNameSpace; // name of this provider's namespace IWbemClassObject *m_piClassObject; // holds class object from which others are cloned. static CHString s_strComputerName; // Holds the computer name for building // instance paths. BOOL ValidateIMOSPointer( void ); // This function ensures that our IMOS // pointer is available, and is called // by the framework entrypoint functions /* Interfaces For Use by the Framework */ HRESULT GetObject( ParsedObjectPath *pParsedObjectPath, MethodContext *pContext, long lFlags = 0L ); HRESULT ExecuteQuery( MethodContext *pContext, CFrameworkQuery &pQuery, long lFlags = 0L); HRESULT CreateInstanceEnum( MethodContext *pContext, long lFlags = 0L ); HRESULT PutInstance( IWbemClassObject __RPC_FAR *pInst, long lFlags, MethodContext *pContext ); HRESULT DeleteInstance( ParsedObjectPath *pParsedObjectPath, long lFlags, MethodContext *pContext ); HRESULT ExecMethod( ParsedObjectPath *pParsedObjectPath, BSTR bstrMethodName, long lFlags, CInstance *pInParams, CInstance *pOutParams, MethodContext *pContext ); // Static helper function called by constructor to make sure the // computer name variable is properly initialized. static void WINAPI InitComputerName( void ); // Sets an instance key from a parsed object path. BOOL SetKeyFromParsedObjectPath( CInstance *pInstance, ParsedObjectPath *pParsedObjectPath ); IWbemClassObject *GetClassObjectInterface(MethodContext *pMethodContext); }; #endif