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.
382 lines
8.5 KiB
382 lines
8.5 KiB
// QueueFolder.cpp: implementation of the CQueueFolder class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#define __FILE_ID__ 19
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
IMPLEMENT_DYNAMIC(CQueueFolder, CFolder)
|
|
|
|
|
|
|
|
|
|
DWORD
|
|
CQueueFolder::Refresh ()
|
|
/*++
|
|
|
|
Routine name : CQueueFolder::Refresh
|
|
|
|
Routine description:
|
|
|
|
Rebuilds the map of the jobs using the client API.
|
|
This function is always called in the context of a worker thread.
|
|
|
|
This function must be called when the data critical section is held.
|
|
|
|
Author:
|
|
|
|
Eran Yariv (EranY), Jan, 2000
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
Standard Win32 error code
|
|
|
|
--*/
|
|
{
|
|
DWORD dwRes = ERROR_SUCCESS;
|
|
DBG_ENTER(TEXT("CQueueFolder::Refresh"), dwRes, TEXT("Type=%d"), Type());
|
|
|
|
//
|
|
// Enumerate jobs from the server
|
|
//
|
|
ASSERTION (m_pServer);
|
|
HANDLE hFax;
|
|
PFAX_JOB_ENTRY_EX pEntries;
|
|
DWORD dwNumJobs;
|
|
DWORD dw;
|
|
|
|
dwRes = m_pServer->GetConnectionHandle (hFax);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
CALL_FAIL (RPC_ERR, TEXT("CFolder::GetConnectionHandle"), dwRes);
|
|
return dwRes;
|
|
}
|
|
if (m_bStopRefresh)
|
|
{
|
|
//
|
|
// Quit immediately
|
|
//
|
|
return dwRes;
|
|
}
|
|
START_RPC_TIME(TEXT("FaxEnumJobsEx"));
|
|
if (!FaxEnumJobsEx (hFax,
|
|
m_dwJobTypes,
|
|
&pEntries,
|
|
&dwNumJobs))
|
|
{
|
|
dwRes = GetLastError ();
|
|
END_RPC_TIME(TEXT("FaxEnumJobsEx"));
|
|
m_pServer->SetLastRPCError (dwRes);
|
|
CALL_FAIL (RPC_ERR, TEXT("FaxEnumJobsEx"), dwRes);
|
|
return dwRes;
|
|
}
|
|
END_RPC_TIME(TEXT("FaxEnumJobsEx"));
|
|
if (m_bStopRefresh)
|
|
{
|
|
//
|
|
// Quit immediately
|
|
//
|
|
goto exit;
|
|
}
|
|
//
|
|
// Make sure our map is empty
|
|
//
|
|
ASSERTION (!m_Msgs.size());
|
|
//
|
|
// Fill the map and the list control
|
|
//
|
|
for (dw = 0; dw < dwNumJobs; dw++)
|
|
{
|
|
PFAX_JOB_ENTRY_EX pEntry = &pEntries[dw];
|
|
|
|
if((pEntry->pStatus->dwQueueStatus & JS_COMPLETED) ||
|
|
(pEntry->pStatus->dwQueueStatus & JS_CANCELED))
|
|
{
|
|
//
|
|
// don't display completed or canceled jobs
|
|
//
|
|
continue;
|
|
}
|
|
|
|
CJob *pJob = NULL;
|
|
try
|
|
{
|
|
pJob = new CJob;
|
|
}
|
|
catch (...)
|
|
{
|
|
dwRes = ERROR_NOT_ENOUGH_MEMORY;
|
|
CALL_FAIL (MEM_ERR, TEXT("new CJob"), dwRes);
|
|
goto exit;
|
|
}
|
|
//
|
|
// Init the message
|
|
//
|
|
dwRes = pJob->Init (pEntry, m_pServer);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
CALL_FAIL (MEM_ERR, TEXT("CJob::Init"), dwRes);
|
|
SAFE_DELETE (pJob);
|
|
goto exit;
|
|
}
|
|
//
|
|
// Enter the message into the map
|
|
//
|
|
EnterData();
|
|
try
|
|
{
|
|
m_Msgs[pEntry->dwlMessageId] = pJob;
|
|
}
|
|
catch (...)
|
|
{
|
|
dwRes = ERROR_NOT_ENOUGH_MEMORY;
|
|
CALL_FAIL (MEM_ERR, TEXT("map::operator[]"), dwRes);
|
|
SAFE_DELETE (pJob);
|
|
LeaveData ();
|
|
goto exit;
|
|
}
|
|
LeaveData ();
|
|
if (m_bStopRefresh)
|
|
{
|
|
//
|
|
// Quit immediately
|
|
//
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
AttachView();
|
|
if (m_pAssignedView)
|
|
{
|
|
//
|
|
// Folder has a view attached
|
|
//
|
|
m_pAssignedView->SendMessage (
|
|
WM_FOLDER_ADD_CHUNK,
|
|
WPARAM (dwRes),
|
|
LPARAM (&m_Msgs));
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Shutdown in progress
|
|
//
|
|
}
|
|
|
|
ASSERTION (ERROR_SUCCESS == dwRes);
|
|
|
|
exit:
|
|
FaxFreeBuffer ((LPVOID)pEntries);
|
|
return dwRes;
|
|
} // CQueueFolder::Refresh
|
|
|
|
|
|
DWORD
|
|
CQueueFolder::OnJobAdded (
|
|
DWORDLONG dwlMsgId
|
|
)
|
|
/*++
|
|
|
|
Routine name : CQueueFolder::OnJobAdded
|
|
|
|
Routine description:
|
|
|
|
Handles notification of a job added to the queue
|
|
|
|
Author:
|
|
|
|
Eran Yariv (EranY), Feb, 2000
|
|
|
|
Arguments:
|
|
|
|
dwlMsgId [in] - New job unique id
|
|
|
|
Return Value:
|
|
|
|
Standard Win32 error code
|
|
|
|
--*/
|
|
{
|
|
DWORD dwRes = ERROR_SUCCESS;
|
|
DBG_ENTER(TEXT("CQueueFolder::OnJobAdded"),
|
|
dwRes,
|
|
TEXT("MsgId=0x%016I64x, Type=%d"),
|
|
dwlMsgId,
|
|
Type());
|
|
|
|
HANDLE hFax;
|
|
PFAX_JOB_ENTRY_EX pFaxJob = NULL;
|
|
CJob *pJob = NULL;
|
|
|
|
EnterData ();
|
|
pJob = (CJob*)FindMessage (dwlMsgId);
|
|
if (pJob)
|
|
{
|
|
//
|
|
// This job is already in the queue
|
|
//
|
|
VERBOSE (DBG_MSG, TEXT("Job is already known and visible"));
|
|
goto exit;
|
|
}
|
|
//
|
|
// Get information about this job
|
|
//
|
|
dwRes = m_pServer->GetConnectionHandle (hFax);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
CALL_FAIL (RPC_ERR, TEXT("CFolder::GetConnectionHandle"), dwRes);
|
|
goto exit;
|
|
}
|
|
{
|
|
START_RPC_TIME(TEXT("FaxGetJobEx"));
|
|
if (!FaxGetJobEx (hFax, dwlMsgId, &pFaxJob))
|
|
{
|
|
dwRes = GetLastError ();
|
|
END_RPC_TIME(TEXT("FaxGetJobEx"));
|
|
m_pServer->SetLastRPCError (dwRes);
|
|
CALL_FAIL (RPC_ERR, TEXT("FaxGetJobEx"), dwRes);
|
|
goto exit;
|
|
}
|
|
END_RPC_TIME(TEXT("FaxGetJobEx"));
|
|
}
|
|
//
|
|
// Enter a new job to the map
|
|
//
|
|
try
|
|
{
|
|
pJob = new CJob;
|
|
ASSERTION (pJob);
|
|
m_Msgs[pFaxJob->dwlMessageId] = pJob;
|
|
}
|
|
catch (...)
|
|
{
|
|
dwRes = ERROR_NOT_ENOUGH_MEMORY;
|
|
SAFE_DELETE (pJob);
|
|
goto exit;
|
|
}
|
|
//
|
|
// Init the message
|
|
//
|
|
dwRes = pJob->Init (pFaxJob, m_pServer);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
CALL_FAIL (MEM_ERR, TEXT("CJob::Init"), dwRes);
|
|
if (pJob)
|
|
{
|
|
try
|
|
{
|
|
m_Msgs.erase (pFaxJob->dwlMessageId);
|
|
}
|
|
catch (...)
|
|
{
|
|
dwRes = ERROR_NOT_ENOUGH_MEMORY;
|
|
CALL_FAIL (MEM_ERR, TEXT("map::erase"), dwRes);
|
|
}
|
|
SAFE_DELETE (pJob);
|
|
}
|
|
goto exit;
|
|
}
|
|
if (m_pAssignedView)
|
|
{
|
|
//
|
|
// If this folder is alive - tell our view to add the job
|
|
//
|
|
m_pAssignedView->OnUpdate (NULL, UPDATE_HINT_ADD_ITEM, pJob);
|
|
}
|
|
|
|
ASSERTION (ERROR_SUCCESS == dwRes);
|
|
|
|
exit:
|
|
if(pFaxJob)
|
|
{
|
|
FaxFreeBuffer(pFaxJob);
|
|
}
|
|
LeaveData ();
|
|
return dwRes;
|
|
} // CQueueFolder::OnJobAdded
|
|
|
|
|
|
DWORD
|
|
CQueueFolder::OnJobUpdated (
|
|
DWORDLONG dwlMsgId,
|
|
PFAX_JOB_STATUS pNewStatus
|
|
)
|
|
/*++
|
|
|
|
Routine name : CQueueFolder::OnJobUpdated
|
|
|
|
Routine description:
|
|
|
|
Handles notification of a job removed from the queue
|
|
|
|
Author:
|
|
|
|
Eran Yariv (EranY), Feb, 2000
|
|
|
|
Arguments:
|
|
|
|
dwlMsgId [in] - Job unique id
|
|
pNewStatus [in] - New status of the job
|
|
|
|
Return Value:
|
|
|
|
Standard Win32 error code
|
|
|
|
--*/
|
|
{
|
|
DWORD dwRes = ERROR_SUCCESS;
|
|
DBG_ENTER(TEXT("CQueueFolder::OnJobUpdated"),
|
|
dwRes,
|
|
TEXT("MsgId=0x%016I64x, Type=%d"),
|
|
dwlMsgId,
|
|
Type());
|
|
|
|
CJob *pJob = NULL;
|
|
|
|
EnterData ();
|
|
pJob = (CJob*)FindMessage (dwlMsgId);
|
|
if (!pJob)
|
|
{
|
|
//
|
|
// This job is not in the queue - treat the notification as if the job was added
|
|
//
|
|
VERBOSE (DBG_MSG, TEXT("Job is not known - adding it"));
|
|
LeaveData ();
|
|
dwRes = OnJobAdded (dwlMsgId);
|
|
return dwRes;
|
|
}
|
|
//
|
|
// Update job's status
|
|
//
|
|
if(pJob->IsNewStatus(pNewStatus))
|
|
{
|
|
dwRes = pJob->UpdateStatus (pNewStatus);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT("CJob::UpdateStatus"), dwRes);
|
|
goto exit;
|
|
}
|
|
if (m_pAssignedView)
|
|
{
|
|
//
|
|
// If this folder is alive - tell our view to update the job
|
|
//
|
|
m_pAssignedView->OnUpdate (NULL, UPDATE_HINT_UPDATE_ITEM, pJob);
|
|
}
|
|
}
|
|
|
|
ASSERTION (ERROR_SUCCESS == dwRes);
|
|
|
|
exit:
|
|
LeaveData ();
|
|
return dwRes;
|
|
} // CQueueFolder::OnJobUpdated
|