2025-04-27 07:49:33 -04:00

318 lines
9.6 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _ADM_COIMP_
#define _ADM_COIMP_
#include "iadm.h"
#include "dbgutil.h"
#include "olectl.h"
#include "tsres.hxx"
#include "connect.h"
#include "coiaut.hxx"
#include "sink.hxx"
//
// Handle mapping table structure
//
#define HASHSIZE 5
#define INVALID_ADMINHANDLE_VALUE 0
enum HANDLE_TYPE {
META_HANDLE,
NSEPM_HANDLE,
ALL_HANDLE
};
typedef struct _HANDLE_TABLE {
struct _HANDLE_TABLE *next; // next entry
METADATA_HANDLE hAdminHandle; // admin handle value
METADATA_HANDLE hActualHandle; // actual handle value
enum HANDLE_TYPE HandleType; // handle type : nsepm or meta
} HANDLE_TABLE, *LPHANDLE_TABLE;
class CADMCOM : public IMSAdminBase {
public:
CADMCOM();
~CADMCOM();
HRESULT STDMETHODCALLTYPE
AddKey(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath);
HRESULT STDMETHODCALLTYPE DeleteKey(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath);
HRESULT STDMETHODCALLTYPE DeleteChildKeys(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath);
HRESULT STDMETHODCALLTYPE EnumKeys(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath,
/* [size_is][out] */ unsigned char __RPC_FAR *pszMDName,
/* [in] */ DWORD dwMDEnumObjectIndex);
HRESULT STDMETHODCALLTYPE CopyKey(
/* [in] */ METADATA_HANDLE hMDSourceHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDSourcePath,
/* [in] */ METADATA_HANDLE hMDDestHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDDestPath,
/* [in] */ BOOL bMDOverwriteFlag,
/* [in] */ BOOL bMDCopyFlag);
HRESULT STDMETHODCALLTYPE RenameKey(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDNewName);
HRESULT STDMETHODCALLTYPE SetData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath,
/* [in] */ PMETADATA_RECORD pmdrMDData);
HRESULT STDMETHODCALLTYPE GetData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath,
/* [out][in] */ PMETADATA_RECORD pmdrMDData,
/* [out] */ DWORD __RPC_FAR *pdwMDRequiredDataLen);
HRESULT STDMETHODCALLTYPE DeleteData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath,
/* [in] */ DWORD dwMDIdentifier,
/* [in] */ DWORD dwMDDataType);
HRESULT STDMETHODCALLTYPE EnumData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath,
/* [out][in] */ PMETADATA_RECORD pmdrMDData,
/* [in] */ DWORD dwMDEnumDataIndex,
/* [out] */ DWORD __RPC_FAR *pdwMDRequiredDataLen);
HRESULT STDMETHODCALLTYPE GetAllData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath,
/* [in] */ DWORD dwMDAttributes,
/* [in] */ DWORD dwMDUserType,
/* [in] */ DWORD dwMDDataType,
/* [out] */ DWORD __RPC_FAR *pdwMDNumDataEntries,
/* [out] */ DWORD __RPC_FAR *pdwMDDataSetNumber,
/* [in] */ DWORD dwMDBufferSize,
/* [size_is][out] */ unsigned char __RPC_FAR *pbBuffer,
/* [out] */ DWORD __RPC_FAR *pdwMDRequiredBufferSize);
HRESULT STDMETHODCALLTYPE DeleteAllData(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [in] */ DWORD dwMDUserType,
/* [in] */ DWORD dwMDDataType);
HRESULT STDMETHODCALLTYPE CopyData(
/* [in] */ METADATA_HANDLE hMDSourceHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDSourcePath,
/* [in] */ METADATA_HANDLE hMDDestHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDDestPath,
/* [in] */ DWORD dwMDAttributes,
/* [in] */ DWORD dwMDUserType,
/* [in] */ DWORD dwMDDataType,
/* [in] */ BOOL bMDCopyFlag);
HRESULT STDMETHODCALLTYPE OpenKey(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath,
/* [in] */ DWORD dwMDAccessRequested,
/* [in] */ DWORD dwMDTimeOut,
/* [out] */ PMETADATA_HANDLE phMDNewHandle);
HRESULT STDMETHODCALLTYPE CloseKey(
/* [in] */ METADATA_HANDLE hMDHandle);
HRESULT STDMETHODCALLTYPE ChangePermissions(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [in] */ DWORD dwMDTimeOut,
/* [in] */ DWORD dwMDAccessRequested);
HRESULT STDMETHODCALLTYPE SaveData( void);
HRESULT STDMETHODCALLTYPE GetHandleInfo(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [out] */ PMETADATA_HANDLE_INFO pmdhiInfo);
HRESULT STDMETHODCALLTYPE GetSystemChangeNumber(
/* [out] */ DWORD __RPC_FAR *pdwSystemChangeNumber);
HRESULT STDMETHODCALLTYPE GetDataSetNumber(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in] */ unsigned char __RPC_FAR *pszMDPath,
/* [out] */ DWORD __RPC_FAR *pdwMDDataSetNumber);
HRESULT STDMETHODCALLTYPE ReleaseReferenceData(
/* [in] */ DWORD dwMDDataTag);
HRESULT STDMETHODCALLTYPE SetLastChangeTime(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [in] */ PFILETIME pftMDLastChangeTime,
/* [in] */ BOOL bLocalTime);
HRESULT STDMETHODCALLTYPE GetLastChangeTime(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [string][in][unique] */ unsigned char __RPC_FAR *pszMDPath,
/* [out] */ PFILETIME pftMDLastChangeTime,
/* [in] */ BOOL bLocalTime);
HRESULT STDMETHODCALLTYPE NotifySink(
/* [in] */ METADATA_HANDLE hMDHandle,
/* [in] */ DWORD dwMDNumElements,
/* [size_is][in] */ MD_CHANGE_OBJECT __RPC_FAR pcoChangeList[ ]);
HRESULT STDMETHODCALLTYPE KeyExchangePhase1();
HRESULT STDMETHODCALLTYPE KeyExchangePhase2();
HRESULT _stdcall
QueryInterface(REFIID riid, void **ppObject);
ULONG _stdcall
AddRef();
ULONG _stdcall
Release();
//
// Internal Use members
//
HRESULT
AddNode(
IN METADATA_HANDLE hHandle,
IN enum HANDLE_TYPE HandleType,
OUT PMETADATA_HANDLE phAdminHandle
);
DWORD Lookup(
IN METADATA_HANDLE hHandle,
OUT METADATA_HANDLE *hActHandle,
OUT HANDLE_TYPE *HandleType
);
DWORD LookupActualHandle(
IN METADATA_HANDLE hHandle
);
DWORD DeleteNode(
IN METADATA_HANDLE hHandle
);
VOID SetStatus( HRESULT hRes ) {
m_hRes = hRes;
}
HRESULT GetStatus() {
return m_hRes;
}
VOID
SinkLock(enum TSRES_LOCK_TYPE type) {
m_rSinkResource.Lock(type);
}
VOID
SinkUnlock(void) {
m_rSinkResource.Unlock();
}
private:
IMDCOM* m_pMdObject;
NSECOM* m_pNseObject;
ULONG m_dwRefCount;
DWORD m_dwHandleValue; // last handle value used
HANDLE_TABLE *m_hashtab[HASHSIZE]; // handle table
CImpIMDCOMSINK *m_pEventSink;
IConnectionPoint* m_pConnPoint;
DWORD m_dwCookie;
BOOL m_bSinkConnected;
HRESULT m_hRes;
//
// synchronization to manipulate the handle table
//
TS_RESOURCE m_rHandleResource;
TS_RESOURCE m_rSinkResource;
class CImpIConnectionPointContainer : public IConnectionPointContainer
{
public:
// Interface Implementation Constructor & Destructor.
CImpIConnectionPointContainer();
~CImpIConnectionPointContainer(void);
VOID Init(CADMCOM *);
// IUnknown methods.
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// IConnectionPointContainer methods.
STDMETHODIMP FindConnectionPoint(REFIID, IConnectionPoint**);
STDMETHODIMP EnumConnectionPoints(IEnumConnectionPoints**);
private:
// Data private to this interface implementation.
CADMCOM *m_pBackObj; // Parent Object back pointer.
IUnknown *m_pUnkOuter; // Outer unknown for Delegation.
};
friend CImpIConnectionPointContainer;
// Nested IConnectionPointContainer implementation instantiation.
CImpIConnectionPointContainer m_ImpIConnectionPointContainer;
// The array of connection points for this connectable COM object.
IConnectionPoint* m_aConnectionPoints[MAX_CONNECTION_POINTS];
};
class CADMCOMSrvFactory : public IClassFactory {
public:
CADMCOMSrvFactory();
~CADMCOMSrvFactory();
HRESULT _stdcall
QueryInterface(REFIID riid, void** ppObject);
ULONG _stdcall
AddRef();
ULONG _stdcall
Release();
HRESULT _stdcall
CreateInstance(IUnknown *pUnkOuter, REFIID riid,
void ** pObject);
HRESULT _stdcall
LockServer(BOOL fLock);
private:
ULONG m_dwRefCount;
};
// ITypeInfo *m_pITINeutral; //Type information
#endif