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.
 
 
 
 
 
 

972 lines
21 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
FaxJobStatus.cpp
Abstract:
Implementation of CFaxJobStatus Class.
Author:
Iv Garber (IvG) Jun, 2000
Revision History:
--*/
#include "stdafx.h"
#include "FaxComEx.h"
#include "FaxJobStatus.h"
//
//====================== GET JOB TYPE ===============================
//
STDMETHODIMP
CFaxJobStatus::get_JobType(
FAX_JOB_TYPE_ENUM *pJobType
)
/*++
Routine name : CFaxJobStatus::get_JobType
Routine description:
Return the Type of the Job
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pJobType [out] - Return Value of Job Type
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_JobType"), hr);
//
// Check that we can write to the given pointer
//
if (::IsBadWritePtr(pJobType, sizeof(FAX_JOB_TYPE_ENUM)))
{
//
// Got Bad Return Pointer
//
hr = E_POINTER;
AtlReportError(CLSID_FaxJobStatus, IDS_ERROR_INVALID_ARGUMENT, IID_IFaxJobStatus, hr);
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr"), hr);
return hr;
}
*pJobType = m_JobType;
return hr;
}
//
//====================== GET TRANSMISSION END ======================================
//
STDMETHODIMP
CFaxJobStatus::get_TransmissionEnd(
DATE *pdateTransmissionEnd
)
/*++
Routine name : CFaxJobStatus::get_TransmissionEnd
Routine description:
Return Job's Transmission End
Author:
Iv Garber (IvG), May, 2000
Arguments:
pdateTransmissionEnd [out] - pointer to the place to put the value
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_TransmissionEnd"), hr);
//
// Check that we can write to the given pointer
//
if (::IsBadWritePtr(pdateTransmissionEnd, sizeof(DATE)))
{
//
// Got Bad Ptr
//
hr = E_POINTER;
AtlReportError(CLSID_FaxJobStatus, IDS_ERROR_INVALID_ARGUMENT, IID_IFaxJobStatus, hr);
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr()"), hr);
return hr;
}
if (m_dwValidityMask & FAX_JOB_FIELD_TRANSMISSION_END_TIME)
{
//
// Transmission end time is available
//
hr = SystemTime2LocalDate(m_dtTransmissionEnd, pdateTransmissionEnd);
if (FAILED(hr))
{
//
// Failed to convert the system time to localized variant date
//
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
}
else
{
//
// Transmission end time is not available yet
//
hr = HRESULT_FROM_WIN32 (ERROR_INVALID_DATA);
AtlReportError(CLSID_FaxJobStatus, IDS_ERROR_NO_END_TIME, IID_IFaxJobStatus, hr);
}
return hr;
}
//
//========================= GET TRANSMISSION START ===============================
//
STDMETHODIMP
CFaxJobStatus::get_TransmissionStart(
DATE *pdateTransmissionStart
)
/*++
Routine name : CFaxJobStatus::get_TransmissionStart
Routine description:
Return Time the Job is started to transmit
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pdateTransmissionStart [out] - pointer to place to put the Transmission Start
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_TransmissionStart"), hr);
//
// Check that we can write to the given pointer
//
if (::IsBadWritePtr(pdateTransmissionStart, sizeof(DATE)))
{
//
// Got Bad Ptr
//
hr = E_POINTER;
AtlReportError(CLSID_FaxJobStatus, IDS_ERROR_INVALID_ARGUMENT, IID_IFaxJobStatus, hr);
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr()"), hr);
return hr;
}
hr = SystemTime2LocalDate(m_dtTransmissionStart, pdateTransmissionStart);
if (FAILED(hr))
{
//
// Failed to convert the system time to localized variant date
//
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//========================= GET SCHEDULED TIME ===============================
//
STDMETHODIMP
CFaxJobStatus::get_ScheduledTime(
DATE *pdateScheduledTime
)
/*++
Routine name : CFaxJobStatus::get_ScheduledTime
Routine description:
Return Time the Job is scheduled
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pdateScheduledTime [out] - pointer to place to put Scheduled Time
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_ScheduledTime"), hr);
//
// Check that we can write to the given pointer
//
if (::IsBadWritePtr(pdateScheduledTime, sizeof(DATE)))
{
//
// Got Bad Ptr
//
hr = E_POINTER;
AtlReportError(CLSID_FaxJobStatus, IDS_ERROR_INVALID_ARGUMENT, IID_IFaxJobStatus, hr);
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr()"), hr);
return hr;
}
hr = SystemTime2LocalDate(m_dtScheduleTime, pdateScheduledTime);
if (FAILED(hr))
{
//
// Failed to convert the system time to localized variant date
//
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET AVAILABLE OPERATIONS ==================================
//
STDMETHODIMP
CFaxJobStatus::get_AvailableOperations(
FAX_JOB_OPERATIONS_ENUM *pAvailableOperations
)
/*++
Routine name : CFaxJobStatus::get_AvailableOperations
Routine description:
The operations available for the Fax Job
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pAvailableOperations [out] - Pointer to the place to put the Bit-Wise Combination
of Available Operations on the current Fax Job
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_AvailableOperations"), hr);
//
// Check that we have got good Ptr
//
if (::IsBadWritePtr(pAvailableOperations, sizeof(FAX_JOB_OPERATIONS_ENUM)))
{
hr = E_POINTER;
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr(pAvailableOperations, sizeof(FAX_JOB_OPERATIONS_ENUM))"), hr);
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
*pAvailableOperations = FAX_JOB_OPERATIONS_ENUM(m_dwAvailableOperations);
return hr;
}
//
//====================== GET PAGES ================================================
//
STDMETHODIMP
CFaxJobStatus::get_Pages(
long *plPages
)
/*++
Routine name : CFaxJobStatus::get_Pages
Routine description:
Return total number of pages of the message
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
plPages [out] - Pointer to the place to put the value
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_Pages"), hr);
hr = GetLong(plPages, m_dwPageCount);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET CALLER ID ================================================
//
STDMETHODIMP
CFaxJobStatus::get_CallerId(
BSTR *pbstrCallerId
)
/*++
Routine name : CFaxJobStatus::get_CallerId
Routine description:
Return the Caller Id of Job's Phone Call
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pbstrCallerId [out] - pointer to the place to put the Caller Id
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_CallerId"), hr);
hr = GetBstr(pbstrCallerId, m_bstrCallerId);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET ROUTING INFORMATION ======================================
//
STDMETHODIMP
CFaxJobStatus::get_RoutingInformation(
BSTR *pbstrRoutingInformation
)
/*++
Routine name : CFaxJobStatus::get_RoutingInformation
Routine description:
Return the Routing Information of the Job
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pbstrRoutingInformation [out] - pointer to place to put Routing Information
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_RoutingInformation"), hr);
hr = GetBstr(pbstrRoutingInformation, m_bstrRoutingInfo);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET STATUS =============================================
//
HRESULT
CFaxJobStatus::get_Status(
FAX_JOB_STATUS_ENUM *pStatus
)
/*++
Routine name : CFaxJobStatus::get_Status
Routine description:
The current Queue Status of the Fax Job
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pStatus [out] - Pointer to the place to put the Bit-Wise Combination of status
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_Status"), hr);
//
// Check that we have got good Ptr
//
if (::IsBadWritePtr(pStatus, sizeof(FAX_JOB_STATUS_ENUM)))
{
hr = E_POINTER;
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr(pStatus, sizeof(FAX_JOB_STATUS_ENUM))"), hr);
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
*pStatus = FAX_JOB_STATUS_ENUM(m_dwQueueStatus);
return hr;
}
//
//====================== GET EXTENDED STATUS CODE ===============================
//
STDMETHODIMP
CFaxJobStatus::get_ExtendedStatusCode(
FAX_JOB_EXTENDED_STATUS_ENUM *pExtendedStatusCode
)
/*++
Routine name : CFaxJobStatus::get_ExtendedStatusCode
Routine description:
The Code of the Extended Status of the Fax Job
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pExtendedStatusCode [out] - Pointer to the place to put the status code
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_ExtendedStatusCode"), hr);
//
// Check that we can write to the given pointer
//
if (::IsBadWritePtr(pExtendedStatusCode, sizeof(FAX_JOB_EXTENDED_STATUS_ENUM)))
{
//
// Got Bad Return Pointer
//
hr = E_POINTER;
AtlReportError(CLSID_FaxJobStatus, IDS_ERROR_INVALID_ARGUMENT, IID_IFaxJobStatus, hr);
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr"), hr);
return hr;
}
*pExtendedStatusCode = m_ExtendedStatusCode;
return hr;
}
//
//====================== GET RETRIES =============================================
//
STDMETHODIMP
CFaxJobStatus::get_Retries(
long *plRetries
)
/*++
Routine name : CFaxJobStatus::get_Retries
Routine description:
The number of unsuccessful retries of the Fax Job
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
plRetries [out] - Pointer to the place to put the number of Retries
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_Retries"), hr);
hr = GetLong(plRetries, m_dwRetries);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET TSID ================================================
//
STDMETHODIMP
CFaxJobStatus::get_TSID(
BSTR *pbstrTSID
)
/*++
Routine name : CFaxJobStatus::get_TSID
Routine description:
Return Transmitting Station ID of the Job
Author:
Iv Garber (IvG), May, 2000
Arguments:
pbstrTSID [out] - pointer to the place to put the TSID
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_TSID"), hr);
hr = GetBstr(pbstrTSID, m_bstrTSID);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET CSID ================================================
//
STDMETHODIMP
CFaxJobStatus::get_CSID(
BSTR *pbstrCSID
)
/*++
Routine name : CFaxJobStatus::get_CSID
Routine description:
Return Called Station ID of the Job
Author:
Iv Garber (IvG), May, 2000
Arguments:
pbstrCSID [out] - pointer to the place to put the CSID
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_CSID"), hr);
hr = GetBstr(pbstrCSID, m_bstrCSID);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET EXTENDED STATUS =======================================
//
STDMETHODIMP
CFaxJobStatus::get_ExtendedStatus(
BSTR *pbstrExtendedStatus
)
/*++
Routine name : CFaxJobStatus::get_ExtendedStatus
Routine description:
Return String Description of the Extended Status of the Job
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
pbstrExtendedStatus [out] - pointer to the place to put the Extended Status
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_ExtendedStatus"), hr);
hr = GetBstr(pbstrExtendedStatus, m_bstrExtendedStatus);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET CURRENT PAGE =============================================
//
STDMETHODIMP
CFaxJobStatus::get_CurrentPage(
long *plCurrentPage
)
/*++
Routine name : CFaxJobStatus::get_CurrentPage
Routine description:
Current Page number being received / sent
Author:
Iv Garber (IvG), May, 2000
Arguments:
plCurrentPage [out] - Pointer to the place to put the Current Page Number
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_CurrentPage"), hr);
hr = GetLong(plCurrentPage, m_dwCurrentPage);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET DEVICE ID =============================================
//
STDMETHODIMP
CFaxJobStatus::get_DeviceId(
long *plDeviceId
)
/*++
Routine name : CFaxJobStatus::get_DeviceId
Routine description:
The Device Id by which the Job is being sent / received.
Author:
Iv Garber (IvG), May, 2000
Arguments:
plDeviceId [out] - Pointer to the place to put the Device Id
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_DeviceId"), hr);
hr = GetLong(plDeviceId, m_dwDeviceId);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//====================== GET SIZE ================================================
//
STDMETHODIMP
CFaxJobStatus::get_Size(
long *plSize
)
/*++
Routine name : CFaxJobStatus::get_Size
Routine description:
Return Size ( in bytes ) of Fax Job's TIFF File
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
plSize [out] - Pointer to the place to put Size
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::get_Size"), hr);
hr = GetLong(plSize, m_dwSize);
if (FAILED(hr))
{
AtlReportError(CLSID_FaxJobStatus, GetErrorMsgId(hr), IID_IFaxJobStatus, hr);
return hr;
}
return hr;
}
//
//==================== INIT ===================================================
//
HRESULT
CFaxJobStatus::Init(
FAX_JOB_STATUS *pJobStatus
)
/*++
Routine name : CFaxJobStatus::Init
Routine description:
Initialize the Job Status Class with the data from FAX_JOB_STATUS struct
Author:
Iv Garber (IvG), May, 2000
Arguments:
pJobStatus [in] - Job Info
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER (TEXT("CFaxJobStatus::Init"), hr);
ATLASSERT(pJobStatus);
//
// dwQueueStatus cannot contain JS_DELETING value
//
ATLASSERT(0 == (pJobStatus->dwQueueStatus & JS_DELETING));
//
// Set Job Type
//
switch(pJobStatus->dwJobType)
{
case JT_SEND:
m_JobType = fjtSEND;
break;
case JT_RECEIVE:
m_JobType = fjtRECEIVE;
break;
case JT_ROUTING:
m_JobType = fjtROUTING;
break;
default:
CALL_FAIL(GENERAL_ERR,
_T("CFaxJobStatus::Init() got unknown/unsupported Job Type : %ld"),
pJobStatus->dwJobType);
//
// This is assert false
//
ATLASSERT(pJobStatus->dwJobType == JT_RECEIVE);
AtlReportError(CLSID_FaxJobStatus,
IDS_ERROR_INVALID_ARGUMENT,
IID_IFaxJobStatus,
hr);
hr = E_INVALIDARG;
return hr;
}
m_dwSize = pJobStatus->dwSize;
m_dwJobId = pJobStatus->dwJobID;
m_dwRetries = pJobStatus->dwRetries;
m_dwDeviceId = pJobStatus->dwDeviceID;
m_dwPageCount = pJobStatus->dwPageCount;
m_dwCurrentPage = pJobStatus->dwCurrentPage;
m_dwQueueStatus = pJobStatus->dwQueueStatus;
m_dwAvailableOperations = pJobStatus->dwAvailableJobOperations;
m_ExtendedStatusCode = FAX_JOB_EXTENDED_STATUS_ENUM(pJobStatus->dwExtendedStatus);
m_dtScheduleTime = pJobStatus->tmScheduleTime;
m_dtTransmissionEnd = pJobStatus->tmTransmissionEndTime;
m_dtTransmissionStart = pJobStatus->tmTransmissionStartTime;
m_bstrTSID = pJobStatus->lpctstrTsid;
m_bstrCSID = pJobStatus->lpctstrCsid;
m_bstrExtendedStatus = pJobStatus->lpctstrExtendedStatus;
m_bstrRoutingInfo = pJobStatus->lpctstrRoutingInfo;
m_bstrCallerId = pJobStatus->lpctstrCallerID;
m_dwValidityMask = pJobStatus->dwValidityMask;
if ( ((pJobStatus->lpctstrTsid) && !m_bstrTSID) ||
((pJobStatus->lpctstrCsid) && !m_bstrCSID) ||
((pJobStatus->lpctstrRoutingInfo) && !m_bstrRoutingInfo) ||
((pJobStatus->lpctstrExtendedStatus) && !m_bstrExtendedStatus) ||
((pJobStatus->lpctstrCallerID) && !m_bstrCallerId) )
{
//
// Not enough memory to copy the TSID into CComBSTR
//
hr = E_OUTOFMEMORY;
AtlReportError(CLSID_FaxJobStatus, IDS_ERROR_OUTOFMEMORY, IID_IFaxJobStatus, hr);
CALL_FAIL(MEM_ERR, _T("CComBSTR::operator=()"), hr);
return hr;
}
return hr;
}
//
//======================= SUPPORT ERROR INFO ==================================
//
STDMETHODIMP
CFaxJobStatus::InterfaceSupportsErrorInfo(
REFIID riid
)
/*++
Routine name : CFaxJobStatus::InterfaceSupportsErrorInfo
Routine description:
ATL's implementation of Support Error Info.
Author:
Iv Garber (IvG), Jul, 2000
Arguments:
riid [in] - reference to the ifc to check.
Return Value:
Standard HRESULT code
--*/
{
static const IID* arr[] =
{
&IID_IFaxJobStatus
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}