Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

420 lines
12 KiB

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997-1998
//
// File: cimbmgr.hxx
//
// Contents: Content index Meta Base Manager
//
// Classes: CMetaDataMgr, CMetaDataHandle, CMetaDataComSink,
// CMetaDataCallBack, CMetaDataVPathChangeCallBack
//
// History: 07-Feb-1997 dlee Created
//
//----------------------------------------------------------------------------
#pragma once
#include <iadmw.h>
#include <iiscnfg.h>
enum CiVRootTypeEnum
{
W3VRoot = 0,
NNTPVRoot = 1,
IMAPVRoot = 2
};
// Timeout for opening metabase handles (in milliseconds)
const DWORD cmsCIMetabaseTimeout = 60000;
//+---------------------------------------------------------------------------
//
// Function: GetVRootServiceType
//
// Purpose: Returns a string representation of a vroot type
//
// History: 20-Jun-1997 dlee Created
//
//----------------------------------------------------------------------------
inline WCHAR const * GetVRootService( CiVRootTypeEnum eType )
{
if ( W3VRoot == eType )
return L"w3svc";
if ( NNTPVRoot == eType )
return L"nntpsvc";
Win4Assert( IMAPVRoot == eType );
return L"imapsvc";
} //GetVRootService
//+---------------------------------------------------------------------------
//
// Class: CMetaDataCallBack
//
// Purpose: Pure virtual for vpath enumeration
//
// History: 07-Feb-1997 dlee Created
//
//----------------------------------------------------------------------------
class CMetaDataCallBack
{
public:
virtual SCODE CallBack( WCHAR const * pwcVPath,
WCHAR const * pwcPRoot,
BOOL fIsIndexed,
DWORD dwAccess,
WCHAR const * pwcUser,
WCHAR const * pwcPassword,
BOOL fIsAVRoot ) = 0;
virtual ~CMetaDataCallBack() {}
};
//+---------------------------------------------------------------------------
//
// Class: CMetaDataVirtualServerCallBack
//
// Purpose: Pure virtual for vroot enumeration
//
// History: 07-Feb-1997 dlee Created
//
//----------------------------------------------------------------------------
class CMetaDataVirtualServerCallBack
{
public:
virtual SCODE CallBack( DWORD iInstance,
WCHAR const * pwcInstance ) = 0;
virtual ~CMetaDataVirtualServerCallBack() {}
};
//+---------------------------------------------------------------------------
//
// Class: CMetaDataVRootChangeCallBack
//
// Purpose: Pure virtual for vpath change notification
//
// History: 07-Feb-1997 dlee Created
//
//----------------------------------------------------------------------------
class CMetaDataVPathChangeCallBack
{
public:
virtual SCODE CallBack( BOOL fCancel ) = 0;
virtual ~CMetaDataVPathChangeCallBack() {}
};
//+---------------------------------------------------------------------------
//
// Class: CMetaDataComSink
//
// Purpose: Connection point callback helper class for vpath change
// notificaton.
//
// History: 07-Feb-1997 dlee Created
//
//----------------------------------------------------------------------------
class CMetaDataComSink : public IMSAdminBaseSink
{
public:
CMetaDataComSink() : _lRefCount( 1 ), _pCallBack( 0 )
{
_awcInstance[0] = 0;
}
~CMetaDataComSink()
{
ciDebugOut(( DEB_ITRACE, "~sink %#x %d\n", this, _lRefCount ));
}
void SetCallBack( CMetaDataVPathChangeCallBack *p )
{
_pCallBack = p;
}
CMetaDataVPathChangeCallBack * GetCallBack()
{
return _pCallBack;
}
void SetInstance( WCHAR const * pwcInstance )
{
wcscpy( _awcInstance, pwcInstance );
}
SCODE STDMETHODCALLTYPE QueryInterface( REFIID riid, void **ppObject )
{
if ( IID_IUnknown == riid || IID_IMSAdminBaseSink == riid )
*ppObject = (IMSAdminBaseSink *) this;
else
return E_NOINTERFACE;
AddRef();
return S_OK;
}
ULONG STDMETHODCALLTYPE AddRef()
{
return InterlockedIncrement( &_lRefCount );
}
ULONG STDMETHODCALLTYPE Release()
{
Win4Assert( _lRefCount >= 1 );
ULONG cRefs = InterlockedDecrement( &_lRefCount );
if ( 0 == cRefs )
delete this;
return cRefs;
}
SCODE STDMETHODCALLTYPE SinkNotify(
DWORD cChanges,
MD_CHANGE_OBJECT pcoChangeList[] );
SCODE STDMETHODCALLTYPE ShutdownNotify();
private:
long _lRefCount;
CMetaDataVPathChangeCallBack * _pCallBack;
WCHAR _awcInstance[ METADATA_MAX_NAME_LEN ];
};
//+---------------------------------------------------------------------------
//
// Class: CMetaDataHandle
//
// Purpose: Smart meta data handle class
//
// History: 07-Feb-1997 dlee Created
//
//----------------------------------------------------------------------------
class CMetaDataHandle
{
public:
CMetaDataHandle( XInterface<IMSAdminBase> & xAdminBase,
WCHAR const * pwcPath,
BOOL fWrite = FALSE )
: _xAdminBase( xAdminBase ),
_h( 0 )
{
SCODE sc = _xAdminBase->OpenKey( METADATA_MASTER_ROOT_HANDLE,
(LPWSTR) pwcPath,
( fWrite ? METADATA_PERMISSION_WRITE :
0 ) |
METADATA_PERMISSION_READ,
cmsCIMetabaseTimeout,
&_h );
if ( FAILED( sc ) )
{
ciDebugOut(( DEB_WARN, "couldn't open metaobject '%ws', 0x%x\n",
pwcPath, sc ));
THROW( CException( sc ) );
}
}
CMetaDataHandle( XInterface<IMSAdminBase> & xAdminBase,
METADATA_HANDLE h )
: _xAdminBase( xAdminBase ),
_h( h )
{
}
~CMetaDataHandle()
{
if ( 0 != _h )
_xAdminBase->CloseKey( _h );
}
METADATA_HANDLE Get() { return _h; }
private:
METADATA_HANDLE _h;
XInterface<IMSAdminBase> & _xAdminBase;
};
//+---------------------------------------------------------------------------
//
// Class: CVRootStack
//
// Purpose: Stack of vroots, proots, and access masks
//
// History: 07-Feb-1997 dlee Created
//
//----------------------------------------------------------------------------
class CVRootStack
{
public:
CVRootStack() {}
void Push( WCHAR const * pwcVRoot, WCHAR const * pwcPRoot, DWORD access )
{
_Access[ _Access.Count() ] = access;
unsigned cwcV = 1 + wcslen( pwcVRoot );
XArray<WCHAR> xVRoot( cwcV );
RtlCopyMemory( xVRoot.GetPointer(), pwcVRoot, xVRoot.SizeOf() );
_VRoots.Push( xVRoot.GetPointer() );
xVRoot.Acquire();
unsigned cwcP = 1 + wcslen( pwcPRoot );
XArray<WCHAR> xPRoot( cwcP );
RtlCopyMemory( xPRoot.GetPointer(), pwcPRoot, xPRoot.SizeOf() );
_PRoots.Push( xPRoot.GetPointer() );
xPRoot.Acquire();
}
void Pop()
{
delete [] _VRoots.Pop();
delete [] _PRoots.Pop();
_Access.Remove( _Access.Count() - 1 );
}
WCHAR const * PeekTopVRoot() const
{
Win4Assert( !IsEmpty() );
return _VRoots.Get( _VRoots.Count() - 1 );
}
WCHAR const * PeekTopPRoot() const
{
Win4Assert( !IsEmpty() );
return _PRoots.Get( _PRoots.Count() - 1 );
}
DWORD PeekTopAccess() const
{
Win4Assert( !IsEmpty() );
return _Access[ _Access.Count() - 1 ];
}
BOOL IsEmpty() const { return 0 == _VRoots.Count(); }
private:
CDynStack<WCHAR> _VRoots;
CDynStack<WCHAR> _PRoots;
CDynArrayInPlace<DWORD> _Access;
};
//+---------------------------------------------------------------------------
//
// Class: CMetaDataMgr
//
// Purpose: Class that encapsulates K2 metabase API for CI
//
// History: 07-Feb-1997 dlee Created
//
//----------------------------------------------------------------------------
class CMetaDataMgr
{
public:
CMetaDataMgr( BOOL fTopLevel,
CiVRootTypeEnum eType,
DWORD dwInstance = 0xffffffff,
WCHAR const * pwcMachine = L"." );
~CMetaDataMgr();
static BOOL IsIISAdminUp( BOOL & fIISAdminInstalled );
void EnumVPaths( CMetaDataCallBack & callBack );
void AddVRoot( WCHAR const * pwcVRoot,
WCHAR const * pwcPRoot,
DWORD dwAccess );
SCODE RemoveVRoot( WCHAR const * pwcVRoot );
void GetVRoot( WCHAR const * pwcVRoot,
WCHAR * pwcPRoot );
void GetVRootPW( WCHAR const * pwcVRoot,
WCHAR * pwcPassword );
void AddScriptMap( WCHAR const * pwcMap );
void RemoveScriptMap( WCHAR const * pwcExt );
BOOL ExtensionHasScriptMap( WCHAR const * pwcExt );
BOOL ExtensionHasTargetScriptMap( WCHAR const * pwcExt, WCHAR const * pwcDll );
void AddInProcessIsapiApp( WCHAR const * pwcApp );
void EnableVPathNotify( CMetaDataVPathChangeCallBack *pCallBack );
void DisableVPathNotify();
void SetIsIndexed( WCHAR const * pwcVPath,
BOOL fIsIndexed );
BOOL IsIndexed( WCHAR const * pwcVPath );
void EnumVServers( CMetaDataVirtualServerCallBack & callBack );
ULONG GetVPathAccess( WCHAR const * pwcVPath );
ULONG GetVPathSSLAccess( WCHAR const * pwcVPath );
ULONG GetVPathAuthorization( WCHAR const * pwcVPath );
void Flush( void );
private:
ULONG GetVPathFlags( WCHAR const * pwcVPath, ULONG mdID, ULONG ulDefault );
XInterface<IMSAdminBase> & Get() { return _xAdminBase; }
BOOL ReportVPath( CVRootStack & vrootStack,
CMetaDataCallBack & callBack,
CMetaDataHandle & mdRoot,
WCHAR const * pwcRelative );
void ReportVirtualServer( CMetaDataVirtualServerCallBack & callBack,
CMetaDataHandle & mdRoot,
WCHAR const * pwcRelative );
void Enum( CVRootStack & vrootStack,
CMetaDataCallBack & callBack,
CMetaDataHandle & mdRoot,
WCHAR const * pcRelative );
void Enum( CMetaDataVirtualServerCallBack & callBack,
CMetaDataHandle & mdRoot,
WCHAR const * pwcRelative );
void ReadRootValue( CMetaDataHandle & mdRoot,
METADATA_RECORD & mdr,
XGrowable<WCHAR> & xData,
DWORD dwIdentifier );
void WriteRootValue( CMetaDataHandle & mdRoot,
METADATA_RECORD & mdr,
WCHAR const * pwcData,
unsigned cwcData );
BOOL _fNotifyEnabled;
BOOL _fTopLevel;
XInterface<IMSAdminBase> _xAdminBase;
XInterface<CMetaDataComSink> _xSink;
XInterface<IConnectionPoint> _xCP;
DWORD _dwCookie;
WCHAR _awcInstance[METADATA_MAX_NAME_LEN];
};