321 lines
7.8 KiB
C++
321 lines
7.8 KiB
C++
// This is a part of the Microsoft Management Console.
|
|
// Copyright (C) 1995-1996 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// This source code is only intended as a supplement to the
|
|
// Microsoft Management Console and related
|
|
// electronic documentation provided with the interfaces.
|
|
|
|
#ifndef _DATAOBJ_H
|
|
#define _DATAOBJ_H
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// MACROS
|
|
|
|
#define BYTE_MEM_LEN_W(s) ((wcslen(s)+1) * sizeof(wchar_t))
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// FORWARD DECLARATIONS
|
|
|
|
class CTreeNode;
|
|
class CRootData;
|
|
class CComponentDataObject;
|
|
class CNodeList;
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// DATA STRUCTURES
|
|
|
|
// New Clipboard format that has the Type and Cookie
|
|
extern const wchar_t* CCF_DNS_SNAPIN_INTERNAL;
|
|
|
|
struct INTERNAL
|
|
{
|
|
INTERNAL()
|
|
{
|
|
m_type = CCT_UNINITIALIZED;
|
|
m_p_cookies = NULL;
|
|
m_pString = NULL;
|
|
m_cookie_count = 0;
|
|
};
|
|
|
|
~INTERNAL()
|
|
{
|
|
free(m_p_cookies);
|
|
delete m_pString;
|
|
}
|
|
|
|
DATA_OBJECT_TYPES m_type; // What context is the data object.
|
|
CTreeNode** m_p_cookies; // What object the cookie represents
|
|
LPTSTR m_pString; // internal pointer
|
|
DWORD m_cookie_count;
|
|
|
|
INTERNAL & operator=(const INTERNAL& rhs)
|
|
{
|
|
m_type = rhs.m_type;
|
|
m_p_cookies = rhs.m_p_cookies;
|
|
m_cookie_count = rhs.m_cookie_count;
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CInternalFormatCracker
|
|
|
|
class CInternalFormatCracker
|
|
{
|
|
public:
|
|
CInternalFormatCracker() : m_pInternal(NULL) {}
|
|
CInternalFormatCracker(INTERNAL* pInternal) : m_pInternal(pInternal) {}
|
|
~CInternalFormatCracker()
|
|
{
|
|
_Free();
|
|
}
|
|
|
|
DWORD GetCookieCount()
|
|
{
|
|
if (m_pInternal == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
return m_pInternal->m_cookie_count;
|
|
}
|
|
|
|
DATA_OBJECT_TYPES GetCookieType()
|
|
{
|
|
ASSERT(m_pInternal != NULL);
|
|
return m_pInternal->m_type;
|
|
}
|
|
|
|
CTreeNode* GetCookieAt(DWORD idx)
|
|
{
|
|
if(m_pInternal == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
if (idx < m_pInternal->m_cookie_count)
|
|
{
|
|
return m_pInternal->m_p_cookies[idx];
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
HRESULT Extract(LPDATAOBJECT lpDataObject);
|
|
|
|
void GetCookieList(CNodeList& list);
|
|
|
|
private:
|
|
INTERNAL* m_pInternal;
|
|
|
|
void _Free()
|
|
{
|
|
if (m_pInternal != NULL)
|
|
{
|
|
::GlobalFree(m_pInternal);
|
|
m_pInternal = NULL;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// CDataObject
|
|
|
|
class CDataObject : public IDataObject, public CComObjectRoot
|
|
{
|
|
// ATL Maps
|
|
DECLARE_NOT_AGGREGATABLE(CDataObject)
|
|
BEGIN_COM_MAP(CDataObject)
|
|
COM_INTERFACE_ENTRY(IDataObject)
|
|
END_COM_MAP()
|
|
|
|
// Construction/Destruction
|
|
CDataObject()
|
|
{
|
|
#ifdef _DEBUG_REFCOUNT
|
|
dbg_cRef = 0;
|
|
++m_nOustandingObjects;
|
|
TRACE(_T("CDataObject(), count = %d\n"),m_nOustandingObjects);
|
|
#endif // _DEBUG_REFCOUNT
|
|
m_pUnkComponentData = NULL;
|
|
}
|
|
|
|
~CDataObject()
|
|
{
|
|
#ifdef _DEBUG_REFCOUNT
|
|
--m_nOustandingObjects;
|
|
TRACE(_T("~CDataObject(), count = %d\n"),m_nOustandingObjects);
|
|
#endif // _DEBUG_REFCOUNT
|
|
if (m_pUnkComponentData != NULL)
|
|
{
|
|
m_pUnkComponentData->Release();
|
|
m_pUnkComponentData = NULL;
|
|
#ifdef _DEBUG_REFCOUNT
|
|
TRACE(_T("~CDataObject() released m_pUnkComponentData\n"));
|
|
#endif // _DEBUG_REFCOUNT
|
|
}
|
|
}
|
|
#ifdef _DEBUG_REFCOUNT
|
|
static unsigned int m_nOustandingObjects; // # of objects created
|
|
int dbg_cRef;
|
|
|
|
ULONG InternalAddRef()
|
|
{
|
|
++dbg_cRef;
|
|
return CComObjectRoot::InternalAddRef();
|
|
}
|
|
ULONG InternalRelease()
|
|
{
|
|
--dbg_cRef;
|
|
return CComObjectRoot::InternalRelease();
|
|
}
|
|
#endif // _DEBUG_REFCOUNT
|
|
|
|
// Clipboard formats that are required by the console
|
|
public:
|
|
static CLIPFORMAT m_cfNodeType; // Required by the console
|
|
static CLIPFORMAT m_cfNodeTypeString; // Required by the console
|
|
static CLIPFORMAT m_cfDisplayName; // Required by the console
|
|
static CLIPFORMAT m_cfCoClass; // Required by the console
|
|
static CLIPFORMAT m_cfColumnID; // Option for column identification
|
|
|
|
static CLIPFORMAT m_cfInternal;
|
|
static CLIPFORMAT m_cfMultiSel;
|
|
static CLIPFORMAT m_cfMultiObjTypes;
|
|
|
|
// Standard IDataObject methods
|
|
public:
|
|
// Implemented
|
|
STDMETHOD(GetData)(LPFORMATETC lpFormatetcIn, LPSTGMEDIUM lpMedium);
|
|
STDMETHOD(GetDataHere)(LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium);
|
|
STDMETHOD(EnumFormatEtc)(DWORD dwDirection, LPENUMFORMATETC* ppEnumFormatEtc);
|
|
|
|
// Not Implemented
|
|
private:
|
|
STDMETHOD(QueryGetData)(LPFORMATETC)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC, LPFORMATETC)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(SetData)(LPFORMATETC, LPSTGMEDIUM, BOOL)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(DAdvise)(LPFORMATETC, DWORD,
|
|
LPADVISESINK, LPDWORD)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(DUnadvise)(DWORD)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(EnumDAdvise)(LPENUMSTATDATA*)
|
|
{ return E_NOTIMPL; };
|
|
|
|
// Implementation
|
|
public:
|
|
void SetType(DATA_OBJECT_TYPES type) // Step 3
|
|
{
|
|
ASSERT(m_internal.m_type == CCT_UNINITIALIZED);
|
|
m_internal.m_type = type;
|
|
}
|
|
DATA_OBJECT_TYPES GetType()
|
|
{
|
|
ASSERT(m_internal.m_type != CCT_UNINITIALIZED);
|
|
return m_internal.m_type;
|
|
}
|
|
|
|
|
|
void AddCookie(CTreeNode* cookie);
|
|
void SetString(LPTSTR lpString) { m_internal.m_pString = lpString; }
|
|
|
|
HRESULT Create(const void* pBuffer, size_t len, LPSTGMEDIUM lpMedium);
|
|
private:
|
|
HRESULT CreateColumnID(LPSTGMEDIUM lpMedium); // Optional for column identification
|
|
HRESULT CreateNodeTypeData(LPSTGMEDIUM lpMedium); // Required by the console
|
|
HRESULT CreateNodeTypeStringData(LPSTGMEDIUM lpMedium); // Required by the console
|
|
HRESULT CreateDisplayName(LPSTGMEDIUM lpMedium); // Required by the console
|
|
HRESULT CreateCoClassID(LPSTGMEDIUM lpMedium); // Required by the console
|
|
HRESULT CreateMultiSelectObject(LPSTGMEDIUM lpMedium);
|
|
HRESULT CreateInternal(LPSTGMEDIUM lpMedium);
|
|
|
|
INTERNAL m_internal;
|
|
|
|
// pointer to the ComponentDataObject
|
|
private:
|
|
IUnknown* m_pUnkComponentData;
|
|
|
|
HRESULT SetComponentData(IUnknown* pUnkComponentData)
|
|
{
|
|
if (m_pUnkComponentData != NULL)
|
|
{
|
|
m_pUnkComponentData->Release();
|
|
}
|
|
m_pUnkComponentData = pUnkComponentData;
|
|
if (m_pUnkComponentData != NULL)
|
|
{
|
|
m_pUnkComponentData->AddRef();
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT GetComponentData(IUnknown** ppUnkComponentData)
|
|
{
|
|
ASSERT(FALSE); // never called??? find out!
|
|
if (ppUnkComponentData == NULL)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
*ppUnkComponentData = m_pUnkComponentData;
|
|
if (m_pUnkComponentData != NULL)
|
|
{
|
|
m_pUnkComponentData->AddRef();
|
|
}
|
|
return S_OK;
|
|
}
|
|
CRootData* GetDataFromComponentDataObject();
|
|
CTreeNode* GetTreeNodeFromCookie();
|
|
|
|
friend class CComponentDataObject;
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// CDummyDataObject
|
|
|
|
class CDummyDataObject : public IDataObject, public CComObjectRoot
|
|
{
|
|
// ATL Maps
|
|
DECLARE_NOT_AGGREGATABLE(CDummyDataObject)
|
|
BEGIN_COM_MAP(CDummyDataObject)
|
|
COM_INTERFACE_ENTRY(IDataObject)
|
|
END_COM_MAP()
|
|
|
|
// Standard IDataObject methods
|
|
public:
|
|
STDMETHOD(GetData)(LPFORMATETC, LPSTGMEDIUM)
|
|
{ return E_NOTIMPL; };
|
|
STDMETHOD(GetDataHere)(LPFORMATETC, LPSTGMEDIUM)
|
|
{ return E_NOTIMPL; };
|
|
STDMETHOD(EnumFormatEtc)(DWORD, LPENUMFORMATETC*)
|
|
{ return E_NOTIMPL; };
|
|
STDMETHOD(QueryGetData)(LPFORMATETC)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC, LPFORMATETC)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(SetData)(LPFORMATETC, LPSTGMEDIUM, BOOL)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(DAdvise)(LPFORMATETC, DWORD, LPADVISESINK, LPDWORD)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(DUnadvise)(DWORD)
|
|
{ return E_NOTIMPL; };
|
|
|
|
STDMETHOD(EnumDAdvise)(LPENUMSTATDATA*)
|
|
{ return E_NOTIMPL; };
|
|
};
|
|
|
|
#endif // _DATAOBJ_H
|