Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

341 lines
6.1 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
FaxRecipients.cpp
Abstract:
Implementation of Fax Recipients Collection
Author:
Iv Garber (IvG) Apr, 2000
Revision History:
--*/
#include "stdafx.h"
#include "FaxComEx.h"
#include "FaxRecipients.h"
//
//====================== ADD & REMOVE ==================================
//
STDMETHODIMP
CFaxRecipients::Add (
/*[in]*/ BSTR bstrFaxNumber,
/*[in,defaultvalue("")]*/ BSTR bstrName,
/*[out, retval]*/ IFaxRecipient **ppRecipient
)
/*++
Routine name : CFaxRecipients::Add
Routine description:
Add New Recipient to the Recipients Collection
Author:
Iv Garber (IvG), Apr, 2000
Arguments:
ppRecipient [out] - Ptr to the newly created Recipient
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (_T("CFaxRecipients::Add"), hr);
//
// Check that we can write to the given pointer
//
if (::IsBadWritePtr(ppRecipient, sizeof(IFaxRecipient* )))
{
//
// Got a bad return pointer
//
hr = E_POINTER;
AtlReportError(CLSID_FaxRecipients,
IDS_ERROR_INVALID_ARGUMENT,
IID_IFaxRecipients,
hr);
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr()"), hr);
return hr;
}
//
// Fax Number should exist
//
if (::SysStringLen(bstrFaxNumber) < 1)
{
hr = E_INVALIDARG;
AtlReportError(CLSID_FaxRecipients,
IDS_ERROR_EMPTY_ARGUMENT,
IID_IFaxRecipients,
hr);
CALL_FAIL(GENERAL_ERR, _T("::SysStringLen(bstrFaxNumber) < 1"), hr);
return hr;
}
CComPtr<IFaxRecipient> pNewRecipient;
hr = CFaxRecipient::Create(&pNewRecipient);
if (FAILED(hr))
{
//
// Failed to create Recipient object
//
AtlReportError(CLSID_FaxRecipients,
IDS_ERROR_OPERATION_FAILED,
IID_IFaxRecipients,
hr);
CALL_FAIL(GENERAL_ERR, _T("CFaxRecipient::Create()"), hr);
return hr;
}
try
{
m_coll.push_back(pNewRecipient);
}
catch (exception &)
{
//
// Failed to add the Recipient to the Collection
//
hr = E_OUTOFMEMORY;
AtlReportError(CLSID_FaxRecipients,
IDS_ERROR_OUTOFMEMORY,
IID_IFaxRecipients,
hr);
CALL_FAIL(MEM_ERR, _T("m_coll.push_back()"), hr);
return hr;
}
//
// Put Fax Number
//
hr = pNewRecipient->put_FaxNumber(bstrFaxNumber);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxRecipients,
IDS_ERROR_OPERATION_FAILED,
IID_IFaxRecipients,
hr);
CALL_FAIL(MEM_ERR, _T("pNewRecipient->put_FaxNumber(bstrFaxNumber)"), hr);
return hr;
}
//
// Put Recipient's Name
//
hr = pNewRecipient->put_Name(bstrName);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxRecipients,
IDS_ERROR_OPERATION_FAILED,
IID_IFaxRecipients,
hr);
CALL_FAIL(MEM_ERR, _T("pNewRecipient->put_Name(bstrName)"), hr);
return hr;
}
//
// Additional AddRef() to prevent death of the Recipient
//
(*pNewRecipient).AddRef();
pNewRecipient.CopyTo(ppRecipient);
return hr;
};
STDMETHODIMP
CFaxRecipients::Remove (
/*[in]*/ long lIndex
)
/*++
Routine name : CFaxRecipients::Remove
Routine description:
Remove Recipient at given index from the Collection
Author:
Iv Garber (IvG), Apr, 2000
Arguments:
lIndex [in] - Index of the Recipient to Remove
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (_T("CFaxRecipients::Remove"), hr, _T("%d"), lIndex);
if (lIndex < 1 || lIndex > m_coll.size())
{
//
// Invalid Index
//
hr = E_INVALIDARG;
AtlReportError(CLSID_FaxRecipients,
IDS_ERROR_OUTOFRANGE,
IID_IFaxRecipients,
hr);
CALL_FAIL(GENERAL_ERR, _T("lIndex > m_coll.size()"), hr);
return hr;
}
ContainerType::iterator it;
it = m_coll.begin() + lIndex - 1;
hr = (*it)->Release();
if (FAILED(hr))
{
//
// Failed to Release the Interface
//
AtlReportError(CLSID_FaxRecipients,
IDS_ERROR_OPERATION_FAILED,
IID_IFaxRecipients,
hr);
CALL_FAIL(GENERAL_ERR, _T("Release()"), hr);
return hr;
}
try
{
m_coll.erase(it);
}
catch(exception &)
{
//
// Failed to remove the Recipient from the Collection
//
hr = E_OUTOFMEMORY;
AtlReportError(CLSID_FaxRecipients,
IDS_ERROR_OUTOFMEMORY,
IID_IFaxRecipients,
hr);
CALL_FAIL(MEM_ERR, _T("m_coll.erase()"), hr);
return hr;
}
return hr;
};
//
//====================== CREATE ==================================
//
HRESULT
CFaxRecipients::Create (
IFaxRecipients **ppRecipients
)
/*++
Routine name : CFaxRecipients::Create
Routine description:
Static function to Create Recipients Collection
Author:
Iv Garber (IvG), Apr, 2000
Arguments:
ppRecipients [out] - the resulting collection
Return Value:
Standard HRESULT code
--*/
{
CComObject<CFaxRecipients> *pClass;
HRESULT hr;
DBG_ENTER (_T("CFaxRecipients::Create"), hr);
hr = CComObject<CFaxRecipients>::CreateInstance(&pClass);
if (FAILED(hr))
{
//
// Failed to create Instance
//
CALL_FAIL(GENERAL_ERR, _T("CComObject<CFaxRecipients>::CreateInstance()"), hr);
return hr;
}
hr = pClass->QueryInterface(__uuidof(IFaxRecipients), (void **) ppRecipients);
if (FAILED(hr))
{
//
// Failed to Query Fax Recipients Interface
//
CALL_FAIL(GENERAL_ERR, _T("QueryInterface()"), hr);
return hr;
}
return hr;
}
//
//==================== INTERFACE SUPPORT ERROR INFO =====================
//
STDMETHODIMP
CFaxRecipients::InterfaceSupportsErrorInfo (
REFIID riid
)
/*++
Routine name : CFaxRecipients::InterfaceSupportsErrorInfo
Routine description:
ATL's implementation of Support Error Info
Author:
Iv Garber (IvG), Apr, 2000
Arguments:
riid [in] - Interface ID
Return Value:
Standard HRESULT code
--*/
{
static const IID* arr[] =
{
&IID_IFaxRecipients
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}