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.
373 lines
11 KiB
373 lines
11 KiB
#include "stdafx.h"
|
|
#include "BackupSnap.h"
|
|
#include "Backup.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CBackupSnapNode
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
static const GUID CBackupSnapGUID_NODETYPE =
|
|
{ 0x3fa55cce, 0x7d0a, 0x4b5c, { 0x90, 0xe9, 0x6e, 0x8c, 0xcb, 0x77, 0x5b, 0x23 } };
|
|
|
|
const GUID* CBackupSnapNode::m_NODETYPE = &CBackupSnapGUID_NODETYPE;
|
|
const OLECHAR* CBackupSnapNode::m_SZNODETYPE = OLESTR("3FA55CCE-7D0A-4b5c-90E9-6E8CCB775B23");
|
|
const OLECHAR* CBackupSnapNode::m_SZDISPLAY_NAME = OLESTR("");
|
|
const CLSID* CBackupSnapNode::m_SNAPIN_CLASSID = &CLSID_BackupSnap;
|
|
|
|
CBackupSnapNode::CBackupSnapNode()
|
|
{
|
|
// Initialize Scope Data Information
|
|
memset(&m_scopeDataItem, 0, sizeof(m_scopeDataItem));
|
|
m_scopeDataItem.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE | SDI_PARAM;
|
|
m_scopeDataItem.displayname = L"";
|
|
m_scopeDataItem.nImage = 0;
|
|
m_scopeDataItem.nOpenImage = 0;
|
|
m_scopeDataItem.lParam = (LPARAM) this;
|
|
|
|
// Initialize Result Data Information
|
|
memset(&m_resultDataItem, 0, sizeof(m_resultDataItem));
|
|
m_resultDataItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
|
|
m_resultDataItem.str = L"";
|
|
m_resultDataItem.nImage = 0;
|
|
m_resultDataItem.lParam = (LPARAM) this;
|
|
|
|
// Load the Snap-In Display Name
|
|
tstring strTemp = StrLoadString( IDS_SnapinName );
|
|
m_bstrDisplayName = strTemp.c_str();
|
|
|
|
if( m_bstrDisplayName.m_str )
|
|
{
|
|
m_SZDISPLAY_NAME = m_bstrDisplayName.m_str;
|
|
}
|
|
}
|
|
|
|
|
|
HRESULT CBackupSnapNode::GetScopePaneInfo(SCOPEDATAITEM *pScopeDataItem)
|
|
{
|
|
if( !pScopeDataItem ) return E_POINTER;
|
|
|
|
if( pScopeDataItem->mask & SDI_STR )
|
|
pScopeDataItem->displayname = m_bstrDisplayName;
|
|
if( pScopeDataItem->mask & SDI_IMAGE )
|
|
pScopeDataItem->nImage = m_scopeDataItem.nImage;
|
|
if( pScopeDataItem->mask & SDI_OPENIMAGE )
|
|
pScopeDataItem->nOpenImage = m_scopeDataItem.nOpenImage;
|
|
if( pScopeDataItem->mask & SDI_PARAM )
|
|
pScopeDataItem->lParam = m_scopeDataItem.lParam;
|
|
if( pScopeDataItem->mask & SDI_STATE )
|
|
pScopeDataItem->nState = m_scopeDataItem.nState;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBackupSnapNode::GetResultPaneInfo(RESULTDATAITEM *pResultDataItem)
|
|
{
|
|
if( !pResultDataItem ) return E_POINTER;
|
|
|
|
if( pResultDataItem->bScopeItem )
|
|
{
|
|
if( pResultDataItem->mask & RDI_STR )
|
|
{
|
|
pResultDataItem->str = L"";
|
|
}
|
|
if( pResultDataItem->mask & RDI_IMAGE )
|
|
{
|
|
pResultDataItem->nImage = m_scopeDataItem.nImage;
|
|
}
|
|
if( pResultDataItem->mask & RDI_PARAM )
|
|
{
|
|
pResultDataItem->lParam = m_scopeDataItem.lParam;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
if( pResultDataItem->mask & RDI_STR )
|
|
{
|
|
pResultDataItem->str = L"";
|
|
}
|
|
if( pResultDataItem->mask & RDI_IMAGE )
|
|
{
|
|
pResultDataItem->nImage = m_resultDataItem.nImage;
|
|
}
|
|
if( pResultDataItem->mask & RDI_PARAM )
|
|
{
|
|
pResultDataItem->lParam = m_resultDataItem.lParam;
|
|
}
|
|
if( pResultDataItem->mask & RDI_INDEX )
|
|
{
|
|
pResultDataItem->nIndex = m_resultDataItem.nIndex;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CBackupSnapNode::GetClassID(CLSID* pID)
|
|
{
|
|
if( !pID ) return E_POINTER;
|
|
|
|
pID = (CLSID*)m_SNAPIN_CLASSID;
|
|
|
|
return S_OK;
|
|
}
|
|
HRESULT CBackupSnapNode::Notify( MMC_NOTIFY_TYPE event,
|
|
LPARAM arg,
|
|
LPARAM param,
|
|
IComponentData* pComponentData,
|
|
IComponent* pComponent,
|
|
DATA_OBJECT_TYPES type)
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
_ASSERT( pComponentData || pComponent );
|
|
|
|
CComPtr<IConsole> spConsole = NULL;
|
|
if( pComponentData )
|
|
{
|
|
spConsole = ((CBackupSnapData*)pComponentData)->m_spConsole;
|
|
}
|
|
else if ( pComponent )
|
|
{
|
|
spConsole = ((CBackupSnapComponent*)pComponent)->m_spConsole;
|
|
}
|
|
|
|
if( !spConsole ) return E_INVALIDARG;
|
|
|
|
switch( event )
|
|
{
|
|
case MMCN_SHOW:
|
|
{
|
|
hr = S_OK;
|
|
// configure the ocx message in the result pane
|
|
IMessageView* pIMessageView = NULL;
|
|
LPUNKNOWN pIUnk = NULL;
|
|
hr = spConsole->QueryResultView(&pIUnk);
|
|
|
|
if( SUCCEEDED(hr) )
|
|
{
|
|
hr = pIUnk->QueryInterface(_uuidof(IMessageView), reinterpret_cast<void**>(&pIMessageView));
|
|
}
|
|
|
|
if( SUCCEEDED(hr) )
|
|
{
|
|
hr = pIMessageView->SetIcon(Icon_Information);
|
|
}
|
|
|
|
if( SUCCEEDED(hr) )
|
|
{
|
|
tstring strTitle = StrLoadString( IDS_SnapinName );
|
|
hr = pIMessageView->SetTitleText( strTitle.c_str() );
|
|
}
|
|
|
|
if( SUCCEEDED(hr) )
|
|
{
|
|
tstring strMessage = StrLoadString( IDS_WARNING );
|
|
hr = pIMessageView->SetBodyText( strMessage.c_str() );
|
|
}
|
|
|
|
if( pIMessageView )
|
|
{
|
|
pIMessageView->Release();
|
|
pIMessageView = NULL;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case MMCN_EXPAND:
|
|
{
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
case MMCN_ADD_IMAGES:
|
|
{
|
|
IImageList* pImageList = (IImageList*)arg;
|
|
if( !pImageList ) return E_INVALIDARG;
|
|
|
|
hr = LoadImages(pImageList);
|
|
break;
|
|
}
|
|
case MMCN_SELECT:
|
|
{
|
|
// if selecting node
|
|
if( HIWORD(arg) )
|
|
{
|
|
hr = S_OK;
|
|
|
|
// get the verb interface and enable rename
|
|
CComPtr<IConsoleVerb> spConsVerb;
|
|
if( spConsole->QueryConsoleVerb(&spConsVerb) == S_OK )
|
|
{
|
|
hr = spConsVerb->SetVerbState(MMC_VERB_RENAME, ENABLED, FALSE);
|
|
if( FAILED(hr) ) return hr;
|
|
|
|
spConsVerb->SetVerbState(MMC_VERB_RENAME, HIDDEN, TRUE);
|
|
if( FAILED(hr) ) return hr;
|
|
}
|
|
}
|
|
|
|
|
|
break;
|
|
}
|
|
|
|
case MMCN_CONTEXTHELP:
|
|
{
|
|
hr = S_OK;
|
|
TCHAR szWindowsDir[MAX_PATH+1] = {0};
|
|
tstring strHelpFile = _T("");
|
|
tstring strHelpFileName = StrLoadString(IDS_HELPFILE);
|
|
tstring strHelpTopicName = StrLoadString(IDS_HELPTOPIC);
|
|
|
|
if( strHelpFileName.empty() || strHelpTopicName.empty() )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
// Build path to %systemroot%\help
|
|
UINT nSize = GetSystemWindowsDirectory( szWindowsDir, MAX_PATH );
|
|
if( nSize == 0 || nSize > MAX_PATH )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
strHelpFile = szWindowsDir; // D:\windows
|
|
strHelpFile += _T("\\Help\\"); // \help
|
|
strHelpFile += strHelpFileName; // \filename.chm
|
|
strHelpFile += _T("::/"); // ::/
|
|
strHelpFile += strHelpTopicName; // index.htm
|
|
|
|
// Show the Help topic
|
|
CComQIPtr<IDisplayHelp> spHelp = spConsole;
|
|
if( !spHelp ) return E_NOINTERFACE;
|
|
|
|
hr = spHelp->ShowTopic( (LPTSTR)strHelpFile.c_str() );
|
|
|
|
break;
|
|
}
|
|
|
|
}// switch
|
|
|
|
return hr;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CBackupSnapData
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
HRESULT CBackupSnapData::Initialize(LPUNKNOWN pUnknown)
|
|
{
|
|
if( !pUnknown ) return E_POINTER;
|
|
|
|
HRESULT hr = IComponentDataImpl<CBackupSnapData, CBackupSnapComponent >::Initialize(pUnknown);
|
|
if( FAILED(hr) ) return hr;
|
|
|
|
CComPtr<IImageList> spImageList;
|
|
|
|
|
|
if( m_spConsole->QueryScopeImageList(&spImageList) != S_OK )
|
|
{
|
|
ATLTRACE(_T("IConsole::QueryScopeImageList failed\n"));
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
hr = LoadImages(spImageList);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WINAPI CBackupSnapData::UpdateRegistry(BOOL bRegister)
|
|
{
|
|
// Load snap-in name
|
|
tstring strSnapinName = StrLoadString(IDS_SnapinName);
|
|
|
|
// Specify the substitution parameters for IRegistrar.
|
|
_ATL_REGMAP_ENTRY rgEntries[] =
|
|
{
|
|
{TEXT("SNAPIN_NAME"), strSnapinName.c_str()},
|
|
{NULL, NULL},
|
|
};
|
|
|
|
// Register the component data object
|
|
return _Module.UpdateRegistryFromResource(IDR_BackupSNAP, bRegister, rgEntries);
|
|
}
|
|
|
|
HRESULT CBackupSnapData::GetHelpTopic(LPOLESTR* ppszHelpFile)
|
|
{
|
|
if( !ppszHelpFile ) return E_POINTER;
|
|
|
|
USES_CONVERSION;
|
|
*ppszHelpFile = NULL;
|
|
|
|
tstring strHelpFileName = StrLoadString(IDS_HELPFILE);
|
|
if( strHelpFileName.empty() ) return E_FAIL;
|
|
|
|
// Build path to %systemroot%\help
|
|
TCHAR szWindowsDir[MAX_PATH+1] = {0};
|
|
UINT nSize = GetSystemWindowsDirectory( szWindowsDir, MAX_PATH );
|
|
if( (nSize == 0) || (nSize > MAX_PATH) ) return E_FAIL;
|
|
|
|
tstring strHelpFile = szWindowsDir; // D:\windows
|
|
strHelpFile += _T("\\Help\\"); // \help
|
|
strHelpFile += strHelpFileName; // \filename.chm
|
|
|
|
// Show the Help topic
|
|
// Form file path in allocated buffer
|
|
int nLen = strHelpFile.length() + 1;
|
|
|
|
*ppszHelpFile = (LPOLESTR)CoTaskMemAlloc(nLen * sizeof(OLECHAR));
|
|
if( !*ppszHelpFile ) return E_OUTOFMEMORY;
|
|
|
|
// Copy into allocated buffer
|
|
ocscpy( *ppszHelpFile, T2OLE((LPTSTR)strHelpFile.c_str()) );
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT CBackupSnapData::GetLinkedTopics(LPOLESTR* ppszLinkedFiles)
|
|
{
|
|
if( !ppszLinkedFiles ) return E_POINTER;
|
|
|
|
// no linked files
|
|
*ppszLinkedFiles = NULL;
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CBackupSnapComponent
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CBackupSnapComponent::CBackupSnapComponent()
|
|
{
|
|
}
|
|
|
|
|
|
HRESULT CBackupSnapComponent::GetClassID(CLSID* pID)
|
|
{
|
|
return m_pComponentData->GetClassID(pID);
|
|
}
|
|
|
|
HRESULT CBackupSnapComponent::GetResultViewType( MMC_COOKIE cookie, LPOLESTR* ppViewType, long* pViewOptions )
|
|
{
|
|
if( !ppViewType ) return E_POINTER;
|
|
|
|
// show standard MMC OCX with message in the result pane
|
|
HRESULT hr = StringFromCLSID(CLSID_MessageView, ppViewType);
|
|
|
|
return hr;
|
|
}
|
|
|