Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

439 lines
12 KiB

/*++
Module Name:
IComData.cpp
Abstract:
This module contains the implementation for CDfsSnapinScopeManager.
This class implements IComponentData and other related interfaces
--*/
#include "stdafx.h"
#include "DfsGUI.h"
#include "DfsScope.h"
#include "MmcDispl.h"
#include "DfsReslt.h"
#include "Utils.h"
#include "DfsNodes.h"
STDMETHODIMP
CDfsSnapinScopeManager::Initialize(
IN LPUNKNOWN i_pUnknown
)
/*++
Routine Description:
Initialize the IComponentData interface.
The variables needed later are QI'ed now
Arguments:
i_pUnknown - Pointer to the unknown object of IConsole2.
--*/
{
RETURN_INVALIDARG_IF_NULL(i_pUnknown);
HRESULT hr = i_pUnknown->QueryInterface(IID_IConsole2, reinterpret_cast<void**>(&m_pConsole));
RETURN_IF_FAILED(hr);
hr = m_pMmcDfsAdmin->PutConsolePtr(m_pConsole);
RETURN_IF_FAILED(hr);
hr = i_pUnknown->QueryInterface(IID_IConsoleNameSpace, reinterpret_cast<void**>(&m_pScope));
RETURN_IF_FAILED(hr);
// The snap-in should also call IConsole2::QueryScopeImageList
// to get the image list for the scope pane and add images
// to be displayed on the scope pane side.
CComPtr<IImageList> pScopeImageList;
hr = m_pConsole->QueryScopeImageList(&pScopeImageList);
RETURN_IF_FAILED(hr);
HBITMAP pBMapSm = NULL;
HBITMAP pBMapLg = NULL;
if (!(pBMapSm = LoadBitmap(_Module.GetModuleInstance(),
MAKEINTRESOURCE(IDB_SCOPE_IMAGES_16x16))) ||
!(pBMapLg = LoadBitmap(_Module.GetModuleInstance(),
MAKEINTRESOURCE(IDB_SCOPE_IMAGES_32x32))))
{
hr = HRESULT_FROM_WIN32(GetLastError());
} else
{
hr = pScopeImageList->ImageListSetStrip(
(LONG_PTR *)pBMapSm,
(LONG_PTR *)pBMapLg,
0,
RGB(255, 0, 255)
);
}
if (pBMapSm)
DeleteObject(pBMapSm);
if (pBMapLg)
DeleteObject(pBMapLg);
return hr;
}
STDMETHODIMP
CDfsSnapinScopeManager::CreateComponent(
OUT LPCOMPONENT* o_ppComponent
)
/*++
Routine Description:
Creates the IComponent object
Arguments:
o_ppComponent - Pointer to the object in which the pointer to IComponent object
is stored.
--*/
{
RETURN_INVALIDARG_IF_NULL(o_ppComponent);
CComObject<CDfsSnapinResultManager>* pResultManager;
CComObject<CDfsSnapinResultManager>::CreateInstance(&pResultManager);
if (NULL == pResultManager)
{
return(E_FAIL);
}
pResultManager->m_pScopeManager = this;
HRESULT hr = pResultManager->QueryInterface(IID_IComponent, (void**) o_ppComponent);
_ASSERT(NULL != *o_ppComponent);
return hr;
}
STDMETHODIMP
CDfsSnapinScopeManager::Notify(
IN LPDATAOBJECT i_lpDataObject,
IN MMC_NOTIFY_TYPE i_Event,
IN LPARAM i_lArg,
IN LPARAM i_lParam
)
/*++
Routine Description:
Handles different events in form of notify
Arguments:
i_lpDataObject - The data object for the node for which the event occured
i_Event - The type of event for which notify has occurred
i_lArg - Argument for the event
i_lParam - Parameters for the event.
--*/
{
// The snap-in should return S_FALSE for any notification it does not handle.
// MMC then performs a default operation for the notification.
HRESULT hr = S_FALSE;
switch(i_Event)
{
case MMCN_EXPAND:
{
// MMC sends the MMCN_EXPAND notification the first time it needs to display a
// scope item's children in either the scope or result pane. The notification
// is not sent each time the item is visually expanded or collapsed.
// On receipt of this notification the snap-in should enumerate the children
// (subcontainers only) of the specified scope item, if any, using
// IConsoleNameSpace2 methods. Subsequently, if a new item is added to or deleted
// from this scope object through some external means, that item should also be
// added to or deleted from the console's namespace using IConsoleNameSpace2 methods.
// lpDataObject: [in] Pointer to the data object of the scope item that needs
// to be expanded or collapsed.
// arg: [in] TRUE if the folder is being expanded; FALSE if the folder is being collapsed.
// param: [in] The HSCOPEITEM of the item that needs to be expanded or collapsed.
hr = DoNotifyExpand(i_lpDataObject, (BOOL)i_lArg, (HSCOPEITEM)i_lParam);
break;
}
case MMCN_DELETE:
{
// This message is generated when the user presses the delete key or uses the
// mouse to click the toolbar's delete button.
// The snap-in should delete the items specified in the data object.
// lpDataObject: [in] Pointer to the data object of the currently selected scope
// or result item, provided by the snap-in.
// arg: Not used.
// param: Not used.
CMmcDisplay* pCMmcDisplayObj = NULL;
hr = GetDisplayObject(i_lpDataObject, &pCMmcDisplayObj);
if (SUCCEEDED(hr))
hr = pCMmcDisplayObj->DoDelete(); // Delete the the item.
break;
}
case MMCN_PROPERTY_CHANGE: // Handle the property change
{
// i_lpDataObject is NULL because a data object is not required.
// i_lArg is TRUE if the property change is for a scope item.
// i_lParam is the param passed to MMCPropertyChangeNotify, this is the display object.
hr = ((CMmcDisplay*)i_lParam)->PropertyChanged();
break;
}
default:
break;
}
return hr;
}
STDMETHODIMP
CDfsSnapinScopeManager::DoNotifyExpand(
IN LPDATAOBJECT i_lpDataObject,
IN BOOL i_bExpanding,
IN HSCOPEITEM i_hParent
)
/*++
Routine Description:
Take action on Notify with the event MMCN_EXPAND.
Arguments:
i_lpDataObject - The IDataObject pointer which is used to get the DisplayObject.
i_bExpanding - TRUE, if the node is expanding. FALSE otherwise
i_hParent - HSCOPEITEM of the node that received this event
--*/
{
RETURN_INVALIDARG_IF_NULL(i_lpDataObject);
if (!i_bExpanding)
return S_OK;
CWaitCursor WaitCursor;
CMmcDisplay* pCMmcDisplayObj = NULL;
HRESULT hr = GetDisplayObject(i_lpDataObject, &pCMmcDisplayObj);
if (SUCCEEDED(hr))
hr = pCMmcDisplayObj->EnumerateScopePane(m_pScope, i_hParent);
return hr;
}
STDMETHODIMP
CDfsSnapinScopeManager::Destroy()
/*++
Routine Description:
The IComponentData object is about to be destroyed. Explicitely release all interface pointers,
otherwise, MMC may not call the destructor.
Arguments:
None.
--*/
{
// The snap-in is in the process of being unloaded. Release all references to the console.
m_pScope.Release();
m_pConsole.Release();
return S_OK;
}
STDMETHODIMP
CDfsSnapinScopeManager::QueryDataObject(
IN MMC_COOKIE i_lCookie,
IN DATA_OBJECT_TYPES i_DataObjectType,
OUT LPDATAOBJECT* o_ppDataObject
)
/*++
Routine Description:
Returns the IDataObject for the specified node.
Arguments:
i_lCookie - This parameter identifies the node for which IDataObject is
being queried.
i_DataObjectType - The context in which the IDataObject is being queried.
Eg., Result or Scope or Snapin(Node) Manager.
o_ppDataObject - The data object will be returned in this pointer.
--*/
{
RETURN_INVALIDARG_IF_NULL(o_ppDataObject);
// We get back the cookie we stored in lparam of the scopeitem.
// The cookie is the MmcDisplay pointer.
// For the static(root) node, Use m_pMmcDfsAdmin as no lparam is stored.
CMmcDisplay* pMmcDisplay = ((0 == i_lCookie)? (CMmcDisplay *)m_pMmcDfsAdmin : (CMmcDisplay *)i_lCookie);
pMmcDisplay->put_CoClassCLSID(CLSID_DfsSnapinScopeManager);
return pMmcDisplay->QueryInterface(IID_IDataObject, (void **)o_ppDataObject);
}
STDMETHODIMP
CDfsSnapinScopeManager::GetDisplayInfo(
IN OUT SCOPEDATAITEM* io_pScopeDataItem
)
/*++
Routine Description:
Retrieves display information for a scope item.
Arguments:
io_pScopeDataItem - Contains details about what information is being asked for.
The information being asked is returned in this object itself.
--*/
{
RETURN_INVALIDARG_IF_NULL(io_pScopeDataItem);
// This (cookie) is null for static node.
// Static node display name is returned through IDataObject Clipboard.
if (NULL == io_pScopeDataItem->lParam)
return(S_OK);
return ((CMmcDisplay*)(io_pScopeDataItem->lParam))->GetScopeDisplayInfo(io_pScopeDataItem);
}
STDMETHODIMP
CDfsSnapinScopeManager::CompareObjects(
IN LPDATAOBJECT lpDataObjectA,
IN LPDATAOBJECT lpDataObjectB
)
/*++
Routine Description:
The method enables a snap-in to compare two data objects acquired through QueryDataObject.
Return Values:
S_OK: The data objects represented by lpDataObjectA and lpDataObjectB are the same.
S_FALSE: The data objects represented by lpDataObjectA and lpDataObjectB are not the same.
--*/
{
if (lpDataObjectA == lpDataObjectB)
return S_OK;
if (!lpDataObjectA || !lpDataObjectB)
return S_FALSE;
FORMATETC fmte = {CMmcDisplay::mMMC_CF_Dfs_Snapin_Internal, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
STGMEDIUM medium = {TYMED_HGLOBAL, NULL, NULL};
medium.hGlobal = ::GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE | GMEM_NODISCARD, (sizeof(ULONG_PTR)));
if (medium.hGlobal == NULL)
return STG_E_MEDIUMFULL;
HRESULT hr = lpDataObjectA->GetDataHere(&fmte, &medium);
RETURN_IF_FAILED(hr);
ULONG_PTR* pulVal = (ULONG_PTR*)(GlobalLock(medium.hGlobal));
CMmcDisplay* pMmcDisplayA = reinterpret_cast<CMmcDisplay *>(*pulVal);
GlobalUnlock(medium.hGlobal);
hr = lpDataObjectB->GetDataHere(&fmte, &medium);
RETURN_IF_FAILED(hr);
pulVal = (ULONG_PTR*)(GlobalLock(medium.hGlobal));
CMmcDisplay* pMmcDisplayB = reinterpret_cast<CMmcDisplay *>(*pulVal);
GlobalUnlock(medium.hGlobal);
GlobalFree(medium.hGlobal);
return ((pMmcDisplayA == pMmcDisplayB) ? S_OK : S_FALSE);
}
STDMETHODIMP
CDfsSnapinScopeManager::GetDisplayObject(
IN LPDATAOBJECT i_lpDataObject,
OUT CMmcDisplay** o_ppMmcDisplay
)
/*++
Routine Description:
Get the Display Object from the IDataObject. This is a derived object that is used for a
lot of purposes
Arguments:
i_lpDataObject - The IDataObject pointer which is used to get the DisplayObject.
o_ppMmcDisplay - The MmcDisplayObject written by us. Used as a callback for Mmc
related display operations.
--*/
{
RETURN_INVALIDARG_IF_NULL(i_lpDataObject);
RETURN_INVALIDARG_IF_NULL(o_ppMmcDisplay);
FORMATETC fmte = {CMmcDisplay::mMMC_CF_Dfs_Snapin_Internal, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
STGMEDIUM medium = {TYMED_HGLOBAL, NULL, NULL};
medium.hGlobal = ::GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE | GMEM_NODISCARD, (sizeof(ULONG_PTR)));
if (medium.hGlobal == NULL)
return STG_E_MEDIUMFULL;
HRESULT hr = i_lpDataObject->GetDataHere(&fmte, &medium);
if (SUCCEEDED(hr))
{
ULONG_PTR* pulVal = (ULONG_PTR*)(GlobalLock(medium.hGlobal));
*o_ppMmcDisplay = reinterpret_cast<CMmcDisplay *>(*pulVal);
GlobalUnlock(medium.hGlobal);
}
GlobalFree(medium.hGlobal);
return hr;
}