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

372 lines
7.8 KiB
C++

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
expinfo.cpp
Abstract:
Author:
Magnus Hedlund (MagnusH) --
Revision History:
--*/
#include "stdafx.h"
#include "oleutil.h"
#include "nntpcmn.h"
#include "nntptype.h"
#include "nntpapi.h"
#include "expinfo.h"
#include <lmapibuf.h>
// Must define THIS_FILE_* macros to use NntpCreateException()
#define THIS_FILE_HELP_CONTEXT 0
#define THIS_FILE_PROG_ID _T("Nntpadm.Expiration.1")
#define THIS_FILE_IID IID_INntpAdminExpiration
CExpirationPolicy::CExpirationPolicy ( ) :
m_dwExpireId ( 0 ),
m_dwSize ( 0 ),
m_dwTime ( 0 )
// CMultiSz's are set to NULL automatically.
{
}
CExpirationPolicy::~CExpirationPolicy ( )
{
// CMultiSz's are deleted automatically.
}
void CExpirationPolicy::Destroy ()
{
m_mszNewsgroups.Empty ();
}
const CExpirationPolicy & CExpirationPolicy::operator= ( const CExpirationPolicy & Expire )
{
// Check for assignment to self:
if ( &Expire == this ) {
return *this;
}
// Empty the old Expire values:
this->Destroy ();
// Copy all member variables:
m_dwExpireId = Expire.m_dwExpireId;
m_strPolicyName = Expire.m_strPolicyName;
m_dwSize = Expire.m_dwSize;
m_dwTime = Expire.m_dwTime;
m_mszNewsgroups = Expire.m_mszNewsgroups;
// If anything didn't work, CheckValid will fail.
return *this;
}
BOOL CExpirationPolicy::CheckValid ( )
{
// Check Strings:
if (
!m_mszNewsgroups
) {
return FALSE;
}
return TRUE;
}
void CExpirationPolicy::FromExpireInfo ( const NNTP_EXPIRE_INFO * pExpireInfo )
{
this->Destroy ();
m_dwExpireId = pExpireInfo->ExpireId;
m_strPolicyName = pExpireInfo->ExpirePolicy;
m_dwSize = pExpireInfo->ExpireSizeHorizon;
m_dwTime = pExpireInfo->ExpireTime;
m_mszNewsgroups = (LPWSTR) pExpireInfo->Newsgroups;
_ASSERT ( pExpireInfo->cbNewsgroups == m_mszNewsgroups.SizeInBytes () );
}
HRESULT CExpirationPolicy::ToExpireInfo ( LPNNTP_EXPIRE_INFO pExpireInfo )
{
TraceFunctEnter ( "CExpirationPolicy::ToExpireInfo" );
_ASSERT ( IS_VALID_OUT_PARAM ( pExpireInfo ) );
HRESULT hr = NOERROR;
ZeroMemory ( pExpireInfo, sizeof ( *pExpireInfo ) );
pExpireInfo->ExpireId = m_dwExpireId;
pExpireInfo->ExpirePolicy = m_strPolicyName;
pExpireInfo->ExpireSizeHorizon = m_dwSize;
pExpireInfo->ExpireTime = m_dwTime;
pExpireInfo->Newsgroups = (UCHAR *) (LPCWSTR) m_mszNewsgroups;
pExpireInfo->cbNewsgroups = m_mszNewsgroups.SizeInBytes ();
TraceFunctLeave ();
return hr;
}
HRESULT CExpirationPolicy::Add ( LPCWSTR strServer, DWORD dwInstance)
{
TraceFunctEnter ( "CExpirationPolicy::Add" );
HRESULT hr = NOERROR;
DWORD dwError = NOERROR;
DWORD dwParmErr = 0;
DWORD dwNewId = 0;
NNTP_EXPIRE_INFO Expireinfo;
FillMemory ( &Expireinfo, sizeof (Expireinfo), 0 );
hr = ToExpireInfo ( &Expireinfo );
if ( FAILED(hr) ) {
goto Exit;
}
Expireinfo.ExpireId = 0;
dwError = NntpAddExpire ( (LPWSTR) strServer, dwInstance, &Expireinfo, &dwParmErr, &dwNewId );
if ( dwError != NOERROR ) {
ErrorTraceX ( (LPARAM) this, "Failed to add Expire %x", dwError );
hr = RETURNCODETOHRESULT ( dwError );
goto Exit;
}
this->m_dwExpireId = dwNewId;
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
HRESULT CExpirationPolicy::Set ( LPCWSTR strServer, DWORD dwInstance)
{
TraceFunctEnter ( "CExpirationPolicy::Set" );
HRESULT hr = NOERROR;
DWORD dwError = NOERROR;
DWORD dwParmErr = 0;
NNTP_EXPIRE_INFO Expireinfo;
FillMemory ( &Expireinfo, sizeof (Expireinfo), 0 );
hr = ToExpireInfo ( &Expireinfo );
if ( FAILED(hr) ) {
goto Exit;
}
dwError = NntpSetExpireInformation ( (LPWSTR) strServer, dwInstance, &Expireinfo, &dwParmErr );
if ( dwError != NOERROR ) {
ErrorTraceX ( (LPARAM) this, "Failed to set Expire[%d]: %x", m_dwExpireId, dwError );
hr = RETURNCODETOHRESULT ( dwError );
goto Exit;
}
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
HRESULT CExpirationPolicy::Remove ( LPCWSTR strServer, DWORD dwInstance)
{
TraceFunctEnter ( "CExpirationPolicy::Remove" );
HRESULT hr = NOERROR;
DWORD dwError = NOERROR;
dwError = NntpDeleteExpire ( (LPWSTR) strServer, dwInstance, m_dwExpireId );
if ( dwError != NOERROR ) {
ErrorTraceX ( (LPARAM) this, "Failed to remove Expire[%d]: %x", m_dwExpireId );
hr = RETURNCODETOHRESULT ( dwError );
goto Exit;
}
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
#if 0
BOOL CExpirationPolicy::CheckPolicyProperties ( )
{
return TRUE;
}
HRESULT CExpirationPolicy::GetFromMetabase ( CMetabaseKey * pmkeyExpiration, const LPWSTR wszPolicyKey )
{
TraceFunctEnter ( "CExpirationPolicy::GetFromMetabase" );
HRESULT hr = NOERROR;
DWORD cbData = 0;
char Dummy[5];
WCHAR * msz = NULL;
m_dwExpireId = GetExpireId ( szPolicyKey );
// Assume that the ID is non-zero:
_ASSERT ( m_dwExpireId != 0 );
hr = pmkeyExpiration->GetDword ( szPolicyKey, MD_EXPIRE_SPACE, IIS_MD_UT_SERVER, &m_dwSize, 0 );
if ( FAILED(hr) ) {
m_dwSize = (DWORD) -1;
hr = NOERROR;
}
hr = pmkeyExpiration->GetDword ( szPolicyKey, MD_EXPIRE_TIME, IIS_MD_UT_SERVER, &m_dwTime, 0 );
if ( FAILED(hr) ) {
m_dwTime = (DWORD) -1;
hr = NOERROR;
}
hr = pmkeyExpiration->GetData ( szPolicyKey, MD_EXPIRE_NEWSGROUPS, IIS_MD_UT_SERVER, BINARY_METADATA, &Dummy, &cbData, 0 );
if ( FAILED (hr) ) {
cbData = 0;
hr = NOERROR;
}
if ( cbData == 0 ) {
m_mszNewsgroups = _T("\0");
}
else {
_ASSERT ( (cbData % 2) == 0 );
msz = new WCHAR [ (cbData + 1) / 2 ];
if ( msz == NULL ) {
FatalTrace ( (LPARAM) this, "Out of memory" );
hr = E_OUTOFMEMORY;
goto Exit;
}
hr = pmkeyExpiration->GetData ( szPolicyKey, MD_EXPIRE_NEWSGROUPS, IIS_MD_UT_SERVER, BINARY_METADATA, msz, &cbData, 0 );
m_mszNewsgroups = msz;
}
Exit:
if ( msz ) {
delete msz;
}
TraceFunctLeave ();
return hr;
}
HRESULT CExpirationPolicy::SendToMetabase ( CMetabaseKey * pmkeyExpiration, DWORD bvChangedFields )
{
TraceFunctEnter ( "CExpirationPolicy::SendToMetabase" );
HRESULT hr = NOERROR;
DWORD cbNewsgroups = 0;
CHAR szPolicyKey[ METADATA_MAX_NAME_LEN ];
_ASSERT ( m_dwExpireId != 0 );
wsprintfA ( szPolicyKey, "expire%ud", m_dwExpireId );
hr = pmkeyExpiration->SetDword ( szPolicyKey, MD_EXPIRE_SPACE, IIS_MD_UT_SERVER, m_dwSize );
if ( FAILED(hr) ) {
goto Exit;
}
hr = pmkeyExpiration->SetDword ( szPolicyKey, MD_EXPIRE_TIME, IIS_MD_UT_SERVER, m_dwTime );
if ( FAILED(hr) ) {
goto Exit;
}
cbNewsgroups = m_mszNewsgroups.SizeInBytes ();
hr = pmkeyExpiration->SetData ( szPolicyKey, MD_EXPIRE_NEWSGROUPS, IIS_MD_UT_SERVER, BINARY_METADATA, (void *) (LPCWSTR) m_mszNewsgroups, cbNewsgroups );
if ( FAILED(hr) ) {
goto Exit;
}
Exit:
TraceFunctLeave ();
return hr;
}
HRESULT CExpirationPolicy::AddToMetabase ( CMetabaseKey * pmkeyExpiration )
{
TraceFunctEnter ( "CExpirationPolicy::AddToMetabase" );
HRESULT hr = NOERROR;
char szExpireKey [ METADATA_MAX_NAME_LEN ];
m_dwExpireId = 0;
while ( 1 ) {
m_dwExpireId++;
wsprintfA ( szExpireKey, "expire%ud", m_dwExpireId );
hr = pmkeyExpiration->CreateChild ( szExpireKey );
if ( SUCCEEDED(hr) ) {
// Success, get out of the loop:
break;
}
if ( HRESULTTOWIN32 ( hr ) == ERROR_ALREADY_EXISTS ) {
// This key already exists, try the next one:
continue;
}
_ASSERT ( FAILED(hr) );
if ( FAILED(hr) ) {
ErrorTraceX ( (LPARAM) this, "Error adding new expire policy [%d] : %x", m_dwExpireId, hr );
goto Exit;
}
}
return SendToMetabase ( pmkeyExpiration, (DWORD) -1 );
Exit:
TraceFunctLeave ();
return hr;
}
DWORD GetExpireId ( const LPWSTR wszKey )
{
if ( strncmp ( szKey, "expire", sizeof ("expire") - 1 ) != 0 ) {
return 0;
}
return atoi ( szKey + sizeof("expire") - 1 );
}
BOOL IsKeyValidExpire ( const LPWSTR wszKey )
{
/*
if ( _strnicmp ( szKey, "expire" ) != 0 ) {
return FALSE;
}
*/
if ( GetExpireId ( szKey ) != 0 ) {
return TRUE;
}
return FALSE;
}
#endif