372 lines
7.8 KiB
C++
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
|