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.
 
 
 
 
 
 

528 lines
12 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
FaxDeviceIds.cpp
Abstract:
Implementation of CFaxDeviceIds class.
Author:
Iv Garber (IvG) Jun, 2000
Revision History:
--*/
#include "stdafx.h"
#include "FaxComEx.h"
#include "FaxDeviceIds.h"
#include "faxutil.h"
//
//======================= UPDATE GROUP ======================================
//
STDMETHODIMP
CFaxDeviceIds::UpdateGroup()
/*++
Routine name : CFaxDeviceIds::UpdateGroup
Routine description:
Update Group Info at Server.
Author:
Iv Garber (IvG), Jun, 2000
Arguments:
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER(_T("CFaxDeviceIds::UpdateGroup"));
//
// Get Fax Handle
//
HANDLE faxHandle;
hr = m_pIFaxServerInner->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_FaxDeviceIds, GetErrorMsgId(hr), IID_IFaxDeviceIds, hr);
return hr;
}
//
// Create Group Structure
//
FAX_OUTBOUND_ROUTING_GROUP groupData;
groupData.dwNumDevices = m_coll.size();
groupData.dwSizeOfStruct = sizeof(FAX_OUTBOUND_ROUTING_GROUP);
groupData.lpctstrGroupName = m_bstrGroupName;
groupData.Status = FAX_GROUP_STATUS_ALL_DEV_VALID;
groupData.lpdwDevices = (DWORD *)MemAlloc(sizeof(DWORD) * groupData.dwNumDevices);
if (!groupData.lpdwDevices)
{
hr = E_OUTOFMEMORY;
CALL_FAIL(MEM_ERR, _T("MemAlloc(sizeof(DWORD) * groupData.dwNumDevices)"), hr);
AtlReportError(CLSID_FaxDeviceIds, IDS_ERROR_OUTOFMEMORY, IID_IFaxDeviceIds, hr);
return hr;
}
ContainerType::iterator DeviceIdIterator = m_coll.begin();
DWORD i = 0;
while ( DeviceIdIterator != m_coll.end())
{
groupData.lpdwDevices[i] = *DeviceIdIterator;
DeviceIdIterator++;
i++;
}
//
// Call Server to Update Group's Info
//
if (!FaxSetOutboundGroup(faxHandle, &groupData))
{
hr = Fax_HRESULT_FROM_WIN32(GetLastError());
CALL_FAIL(GENERAL_ERR, _T("FaxSetOutboundGroup(faxHandle, &groupData)"), hr);
AtlReportError(CLSID_FaxDeviceIds, GetErrorMsgId(hr), IID_IFaxDeviceIds, hr);
return hr;
}
return hr;
}
//
//==================================== INIT ======================================
//
STDMETHODIMP
CFaxDeviceIds::Init(
/*[in]*/ DWORD *pDeviceIds,
/*[in]*/ DWORD dwNum,
/*[in]*/ BSTR bstrGroupName,
/*[in]*/ IFaxServerInner *pServer
)
/*++
Routine name : CFaxDeviceIds::Init
Routine description:
Initialize the DeviceIds Collection.
Author:
Iv Garber (IvG), Jun, 2000
Arguments:
pDeviceIds [in] - Ptr to the DeviceIds
dwNum [in] - Count of the Device Ids
bstrGroupName [in] - Name of the owner Group
pServer [in] - Ptr to the Server Object
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER(_T("CFaxDeviceIds::Init"), hr, _T("NumDevices=%d GroupName=%s"), dwNum, bstrGroupName);
m_bstrGroupName = bstrGroupName;
if (bstrGroupName && !m_bstrGroupName)
{
hr = E_OUTOFMEMORY;
CALL_FAIL(MEM_ERR, _T("CComBSTR::operator=()"), hr);
AtlReportError(CLSID_FaxDeviceIds, IDS_ERROR_OUTOFMEMORY, IID_IFaxDeviceIds, hr);
return hr;
}
//
// Fill the Collection with Device Ids
//
for ( DWORD i=0 ; i<dwNum ; i++ )
{
try
{
m_coll.push_back(pDeviceIds[i]);
}
catch (exception &)
{
hr = E_OUTOFMEMORY;
AtlReportError(CLSID_FaxDeviceIds, IDS_ERROR_OUTOFMEMORY, IID_IFaxDeviceIds, hr);
CALL_FAIL(MEM_ERR, _T("m_coll.push_back(pDeviceIds[i])"), hr);
return hr;
}
}
//
// Store and AddRef the Ptr to the Fax Server Object
//
hr = CFaxInitInnerAddRef::Init(pServer);
return hr;
}
//
//==================================== ADD ======================================
//
STDMETHODIMP
CFaxDeviceIds::Add(
/*[in]*/ long lDeviceId
)
/*++
Routine name : CFaxDeviceIds::Add
Routine description:
Add new Device ID to the Collection
Author:
Iv Garber (IvG), Jun, 2000
Arguments:
lDeviceId [in] - the Device Id to add
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER(_T("CFaxDeviceIds::Add"), hr, _T("DeviceId=%ld"), lDeviceId);
//
// Check that we can Add Device Id
//
if (_tcsicmp(m_bstrGroupName, ROUTING_GROUP_ALL_DEVICES) == 0)
{
//
// This is the "All Devices" Group
//
hr = E_INVALIDARG;
CALL_FAIL(GENERAL_ERR, _T("All Devices Group"), hr);
AtlReportError(CLSID_FaxDeviceIds, IDS_ERROR_ALLDEVICESGROUP, IID_IFaxDeviceIds, hr);
return hr;
}
//
// Put the Device Id in the collection
//
try
{
m_coll.push_back(lDeviceId);
}
catch (exception &)
{
hr = E_OUTOFMEMORY;
AtlReportError(CLSID_FaxDeviceIds, IDS_ERROR_OUTOFMEMORY, IID_IFaxDeviceIds, hr);
CALL_FAIL(MEM_ERR, _T("m_coll.push_back(lDeviceId)"), hr);
return hr;
}
//
// Update Group's Info at Server
//
hr = UpdateGroup();
if (FAILED(hr))
{
//
// Failed to Add the Device Id --> remove it from the Collection as well
//
try
{
m_coll.pop_back();
}
catch (exception &)
{
//
// Only write to Debug
//
CALL_FAIL(MEM_ERR, _T("m_coll.push_back(lDeviceId)"), E_OUTOFMEMORY);
}
return hr;
}
return hr;
}
//
//======================== REMOVE =================================================
//
STDMETHODIMP
CFaxDeviceIds::Remove(
/*[in]*/ long lIndex
)
/*++
Routine name : CFaxDeviceIds::Remove
Routine description:
Remove the given Item from the Collection
Author:
Iv Garber (IvG), Jun, 2000
Arguments:
lIndex [in] - Index of the Item to remove
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER(_T("CFaxDeviceIds::Remove"), hr, _T("Index=%ld"), lIndex);
//
// Check that we can Remove the Device from the Collection
//
if (_tcsicmp(m_bstrGroupName, ROUTING_GROUP_ALL_DEVICES) == 0)
{
//
// This is the "All Devices" Group
//
hr = E_INVALIDARG;
CALL_FAIL(GENERAL_ERR, _T("All Devices Group"), hr);
AtlReportError(CLSID_FaxDeviceIds, IDS_ERROR_ALLDEVICESGROUP, IID_IFaxDeviceIds, hr);
return hr;
}
//
// Check that Index is Valid
//
if ((lIndex > m_coll.size()) || (lIndex < 1))
{
hr = E_INVALIDARG;
CALL_FAIL(GENERAL_ERR, _T("(lIndex > m_coll.size() or lIndex < 1)"), hr);
AtlReportError(CLSID_FaxDeviceIds, IDS_ERROR_OUTOFRANGE, IID_IFaxDeviceIds, hr);
return hr;
}
//
// Remove the Item from the Collection
//
long lDeviceId;
try
{
ContainerType::iterator it;
it = m_coll.begin() + lIndex - 1;
lDeviceId = *it;
m_coll.erase(it);
}
catch (exception &)
{
hr = E_OUTOFMEMORY;
AtlReportError(CLSID_FaxDeviceIds, IDS_ERROR_OUTOFMEMORY, IID_IFaxDeviceIds, hr);
CALL_FAIL(MEM_ERR, _T("m_coll.erase(it)"), hr);
return hr;
}
//
// Update Group's Info at Server
//
hr = UpdateGroup();
if (FAILED(hr))
{
//
// Failed to Remove the Device --> Add it back into the Collection
//
try
{
ContainerType::iterator it;
it = m_coll.begin() + lIndex - 1;
m_coll.insert(it, lDeviceId);
}
catch (exception &)
{
//
// Only Debug
//
CALL_FAIL(MEM_ERR, _T("m_coll.insert(it, lDeviceId)"), E_OUTOFMEMORY);
}
return hr;
}
return hr;
}
//
//======================== SET ORDER =================================================
//
STDMETHODIMP
CFaxDeviceIds::SetOrder(
/*[in]*/ long lDeviceId,
/*[in]*/ long lNewOrder
)
/*++
Routine name : CFaxDeviceIds::SetOrder
Routine description:
Update Order for the Device Id
Author:
Iv Garber (IvG), Jun, 2000
Arguments:
lDeviceId [in] - the Device Id
lNewOrder [in] - the new Order of the Device Id
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER(_T("CFaxDeviceIds::SetOrder"), hr, _T("Id=%ld Order=%ld"), lDeviceId, lNewOrder);
//
// Before setting the Device's Order at Server, check that the Device is present in the Collection
//
ContainerType::iterator it;
it = m_coll.begin();
while (it != m_coll.end())
{
if ((*it) == lDeviceId)
{
break;
}
it++;
}
if (it == m_coll.end())
{
//
// Our Collection does not contain such Device Id
//
hr = E_INVALIDARG;
CALL_FAIL(GENERAL_ERR, _T("(The Device Id does not found in the Collection !!)"), hr);
AtlReportError(CLSID_FaxDeviceIds, GetErrorMsgId(hr), IID_IFaxDeviceIds, hr);
return hr;
}
//
// Get Fax Handle
//
HANDLE faxHandle;
hr = m_pIFaxServerInner->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_FaxDeviceIds, GetErrorMsgId(hr), IID_IFaxDeviceIds, hr);
return hr;
}
// Call Server to Update the Device's Order
//
if (!FaxSetDeviceOrderInGroup(faxHandle, m_bstrGroupName, lDeviceId, lNewOrder))
{
hr = Fax_HRESULT_FROM_WIN32(ERROR_NOT_CONNECTED);
CALL_FAIL(GENERAL_ERR, _T("FaxSetDeviceOrderInGroup(faxHandle, m_bstrGroupName, lDeviceId, lNewOrder)"), hr);
AtlReportError(CLSID_FaxDeviceIds, GetErrorMsgId(hr), IID_IFaxDeviceIds, hr);
return hr;
}
//
// Remove the Device Id from its Place in the Collection and Put it in the Desired Place
//
try
{
m_coll.erase(it);
it = m_coll.begin() + lNewOrder - 1;
m_coll.insert(it, lDeviceId);
}
catch (exception &)
{
hr = E_OUTOFMEMORY;
AtlReportError(CLSID_FaxDeviceIds, IDS_ERROR_OUTOFMEMORY, IID_IFaxDeviceIds, hr);
CALL_FAIL(MEM_ERR, _T("m_coll.erase(it)/insert(it, lDeviceId)"), hr);
return hr;
}
return hr;
}
//
//===================== SUPPORT ERROR INFO ======================================
//
STDMETHODIMP
CFaxDeviceIds::InterfaceSupportsErrorInfo(
REFIID riid
)
/*++
Routine name : CFaxDeviceIds::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_IFaxDeviceIds
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}