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.
 
 
 
 
 
 

418 lines
13 KiB

#ifndef POP3Serversnap_h
#define POP3Serversnap_h
#include "resource.h"
#include <atlsnap.h>
#include <objidl.h>
#include "pop3.h"
#include "RootNode.h"
#include <P3Admin.h>
enum _node_icons {
ROOTNODE_ICON = 0,
SERVERNODE_ICON = 0,
DOMAINNODE_ICON,
USERNODE_ICON,
DOMAINNODE_LOCKED_ICON,
USERNODE_LOCKED_ICON,
MAX_NODE_ICON
};
enum _notify_allviews {
NAV_REFRESH,
NAV_DELETE,
NAV_ADD,
NAV_REFRESHCHILD
};
class CPOP3ServerSnapComponent;
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// CPOP3ServerSnapData
//
/////////////////////////////////////////////////////////////////////////////////////////////////
class CPOP3ServerSnapData :
public CComObjectRootEx<CComSingleThreadModel>,
public CSnapInObjectRoot<1, CPOP3ServerSnapData>,
public IComponentDataImpl<CPOP3ServerSnapData, CPOP3ServerSnapComponent>,
public IExtendContextMenuImpl<CPOP3ServerSnapData>,
public IExtendPropertySheetImpl<CPOP3ServerSnapData>,
public CComCoClass<CPOP3ServerSnapData, &CLSID_POP3ServerSnap>,
public IPersistStream,
public ISnapinHelp2
{
public:
CPOP3ServerSnapData()
{
m_pNode = new CRootNode;
_ASSERTE(m_pNode != NULL);
m_pComponentData = this;
}
virtual ~CPOP3ServerSnapData()
{
if( m_pNode )
{
delete m_pNode;
m_pNode = NULL;
}
}
BEGIN_COM_MAP(CPOP3ServerSnapData)
COM_INTERFACE_ENTRY(IComponentData)
COM_INTERFACE_ENTRY(ISnapinHelp2)
COM_INTERFACE_ENTRY(IExtendContextMenu)
COM_INTERFACE_ENTRY(IExtendPropertySheet)
COM_INTERFACE_ENTRY(IPersistStream)
END_COM_MAP()
DECLARE_NOT_AGGREGATABLE(CPOP3ServerSnapData)
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)
{
// On a property change (Server only) we need to update all views of the Server Node completely.
if( event == MMCN_PROPERTY_CHANGE && !lpDataObject && param )
{
CSnapInItem* pItem = (CSnapInItem*)param;
HRESULT hr = pItem->Notify( MMCN_REFRESH, arg, param, m_pComponentData, NULL, CCT_SCOPE );
if( SUCCEEDED(hr) )
{
// Get our Data Object
CComPtr<IDataObject> spDataObject = NULL;
pItem->GetDataObject(&spDataObject, CCT_SCOPE);
if( !spDataObject ) return E_FAIL;
// Call the Update, but don't update return result
return m_spConsole->UpdateAllViews( spDataObject, 0, (LONG_PTR)NAV_ADD );
}
return hr;
}
if ( lpDataObject != NULL )
{
return IComponentDataImpl<CPOP3ServerSnapData, CPOP3ServerSnapComponent>::Notify(lpDataObject, event, arg, param);
}
return E_NOTIMPL;
}
// ISnapinHelp2
STDMETHOD(GetHelpTopic)(LPOLESTR* ppszHelpFile);
STDMETHOD(GetLinkedTopics)(LPOLESTR* ppszHelpFiles);
// IPersistStream
STDMETHOD(IsDirty)()
{
return S_FALSE;
}
STDMETHOD(Load)(IStream *pStream)
{
if( m_pNode )
{
return static_cast<CRootNode*>(m_pNode)->Load(pStream);
}
return E_FAIL;
}
STDMETHOD(Save)(IStream *pStream, BOOL fClearDirty)
{
if( m_pNode )
{
return static_cast<CRootNode*>(m_pNode)->Save(pStream);
}
return E_FAIL;
}
STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize)
{
return E_NOTIMPL;
}
STDMETHOD(GetClassID)(CLSID *pClassID)
{
if( pClassID )
{
memcpy(pClassID, &CLSID_POP3ServerSnap, sizeof(CLSID));
return S_OK;
}
return E_POINTER;
}
// Class registration method
static HRESULT WINAPI UpdateRegistry(BOOL bRegister);
};
/////////////////////////////////////////////////////////////////////////////////
//
// CPOP3ServerSnapComponent
//
////////////////////////////////////////////////////////////////////////////////
class CPOP3ServerSnapComponent :
public CComObjectRootEx<CComSingleThreadModel>,
public CSnapInObjectRoot<2, CPOP3ServerSnapData>,
public IExtendContextMenuImpl<CPOP3ServerSnapComponent>,
public IExtendPropertySheetImpl<CPOP3ServerSnapComponent>,
public IComponentImpl<CPOP3ServerSnapComponent>
{
public:
BEGIN_COM_MAP(CPOP3ServerSnapComponent)
COM_INTERFACE_ENTRY(IComponent)
COM_INTERFACE_ENTRY(IExtendContextMenu)
COM_INTERFACE_ENTRY(IExtendPropertySheet)
END_COM_MAP()
public:
CPOP3ServerSnapComponent()
{
m_pCurrentItem = NULL;
}
// IComponent
STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param)
{
if( event == MMCN_SHOW )
{
if( arg )
{
// Cache the currently selected node
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
m_pComponentData->GetDataClass(lpDataObject, &pItem, &type);
m_pCurrentItem = pItem;
}
else
{
m_pCurrentItem = NULL;
}
}
if( event == MMCN_VIEW_CHANGE )
{
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
m_pComponentData->GetDataClass(lpDataObject, &pItem, &type);
if( pItem != m_pCurrentItem )
{
// Only Change view of selected item
return S_FALSE;
}
}
if( event == MMCN_PROPERTY_CHANGE )
{
// On a property change (Server only) we need to update all views of the Server Node completely.
CSnapInItem* pItem = (CSnapInItem*)param;
HRESULT hr = pItem->Notify( MMCN_REFRESH, arg, param, m_pComponentData, NULL, CCT_SCOPE );
if( SUCCEEDED(hr) )
{
// Get our Data Object
CComPtr<IDataObject> spDataObject = NULL;
pItem->GetDataObject(&spDataObject, CCT_SCOPE);
if( !spDataObject ) return E_FAIL;
// Call the Update, but don't update return result
return m_spConsole->UpdateAllViews( spDataObject, 0, (LONG_PTR)NAV_ADD );
}
return hr;
}
if ( lpDataObject )
{
return IComponentImpl<CPOP3ServerSnapComponent>::Notify(lpDataObject, event, arg, param);
}
return E_NOTIMPL;
}
protected:
CSnapInItem* m_pCurrentItem;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// CPOP3ServerSnapAbout
//
/////////////////////////////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CPOP3ServerSnapAbout : public ISnapinAbout,
public CComObjectRoot,
public CComCoClass< CPOP3ServerSnapAbout, &CLSID_POP3ServerSnapAbout>
{
public:
DECLARE_REGISTRY(CPOP3ServerSnapAbout, _T("POP3ServerSnapAbout.1"), _T("POP3ServerSnapAbout.1"), IDS_POP3SERVERSNAP_DESC, THREADFLAGS_BOTH);
HICON m_hIcon;
BEGIN_COM_MAP(CPOP3ServerSnapAbout)
COM_INTERFACE_ENTRY(ISnapinAbout)
END_COM_MAP()
CPOP3ServerSnapAbout()
{
m_hIcon = NULL;
}
STDMETHOD(GetSnapinDescription)(LPOLESTR *lpDescription)
{
if( !lpDescription ) return E_INVALIDARG;
USES_CONVERSION;
// Load the string
tstring strDescription = StrLoadString( IDS_POP3SERVERSNAP_DESC );
if( strDescription.empty() ) return E_FAIL;
// Make a copy to return
*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_INVALIDARG;
USES_CONVERSION;
// Load the string
tstring strProvider = StrLoadString( IDS_POP3SERVERSNAP_PROVIDER );
if( strProvider.empty() ) return E_FAIL;
// Make a copy to return
*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;
TCHAR szBuf[MAX_PATH+1] = {0};
DWORD dwLen = GetModuleFileName( _Module.GetModuleInstance(), szBuf, MAX_PATH );
if( dwLen < MAX_PATH )
{
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_INVALIDARG;
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_INVALIDARG;
*phSmallImage = LoadBitmap( _Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_RootSmall) );
*phSmallImageOpen = LoadBitmap( _Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_RootSmall) );
*phLargeImage = LoadBitmap( _Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_RootLarge) );
*pcMask = RGB(255,0,255);
return S_OK;
}
};
// Extra helper functions
HRESULT GetConsole( CSnapInObjectRootBase *pObj, IConsole** pConsole );
#endif