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.
 
 
 
 
 
 

418 lines
10 KiB

// MessageFolder.cpp: implementation of the CMessageFolder class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#define __FILE_ID__ 14
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define DEFAULT_NUM_MSGS_PER_CALL 100
DWORD CMessageFolder::m_sdwNumMessagesPerRPCCall = 0;
void
CMessageFolder::ReadConfiguration ()
/*++
Routine name : CMessageFolder::ReadConfiguration
Routine description:
Reads the Messages-Per-RPC-Call parameters from the registry
Author:
Eran Yariv (EranY), Jan, 2000
Arguments:
Return Value:
None.
--*/
{
m_sdwNumMessagesPerRPCCall =
AfxGetApp ()->GetProfileInt (CLIENT_ARCHIVE_KEY,
CLIENT_ARCHIVE_MSGS_PER_CALL,
DEFAULT_NUM_MSGS_PER_CALL);
}
DWORD
CMessageFolder::Refresh ()
/*++
Routine name : CMessageFolder::Refresh
Routine description:
Rebuilds the map of the message 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("CMessageFolder::Refresh"), dwRes, TEXT("Type=%d"), Type());
//
// Enumerate archived messages from the server
//
ASSERTION (m_pServer);
HANDLE hFax;
HANDLE hEnum;
DWORD dwIndex;
DWORD dwNumMsgs = 0;
PFAX_MESSAGE pMsgs = NULL;
MSGS_MAP mapChunk;
ASSERTION (m_sdwNumMessagesPerRPCCall);
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("FaxStartMessagesEnum"));
if (!FaxStartMessagesEnum (hFax, m_Folder, &hEnum))
{
dwRes = GetLastError ();
END_RPC_TIME(TEXT("FaxStartMessagesEnum"));
if (ERROR_NO_MORE_ITEMS == dwRes)
{
//
// This is not a real error - the folder is simply empty
//
VERBOSE (DBG_MSG, TEXT("Folder is empty"));
dwRes = ERROR_SUCCESS;
return dwRes;
}
m_pServer->SetLastRPCError (dwRes);
CALL_FAIL (RPC_ERR, TEXT("FaxStartMessagesEnum"), dwRes);
return dwRes;
}
END_RPC_TIME(TEXT("FaxStartMessagesEnum"));
if (m_bStopRefresh)
{
//
// Quit immediately
//
goto exit;
}
//
// Make sure our list is empty
//
ASSERTION (!m_Msgs.size());
//
// Get the messages in bunches
//
while (ERROR_SUCCESS == dwRes)
{
DWORD dwReturnedMsgs;
START_RPC_TIME(TEXT("FaxEnumMessages"));
if (!FaxEnumMessages (hEnum, m_sdwNumMessagesPerRPCCall, &pMsgs, &dwReturnedMsgs))
{
dwRes = GetLastError ();
END_RPC_TIME(TEXT("FaxEnumMessages"));
if (ERROR_NO_MORE_ITEMS != dwRes)
{
//
// Really an error
//
m_pServer->SetLastRPCError (dwRes);
CALL_FAIL (RPC_ERR, TEXT("FaxEnumMessages"), dwRes);
goto exit;
}
else
{
//
// Not an error - just a "end of data" sign
//
break;
}
}
END_RPC_TIME(TEXT("FaxEnumMessages"));
if (m_bStopRefresh)
{
//
// Quit immediately
//
goto exit;
}
//
// Success in enumeration
//
mapChunk.clear();
for (dwIndex = 0; dwIndex < dwReturnedMsgs; dwIndex++)
{
CArchiveMsg *pMsg = NULL;
//
// Create a new message
//
try
{
pMsg = new CArchiveMsg;
}
catch (...)
{
dwRes = ERROR_NOT_ENOUGH_MEMORY;
CALL_FAIL (MEM_ERR, TEXT("new CArchiveMsg"), dwRes);
goto exit;
}
//
// Init the message
//
dwRes = pMsg->Init (&pMsgs[dwIndex], m_pServer);
if (ERROR_SUCCESS != dwRes)
{
CALL_FAIL (MEM_ERR, TEXT("CArchiveMsg::Init"), dwRes);
SAFE_DELETE (pMsg);
goto exit;
}
//
// Enter the message into the map
//
EnterData();
try
{
m_Msgs[pMsgs[dwIndex].dwlMessageId] = pMsg;
mapChunk[pMsgs[dwIndex].dwlMessageId] = pMsg;
}
catch (...)
{
dwRes = ERROR_NOT_ENOUGH_MEMORY;
CALL_FAIL (MEM_ERR, TEXT("map::operator[]"), dwRes);
SAFE_DELETE (pMsg);
LeaveData ();
goto exit;
}
LeaveData ();
if (m_bStopRefresh)
{
//
// Quit immediately
//
goto exit;
}
}
//
// Free current chunk of messages
//
FaxFreeBuffer ((LPVOID)pMsgs);
pMsgs = NULL;
AttachView();
if (m_pAssignedView)
{
//
// Folder has a view attached
//
m_pAssignedView->SendMessage (
WM_FOLDER_ADD_CHUNK,
WPARAM (dwRes),
LPARAM (&mapChunk));
}
else
{
//
// Shutdown in progress
//
goto exit;
}
}
if (ERROR_NO_MORE_ITEMS == dwRes)
{
//
// Not a real error
//
dwRes = ERROR_SUCCESS;
}
ASSERTION (ERROR_SUCCESS == dwRes);
exit:
//
// Close enumeration handle
//
ASSERTION (hEnum);
{
START_RPC_TIME(TEXT("FaxEndMessagesEnum"));
if (!FaxEndMessagesEnum (hEnum))
{
dwRes = GetLastError ();
END_RPC_TIME(TEXT("FaxEndMessagesEnum"));
m_pServer->SetLastRPCError (dwRes);
CALL_FAIL (RPC_ERR, TEXT("FaxEndMessagesEnum"), dwRes);
}
else
{
END_RPC_TIME(TEXT("FaxEndMessagesEnum"));
}
}
//
// Free left overs (if exist)
//
FaxFreeBuffer ((LPVOID)pMsgs);
return dwRes;
} // CMessageFolder::Refresh
DWORD
CMessageFolder::OnJobAdded (
DWORDLONG dwlMsgId
)
/*++
Routine name : CMessageFolder::OnJobAdded
Routine description:
Handles notification of a message added to the archive
Author:
Eran Yariv (EranY), Feb, 2000
Arguments:
dwlMsgId [in] - New message unique id
Return Value:
Standard Win32 error code
--*/
{
DWORD dwRes = ERROR_SUCCESS;
DBG_ENTER(TEXT("CMessageFolder::OnJobAdded"),
dwRes,
TEXT("MsgId=0x%016I64x, Type=%d"),
dwlMsgId,
Type());
HANDLE hFax;
PFAX_MESSAGE pFaxMsg = NULL;
CArchiveMsg *pMsg = NULL;
EnterData ();
pMsg = (CArchiveMsg*)FindMessage (dwlMsgId);
if (pMsg)
{
//
// This message is already in the archive
//
VERBOSE (DBG_MSG, TEXT("Message is already known and visible"));
goto exit;
}
//
// Get information about this message
//
dwRes = m_pServer->GetConnectionHandle (hFax);
if (ERROR_SUCCESS != dwRes)
{
CALL_FAIL (RPC_ERR, TEXT("CFolder::GetConnectionHandle"), dwRes);
goto exit;
}
{
START_RPC_TIME(TEXT("FaxGetMessage"));
if (!FaxGetMessage (hFax, dwlMsgId, m_Folder, &pFaxMsg))
{
dwRes = GetLastError ();
END_RPC_TIME(TEXT("FaxGetMessage"));
m_pServer->SetLastRPCError (dwRes);
CALL_FAIL (RPC_ERR, TEXT("FaxGetMessage"), dwRes);
goto exit;
}
END_RPC_TIME(TEXT("FaxGetMessage"));
}
//
// Enter a new message to the map
//
try
{
pMsg = new CArchiveMsg;
ASSERTION (pMsg);
m_Msgs[pFaxMsg->dwlMessageId] = pMsg;
}
catch (...)
{
dwRes = ERROR_NOT_ENOUGH_MEMORY;
SAFE_DELETE (pMsg);
goto exit;
}
//
// Init the message
//
dwRes = pMsg->Init (pFaxMsg, m_pServer);
if (ERROR_SUCCESS != dwRes)
{
CALL_FAIL (MEM_ERR, TEXT("CArchiveMsg::Init"), dwRes);
//
// Remove message from map and delete it
//
if (pMsg)
{
try
{
m_Msgs.erase (pFaxMsg->dwlMessageId);
}
catch (...)
{
dwRes = ERROR_NOT_ENOUGH_MEMORY;
CALL_FAIL (MEM_ERR, TEXT("map::erase"), dwRes);
}
SAFE_DELETE (pMsg);
}
goto exit;
}
if (m_pAssignedView)
{
//
// If this folder is alive - tell our view to add the message
//
m_pAssignedView->OnUpdate (NULL, UPDATE_HINT_ADD_ITEM, pMsg);
}
ASSERTION (ERROR_SUCCESS == dwRes);
exit:
if(pFaxMsg)
{
FaxFreeBuffer(pFaxMsg);
}
LeaveData ();
return dwRes;
} // CMessageFolder::OnJobAdded