557 lines
18 KiB
C++
557 lines
18 KiB
C++
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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
|
|
|
|
|