XPLIST.H

/////////////////////////////////////////////////////////////////////////////// 
//
// File Name
// XPLIST.H
//
// Description
// Data structures, class definitions, and prototypes for downloading
// messages. Here define CList and CMsgQueue.
// CList holds a pointer to two messages queues: Messages to download
// and downloaded messages that are pending processing from the spooler.
//
// Author
// Les Thaler
//
// Revision: 1.7
//
// Written for Microsoft Windows Developer Support
// Copyright (c) 1995-1996 Microsoft Corporation. All rights reserved.
//
#ifndef _XPLIST_H_
#define _XPLIST_H_

long WINAPI FileCopy (HANDLE hTemp, HANDLE hPipe, DWORD dwMsgLen);
MID WINAPI PropToMID (long lProp);

class CList;
class CXPLogon;

// node in queue of downloaded/to-be-downloaded messages
typedef struct _LIST_NODE
{
struct _LIST_NODE * pNext;
HANDLE hFile;
TCHAR szFileName[_MAX_PATH];
MSG_HDR Hdr;
MID OpStat;
BOOL fRetry;
} LIST_NODE, *PLIST_NODE;


// FIFO queue of downloaded/to-be-downloaded messages
class CMsgQueue
{
friend CList;
///////////////////////////////////////////////////////////////////////////////
// Member functions specific to this class
//
public:
void WINAPI Insert
(PLIST_NODE pNode);
PLIST_NODE WINAPI Delete
();
inline BOOL WINAPI Empty
() { return m_ulItems == 0;};

///////////////////////////////////////////////////////////////////////////////
// Constructors and destructors
//
CMsgQueue();
~CMsgQueue();

///////////////////////////////////////////////////////////////////////////////
// Data members
//
private :
PLIST_NODE m_pHead;
PLIST_NODE m_pTail;
public:
ULONG m_ulItems;
};

// Object for manipulating downloaded/to-be-downloaded queues
// including managing data transfer with remote server
class CList
{
///////////////////////////////////////////////////////////////////////////////
// Member functions specific to this class
//
public :
BOOL WINAPI Init
();
STDMETHODIMP DownLoadMsgs
(LPMAPITABLE pTable,
ULONG ulRowCount,
HANDLE hPipe);
BOOL WINAPI UpdateTableRow
(LPBYTE pEID,
MID midAction);
inline void WINAPI SetLogon
(CXPLogon * pLogon)
{ m_pLogon = pLogon; }
inline PLIST_NODE WINAPI GetDownloadNode
() { if (m_pDownloaded)
{ return m_pDownloaded->Delete(); }
return NULL; }
inline BOOL WINAPI AreTherePendingDownloads
() { if (m_pDownloaded)
{ return (!m_pDownloaded->Empty()); }
return FALSE; }
inline BOOL WINAPI QueuePendingMsgFile
(LPTSTR pstrFileName)
{ PLIST_NODE pNode = new LIST_NODE;
if (pNode)
{ ZeroMemory (pNode, sizeof(LIST_NODE));
lstrcpy (pNode->szFileName, pstrFileName);
m_pDownloaded->Insert (pNode);
return TRUE;
}
TraceMessage ("CLisg::QueuePendingMsgFile: Failed to allocate new node");
return FALSE; }
void WINAPI UpdateProgress
();
inline void WINAPI ReQueueNode
(PLIST_NODE pNode)
{ m_pToDownload->Insert (pNode); }

private :
void WINAPI DownLoadNow
(HANDLE hPipe);
///////////////////////////////////////////////////////////////////////////////
// Constructors and destructors
//
public :
CList();
~CList();

///////////////////////////////////////////////////////////////////////////////
// Data members
//
private :
ULONG m_ulMsgCount;
ULONG m_ulMsgLeft;
CXPLogon * m_pLogon; // We need access to his stuff
CMsgQueue * m_pToDownload; // 'TO DO' queue
CMsgQueue * m_pDownloaded; // 'DONE' queue
};

#endif // _XPLIST_H_

// End of file for XPLIST.H