You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
8.0 KiB
184 lines
8.0 KiB
//***************************************************************************
|
|
//
|
|
// 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
|