windows-nt/Source/XPSP1/NT/admin/wmi/wbem/adapters/oledb/row.h
2020-09-26 16:20:57 +08:00

418 lines
12 KiB
C++

///////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// @module ROW.H | CRow base object and contained interface
//
//
///////////////////////////////////////////////////////////////////////////////////
#ifndef _ROW_H_
#define _ROW_H_
typedef enum tagROWCREATEBINDFLAG
{
ROWOPEN =0,ROWCREATE =1 , ROWOVERWRITE = 1
}ROWCREATEBINDFLAG;
typedef enum tagROWTYPE
{
ROW_SCOPE =0,ROW_INSTANCE =1
}ROWTYPE;
#include "baserowobj.h"
class CImpIRowChange;
class CImpIColumnsInfo;
class CImpIGetSession;
class CImpIRow;
class CImpIScopedOperations;
//class CRowFetchObj;
typedef CImpIRowChange* PIMPIROWCHANGE;
typedef CImpIRow* PIMPIROW;
typedef CImpIGetSession* PIMPIGETSESSION;
typedef CImpIScopedOperations* PIMPISCOPEDOPERATIONS;
typedef CRowFetchObj* PROWFETCHOBJ;
class CRow : public CBaseRowObj
{
friend class CImpIRowChange;
friend class CImpIRow;
friend class CImpIGetSession;
friend class CImpIScopedOperations;
friend class CRowFetchObj;
friend class CDBSession;
PIMPIROW m_pIRow; // Contained IRow
PIMPIGETSESSION m_pIGetSession; // Contained IGetSession
PIMPIROWCHANGE m_pIRowChange; // Contained IRowChange;
PIMPISCOPEDOPERATIONS m_pIScopedOperations; // Contained IScopedOperations
UDWORD m_dwStatus; // status word for the entire cursor
cRowColumnInfoMemMgr * m_pRowColumns; // column information for all the columns other than
// than the source rowset
WCHAR * m_strURL; // URL of the row
WCHAR * m_strKey; // Key of the row
CWbemClassInstanceWrapper * m_pInstance; // Pointer to the instance corresponding to the row
BOOL m_bHelperFunctionCreated; // flag to indicate whethe helper function are created or not
BOOL m_bClassChanged; // flag which stores if the instance being represented, is
// is of different type ( belong to different class) as
// compared to the rowset which created it. This will
// have meaning only when row is created from rowset
CRowset * m_pSourcesRowset; // Pointer to the rowset , if it this row is created by the row
ROWTYPE m_rowType; // type of the object which the row represents
void InitVars();
HRESULT GetColumns(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
HRESULT GetColumnsFromRowset(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[]);
HRESULT UpdateRow(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
HRESULT UpdateColumnsFromRowset(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
HRESULT GetColumnInfo(DBORDINAL* pcColumns, DBCOLUMNINFO** prgInfo,WCHAR** ppStringsBuffer);
HRESULT GetRowColumnInfo();
HRESULT GatherColumnInfo();
HRESULT GetColumnInfo();
HRESULT GetColumnData(DBCOLUMNACCESS &col);
HRESULT SetColumnData(DBCOLUMNACCESS &col , BOOL bNewRow = FALSE);
HRESULT GetRowData(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[]);
HRESULT SetRowData(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[]);
HRESULT OpenChild(IUnknown *pUnkOuter,WCHAR *strColName ,REFIID riid, IUnknown **ppUnk,BOOL bIsChildRowset);
WCHAR * GetPropertyNameFromColName(WCHAR *pColName);
HRESULT GetEmbededInstancePtrAndSetMapClass(CURLParser *urlParser);
HRESULT GetChildRowet( IUnknown *pUnkOuter,
WCHAR *strColName,
DBPROPSET *rgPropertySets,
ULONG cPropSets,
REFIID riid,
IUnknown **ppUnk);
HRESULT GetChildRow(IUnknown *pUnkOuter,
WCHAR *strColName,
DBPROPSET *rgPropertySets,
ULONG cPropSets,
REFIID riid,
IUnknown **ppUnk);
HRESULT CreateNewRow(CWbemClassInstanceWrapper **pNewInst);
HRESULT AllocateInterfacePointers();
HRESULT InitializeWmiOledbMap(LPWSTR strPath,
LPWSTR strTableID ,
DWORD dwFlags);
HRESULT AddInterfacesForISupportErrorInfo();
HRESULT OpenRow(LPCOLESTR pwszURL,IUnknown * pUnkOuter,REFIID riid,IUnknown** ppOut);
HRESULT OpenRowset(LPCOLESTR pwszURL,
IUnknown * pUnkOuter,
REFIID riid,
BOOL bContainer ,
IUnknown** ppOut,
ULONG cPropertySets = 0,
DBPROPSET __RPC_FAR rgPropertySets[] = NULL);
HRESULT SetRowProperties(const ULONG cPropertySets, const DBPROPSET rgPropertySets[] );
HRESULT Delete(LPCOLESTR lpszURL,DWORD dwDeleteFlags,DBSTATUS &dbStatus);
HRESULT MoveObjects(WCHAR * pStrDstURL,WCHAR * pstrSrcURL, WCHAR *& pstrUrl,DBSTATUS &dbStatus);
HRESULT CopyObjects(WCHAR * pStrDstURL,WCHAR * pstrSrcURL, WCHAR *& pNewURL,DBSTATUS &dbStatus);
BOOL GetPathFromURL(BSTR &str);
BOOL IsContainer();
HRESULT GetIUnknownColumnValue(DBORDINAL iCol,REFIID riid,IUnknown ** ppUnk,LPCWSTR pStrColName);
public:
CRow(LPUNKNOWN,CRowset *pRowset,PCDBSESSION pObj,CWbemConnectionWrapper *pCon = NULL);
CRow(LPUNKNOWN pUnkOuter, PCDBSESSION pObj);
~CRow();
HRESULT InitRow(HROW hRow = 0,
CWbemClassWrapper *pInst = NULL,
ROWCREATEBINDFLAG rowCreateFlag = ROWOPEN);
HRESULT InitRow(LPWSTR strPath ,
LPWSTR strTableID ,
DWORD dwFlags = -1,
ROWCREATEBINDFLAG rowCreateFlag = ROWOPEN);
HRESULT UpdateKeysForNewInstance();
STDMETHODIMP QueryInterface(REFIID, LPVOID *);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
};
class CImpIGetSession:public IGetSession
{
private:
CRow *m_pObj;
DEBUGCODE(ULONG m_cRef);
public:
CImpIGetSession( CRow *pObj )
{
DEBUGCODE(m_cRef = 0L);
m_pObj = pObj;
}
~CImpIGetSession()
{
}
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);
if( lRef < 0 ){
ASSERT("Reference count on Object went below 0!")
})
return m_pObj->GetOuterUnknown()->Release();
}
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
{
return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv);
}
STDMETHODIMP GetSession(REFIID riid,IUnknown ** ppSession);
};
class CImpIRow:public IRow
{
private:
CRow *m_pObj;
DEBUGCODE(ULONG m_cRef);
public:
CImpIRow( CRow *pObj )
{
DEBUGCODE(m_cRef = 0L);
m_pObj = pObj;
}
~CImpIRow()
{
}
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);
if( lRef < 0 ){
ASSERT("Reference count on Object went below 0!")
})
return m_pObj->GetOuterUnknown()->Release();
}
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
{
return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv);
}
STDMETHODIMP GetColumns(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
STDMETHODIMP GetSourceRowset(REFIID riid,IUnknown ** ppRowset,HROW *phRow);
STDMETHODIMP Open( IUnknown * pUnkOuter,
DBID * pColumnID,
REFGUID rguidColumnType,
DWORD dwFlags,
REFIID riid,
IUnknown ** ppUnk);
};
class CImpIRowChange:public IRowChange
{
private:
CRow *m_pObj;
DEBUGCODE(ULONG m_cRef);
public:
CImpIRowChange( CRow *pObj )
{
DEBUGCODE(m_cRef = 0L);
m_pObj = pObj;
}
~CImpIRowChange()
{
}
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);
if( lRef < 0 ){
ASSERT("Reference count on Object went below 0!")
})
return m_pObj->GetOuterUnknown()->Release();
}
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
{
return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv);
}
STDMETHODIMP SetColumns(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
};
class CImpIScopedOperations:public IScopedOperations
{
private:
CRow *m_pObj;
DEBUGCODE(ULONG m_cRef);
BOOL CheckBindURLFlags(DBBINDURLFLAG dwBindURLFlags , REFGUID rguid); // Function to check if proper flags are
// are set for the require object
// To check if URL Matches the requested type of object
HRESULT CheckIfProperURL(LPOLESTR & lpszURL,REFGUID rguid);
HRESULT BindURL(IUnknown * pUnkOuter,
LPCOLESTR pwszURL,
DBBINDURLFLAG dwBindURLFlags,
REFGUID rguid,
REFIID riid,
DBIMPLICITSESSION * pImplSession,
DBBINDURLSTATUS * pdwBindStatus,
IUnknown ** ppUnk);
// Copy or move objects from one scope/container to another
HRESULT ManipulateObjects(DBCOUNTITEM cRows,
LPCOLESTR __RPC_FAR rgpwszSourceURLs[ ],
LPCOLESTR __RPC_FAR rgpwszDestURLs[ ],
DBSTATUS __RPC_FAR rgdwStatus[ ],
LPOLESTR __RPC_FAR rgpwszNewURLs[ ],
OLECHAR __RPC_FAR *__RPC_FAR *ppStringsBuffer,
BOOL bMoveObjects);
public:
CImpIScopedOperations( CRow *pObj )
{
DEBUGCODE(m_cRef = 0L);
m_pObj = pObj;
}
~CImpIScopedOperations()
{
}
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);
if( lRef < 0 ){
ASSERT("Reference count on Object went below 0!")
})
return m_pObj->GetOuterUnknown()->Release();
}
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
{
return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv);
}
STDMETHODIMP Bind(IUnknown * pUnkOuter,
LPCOLESTR pwszURL,
DBBINDURLFLAG dwBindURLFlags,
REFGUID rguid,
REFIID riid,
IAuthenticate * pAuthenticate,
DBIMPLICITSESSION * pImplSession,
DBBINDURLSTATUS * pdwBindStatus,
IUnknown ** ppUnk);
STDMETHODIMP Copy(DBCOUNTITEM cRows,
LPCOLESTR __RPC_FAR rgpwszSourceURLs[ ],
LPCOLESTR __RPC_FAR rgpwszDestURLs[ ],
DWORD dwCopyFlags,
IAuthenticate __RPC_FAR *pAuthenticate,
DBSTATUS __RPC_FAR rgdwStatus[ ],
LPOLESTR __RPC_FAR rgpwszNewURLs[ ],
OLECHAR __RPC_FAR *__RPC_FAR *ppStringsBuffer);
STDMETHODIMP Move(DBCOUNTITEM cRows,
LPCOLESTR __RPC_FAR rgpwszSourceURLs[ ],
LPCOLESTR __RPC_FAR rgpwszDestURLs[ ],
DWORD dwMoveFlags,
IAuthenticate __RPC_FAR *pAuthenticate,
DBSTATUS __RPC_FAR rgdwStatus[ ],
LPOLESTR __RPC_FAR rgpwszNewURLs[ ],
OLECHAR __RPC_FAR *__RPC_FAR *ppStringsBuffer);
STDMETHODIMP Delete(DBCOUNTITEM cRows,
LPCOLESTR __RPC_FAR rgpwszURLs[ ],
DWORD dwDeleteFlags,
DBSTATUS __RPC_FAR rgdwStatus[ ]);
STDMETHODIMP OpenRowset(IUnknown __RPC_FAR *pUnkOuter,
DBID __RPC_FAR *pTableID,
DBID __RPC_FAR *pIndexID,
REFIID riid,
ULONG cPropertySets,
DBPROPSET __RPC_FAR rgPropertySets[ ],
IUnknown __RPC_FAR *__RPC_FAR *ppRowset);
};
#endif