// DataObj.h : Internal data object structure for transfering clipboard formats. // // Copyright (c) 1998-1999 Microsoft Corporation #pragma once // MSINFO_DATAOBJ_H #define MSINFO_DATAOBJ_H #ifdef MSINFO_COMPDATA_H #error "DataObj.h must be included _before_ CompData.h" #endif // MSINFO_COMPDATA_H // This hack is required because we may be building in an environment // which doesn't have a late enough version of rpcndr.h #if __RPCNDR_H_VERSION__ < 440 #define __RPCNDR_H_VERSION__ 440 #define MIDL_INTERFACE(x) interface #endif #ifndef __mmc_h__ #include #endif // __mmc_h__ #include "StdAfx.h" // Forward declaration. class CDataObject; #include "CompData.h" /* * CDataObject - The public interface for a unit of data. */ class CDataObject : public IDataObject, public CComObjectRoot { DECLARE_NOT_AGGREGATABLE(CDataObject) BEGIN_COM_MAP(CDataObject) COM_INTERFACE_ENTRY(IDataObject) END_COM_MAP() friend class CSystemInfoScope; friend class CSystemInfo; public: CDataObject(); virtual ~CDataObject(); // Clipboard formats required by IConsole. public: static unsigned int m_cfNodeType; static unsigned int m_cfNodeTypeString; static unsigned int m_cfDisplayName; static unsigned int m_cfCoClass; static unsigned int m_cfMultiSel; static unsigned int m_cfMachineName; static unsigned int m_cfInternalObject; static unsigned int m_cfSnapinPreloads; // Internal clipboard formats? // static unsigned int m_cfInternal; // IDataObject interface implentation public: STDMETHOD(GetData)(LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium); STDMETHOD(GetDataHere)(LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium); STDMETHOD(EnumFormatEtc)(DWORD dwDirection, LPENUMFORMATETC *ppEnumFormatEtc); STDMETHOD(QueryGetData)(LPFORMATETC lpFormatetc); STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC lpFormatetcIn, LPFORMATETC lpFormatetcOut); STDMETHOD(SetData)(LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium, BOOL bRelease); STDMETHOD(DAdvise)(LPFORMATETC lpFormatetc, DWORD advf, LPADVISESINK pAdvSink, LPDWORD pdwConnection); STDMETHOD(DUnadvise)(DWORD dwConnection); STDMETHOD(EnumDAdvise)(LPENUMSTATDATA *ppEnumAdvise); // Data Member Access Functions public: virtual CFolder *Category() const = 0; DATA_OBJECT_TYPES Context() const { return m_internal.m_type; } LPTSTR String() const { return m_internal.m_string; } MMC_COOKIE Cookie() const { return m_internal.m_cookie; } CLSID ClassID() const { return pComponentData()->GetCoClassID(); } CSystemInfoScope *pComponentData() const { ASSERT(m_pComponentData); return m_pComponentData; } void SetContext(DATA_OBJECT_TYPES type) { ASSERT(m_internal.m_type == CCT_UNINITIALIZED); m_internal.m_type = type; } void SetString(LPTSTR lpString) { m_internal.m_string = lpString; } void SetCookie(MMC_COOKIE cookie) { m_internal.m_cookie = cookie; } void SetComponentData(CSystemInfoScope *pCCD) { ASSERT(m_pComponentData == NULL && pCCD != NULL); m_pComponentData = pCCD; } CSystemInfoScope *m_pComponentData; protected: struct { MMC_COOKIE m_cookie; LPTSTR m_string; DATA_OBJECT_TYPES m_type; } m_internal; CDataSource *pSource() { return pComponentData()->pSource(); } // Internal helper functions. protected: static HRESULT CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB); // The function which returns a DataObject based on the context // information static HRESULT CreateDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, CSystemInfoScope *pScope, LPDATAOBJECT *ppDataObject); // The generic Create function which puts the appropriate amount of // lpMedium data into the pBuffer static HRESULT Create(const void *pBuffer, int size, LPSTGMEDIUM pMedium); // The specific functions which take the named member out of the // specified lpMedium. virtual HRESULT CreateCoClassID(LPSTGMEDIUM lpMedium); virtual HRESULT CreateDisplayName(LPSTGMEDIUM lpMedium) = 0; virtual HRESULT CreateNodeTypeData(LPSTGMEDIUM lpMedium) = 0; virtual HRESULT CreateNodeTypeStringData(LPSTGMEDIUM lpMedium) = 0; virtual HRESULT CreateSnapinPreloads(LPSTGMEDIUM lpMedium); virtual HRESULT CreateMachineName(LPSTGMEDIUM lpMedium); virtual HRESULT CreateInternalObject(LPSTGMEDIUM lpMedium); HRESULT CreateMultiSelData(LPSTGMEDIUM lpMedium); // Multiple selection data. protected: BYTE *m_pbMultiSelData; UINT m_cbMultiSelData; BOOL m_bMultiSelDobj; }; /* * CScopeDataObject - The data object for scope items. * * History: a-jsari 9/25/97 */ class CScopeDataObject : public CDataObject { public: virtual CFolder *Category() const { return reinterpret_cast(Cookie())->Category(); } private: virtual HRESULT CreateDisplayName(LPSTGMEDIUM lpMedium); virtual HRESULT CreateNodeTypeData(LPSTGMEDIUM lpMedium); virtual HRESULT CreateNodeTypeStringData(LPSTGMEDIUM lpMedium); }; /* * CResultDataObject - The DataObject for result items. * * History: a-jsari 9/25/97 */ class CResultDataObject : public CDataObject { public: virtual CFolder *Category() const { ASSERT(FALSE); return NULL; } private: virtual HRESULT CreateDisplayName(LPSTGMEDIUM lpMedium); virtual HRESULT CreateNodeTypeData(LPSTGMEDIUM lpMedium); virtual HRESULT CreateNodeTypeStringData(LPSTGMEDIUM lpMedium); }; /* * CManagerDataObject - The DataObject for SNAPIN_MANAGER items. * * History: a-jsari 9/25/97 */ class CManagerDataObject : public CDataObject { public: virtual CFolder *Category() const { ASSERT(pComponentData()); return pComponentData()->pRootCategory(); } private: virtual HRESULT CreateDisplayName(LPSTGMEDIUM lpMedium); virtual HRESULT CreateNodeTypeData(LPSTGMEDIUM lpMedium); virtual HRESULT CreateNodeTypeStringData(LPSTGMEDIUM lpMedium); }; /* * GetInternalFromDataObject - Return the CDataObject pointer represented by * the lpDataObject * * History: a-jsari 9/25/97 Initial version * * Note: It is essential that this pointer not be freed by the calling * function as it points to an existing DataObject. */ inline CDataObject *GetInternalFromDataObject(LPDATAOBJECT lpDataObject) { ASSERT(lpDataObject != NULL); FORMATETC fetcInternal = { (unsigned short)CDataObject::m_cfInternalObject, NULL, DVASPECT_CONTENT, -1, /* All Data */ TYMED_HGLOBAL }; STGMEDIUM stgmInternal = { TYMED_HGLOBAL, NULL }; CDataObject *cdoReturn = NULL; // CHECK: Make sure this gets propertly freed. stgmInternal.hGlobal = ::GlobalAlloc(GMEM_SHARE, sizeof(CDataObject **)); do { HRESULT hr = lpDataObject->GetDataHere(&fetcInternal, &stgmInternal); ASSERT(stgmInternal.pUnkForRelease == NULL); if (hr != S_OK) break; cdoReturn = *(reinterpret_cast(::GlobalLock(stgmInternal.hGlobal))); ::GlobalUnlock(stgmInternal.hGlobal); // cdoReturn = *(reinterpret_cast(stgmInternal.hGlobal)); } while (0); ::GlobalFree(stgmInternal.hGlobal); return cdoReturn; } /* * GetCookieFromDataObject - Returns the cookie contained by the object * represented by the lpDataObject interface. * * History: a-jsari 9/25/97 */ inline MMC_COOKIE GetCookieFromDataObject(LPDATAOBJECT lpDataObject) { CDataObject *cdoTemp = GetInternalFromDataObject(lpDataObject); // Root node for an extension snap-in. if (cdoTemp == NULL) return 0; return cdoTemp->Cookie(); } /* * IsValidRegisteredClipboardFormat - Return a Boolean value telling whether * uFormatID is a valid clipboard format or not. * * History: a-jsari 9/25/97 */ inline bool IsValidRegisteredClipboardFormat(UINT uFormatID) { // return (uFormatID >= 0xc000 && uFormatID <= 0xffff); return (uFormatID != 0); } #if 0 /* * IsMMCMultiSelectDataObject - Return a flag telling whether our data object refers * to a multiple item selection. * * History: a-jsari 9/25/97 */ inline BOOL IsMMCMultiSelectDataObject(LPDATAOBJECT lpDataObject) { static unsigned int m_cfMultiSelData = 0; if (m_cfMultiSelData == 0) { USES_CONVERSION; m_cfMultiSelData = RegisterClipboardFormat(W2T(CCF_MMC_MULTISELECT_DATAOBJECT)); ASSERT(IsValidRegisteredClipboardFormat(m_cfMultiSelData)); } /* const */ FORMATETC fmt = { (unsigned short) m_cfMultiSelData, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; return lpDataObject->QueryGetData(&fmt) == S_OK; } #endif