721 lines
22 KiB
C++
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 ( ) );
|
|
}
|