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
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
|
|
|