149 lines
4.3 KiB
C++
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;
|
||
|
}
|