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
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;
|
|
}
|