// FaxJob.cpp : Implementation of CFaxJobs #include "stdafx.h" #include "FaxJob.h" ///////////////////////////////////////////////////////////////////////////// // CFaxJobs CFaxJobs::~CFaxJobs() { if (m_pFaxServer) { m_pFaxServer->Release(); } if (m_VarVect) { delete [] m_VarVect; } } BOOL CFaxJobs::Init(CFaxServer * pFaxServer) { PFAX_JOB_ENTRYW JobEntry = NULL; DWORD PortInfoSize = 0; HRESULT hr; // // get the ports from the server // if (!pFaxServer) { return FALSE; } m_pFaxServer = pFaxServer; hr = m_pFaxServer->AddRef(); if (FAILED(hr)) { m_pFaxServer = NULL; return FALSE; } if (!FaxEnumJobsW( m_pFaxServer->GetFaxHandle(), &JobEntry, &m_Jobs)) { m_LastFaxError = GetLastError(); return FALSE; } // // enumerate the ports // m_VarVect = new CComVariant[m_Jobs]; if (!m_VarVect) { FaxFreeBuffer( JobEntry ); m_LastFaxError = ERROR_OUTOFMEMORY; return FALSE; } for (DWORD i=0; i *pFaxJob; hr = CComObject::CreateInstance( &pFaxJob ); if (FAILED(hr)) { delete [] m_VarVect; m_VarVect = NULL; FaxFreeBuffer( JobEntry ); return FALSE; } // // set the values // if (!pFaxJob->Initialize( m_pFaxServer, JobEntry[i].JobId, JobEntry[i].UserName, JobEntry[i].JobType, JobEntry[i].QueueStatus, JobEntry[i].Status, JobEntry[i].PageCount, JobEntry[i].RecipientNumber, JobEntry[i].RecipientName, JobEntry[i].Tsid, JobEntry[i].SenderName, JobEntry[i].SenderCompany, JobEntry[i].SenderDept, JobEntry[i].BillingCode, JobEntry[i].ScheduleAction, JobEntry[i].DocumentName )) { delete [] m_VarVect; m_VarVect = NULL; FaxFreeBuffer( JobEntry ); return FALSE; } // // get IDispatch pointer // LPDISPATCH lpDisp = NULL; hr = pFaxJob->QueryInterface( IID_IDispatch, (void**)&lpDisp ); if (FAILED(hr)) { delete [] m_VarVect; m_VarVect = NULL; FaxFreeBuffer( JobEntry ); return FALSE; } // // create a variant and add it to the collection // CComVariant &var = m_VarVect[i]; var.vt = VT_DISPATCH; var.pdispVal = lpDisp; } FaxFreeBuffer( JobEntry ); return TRUE; } STDMETHODIMP CFaxJobs::get_Count(long * pVal) { if (!pVal) { return E_POINTER; } __try { *pVal = m_Jobs; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { } return E_UNEXPECTED; } STDMETHODIMP CFaxJobs::get_Item(long Index, VARIANT * pVal) { if (!pVal) { return E_POINTER; } // // use 1-based index, VB like // if ((Index < 1) || (Index > (long) m_Jobs)) { return E_INVALIDARG; } __try { VariantInit( pVal ); pVal->vt = VT_UNKNOWN; pVal->punkVal = NULL; return VariantCopy( pVal, &m_VarVect[Index-1] ); } __except (EXCEPTION_EXECUTE_HANDLER) { } return E_UNEXPECTED; } ///////////////////////////////////////////////////////////////////////////// // CFaxJob STDMETHODIMP CFaxJob::get_JobId(long * pVal) { if (!pVal) { return E_POINTER; } __try { *pVal = m_JobId; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_Type(long * pVal) { if (!pVal) { return E_POINTER; } __try { *pVal = m_JobType; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_UserName(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_UserName); if (!Copy && m_UserName) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_QueueStatus(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_szQueueStatus); if (!Copy && m_szQueueStatus) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_DeviceStatus(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_szDeviceStatus); if (!Copy && m_szDeviceStatus) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_PageCount(long * pVal) { if (!pVal) { return E_POINTER; } __try { *pVal = m_PageCount; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_FaxNumber(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_RecipientNumber); if (!Copy && m_RecipientNumber) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_RecipientName(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_RecipientName); if (!Copy && m_RecipientName) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_Tsid(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_Tsid); if (!Copy && m_Tsid) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_SenderName(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_SenderName); if (!Copy && m_SenderName) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_SenderCompany(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_SenderCompany); if (!Copy && m_SenderCompany) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_SenderDept(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_SenderDept); if (!Copy && m_SenderDept) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_BillingCode(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_BillingCode); if (!Copy && m_BillingCode) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_DisplayName(BSTR * pVal) { if (!pVal) { return E_POINTER; } BSTR Copy = SysAllocString(m_DisplayName); if (!Copy && m_DisplayName) { return E_OUTOFMEMORY; } __try { *pVal = Copy; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { SysFreeString(Copy); } return E_UNEXPECTED; } STDMETHODIMP CFaxJob::get_DiscountSend(BOOL * pVal) { if (!pVal) { return E_POINTER; } __try { *pVal = m_DiscountTime; return S_OK; } __except (EXCEPTION_EXECUTE_HANDLER) { } return E_UNEXPECTED; } CFaxJob::~CFaxJob() { SysFreeString(m_UserName); SysFreeString(m_szQueueStatus); SysFreeString(m_szDeviceStatus); SysFreeString(m_RecipientNumber); SysFreeString(m_RecipientName); SysFreeString(m_Tsid); SysFreeString(m_SenderName); SysFreeString(m_SenderCompany); SysFreeString(m_SenderDept); SysFreeString(m_BillingCode); SysFreeString(m_DisplayName); if (m_pFaxServer) { m_pFaxServer->Release(); } } BOOL CFaxJob::Initialize( CFaxServer *pFaxServer, DWORD JobId, LPCWSTR UserName, DWORD JobType, DWORD QueueStatus, DWORD DeviceStatus, DWORD PageCount, LPCWSTR RecipientNumber, LPCWSTR RecipientName, LPCWSTR Tsid, LPCWSTR SenderName, LPCWSTR SenderCompany, LPCWSTR SenderDept, LPCWSTR BillingCode, DWORD ScheduleAction, LPCWSTR DisplayName) { if (!pFaxServer) { return FALSE; } m_pFaxServer = pFaxServer; if ( FAILED(m_pFaxServer->AddRef()) ) { m_pFaxServer = NULL; return FALSE; } m_UserName = SysAllocString(UserName); m_szQueueStatus = GetQueueStatus(m_QueueStatus); m_szDeviceStatus = GetDeviceStatus(m_DeviceStatus); m_RecipientNumber = SysAllocString(RecipientNumber); m_RecipientName = SysAllocString(RecipientName); m_Tsid = SysAllocString(Tsid); m_SenderName = SysAllocString(SenderName); m_SenderCompany = SysAllocString(SenderCompany); m_SenderDept = SysAllocString(SenderDept); m_BillingCode = SysAllocString(BillingCode); m_DisplayName = SysAllocString(DisplayName); if ( (!m_UserName && UserName) || (!m_szQueueStatus) || (!m_szDeviceStatus) || (!m_RecipientNumber && RecipientNumber) || (!m_RecipientName && RecipientName) || (!m_Tsid && Tsid) || (!m_SenderName && SenderName) || (!m_SenderCompany && SenderCompany) || (!m_SenderDept && SenderDept) || (!m_BillingCode && BillingCode) || (!m_DisplayName && DisplayName) ) { goto error; } m_JobId = JobId; m_JobType = JobType; m_QueueStatus = QueueStatus; m_DeviceStatus = DeviceStatus; m_PageCount = PageCount; m_DiscountTime = (ScheduleAction == JSA_DISCOUNT_PERIOD) ? TRUE : FALSE; return TRUE; error: SysFreeString(m_DisplayName); SysFreeString(m_BillingCode); SysFreeString(m_SenderDept); SysFreeString(m_SenderCompany); SysFreeString(m_SenderName); SysFreeString(m_Tsid); SysFreeString(m_RecipientName); SysFreeString(m_RecipientNumber); SysFreeString(m_szDeviceStatus); SysFreeString(m_szQueueStatus); SysFreeString(m_UserName); m_pFaxServer->Release(); m_pFaxServer = NULL; return FALSE; } BOOL CFaxJob::SetJob() { FAX_JOB_ENTRYW FaxJobEntry; ZeroMemory(&FaxJobEntry,sizeof(FAX_JOB_ENTRYW) ); FaxJobEntry.SizeOfStruct = sizeof(FAX_JOB_ENTRYW); FaxJobEntry.JobId = m_JobId; FaxJobEntry.UserName = m_UserName; FaxJobEntry.JobType = m_JobType; FaxJobEntry.QueueStatus = m_QueueStatus; FaxJobEntry.Status = m_DeviceStatus; FaxJobEntry.PageCount = m_PageCount; FaxJobEntry.RecipientNumber = m_RecipientNumber; FaxJobEntry.RecipientName = m_RecipientName; FaxJobEntry.Tsid = m_Tsid; FaxJobEntry.SenderName = m_SenderName; FaxJobEntry.SenderCompany = m_SenderCompany; FaxJobEntry.SenderDept = m_SenderDept; FaxJobEntry.BillingCode = m_BillingCode; FaxJobEntry.ScheduleAction = m_DiscountTime ? JSA_DISCOUNT_PERIOD : JSA_NOW; FaxJobEntry.DocumentName = m_DisplayName; if (!FaxSetJobW(m_pFaxServer->GetFaxHandle(),m_JobId,m_Command,&FaxJobEntry) ) { return FALSE; } return TRUE; } STDMETHODIMP CFaxJob::SetStatus(long Command) { m_Command = Command; if (!SetJob()) { return Fax_HRESULT_FROM_WIN32(GetLastError()); } return S_OK; } STDMETHODIMP CFaxJob::Refresh() { PFAX_JOB_ENTRYW FaxJobEntry; HRESULT hr = S_OK; if (!FaxGetJobW(m_pFaxServer->GetFaxHandle(),m_JobId,&FaxJobEntry) ) { return Fax_HRESULT_FROM_WIN32(GetLastError()); } if (m_UserName) { SysFreeString(m_UserName); } m_UserName = SysAllocString(FaxJobEntry->UserName); m_JobType = FaxJobEntry->JobType; m_QueueStatus = FaxJobEntry->QueueStatus; m_DeviceStatus = FaxJobEntry->Status; if (m_szQueueStatus) { SysFreeString(m_szQueueStatus); } m_szQueueStatus = GetQueueStatus(m_QueueStatus); if (m_szDeviceStatus) { SysFreeString(m_szDeviceStatus); } m_szDeviceStatus = GetDeviceStatus(m_DeviceStatus); m_PageCount = FaxJobEntry->PageCount; if (m_RecipientNumber ) { SysFreeString(m_RecipientNumber); } m_RecipientNumber = SysAllocString(FaxJobEntry->RecipientNumber); if (m_RecipientName ) { SysFreeString(m_RecipientName); } m_RecipientName = SysAllocString(FaxJobEntry->RecipientName); if (m_Tsid ) { SysFreeString(m_Tsid); } m_Tsid = SysAllocString(FaxJobEntry->Tsid); if (m_SenderName ) { SysFreeString(m_SenderName); } m_SenderName = SysAllocString(FaxJobEntry->SenderName); if (m_SenderCompany) { SysFreeString(m_SenderCompany); } m_SenderCompany = SysAllocString(FaxJobEntry->SenderCompany); if (m_SenderDept) { SysFreeString(m_SenderDept); } m_SenderDept = SysAllocString(FaxJobEntry->SenderDept); if (m_BillingCode ) { SysFreeString(m_BillingCode); } m_BillingCode = SysAllocString(FaxJobEntry->BillingCode); if (m_DisplayName) { SysFreeString(m_DisplayName); } m_DisplayName = SysAllocString(FaxJobEntry->DocumentName); m_DiscountTime = (FaxJobEntry->ScheduleAction == JSA_DISCOUNT_PERIOD) ? TRUE : FALSE; if (!m_szQueueStatus || !m_szDeviceStatus || (!m_UserName && FaxJobEntry->UserName) || (!m_RecipientNumber && FaxJobEntry->RecipientNumber) || (!m_RecipientName && FaxJobEntry->RecipientName) || (!m_Tsid && FaxJobEntry->Tsid) || (!m_SenderName && FaxJobEntry->SenderName) || (!m_SenderCompany && FaxJobEntry->SenderCompany) || (!m_SenderDept && FaxJobEntry->SenderDept) || (!m_BillingCode && FaxJobEntry->BillingCode) || (!m_DisplayName && FaxJobEntry->DocumentName) ) { hr = E_OUTOFMEMORY; SysFreeString(m_DisplayName); SysFreeString(m_BillingCode); SysFreeString(m_SenderDept); SysFreeString(m_SenderCompany); SysFreeString(m_SenderName); SysFreeString(m_Tsid); SysFreeString(m_RecipientName); SysFreeString(m_RecipientNumber); SysFreeString(m_szDeviceStatus); SysFreeString(m_szQueueStatus); SysFreeString(m_UserName); } FaxFreeBuffer(FaxJobEntry); return hr; }