//==============================================================; // // This source code is only intended as a supplement to existing Microsoft documentation. // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (C) 1999 Microsoft Corporation. All Rights Reserved. // //==============================================================; // CCompData.cpp : Implementation of CCCompData #include "stdafx.h" #include "EvtVwr.h" #include "CompData.h" #include "Comp.h" #include "DataObj.h" #include "resource.h" #include HBITMAP CCompData::m_pBMapSm = NULL; HBITMAP CCompData::m_pBMapLg = NULL; CCompData::CCompData() : m_cref(0), m_ipConsoleNameSpace2(NULL), m_ipConsole(NULL) { m_pStaticNode = new CStaticNode(); } CCompData::~CCompData() { if (m_pStaticNode) { delete m_pStaticNode; } } /////////////////////////////// // Interface IComponentData /////////////////////////////// HRESULT CCompData::Initialize( /* [in] */ LPUNKNOWN pUnknown) { HRESULT hr = S_OK; // // Get pointer to name space interface // hr = pUnknown->QueryInterface(IID_IConsoleNameSpace2, (void **)&m_ipConsoleNameSpace2); _ASSERT( S_OK == hr ); // // Get pointer to console interface // hr = pUnknown->QueryInterface(IID_IConsole, (void **)&m_ipConsole); _ASSERT( S_OK == hr ); if (NULL == m_pBMapSm || NULL == m_pBMapLg) { m_pBMapSm = LoadBitmap(g_hinst, MAKEINTRESOURCE(IDR_SMICONS)); m_pBMapLg = LoadBitmap(g_hinst, MAKEINTRESOURCE(IDR_LGICONS)); } IImageList *pImageList; hr = m_ipConsole->QueryScopeImageList(&pImageList); _ASSERT( S_OK == hr ); //ImageListSetStrip can return a failure code. If it does, that's ok. hr = pImageList->ImageListSetStrip( (long *)m_pBMapSm, // pointer to a handle (long *)m_pBMapLg, // pointer to a handle 0, // index of the first image in the strip RGB(0, 128, 128) // color of the icon mask ); pImageList->Release(); return S_OK; } HRESULT CCompData::CreateComponent( /* [out] */ LPCOMPONENT __RPC_FAR *ppComponent) { *ppComponent = NULL; CComponent *pComponent = new CComponent(this); if (NULL == pComponent) return E_OUTOFMEMORY; return pComponent->QueryInterface(IID_IComponent, (void **)ppComponent); return S_FALSE; } HRESULT CCompData::Notify( /* [in] */ LPDATAOBJECT lpDataObject, /* [in] */ MMC_NOTIFY_TYPE event, /* [in] */ LPARAM arg, /* [in] */ LPARAM param) { MMCN_Crack(TRUE, lpDataObject, this, NULL, event, arg, param); HRESULT hr = S_FALSE; //Get our data object. If it is NULL, we return with S_FALSE. //See implementation of GetOurDataObject() to see how to //handle special data objects. CDataObject *pDataObject = GetOurDataObject(lpDataObject); if (NULL == pDataObject) return S_FALSE; CDelegationBase *base = pDataObject->GetBaseNodeObject(); switch (event) { case MMCN_PRELOAD: //The arg value passed into Notify holds the HSCOPEITEM of //the static node. Cache it for future use. m_pStaticNode->SetHandle((HANDLE)arg); //The static node's display name includes the name of the //currently targetted machine. MMC stores a static node's //display name in the .msc file. When loading a snap-in //from a .msc file, MMC uses the stored display name again //The only way for the snap-in to change the display name //is to support the CCF_SNAPINS_PRELOADS clipboard format //and to handle MMCN_PRELOAD. OnPreLoad(lpDataObject, arg, param); break; case MMCN_EXPAND: hr = base->OnExpand(m_ipConsoleNameSpace2, m_ipConsole, (HSCOPEITEM)param); break; case MMCN_ADD_IMAGES: hr = base->OnAddImages((IImageList *)arg, (HSCOPEITEM)param); break; case MMCN_REMOVE_CHILDREN: hr = base->OnRemoveChildren(); break; } return hr; } HRESULT CCompData::OnPreLoad(LPDATAOBJECT lpDataObject, LPARAM arg, LPARAM param) { HRESULT hr = S_FALSE; USES_CONVERSION; SCOPEDATAITEM sdi; LPOLESTR wszName = NULL; const _TCHAR *pszName = m_pStaticNode->GetDisplayName(); wszName = (LPOLESTR)T2COLE(pszName); ZeroMemory (&sdi, sizeof(SCOPEDATAITEM)); sdi.mask = SDI_STR; sdi.displayname = wszName; sdi.ID = arg; hr = m_ipConsoleNameSpace2->SetItem(&sdi); if (S_OK != hr) return E_FAIL; return hr; } HRESULT CCompData::Destroy( void) { //Release handles to bitmaps created in CCompData::Initialize if (m_pBMapSm != NULL) DeleteObject(m_pBMapSm); if (m_pBMapLg != NULL) DeleteObject(m_pBMapLg); // Free interfaces if (m_ipConsoleNameSpace2) { m_ipConsoleNameSpace2->Release(); m_ipConsoleNameSpace2 = NULL; } if (m_ipConsole) { m_ipConsole->Release(); m_ipConsole = NULL; } return S_OK; } HRESULT CCompData::QueryDataObject( /* [in] */ MMC_COOKIE cookie, /* [in] */ DATA_OBJECT_TYPES type, /* [out] */ LPDATAOBJECT *ppDataObject) { CDataObject *pObj = NULL; if (cookie == 0) pObj = new CDataObject((MMC_COOKIE)m_pStaticNode, type); else pObj = new CDataObject(cookie, type); if (!pObj) return E_OUTOFMEMORY; pObj->QueryInterface(IID_IDataObject, (void **)ppDataObject); return S_OK; } HRESULT CCompData::GetDisplayInfo( /* [out][in] */ SCOPEDATAITEM *pScopeDataItem) { LPOLESTR pszW = NULL; HRESULT hr = S_FALSE; // if they are asking for the SDI_STR we have one of those to give if (pScopeDataItem->lParam) { CDelegationBase *base = (CDelegationBase *)pScopeDataItem->lParam; if (pScopeDataItem->mask & SDI_STR) { LPCTSTR pszT = base->GetDisplayName(); AllocOleStr(&pszW, (LPTSTR)pszT); pScopeDataItem->displayname = pszW; } if (pScopeDataItem->mask & SDI_IMAGE) { pScopeDataItem->nImage = base->GetBitmapIndex(); } } return hr; } HRESULT CCompData::CompareObjects( /* [in] */ LPDATAOBJECT lpDataObjectA, /* [in] */ LPDATAOBJECT lpDataObjectB) { CDelegationBase *baseA = GetOurDataObject(lpDataObjectA)->GetBaseNodeObject(); CDelegationBase *baseB = GetOurDataObject(lpDataObjectB)->GetBaseNodeObject(); // compare the object pointers if (baseA->GetCookie() == baseB->GetCookie()) return S_OK; return S_FALSE; } /////////////////////////////////// // Interface IExtendPropertySheet2 /////////////////////////////////// HRESULT CCompData::CreatePropertyPages( /* [in] */ LPPROPERTYSHEETCALLBACK lpProvider, /* [in] */ LONG_PTR handle, /* [in] */ LPDATAOBJECT lpIDataObject) { return m_pStaticNode->CreatePropertyPages(lpProvider, handle); } HRESULT CCompData::QueryPagesFor( /* [in] */ LPDATAOBJECT lpDataObject) { return m_pStaticNode->HasPropertySheets(); } HRESULT CCompData::GetWatermarks( /* [in] */ LPDATAOBJECT lpIDataObject, /* [out] */ HBITMAP __RPC_FAR *lphWatermark, /* [out] */ HBITMAP __RPC_FAR *lphHeader, /* [out] */ HPALETTE __RPC_FAR *lphPalette, /* [out] */ BOOL __RPC_FAR *bStretch) { return m_pStaticNode->GetWatermarks(lphWatermark, lphHeader, lphPalette, bStretch); } /////////////////////////////// // Interface IExtendContextMenu /////////////////////////////// HRESULT CCompData::AddMenuItems( /* [in] */ LPDATAOBJECT piDataObject, /* [in] */ LPCONTEXTMENUCALLBACK piCallback, /* [out][in] */ long __RPC_FAR *pInsertionAllowed) { CDelegationBase *base = GetOurDataObject(piDataObject)->GetBaseNodeObject(); return base->OnAddMenuItems(piCallback, pInsertionAllowed); } HRESULT CCompData::Command( /* [in] */ long lCommandID, /* [in] */ LPDATAOBJECT piDataObject) { CDelegationBase *base = GetOurDataObject(piDataObject)->GetBaseNodeObject(); return base->OnMenuCommand(m_ipConsole, m_ipConsoleNameSpace2, lCommandID, piDataObject); } /////////////////////////////// // Interface IPersistStream /////////////////////////////// HRESULT CCompData::GetClassID( /* [out] */ CLSID __RPC_FAR *pClassID) { *pClassID = m_pStaticNode->getNodeType(); return S_OK; } HRESULT CCompData::IsDirty( void) { return m_pStaticNode->isDirty() == true ? S_OK : S_FALSE; } HRESULT CCompData::Load( /* [unique][in] */ IStream __RPC_FAR *pStm) { void *snapInData = m_pStaticNode->getData(); ULONG dataSize = m_pStaticNode->getDataSize(); return pStm->Read(snapInData, dataSize, NULL); } HRESULT CCompData::Save( /* [unique][in] */ IStream __RPC_FAR *pStm, /* [in] */ BOOL fClearDirty) { void *snapInData = m_pStaticNode->getData(); ULONG dataSize = m_pStaticNode->getDataSize(); if (fClearDirty) m_pStaticNode->clearDirty(); return pStm->Write(snapInData, dataSize, NULL); } HRESULT CCompData::GetSizeMax( /* [out] */ ULARGE_INTEGER __RPC_FAR *pcbSize) { return m_pStaticNode->getDataSize(); }