|
|
// 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 <mmc.h>
#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<CViewObject *>(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<CDataObject **>(::GlobalLock(stgmInternal.hGlobal))); ::GlobalUnlock(stgmInternal.hGlobal); // cdoReturn = *(reinterpret_cast<CDataObject **>(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
|