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

721 lines
22 KiB
C++

// service.cpp : Implementation of INntpVirtualServer
#include "stdafx.h"
#include "nntpcmn.h"
#include "oleutil.h"
#include "metautil.h"
#include "service.h"
// Must define THIS_FILE_* macros to use NntpCreateException()
#define THIS_FILE_HELP_CONTEXT 0
#define THIS_FILE_PROG_ID _T("Nntpadm.Service.1")
#define THIS_FILE_IID IID_INntpService
// Bitmasks for changed fields:
#define CHNG_ARTICLETIMELIMIT 0x00000001
#define CHNG_HISTORYEXPIRATION 0x00000002
#define CHNG_HONORCLIENTMSGIDS 0x00000004
#define CHNG_SMTPSERVER 0x00000008
#define CHNG_ALLOWCLIENTPOSTS 0x00000010
#define CHNG_ALLOWFEEDPOSTS 0x00000020
#define CHNG_ALLOWCONTROLMSGS 0x00000040
#define CHNG_DEFAULTMODERATORDOMAIN 0x00000080
#define CHNG_COMMANDLOGMASK 0x00000100
#define CHNG_DISABLENEWNEWS 0x00000200
#define CHNG_EXPIRERUNFREQUENCY 0x00000400
#define CHNG_SHUTDOWNLATENCY 0x00000800
// Default Values:
#define DEFAULT_ARTICLETIMELIMIT ( 1138 )
#define DEFAULT_HISTORYEXPIRATION ( 1138 )
#define DEFAULT_HONORCLIENTMSGIDS ( TRUE )
#define DEFAULT_SMTPSERVER _T( "" )
#define DEFAULT_ALLOWCLIENTPOSTS ( TRUE )
#define DEFAULT_ALLOWFEEDPOSTS ( TRUE )
#define DEFAULT_ALLOWCONTROLMSGS ( TRUE )
#define DEFAULT_DEFAULTMODERATORDOMAIN _T( "" )
#define DEFAULT_COMMANDLOGMASK ( (DWORD) -1 )
#define DEFAULT_DISABLENEWNEWS ( FALSE )
#define DEFAULT_EXPIRERUNFREQUENCY ( 1138 )
#define DEFAULT_SHUTDOWNLATENCY ( 1138 )
// Parameter ranges:
#define MAXLEN_SERVER ( 256 )
#define MIN_ARTICLETIMELIMIT ( (DWORD) 0 )
#define MAX_ARTICLETIMELIMIT ( (DWORD) -1 )
#define MIN_HISTORYEXPIRATION ( (DWORD) 0 )
#define MAX_HISTORYEXPIRATION ( (DWORD) -1 )
#define MAXLEN_SMTPSERVER ( 256 )
#define MAXLEN_DEFAULTMODERATORDOMAIN ( 256 )
#define MIN_COMMANDLOGMASK ( (DWORD) 0 )
#define MAX_COMMANDLOGMASK ( (DWORD) -1 )
#define MIN_EXPIRERUNFREQUENCY ( (DWORD) 1 )
#define MAX_EXPIRERUNFREQUENCY ( (DWORD) -1 )
#define MIN_SHUTDOWNLATENCY ( (DWORD) 1 )
#define MAX_SHUTDOWNLATENCY ( (DWORD) -1 )
/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CNntpAdminService::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_INntpService,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
CNntpAdminService::CNntpAdminService () :
m_dwArticleTimeLimit ( 0 ),
m_dwHistoryExpiration ( 0 ),
m_fHonorClientMsgIDs ( FALSE ),
m_fAllowClientPosts ( FALSE ),
m_fAllowFeedPosts ( FALSE ),
m_fAllowControlMsgs ( FALSE ),
m_dwCommandLogMask ( 0 ),
m_fDisableNewnews ( FALSE ),
m_dwExpireRunFrequency ( 0 ),
m_dwShutdownLatency ( 0 ),
m_fGotProperties ( FALSE ),
m_bvChangedFields ( 0 )
// CComBSTR's are initialized to NULL by default.
{
m_ftLastChanged.dwHighDateTime = 0;
m_ftLastChanged.dwLowDateTime = 0;
InitAsyncTrace ( );
}
CNntpAdminService::~CNntpAdminService ()
{
// All CComBSTR's are freed automatically.
TermAsyncTrace ( );
}
// Which Server to configure:
STDMETHODIMP CNntpAdminService::get_Server ( BSTR * pstrServer )
{
return StdPropertyGet ( m_strServer, pstrServer );
}
STDMETHODIMP CNntpAdminService::put_Server ( BSTR strServer )
{
// If the server name changes, that means the client will have to
// call Get again:
// I assume this here:
_ASSERT ( sizeof (DWORD) == sizeof (int) );
return StdPropertyPutServerName ( &m_strServer, strServer, (DWORD *) &m_fGotProperties, 1 );
}
// Server Properties:
STDMETHODIMP CNntpAdminService::get_ArticleTimeLimit ( long * plArticleTimeLimit )
{
return StdPropertyGet ( m_dwArticleTimeLimit, plArticleTimeLimit );
}
STDMETHODIMP CNntpAdminService::put_ArticleTimeLimit ( long lArticleTimeLimit )
{
return StdPropertyPut ( &m_dwArticleTimeLimit, lArticleTimeLimit, &m_bvChangedFields, CHNG_ARTICLETIMELIMIT );
}
STDMETHODIMP CNntpAdminService::get_HistoryExpiration ( long * plHistoryExpiration )
{
return StdPropertyGet ( m_dwHistoryExpiration, plHistoryExpiration );
}
STDMETHODIMP CNntpAdminService::put_HistoryExpiration ( long lHistoryExpiration )
{
return StdPropertyPut ( &m_dwHistoryExpiration, lHistoryExpiration, &m_bvChangedFields, CHNG_HISTORYEXPIRATION );
}
STDMETHODIMP CNntpAdminService::get_HonorClientMsgIDs ( BOOL * pfHonorClientMsgIDs )
{
return StdPropertyGet ( m_fHonorClientMsgIDs, pfHonorClientMsgIDs );
}
STDMETHODIMP CNntpAdminService::put_HonorClientMsgIDs ( BOOL fHonorClientMsgIDs )
{
return StdPropertyPut ( &m_fHonorClientMsgIDs, fHonorClientMsgIDs, &m_bvChangedFields, CHNG_HONORCLIENTMSGIDS );
}
STDMETHODIMP CNntpAdminService::get_SmtpServer ( BSTR * pstrSmtpServer )
{
return StdPropertyGet ( m_strSmtpServer, pstrSmtpServer );
}
STDMETHODIMP CNntpAdminService::put_SmtpServer ( BSTR strSmtpServer )
{
return StdPropertyPut ( &m_strSmtpServer, strSmtpServer, &m_bvChangedFields, CHNG_SMTPSERVER );
}
STDMETHODIMP CNntpAdminService::get_AllowClientPosts ( BOOL * pfAllowClientPosts )
{
return StdPropertyGet ( m_fAllowClientPosts, pfAllowClientPosts );
}
STDMETHODIMP CNntpAdminService::put_AllowClientPosts ( BOOL fAllowClientPosts )
{
return StdPropertyPut ( &m_fAllowClientPosts, fAllowClientPosts, &m_bvChangedFields, CHNG_ALLOWCLIENTPOSTS );
}
STDMETHODIMP CNntpAdminService::get_AllowFeedPosts ( BOOL * pfAllowFeedPosts )
{
return StdPropertyGet ( m_fAllowFeedPosts, pfAllowFeedPosts );
}
STDMETHODIMP CNntpAdminService::put_AllowFeedPosts ( BOOL fAllowFeedPosts )
{
return StdPropertyPut ( &m_fAllowFeedPosts, fAllowFeedPosts, &m_bvChangedFields, CHNG_ALLOWFEEDPOSTS );
}
STDMETHODIMP CNntpAdminService::get_AllowControlMsgs ( BOOL * pfAllowControlMsgs )
{
return StdPropertyGet ( m_fAllowControlMsgs, pfAllowControlMsgs );
}
STDMETHODIMP CNntpAdminService::put_AllowControlMsgs ( BOOL fAllowControlMsgs )
{
return StdPropertyPut ( &m_fAllowControlMsgs, fAllowControlMsgs, &m_bvChangedFields, CHNG_ALLOWCONTROLMSGS );
}
STDMETHODIMP CNntpAdminService::get_DefaultModeratorDomain ( BSTR * pstrDefaultModeratorDomain )
{
return StdPropertyGet ( m_strDefaultModeratorDomain, pstrDefaultModeratorDomain );
}
STDMETHODIMP CNntpAdminService::put_DefaultModeratorDomain ( BSTR strDefaultModeratorDomain )
{
return StdPropertyPut ( &m_strDefaultModeratorDomain, strDefaultModeratorDomain, &m_bvChangedFields, CHNG_DEFAULTMODERATORDOMAIN );
}
STDMETHODIMP CNntpAdminService::get_CommandLogMask ( long * plCommandLogMask )
{
return StdPropertyGet ( m_dwCommandLogMask, plCommandLogMask );
}
STDMETHODIMP CNntpAdminService::put_CommandLogMask ( long lCommandLogMask )
{
return StdPropertyPut ( &m_dwCommandLogMask, lCommandLogMask, &m_bvChangedFields, CHNG_COMMANDLOGMASK );
}
STDMETHODIMP CNntpAdminService::get_DisableNewnews ( BOOL * pfDisableNewnews )
{
return StdPropertyGet ( m_fDisableNewnews, pfDisableNewnews );
}
STDMETHODIMP CNntpAdminService::put_DisableNewnews ( BOOL fDisableNewnews )
{
return StdPropertyPut ( &m_fDisableNewnews, fDisableNewnews, &m_bvChangedFields, CHNG_DISABLENEWNEWS );
}
STDMETHODIMP CNntpAdminService::get_ExpireRunFrequency ( long * plExpireRunFrequency )
{
return StdPropertyGet ( m_dwExpireRunFrequency, plExpireRunFrequency );
}
STDMETHODIMP CNntpAdminService::put_ExpireRunFrequency ( long lExpireRunFrequency )
{
return StdPropertyPut ( &m_dwExpireRunFrequency, lExpireRunFrequency, &m_bvChangedFields, CHNG_EXPIRERUNFREQUENCY );
}
STDMETHODIMP CNntpAdminService::get_ShutdownLatency ( long * plShutdownLatency )
{
return StdPropertyGet ( m_dwShutdownLatency, plShutdownLatency );
}
STDMETHODIMP CNntpAdminService::put_ShutdownLatency ( long lShutdownLatency )
{
return StdPropertyPut ( &m_dwShutdownLatency, lShutdownLatency, &m_bvChangedFields, CHNG_SHUTDOWNLATENCY );
}
//////////////////////////////////////////////////////////////////////
// Methods:
//////////////////////////////////////////////////////////////////////
//$-------------------------------------------------------------------
//
// CNntpAdminService::Get
//
// Description:
//
// Gets server properties from the metabase.
//
// Parameters:
//
// (property) m_strServer
// pErr - Resulting error code. This can be translated to a
// string through the INntpAdmin interface.
//
// Returns:
//
// E_POINTER, DISP_E_EXCEPTION, E_OUTOFMEMORY or NOERROR.
// Additional error conditions are returned through the pErr value.
//
//--------------------------------------------------------------------
STDMETHODIMP CNntpAdminService::Get ( )
{
TraceFunctEnter ( "CNntpAdminService::Get" );
HRESULT hr = NOERROR;
CComPtr<IMSAdminBase> pmetabase;
// Validate Server & Service Instance:
// Talk to the metabase:
hr = m_mbFactory.GetMetabaseObject ( m_strServer, &pmetabase );
if ( FAILED(hr) ) {
goto Exit;
}
hr = GetPropertiesFromMetabase ( pmetabase );
if ( FAILED(hr) ) {
goto Exit;
}
StateTrace ( 0, "Successfully got server properties" );
m_fGotProperties = TRUE;
m_bvChangedFields = 0;
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
// CComPtr automatically releases the metabase handle.
}
//$-------------------------------------------------------------------
//
// CNntpAdminService::Set
//
// Description:
//
// Sends server properties to the metabase.
//
// Parameters:
//
// (property) m_strServer
// fFailIfChanged - return an error if the metabase has changed?
// pErr - Resulting error code. This can be translated to a
// string through the INntpAdmin interface.
//
// Returns:
//
// E_POINTER, DISP_E_EXCEPTION, E_OUTOFMEMORY or NOERROR.
// Additional error conditions are returned through the pErr value.
//
//--------------------------------------------------------------------
STDMETHODIMP CNntpAdminService::Set ( BOOL fFailIfChanged)
{
TraceFunctEnter ( "CNntpAdminService::Set" );
HRESULT hr = NOERROR;
CComPtr<IMSAdminBase> pmetabase;
// Make sure the client call Get first:
if ( !m_fGotProperties ) {
ErrorTrace ( 0, "Didn't call get first" );
hr = NntpCreateException ( IDS_NNTPEXCEPTION_DIDNT_CALL_GET );
goto Exit;
}
// Validate data members:
if ( !ValidateStrings () ) {
// !!!magnush - what about the case when any strings are NULL?
hr = E_FAIL;
goto Exit;
}
if ( !ValidateProperties ( ) ) {
hr = RETURNCODETOHRESULT ( ERROR_INVALID_PARAMETER );
goto Exit;
}
hr = m_mbFactory.GetMetabaseObject ( m_strServer, &pmetabase );
if ( FAILED(hr) ) {
goto Exit;
}
hr = SendPropertiesToMetabase ( fFailIfChanged, pmetabase );
if ( FAILED(hr) ) {
goto Exit;
}
StateTrace ( 0, "Successfully set server properties" );
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
//$-------------------------------------------------------------------
//
// CNntpAdminService::GetPropertiesFromMetabase
//
// Description:
//
// Asks the metabase for each property in this class.
// This class's properties come from /LM/NntpSvc/
//
// Parameters:
//
// pMetabase - The metabase object
// pErr - Resulting error code.
//
// Returns:
//
// E_OUTOFMEMORY or an error code in pErr.
//
//--------------------------------------------------------------------
HRESULT CNntpAdminService::GetPropertiesFromMetabase ( IMSAdminBase * pMetabase)
{
TraceFunctEnter ( "CNntpAdminService::GetPropertiesFromMetabase" );
HRESULT hr = NOERROR;
CMetabaseKey metabase ( pMetabase );
BOOL fRet;
hr = metabase.Open ( NNTP_MD_ROOT_PATH );
if ( FAILED(hr) ) {
ErrorTraceX ( (LPARAM) this, "Failed to open NntpSvc key, %x", hr );
// Return some kind of error code here:
// hr = RETURNCODETOHRESULT ( GetLastError () );
goto Exit;
}
fRet = TRUE;
fRet = StdGetMetabaseProp ( &metabase, MD_ARTICLE_TIME_LIMIT, DEFAULT_ARTICLETIMELIMIT, &m_dwArticleTimeLimit ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_HISTORY_EXPIRATION, DEFAULT_HISTORYEXPIRATION, &m_dwHistoryExpiration ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_HONOR_CLIENT_MSGIDS, DEFAULT_HONORCLIENTMSGIDS, &m_fHonorClientMsgIDs ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_SMTP_SERVER, DEFAULT_SMTPSERVER, &m_strSmtpServer ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_ALLOW_CLIENT_POSTS, DEFAULT_ALLOWCLIENTPOSTS, &m_fAllowClientPosts ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_ALLOW_FEED_POSTS, DEFAULT_ALLOWFEEDPOSTS, &m_fAllowFeedPosts ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_ALLOW_CONTROL_MSGS, DEFAULT_ALLOWCONTROLMSGS, &m_fAllowControlMsgs ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_DEFAULT_MODERATOR, DEFAULT_DEFAULTMODERATORDOMAIN, &m_strDefaultModeratorDomain ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_NNTP_COMMAND_LOG_MASK,DEFAULT_COMMANDLOGMASK, &m_dwCommandLogMask ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_DISABLE_NEWNEWS, DEFAULT_DISABLENEWNEWS, &m_fDisableNewnews ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_NEWS_CRAWLER_TIME, DEFAULT_EXPIRERUNFREQUENCY, &m_dwExpireRunFrequency ) && fRet;
fRet = StdGetMetabaseProp ( &metabase, MD_SHUTDOWN_LATENCY, DEFAULT_SHUTDOWNLATENCY, &m_dwShutdownLatency ) && fRet;
// Check all property strings:
// If any string is NULL, it is because we failed to allocate memory:
if ( !ValidateStrings () ) {
hr = E_OUTOFMEMORY;
goto Exit;
}
// We can only fail from memory allocations:
_ASSERT ( fRet );
// Save the last changed time for this key:
m_ftLastChanged.dwHighDateTime = 0;
m_ftLastChanged.dwLowDateTime = 0;
hr = pMetabase->GetLastChangeTime ( metabase.QueryHandle(), (BYTE *) "", &m_ftLastChanged, FALSE );
if ( FAILED (hr) ) {
ErrorTraceX ( (LPARAM) this, "Failed to get last change time: %x", hr );
// Ignore this error.
hr = NOERROR;
}
// Validate the data received from the metabase:
_ASSERT ( ValidateStrings () );
_ASSERT ( ValidateProperties( ) );
if ( !ValidateProperties( ) ) {
CorrectProperties ();
}
Exit:
TraceFunctLeave ();
return hr;
// MB automatically closes its handle
}
//$-------------------------------------------------------------------
//
// CNntpAdminService::SendPropertiesToMetabase
//
// Description:
//
// Saves each property to the metabase.
// This class's properties go into /LM/NntpSvc/
//
// Parameters:
//
// fFailIfChanged - Return a failure code if the metabase
// has changed since last get.
// pMetabase - the metabase object.
// pErr - resulting error code.
//
// Returns:
//
// E_OUTOFMEMORY or resulting error code in pErr.
//
//--------------------------------------------------------------------
HRESULT CNntpAdminService::SendPropertiesToMetabase (
BOOL fFailIfChanged,
IMSAdminBase * pMetabase
)
{
TraceFunctEnter ( "CNntpAdminService::SendPropertiesToMetabase" );
HRESULT hr = NOERROR;
CMetabaseKey metabase ( pMetabase );
hr = metabase.Open ( (CHAR *) NNTP_MD_ROOT_PATH, METADATA_PERMISSION_WRITE );
if ( FAILED(hr) ) {
ErrorTraceX ( (LPARAM) this, "Failed to open NntpSvc key, %x", hr );
// hr = RETURNCODETOHRESULT ( GetLastError () );
goto Exit;
}
// Does the client care if the key has changed?
if ( fFailIfChanged ) {
// Did the key change?
if ( HasKeyChanged ( pMetabase, metabase.QueryHandle(), &m_ftLastChanged ) ) {
StateTrace ( (LPARAM) this, "Metabase has changed, not setting properties" );
// !!!magnush - Return the appropriate error code:
hr = E_FAIL;
goto Exit;
}
}
//
// The general procedure here is to keep setting metabase properties
// as long as nothing has gone wrong. This is done by short-circuiting
// the statement by ANDing it with the status code. This makes the code
// much more concise.
//
fRet = TRUE;
if ( m_bvChangedFields & CHNG_ARTICLETIMELIMIT ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_ARTICLE_TIME_LIMIT, m_dwArticleTimeLimit );
}
if ( m_bvChangedFields & CHNG_HISTORYEXPIRATION ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_HISTORY_EXPIRATION, m_dwHistoryExpiration );
}
if ( m_bvChangedFields & CHNG_HONORCLIENTMSGIDS ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_HONOR_CLIENT_MSGIDS, m_fHonorClientMsgIDs );
}
if ( m_bvChangedFields & CHNG_SMTPSERVER ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_SMTP_SERVER, m_strSmtpServer );
}
if ( m_bvChangedFields & CHNG_ALLOWCLIENTPOSTS ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_ALLOW_CLIENT_POSTS, m_fAllowClientPosts );
}
if ( m_bvChangedFields & CHNG_ALLOWFEEDPOSTS ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_ALLOW_FEED_POSTS, m_fAllowFeedPosts );
}
if ( m_bvChangedFields & CHNG_ALLOWCONTROLMSGS ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_ALLOW_CONTROL_MSGS, m_fAllowControlMsgs );
}
if ( m_bvChangedFields & CHNG_DEFAULTMODERATORDOMAIN ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_DEFAULT_MODERATOR, m_strDefaultModeratorDomain );
}
if ( m_bvChangedFields & CHNG_COMMANDLOGMASK ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_NNTP_COMMAND_LOG_MASK,m_dwCommandLogMask );
}
if ( m_bvChangedFields & CHNG_DISABLENEWNEWS ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_DISABLE_NEWNEWS, m_fDisableNewnews );
}
if ( m_bvChangedFields & CHNG_EXPIRERUNFREQUENCY ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_NEWS_CRAWLER_TIME, m_dwExpireRunFrequency );
}
if ( m_bvChangedFields & CHNG_SHUTDOWNLATENCY ) {
fRet = fRet && StdPutMetabaseProp ( &metabase, MD_SHUTDOWN_LATENCY, m_dwShutdownLatency );
}
if ( !fRet ) {
hr = RETURNCODETOHRESULT ( GetLastError () );
}
// Save the data to the metabase:
hr = metabase.Save ();
BAIL_ON_FAILURE(hr);
// Save the last changed time for this key:
m_ftLastChanged.dwHighDateTime = 0;
m_ftLastChanged.dwLowDateTime = 0;
hr = pMetabase->GetLastChangeTime ( metabase.QueryHandle(), (BYTE *) "", &m_ftLastChanged, FALSE );
if ( FAILED (hr) ) {
ErrorTraceX ( (LPARAM) this, "Failed to get last change time: %x", hr );
// Ignore this error.
hr = NOERROR;
}
Exit:
TraceFunctLeave ();
return hr;
// MB automatically closes its handle
}
//$-------------------------------------------------------------------
//
// CNntpAdminService::ValidateStrings
//
// Description:
//
// Checks to make sure each string property is non-null.
//
// Returns:
//
// FALSE if any string property is NULL.
//
//--------------------------------------------------------------------
BOOL CNntpAdminService::ValidateStrings ( ) const
{
TraceFunctEnter ( "CNntpAdminService::ValidateStrings" );
// Check all property strings:
// If any string is NULL, return FALSE:
if (
!m_strSmtpServer ||
!m_strDefaultModeratorDomain
) {
ErrorTrace ( (LPARAM) this, "String validation failed" );
TraceFunctLeave ();
return FALSE;
}
_ASSERT ( IS_VALID_STRING ( m_strSmtpServer ) );
_ASSERT ( IS_VALID_STRING ( m_strDefaultModeratorDomain ) );
TraceFunctLeave ();
return TRUE;
}
//$-------------------------------------------------------------------
//
// CNntpAdminService::ValidateProperties
//
// Description:
//
// Checks to make sure all parameters are valid.
//
// Parameters:
//
// pErr - resulting error code.
//
// Returns:
//
// FALSE if any property was not valid. In this case pErr
// will contain an error that describes the invalid condition.
//
//--------------------------------------------------------------------
BOOL CNntpAdminService::ValidateProperties ( ) const
{
BOOL fRet = TRUE;
_ASSERT ( ValidateStrings () );
fRet = fRet && PV_MinMax ( m_dwArticleTimeLimit, MIN_ARTICLETIMELIMIT, MAX_ARTICLETIMELIMIT );
fRet = fRet && PV_MinMax ( m_dwHistoryExpiration, MIN_HISTORYEXPIRATION, MAX_HISTORYEXPIRATION );
fRet = fRet && PV_Boolean ( m_fHonorClientMsgIDs );
fRet = fRet && PV_MaxChars ( m_strSmtpServer, MAXLEN_SMTPSERVER );
fRet = fRet && PV_Boolean ( m_fAllowClientPosts );
fRet = fRet && PV_Boolean ( m_fAllowFeedPosts );
fRet = fRet && PV_Boolean ( m_fAllowControlMsgs );
fRet = fRet && PV_MaxChars ( m_strDefaultModeratorDomain, MAXLEN_DEFAULTMODERATORDOMAIN );
fRet = fRet && PV_MinMax ( m_dwCommandLogMask, MIN_COMMANDLOGMASK, MAX_COMMANDLOGMASK );
fRet = fRet && PV_Boolean ( m_fDisableNewnews );
fRet = fRet && PV_MinMax ( m_dwExpireRunFrequency, MIN_EXPIRERUNFREQUENCY, MAX_EXPIRERUNFREQUENCY );
fRet = fRet && PV_MinMax ( m_dwShutdownLatency, MIN_SHUTDOWNLATENCY, MAX_SHUTDOWNLATENCY );
return fRet;
}
void CNntpAdminService::CorrectProperties ( )
{
if ( m_strServer && !PV_MaxChars ( m_strServer, MAXLEN_SERVER ) ) {
m_strServer[ MAXLEN_SERVER - 1 ] = NULL;
}
if ( !PV_MinMax ( m_dwArticleTimeLimit, MIN_ARTICLETIMELIMIT, MAX_ARTICLETIMELIMIT ) ) {
m_dwArticleTimeLimit = DEFAULT_ARTICLETIMELIMIT;
}
if ( !PV_MinMax ( m_dwHistoryExpiration, MIN_HISTORYEXPIRATION, MAX_HISTORYEXPIRATION ) ) {
m_dwHistoryExpiration = DEFAULT_HISTORYEXPIRATION;
}
if ( !PV_Boolean ( m_fHonorClientMsgIDs ) ) {
m_fHonorClientMsgIDs = !!m_fHonorClientMsgIDs;
}
if ( !PV_MaxChars ( m_strSmtpServer, MAXLEN_SMTPSERVER ) ) {
m_strSmtpServer[ MAXLEN_SMTPSERVER - 1 ] = NULL;
}
if ( !PV_Boolean ( m_fAllowClientPosts ) ) {
m_fAllowClientPosts = !!m_fAllowClientPosts;
}
if ( !PV_Boolean ( m_fAllowFeedPosts ) ) {
m_fAllowFeedPosts = !!m_fAllowFeedPosts;
}
if ( !PV_Boolean ( m_fAllowControlMsgs ) ) {
m_fAllowControlMsgs = !!m_fAllowControlMsgs;
}
if ( !PV_MaxChars ( m_strDefaultModeratorDomain, MAXLEN_DEFAULTMODERATORDOMAIN ) ) {
m_strDefaultModeratorDomain[ MAXLEN_DEFAULTMODERATORDOMAIN - 1] = NULL;
}
if ( !PV_MinMax ( m_dwCommandLogMask, MIN_COMMANDLOGMASK, MAX_COMMANDLOGMASK ) ) {
m_dwCommandLogMask = DEFAULT_COMMANDLOGMASK;
}
if ( !PV_Boolean ( m_fDisableNewnews ) ) {
m_fDisableNewnews = !!m_fDisableNewnews;
}
if ( !PV_MinMax ( m_dwExpireRunFrequency, MIN_EXPIRERUNFREQUENCY, MAX_EXPIRERUNFREQUENCY ) ) {
m_dwExpireRunFrequency = DEFAULT_EXPIRERUNFREQUENCY;
}
if ( !PV_MinMax ( m_dwShutdownLatency, MIN_SHUTDOWNLATENCY, MAX_SHUTDOWNLATENCY ) ) {
m_dwShutdownLatency = DEFAULT_SHUTDOWNLATENCY;
}
_ASSERT ( ValidateProperties ( ) );
}