/*++ 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 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 *pClass; HRESULT hr; DBG_ENTER (_T("CFaxRecipients::Create"), hr); hr = CComObject::CreateInstance(&pClass); if (FAILED(hr)) { // // Failed to create Instance // CALL_FAIL(GENERAL_ERR, _T("CComObject::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; }