/*++ 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; }