|
|
// domain.cpp : Implementation of CsmtpadmApp and DLL registration.
#include "stdafx.h"
#include "iadm.h"
#include "iiscnfg.h"
#include "smtpadm.h"
#include "domain.h"
#include "oleutil.h"
#include "metautil.h"
#include "listmacr.h"
#include <lmapibuf.h>
#include "smtpcmn.h"
#include "smtpprop.h"
// Must define THIS_FILE_* macros to use SmtpCreateException()
#define THIS_FILE_HELP_CONTEXT 0
#define THIS_FILE_PROG_ID _T("Smtpadm.Domain.1")
#define THIS_FILE_IID IID_ISmtpAdminDomain
#define UNASSIGNED_DOMAIN_ID ( DWORD( -1 ) )
/////////////////////////////////////////////////////////////////////////////
//
//
// Use a macro to define all the default methods
//
DECLARE_METHOD_IMPLEMENTATION_FOR_STANDARD_EXTENSION_INTERFACES(SmtpAdminDomain, CSmtpAdminDomain, IID_ISmtpAdminDomain)
STDMETHODIMP CSmtpAdminDomain::InterfaceSupportsErrorInfo(REFIID riid) { static const IID* arr[] = { &IID_ISmtpAdminDomain, };
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++) { if (InlineIsEqualGUID(*arr[i],riid)) return S_OK; } return S_FALSE; }
CSmtpAdminDomain::CSmtpAdminDomain () // CComBSTR's are initialized to NULL by default.
{ m_lCount = 0; m_dwActionType = SMTP_DELIVER; m_fAllowEtrn = FALSE; m_dwDomainId = UNASSIGNED_DOMAIN_ID;
m_dwMaxDomainId = 0; m_fEnumerated = FALSE;
m_pCurrentDomainEntry = NULL; m_pDefaultDomainEntry = NULL;
InitializeListHead( &m_list );
m_iadsImpl.SetService ( MD_SERVICE_NAME ); m_iadsImpl.SetName ( _T("Domain") ); m_iadsImpl.SetClass ( _T("IIsSmtpDomain") ); }
CSmtpAdminDomain::~CSmtpAdminDomain () { EmptyList(); // All CComBSTR's are freed automatically.
}
void CSmtpAdminDomain::EmptyList() { PLIST_ENTRY pHead; PLIST_ENTRY pEntry; DomainEntry* pDomainEntry;
for( pHead=&m_list, pEntry=pHead->Flink; pEntry!=pHead; pEntry=pHead->Flink ) { pDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list); RemoveEntryList(pEntry); delete pDomainEntry; } }
//
// IADs methods:
//
DECLARE_SIMPLE_IADS_IMPLEMENTATION(CSmtpAdminDomain,m_iadsImpl)
//////////////////////////////////////////////////////////////////////
// Properties:
//////////////////////////////////////////////////////////////////////
// enumeration
STDMETHODIMP CSmtpAdminDomain::get_Count ( long * plCount ) { return StdPropertyGet ( m_lCount, plCount ); }
// current Domain Properties:
STDMETHODIMP CSmtpAdminDomain::get_DomainName ( BSTR * pstrDomainName ) { return StdPropertyGet ( m_strDomainName, pstrDomainName ); }
STDMETHODIMP CSmtpAdminDomain::put_DomainName ( BSTR strDomainName ) { return StdPropertyPut ( &m_strDomainName, strDomainName ); }
STDMETHODIMP CSmtpAdminDomain::get_ActionType( long * plActionType ) { return StdPropertyGet ( m_dwActionType, plActionType ); }
STDMETHODIMP CSmtpAdminDomain::put_ActionType( long lActionType ) { return StdPropertyPut ( &m_dwActionType, lActionType ); }
// drop IsDefault!!
STDMETHODIMP CSmtpAdminDomain::get_IsDefault ( BOOL * pfIsDefault ) { *pfIsDefault = m_dwActionType == SMTP_DEFAULT; return NOERROR; }
STDMETHODIMP CSmtpAdminDomain::put_IsDefault ( BOOL fIsDefault ) { return E_NOTIMPL; }
STDMETHODIMP CSmtpAdminDomain::get_IsLocal ( BOOL * pfIsLocal ) { return E_NOTIMPL; }
STDMETHODIMP CSmtpAdminDomain::put_IsLocal ( BOOL fIsLocal ) { return E_NOTIMPL; }
// if local
STDMETHODIMP CSmtpAdminDomain::get_LDAPServer ( BSTR * pstrLDAPServer ) { return E_NOTIMPL; //return StdPropertyGet ( m_strLDAPServer, pstrLDAPServer );
}
STDMETHODIMP CSmtpAdminDomain::put_LDAPServer ( BSTR strLDAPServer ) { return E_NOTIMPL; //return StdPropertyPut ( &m_strLDAPServer, strLDAPServer );
}
STDMETHODIMP CSmtpAdminDomain::get_Account ( BSTR * pstrAccount ) { return E_NOTIMPL; //return StdPropertyGet ( m_strAccount, pstrAccount );
}
STDMETHODIMP CSmtpAdminDomain::put_Account ( BSTR strAccount ) { return E_NOTIMPL; //return StdPropertyPut ( &m_strAccount, strAccount );
}
STDMETHODIMP CSmtpAdminDomain::get_Password ( BSTR * pstrPassword ) { return E_NOTIMPL; //return StdPropertyGet ( m_strPassword, pstrPassword );
}
STDMETHODIMP CSmtpAdminDomain::put_Password ( BSTR strPassword ) { return E_NOTIMPL; //return StdPropertyPut ( &m_strPassword, strPassword );
}
STDMETHODIMP CSmtpAdminDomain::get_LDAPContainer ( BSTR * pstrLDAPContainer ) { return E_NOTIMPL; //return StdPropertyGet ( m_strLDAPContainer, pstrLDAPContainer );
}
STDMETHODIMP CSmtpAdminDomain::put_LDAPContainer ( BSTR strLDAPContainer ) { return E_NOTIMPL; //return StdPropertyPut ( &m_strLDAPContainer, strLDAPContainer );
}
// if remote
STDMETHODIMP CSmtpAdminDomain::get_UseSSL ( BOOL * pfUseSSL ) { return E_NOTIMPL; }
STDMETHODIMP CSmtpAdminDomain::put_UseSSL ( BOOL fUseSSL ) { return E_NOTIMPL; }
STDMETHODIMP CSmtpAdminDomain::get_EnableETRN ( BOOL * pfEnableETRN ) { return E_NOTIMPL; }
STDMETHODIMP CSmtpAdminDomain::put_EnableETRN ( BOOL fEnableETRN ) { return E_NOTIMPL; }
STDMETHODIMP CSmtpAdminDomain::get_DropDir ( BSTR * pstrDropDir ) { return StdPropertyGet ( m_strActionString, pstrDropDir ); }
STDMETHODIMP CSmtpAdminDomain::put_DropDir ( BSTR strDropDir ) { return StdPropertyPut ( &m_strActionString, strDropDir ); }
STDMETHODIMP CSmtpAdminDomain::get_RoutingDomain ( BSTR * pstrRoutingDomain ) { return StdPropertyGet ( m_strActionString, pstrRoutingDomain ); }
STDMETHODIMP CSmtpAdminDomain::put_RoutingDomain ( BSTR strRoutingDomain ) { return StdPropertyPut ( &m_strActionString, strRoutingDomain ); }
//////////////////////////////////////////////////////////////////////
// Methods:
//////////////////////////////////////////////////////////////////////
STDMETHODIMP CSmtpAdminDomain::Default ( ) { TraceFunctEnter ( "CSmtpAdminDomain::Default" );
m_dwActionType = SMTP_DELIVER; m_fAllowEtrn = FALSE; m_dwDomainId = UNASSIGNED_DOMAIN_ID;
m_strDomainName.Empty(); m_strActionString.Empty();
m_pCurrentDomainEntry = NULL;
TraceFunctLeave (); return NOERROR; }
STDMETHODIMP CSmtpAdminDomain::Add ( ) { TraceFunctEnter ( "CSmtpAdminDomain::Add" );
HRESULT hr = NOERROR; DomainEntry* pOldDef = NULL;
DomainEntry* pNewDomain = new DomainEntry; if( !pNewDomain ) { ErrorTrace ( (LPARAM) this, "Out of memory" ); hr = E_OUTOFMEMORY; goto Exit; }
hr = GetFromMetabase(); if( FAILED(hr) ) { goto Exit; }
lstrcpyW( pNewDomain-> m_strDomainName, (LPCWSTR)m_strDomainName ); lstrcpyW( pNewDomain-> m_strActionString, (LPCWSTR)m_strActionString ); pNewDomain-> m_dwActionType = m_dwActionType; pNewDomain-> m_fAllowEtrn = m_fAllowEtrn;
// deal with default domain
if( m_dwActionType == SMTP_DEFAULT ) { pOldDef = m_pDefaultDomainEntry; pOldDef-> m_dwActionType = pOldDef->m_strActionString[0] ? SMTP_DROP : SMTP_DELIVER;
InsertHeadList( &m_list, &pNewDomain->list ); m_pDefaultDomainEntry = pNewDomain; } else { InsertTailList( &m_list, &pNewDomain->list ); }
hr = SaveToMetabase(); if( FAILED(hr) ) { RemoveEntryList( &pNewDomain->list ); ErrorTrace ( (LPARAM) this, "Failed to remove domain: %x", hr ); delete pNewDomain; goto Exit; }
m_pCurrentDomainEntry = pNewDomain; m_lCount++;
Exit: TraceFunctLeave (); return hr; }
STDMETHODIMP CSmtpAdminDomain::Remove ( ) { TraceFunctEnter ( "CSmtpAdminDomain::Remove" );
HRESULT hr = NOERROR;
// need to call get() first
_ASSERT( m_pCurrentDomainEntry ); _ASSERT( !lstrcmpiW( m_strDomainName, m_pCurrentDomainEntry->m_strDomainName ) );
if( !m_pCurrentDomainEntry || lstrcmpiW( m_strDomainName, m_pCurrentDomainEntry->m_strDomainName ) ) { hr = SmtpCreateException (IDS_SMTPEXCEPTION_DIDNT_CALL_GET); goto Exit; }
//Can't remove default domain
if( m_pCurrentDomainEntry == m_pDefaultDomainEntry ) { hr = SmtpCreateException (IDS_SMTPEXCEPTION_CANT_DEL_DEFAULT_DOMAIN); goto Exit; }
RemoveEntryList( &m_pCurrentDomainEntry->list ); hr = SaveToMetabase();
Exit: TraceFunctLeave (); return hr; }
STDMETHODIMP CSmtpAdminDomain::Get ( ) { TraceFunctEnter ( "CSmtpAdminDomain::Get" );
HRESULT hr = NOERROR;
hr = GetFromMetabase(); if( FAILED(hr) ) { goto Exit; }
// given domain name, find the entry
m_pCurrentDomainEntry = FindDomainEntry( m_strDomainName );
if( !m_pCurrentDomainEntry ) { hr = SmtpCreateException( IDS_SMTPEXCEPTION_INVALID_ADDRESS ); goto Exit; }
LoadDomainProperty( m_pCurrentDomainEntry );
Exit: TraceFunctLeave (); return hr; }
STDMETHODIMP CSmtpAdminDomain::Set ( ) { TraceFunctEnter ( "CSmtpAdminDomain::Set" );
HRESULT hr = NOERROR; DomainEntry* pOldDef = NULL;
// need to call get() first
_ASSERT( m_pCurrentDomainEntry );
if( !m_pCurrentDomainEntry ) { hr = SmtpCreateException (IDS_SMTPEXCEPTION_DIDNT_CALL_GET); goto Exit; }
lstrcpyW( m_pCurrentDomainEntry->m_strDomainName, m_strDomainName ); lstrcpyW( m_pCurrentDomainEntry->m_strActionString, m_strActionString ); m_pCurrentDomainEntry-> m_dwActionType = m_dwActionType; m_pCurrentDomainEntry-> m_fAllowEtrn = m_fAllowEtrn;
// deal with default domain
if( m_dwActionType == SMTP_DEFAULT && m_pDefaultDomainEntry != m_pCurrentDomainEntry ) { pOldDef = m_pDefaultDomainEntry; pOldDef-> m_dwActionType = pOldDef->m_strActionString[0] ? SMTP_DROP : SMTP_DELIVER;
m_pDefaultDomainEntry = m_pCurrentDomainEntry; RemoveEntryList( &m_pCurrentDomainEntry->list ); InsertHeadList( &m_list, &m_pCurrentDomainEntry->list ); }
hr = SaveToMetabase();
Exit: TraceFunctLeave (); return hr; }
STDMETHODIMP CSmtpAdminDomain::Enumerate ( ) { TraceFunctEnter ( "CSmtpAdminDomain::EnumDomains" ); HRESULT hr = NOERROR;
hr = GetFromMetabase(); m_fEnumerated = TRUE;
TraceFunctLeave (); return hr; }
STDMETHODIMP CSmtpAdminDomain::GetNth( long lIndex ) { TraceFunctEnter ( "CSmtpAdminDomain::GetNth" ); HRESULT hr = NOERROR;
PLIST_ENTRY pEntry;
if( !m_fEnumerated ) { hr = SmtpCreateException( IDS_SMTPEXCEPTION_DIDNT_ENUMERATE ); goto Exit; }
if( lIndex < 0 || lIndex >= m_lCount ) { hr = SmtpCreateException( IDS_SMTPEXCEPTION_INVALID_INDEX ); goto Exit; }
pEntry = m_list.Flink; while( lIndex -- ) { pEntry = pEntry-> Flink; _ASSERT( pEntry != &m_list ); }
m_pCurrentDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list); LoadDomainProperty( m_pCurrentDomainEntry );
Exit: TraceFunctLeave (); return hr; }
STDMETHODIMP CSmtpAdminDomain::GetDefaultDomain ( ) { TraceFunctEnter ( "CSmtpAdminDomain::GetDefaultDomain" );
HRESULT hr = NOERROR;
if( !m_pDefaultDomainEntry ) { hr = GetFromMetabase(); if( FAILED(hr) ) { goto Exit; } }
LoadDomainProperty( m_pDefaultDomainEntry );
Exit: TraceFunctLeave (); return hr; }
DomainEntry* CSmtpAdminDomain::FindDomainEntry( LPCWSTR lpName ) { TraceFunctEnter ( "CSmtpAdminDomain::FindDomainEntry" );
DomainEntry* pDomainEntry = NULL; PLIST_ENTRY pHead; PLIST_ENTRY pEntry;
for( pHead=&m_list, pEntry=pHead->Flink; pEntry!=pHead; pEntry=pEntry->Flink ) { pDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list); if( !lstrcmpiW( pDomainEntry->m_strDomainName, lpName ) ) { TraceFunctLeave (); return pDomainEntry; } }
TraceFunctLeave (); return NULL; }
STDMETHODIMP CSmtpAdminDomain::SetAsDefaultDomain ( ) { TraceFunctEnter ( "CSmtpAdminDomain::SetAsDefaultDomain" ); HRESULT hr = NOERROR;
if( !m_pDefaultDomainEntry ) { hr = GetFromMetabase(); if( FAILED(hr) ) { goto Exit; } }
// not in the list
if( m_dwDomainId == UNASSIGNED_DOMAIN_ID ) { hr = Add(); if( FAILED(hr) ) { goto Exit; } }
_ASSERT( m_dwDomainId == m_pCurrentDomainEntry->m_dwDomainId );
m_pDefaultDomainEntry = m_pCurrentDomainEntry;
hr = SaveToMetabase();
Exit: TraceFunctLeave (); return hr; }
BOOL CSmtpAdminDomain::LoadDomainProperty(DomainEntry* pDomainEntry) { TraceFunctEnter ( "CSmtpAdminDomain::LoadDomainProperty" ); _ASSERT( pDomainEntry );
m_strDomainName = pDomainEntry-> m_strDomainName; m_dwActionType = pDomainEntry-> m_dwActionType;
m_strActionString = pDomainEntry-> m_strActionString; m_fAllowEtrn = pDomainEntry-> m_fAllowEtrn; m_dwDomainId = pDomainEntry-> m_dwDomainId;
m_pCurrentDomainEntry = pDomainEntry;
TraceFunctLeave (); return TRUE; }
BOOL CSmtpAdminDomain::ConstructListFromMetabaseValues() { TraceFunctEnter ( "CSmtpAdminDomain::ConstructListFromMetabaseValues" );
DomainEntry* pDomainEntry; TCHAR* pCh; TCHAR* wszCurrent;
DWORD i; DWORD cCount = m_mszDomainRouting.Count( );
EmptyList(); m_lCount = 0;
pCh = (TCHAR*)(LPCWSTR)m_mszDomainRouting;
for( wszCurrent = pCh, i = 0; i < cCount; i++, wszCurrent += lstrlen (wszCurrent) + 1 ) { pDomainEntry = new DomainEntry; if( NULL == pDomainEntry ) { goto Exit; }
pDomainEntry-> FromString( wszCurrent ); InsertHeadList( &m_list, &pDomainEntry->list ); }
m_lCount += cCount;
if( !m_strDefaultDomain.m_str || !m_strDefaultDomain.m_str[0] ) { _ASSERT( FALSE ); goto Exit; }
m_pDefaultDomainEntry = new DomainEntry; if( NULL == m_pDefaultDomainEntry ) { goto Exit; }
lstrcpy( m_pDefaultDomainEntry-> m_strDomainName, m_strDefaultDomain.m_str );
if( !m_strDropDir ) { m_pDefaultDomainEntry-> m_strActionString[0] = _T('\0'); } else { lstrcpy( m_pDefaultDomainEntry-> m_strActionString, m_strDropDir.m_str ); }
m_pDefaultDomainEntry-> m_dwActionType = SMTP_DEFAULT;
InsertHeadList( &m_list, &m_pDefaultDomainEntry->list ); m_lCount ++;
Exit: TraceFunctLeave (); return TRUE; }
BOOL CSmtpAdminDomain::ParseListToMetabaseValues() // called by SaveData()
{ TraceFunctEnter ( "CSmtpAdminDomain::ParseListToMetabaseValues" );
BOOL fRet = TRUE;
// change string list to multisz
DomainEntry* pDomainEntry = NULL; PLIST_ENTRY pHead; PLIST_ENTRY pEntry; DWORD cb = 0; WCHAR* pBuf; WCHAR* p;
// the first one is default domain
_ASSERT( CONTAINING_RECORD( m_list.Flink, DomainEntry, list ) == m_pDefaultDomainEntry );
for( pHead=&m_list, pEntry=pHead->Flink->Flink; pEntry!=pHead; pEntry=pEntry->Flink ) { pDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list); cb += lstrlenW( pDomainEntry-> m_strDomainName ); cb += lstrlenW( pDomainEntry-> m_strActionString ); cb += sizeof(DWORD)*2; cb += 10; // 4 commas and NULL
}
// two more NULL's
cb += 4; pBuf = new WCHAR[cb];
if( !pBuf ) { ErrorTrace ( (LPARAM) this, "Out of memory" ); fRet = FALSE; goto Exit; }
p = pBuf;
// Note: the first entry is the default domain
for( pHead=&m_list, pEntry=pHead->Flink->Flink; pEntry!=pHead; pEntry=pEntry->Flink ) { pDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list); pDomainEntry->ToString( p );
p += lstrlenW(p); p ++; }
// add two more NULL
*p = L'\0'; *(p+1) = L'\0';
m_mszDomainRouting.Empty(); m_mszDomainRouting.Attach( pBuf );
Exit: TraceFunctLeave (); return fRet; }
HRESULT CSmtpAdminDomain::GetFromMetabase() { TraceFunctEnter ( "CSmtpAdminDomain::GetFromMetabase" );
HRESULT hr = NOERROR; BOOL fRet = TRUE; CComPtr<IMSAdminBase> pmetabase;
TCHAR szPath[METADATA_MAX_NAME_LEN+2] = {0}; TCHAR szDropDir[256] = {0}; TCHAR szBuf[256] = {0};
hr = m_mbFactory.GetMetabaseObject ( m_iadsImpl.QueryComputer(), &pmetabase ); if ( FAILED(hr) ) { return hr; }
CMetabaseKey hMB( pmetabase ); GetMDInstancePath( szPath, m_iadsImpl.QueryInstance() );
hr = hMB.Open( szPath, METADATA_PERMISSION_READ ); if( FAILED(hr) ) { hr = SmtpCreateExceptionFromWin32Error( GetLastError() ); goto Exit; }
m_strDefaultDomain.Empty(); m_strDropDir.Empty(); m_mszDomainRouting.Empty();
fRet = StdGetMetabaseProp ( &hMB, MD_DOMAIN_ROUTING, DEFAULT_DOMAIN_ROUTING, &m_mszDomainRouting); fRet = StdGetMetabaseProp ( &hMB, MD_DEFAULT_DOMAIN_VALUE, DEFAULT_DEFAULT_DOMAIN, &m_strDefaultDomain ) && fRet; fRet = StdGetMetabaseProp ( &hMB, MD_MAIL_DROP_DIR, DEFAULT_DROP_DIR, &m_strDropDir ) && fRet;
if( !fRet ) { hr = SmtpCreateExceptionFromWin32Error( GetLastError() ); goto Exit; }
ConstructListFromMetabaseValues();
Exit: TraceFunctLeave (); return hr; }
HRESULT CSmtpAdminDomain::SaveToMetabase() { TraceFunctEnter ( "CSmtpAdminDomain::SaveToMetabase" );
ParseListToMetabaseValues();
// these two are for default domain,
// default domain needs special care,
// by default, it's computed by smtpsvc from TCP/IP configuration,
// don't set this key if not changed
BOOL fDefChanged = FALSE; BOOL fDropChanged = FALSE;
_ASSERT( m_pDefaultDomainEntry && m_pDefaultDomainEntry-> m_dwActionType == SMTP_DEFAULT ); if( m_pDefaultDomainEntry ) { fDefChanged = lstrcmpiW( m_strDefaultDomain, m_pDefaultDomainEntry-> m_strDomainName ); fDropChanged = lstrcmpiW( m_strActionString, m_pDefaultDomainEntry-> m_strActionString );
if( fDefChanged ) { m_strDefaultDomain.Empty(); m_strDefaultDomain = m_pDefaultDomainEntry-> m_strDomainName; }
if( fDropChanged ) { m_strDropDir.Empty(); m_strDropDir = m_pDefaultDomainEntry-> m_strActionString; } }
HRESULT hr = NOERROR; BOOL fRet = TRUE;
CComPtr<IMSAdminBase> pmetabase;
TCHAR szPath[METADATA_MAX_NAME_LEN+2] = {0}; TCHAR szDropDir[256] = {0}; TCHAR szBuf[256] = {0};
hr = m_mbFactory.GetMetabaseObject ( m_iadsImpl.QueryComputer(), &pmetabase ); if ( FAILED(hr) ) { return hr; }
CMetabaseKey hMB( pmetabase ); GetMDInstancePath( szPath, m_iadsImpl.QueryInstance() );
hr = hMB.Open( szPath, METADATA_PERMISSION_WRITE ); if( FAILED(hr) ) { hr = SmtpCreateExceptionFromWin32Error( GetLastError() ); goto Exit; }
if( fDefChanged ) { fRet = StdPutMetabaseProp ( &hMB, MD_DEFAULT_DOMAIN_VALUE, m_pDefaultDomainEntry-> m_strDomainName ) && fRet; }
if( fDropChanged ) { fRet = StdPutMetabaseProp ( &hMB, MD_MAIL_DROP_DIR, m_pDefaultDomainEntry-> m_strActionString ) && fRet; }
fRet = StdPutMetabaseProp ( &hMB, MD_DOMAIN_ROUTING, &m_mszDomainRouting) && fRet;
if( !fRet ) { hr = SmtpCreateExceptionFromWin32Error( GetLastError() ); goto Exit; }
// hr = hMB.Close();
// BAIL_ON_FAILURE(hr);
hMB.Close();
hr = pmetabase-> SaveData(); BAIL_ON_FAILURE(hr);
Exit: TraceFunctLeave (); return hr; }
BOOL DomainEntry::FromString( LPCTSTR lpDomainString ) { TraceFunctEnter ( "DomainEntry::FromString" );
TCHAR szT[256] = {0};
WCHAR* pCh = (WCHAR*)lpDomainString; WCHAR* pT;
m_dwDomainId = UNASSIGNED_DOMAIN_ID; m_fAllowEtrn = FALSE;
ZeroMemory( szT, sizeof(szT) ); pT = szT; while( *pCh ) //
{ if( iswdigit( *pCh ) ) { *pT++ = *pCh; pCh ++; continue; }
if( *pCh == ',' ) { pCh ++; break; }
return FALSE; }
if( !*pCh ) return FALSE;
m_dwActionType = (DWORD) _wtoi( szT );
/*
if( m_dwActionType >= LAST_SMTP_ACTION ) { _ASSERT( FALSE ); m_dwActionType = SMTP_DROP; // assume local drop domain
} */
ZeroMemory( m_strDomainName, sizeof(m_strDomainName) ); pT = m_strDomainName; while( *pCh ) { if( *pCh == ',' ) { pCh ++; break; }
*pT++ = *pCh++; }
if( !*pCh ) return FALSE;
ZeroMemory( m_strActionString, sizeof(m_strActionString) ); pT = m_strActionString; while( *pCh ) { if( *pCh == ',' ) { pCh ++; break; }
*pT++ = *pCh++; }
if( !*pCh ) return FALSE;
ZeroMemory( szT, sizeof(szT) ); pT = szT; while( *pCh ) //
{ if( iswdigit( *pCh ) ) { *pT++ = *pCh; pCh ++; continue; }
if( *pCh == ',' ) { pCh ++; break; }
return FALSE; }
m_fAllowEtrn = !! ((DWORD) _wtoi( szT ));
if( !*pCh ) { return FALSE; }
ZeroMemory( szT, sizeof(szT) ); pT = szT; while( *pCh ) //
{ if( iswdigit( *pCh ) ) { *pT++ = *pCh; pCh ++; continue; }
if( *pCh == ',' ) { pCh ++; break; }
return FALSE; }
m_dwDomainId = (DWORD) _wtoi( szT );
// ignore any other chars
TraceFunctLeave (); return TRUE; }
BOOL DomainEntry::ToString( LPTSTR lpDomainString ) { TraceFunctEnter ( "DomainEntry::FromString" );
wsprintfW( lpDomainString, L"%d,%s,%s,%d",m_dwActionType, m_strDomainName, m_strActionString, m_fAllowEtrn);
TraceFunctLeave (); return TRUE; }
|