#ifndef BackupSnap_h #define BackupSnap_h #include "Backup.h" #include #include #include ////////////////////////////////////////////////////////////////////////////////// // // CBackupSnapNode // ////////////////////////////////////////////////////////////////////////////////// class CBackupSnapNode : public CSnapInItemImpl { public: static const GUID* m_NODETYPE; static const OLECHAR* m_SZNODETYPE; static const OLECHAR* m_SZDISPLAY_NAME; static const CLSID* m_SNAPIN_CLASSID; CComPtr m_spControlBar; BEGIN_SNAPINCOMMAND_MAP(CBackupSnapNode, FALSE) END_SNAPINCOMMAND_MAP() CBackupSnapNode(); virtual ~CBackupSnapNode() { } STDMETHOD(QueryPagesFor)(DATA_OBJECT_TYPES type) { if ( type == CCT_SCOPE || type == CCT_RESULT ) return S_OK; return S_FALSE; } STDMETHOD(GetScopePaneInfo)(SCOPEDATAITEM *pScopeDataItem); STDMETHOD(GetResultPaneInfo)(RESULTDATAITEM *pResultDataItem); STDMETHOD(Notify)( MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param, IComponentData* pComponentData, IComponent* pComponent, DATA_OBJECT_TYPES type ); LPOLESTR GetResultPaneColInfo(int nCol); STDMETHOD(GetClassID)(CLSID* pID); }; class CBackupSnapData; ///////////////////////////////////////////////////////////////////////////////// // // CBackupSnapComponent // //////////////////////////////////////////////////////////////////////////////// class CBackupSnapComponent : public CComObjectRootEx, public CSnapInObjectRoot<2, CBackupSnapData>, public IComponentImpl { public: BEGIN_COM_MAP(CBackupSnapComponent) COM_INTERFACE_ENTRY(IComponent) END_COM_MAP() public: CBackupSnapComponent(); STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param) { if ( lpDataObject != NULL ) { return IComponentImpl::Notify(lpDataObject, event, arg, param); } else if ( event == MMCN_PROPERTY_CHANGE ) { return S_OK; } return E_NOTIMPL; } HRESULT GetClassID(CLSID* pID); STDMETHOD(GetResultViewType)(MMC_COOKIE cookie, LPOLESTR* ppViewType, long* pViewOptions); }; ////////////////////////////////////////////////////////////////////////////////////////////////// // // CBackupSnapData // ///////////////////////////////////////////////////////////////////////////////////////////////// class CBackupSnapData : public CComObjectRootEx, public CSnapInObjectRoot<1, CBackupSnapData>, public IComponentDataImpl, public CComCoClass, public ISnapinHelp2 { public: CBackupSnapData() { // Has to be done in the constructor (Templated Class requires it) m_pNode = new CBackupSnapNode; _ASSERT(m_pNode != NULL); m_pComponentData = this; } virtual ~CBackupSnapData() { if( m_pNode ) { delete m_pNode; m_pNode = NULL; } } BEGIN_COM_MAP(CBackupSnapData) COM_INTERFACE_ENTRY(IComponentData) COM_INTERFACE_ENTRY(ISnapinHelp2) END_COM_MAP() DECLARE_NOT_AGGREGATABLE(CBackupSnapData) STDMETHOD(Initialize)(LPUNKNOWN pUnknown); static void WINAPI ObjectMain(bool bStarting) { if ( bStarting ) CSnapInItem::Init(); } STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param) { if ( lpDataObject != NULL ) return IComponentDataImpl::Notify(lpDataObject, event, arg, param); return E_NOTIMPL; } STDMETHOD(GetClassID)(CLSID* pID) { if( m_pNode ) { return static_cast(m_pNode)->GetClassID(pID); } return E_FAIL; } // ISnapinHelp2 STDMETHOD(GetHelpTopic)(LPOLESTR* ppszHelpFile); STDMETHOD(GetLinkedTopics)(LPOLESTR* ppszHelpFiles); // Class registration method static HRESULT WINAPI UpdateRegistry(BOOL bRegister); }; ////////////////////////////////////////////////////////////////////////////////////////////////////// // // CBackupSnapAbout // ///////////////////////////////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CBackupSnapAbout : public ISnapinAbout, public CComObjectRoot, public CComCoClass< CBackupSnapAbout, &CLSID_BackupSnapAbout> { public: DECLARE_REGISTRY(CBackupSnapAbout, _T("BackupSnapAbout.1"), _T("BackupSnapAbout.1"), IDS_BackupSNAP_DESC, THREADFLAGS_BOTH); HICON m_hIcon; BEGIN_COM_MAP(CBackupSnapAbout) COM_INTERFACE_ENTRY(ISnapinAbout) END_COM_MAP() CBackupSnapAbout() { m_hIcon = NULL; } STDMETHOD(GetSnapinDescription)(LPOLESTR *lpDescription) { if( !lpDescription ) return E_POINTER; USES_CONVERSION; tstring strDescription = StrLoadString(IDS_BackupSNAP_DESC); if( strDescription.empty() ) return E_FAIL; *lpDescription = (LPOLESTR)CoTaskMemAlloc((strDescription.length() + 1) * sizeof(OLECHAR)); if ( *lpDescription == NULL ) return E_OUTOFMEMORY; ocscpy(*lpDescription, T2OLE((LPTSTR)strDescription.c_str())); return S_OK; } STDMETHOD(GetProvider)(LPOLESTR *lpName) { if( !lpName ) return E_POINTER; USES_CONVERSION; tstring strProvider = StrLoadString(IDS_BackupSNAP_PROVIDER); if( strProvider.empty() ) return E_FAIL; *lpName = (LPOLESTR)CoTaskMemAlloc((strProvider.length() + 1) * sizeof(OLECHAR)); if ( *lpName == NULL ) return E_OUTOFMEMORY; ocscpy( *lpName, T2OLE((LPTSTR)strProvider.c_str()) ); return S_OK; } STDMETHOD(GetSnapinVersion)(LPOLESTR *lpVersion) { if( !lpVersion ) return E_INVALIDARG; USES_CONVERSION; // Get the Module Filename TCHAR szBuf[MAX_PATH+1] = {0}; DWORD dwLen = GetModuleFileName( _Module.GetModuleInstance(), szBuf, MAX_PATH ); if( (dwLen <= 0) || (dwLen > MAX_PATH) ) return E_FAIL; // Get the Size and Translation of the file LPDWORD pTranslation = NULL; UINT uNumTranslation = 0; DWORD dwHandle = NULL; DWORD dwSize = GetFileVersionInfoSize(szBuf, &dwHandle); if( !dwSize ) return E_FAIL; BYTE* pVersionInfo = new BYTE[dwSize]; if( !pVersionInfo ) return E_OUTOFMEMORY; if (!GetFileVersionInfo( szBuf, dwHandle, dwSize, pVersionInfo ) || !VerQueryValue( (const LPVOID)pVersionInfo, _T("\\VarFileInfo\\Translation"), (LPVOID*)&pTranslation, &uNumTranslation ) || !pTranslation ) { delete [] pVersionInfo; pVersionInfo = NULL; pTranslation = NULL; uNumTranslation = 0; return E_FAIL; } uNumTranslation /= sizeof(DWORD); tstring strQuery = _T("\\StringFileInfo\\"); // 8 characters for the language/char-set, // 1 for the slash, // 1 for terminating NULL TCHAR szTranslation[128] = {0}; _sntprintf( szTranslation, 127, _T("%04x%04x\\"), LOWORD(*pTranslation), HIWORD(*pTranslation)); strQuery += szTranslation; strQuery += _T("FileVersion"); LPBYTE lpVerValue = NULL; UINT uSize = 0; if (!VerQueryValue(pVersionInfo, (LPTSTR)strQuery.c_str(), (LPVOID *)&lpVerValue, &uSize)) { delete [] pVersionInfo; return E_FAIL; } // check the version _tcsncpy( szBuf, (LPTSTR)lpVerValue, MAX_PATH-1 ); delete [] pVersionInfo; *lpVersion = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR)); if( *lpVersion == NULL ) return E_OUTOFMEMORY; ocscpy( *lpVersion, T2OLE(szBuf) ); return S_OK; } STDMETHOD(GetSnapinImage)(HICON* phAppIcon) { if( !phAppIcon ) return E_POINTER; if( !m_hIcon ) { m_hIcon = LoadIcon(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDI_Icon)); } *phAppIcon = m_hIcon; return S_OK; } STDMETHOD(GetStaticFolderImage)(HBITMAP* phSmallImage, HBITMAP* phSmallImageOpen, HBITMAP* phLargeImage, COLORREF* pcMask) { if( !phSmallImage || !phSmallImageOpen || !phLargeImage || !pcMask ) return E_POINTER; *phSmallImage = LoadBitmap(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_Small)); *phSmallImageOpen = LoadBitmap(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_Small)); *phLargeImage = LoadBitmap(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_Large)); *pcMask = RGB(255,0,255); return S_OK; } }; #endif