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.
 
 
 
 
 
 

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