|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
faxroute.cpp
Abstract:
This file implements the CFaxRoutingMethod and CFaxRoutingMethods interfaces.
Author:
Wesley Witt (wesw) 1-June-1997
Environment:
User Mode
--*/
#include "stdafx.h"
#include "faxroute.h"
CFaxRoutingMethod::CFaxRoutingMethod() { m_pFaxPort = NULL; m_LastFaxError = NO_ERROR; m_DeviceId = 0; m_Enabled = FALSE; m_DeviceName = NULL; m_Guid = NULL; m_FunctionName = NULL; m_ImageName = NULL; m_FriendlyName = NULL; }
CFaxRoutingMethod::~CFaxRoutingMethod() { if (m_pFaxPort) { m_pFaxPort->Release(); } if (m_DeviceName) { SysFreeString( m_DeviceName ); } if (m_Guid) { SysFreeString( m_Guid ); } if (m_FunctionName) { SysFreeString( m_FunctionName ); } if (m_ImageName) { SysFreeString( m_ImageName ); } if (m_FriendlyName) { SysFreeString( m_FriendlyName ); } if (m_ExtensionName) { SysFreeString( m_ExtensionName ); } if (m_RoutingData) { FaxFreeBuffer( m_RoutingData ); } }
BOOL CFaxRoutingMethod::Initialize( CFaxPort *i_pFaxPort, DWORD i_DeviceId, BOOL i_Enabled, LPCWSTR i_DeviceName, LPCWSTR i_Guid, LPCWSTR i_FunctionName, LPCWSTR i_FriendlyName, LPCWSTR i_ImageName, LPCWSTR i_ExtensionName ) { HRESULT hr;
m_pFaxPort = i_pFaxPort; m_DeviceId = i_DeviceId; m_Enabled = i_Enabled; m_DeviceName = SysAllocString(i_DeviceName); m_Guid = SysAllocString(i_Guid); m_FunctionName = SysAllocString(i_FunctionName); m_ImageName = SysAllocString(i_ImageName); m_FriendlyName = SysAllocString(i_FriendlyName); m_ExtensionName = SysAllocString(i_ExtensionName); m_RoutingData = NULL;
if ( (!m_DeviceName && i_DeviceName) || (!m_Guid && i_Guid) || (!m_FunctionName && i_FunctionName) || (!m_ImageName && i_ImageName) || (!m_FriendlyName && i_FriendlyName) || (!m_ExtensionName && i_ExtensionName) ) { SysFreeString(m_DeviceName); SysFreeString(m_Guid); SysFreeString(m_FunctionName); SysFreeString(m_ImageName); SysFreeString(m_FriendlyName); SysFreeString(m_ExtensionName); return FALSE; }
if (!m_pFaxPort) { return FALSE; }
hr = m_pFaxPort->AddRef(); if (FAILED(hr)) { m_pFaxPort = NULL; return FALSE; }
DWORD Size = 0;
if (!FaxGetRoutingInfoW( m_pFaxPort->GetPortHandle(), m_Guid, &m_RoutingData, &Size )) { m_RoutingData = NULL; m_LastFaxError = GetLastError(); return FALSE; }
if (Size == 0) { FaxFreeBuffer( m_RoutingData ); m_RoutingData = NULL; }
return TRUE; }
STDMETHODIMP CFaxRoutingMethod::InterfaceSupportsErrorInfo(REFIID riid) { static const IID* arr[] = { &IID_IFaxRoutingMethod };
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++) { if (InlineIsEqualGUID(*arr[i],riid)) { return S_OK; } }
return S_FALSE; }
STDMETHODIMP CFaxRoutingMethod::get_DeviceId(long * pVal) { if (!pVal) { return E_POINTER; }
__try { *pVal = m_DeviceId; return S_OK;
} __except (EXCEPTION_EXECUTE_HANDLER) {
}
return E_UNEXPECTED; }
STDMETHODIMP CFaxRoutingMethod::get_Enable(BOOL * pVal) { if (!pVal) { return E_POINTER; }
__try { *pVal = m_Enabled; return S_OK;
} __except (EXCEPTION_EXECUTE_HANDLER) {
}
return E_UNEXPECTED; }
STDMETHODIMP CFaxRoutingMethod::put_Enable(BOOL newVal) { if (!FaxEnableRoutingMethodW( m_pFaxPort->GetPortHandle(), m_Guid, newVal)) { return HRESULT_FROM_WIN32(GetLastError()); } m_Enabled = newVal; return S_OK; }
STDMETHODIMP CFaxRoutingMethod::get_DeviceName(BSTR * pVal) { if (!pVal) { return E_POINTER; }
BSTR Copy = SysAllocString(m_DeviceName);
if (!Copy && m_DeviceName) { return E_OUTOFMEMORY; }
__try { *pVal = Copy; return S_OK;
} __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); }
return E_UNEXPECTED; }
STDMETHODIMP CFaxRoutingMethod::get_Guid(BSTR * pVal) { if (!pVal) { return E_POINTER; }
BSTR Copy = SysAllocString(m_Guid);
if (!Copy && m_Guid) { return E_OUTOFMEMORY; }
__try { *pVal = Copy; return S_OK;
} __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); }
return E_UNEXPECTED; }
STDMETHODIMP CFaxRoutingMethod::get_FunctionName(BSTR * pVal) { if (!pVal) { return E_POINTER; }
BSTR Copy = SysAllocString(m_FunctionName);
if (!Copy && m_FunctionName) { return E_OUTOFMEMORY; }
__try { *pVal = Copy; return S_OK;
} __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); }
return E_UNEXPECTED;
}
STDMETHODIMP CFaxRoutingMethod::get_ImageName(BSTR * pVal) { if (!pVal) { return E_POINTER; }
BSTR Copy = SysAllocString(m_ImageName);
if (!Copy && m_ImageName) { return E_OUTOFMEMORY; }
__try { *pVal = Copy; return S_OK;
} __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); }
return E_UNEXPECTED; }
STDMETHODIMP CFaxRoutingMethod::get_FriendlyName(BSTR * pVal) { if (!pVal) { return E_POINTER; }
BSTR Copy = SysAllocString(m_FriendlyName);
if (!Copy && m_FriendlyName) { return E_OUTOFMEMORY; }
__try { *pVal = Copy; return S_OK;
} __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); }
return E_UNEXPECTED; }
STDMETHODIMP CFaxRoutingMethod::get_ExtensionName(BSTR * pVal) { if (!pVal) { return E_POINTER; }
BSTR Copy = SysAllocString(m_ExtensionName);
if (!Copy && m_ExtensionName) { return E_OUTOFMEMORY; }
__try { *pVal = Copy; return S_OK;
} __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); }
return E_UNEXPECTED; }
STDMETHODIMP CFaxRoutingMethod::get_RoutingData(BSTR * pVal) { if (!pVal) { return E_POINTER; }
BSTR Copy;
Copy = NULL; __try {
if (m_RoutingData == NULL) { Copy = SysAllocString( L"" ); } else if (*((LPDWORD)m_RoutingData) == 0 || *((LPDWORD)m_RoutingData) == 1) { Copy = SysAllocString( (LPWSTR)(m_RoutingData + sizeof(DWORD)) ); if (!Copy && (LPWSTR)(m_RoutingData + sizeof(DWORD))) { return E_OUTOFMEMORY; } } else { return E_UNEXPECTED; }
if (!Copy) { return E_OUTOFMEMORY; }
*pVal = Copy;
return S_OK;
} __except (EXCEPTION_EXECUTE_HANDLER) {
if (Copy != NULL) { SysFreeString(Copy); } }
return E_UNEXPECTED; }
CFaxRoutingMethods::CFaxRoutingMethods() { m_pFaxPort = NULL; m_LastFaxError = 0; m_MethodCount = 0; m_VarVect = NULL; }
CFaxRoutingMethods::~CFaxRoutingMethods() { if (m_pFaxPort) { m_pFaxPort->Release(); }
if (m_VarVect) { delete [] m_VarVect; } }
BOOL CFaxRoutingMethods::Init(CFaxPort *pFaxPort) { HRESULT hr; if (!pFaxPort) { return FALSE; }
m_pFaxPort = pFaxPort; hr = m_pFaxPort->AddRef(); if (FAILED(hr)) { m_pFaxPort = NULL; return FALSE; }
PFAX_ROUTING_METHODW RoutingMethod = NULL; DWORD Size = 0;
//
// get the routing methods from the server
//
if (!FaxEnumRoutingMethodsW( m_pFaxPort->GetPortHandle(), &RoutingMethod, &m_MethodCount )) { m_LastFaxError = GetLastError(); return FALSE; }
//
// enumerate the methods
//
m_VarVect = new CComVariant[m_MethodCount]; if (!m_VarVect) { FaxFreeBuffer( RoutingMethod ); return FALSE; }
for (DWORD i=0; i<m_MethodCount; i++) {
//
// create the object
//
CComObject<CFaxRoutingMethod> *pFaxRoutingMethod; HRESULT hr = CComObject<CFaxRoutingMethod>::CreateInstance( &pFaxRoutingMethod ); if (FAILED(hr)) { delete [] m_VarVect; m_VarVect = NULL; FaxFreeBuffer( RoutingMethod ); return FALSE; }
//
// set the values
//
if (!pFaxRoutingMethod->Initialize( m_pFaxPort, RoutingMethod[i].DeviceId, RoutingMethod[i].Enabled, RoutingMethod[i].DeviceName, RoutingMethod[i].Guid, RoutingMethod[i].FunctionName, RoutingMethod[i].FriendlyName, RoutingMethod[i].ExtensionImageName, RoutingMethod[i].ExtensionFriendlyName )) { delete [] m_VarVect; m_VarVect = NULL; FaxFreeBuffer( RoutingMethod ); return FALSE; }
//
// get IDispatch pointer
//
LPDISPATCH lpDisp = NULL; hr = pFaxRoutingMethod->QueryInterface( IID_IDispatch, (void**)&lpDisp ); if (FAILED(hr)) { delete [] m_VarVect; m_VarVect = NULL; FaxFreeBuffer( RoutingMethod ); return FALSE; }
//
// create a variant and add it to the collection
//
CComVariant &var = m_VarVect[i]; __try { var.vt = VT_DISPATCH; var.pdispVal = lpDisp; hr = S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { hr = E_UNEXPECTED; }
if (FAILED(hr)) { delete [] m_VarVect; m_VarVect = NULL; FaxFreeBuffer( RoutingMethod ); return FALSE; } }
FaxFreeBuffer( RoutingMethod );
return TRUE; }
STDMETHODIMP CFaxRoutingMethods::get_Item(long Index, VARIANT * retval) { if (!retval) { return E_POINTER; }
//
// use 1-based index, VB like
//
if ((Index < 1) || (Index > (long) m_MethodCount)) { return E_INVALIDARG; }
__try { VariantInit( retval ); retval->vt = VT_UNKNOWN; retval->punkVal = NULL;
return VariantCopy( retval, &m_VarVect[Index-1] ); } __except (EXCEPTION_EXECUTE_HANDLER) {
}
return E_UNEXPECTED; }
STDMETHODIMP CFaxRoutingMethods::get_Count(long * pVal) { if (!pVal) { return E_POINTER; } __try { *pVal = m_MethodCount; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) {
}
return E_UNEXPECTED; }
|