windows-nt/Source/XPSP1/NT/admin/activec/samples/displ2/dataobj.cpp
2020-09-26 16:20:57 +08:00

149 lines
4.3 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: DataObj.cpp
//
//--------------------------------------------------------------------------
#include "stdafx.h"
#include "displ2.h"
#include "DsplMgr2.h"
#define MY_CF_SNAPIN_INTERNAL L"DISPLAY MANAGER SNAPIN"
// global(s)
extern long g_ref_DataObject; // in displ2.cpp
const GUID GUID_RootNode = { /* d59cd090-44d9-11d1-9fd5-00600832db4a */
0xd59cd090,
0x44d9,
0x11d1,
{0x9f, 0xd5, 0x00, 0x60, 0x08, 0x32, 0xdb, 0x4a}
};
const GUID GUID_WallpaperNode = { /* d59cd091-44d9-11d1-9fd5-00600832db4a */
0xd59cd091,
0x44d9,
0x11d1,
{0x9f, 0xd5, 0x00, 0x60, 0x08, 0x32, 0xdb, 0x4a}
};
const GUID GUID_PatternNode = { /* d59cd092-44d9-11d1-9fd5-00600832db4a */
0xd59cd092,
0x44d9,
0x11d1,
{0x9f, 0xd5, 0x00, 0x60, 0x08, 0x32, 0xdb, 0x4a}
};
// statics
UINT CDataObject::s_cfInternal = 0;
UINT CDataObject::s_cfDisplayName = 0;
UINT CDataObject::s_cfNodeType = 0;
UINT CDataObject::s_cfSnapinClsid = 0;
UINT CDataObject::s_cfSnapinPreloads = 0;
CDataObject::CDataObject(long cookie, DATA_OBJECT_TYPES type)
{
#ifdef DEBUG
InterlockedIncrement (&g_ref_DataObject);
#endif
m_ref = 1;
m_cookie = cookie;
m_type = type;
m_bPreload = FALSE;
USES_CONVERSION;
s_cfInternal = RegisterClipboardFormat (W2T(MY_CF_SNAPIN_INTERNAL));
s_cfDisplayName = RegisterClipboardFormat (W2T(CCF_DISPLAY_NAME));
s_cfNodeType = RegisterClipboardFormat (W2T(CCF_NODETYPE));
s_cfSnapinClsid = RegisterClipboardFormat (W2T(CCF_SNAPIN_CLASSID));
s_cfSnapinPreloads = RegisterClipboardFormat (W2T(CCF_SNAPIN_PRELOADS));
}
CDataObject::~CDataObject ()
{
#ifdef DEBUG
InterlockedDecrement (&g_ref_DataObject);
#endif
}
HRESULT CDataObject::QueryInterface (REFIID riid, LPVOID FAR* ppvObj)
{
if (ppvObj == NULL)
return E_INVALIDARG;
if ( (riid == IID_IUnknown) ||
(riid == IID_IDataObject) ){
// I know about these two interfaces, only.
*ppvObj = (void *)this;
} else {
*ppvObj = NULL;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
ULONG CDataObject::AddRef ()
{
return InterlockedIncrement ((LONG *) &m_ref);
}
ULONG CDataObject::Release ()
{
InterlockedDecrement ((LONG *)&m_ref);
if (m_ref == 0) {
delete this;
return 0;
}
return m_ref;
}
HRESULT CDataObject::GetDataHere (FORMATETC *pformatetc, STGMEDIUM *pmedium)
{
IStream * pstm = NULL;
HRESULT hresult = CreateStreamOnHGlobal (pmedium->hGlobal, FALSE, &pstm);
if (pstm) {
_ASSERT (hresult == S_OK);
const CLIPFORMAT cf = pformatetc->cfFormat;
if (cf == s_cfDisplayName) {
LPWSTR pszName = L"Display Manager (Version 2)";
hresult = pstm->Write (pszName, sizeof(WCHAR)*(1+wcslen (pszName)), NULL);
} else
if (cf == s_cfInternal) {
CDataObject * pThis = this;
hresult = pstm->Write (pThis, sizeof(CDataObject *), NULL);
} else
if (cf == s_cfNodeType) {
const GUID * pguid;
if (m_cookie == DISPLAY_MANAGER_WALLPAPER)
pguid = &GUID_WallpaperNode;
else if (m_cookie == DISPLAY_MANAGER_PATTERN)
pguid = &GUID_PatternNode;
else if (m_cookie == DISPLAY_MANAGER_PATTERN_CHILD)
pguid = &GUID_RootNode;
else if (m_cookie == 0)
pguid = &GUID_RootNode;
else {
// anything else must be result-side stuff:
pguid = &GUID_WallpaperNode;
}
hresult = pstm->Write ((PVOID)pguid, sizeof(GUID), NULL);
} else
if (cf == s_cfSnapinClsid) {
hresult = pstm->Write (&CLSID_DsplMgr2, sizeof(CLSID_DsplMgr2), NULL);
} else
if (cf == s_cfSnapinPreloads) {
hresult = pstm->Write ((PVOID)&m_bPreload, sizeof(BOOL), NULL);
} else {
hresult = DV_E_FORMATETC;
// Might as well assert, since we should not have any other
// clipboard formats at this time.
_ASSERT(hresult == S_OK);
}
pstm->Release();
}
return hresult;
}