///////////////////////////////////////////////////////////////////////////////////////////////////////// // // Microsoft WMI OLE DB Provider // (C) Copyright 1999 Microsoft Corporation. All Rights Reserved. // // CDataSource base object and contained interface definitions // ///////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _DATASRC_H_ #define _DATASRC_H_ #include "headers.h" #include "errinf.h" /////////////////////////////////////////////////////////////////////////////////// // Forward declarations /////////////////////////////////////////////////////////////////////////////////// class CImpIDBInitialize; class CImpIDBProperties; class CImpIDBInfo; class CImpIDBCreateSession; class CImpIPersistFile; class CDataSource; class CImpIDBDataSrcAdmin; class CImpIObjectAccessControl; class CImpISecurityInfo; typedef CImpIDBInitialize* PIMPIDBINITIALIZE; typedef CImpIDBProperties* PIMPIDBProperties; typedef CImpIDBInfo* PIMPIDBINFO; typedef CImpIDBCreateSession* PIMPIDBCREATESESSION; typedef CImpIPersistFile* PIMPIPERSISTFILE; typedef CDataSource* PCDATASOURCE; typedef CImpIDBDataSrcAdmin* PIDBDATASRCADMIN; typedef CImpIObjectAccessControl* PIOBJACCESSCTRL; typedef CImpISecurityInfo * PIMPISECURITYINFO; /////////////////////////////////////////////////////////////////////////////////// // // CDataSource: Containing class for all interfaces on the Datasource // CoType Object // /////////////////////////////////////////////////////////////////////////////////// class CDataSource : public CBaseObj { //========================================== // Contained interfaces are friends //========================================== friend class CImpIDBInitialize; friend class CImpIDBInfo; friend class CImpIDBProperties; friend class CImpIDBCreateSession; friend class CImpIPersistFile; friend class CDBSession; friend class CImpIDBDataSrcAdmin; friend class CImpISupportErrorInfo; friend class CImpIObjectAccessControl; friend class CImpISecurityInfo; protected: BOOL m_fDSOInitialized; // TRUE if this Data Source object is an an initialized state BOOL m_fDBSessionCreated; // TRUE if DBSession object has been created PCUTILPROP m_pUtilProp; // Utility object to manage properties PIMPIDBINITIALIZE m_pIDBInitialize; // Contained IDBInitialize PIMPIDBProperties m_pIDBProperties; // Contained IDBProperties PIMPIDBINFO m_pIDBInfo; // Contained IDBInfo PIMPIDBCREATESESSION m_pIDBCreateSession; // contained IDBCreateSession PIMPIPERSISTFILE m_pIPersistFile; // contained IPersistFile // PIMPIPERSISTFILE m_pIPersistFile; PIDBDATASRCADMIN m_pIDBDataSourceAdmin; //contained IDBDataSourceAdmin interface PIOBJACCESSCTRL m_pIObjectAccessControl; // contained IObjectAccessControl PIMPISUPPORTERRORINFO m_pISupportErrorInfo; //DataSource interface PIMPISECURITYINFO m_pISecurityInfo; CErrorData m_CErrorData; // Error data object BOOL m_bIsPersitFileDirty; // flag to indicate whether persist file is dirty or not BSTR m_strPersistFileName; // Name of the file in which datasource is persisted HRESULT AddInterfacesForISupportErrorInfo(); HRESULT AdjustPreviligeTokens(); HRESULT InitializeConnectionProperties(); HRESULT CreateSession(IUnknown* pUnkOuter, //IN Controlling IUnknown if being aggregated REFIID riid, //IN The ID of the interface IUnknown** ppDBSession); public: CDataSource(LPUNKNOWN); ~CDataSource(void); HRESULT FInit(void); //Intitialization Routine STDMETHODIMP QueryInterface(REFIID, LPVOID *);// Request an Interface STDMETHODIMP_(ULONG) AddRef(void); //Increments the Reference count STDMETHODIMP_(ULONG) Release(void); //Decrements the Reference count inline VOID RemoveSession(void) //Set the DBSessionCreated flag to FALSE { m_fDBSessionCreated = FALSE;}; inline CErrorData * GetErrorDataPtr() { return &m_CErrorData; } //========================================================================== // The wbem api //========================================================================== CWbemConnectionWrapper* m_pWbemWrap; HRESULT GetDataSrcProperty(DBPROPID propId , VARIANT & varValue); void SetPersistDirty() { m_bIsPersitFileDirty = FALSE; } void ReSetPersistDirty() { m_bIsPersitFileDirty = TRUE; } HRESULT GetConnectionInitProperties(DBPROPSET** pprgPropertySets) { return m_pUtilProp->GetConnectionInitProperties(pprgPropertySets); } }; /////////////////////////////////////////////////////////////////////////////////// typedef CDataSource *PCDATASOURCE; /////////////////////////////////////////////////////////////////////////////////// // // CImpIDBInitialize: Contained IDBInitialize class // /////////////////////////////////////////////////////////////////////////////////// class CImpIDBInitialize : public IDBInitialize { private: DEBUGCODE(ULONG m_cRef); CDataSource *m_pObj; public: CImpIDBInitialize( CDataSource *pObj ) { m_cRef = 0L; m_pObj = pObj; } ~CImpIDBInitialize() { } STDMETHODIMP_(ULONG) AddRef(void) { DEBUGCODE(InterlockedIncrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->AddRef(); } STDMETHODIMP_(ULONG) Release(void) { DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->Release(); } STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv); } //================================================== // IDBInitialize members //================================================== STDMETHODIMP Initialize(void); // Initialize Method STDMETHODIMP Uninitialize(void); // Uninitialize Method }; /////////////////////////////////////////////////////////////////////////////////// // // CImpIDBCreateSession: contained IDBCreateSession class // /////////////////////////////////////////////////////////////////////////////////// class CImpIDBCreateSession : public IDBCreateSession { private: DEBUGCODE(ULONG m_cRef); CDataSource *m_pObj; public: CImpIDBCreateSession( CDataSource *pObj ) { DEBUGCODE(m_cRef = 0L); m_pObj = pObj; } ~CImpIDBCreateSession() { } STDMETHODIMP_(ULONG) AddRef(void) { DEBUGCODE(InterlockedIncrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->AddRef(); } STDMETHODIMP_(ULONG) Release(void) { DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->Release(); } STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv); } //================================================================= // IDBCreateSession method //================================================================= STDMETHODIMP CreateSession( IUnknown*, REFIID, IUnknown** ); // CreateSession method }; ///////////////////////////////////////////////////////////////////////////////////////////////// // // CImpIDBProperties: Contained IDBProperties class // ///////////////////////////////////////////////////////////////////////////////////////////////// class CImpIDBProperties : public IDBProperties { private: DEBUGCODE(ULONG m_cRef); CDataSource *m_pObj; public: CImpIDBProperties( CDataSource *pObj ) { DEBUGCODE(m_cRef = 0L); m_pObj = pObj; } ~CImpIDBProperties() { } STDMETHODIMP_(ULONG) AddRef(void) { DEBUGCODE(InterlockedIncrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->AddRef(); } STDMETHODIMP_(ULONG) Release(void) { DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->Release(); } STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv); } //========================================================== // IDBProperties member functions //========================================================== STDMETHODIMP GetProperties // GetProperties method ( ULONG cPropertySets, const DBPROPIDSET rgPropertySets[], ULONG* pcProperties, DBPROPSET** prgProperties ); STDMETHODIMP GetPropertyInfo // GetPropertyInfo method ( ULONG cPropertySets, const DBPROPIDSET rgPropertySets[], ULONG* pcPropertyInfoSets, DBPROPINFOSET** prgPropertyInfoSets, WCHAR** ppDescBuffer ); STDMETHODIMP SetProperties // SetProperties method ( ULONG cProperties, DBPROPSET rgProperties[] ); }; //////////////////////////////////////////////////////////////////////////////////////// // // CImpIDBInfo: Contained IDBInfo class // //////////////////////////////////////////////////////////////////////////////////////// class CImpIDBInfo : public IDBInfo { private: DEBUGCODE(ULONG m_cRef); CDataSource *m_pObj; LONG GetLiteralIndex(DBLITERAL rgLiterals); LONG GetStringBufferSize(ULONG cLiterals, const DBLITERAL rgLiterals[]); public: CImpIDBInfo( CDataSource *pObj ) { DEBUGCODE(m_cRef = 0L); m_pObj = pObj; } ~CImpIDBInfo() { } STDMETHODIMP_(ULONG) AddRef(void) { DEBUGCODE(InterlockedIncrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->AddRef(); } STDMETHODIMP_(ULONG) Release(void) { DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->Release(); } STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv); } //======================================================== // IDBProperties member functions //======================================================== STDMETHODIMP GetKeywords // GetKeywords method ( LPWSTR* ppwsKeywords ); STDMETHODIMP GetLiteralInfo // GetLiteralInfo method ( ULONG cLiterals, const DBLITERAL rgLiterals[ ], ULONG* pcLiteralInfo, DBLITERALINFO** prgLiteralInfo, WCHAR** ppCharBuffer ); }; /////////////////////////////////////////////////////////////////////////////////////////////////////// // // CImpIPersist: contained IPersist class // /////////////////////////////////////////////////////////////////////////////////////////////////////// class CImpIPersistFile : public IPersistFile { private: DEBUGCODE(ULONG m_cRef); CDataSource *m_pObj; HRESULT WriteToFile(LPCOLESTR strFileName); HRESULT ReadFromFile(LPCOLESTR pszFileName); void ClearDirtyFlag(); BOOL IsInitialized(); BOOL WritePrivateProfileString(LPCOLESTR wszAppName,LPCOLESTR wszKeyName,LPCOLESTR wszValue,LPCOLESTR wszFileName); HRESULT GetCurrentFile(LPCOLESTR pszFileName,LPOLESTR wszFileNameFull,DWORD dwAccess); BOOL GetPrivateProfileStr(LPCOLESTR wszAppName,LPCOLESTR wszKeyName,LPCOLESTR wszFileName,LPOLESTR wszValue); BOOL GetPrivateProfileLong(LPCOLESTR wszAppName,LPCOLESTR wszKeyName,LPCOLESTR wszFileName, LONG &lValue); HRESULT GetAbsolutePath(LPCOLESTR pwszFileName,LPOLESTR wszFileNameFull); HRESULT SetDBInitProp(DBPROPID propId ,GUID guidPropSet,VARIANT vPropValue); public: CImpIPersistFile( CDataSource *pObj ) { DEBUGCODE(m_cRef = 0L); m_pObj = pObj; } ~CImpIPersistFile() { } STDMETHODIMP_(ULONG) AddRef(void) { DEBUGCODE(InterlockedIncrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->AddRef(); } STDMETHODIMP_(ULONG) Release(void) { DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->Release(); } STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv); } //============================================================ // IPersist method //============================================================ STDMETHODIMP GetClassID( CLSID *pClassID ); // GetClassID method STDMETHODIMP IsDirty(void); STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName); STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode); STDMETHODIMP Save(LPCOLESTR pszFileName,BOOL fRemember); STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName); }; class CImpIDBDataSrcAdmin : public IDBDataSourceAdmin { private: DEBUGCODE(ULONG m_cRef); CDataSource *m_pObj; public: CImpIDBDataSrcAdmin( CDataSource *pObj ) { DEBUGCODE(m_cRef = 0L); m_pObj = pObj; } ~CImpIDBDataSrcAdmin() { } STDMETHODIMP_(ULONG) AddRef(void) { DEBUGCODE(InterlockedIncrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->AddRef(); } STDMETHODIMP_(ULONG) Release(void) { DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->Release(); } STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv); } STDMETHODIMP CreateDataSource( ULONG cPropertySets, DBPROPSET rgPropertySets[ ], IUnknown * pUnkOuter, REFIID riid, IUnknown ** ppDBSession); STDMETHODIMP DestroyDataSource( void); STDMETHODIMP GetCreationProperties( ULONG cPropertyIDSets, const DBPROPIDSET rgPropertyIDSets[ ], ULONG * pcPropertyInfoSets, DBPROPINFOSET ** prgPropertyInfoSets, OLECHAR ** ppDescBuffer); STDMETHODIMP ModifyDataSource( ULONG cPropertySets,DBPROPSET rgPropertySets[]); }; class CImpIObjectAccessControl : public IObjectAccessControl { private: DEBUGCODE(ULONG m_cRef); CDataSource *m_pObj; STDMETHODIMP IfValidSecObject(SEC_OBJECT *pObject); public: CImpIObjectAccessControl( CDataSource *pObj ) { DEBUGCODE(m_cRef = 0L); m_pObj = pObj; } ~CImpIObjectAccessControl() { } STDMETHODIMP_(ULONG) AddRef(void) { DEBUGCODE(InterlockedIncrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->AddRef(); } STDMETHODIMP_(ULONG) Release(void) { DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->Release(); } STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv); } STDMETHODIMP GetObjectAccessRights( SEC_OBJECT *pObject, ULONG *pcAccessEntries, EXPLICIT_ACCESS_W **prgAccessEntries); STDMETHODIMP GetObjectOwner( SEC_OBJECT *pObject,TRUSTEE_W ** ppOwner); STDMETHODIMP IsObjectAccessAllowed( SEC_OBJECT *pObject, EXPLICIT_ACCESS_W *pAccessEntry, BOOL *pfResult); STDMETHODIMP SetObjectAccessRights( SEC_OBJECT *pObject, ULONG cAccessEntries, EXPLICIT_ACCESS_W *prgAccessEntries); STDMETHODIMP SetObjectOwner( SEC_OBJECT *pObject,TRUSTEE_W *pOwner); }; class CImpISecurityInfo : public ISecurityInfo { private: DEBUGCODE(ULONG m_cRef); CDataSource *m_pObj; STDMETHODIMP GetCurTrustee(TRUSTEE_W ** ppTrustee); public: CImpISecurityInfo( CDataSource *pObj ) { DEBUGCODE(m_cRef = 0L); m_pObj = pObj; } ~CImpISecurityInfo() { } STDMETHODIMP_(ULONG) AddRef(void) { DEBUGCODE(InterlockedIncrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->AddRef(); } STDMETHODIMP_(ULONG) Release(void) { DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef)); return m_pObj->GetOuterUnknown()->Release(); } STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv); } STDMETHODIMP GetCurrentTrustee(TRUSTEE_W ** ppTrustee); STDMETHODIMP GetObjectTypes(ULONG *cObjectTypes,GUID **gObjectTypes); STDMETHODIMP GetPermissions(GUID ObjectType,ACCESS_MASK *pPermissions); }; #endif