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.
 
 
 
 
 
 

401 lines
10 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
FaxInboundRoutingExtensions.cpp
Abstract:
Implementation of CFaxInboundRoutingExtensions class.
Author:
Iv Garber (IvG) Jul, 2000
Revision History:
--*/
#include "stdafx.h"
#include "FaxComEx.h"
#include "FaxInboundRoutingExtensions.h"
#include "FaxInboundRoutingExtension.h"
//
//==================== CREATE ========================================
//
HRESULT
CFaxInboundRoutingExtensions::Create (
IFaxInboundRoutingExtensions **ppIRExtensions
)
/*++
Routine name : CFaxInboundRoutingExtensions::Create
Routine description:
Static function to create the Fax IR Extensions Collection Object
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
ppIRExtensions [out] -- the new Fax IR Extensions Collection Object
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxInboundRoutingExtensions::Create"), hr);
//
// Create Instance of the Collection
//
CComObject<CFaxInboundRoutingExtensions> *pClass;
hr = CComObject<CFaxInboundRoutingExtensions>::CreateInstance(&pClass);
if (FAILED(hr))
{
CALL_FAIL(GENERAL_ERR, _T("CComObject<CFaxInboundRoutingExtensions>::CreateInstance(&pClass)"), hr);
return hr;
}
//
// Return the desired Interface Ptr
//
hr = pClass->QueryInterface(ppIRExtensions);
if (FAILED(hr))
{
CALL_FAIL(GENERAL_ERR, _T("pClass->QueryInterface(ppIRExtensions)"), hr);
return hr;
}
return hr;
} // CFaxInboundRoutingExtensions::Create()
//
//============================= INIT ============================================
//
STDMETHODIMP
CFaxInboundRoutingExtensions::Init(
IFaxServerInner *pServerInner
)
/*++
Routine name : CFaxInboundRoutingExtensions::Init
Routine description:
Initialize the Collection :
1) get from RPC all IR Extensions and all Methods Structures,
2) create COM objects for each structure,
3) init all these objects with the IR Extension structure and Methods array,
4) AddRef() each object,
5) put the Ptrs to Objects into the STL::vector.
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pServerInner [in] - Ptr to the Fax Server.
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER(_T("CFaxInboundRoutingExtensions::Init"), hr);
//
// Get Fax Server Handle
//
HANDLE faxHandle;
hr = pServerInner->GetHandle(&faxHandle);
ATLASSERT(SUCCEEDED(hr));
if (faxHandle == NULL)
{
//
// Fax Server is not connected
//
hr = Fax_HRESULT_FROM_WIN32(ERROR_NOT_CONNECTED);
CALL_FAIL(GENERAL_ERR, _T("faxHandle == NULL"), hr);
AtlReportError(CLSID_FaxInboundRoutingExtensions, GetErrorMsgId(hr), IID_IFaxInboundRoutingExtensions, hr);
return hr;
}
//
// Bring from the Server all IR Extensions
//
DWORD dwNum = 0;
CFaxPtr<FAX_ROUTING_EXTENSION_INFO> pIRExtensions;
if (!FaxEnumRoutingExtensions(faxHandle, &pIRExtensions, &dwNum))
{
hr = Fax_HRESULT_FROM_WIN32(GetLastError());
CALL_FAIL(GENERAL_ERR, _T("FaxEnumRoutingExtensions(faxHandle, &pIRExtensions, &dwNum"), hr);
AtlReportError(CLSID_FaxInboundRoutingExtensions, GetErrorMsgId(hr), IID_IFaxInboundRoutingExtensions, hr);
return hr;
}
//
// Bring all the Methods from the Server
//
DWORD dwNumMethods = 0;
CFaxPtr<FAX_GLOBAL_ROUTING_INFO> pMethods;
if (!FaxEnumGlobalRoutingInfo(faxHandle, &pMethods, &dwNumMethods))
{
hr = Fax_HRESULT_FROM_WIN32(GetLastError());
AtlReportError(CLSID_FaxInboundRoutingExtensions, GetErrorMsgId(hr), IID_IFaxInboundRoutingExtensions, hr);
CALL_FAIL(GENERAL_ERR, _T("FaxEnumGlobalRoutingInfo(hFaxHandle, &pMethods, &dwNumMethods)"), hr);
return hr;
}
//
// Fill the Collection with Objects
//
CComObject<CFaxInboundRoutingExtension> *pClass = NULL;
CComPtr<IFaxInboundRoutingExtension> pObject = NULL;
for (DWORD i=0 ; i<dwNum ; i++ )
{
//
// Create IR Extensin Object
//
hr = CComObject<CFaxInboundRoutingExtension>::CreateInstance(&pClass);
if (FAILED(hr) || (!pClass))
{
if (!pClass)
{
hr = E_OUTOFMEMORY;
CALL_FAIL(MEM_ERR, _T("CComObject<CFaxInboundRoutingExtension>::CreateInstance(&pClass)"), hr);
}
else
{
CALL_FAIL(GENERAL_ERR, _T("CComObject<CFaxInboundRoutingExtension>::CreateInstance(&pClass)"), hr);
}
AtlReportError(CLSID_FaxInboundRoutingExtensions, GetErrorMsgId(hr), IID_IFaxInboundRoutingExtensions, hr);
return hr;
}
//
// Init the IR Extension Object
//
hr = pClass->Init(&pIRExtensions[i], pMethods, dwNumMethods);
if (FAILED(hr))
{
CALL_FAIL(GENERAL_ERR, _T("pClass->Init(&pIRExtensions[i], pMethods, dwNumMethods)"), hr);
AtlReportError(CLSID_FaxInboundRoutingExtensions, GetErrorMsgId(hr), IID_IFaxInboundRoutingExtensions, 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(&pObject);
if (FAILED(hr) || (!pObject))
{
if (!pObject)
{
hr = E_FAIL;
}
CALL_FAIL(GENERAL_ERR, _T("pClass->QueryInterface(&pObject)"), hr);
AtlReportError(CLSID_FaxInboundRoutingExtensions, GetErrorMsgId(hr), IID_IFaxInboundRoutingExtensions, hr);
delete pClass;
return hr;
}
//
// Put the Object in the collection
//
try
{
m_coll.push_back(pObject);
}
catch (exception &)
{
hr = E_OUTOFMEMORY;
AtlReportError(CLSID_FaxInboundRoutingExtensions, IDS_ERROR_OUTOFMEMORY, IID_IFaxInboundRoutingExtensions, hr);
CALL_FAIL(MEM_ERR, _T("m_coll.push_back(pObject)"), hr);
//
// pObject will call Release(), which will delete the pClass
//
return hr;
}
//
// We want to save the current AddRef() to Collection
//
pObject.Detach();
}
return hr;
}
//
//============================= GET ITEM =========================================
//
STDMETHODIMP
CFaxInboundRoutingExtensions::get_Item(
/*[in]*/ VARIANT vIndex,
/*[out, retval]*/ IFaxInboundRoutingExtension **ppIRExtension
)
/*++
Routine name : CFaxInboundRoutingExtensions::get_Item
Routine description:
Return an Item from the Collection.
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
vIndex [in] - Identifier of the Item to return.
ppIRExtension [out] - the result value
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER(_T("CFaxInboundRoutingExtensions::get_Item"), hr);
//
// Check the Ptr we have got
//
if (::IsBadWritePtr(ppIRExtension, sizeof(IFaxInboundRoutingExtension *)))
{
hr = E_POINTER;
AtlReportError(CLSID_FaxInboundRoutingExtensions, IDS_ERROR_INVALID_ARGUMENT, IID_IFaxInboundRoutingExtensions, hr);
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr(ppIRExtension)"), hr);
return hr;
}
CComVariant var;
if (vIndex.vt != VT_BSTR)
{
//
// vIndex is not BSTR ==> convert to VT_I4
//
hr = var.ChangeType(VT_I4, &vIndex);
if (SUCCEEDED(hr))
{
VERBOSE(DBG_MSG, _T("Parameter is Number : %d"), var.lVal);
//
// call default ATL's implementation
//
hr = ICollectionOnSTLImpl<IFaxInboundRoutingExtensions, ContainerType,
IFaxInboundRoutingExtension*, CollectionCopyType, EnumType>::get_Item(var.lVal,
ppIRExtension);
return hr;
}
}
//
// convert to BSTR
//
hr = var.ChangeType(VT_BSTR, &vIndex);
if (FAILED(hr))
{
hr = E_INVALIDARG;
AtlReportError(CLSID_FaxInboundRoutingExtensions, IDS_ERROR_INVALID_ARGUMENT, IID_IFaxInboundRoutingExtensions, hr);
CALL_FAIL(GENERAL_ERR, _T("var.ChangeType(VT_BSTR, &vIndex)"), hr);
return hr;
}
VERBOSE(DBG_MSG, _T("Parameter is String : %s"), var.bstrVal);
ContainerType::iterator it = m_coll.begin();
while (it != m_coll.end())
{
CComBSTR bstrName;
hr = (*it)->get_UniqueName(&bstrName);
if (FAILED(hr))
{
CALL_FAIL(GENERAL_ERR, _T("(*it)->get_UniqueName(&bstrName)"), hr);
AtlReportError(CLSID_FaxInboundRoutingExtensions, GetErrorMsgId(hr), IID_IFaxInboundRoutingExtensions, hr);
return hr;
}
if (_tcsicmp(bstrName, var.bstrVal) == 0)
{
//
// found the desired IR Extension
//
(*it)->AddRef();
*ppIRExtension = *it;
return hr;
}
it++;
}
//
// IR Extension does not exist
//
hr = E_INVALIDARG;
CALL_FAIL(GENERAL_ERR, _T("Inbound Routing Extension Is Not Found"), hr);
AtlReportError(CLSID_FaxInboundRoutingExtensions, IDS_ERROR_WRONGEXTENSIONNAME, IID_IFaxInboundRoutingExtensions, hr);
return hr;
}
//
//================== SUPPORT ERROR INFO ========================================
//
STDMETHODIMP
CFaxInboundRoutingExtensions::InterfaceSupportsErrorInfo(
REFIID riid
)
/*++
Routine name : CFaxInboundRoutingExtensions::InterfaceSupportsErrorInfo
Routine description:
ATL's implementation of Support Error Info.
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
riid [in] - Reference to the Interface.
Return Value:
Standard HRESULT code
--*/
{
static const IID* arr[] =
{
&IID_IFaxInboundRoutingExtensions
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}