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.
367 lines
9.2 KiB
367 lines
9.2 KiB
// stdcdata.cpp : Implementation of CComponentData
|
|
|
|
#include "stdcdata.h"
|
|
#include "guidhelp.h" // ExtractObjectTypeGUID
|
|
#include "stddtobj.h" // CDataObject::m_CFRawCookie
|
|
#include "stdrsrc.h" // IDS_FRAMEWORK_*
|
|
|
|
//
|
|
// CComponentData
|
|
//
|
|
|
|
CComponentData::CComponentData()
|
|
: m_pConsole( NULL ),
|
|
m_pConsoleNameSpace( NULL )
|
|
{
|
|
}
|
|
|
|
CComponentData::~CComponentData()
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
ASSERT(NULL == m_pConsole && NULL == m_pConsoleNameSpace); // object should be Destroy()ed before being Release()d
|
|
SAFE_RELEASE( m_pConsole );
|
|
SAFE_RELEASE( m_pConsoleNameSpace );
|
|
}
|
|
|
|
HRESULT CComponentData::OnNotifyExpand(LPDATAOBJECT /*lpDataObject*/, BOOL /*bExpanding*/, HSCOPEITEM /*hParent*/)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CComponentData::OnNotifyPreload(LPDATAOBJECT /*lpDataObject*/, HSCOPEITEM /*hRootScopeItem*/)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CComponentData::OnNotifyRename(LPDATAOBJECT /*lpDataObject*/, LPARAM arg, LPARAM /*param*/)
|
|
{
|
|
// by default, do not allow rename
|
|
return (0 == arg) ? S_FALSE : S_OK;
|
|
}
|
|
|
|
HRESULT CComponentData::OnNotifyDelete(LPDATAOBJECT /*lpDataObject*/)
|
|
{
|
|
ASSERT(FALSE); // Why did you enable the Delete command if you won't handle it?
|
|
return S_OK;
|
|
}
|
|
HRESULT CComponentData::OnNotifyRelease(LPDATAOBJECT /*lpDataObject*/, HSCOPEITEM /*hItem*/)
|
|
{
|
|
ASSERT(FALSE); // You will leak memory if you don't handle this
|
|
return S_OK;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// Virtual function called by CComponentData::IComponentData::Notify(MMCN_PROPERTY_CHANGE)
|
|
// OnPropertyChange() is generated by MMCPropertyChangeNotify( param )
|
|
HRESULT CComponentData::OnPropertyChange( LPARAM /*param*/ )
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*
|
|
* IComponentData
|
|
*/
|
|
|
|
STDMETHODIMP CComponentData::Initialize(LPUNKNOWN pUnknown)
|
|
{
|
|
MFC_TRY;
|
|
ASSERT(pUnknown != NULL);
|
|
|
|
// MMC should only call ::Initialize once!
|
|
ASSERT(NULL == m_pConsoleNameSpace);
|
|
SAFE_RELEASE( m_pConsoleNameSpace );
|
|
HRESULT hr = pUnknown->QueryInterface(IID_IConsoleNameSpace,
|
|
reinterpret_cast<void**>(&m_pConsoleNameSpace));
|
|
ASSERT( SUCCEEDED(hr) );
|
|
|
|
// add the images for the scope tree
|
|
LPIMAGELIST lpScopeImage = NULL;
|
|
|
|
ASSERT(NULL == m_pConsole);
|
|
SAFE_RELEASE( m_pConsole );
|
|
hr = pUnknown->QueryInterface(IID_IConsole, reinterpret_cast<void**>(&m_pConsole));
|
|
ASSERT( SUCCEEDED(hr) );
|
|
|
|
hr = m_pConsole->QueryScopeImageList(&lpScopeImage);
|
|
ASSERT( SUCCEEDED(hr) );
|
|
|
|
hr = LoadIcons(lpScopeImage, FALSE);
|
|
ASSERT( SUCCEEDED(hr) );
|
|
|
|
lpScopeImage->Release();
|
|
|
|
MFC_CATCH;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CComponentData::Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
MFC_TRY;
|
|
|
|
switch(event)
|
|
{
|
|
case MMCN_EXPAND:
|
|
hr = OnNotifyExpand( lpDataObject, (BOOL)arg, (HSCOPEITEM)param );
|
|
break;
|
|
case MMCN_RENAME:
|
|
hr = OnNotifyRename( lpDataObject, arg, param );
|
|
break;
|
|
case MMCN_DELETE:
|
|
hr = OnNotifyDelete( lpDataObject );
|
|
break;
|
|
case MMCN_REMOVE_CHILDREN:
|
|
hr = OnNotifyRelease( lpDataObject, arg );
|
|
break;
|
|
|
|
case MMCN_PRELOAD:
|
|
hr = OnNotifyPreload (lpDataObject, (HSCOPEITEM) arg);
|
|
break;
|
|
|
|
case MMCN_PROPERTY_CHANGE:
|
|
// CODEWORK arg is "fScopePane", should this be passed on?
|
|
hr = OnPropertyChange( param );
|
|
break;
|
|
|
|
default:
|
|
TRACE1("INFO: CComponentData::Notify () - Unknown Event %d.\n", event); // add new method for this notification
|
|
break;
|
|
}
|
|
|
|
MFC_CATCH;
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CComponentData::Destroy()
|
|
{
|
|
MFC_TRY;
|
|
SAFE_RELEASE(m_pConsoleNameSpace);
|
|
SAFE_RELEASE(m_pConsole);
|
|
MFC_CATCH;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CComponentData::GetDisplayInfo(SCOPEDATAITEM* pScopeDataItem)
|
|
{
|
|
MFC_TRY;
|
|
// WARNING cookie cast
|
|
CCookie* pcookie = reinterpret_cast<CCookie*>(pScopeDataItem->lParam);
|
|
ASSERT(NULL != pcookie);
|
|
|
|
ASSERT( NULL != pScopeDataItem ); // result items never have NULL cookie
|
|
if (SDI_STR & pScopeDataItem->mask)
|
|
{
|
|
pScopeDataItem->displayname = QueryResultColumnText( *pcookie, 0 );
|
|
if ( NULL == pScopeDataItem->displayname )
|
|
pScopeDataItem->displayname = L""; // just in case
|
|
}
|
|
if ( (SDI_IMAGE|SDI_OPENIMAGE) & pScopeDataItem->mask )
|
|
{
|
|
pScopeDataItem->nImage = QueryImage(
|
|
*pcookie, !!(SDI_OPENIMAGE & pScopeDataItem->mask) );
|
|
}
|
|
MFC_CATCH;
|
|
return S_OK;
|
|
/*
|
|
ASSERT(pScopeDataItem->mask == TVIF_TEXT);
|
|
pScopeDataItem->displayname = QueryResultColumnText(*pcookie,0);
|
|
ASSERT(pScopeDataItem->displayname != NULL);
|
|
|
|
return S_OK;
|
|
*/
|
|
}
|
|
|
|
STDMETHODIMP CComponentData::CompareObjects(
|
|
LPDATAOBJECT lpDataObjectA,
|
|
LPDATAOBJECT lpDataObjectB)
|
|
{
|
|
int nResult = COMPARESIMILARCOOKIE_FULL; // a full cookie comparison is desired.
|
|
MFC_TRY;
|
|
GUID guidA, guidB;
|
|
HRESULT hr = ::ExtractObjectTypeGUID( lpDataObjectA, &guidA );
|
|
if ( FAILED(hr) )
|
|
return hr;
|
|
hr = ::ExtractObjectTypeGUID( lpDataObjectB, &guidB );
|
|
if ( FAILED(hr) )
|
|
return hr;
|
|
if ( 0 != ::memcmp( &guidA, &guidB, sizeof(GUID) ) )
|
|
return S_FALSE; // different nodetypes
|
|
|
|
// If the two nodetypes are the same, both of these objects
|
|
// must belong to this snapin
|
|
|
|
// Extract cookies
|
|
// WARNING cookie cast
|
|
CCookie* pcookieA = NULL;
|
|
hr = ExtractData( lpDataObjectA,
|
|
CDataObject::m_CFRawCookie,
|
|
&pcookieA,
|
|
sizeof(pcookieA) );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT( FALSE );
|
|
return hr;
|
|
}
|
|
pcookieA = ActiveBaseCookie(pcookieA);
|
|
// WARNING cookie cast
|
|
CCookie* pcookieB = NULL;
|
|
hr = ExtractData( lpDataObjectB,
|
|
CDataObject::m_CFRawCookie,
|
|
&pcookieB,
|
|
sizeof(pcookieB) );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT( FALSE );
|
|
return hr;
|
|
}
|
|
pcookieB = ActiveBaseCookie(pcookieB);
|
|
|
|
// Compare cookies
|
|
if (pcookieA == pcookieB)
|
|
return S_OK;
|
|
hr = pcookieA->CompareSimilarCookies( pcookieB, &nResult );
|
|
if( FAILED(hr) )
|
|
return hr;
|
|
|
|
MFC_CATCH;
|
|
return (0 == nResult) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
int
|
|
GetErrorMsg(
|
|
IN DWORD dwError,
|
|
OUT PTSTR* pptzMsg
|
|
)
|
|
{
|
|
ASSERT(dwError != ERROR_SUCCESS);
|
|
|
|
int cch = FormatMessage(
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER
|
|
| FORMAT_MESSAGE_FROM_SYSTEM,
|
|
NULL, dwError,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
(PTSTR)pptzMsg, 0, NULL);
|
|
|
|
if (0 == cch)
|
|
{
|
|
static HMODULE g_hNetMod = 0;
|
|
if (0 == g_hNetMod)
|
|
g_hNetMod = GetModuleHandle (L"netmsg.dll");
|
|
|
|
if (g_hNetMod)
|
|
cch = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
|
|
| FORMAT_MESSAGE_FROM_HMODULE,
|
|
g_hNetMod, dwError,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
(PTSTR)pptzMsg, 0, NULL);
|
|
}
|
|
|
|
return cch;
|
|
}
|
|
|
|
INT CComponentData::DoPopup( INT nResourceID, DWORD dwErrorNumber, LPCTSTR pszInsertionString, UINT fuStyle )
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
CString strTitle;
|
|
VERIFY( strTitle.LoadString(
|
|
(MB_ICONSTOP == (fuStyle & 0x000000F0))
|
|
? IDS_FRAMEWORK_TITLE_ERROR : IDS_FRAMEWORK_TITLE_WARNING ) );
|
|
CString strError;
|
|
if (0 != dwErrorNumber || NULL != pszInsertionString)
|
|
{
|
|
CString strFormat;
|
|
VERIFY( strFormat.LoadString( nResourceID ) );
|
|
|
|
strError.Format( strFormat, dwErrorNumber, pszInsertionString );
|
|
|
|
if (0 != dwErrorNumber)
|
|
{
|
|
PTSTR pszErrorMsg = NULL;
|
|
int cch = GetErrorMsg(dwErrorNumber, &pszErrorMsg);
|
|
if (cch > 0)
|
|
{
|
|
strError += _T("\n\n");
|
|
strError += pszErrorMsg;
|
|
|
|
LocalFree(pszErrorMsg);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
VERIFY( strError.LoadString( nResourceID ) );
|
|
}
|
|
|
|
INT iRetval = 0;
|
|
USES_CONVERSION;
|
|
HRESULT hr = m_pConsole->MessageBox(
|
|
T2OLE(const_cast<LPTSTR>((LPCTSTR)strError)),
|
|
T2OLE(const_cast<LPTSTR>((LPCTSTR)strTitle)),
|
|
fuStyle,
|
|
&iRetval );
|
|
ASSERT( SUCCEEDED(hr) );
|
|
|
|
return iRetval;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMyComputerComponentData::ISnapinHelp members
|
|
|
|
// Help on IComponentData just returns the file and no particular topic
|
|
STDMETHODIMP CComponentData::GetHelpTopic(LPOLESTR* lpCompiledHelpFile)
|
|
{
|
|
MFC_TRY;
|
|
if (lpCompiledHelpFile == NULL)
|
|
return E_INVALIDARG;
|
|
|
|
CString szHelpFilePath;
|
|
HRESULT hr = GetHtmlHelpFilePath( szHelpFilePath );
|
|
if ( FAILED(hr) )
|
|
return hr;
|
|
|
|
*lpCompiledHelpFile = reinterpret_cast <LPOLESTR> (
|
|
CoTaskMemAlloc ((szHelpFilePath.GetLength () + 1) * sizeof (wchar_t)));
|
|
if ( NULL == *lpCompiledHelpFile )
|
|
return E_OUTOFMEMORY;
|
|
USES_CONVERSION;
|
|
wcscpy (*lpCompiledHelpFile, T2OLE ((LPTSTR)(LPCTSTR) szHelpFilePath));
|
|
|
|
MFC_CATCH;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CComponentData::GetLinkedTopics(LPOLESTR* /*lpCompiledHelpFiles*/)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT CComponentData::GetHtmlHelpFilePath( CString& strref ) const
|
|
{
|
|
if ( GetHtmlHelpFileName().IsEmpty () )
|
|
return E_NOTIMPL;
|
|
|
|
UINT nLen = ::GetSystemWindowsDirectory (strref.GetBufferSetLength(2 * MAX_PATH), 2 * MAX_PATH);
|
|
strref.ReleaseBuffer();
|
|
if (0 == nLen)
|
|
{
|
|
ASSERT(FALSE);
|
|
return E_FAIL;
|
|
}
|
|
|
|
strref += L"\\help\\";
|
|
strref += GetHtmlHelpFileName();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/* no taskpads
|
|
STDMETHODIMP CComponentData::ExpandAndGet(
|
|
HSCOPEITEM hsiStartFrom,
|
|
LPDATAOBJECT pDataObject,
|
|
HSCOPEITEM* phScopeItem )
|
|
{
|
|
ASSERT(FALSE);
|
|
return E_NOTIMPL;
|
|
}
|
|
*/
|