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

280 lines
8.7 KiB
C++

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
rtsrc.h
Abstract:
Implementation of IRoutingSource interface
Author:
Fei Su (feisu) 9/22/97 Created.
Revision History:
--*/
#include "stdafx.h"
#include "smtpadm.h"
#include "smtpprop.h"
#include "rtsrc.h"
#include "oleutil.h"
#include "metautil.h"
// Must define THIS_FILE_* macros to use SmtpCreateException()
#define THIS_FILE_HELP_CONTEXT 0
#define THIS_FILE_PROG_ID _T("Smtpadm.VirtualServer.1")
#define THIS_FILE_IID IID_IRoutingSource
#define RS_RELATIVE_NAME _T("RoutingSources")
#define ID_DS_TYPE 0
#define ID_DS_DATA_DIRECTORY 1
#define ID_DS_DEFAULT_MAIL_ROOT 2
#define ID_DS_BIND_TYPE 3
#define ID_DS_SCHEMA_TYPE 4
#define ID_DS_HOST 5
#define ID_DS_NAMING_CONTEXT 6
#define ID_DS_ACCOUNT 7
#define ID_DS_PASSWORD 8
#define DEFAULT_DS_TYPE _T("LDAP")
#define DEFAULT_DS_DATA_DIRECTORY _T("")
#define DEFAULT_DS_DEFAULT_MAIL_ROOT _T("/Mailbox")
#define DEFAULT_DS_BIND_TYPE _T("None")
#define DEFAULT_DS_SCHEMA_TYPE _T("Exchange5")
#define DEFAULT_DS_HOST _T("")
#define DEFAULT_DS_NAMING_CONTEXT _T("")
#define DEFAULT_DS_ACCOUNT _T("")
#define DEFAULT_DS_PASSWORD _T("")
/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CRoutingSource::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IRoutingSource,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
//////////////////////////////////////////////////////////////////////
// Properties:
//////////////////////////////////////////////////////////////////////
STDMETHODIMP CRoutingSource::get_Type( BSTR * pstrType )
{
return StdPropertyGet ( m_strType, pstrType );
}
STDMETHODIMP CRoutingSource::put_Type( BSTR strType )
{
return StdPropertyPut ( &m_strType, strType, &m_dwFC, BitMask(ID_DS_TYPE));
}
STDMETHODIMP CRoutingSource::get_DataDirectory( BSTR * pstrDataDirectory )
{
return StdPropertyGet ( m_strDataDirectory, pstrDataDirectory );
}
STDMETHODIMP CRoutingSource::put_DataDirectory( BSTR strDataDirectory )
{
return StdPropertyPut ( &m_strDataDirectory, strDataDirectory, &m_dwFC, BitMask(ID_DS_DATA_DIRECTORY) );
}
STDMETHODIMP CRoutingSource::get_DefaultMailRoot( BSTR * pstrDefaultMailRoot )
{
return StdPropertyGet ( m_strDefaultMailroot, pstrDefaultMailRoot );
}
STDMETHODIMP CRoutingSource::put_DefaultMailRoot( BSTR strDefaultMailRoot )
{
return StdPropertyPut ( &m_strDefaultMailroot, strDefaultMailRoot, &m_dwFC, BitMask(ID_DS_DEFAULT_MAIL_ROOT) );
}
STDMETHODIMP CRoutingSource::get_BindType( BSTR * pstrBindType )
{
return StdPropertyGet ( m_strBindType, pstrBindType );
}
STDMETHODIMP CRoutingSource::put_BindType( BSTR strBindType )
{
return StdPropertyPut ( &m_strBindType, strBindType, &m_dwFC, BitMask(ID_DS_BIND_TYPE) );
}
STDMETHODIMP CRoutingSource::get_SchemaType( BSTR * pstrSchemaType )
{
return StdPropertyGet ( m_strSchemaType, pstrSchemaType );
}
STDMETHODIMP CRoutingSource::put_SchemaType( BSTR strSchemaType )
{
return StdPropertyPut ( &m_strSchemaType, strSchemaType, &m_dwFC, BitMask(ID_DS_SCHEMA_TYPE) );
}
STDMETHODIMP CRoutingSource::get_Host( BSTR * pstrHost )
{
return StdPropertyGet ( m_strHost, pstrHost );
}
STDMETHODIMP CRoutingSource::put_Host( BSTR strHost )
{
return StdPropertyPut ( &m_strHost, strHost, &m_dwFC, BitMask(ID_DS_HOST) );
}
STDMETHODIMP CRoutingSource::get_NamingContext( BSTR * pstrNamingContext )
{
return StdPropertyGet ( m_strNamingContext, pstrNamingContext );
}
STDMETHODIMP CRoutingSource::put_NamingContext( BSTR strNamingContext )
{
return StdPropertyPut ( &m_strNamingContext, strNamingContext, &m_dwFC, BitMask(ID_DS_NAMING_CONTEXT) );
}
STDMETHODIMP CRoutingSource::get_Account( BSTR * pstrAccount )
{
return StdPropertyGet ( m_strAccount, pstrAccount );
}
STDMETHODIMP CRoutingSource::put_Account( BSTR strAccount )
{
return StdPropertyPut ( &m_strAccount, strAccount, &m_dwFC, BitMask(ID_DS_ACCOUNT) );
}
STDMETHODIMP CRoutingSource::get_Password( BSTR * pstrPassword )
{
return StdPropertyGet ( m_strPassword, pstrPassword );
}
STDMETHODIMP CRoutingSource::put_Password( BSTR strPassword )
{
return StdPropertyPut ( &m_strPassword, strPassword, &m_dwFC, BitMask(ID_DS_PASSWORD) );
}
///////////////////////////////////////////////////////////////////
// Get / Set methods (internal)
///////////////////////////////////////////////////////////////////
HRESULT CRoutingSource::Get(CMetabaseKey * pMBVirtualServer)
{
TraceFunctEnter ( "CRoutingSource::Get" );
HRESULT hr = NOERROR;
if( !pMBVirtualServer )
BAIL_WITH_FAILURE(hr, E_POINTER);
if( !StdGetMetabaseProp(pMBVirtualServer, MD_SMTP_DS_TYPE, DEFAULT_DS_TYPE, &m_strType, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( !StdGetMetabaseProp(pMBVirtualServer, MD_SMTP_DS_DATA_DIRECTORY, DEFAULT_DS_DATA_DIRECTORY, &m_strDataDirectory, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( !StdGetMetabaseProp(pMBVirtualServer, MD_SMTP_DS_DEFAULT_MAIL_ROOT, DEFAULT_DS_DEFAULT_MAIL_ROOT, &m_strDefaultMailroot, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( !StdGetMetabaseProp(pMBVirtualServer, MD_SMTP_DS_BIND_TYPE, DEFAULT_DS_BIND_TYPE, &m_strBindType, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( !StdGetMetabaseProp(pMBVirtualServer, MD_SMTP_DS_SCHEMA_TYPE, DEFAULT_DS_SCHEMA_TYPE, &m_strSchemaType, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( !StdGetMetabaseProp(pMBVirtualServer, MD_SMTP_DS_HOST, DEFAULT_DS_HOST, &m_strHost, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( !StdGetMetabaseProp(pMBVirtualServer, MD_SMTP_DS_NAMING_CONTEXT, DEFAULT_DS_NAMING_CONTEXT, &m_strNamingContext, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( !StdGetMetabaseProp(pMBVirtualServer, MD_SMTP_DS_ACCOUNT, DEFAULT_DS_ACCOUNT, &m_strAccount, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( !StdGetMetabaseProp(pMBVirtualServer, MD_SMTP_DS_PASSWORD, DEFAULT_DS_PASSWORD, &m_strPassword, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
Exit:
TraceFunctLeave ();
return hr;
}
HRESULT CRoutingSource::Set(CMetabaseKey * pMBVirtualServer)
{
TraceFunctEnter ( "CRoutingSource::Set" );
HRESULT hr = NOERROR;
if( !pMBVirtualServer )
BAIL_WITH_FAILURE(hr, E_POINTER);
if( IS_FLAG_SET(m_dwFC, BitMask(ID_DS_TYPE)) &&
!StdPutMetabaseProp(pMBVirtualServer, MD_SMTP_DS_TYPE, m_strType, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( IS_FLAG_SET(m_dwFC, BitMask(ID_DS_DATA_DIRECTORY)) &&
!StdPutMetabaseProp(pMBVirtualServer, MD_SMTP_DS_DATA_DIRECTORY, m_strDataDirectory, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( IS_FLAG_SET(m_dwFC, BitMask(ID_DS_DEFAULT_MAIL_ROOT)) &&
!StdPutMetabaseProp(pMBVirtualServer, MD_SMTP_DS_DEFAULT_MAIL_ROOT, m_strDefaultMailroot, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( IS_FLAG_SET(m_dwFC, BitMask(ID_DS_BIND_TYPE)) &&
!StdPutMetabaseProp(pMBVirtualServer, MD_SMTP_DS_BIND_TYPE, m_strBindType, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( IS_FLAG_SET(m_dwFC, BitMask(ID_DS_SCHEMA_TYPE)) &&
!StdPutMetabaseProp(pMBVirtualServer, MD_SMTP_DS_SCHEMA_TYPE, m_strSchemaType, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( IS_FLAG_SET(m_dwFC, BitMask(ID_DS_HOST)) &&
!StdPutMetabaseProp(pMBVirtualServer, MD_SMTP_DS_HOST, m_strHost, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( IS_FLAG_SET(m_dwFC, BitMask(ID_DS_NAMING_CONTEXT)) &&
!StdPutMetabaseProp(pMBVirtualServer, MD_SMTP_DS_NAMING_CONTEXT, m_strNamingContext, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( IS_FLAG_SET(m_dwFC, BitMask(ID_DS_ACCOUNT)) &&
!StdPutMetabaseProp(pMBVirtualServer, MD_SMTP_DS_ACCOUNT, m_strAccount, RS_RELATIVE_NAME) )
BAIL_WITH_FAILURE(hr, GetLastError());
if( IS_FLAG_SET(m_dwFC, BitMask(ID_DS_PASSWORD)) &&
!StdPutMetabaseProp(pMBVirtualServer, MD_SMTP_DS_PASSWORD, m_strPassword, RS_RELATIVE_NAME, IIS_MD_UT_SERVER, METADATA_SECURE | METADATA_INHERIT) )
BAIL_WITH_FAILURE(hr, GetLastError());
Exit:
TraceFunctLeave ();
return hr;
}