windows-nt/Source/XPSP1/NT/inetsrv/iis/admin/logui/uiextnd.cpp
2020-09-26 16:20:57 +08:00

267 lines
7 KiB
C++

#include "stdafx.h"
#include <iadmw.h>
#include <inetcom.h>
#include <logtype.h>
#include <ilogobj.hxx>
#include "wrapmb.h"
#include "logui.h"
#include "uiextnd.h"
#include "LogGenPg.h"
#include "LogExtPg.h"
#include "LogAdvPg.h"
#include "logtools.h"
//#include <inetprop.h>
#define OLE_NAME _T("Extended_Logging_UI")
static const DWORD BASED_CODE _dwOleMisc =
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE;
extern HINSTANCE g_hInstance;
//====================== the required methods
//---------------------------------------------------------------
CFacExtndLogUI::CFacExtndLogUI() :
COleObjectFactory( CLSID_EXTLOGUI, RUNTIME_CLASS(CExtndCreator), TRUE, OLE_NAME )
{
}
//---------------------------------------------------------------
static const LPCTSTR rglpszServerRegister[] =
{
_T("%2\\CLSID\0") _T("%1"),
_T("%2\\NotInsertable\0") _T(""),
_T("%2\\protocol\\StdFileEditing\\verb\\0\0") _T("&Edit"),
_T("CLSID\\%1\0") _T("%5"),
_T("CLSID\\%1\\Verb\\0\0") _T("&Edit,0,2"),
_T("CLSID\\%1\\NotInsertable\0") _T(""),
_T("CLSID\\%1\\AuxUserType\\2\0") _T("%4"),
_T("CLSID\\%1\\AuxUserType\\3\0") _T("%6"),
_T("CLSID\\%1\\MiscStatus\0") _T("32"),
NULL
};
static const LPCTSTR rglpszServerOverwriteDLL[] =
{
_T("%2\\CLSID\0") _T("%1"),
_T("%2\\protocol\\StdFileEditing\\server\0") _T("%3"),
_T("CLSID\\%1\\ProgID\0") _T("%2"),
_T("CLSID\\%1\\InProcServer32\0") _T("%3"),
_T("CLSID\\%1\\DefaultIcon\0") _T("%3,%7"),
NULL
};
BOOL CFacExtndLogUI::UpdateRegistry( BOOL bRegister )
{
if (bRegister)
/*
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
CLSID_EXTLOGUI,
OLE_NAME,
0,
0,
afxRegApartmentThreading,
_dwOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
*/
if (AfxOleRegisterServerClass(
CLSID_EXTLOGUI,
OLE_NAME,
_T("LogUI extnd"),
_T("LogUI extnd"),
OAT_SERVER,
(LPCTSTR *)rglpszServerRegister,
(LPCTSTR *)rglpszServerOverwriteDLL
)
)
{
return FSetObjectApartmentModel( CLSID_EXTLOGUI );
}
else
return AfxOleUnregisterClass(m_clsid, OLE_NAME);
return FALSE;
}
//---------------------------------------------------------------
IMPLEMENT_DYNCREATE(CExtndCreator, CCmdTarget)
LPUNKNOWN CExtndCreator::GetInterfaceHook(const void* piid)
{
return new CImpExtndLogUI;
}
//====================== the action
//---------------------------------------------------------------
CImpExtndLogUI::CImpExtndLogUI():
m_dwRefCount(0)
{
// guid = IID_LOGGINGUI;
AfxOleLockApp();
}
//---------------------------------------------------------------
CImpExtndLogUI::~CImpExtndLogUI()
{
AfxOleUnlockApp();
}
//---------------------------------------------------------------
HRESULT CImpExtndLogUI::OnProperties( IN OLECHAR* pocMachineName, IN OLECHAR* pocMetabasePath )
{
// AFX_MANAGE_STATE(_afxModuleAddrThis);
AFX_MANAGE_STATE(::AfxGetStaticModuleState());
// prepare the metabase wrapper
IMSAdminBase * pMB;
if ( !FInitMetabaseWrapperEx( pocMachineName, &pMB ) )
return 0xFFFFFFFF;
// specify the resources to use
HINSTANCE hOldRes = AfxGetResourceHandle();
AfxSetResourceHandle( g_hInstance );
// prepare the help
((CLoguiApp*)AfxGetApp())->PrepHelp( pocMetabasePath );
// Things could (potentially maybe) throw here, so better protect it.
try
{
// declare the property sheet
CPropertySheet propsheet( IDS_SHEET_EXTND_TITLE );
// declare the property pages
CLogGeneral pageLogGeneral;
CLogAdvanced pageLogAdvanced;
CLogExtended pageLogExtended;
// prepare the common pages
pageLogGeneral.m_pMB = pMB;
pageLogGeneral.m_szMeta = pocMetabasePath;
pageLogGeneral.m_szServer = pocMachineName;
pageLogGeneral.szPrefix.LoadString( IDS_LOG_EXTND_PREFIX );
pageLogGeneral.szSizePrefix.LoadString( IDS_LOG_SIZE_EXTND_PREFIX );
// make the use local time checkbox visible
pageLogGeneral.m_fShowLocalTimeCheckBox = TRUE;
// set the local flag
pageLogGeneral.m_fLocalMachine = FIsLocalMachine( pocMachineName );
// add the pages to the sheet and run
propsheet.AddPage( &pageLogGeneral );
// turn on help
propsheet.m_psh.dwFlags |= PSH_HASHELP;
pageLogGeneral.m_psp.dwFlags |= PSP_HASHELP;
//
// Extract the service name from the metabase path
//
// For /LM/W3SVC/1 scenario
CString m_szServiceName(pocMetabasePath+3);
m_szServiceName = m_szServiceName.Left( m_szServiceName.ReverseFind('/'));
// For /LM/W3SVC scenario
if (m_szServiceName.IsEmpty())
{
m_szServiceName = pocMetabasePath+3;
}
DWORD version;
BOOL res;
{
CComAuthInfo auth(pocMachineName);
CMetabasePath path(TRUE, m_szServiceName, SZ_MBN_INFO);
CMetaKey mk(&auth, path);
mk.QueryValue(MD_SERVER_VERSION_MAJOR, version);
res = mk.Succeeded();
}
if (res && (version > 4))
{
pageLogAdvanced.m_pMB = pMB;
pageLogAdvanced.m_szMeta = pocMetabasePath;
pageLogAdvanced.m_szServer = pocMachineName;
pageLogAdvanced.m_szServiceName = m_szServiceName;
// add the pages to the sheet and run
propsheet.AddPage( &pageLogAdvanced );
// turn on help
pageLogAdvanced.m_psp.dwFlags |= PSP_HASHELP;
}
else
{
pageLogExtended.m_pMB = pMB;
pageLogExtended.m_szMeta = pocMetabasePath;
pageLogExtended.m_szServer = pocMachineName;
// add the pages to the sheet and run
propsheet.AddPage( &pageLogExtended );
// turn on help
pageLogExtended.m_psp.dwFlags |= PSP_HASHELP;
}
propsheet.DoModal();
}
catch ( CException e )
{
}
// close the metabase wrappings
FCloseMetabaseWrapperEx(&pMB);
// restore the resources
AfxSetResourceHandle( hOldRes );
return NO_ERROR;
}
//====================== the required methods
//---------------------------------------------------------------
HRESULT CImpExtndLogUI::QueryInterface(REFIID riid, void **ppObject)
{
if (riid==IID_IUnknown || riid==IID_LOGGINGUI || riid==CLSID_EXTLOGUI)
{
*ppObject = (ILogUIPlugin*) this;
}
else
{
return E_NOINTERFACE;
}
AddRef();
return NO_ERROR;
}
//---------------------------------------------------------------
ULONG CImpExtndLogUI::AddRef()
{
DWORD dwRefCount;
dwRefCount = InterlockedIncrement((long *)&m_dwRefCount);
return dwRefCount;
}
//---------------------------------------------------------------
ULONG CImpExtndLogUI::Release()
{
DWORD dwRefCount;
dwRefCount = InterlockedDecrement((long *)&m_dwRefCount);
if (dwRefCount == 0) {
delete this;
}
return dwRefCount;
}