windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/nntp/adminsso/rebuild.cpp
2020-09-26 16:20:57 +08:00

319 lines
7.6 KiB
C++

// Rebuild.cpp : Implementation of CNntpAdminRebuild.
#include "stdafx.h"
#include "nntpcmn.h"
#include "oleutil.h"
#include "Rebuild.h"
#include "nntptype.h"
#include "nntpapi.h"
#include <lmapibuf.h>
//
// Defaults:
//
#define DEFAULT_VERBOSE ( FALSE )
#define DEFAULT_CLEAN_REBUILD ( TRUE )
#define DEFAULT_DONT_DELETE_HISTORY ( FALSE )
#define DEFAULT_REUSE_INDEX_FILES ( TRUE )
#define DEFAULT_OMIT_NON_LEAF_DIRS ( TRUE )
#define DEFAULT_GROUP_FILE ( NULL )
#define DEFAULT_REPORT_FILE ( _T("nntpbld.log") )
#define DEFAULT_NUM_THREADS ( 0 )
// Must define THIS_FILE_* macros to use NntpCreateException()
#define THIS_FILE_HELP_CONTEXT 0
#define THIS_FILE_PROG_ID _T("Nntpadm.Rebuild.1")
#define THIS_FILE_IID IID_INntpAdminRebuild
/////////////////////////////////////////////////////////////////////////////
//
//
// Use a macro to define all the default methods
//
DECLARE_METHOD_IMPLEMENTATION_FOR_STANDARD_EXTENSION_INTERFACES(NntpAdminRebuild, CNntpAdminRebuild, IID_INntpAdminRebuild)
STDMETHODIMP CNntpAdminRebuild::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_INntpAdminRebuild,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
CNntpAdminRebuild::CNntpAdminRebuild () :
m_fVerbose ( FALSE ),
m_fCleanRebuild ( FALSE ),
m_fDontDeleteHistory ( FALSE ),
m_fReuseIndexFiles ( FALSE ),
m_fOmitNonLeafDirs ( FALSE ),
m_dwNumThreads ( 0 ),
m_fRebuildInProgress ( FALSE )
// CComBSTR's are initialized to NULL by default.
{
InitAsyncTrace ( );
m_iadsImpl.SetService ( MD_SERVICE_NAME );
m_iadsImpl.SetName ( _T("Rebuild") );
m_iadsImpl.SetClass ( _T("IIsNntpRebuild") );
}
CNntpAdminRebuild::~CNntpAdminRebuild ()
{
// All CComBSTR's are freed automatically.
TermAsyncTrace ( );
}
//
// IADs methods:
//
DECLARE_SIMPLE_IADS_IMPLEMENTATION(CNntpAdminRebuild,m_iadsImpl)
//
// Properties:
//
STDMETHODIMP CNntpAdminRebuild::get_Verbose ( BOOL * pfVerbose )
{
return StdPropertyGet ( m_fVerbose, pfVerbose );
}
STDMETHODIMP CNntpAdminRebuild::put_Verbose ( BOOL fVerbose )
{
return StdPropertyPut ( &m_fVerbose, fVerbose );
}
STDMETHODIMP CNntpAdminRebuild::get_CleanRebuild ( BOOL * pfCleanRebuild )
{
return StdPropertyGet ( m_fCleanRebuild, pfCleanRebuild );
}
STDMETHODIMP CNntpAdminRebuild::put_CleanRebuild ( BOOL fCleanRebuild )
{
return StdPropertyPut ( &m_fCleanRebuild, fCleanRebuild );
}
STDMETHODIMP CNntpAdminRebuild::get_DontDeleteHistory ( BOOL * pfDontDeleteHistory )
{
return StdPropertyGet ( m_fDontDeleteHistory, pfDontDeleteHistory );
}
STDMETHODIMP CNntpAdminRebuild::put_DontDeleteHistory ( BOOL fDontDeleteHistory )
{
return StdPropertyPut ( &m_fDontDeleteHistory, fDontDeleteHistory );
}
STDMETHODIMP CNntpAdminRebuild::get_ReuseIndexFiles ( BOOL * pfReuseIndexFiles )
{
return StdPropertyGet ( (DWORD) m_fReuseIndexFiles, (DWORD *) pfReuseIndexFiles );
}
STDMETHODIMP CNntpAdminRebuild::put_ReuseIndexFiles ( BOOL fReuseIndexFiles )
{
return StdPropertyPut ( (DWORD *) &m_fReuseIndexFiles, (DWORD) fReuseIndexFiles );
}
STDMETHODIMP CNntpAdminRebuild::get_OmitNonLeafDirs ( BOOL * pfOmitNonLeafDirs )
{
return StdPropertyGet ( m_fOmitNonLeafDirs, pfOmitNonLeafDirs );
}
STDMETHODIMP CNntpAdminRebuild::put_OmitNonLeafDirs ( BOOL fOmitNonLeafDirs )
{
return StdPropertyPut ( &m_fOmitNonLeafDirs, fOmitNonLeafDirs );
}
STDMETHODIMP CNntpAdminRebuild::get_GroupFile ( BSTR * pstrGroupFile )
{
return StdPropertyGet ( m_strGroupFile, pstrGroupFile );
}
STDMETHODIMP CNntpAdminRebuild::put_GroupFile ( BSTR strGroupFile )
{
return StdPropertyPut ( &m_strGroupFile, strGroupFile );
}
STDMETHODIMP CNntpAdminRebuild::get_ReportFile ( BSTR * pstrReportFile )
{
return StdPropertyGet ( m_strReportFile, pstrReportFile );
}
STDMETHODIMP CNntpAdminRebuild::put_ReportFile ( BSTR strReportFile )
{
return StdPropertyPut ( &m_strReportFile, strReportFile );
}
STDMETHODIMP CNntpAdminRebuild::get_NumThreads ( long * plNumThreads )
{
return StdPropertyGet ( m_dwNumThreads, plNumThreads );
}
STDMETHODIMP CNntpAdminRebuild::put_NumThreads ( long lNumThreads )
{
return StdPropertyPut ( &m_dwNumThreads, lNumThreads );
}
//////////////////////////////////////////////////////////////////////
// Methods:
//////////////////////////////////////////////////////////////////////
STDMETHODIMP CNntpAdminRebuild::Default ( )
{
HRESULT hr = NOERROR;
m_fVerbose = DEFAULT_VERBOSE;
m_fCleanRebuild = DEFAULT_CLEAN_REBUILD;
m_fDontDeleteHistory = DEFAULT_DONT_DELETE_HISTORY;
m_fReuseIndexFiles = DEFAULT_REUSE_INDEX_FILES;
m_fOmitNonLeafDirs = DEFAULT_OMIT_NON_LEAF_DIRS;
// m_strGroupFile = DEFAULT_GROUP_FILE;
m_strReportFile = DEFAULT_REPORT_FILE;
m_dwNumThreads = DEFAULT_NUM_THREADS;
return hr;
}
STDMETHODIMP CNntpAdminRebuild::StartRebuild ( )
{
TraceFunctEnter ( "CNntpAdminRebuild::StartRebuild" );
HRESULT hr = NOERROR;
NNTPBLD_INFO bldinfo;
DWORD dwError;
if ( m_fRebuildInProgress ) {
return NntpCreateException ( IDS_NNTPEXCEPTION_ALREADY_BUILDING );
}
ZeroMemory ( &bldinfo, sizeof (bldinfo) );
bldinfo.Verbose = !!m_fVerbose;
bldinfo.DoClean = !!m_fCleanRebuild;
bldinfo.NoHistoryDelete = !!m_fDontDeleteHistory;
bldinfo.ReuseIndexFiles = m_fReuseIndexFiles;
bldinfo.OmitNonleafDirs = !!m_fOmitNonLeafDirs;
bldinfo.szGroupFile = m_strGroupFile;
bldinfo.cbGroupFile = STRING_BYTE_LENGTH ( m_strGroupFile );
bldinfo.szReportFile = m_strReportFile;
bldinfo.cbReportFile = STRING_BYTE_LENGTH ( m_strReportFile );
bldinfo.NumThreads = m_dwNumThreads;
dwError = NntpStartRebuild (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
&bldinfo,
NULL
);
if ( dwError == NOERROR ) {
// We've successfully started a rebuild.
m_fRebuildInProgress = TRUE;
}
else {
_ASSERT ( dwError != NOERROR );
hr = RETURNCODETOHRESULT ( dwError );
}
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminRebuild::GetProgress ( long * pdwProgress )
{
TraceFunctEnter ( "CNntpAdminRebuild::GetProgress" );
HRESULT hr = NOERROR;
DWORD dwError;
DWORD dwProgress;
_ASSERT ( IS_VALID_OUT_PARAM ( pdwProgress ) );
if ( pdwProgress == NULL ) {
return E_POINTER;
}
*pdwProgress = 0;
// Should I send back an exception if the build is finished?
if ( !m_fRebuildInProgress ) {
*pdwProgress = 100;
return NOERROR;
}
dwError = NntpGetBuildStatus (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
FALSE,
&dwProgress
);
if ( dwError == NOERROR ) {
*pdwProgress = dwProgress;
}
else {
_ASSERT ( dwError != NOERROR );
hr = RETURNCODETOHRESULT ( dwError );
}
// Are we still rebuilding?
if ( dwError != NOERROR || dwProgress == 100 ) {
// The rebuild is finished.
m_fRebuildInProgress = FALSE;
}
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminRebuild::Cancel ( )
{
TraceFunctEnter ( "CNntpAdminRebuild::Cancel" );
HRESULT hr = NOERROR;
DWORD dwError;
DWORD dwProgress;
// Should I send back an exception if the build is finished?
if ( !m_fRebuildInProgress ) {
return NOERROR;
}
dwError = NntpGetBuildStatus (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
TRUE,
&dwProgress
);
if ( dwError != NOERROR ) {
hr = RETURNCODETOHRESULT ( dwError );
}
// Cancel always stops a rebuild:
m_fRebuildInProgress = FALSE;
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}