294 lines
8.2 KiB
C++
294 lines
8.2 KiB
C++
// DataObj.cpp : Implementation of data object classes
|
|
|
|
#include "stdafx.h"
|
|
#include "stdutils.h" // GetObjectType() utility routines
|
|
|
|
#include "macros.h"
|
|
USE_HANDLE_MACROS("MYCOMPUT(dataobj.cpp)")
|
|
|
|
#include "dataobj.h"
|
|
#include "compdata.h"
|
|
#include "resource.h" // IDS_SCOPE_MYCOMPUTER
|
|
|
|
#include <comstrm.h>
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
#include "stddtobj.cpp"
|
|
|
|
#ifdef __DAN_MORIN_HARDCODED_CONTEXT_MENU_EXTENSION__
|
|
// Additional clipboard formats for the Service context menu extension
|
|
CLIPFORMAT g_cfServiceName = (CLIPFORMAT)::RegisterClipboardFormat(L"FILEMGMT_SNAPIN_SERVICE_NAME");
|
|
CLIPFORMAT g_cfServiceDisplayName = (CLIPFORMAT)::RegisterClipboardFormat(L"FILEMGMT_SNAPIN_SERVICE_DISPLAYNAME");
|
|
#endif // __DAN_MORIN_HARDCODED_CONTEXT_MENU_EXTENSION__
|
|
|
|
// Additional clipboard formats for the Send Console Message snapin
|
|
//CLIPFORMAT CMyComputerDataObject::m_cfSendConsoleMessageText = (CLIPFORMAT)::RegisterClipboardFormat(_T("mmc.sendcmsg.MessageText"));
|
|
CLIPFORMAT CMyComputerDataObject::m_cfSendConsoleMessageRecipients = (CLIPFORMAT)::RegisterClipboardFormat(_T("mmc.sendcmsg.MessageRecipients"));
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CMyComputerDataObject::IDataObject::GetDataHere()
|
|
HRESULT CMyComputerDataObject::GetDataHere(
|
|
FORMATETC __RPC_FAR *pFormatEtcIn,
|
|
STGMEDIUM __RPC_FAR *pMedium)
|
|
{
|
|
MFC_TRY;
|
|
|
|
const CLIPFORMAT cf=pFormatEtcIn->cfFormat;
|
|
if (cf == m_CFNodeType)
|
|
{
|
|
const GUID* pguid = GetObjectTypeGUID( m_pcookie->m_objecttype );
|
|
stream_ptr s(pMedium);
|
|
return s.Write(pguid, sizeof(GUID));
|
|
}
|
|
else if (cf == m_CFSnapInCLSID)
|
|
{
|
|
const GUID* pguid = &CLSID_MyComputer;
|
|
stream_ptr s(pMedium);
|
|
return s.Write(pguid, sizeof(GUID));
|
|
}
|
|
else if (cf == m_CFNodeTypeString)
|
|
{
|
|
const BSTR strGUID = GetObjectTypeString( m_pcookie->m_objecttype );
|
|
stream_ptr s(pMedium);
|
|
return s.Write(strGUID);
|
|
}
|
|
else if (cf == m_CFDisplayName)
|
|
{
|
|
return PutDisplayName(pMedium);
|
|
}
|
|
else if (cf == m_CFDataObjectType)
|
|
{
|
|
stream_ptr s(pMedium);
|
|
return s.Write(&m_dataobjecttype, sizeof(m_dataobjecttype));
|
|
}
|
|
else if (cf == m_CFMachineName)
|
|
{
|
|
stream_ptr s(pMedium);
|
|
LPCWSTR pszMachineName = m_pcookie->QueryNonNULLMachineName();
|
|
|
|
if ( !wcsncmp (pszMachineName, L"\\\\", 2) )
|
|
pszMachineName += 2; // skip whackwhack
|
|
return s.Write(pszMachineName);
|
|
}
|
|
else if (cf == m_CFRawCookie)
|
|
{
|
|
stream_ptr s(pMedium);
|
|
// CODEWORK This cast ensures that the data format is
|
|
// always a CCookie*, even for derived subclasses
|
|
CCookie* pcookie = (CCookie*)m_pcookie;
|
|
return s.Write(reinterpret_cast<PBYTE>(&pcookie), sizeof(m_pcookie));
|
|
}
|
|
else if (cf == m_CFSnapinPreloads)
|
|
{
|
|
stream_ptr s(pMedium);
|
|
// If this is TRUE, then the next time this snapin is loaded, it will
|
|
// be preloaded to give us the opportunity to change the root node
|
|
// name before the user sees it.
|
|
return s.Write (reinterpret_cast<PBYTE>(&m_fAllowOverrideMachineName), sizeof (BOOL));
|
|
}
|
|
|
|
#ifdef __DAN_MORIN_HARDCODED_CONTEXT_MENU_EXTENSION__
|
|
else if (cf == g_cfServiceName)
|
|
{
|
|
CString str = _T("alerter");
|
|
stream_ptr s(pMedium);
|
|
return s.Write(str);
|
|
}
|
|
else if (cf == g_cfServiceDisplayName)
|
|
{
|
|
CString str = _T("Alerter!");
|
|
stream_ptr s(pMedium);
|
|
return s.Write(str);
|
|
}
|
|
#endif // __DAN_MORIN_HARDCODED_CONTEXT_MENU_EXTENSION__
|
|
|
|
return DV_E_FORMATETC;
|
|
|
|
MFC_CATCH;
|
|
} // CMyComputerDataObject::GetDataHere()
|
|
|
|
//#ifdef __DAN_MORIN_HARDCODED_CONTEXT_MENU_EXTENSION__
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CMyComputerDataObject::IDataObject::GetData()
|
|
//
|
|
// Write data into the storage medium.
|
|
// The data will be retrieved by the Send Console Message snapin.
|
|
//
|
|
// HISTORY
|
|
// 12-Aug-97 t-danm Creation.
|
|
//
|
|
HRESULT
|
|
CMyComputerDataObject::GetData(
|
|
FORMATETC __RPC_FAR * pFormatEtcIn,
|
|
STGMEDIUM __RPC_FAR * pMedium)
|
|
{
|
|
ASSERT(pFormatEtcIn != NULL);
|
|
ASSERT(pMedium != NULL);
|
|
const CLIPFORMAT cf = pFormatEtcIn->cfFormat;
|
|
/*
|
|
if (cf == g_cfSendConsoleMessageText)
|
|
{
|
|
//
|
|
// Write the message text into the storage medium.
|
|
// - The text must be in UINCODE.
|
|
// - The text must terminate by a null character.
|
|
// - Multiple lines can be made using the CRLF ("\n\r") pair.
|
|
// - Allocated memory must include null character.
|
|
//
|
|
const WCHAR szMessage[] =
|
|
L"The domain controller \\\\DANMORIN will crash in about 5 minutes.\r\nPlease disconnect now!";
|
|
HGLOBAL hGlobal = GlobalAlloc(GMEM_FIXED, sizeof(szMessage));
|
|
if (hGlobal == NULL)
|
|
return E_OUTOFMEMORY;
|
|
memcpy(OUT hGlobal, IN szMessage, sizeof(szMessage));
|
|
pMedium->hGlobal = hGlobal;
|
|
return S_OK;
|
|
}
|
|
*/
|
|
if (cf == m_cfSendConsoleMessageRecipients)
|
|
{
|
|
//
|
|
// Write the list of recipients to the storage medium.
|
|
// - The list of recipients is a group of UNICODE strings
|
|
// terminated by TWO null characters.c
|
|
// - Allocated memory must include BOTH null characters.
|
|
//
|
|
ASSERT (m_pcookie);
|
|
if ( m_pcookie )
|
|
{
|
|
CString computerName = m_pcookie->QueryNonNULLMachineName ();
|
|
if ( computerName.IsEmpty () )
|
|
{
|
|
DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1 ;
|
|
VERIFY (::GetComputerName (
|
|
computerName.GetBufferSetLength (dwSize),
|
|
&dwSize));
|
|
computerName.ReleaseBuffer ();
|
|
}
|
|
size_t len = computerName.GetLength () + 2;
|
|
WCHAR* pgrszRecipients = new WCHAR[len];
|
|
if ( pgrszRecipients )
|
|
{
|
|
::ZeroMemory (pgrszRecipients, len * sizeof (WCHAR));
|
|
wcscpy (pgrszRecipients, (LPCTSTR) computerName); // this should leave two NULLS
|
|
HGLOBAL hGlobal = ::GlobalAlloc (GMEM_FIXED, len * sizeof (WCHAR));
|
|
if ( hGlobal )
|
|
{
|
|
memcpy (OUT hGlobal, pgrszRecipients, len * sizeof (WCHAR));
|
|
pMedium->hGlobal = hGlobal;
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_OUTOFMEMORY;
|
|
delete [] pgrszRecipients;
|
|
}
|
|
else
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
else
|
|
return E_UNEXPECTED;
|
|
/*
|
|
const WCHAR grszRecipients[] = L"FooBar\0t-danm\0t-danm-2\0ZooBar\0";
|
|
HGLOBAL hGlobal = GlobalAlloc(GMEM_FIXED, sizeof(grszRecipients));
|
|
if (hGlobal == NULL)
|
|
return E_OUTOFMEMORY;
|
|
memcpy(OUT hGlobal, IN grszRecipients, sizeof(grszRecipients));
|
|
pMedium->hGlobal = hGlobal;
|
|
return S_OK;
|
|
*/
|
|
}
|
|
return DV_E_FORMATETC; // Invalid/unknown clipboard format
|
|
} // CMyComputerDataObject::GetData()
|
|
|
|
//#endif // __DAN_MORIN_HARDCODED_CONTEXT_MENU_EXTENSION__
|
|
|
|
|
|
HRESULT CMyComputerDataObject::Initialize(
|
|
CMyComputerCookie* pcookie,
|
|
DATA_OBJECT_TYPES type,
|
|
BOOL fAllowOverrideMachineName)
|
|
{
|
|
if (NULL == pcookie || NULL != m_pcookie)
|
|
{
|
|
ASSERT(FALSE);
|
|
return E_UNEXPECTED;
|
|
}
|
|
m_dataobjecttype = type;
|
|
m_pcookie = pcookie;
|
|
m_fAllowOverrideMachineName = fAllowOverrideMachineName;
|
|
((CRefcountedObject*)m_pcookie)->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
CMyComputerDataObject::~CMyComputerDataObject()
|
|
{
|
|
if (NULL != m_pcookie)
|
|
{
|
|
((CRefcountedObject*)m_pcookie)->Release();
|
|
}
|
|
else
|
|
{
|
|
ASSERT(FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
HRESULT CMyComputerDataObject::PutDisplayName(STGMEDIUM* pMedium)
|
|
// Writes the "friendly name" to the provided storage medium
|
|
// Returns the result of the write operation
|
|
{
|
|
CString strDisplayName = m_pcookie->QueryTargetServer();
|
|
CString formattedName = FormatDisplayName (strDisplayName);
|
|
|
|
|
|
stream_ptr s(pMedium);
|
|
return s.Write(formattedName);
|
|
}
|
|
|
|
// Register the clipboard formats
|
|
CLIPFORMAT CMyComputerDataObject::m_CFDisplayName =
|
|
(CLIPFORMAT)RegisterClipboardFormat(CCF_DISPLAY_NAME);
|
|
CLIPFORMAT CMyComputerDataObject::m_CFMachineName =
|
|
(CLIPFORMAT)RegisterClipboardFormat(L"MMC_SNAPIN_MACHINE_NAME");
|
|
CLIPFORMAT CDataObject::m_CFRawCookie =
|
|
(CLIPFORMAT)RegisterClipboardFormat(L"MYCOMPUT_SNAPIN_RAW_COOKIE");
|
|
|
|
|
|
STDMETHODIMP CMyComputerComponentData::QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject)
|
|
{
|
|
MFC_TRY;
|
|
|
|
CMyComputerCookie* pUseThisCookie = (CMyComputerCookie*)ActiveBaseCookie(reinterpret_cast<CCookie*>(cookie));
|
|
|
|
CComObject<CMyComputerDataObject>* pDataObject = NULL;
|
|
HRESULT hRes = CComObject<CMyComputerDataObject>::CreateInstance(&pDataObject);
|
|
if ( FAILED(hRes) )
|
|
return hRes;
|
|
|
|
HRESULT hr = pDataObject->Initialize( pUseThisCookie, type, m_fAllowOverrideMachineName);
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
hr = pDataObject->QueryInterface(IID_IDataObject,
|
|
reinterpret_cast<void**>(ppDataObject));
|
|
}
|
|
if ( FAILED(hr) )
|
|
{
|
|
delete pDataObject;
|
|
return hr;
|
|
}
|
|
|
|
return hr;
|
|
|
|
MFC_CATCH;
|
|
}
|