|
|
// 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; }
|