windows-nt/Source/XPSP1/NT/enduser/troubleshoot/msinfo/dataobj.h
2020-09-26 16:20:57 +08:00

258 lines
8.1 KiB
C++

// 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