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

964 lines
22 KiB
C++

// feeds.cpp : Implementation of CnntpadmApp and DLL registration.
#include "stdafx.h"
#include "nntpcmn.h"
#include "feeds.h"
#include "oleutil.h"
#include "nntptype.h"
#include "nntpapi.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.Feeds.1")
#define THIS_FILE_IID IID_INntpAdminFeeds
/////////////////////////////////////////////////////////////////////////////
// Defaults:
#define DEFAULT_FEED_ID 0
#define DEFAULT_FEED_SERVER _T("")
#define DEFAULT_PULL_NEWS_DATE 0
#define DEFAULT_START_TIME 0
#define DEFAULT_FEED_INTERVAL 15
#define DEFAULT_AUTO_CREATE TRUE
#define DEFAULT_ENABLED TRUE
#define DEFAULT_MAX_CONNECTIONS_ATTEMPTS 10
#define DEFAULT_SECURITY_TYPE 0
#define DEFAULT_AUTH_TYPE AUTH_PROTOCOL_NONE
#define DEFAULT_ACCOUNT_NAME _T("")
#define DEFAULT_PASSWORD _T("")
#define DEFAULT_ALLOW_CONTROL_MESSAGES TRUE
#define DEFAULT_UUCP_NAME _T("")
#define DEFAULT_NEWSGROUPS _T("\0")
#define DEFAULT_DISTRIBUTION _T("world\0")
/////////////////////////////////////////////////////////////////////////////
//
//
// Use a macro to define all the default methods
//
DECLARE_METHOD_IMPLEMENTATION_FOR_STANDARD_EXTENSION_INTERFACES(NntpAdminFeeds, CNntpAdminFeeds, IID_INntpAdminFeeds)
STDMETHODIMP CNntpOneWayFeed::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_INntpOneWayFeed,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
CNntpOneWayFeed::CNntpOneWayFeed ()
// CComBSTR's are initialized to NULL by default.
{
// InitAsyncTrace ( );
}
CNntpOneWayFeed::~CNntpOneWayFeed ()
{
// All CComBSTR's are freed automatically.
// TermAsyncTrace ( );
}
STDMETHODIMP CNntpOneWayFeed::get_FeedId ( long * plFeedId )
{
return StdPropertyGet ( m_feed.m_dwFeedId, plFeedId );
}
STDMETHODIMP CNntpOneWayFeed::get_RemoteServer ( BSTR * pstrRemoteServer )
{
return StdPropertyGet ( m_feed.m_strRemoteServer, pstrRemoteServer );
}
STDMETHODIMP CNntpOneWayFeed::get_FeedAction ( NNTP_FEED_ACTION * pfeedaction )
{
return m_feed.get_FeedAction ( pfeedaction );
}
STDMETHODIMP CNntpOneWayFeed::put_FeedAction ( NNTP_FEED_ACTION feedaction )
{
return m_feed.put_FeedAction ( feedaction );
}
STDMETHODIMP CNntpOneWayFeed::get_UucpName ( BSTR * pstrUucpName )
{
return StdPropertyGet ( m_feed.m_strUucpName, pstrUucpName );
}
STDMETHODIMP CNntpOneWayFeed::put_UucpName ( BSTR strUucpName )
{
return StdPropertyPut ( &m_feed.m_strUucpName, strUucpName );
}
STDMETHODIMP CNntpOneWayFeed::get_PullNewsDate ( DATE * pdatePullNews )
{
return StdPropertyGet ( m_feed.m_datePullNews, pdatePullNews );
}
STDMETHODIMP CNntpOneWayFeed::put_PullNewsDate ( DATE datePullNews )
{
return StdPropertyPut ( &m_feed.m_datePullNews, datePullNews );
}
STDMETHODIMP CNntpOneWayFeed::get_FeedInterval ( long * plFeedInterval )
{
return StdPropertyGet ( m_feed.m_dwFeedInterval, plFeedInterval );
}
STDMETHODIMP CNntpOneWayFeed::put_FeedInterval ( long lFeedInterval )
{
return StdPropertyPut ( &m_feed.m_dwFeedInterval, lFeedInterval );
}
STDMETHODIMP CNntpOneWayFeed::get_AutoCreate ( BOOL * pfAutoCreate )
{
return StdPropertyGet ( m_feed.m_fCreateAutomatically, pfAutoCreate );
}
STDMETHODIMP CNntpOneWayFeed::put_AutoCreate ( BOOL fAutoCreate )
{
return StdPropertyPut ( &m_feed.m_fCreateAutomatically, fAutoCreate );
}
STDMETHODIMP CNntpOneWayFeed::get_Enabled ( BOOL * pfEnabled )
{
return StdPropertyGet ( m_feed.m_fEnabled, pfEnabled );
}
STDMETHODIMP CNntpOneWayFeed::put_Enabled ( BOOL fEnabled )
{
return StdPropertyPut ( &m_feed.m_fEnabled, fEnabled );
}
STDMETHODIMP CNntpOneWayFeed::get_MaxConnectionAttempts ( long * plMaxConnectionAttempts )
{
return StdPropertyGet ( m_feed.m_dwMaxConnectionAttempts, plMaxConnectionAttempts );
}
STDMETHODIMP CNntpOneWayFeed::put_MaxConnectionAttempts ( long lMaxConnectionAttempts )
{
return StdPropertyPut ( &m_feed.m_dwMaxConnectionAttempts, lMaxConnectionAttempts );
}
STDMETHODIMP CNntpOneWayFeed::get_SecurityType ( long * plSecurityType )
{
return StdPropertyGet ( m_feed.m_dwSecurityType, plSecurityType );
}
STDMETHODIMP CNntpOneWayFeed::put_SecurityType ( long lSecurityType )
{
return StdPropertyPut ( &m_feed.m_dwSecurityType, lSecurityType );
}
STDMETHODIMP CNntpOneWayFeed::get_AuthenticationType ( long * plAuthenticationType )
{
return StdPropertyGet ( m_feed.m_dwAuthenticationType, plAuthenticationType );
}
STDMETHODIMP CNntpOneWayFeed::put_AuthenticationType ( long lAuthenticationType )
{
return StdPropertyPut ( &m_feed.m_dwAuthenticationType, lAuthenticationType );
}
STDMETHODIMP CNntpOneWayFeed::get_AccountName ( BSTR * pstrAccountName )
{
return StdPropertyGet ( m_feed.m_strAccountName, pstrAccountName );
}
STDMETHODIMP CNntpOneWayFeed::put_AccountName ( BSTR strAccountName )
{
return StdPropertyPut ( &m_feed.m_strAccountName, strAccountName );
}
STDMETHODIMP CNntpOneWayFeed::get_Password ( BSTR * pstrPassword )
{
return StdPropertyGet ( m_feed.m_strPassword, pstrPassword );
}
STDMETHODIMP CNntpOneWayFeed::put_Password ( BSTR strPassword )
{
return StdPropertyPut ( &m_feed.m_strPassword, strPassword );
}
STDMETHODIMP CNntpOneWayFeed::get_AllowControlMessages ( BOOL * pfAllowControlMessages )
{
return StdPropertyGet ( m_feed.m_fAllowControlMessages, pfAllowControlMessages );
}
STDMETHODIMP CNntpOneWayFeed::put_AllowControlMessages ( BOOL fAllowControlMessages )
{
return StdPropertyPut ( &m_feed.m_fAllowControlMessages, fAllowControlMessages );
}
STDMETHODIMP CNntpOneWayFeed::get_OutgoingPort ( long * plOutgoingPort )
{
return StdPropertyGet ( m_feed.m_dwOutgoingPort, plOutgoingPort );
}
STDMETHODIMP CNntpOneWayFeed::put_OutgoingPort ( long lOutgoingPort )
{
return StdPropertyPut ( &m_feed.m_dwOutgoingPort, lOutgoingPort );
}
STDMETHODIMP CNntpOneWayFeed::get_Newsgroups ( SAFEARRAY ** ppsastrNewsgroups )
{
return StdPropertyGet ( &m_feed.m_mszNewsgroups, ppsastrNewsgroups );
}
STDMETHODIMP CNntpOneWayFeed::put_Newsgroups ( SAFEARRAY * psastrNewsgroups )
{
return StdPropertyPut ( &m_feed.m_mszNewsgroups, psastrNewsgroups );
}
STDMETHODIMP CNntpOneWayFeed::get_NewsgroupsVariant ( SAFEARRAY ** ppsavarNewsgroups )
{
HRESULT hr;
SAFEARRAY * psastrNewsgroups = NULL;
hr = get_Newsgroups ( &psastrNewsgroups );
if ( FAILED(hr) ) {
goto Exit;
}
hr = StringArrayToVariantArray ( psastrNewsgroups, ppsavarNewsgroups );
Exit:
if ( psastrNewsgroups ) {
SafeArrayDestroy ( psastrNewsgroups );
}
return hr;
}
STDMETHODIMP CNntpOneWayFeed::put_NewsgroupsVariant ( SAFEARRAY * psavarNewsgroups )
{
HRESULT hr;
SAFEARRAY * psastrNewsgroups = NULL;
hr = VariantArrayToStringArray ( psavarNewsgroups, &psastrNewsgroups );
if ( FAILED(hr) ) {
goto Exit;
}
hr = put_Newsgroups ( psastrNewsgroups );
Exit:
if ( psastrNewsgroups ) {
SafeArrayDestroy ( psastrNewsgroups );
}
return hr;
}
STDMETHODIMP CNntpOneWayFeed::get_Distributions ( SAFEARRAY ** ppsastrDistributions )
{
return StdPropertyGet ( &m_feed.m_mszDistributions, ppsastrDistributions );
}
STDMETHODIMP CNntpOneWayFeed::put_Distributions ( SAFEARRAY * psastrDistributions )
{
return StdPropertyPut ( &m_feed.m_mszDistributions, psastrDistributions );
}
STDMETHODIMP CNntpOneWayFeed::get_TempDirectory ( BSTR * pstrTempDirectory )
{
return StdPropertyGet ( m_feed.m_strTempDirectory, pstrTempDirectory );
}
STDMETHODIMP CNntpOneWayFeed::put_TempDirectory ( BSTR strTempDirectory )
{
return StdPropertyPut ( &m_feed.m_strTempDirectory, strTempDirectory );
}
STDMETHODIMP CNntpOneWayFeed::Default ( )
{
TraceFunctEnter ( "CNntpOneWayFeed::Default" );
SYSTEMTIME st;
DATE dateToday;
GetSystemTime ( &st );
SystemTimeToVariantTime ( &st, &dateToday );
m_feed.m_dwFeedId = DEFAULT_FEED_ID;
m_feed.m_strRemoteServer = DEFAULT_FEED_SERVER;
m_feed.m_dwFeedInterval = DEFAULT_FEED_INTERVAL;
m_feed.m_fCreateAutomatically = DEFAULT_AUTO_CREATE;
m_feed.m_fEnabled = DEFAULT_ENABLED;
m_feed.m_dwMaxConnectionAttempts = DEFAULT_MAX_CONNECTIONS_ATTEMPTS;
m_feed.m_dwSecurityType = DEFAULT_SECURITY_TYPE;
m_feed.m_dwAuthenticationType = DEFAULT_AUTH_TYPE;
m_feed.m_strAccountName = DEFAULT_ACCOUNT_NAME;
m_feed.m_strPassword = DEFAULT_PASSWORD;
m_feed.m_fAllowControlMessages = DEFAULT_ALLOW_CONTROL_MESSAGES;
m_feed.m_strUucpName = DEFAULT_UUCP_NAME;
m_feed.m_dwOutgoingPort = 119;
m_feed.m_mszNewsgroups = DEFAULT_NEWSGROUPS;
m_feed.m_mszDistributions = DEFAULT_DISTRIBUTION;
m_feed.m_datePullNews = dateToday;
if ( !m_feed.CheckValid() ) {
TraceFunctLeave ();
return E_OUTOFMEMORY;
}
TraceFunctLeave ();
return NOERROR;
}
/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CNntpFeed::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_INntpFeed,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
CNntpFeed::CNntpFeed () :
m_type ( NNTP_FEED_TYPE_PEER )
// CComBSTR's are initialized to NULL by default.
{
// InitAsyncTrace ( );
}
CNntpFeed::~CNntpFeed ()
{
// All CComBSTR's are freed automatically.
// TermAsyncTrace ( );
}
STDMETHODIMP CNntpFeed::get_RemoteServer ( BSTR * pstrRemoteServer )
{
return StdPropertyGet ( m_strRemoteServer, pstrRemoteServer );
}
STDMETHODIMP CNntpFeed::put_RemoteServer ( BSTR strRemoteServer )
{
return StdPropertyPut ( &m_strRemoteServer, strRemoteServer );
}
STDMETHODIMP CNntpFeed::get_FeedType ( NNTP_FEED_SERVER_TYPE * pfeedtype )
{
*pfeedtype = m_type;
return NOERROR;
}
STDMETHODIMP CNntpFeed::put_FeedType ( NNTP_FEED_SERVER_TYPE feedtype )
{
switch ( feedtype ) {
case NNTP_FEED_TYPE_PEER:
case NNTP_FEED_TYPE_MASTER:
case NNTP_FEED_TYPE_SLAVE:
m_type = feedtype;
return NOERROR;
break;
default:
return RETURNCODETOHRESULT ( ERROR_INVALID_PARAMETER );
break;
}
}
STDMETHODIMP CNntpFeed::get_HasInbound ( BOOL * pfHasInbound )
{
*pfHasInbound = m_pInbound != NULL;
return NOERROR;
}
STDMETHODIMP CNntpFeed::get_HasOutbound ( BOOL * pfHasOutbound )
{
*pfHasOutbound = m_pOutbound != NULL;
return NOERROR;
}
STDMETHODIMP CNntpFeed::get_InboundFeed ( INntpOneWayFeed ** ppFeed )
{
HRESULT hr = NOERROR;
*ppFeed = NULL;
if ( m_pInbound ) {
hr = m_pInbound->QueryInterface ( IID_INntpOneWayFeed, (void **) ppFeed );
return hr;
}
return E_FAIL;
}
STDMETHODIMP CNntpFeed::get_OutboundFeed ( INntpOneWayFeed ** ppFeed )
{
HRESULT hr = NOERROR;
*ppFeed = NULL;
if ( m_pOutbound ) {
hr = m_pOutbound->QueryInterface ( IID_INntpOneWayFeed, (void **) ppFeed );
return hr;
}
return E_FAIL;
}
STDMETHODIMP CNntpFeed::put_InboundFeed ( INntpOneWayFeed * pFeed )
{
HRESULT hr = NOERROR;
// !!!magnush - Do some feed type checking here.
m_pInbound.Release ();
m_pInbound = pFeed;
return NOERROR;
}
STDMETHODIMP CNntpFeed::put_OutboundFeed ( INntpOneWayFeed * pFeed )
{
HRESULT hr = NOERROR;
// !!!magnush - Do some feed type checking here.
m_pOutbound.Release ();
m_pOutbound = pFeed;
return hr;
}
STDMETHODIMP CNntpFeed::get_InboundFeedDispatch ( IDispatch ** ppDispatch )
{
HRESULT hr;
CComPtr<INntpOneWayFeed> pInbound;
hr = get_InboundFeed ( &pInbound );
BAIL_ON_FAILURE(hr);
hr = pInbound->QueryInterface ( IID_IDispatch, (void **) ppDispatch );
BAIL_ON_FAILURE(hr);
Exit:
return hr;
}
STDMETHODIMP CNntpFeed::put_InboundFeedDispatch ( IDispatch * pDispatch )
{
HRESULT hr;
CComPtr<INntpOneWayFeed> pInbound;
hr = pDispatch->QueryInterface ( IID_INntpOneWayFeed, (void **) &pInbound );
BAIL_ON_FAILURE(hr);
hr = put_InboundFeed ( pInbound );
BAIL_ON_FAILURE(hr);
Exit:
return hr;
}
STDMETHODIMP CNntpFeed::get_OutboundFeedDispatch ( IDispatch ** ppDispatch )
{
HRESULT hr;
CComPtr<INntpOneWayFeed> pOutbound;
hr = get_OutboundFeed ( &pOutbound );
BAIL_ON_FAILURE(hr);
hr = pOutbound->QueryInterface ( IID_IDispatch, (void **) ppDispatch );
BAIL_ON_FAILURE(hr);
Exit:
return hr;
}
STDMETHODIMP CNntpFeed::put_OutboundFeedDispatch ( IDispatch * pDispatch )
{
HRESULT hr;
CComPtr<INntpOneWayFeed> pOutbound;
hr = pDispatch->QueryInterface ( IID_INntpOneWayFeed, (void **) &pOutbound );
BAIL_ON_FAILURE(hr);
hr = put_OutboundFeed ( pOutbound );
BAIL_ON_FAILURE(hr);
Exit:
return hr;
}
HRESULT CNntpFeed::FromFeedPair ( CFeedPair * pFeedPair )
{
HRESULT hr = NOERROR;
m_pInbound.Release ();
m_pOutbound.Release ();
m_strRemoteServer = pFeedPair->m_strRemoteServer;
m_type = pFeedPair->m_type;
if ( pFeedPair->m_pInbound ) {
hr = pFeedPair->m_pInbound->ToINntpOneWayFeed ( &m_pInbound );
BAIL_ON_FAILURE(hr);
}
if ( pFeedPair->m_pOutbound ) {
hr = pFeedPair->m_pOutbound->ToINntpOneWayFeed ( &m_pOutbound );
BAIL_ON_FAILURE(hr);
}
Exit:
return hr;
}
/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CNntpAdminFeeds::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_INntpAdminFeeds,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
CNntpAdminFeeds::CNntpAdminFeeds () :
m_fEnumerated ( FALSE )
// CComBSTR's are initialized to NULL by default.
{
InitAsyncTrace ( );
m_iadsImpl.SetService ( MD_SERVICE_NAME );
m_iadsImpl.SetName ( _T("Feeds") );
m_iadsImpl.SetClass ( _T("IIsNntpFeeds") );
OleInitialize( NULL );
}
CNntpAdminFeeds::~CNntpAdminFeeds ()
{
// All CComBSTR's are freed automatically.
TermAsyncTrace ( );
OleUninitialize();
}
//
// IADs methods:
//
DECLARE_SIMPLE_IADS_IMPLEMENTATION(CNntpAdminFeeds,m_iadsImpl)
//////////////////////////////////////////////////////////////////////
// Properties:
//////////////////////////////////////////////////////////////////////
// Enumeration Properties:
STDMETHODIMP CNntpAdminFeeds::get_Count ( long * plCount )
{
return StdPropertyGet ( m_listFeeds.GetCount(), plCount );
}
//////////////////////////////////////////////////////////////////////
// Methods:
//////////////////////////////////////////////////////////////////////
STDMETHODIMP CNntpAdminFeeds::Enumerate ( )
{
TraceFunctEnter ( "CNntpAdminFeeds::Enumerate" );
HRESULT hr = NOERROR;
DWORD dwError = NOERROR;
DWORD cFeeds = 0;
LPNNTP_FEED_INFO pFeedInfo = NULL;
DWORD i;
dwError = NntpEnumerateFeeds (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
&cFeeds,
&pFeedInfo
);
if ( dwError != 0 ) {
ErrorTrace ( (LPARAM) this, "Error enumerating feeds: %x", dwError );
hr = RETURNCODETOHRESULT ( dwError );
goto Exit;
}
// Empty the old feed list:
m_fEnumerated = FALSE;
m_listFeeds.Empty ();
// Add each feed to our list:
for ( i = 0; i < cFeeds; i++ ) {
DWORD dwPairID;
CFeedPair * pFeedPair;
CFeed * pFeed;
// Create a new Feed object:
hr = CFeed::CreateFeedFromFeedInfo ( &pFeedInfo[i], &pFeed );
if ( FAILED(hr) ) {
goto Exit;
}
// Find the pair that matches Feed[i]:
dwPairID = pFeed->m_dwPairFeedId;
pFeedPair = m_listFeeds.Find ( dwPairID );
if ( pFeedPair ) {
// We found a matching pair, so add it:
hr = pFeedPair->AddFeed ( pFeed );
if ( hr == E_FAIL ) {
// Something went wrong - Try to add the feed by itself.
pFeedPair = NULL;
hr = NOERROR;
}
if ( FAILED(hr) ) {
goto Exit;
}
}
if ( pFeedPair == NULL ) {
// We need to create a new feed pair:
hr = CFeedPair::CreateFeedPair (
&pFeedPair,
pFeedInfo[i].ServerName,
FeedTypeToEnum ( pFeedInfo[i].FeedType )
);
if ( FAILED(hr) ) {
goto Exit;
}
// Add the current feed to the new pair:
hr = pFeedPair->AddFeed ( pFeed );
if ( FAILED(hr) ) {
goto Exit;
}
// Add the new pair to the pair list:
m_listFeeds.Add ( pFeedPair );
}
}
// !!!magnush - Stop memory leaks here.
m_fEnumerated = TRUE;
Exit:
if ( FAILED(hr) ) {
m_listFeeds.Empty();
}
if ( pFeedInfo ) {
::NetApiBufferFree ( pFeedInfo );
}
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminFeeds::Item ( long lIndex, INntpFeed ** ppFeed )
{
TraceFunctEnter ( "CNntpAdminFeeds::Item" );
HRESULT hr = NOERROR;
CFeedPair * pFeedPair;
// Did we enumerate first?
if ( !m_fEnumerated ) {
hr = NntpCreateException ( IDS_NNTPEXCEPTION_DIDNT_ENUMERATE );
TraceFunctLeave ();
return hr;
}
pFeedPair = m_listFeeds.Item ( lIndex );
if ( !pFeedPair ) {
hr = NntpCreateException ( IDS_NNTPEXCEPTION_INVALID_INDEX );
goto Exit;
}
hr = pFeedPair->ToINntpFeed ( ppFeed );
if ( FAILED(hr) ) {
goto Exit;
}
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminFeeds::FindID ( long lID, long * plIndex )
{
TraceFunctEnter ( "CNntpAdminFeeds::FindID" );
HRESULT hr = NOERROR;
CFeedPair * pFeedPair;
*plIndex = -1;
pFeedPair = m_listFeeds.Find ( (DWORD) lID );
if ( pFeedPair ) {
*plIndex = (long) m_listFeeds.GetPairIndex ( pFeedPair );
}
TraceFunctLeave ();
return hr;
}
HRESULT CNntpAdminFeeds::ReturnFeedPair ( CFeedPair * pFeedPair, INntpFeed * pFeed )
{
HRESULT hr;
CComPtr<INntpOneWayFeed> pInbound;
CComPtr<INntpOneWayFeed> pOutbound;
CComPtr<INntpFeed> pNewFeedPair;
hr = pFeedPair->ToINntpFeed ( &pNewFeedPair );
BAIL_ON_FAILURE(hr);
pNewFeedPair->get_InboundFeed ( &pInbound );
pNewFeedPair->get_OutboundFeed ( &pOutbound );
pFeed->put_InboundFeed ( pInbound );
pFeed->put_OutboundFeed ( pOutbound );
Exit:
return hr;
}
STDMETHODIMP CNntpAdminFeeds::Add ( INntpFeed * pFeed )
{
TraceFunctEnter ( "CNntpAdminFeeds::Add" );
HRESULT hr = NOERROR;
CFeedPair * pFeedPair = NULL;
CComBSTR strRemoteServer;
CComBSTR strServer;
NNTP_FEED_SERVER_TYPE type;
CMetabaseKey *pMK = NULL;
IMSAdminBase *pMeta = NULL;
hr = pFeed->get_RemoteServer ( &strRemoteServer );
BAIL_ON_FAILURE(hr);
hr = get_Server(&strServer);
BAIL_ON_FAILURE(hr);
hr = CreateMetabaseObject( strServer, &pMeta );
_ASSERT( SUCCEEDED( hr ) );
BAIL_ON_FAILURE(hr);
pMK = new CMetabaseKey(pMeta);
if (!pMK)
BAIL_WITH_FAILURE(hr, E_OUTOFMEMORY);
hr = pFeed->get_FeedType ( &type );
BAIL_ON_FAILURE(hr);
hr = CFeedPair::CreateFeedPair ( &pFeedPair, strRemoteServer, type );
BAIL_ON_FAILURE(hr);
hr = pFeedPair->FromINntpFeed ( pFeed );
BAIL_ON_FAILURE(hr);
hr = pFeedPair->AddToServer (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
pMK
);
BAIL_ON_FAILURE(hr);
m_listFeeds.Add ( pFeedPair );
// Return the new feeds (and their IDs) to the caller:
hr = ReturnFeedPair ( pFeedPair, pFeed );
BAIL_ON_FAILURE(hr);
Exit:
if ( FAILED(hr) ) {
delete pFeedPair;
}
if (pMK)
delete pMK;
if (pMeta)
pMeta->Release();
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminFeeds::Set ( long lIndex, INntpFeed * pFeed )
{
TraceFunctEnter ( "CNntpAdminFeeds::Set" );
HRESULT hr = NOERROR;
CFeedPair * pFeedPair;
CComPtr<INntpFeed> pNewFeedPair;
CComPtr<INntpOneWayFeed> pInbound;
CComPtr<INntpOneWayFeed> pOutbound;
CComBSTR strServer;
CMetabaseKey *pMK = NULL;
IMSAdminBase *pMeta = NULL;
hr = get_Server ( &strServer );
BAIL_ON_FAILURE(hr);
hr = CreateMetabaseObject( strServer, &pMeta );
_ASSERT( SUCCEEDED( hr ) );
BAIL_ON_FAILURE(hr);
pMK = new CMetabaseKey(pMeta);
if (!pMK)
BAIL_WITH_FAILURE(hr, E_OUTOFMEMORY);
pFeedPair = m_listFeeds.Item ( lIndex );
if ( !pFeedPair ) {
hr = NntpCreateException ( IDS_NNTPEXCEPTION_INVALID_INDEX );
goto Exit;
}
hr = pFeedPair->SetToServer (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
pFeed,
pMK
);
BAIL_ON_FAILURE(hr);
// Return the new feeds (and their IDs) to the caller:
hr = ReturnFeedPair ( pFeedPair, pFeed );
BAIL_ON_FAILURE(hr);
Exit:
if (pMK)
delete pMK;
if (pMeta)
pMeta->Release();
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminFeeds::Remove ( long lIndex )
{
TraceFunctEnter ( "CNntpAdminFeeds::Remove" );
HRESULT hr = NOERROR;
CFeedPair * pFeedPair;
CComBSTR strServer;
CMetabaseKey *pMK = NULL;
IMSAdminBase *pMeta = NULL;
pFeedPair = m_listFeeds.Item ( lIndex );
if ( !pFeedPair ) {
hr = NntpCreateException ( IDS_NNTPEXCEPTION_INVALID_INDEX );
goto Exit;
}
hr = get_Server ( &strServer );
BAIL_ON_FAILURE(hr);
hr = CreateMetabaseObject( strServer, &pMeta );
_ASSERT( SUCCEEDED( hr ) );
BAIL_ON_FAILURE(hr);
pMK = new CMetabaseKey(pMeta);
if (!pMK)
BAIL_WITH_FAILURE(hr, E_OUTOFMEMORY);
hr = pFeedPair->RemoveFromServer (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
pMK
);
if ( FAILED(hr) ) {
goto Exit;
}
m_listFeeds.Remove ( pFeedPair );
Exit:
if (pMK)
delete pMK;
if (pMeta)
pMeta->Release();
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminFeeds::ItemDispatch ( long index, IDispatch ** ppDispatch )
{
HRESULT hr;
CComPtr<INntpFeed> pFeed;
hr = Item ( index, &pFeed );
BAIL_ON_FAILURE ( hr );
hr = pFeed->QueryInterface ( IID_IDispatch, (void **) ppDispatch );
BAIL_ON_FAILURE ( hr );
Exit:
return hr;
}
STDMETHODIMP CNntpAdminFeeds::AddDispatch ( IDispatch * pFeed )
{
HRESULT hr;
CComPtr<INntpFeed> pINntpFeed;
hr = pFeed->QueryInterface ( IID_INntpFeed, (void **) &pINntpFeed );
BAIL_ON_FAILURE(hr);
hr = Add ( pINntpFeed );
BAIL_ON_FAILURE(hr);
Exit:
return hr;
}
STDMETHODIMP CNntpAdminFeeds::SetDispatch ( long lIndex, IDispatch * pFeed )
{
HRESULT hr;
CComPtr<INntpFeed> pINntpFeed;
hr = pFeed->QueryInterface ( IID_INntpFeed, (void **) &pINntpFeed );
BAIL_ON_FAILURE(hr);
hr = Set ( lIndex, pINntpFeed );
BAIL_ON_FAILURE(hr);
Exit:
return hr;
}