mirror of https://github.com/tongzx/nt5src
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.
643 lines
14 KiB
643 lines
14 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 value:
|
|
|
|
S_OK, On success
|
|
E_INVALIDARG, On incorrect input parameters
|
|
HRESULT sent by methods called, if it is not S_OK.
|
|
E_FAIL, on other errors.
|
|
--*/
|
|
{
|
|
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_IF_FAILED(hr);
|
|
|
|
|
|
HandleCommandLineParameters(); // Internal method to check, if any command line parameters were passed
|
|
|
|
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 value:
|
|
|
|
S_OK, On success
|
|
E_INVALIDARG, On incorrect input parameters
|
|
HRESULT sent by methods called, if it is not S_OK.
|
|
--*/
|
|
{
|
|
RETURN_INVALIDARG_IF_NULL(o_ppComponent);
|
|
|
|
HRESULT hr = E_FAIL;
|
|
CComObject<CDfsSnapinResultManager>* pResultManager;
|
|
|
|
|
|
|
|
CComObject<CDfsSnapinResultManager>::CreateInstance(&pResultManager);
|
|
if (NULL == pResultManager)
|
|
{
|
|
return(E_FAIL);
|
|
}
|
|
|
|
pResultManager->m_pScopeManager = this;
|
|
|
|
hr = pResultManager->QueryInterface(IID_IComponent, (void**) o_ppComponent);
|
|
_ASSERT(NULL != *o_ppComponent);
|
|
RETURN_IF_FAILED(hr);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
Return value:
|
|
|
|
S_OK, On success
|
|
HRESULT sent by methods called, if it is not S_OK.
|
|
--*/
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
switch(i_Event)
|
|
{
|
|
case MMCN_EXPAND: // Expand the node. Time to add the items to the console
|
|
{
|
|
hr = DoNotifyExpand(i_lpDataObject, (BOOL) i_lArg, (HSCOPEITEM) i_lParam);
|
|
break;
|
|
}
|
|
|
|
case MMCN_DELETE: // Delete the node. Time to remove item
|
|
{
|
|
hr = DoNotifyDelete(i_lpDataObject);
|
|
break;
|
|
}
|
|
|
|
case MMCN_ADD_IMAGES:
|
|
{
|
|
CMmcDisplay* pCMmcDisplayObj = NULL;
|
|
hr = GetDisplayObject(i_lpDataObject, &pCMmcDisplayObj);
|
|
if (SUCCEEDED(hr))
|
|
hr = pCMmcDisplayObj->OnAddImages((IImageList *)i_lArg, (HSCOPEITEM)i_lParam);
|
|
break;
|
|
}
|
|
|
|
case MMCN_PROPERTY_CHANGE: // Handle the property change
|
|
{
|
|
hr = DoNotifyPropertyChange(i_lpDataObject, i_lParam);
|
|
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 value:
|
|
|
|
S_OK, if successful.
|
|
E_INVALIDARG, if one of the arguments is null.
|
|
HRESULT sent by methods called, if it is not S_OK.
|
|
--*/
|
|
{
|
|
RETURN_INVALIDARG_IF_NULL(i_lpDataObject);
|
|
|
|
CMmcDisplay* pCMmcDisplayObj = NULL;
|
|
HRESULT hr = GetDisplayObject(i_lpDataObject, &pCMmcDisplayObj);
|
|
RETURN_IF_FAILED(hr);
|
|
|
|
if (!i_bExpanding)
|
|
{
|
|
return(S_OK);
|
|
}
|
|
|
|
CWaitCursor WaitCursor; // An object to set\reset the cursor to wait cursor
|
|
|
|
// Add the items to the Scope pane
|
|
// Call the method even if the node is not expanding as we need to cache the scope
|
|
// and parent
|
|
hr = pCMmcDisplayObj->EnumerateScopePane(m_pScope, i_hParent);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
STDMETHODIMP
|
|
CDfsSnapinScopeManager::DoNotifyDelete(
|
|
IN LPDATAOBJECT i_lpDataObject
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Take action on Notify with the event MMCN_DELETE.
|
|
|
|
|
|
Arguments:
|
|
|
|
i_lpDataObject - The IDataObject pointer which is used to get the DisplayObject.
|
|
|
|
Return value:
|
|
|
|
S_OK, if successful.
|
|
E_INVALIDARG, if one of the arguments is null.
|
|
HRESULT sent by methods called, if it is not S_OK.
|
|
--*/
|
|
{
|
|
RETURN_INVALIDARG_IF_NULL(i_lpDataObject);
|
|
|
|
|
|
HRESULT hr = E_FAIL;
|
|
CMmcDisplay* pCMmcDisplayObj = NULL;
|
|
|
|
|
|
|
|
hr = GetDisplayObject(i_lpDataObject, &pCMmcDisplayObj);
|
|
RETURN_IF_FAILED(hr);
|
|
|
|
|
|
hr = pCMmcDisplayObj->DoDelete(); // Delete the the item.
|
|
RETURN_IF_FAILED(hr);
|
|
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
Return value:
|
|
|
|
S_OK.
|
|
--*/
|
|
{
|
|
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 value:
|
|
|
|
S_OK, On success
|
|
E_INVALIDARG, On incorrect input parameters
|
|
HRESULT sent by methods called, if it is not S_OK.
|
|
--*/
|
|
{
|
|
RETURN_INVALIDARG_IF_NULL(o_ppDataObject);
|
|
|
|
HRESULT hr = S_FALSE;
|
|
CMmcDisplay* pMmcDisplay = NULL;
|
|
|
|
*o_ppDataObject = NULL;
|
|
|
|
// 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.
|
|
if (0 == i_lCookie)
|
|
{
|
|
pMmcDisplay = reinterpret_cast<CMmcDisplay *>(m_pMmcDfsAdmin);
|
|
}
|
|
else
|
|
{
|
|
pMmcDisplay = reinterpret_cast<CMmcDisplay *>(i_lCookie);
|
|
}
|
|
|
|
hr = pMmcDisplay->put_CoClassCLSID(CLSID_DfsSnapinScopeManager);
|
|
if (S_OK != hr)
|
|
{
|
|
return(hr);
|
|
}
|
|
|
|
|
|
hr = pMmcDisplay->QueryInterface(IID_IDataObject, (void **)o_ppDataObject);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
STDMETHODIMP
|
|
CDfsSnapinScopeManager::GetDisplayInfo(
|
|
IN OUT SCOPEDATAITEM* io_pScopeDataItem
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Returns the display information being asked for by MMC.
|
|
|
|
|
|
Arguments:
|
|
|
|
io_pScopeDataItem - Contains details about what information is being asked for.
|
|
The information being asked in returned in this object itself.
|
|
|
|
Return value:
|
|
|
|
S_OK, On success
|
|
E_INVALIDARG, On incorrect input parameters
|
|
HRESULT sent by methods called, if it is not S_OK.
|
|
--*/
|
|
{
|
|
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);
|
|
}
|
|
|
|
// Get display object. We had stored this while creating the object
|
|
CMmcDisplay* pCMmcDisplayObj = reinterpret_cast<CMmcDisplay*>(io_pScopeDataItem->lParam);
|
|
|
|
// Calling the virtual method in the base class
|
|
HRESULT hr = pCMmcDisplayObj->GetScopeDisplayInfo(io_pScopeDataItem);
|
|
RETURN_IF_FAILED(hr);
|
|
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
STDMETHODIMP
|
|
CDfsSnapinScopeManager::CompareObjects(
|
|
IN LPDATAOBJECT lpDataObjectA,
|
|
IN LPDATAOBJECT lpDataObjectB
|
|
)
|
|
{
|
|
|
|
if (NULL == lpDataObjectA || NULL == lpDataObjectB)
|
|
{
|
|
return(S_FALSE);
|
|
}
|
|
|
|
HRESULT hr = S_FALSE;
|
|
CMmcDisplay* pMmcDisplayA = NULL;
|
|
CMmcDisplay* pMmcDisplayB = NULL;
|
|
|
|
FORMATETC fmte = {
|
|
CMmcDisplay::mMMC_CF_Dfs_Snapin_Internal,
|
|
NULL,
|
|
DVASPECT_CONTENT,
|
|
-1,
|
|
TYMED_HGLOBAL
|
|
};
|
|
|
|
STGMEDIUM medium = {
|
|
TYMED_HGLOBAL,
|
|
NULL,
|
|
NULL
|
|
};
|
|
|
|
// Get the this pointer of the display object using private clipboard format.
|
|
medium.hGlobal = ::GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE | GMEM_NODISCARD,
|
|
(sizeof(ULONG_PTR)));
|
|
if (medium.hGlobal == NULL)
|
|
{
|
|
return STG_E_MEDIUMFULL;
|
|
}
|
|
|
|
hr = lpDataObjectA->GetDataHere(&fmte, &medium);
|
|
RETURN_IF_FAILED(hr);
|
|
|
|
ULONG_PTR* pulVal = (ULONG_PTR*) (GlobalLock(medium.hGlobal));
|
|
pMmcDisplayA = reinterpret_cast<CMmcDisplay *>(*pulVal);
|
|
GlobalUnlock(medium.hGlobal);
|
|
|
|
hr = lpDataObjectB->GetDataHere(&fmte, &medium);
|
|
RETURN_IF_FAILED(hr);
|
|
|
|
pulVal = (ULONG_PTR*) (GlobalLock(medium.hGlobal));
|
|
pMmcDisplayB = reinterpret_cast<CMmcDisplay *>(*pulVal);
|
|
GlobalUnlock(medium.hGlobal);
|
|
|
|
GlobalFree(medium.hGlobal);
|
|
|
|
if (pMmcDisplayA == pMmcDisplayB)
|
|
{
|
|
return(S_OK);
|
|
}
|
|
else
|
|
{
|
|
return (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);
|
|
|
|
|
|
HRESULT hr = E_FAIL;
|
|
|
|
*o_ppMmcDisplay = NULL;
|
|
|
|
FORMATETC fmte = {
|
|
CMmcDisplay::mMMC_CF_Dfs_Snapin_Internal,
|
|
NULL,
|
|
DVASPECT_CONTENT,
|
|
-1,
|
|
TYMED_HGLOBAL
|
|
};
|
|
|
|
STGMEDIUM medium = {
|
|
TYMED_HGLOBAL,
|
|
NULL,
|
|
NULL
|
|
};
|
|
|
|
// Get the this pointer of the display object using private clipboard format.
|
|
medium.hGlobal = ::GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE | GMEM_NODISCARD,
|
|
(sizeof(ULONG_PTR)));
|
|
if (medium.hGlobal == NULL)
|
|
{
|
|
return STG_E_MEDIUMFULL;
|
|
}
|
|
|
|
hr = i_lpDataObject->GetDataHere(&fmte, &medium);
|
|
RETURN_IF_FAILED(hr);
|
|
|
|
ULONG_PTR* pulVal = (ULONG_PTR*) (GlobalLock(medium.hGlobal));
|
|
*o_ppMmcDisplay = reinterpret_cast<CMmcDisplay *>(*pulVal);
|
|
GlobalUnlock(medium.hGlobal);
|
|
|
|
GlobalFree(medium.hGlobal);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP
|
|
CDfsSnapinScopeManager::HandleCommandLineParameters(
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
check if any command line parameters are passed to us and if so take appropriate
|
|
action.
|
|
Currently suuported parameters:
|
|
\DfsRoot:DfsRootName ,
|
|
where DfsRootName can be ComputerName\DfsRootName or DomainName\DfsRootName
|
|
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
|
|
Return value:
|
|
|
|
S_OK, if successful.
|
|
Any error returned by called methods
|
|
--*/
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
LPTSTR szCommandLine = ::GetCommandLine();
|
|
CComBSTR bstrCommandLine = szCommandLine;
|
|
LPCTSTR szSeparators = _T(" ,\t");
|
|
LPTSTR szCurrentParameter = NULL;
|
|
CComBSTR bstrParameterPrefix;
|
|
|
|
|
|
|
|
hr = LoadStringFromResource(IDS_COMMANDLINE_PARAMETER_PREFIX, &bstrParameterPrefix);
|
|
RETURN_IF_FAILED(hr);
|
|
|
|
|
|
szCurrentParameter = _tcstok(bstrCommandLine, szSeparators);
|
|
while(szCurrentParameter)
|
|
{
|
|
ATLTRACE(_T("\nCommand line parameter = %s\n"), szCurrentParameter);
|
|
// Check if this token contains the required prefix
|
|
if (0 == mylstrncmpi(szCurrentParameter, bstrParameterPrefix, bstrParameterPrefix.Length()) )
|
|
{
|
|
LPTSTR szParamValue = _tcschr(szCurrentParameter, bstrParameterPrefix.m_str[bstrParameterPrefix.Length() - 1]);
|
|
|
|
if (NULL != szParamValue)
|
|
{
|
|
szParamValue++; // Skip the ':'
|
|
|
|
if (NULL != szParamValue) // Check again just to be sure
|
|
{
|
|
|
|
hr = m_pMmcDfsAdmin->AddDfsRoot(szParamValue); // Add the dfsroot to the console
|
|
// Ignoring the return value right now as we want to handle the remaining parameters
|
|
}
|
|
} // if (NULL != szParamValue)
|
|
}
|
|
// Get the next token
|
|
szCurrentParameter = _tcstok(NULL, szSeparators);
|
|
}
|
|
|
|
|
|
return S_OK;
|
|
}
|