/*++ Copyright (c) 2000 Microsoft Corporation Module Name: FaxOutboundRoutingGroup.cpp Abstract: Implementation of CFaxOutboundRoutingGroup class. Author: Iv Garber (IvG) Jun, 2000 Revision History: --*/ #include "stdafx.h" #include "FaxComEx.h" #include "FaxOutboundRoutingGroup.h" #include "FaxDeviceIds.h" // //========================= GET DEVICE IDS ======================================== // STDMETHODIMP CFaxOutboundRoutingGroup::get_DeviceIds( /*[out, retval]*/ IFaxDeviceIds **pFaxDeviceIds ) /*++ Routine name : CFaxOutboundRoutingGroup::get_DeviceIds Routine description: Returns DeviceIds Collection owned by the Group Author: Iv Garber (IvG), Jun, 2000 Arguments: pFaxDeviceIds [out] - the Collection to Return Return Value: Standard HRESULT code --*/ { HRESULT hr = S_OK; DBG_ENTER(_T("CFaxOutboundRoutingGroup::get_DeviceIds"), hr); // // Check that Ptr we have got -- is OK // if (IsBadWritePtr(pFaxDeviceIds, sizeof(IFaxDeviceIds*))) { hr = E_POINTER; CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr(pFaxDeviceIds, sizeof(IFaxDeviceIds *))"), hr); AtlReportError(CLSID_FaxOutboundRoutingGroup, GetErrorMsgId(hr), IID_IFaxOutboundRoutingGroup, hr); return hr; } // // Return the m_pDeviceIds Collection Object // hr = m_pDeviceIds.CopyTo(pFaxDeviceIds); if (FAILED(hr)) { hr = E_FAIL; CALL_FAIL(GENERAL_ERR, _T("CComPtr.CopyTo(pFaxDeviceIds)"), hr); AtlReportError(CLSID_FaxOutboundRoutingGroup, GetErrorMsgId(hr), IID_IFaxOutboundRoutingGroup, hr); return hr; } return hr; } // //========================= INIT ======================================== // STDMETHODIMP CFaxOutboundRoutingGroup::Init( /*[in]*/ FAX_OUTBOUND_ROUTING_GROUP *pInfo, /*[in]*/ IFaxServerInner *pServer ) /*++ Routine name : CFaxOutboundRoutingGroup::Init Routine description: Initialize the Group Object with given Data. Author: Iv Garber (IvG), Jun, 2000 Arguments: pInfo [in] - Data of the Group pServer [in] - Ptr to the Server Return Value: Standard HRESULT code --*/ { HRESULT hr = S_OK; DBG_ENTER(_T("CFaxOutboundRoutingGroup::Init"), hr); m_Status = FAX_GROUP_STATUS_ENUM(pInfo->Status); m_bstrName = pInfo->lpctstrGroupName; if (pInfo->lpctstrGroupName && !m_bstrName) { // // not enough memory // hr = E_OUTOFMEMORY; AtlReportError(CLSID_FaxOutboundRoutingGroup, IDS_ERROR_OUTOFMEMORY, IID_IFaxOutboundRoutingGroup, hr); CALL_FAIL(MEM_ERR, _T("CComBSTR::operator=()"), hr); return hr; } // // Create Device Ids Collection // CComObject *pClass = NULL; hr = CComObject::CreateInstance(&pClass); if (FAILED(hr) || (!pClass)) { if (!pClass) { hr = E_OUTOFMEMORY; CALL_FAIL(MEM_ERR, _T("CComObject::CreateInstance(&pClass)"), hr); } else { CALL_FAIL(GENERAL_ERR, _T("CComObject::CreateInstance(&pClass)"), hr); } AtlReportError(CLSID_FaxOutboundRoutingGroup, IDS_ERROR_OUTOFMEMORY, IID_IFaxOutboundRoutingGroup, hr); return hr; } // // Init the DeviceIds Collection // hr = pClass->Init(pInfo->lpdwDevices, pInfo->dwNumDevices, m_bstrName, pServer); if (FAILED(hr)) { CALL_FAIL(GENERAL_ERR, _T("pClass->Init(pInfo->lpdwDevices, pInfo->dwNumDevices, m_bstrName, pServer)"), hr); AtlReportError(CLSID_FaxOutboundRoutingGroup, IDS_ERROR_OUTOFMEMORY, IID_IFaxOutboundRoutingGroup, hr); delete pClass; return hr; } // // Get Interface from the pClass. // This will make AddRef() on the Interface. // This is the Collection's AddRef, which is freed at Collection's Dtor. // hr = pClass->QueryInterface(&m_pDeviceIds); if (FAILED(hr) || (!m_pDeviceIds)) { if (!m_pDeviceIds) { hr = E_FAIL; } CALL_FAIL(GENERAL_ERR, _T("pClass->QueryInterface(&m_pDeviceIds)"), hr); AtlReportError(CLSID_FaxOutboundRoutingGroup, IDS_ERROR_OUTOFMEMORY, IID_IFaxOutboundRoutingGroup, hr); delete pClass; return hr; } return hr; } // //========================= GET STATUS ======================================== // STDMETHODIMP CFaxOutboundRoutingGroup::get_Status( /*[out, retval]*/ FAX_GROUP_STATUS_ENUM *pStatus ) /*++ Routine name : CFaxOutboundRoutingGroup::get_Status Routine description: Return the Status of the Group Author: Iv Garber (IvG), Jun, 2000 Arguments: pStatus [out] - the return value Return Value: Standard HRESULT code --*/ { HRESULT hr = S_OK; DBG_ENTER (_T("CFaxOutboundRoutingGroup::get_Status"), hr); // // Check that we have got good Ptr // if (::IsBadWritePtr(pStatus, sizeof(FAX_GROUP_STATUS_ENUM))) { hr = E_POINTER; CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr(pStatus, sizeof(FAX_GROUP_STATUS_ENUM))"), hr); AtlReportError(CLSID_FaxOutboundRoutingGroup, GetErrorMsgId(hr), IID_IFaxOutboundRoutingGroup, hr); return hr; } *pStatus = m_Status; return hr; } // //========================= GET NAME ======================================== // STDMETHODIMP CFaxOutboundRoutingGroup::get_Name( BSTR *pbstrName ) /*++ Routine name : CFaxOutboundRoutingGroup::get_Name Routine description: Return Name of the OR Group Author: Iv Garber (IvG), Jun, 2000 Arguments: pbstrName [out] - Ptr to put the Name Return Value: Standard HRESULT code --*/ { HRESULT hr = S_OK; DBG_ENTER (TEXT("CFaxOutboundRoutingGroup::get_Name"), hr); hr = GetBstr(pbstrName, m_bstrName); if (FAILED(hr)) { AtlReportError(CLSID_FaxOutboundRoutingGroup, GetErrorMsgId(hr), IID_IFaxOutboundRoutingGroup, hr); return hr; } return hr; } // //===================== SUPPORT ERROR INFO ====================================== // STDMETHODIMP CFaxOutboundRoutingGroup::InterfaceSupportsErrorInfo( REFIID riid ) /*++ Routine name : CFaxOutboundRoutingGroup::InterfaceSupportsErrorInfo Routine description: ATL's implementation of the ISupportErrorInfo Interface. Author: Iv Garber (IvG), Jun, 2000 Arguments: riid [in] - Reference to the Interface Return Value: Standard HRESULT code --*/ { static const IID* arr[] = { &IID_IFaxOutboundRoutingGroup }; for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++) { if (InlineIsEqualGUID(*arr[i],riid)) return S_OK; } return S_FALSE; }