Click here to Skip to main content
15,895,709 members
Articles / Desktop Programming / MFC

The Ultimate TCP/IP Home Page

Rate me:
Please Sign up or sign in to vote.
4.98/5 (77 votes)
25 Aug 2007CPOL13 min read 2.6M   45.4K   267  
Ultimate TCP-IP is now Open Source
// =================================================================
//  class: CUT_IMAP4Client
//  File:  IMAP4_c.h
//  
//  Purpose:
//
//  IMAP4rev1 Client Class declaration
//  
//  RFC  1730, 2060
//      
// ===================================================================
// Ultimate TCP/IP v4.2
// This software along with its related components, documentation and files ("The Libraries")
// is � 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
// governed by a software license agreement ("Agreement").  Copies of the Agreement are
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
// to obtain this file, or directly from our office.  For a copy of the license governing
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
// ===================================================================


#ifndef IMAP4_CLIENT_H_ENUM
#define IMAP4_CLIENT_H_ENUM


/********************************
 SystemFlags enum
*********************************/
typedef enum SystemFlagsTag {
    SYS_FLAG_ANSWERED   = 1,
    SYS_FLAG_FLAGGED    = 2,
    SYS_FLAG_DELETED    = 4,
    SYS_FLAG_SEEN       = 8,
    SYS_FLAG_DRAFT      = 16,
    SYS_FLAG_RECENT     = 32,
    SYS_FLAG_SPECIAL    = 64
    } SystemFlags;

/********************************
 FetchItem enum
*********************************/
typedef enum FetchItemTag {
    MSG_BODY         = 0,
    MSG_BODY_TEXT,
    MSG_BODY_HEADER
    } FetchItem;

/********************************
 StoreType enum
*********************************/
typedef enum StoreTypeTag {
    STORE_FLAG_REPLACE      = 0,
    STORE_FLAG_REPLACE_NO_RETURN,
    STORE_FLAG_ADD,
    STORE_FLAG_ADD_NO_RETURN,
    STORE_FLAG_REMOVE,
    STORE_FLAG_REMOVE_NO_RETURN
    } StoreType;

/********************************
 ClientState enum
*********************************/
typedef enum ClientStateTag {
    STATE_NON_AUTHENTICATED,
    STATE_AUTHENTICATED,
    STATE_SELECTED,
    STATE_LOGOUT
    } ClientState;

/********************************
 NameAttrib enum
*********************************/
typedef enum NameAttribTag {
    NAME_ATTRIB_NOINFERIORS = 1,
    NAME_ATTRIB_NOSELECT    = 2,
    NAME_ATTRIB_MARKED      = 4,
    NAME_ATTRIB_UNMARKED    = 8
    } NameAttrib;

#endif  // #ifndef IMAP4_CLIENT_H_ENUM

#ifndef __midl


#ifndef IMAP4_CLIENT_H
#define IMAP4_CLIENT_H


#include "ut_clnt.h"   
#include "UTMessage.h"   

#include <process.h>


// suppress level 4 warnings generated by STL - Transitional for VC6 support
#pragma warning ( push, 3 )		
#pragma warning (disable : 4018 4146 ) 
#include <string>
#pragma warning (pop)
#pragma warning ( push, 3 )	
#pragma warning (disable : 4018)
#include <vector>
#pragma warning (pop)

#define     MAX_LINE_BUFFER     1000
#define     MAX_DATE_TIME_SIZE  100
#define     MAX_TAG_SIZE        6

using namespace std ;

/********************************
 CUT_MailBoxListItem class
*********************************/
class CUT_MailBoxListItem {
public:
    CUT_MailBoxListItem() : m_nNameAttrib(0) {}

    int         m_nNameAttrib;      // Name attribute
    string      m_strDelimiter;     // Name delimiter
    string      m_strName;          // Name
};

typedef vector<CUT_MailBoxListItem> MAILBOX_ITEMS_VECTOR;

// v4.2 allows return of _TCHAR pointers for GetMailBoxListItem overload
class CUT_MailBoxListItemT {
public:
    CUT_MailBoxListItemT() : m_nNameAttrib(0),
		m_strDelimiter(NULL),
		m_strName(NULL)
	{}
	~CUT_MailBoxListItemT() {
		if(m_strDelimiter != NULL) delete [] m_strDelimiter;
		if(m_strName != NULL) delete [] m_strName;
		}
	int		m_nNameAttrib;
	_TCHAR  *m_strDelimiter;
	_TCHAR  *m_strName;

};


/********************************
 CUT_MsgData class
*********************************/
class CUT_MsgDataA {
public:
    CUT_MsgDataA() : m_lFlags(0), m_lUID(0), m_ptrData(NULL), m_nDataType(0)
    {
        m_szUnknownFlags[0] = 0;
        m_szDateTime[0]     = 0;
    }
    
    long    m_lMsgNumber;                           // Message sequence number
    long    m_lSize;                                // Message size
    long    m_lFlags;                               // Message flags
    char    m_szUnknownFlags[MAX_LINE_BUFFER+1];    // Unknown message flags as string
    char    m_szDateTime[MAX_DATE_TIME_SIZE+1];     // Message internal date
    long    m_lUID;                                 // Unique identifier of the message.

    int             m_nDataType;                    // Type of message data (see FetchItem)
    CUT_DataSource  *m_ptrData;                     // Message data 
};

/********************************
 CUT_MsgData class - wide char as of v4.2 for UI
*********************************/
class CUT_MsgData {
public:
    CUT_MsgData() : m_lFlags(0), m_lUID(0), m_ptrData(NULL), m_nDataType(0)
    {
        m_szUnknownFlags[0] = _T('\0');
        m_szDateTime[0]     = _T('\0');
    }
    
    long    m_lMsgNumber;                           // Message sequence number
    long    m_lSize;                                // Message size
    long    m_lFlags;                               // Message flags
    _TCHAR  m_szUnknownFlags[MAX_LINE_BUFFER+1];    // Unknown message flags as string
    _TCHAR  m_szDateTime[MAX_DATE_TIME_SIZE+1];     // Message internal date
    long    m_lUID;                                 // Unique identifier of the message.

    int             m_nDataType;                    // Type of message data (see FetchItem)
    CUT_DataSource  *m_ptrData;                     // Message data 
};
typedef vector<CUT_MsgDataA> MSGDATA_ITEMS_VECTOR;

typedef vector<long> LONG_VECTOR;

/********************************
 CUT_IMAP4Client class
*********************************/
class CUT_IMAP4Client : public CUT_WSClient
{
public:	
    /********************************
     UT_StatusData structure
    *********************************/
    typedef struct UT_StatusDataTag {
        string  m_strName;          // MailBox name
        long    m_lMsgNumber;       // Number of messages
        long    m_lMsgRecent;       // Number of recent messages
        long    m_lMsgUnseen;       // Number of unseen messages
        long    m_lNextUID;         // The next UID value that will be assigned to a new message in the mailbox
        long    m_lUIVV;            // The unique identifier validity value of the mailbox.
        } UT_StatusData;

        BOOL            m_bMailBoxWriteAccess;      // TRUE if we have write access to the mailbox
        long            m_lMailBoxMsgNumber;        // Mailbox messages number
        long            m_lMailBoxMsgRecent;        // Mailbox recent messages number
        long            m_lMailBoxFlags;            // Mailbox system flags
        char            m_szMailBoxUnknownFlags[MAX_LINE_BUFFER+1]; // Unknown message flags
        long            m_lMailBoxPermanentFlags;   // Mailbox system flags
        char            m_szMailBoxPermanentUnknownFlags[MAX_LINE_BUFFER+1];    // Mailbox unknown flags
        long            m_lMailBoxUIVV;             // Mailbox unique identifier validity value
        long            m_lMailBoxMsgUnSeen;        // The number of the first message without the \Seen flag set

private:
        BOOL            m_bFireOnExists;            // If TRUE - fire OnExists event
        BOOL            m_bFireOnRecent;            // If TRUE - fire OnRecent event
        BOOL            m_bFireOnExpunge;           // If TRUE - fire OnExpunge event
        BOOL            m_bFireOnFetch;             // If TRUE - fire OnFetch event

        long            m_lOnExistsParam;           
        long            m_lOnRecentParam;
        long            m_lOnExpungeParam;

protected:
        unsigned int            m_nPort;            // Connect port
        int                     m_nIMAP4TimeOut;    // IMAP4 time out in sec.
        int                     m_nConnectTimeout;  // The wait for connect time out 
        long                    m_lNewMailCheckInterval;    // New mail checking interval in sec.

        char                    m_szLastResponse[MAX_LINE_BUFFER + 1]; // Text data from the last response

        ClientState             m_ClientState;      // Current client state

        MAILBOX_ITEMS_VECTOR    m_vectorListItems;  // MailBox LIST or LSUB command result

        MSGDATA_ITEMS_VECTOR    m_vectorMsgData;    // Message data returned by FETCH respomses

		CUT_MsgData				m_msgData;			// v4.2 used for copy from internal ansi to wc

        LONG_VECTOR             m_vectorSearchResult;   // Serch result vector

        UT_StatusData           m_LastUT_StatusData;    // Data from the last STATUS response

        HANDLE                  m_hNewMailThread;   // New mail thread handle

        CRITICAL_SECTION        m_CriticalSection;  // Critical section

        char                    m_szCapabiltyInfo[MAX_LINE_BUFFER+1];   // IMAP4 capabilty information

        vector<CUT_DataSource*> m_vectorPtrDataSource;  // Vector of allocated messages data

        BOOL                    m_bConnection;      // If TRUE connection is established

        BOOL                    m_bGoingToDestroy;  // TRUE if we are going to destroy the object
protected:

        static void     NewMailThreadEntry(void *ptr);

        int             GetResponse(LPCSTR lpszCmdTag, LPSTR lpszResponseText = NULL, int nBufferSize = 0);

        void            ProcessResponse(LPSTR lpszResponse);

        void            GetNewTag(LPSTR lpszTag, int iBufferSize);

        void            GetFlags(LPCSTR lpszFlags, long &nFlagResult, LPSTR lpszUnknownFlags = NULL, int nBufferSize = -1);

        CUT_DataSource *GetStringData(LPCSTR lpszData);

		int				SocketOnConnected(SOCKET s, const char *lpszName);
public:

        // Constructor/Destructor
        CUT_IMAP4Client();
        virtual ~CUT_IMAP4Client();

        // Set/Get connect port
        int     SetPort(unsigned int newPort);
        unsigned int  GetPort() const;

        // Set/Get connect time out
        int     SetConnectTimeout(int secs);
        int     GetConnectTimeout() const;

        // Set/Get IMAP4 time out
        int     SetIMAP4TimeOut(int timeout);
        int     GetIMAP4TimeOut() const;

        // Set/Get new mail check interval 
        int     SetNewMailCheckInterval(long nInterval);
        long    GetNewMailCheckInterval() const;

        virtual LPCSTR  GetCapability();

        virtual ClientState GetClientState();

        // Connect to the IMAP4 server
        virtual int     IMAP4Connect(LPCSTR mailHost, LPCSTR user,LPCSTR password);
#if defined _UNICODE
        virtual int     IMAP4Connect(LPCWSTR mailHost, LPCWSTR user,LPCWSTR password);
#endif

        // Close the IMAP4 connection 
        virtual int     IMAP4Close();

        // No-operation command
        virtual int     Noop();

        // ****************************
        //  Mailbox operating commands
        // ****************************
        virtual int     MailBoxSelect(LPCSTR lpszMailBoxName);
        virtual int     MailBoxExamine(LPCSTR lpszMailBoxName);
        virtual int     MailBoxCreate(LPCSTR lpszMailBoxName);
        virtual int     MailBoxDelete(LPCSTR lpszMailBoxName);
        virtual int     MailBoxRename(LPCSTR lpszMailBoxName, LPCSTR lpszNewMailBoxName);
        virtual int     MailBoxSubscribe(LPCSTR lpszMailBoxName);
        virtual int     MailBoxUnSubscribe(LPCSTR lpszMailBoxName);
        virtual int     MailBoxList(LPCSTR lpszReferenceName, LPCSTR lpszMailBoxName);
        virtual int     MailBoxLSub(LPCSTR lpszReferenceName, LPCSTR lpszMailBoxName);
		virtual int     GetMailBoxListItem(long lIndex, LPCSTR &lpszName, LPCSTR &lpszDelimiter, int &nAttrib);
		// v4.2 overload returns _TCHAR data in struct
        virtual int     GetMailBoxListItem(long lIndex, CUT_MailBoxListItemT *item);

        virtual int     MailBoxStatus(LPCSTR lpszMailBoxName, LPCSTR lpszStatusName, UT_StatusData &Result);

        virtual int     MailBoxAppend(LPCSTR lpszMailBoxName, CUT_DataSource &source, LPCSTR lpszFlags = NULL,  LPCSTR lpszDateTime = NULL);
        virtual int     MailBoxAppend(LPCSTR lpszMailBoxName, CUT_DataSource &source, int nFlags,  LPCSTR lpszDateTime = NULL) ;
        virtual long    GetMailBoxListSize();

#if defined _UNICODE
        virtual int     MailBoxSelect(LPCWSTR lpszMailBoxName);
        virtual int     MailBoxExamine(LPCWSTR lpszMailBoxName);
        virtual int     MailBoxCreate(LPCWSTR lpszMailBoxName);
        virtual int     MailBoxDelete(LPCWSTR lpszMailBoxName);
        virtual int     MailBoxRename(LPCWSTR lpszMailBoxName, LPCWSTR lpszNewMailBoxName);
        virtual int     MailBoxSubscribe(LPCWSTR lpszMailBoxName);
        virtual int     MailBoxUnSubscribe(LPCWSTR lpszMailBoxName);
        virtual int     MailBoxList(LPCWSTR lpszReferenceName, LPCWSTR lpszMailBoxName);
        virtual int     MailBoxLSub(LPCWSTR lpszReferenceName, LPCWSTR lpszMailBoxName);

        virtual int     MailBoxStatus(LPCWSTR lpszMailBoxName, LPCWSTR lpszStatusName, UT_StatusData &Result);

        virtual int     MailBoxAppend(LPCWSTR lpszMailBoxName, CUT_DataSource &source, LPCWSTR lpszFlags = NULL,  LPCWSTR lpszDateTime = NULL);
        virtual int     MailBoxAppend(LPCWSTR lpszMailBoxName, CUT_DataSource &source, int nFlags,  LPCWSTR lpszDateTime = NULL) ;
#endif

        virtual int     MailBoxCheck();

        virtual int     MailBoxClose();

        // ****************************
        //  Messages operating commands
        // ****************************
        virtual int     MessageExpunge();
        virtual long    GetSearchResultSize();
        virtual int     GetSearchResultItem(long lIndex, long &lItem);
        virtual long    GetMsgDataListSize();
        virtual int     GetMsgDataListItem(long lIndex, CUT_MsgData *&ptrMsgData);

        virtual int     MessageSearch(LPCSTR lpszSerchString, LPCSTR lpszCharSet = NULL, BOOL bUseMsgUID = FALSE);
        virtual int     MessageCopy(LPCSTR lpszMessageSet, LPCSTR lpszMailBoxName, BOOL bUseMsgUID = FALSE);
        virtual int     MessageFetch(LPCSTR lpszMessageSet, FetchItem Item, BOOL bSetSeenFlag = FALSE, BOOL bUseMsgUID = FALSE);
        virtual int     MessageStore(LPCSTR lpszMessageSet, LPCSTR lpszStoreType, LPCSTR lpszFlags, BOOL bUseMsgUID = FALSE);
        virtual int     MessageStore(LPCSTR lpszMessageSet, StoreType nStoreType, int nFlags, BOOL bUseMsgUID = FALSE);

#if defined _UNICODE
        virtual int     MessageCopy(LPCWSTR lpszMessageSet, LPCWSTR lpszMailBoxName, BOOL bUseMsgUID = FALSE);
        virtual int     MessageFetch(LPCWSTR lpszMessageSet, FetchItem Item, BOOL bSetSeenFlag = FALSE, BOOL bUseMsgUID = FALSE);
        virtual int     MessageSearch(LPCWSTR lpszSerchString, LPCWSTR lpszCharSet = NULL, BOOL bUseMsgUID = FALSE);
        virtual int     MessageStore(LPCWSTR lpszMessageSet, LPCWSTR lpszStoreType, LPCWSTR lpszFlags, BOOL bUseMsgUID = FALSE);
        virtual int     MessageStore(LPCWSTR lpszMessageSet, StoreType nStoreType, int nFlags, BOOL bUseMsgUID = FALSE);
#endif

        // Gets system flags names 
        virtual void    FlagsToString(int nStatus, LPSTR lpszBuffer, int nBufferSize);
#if defined _UNICODE
		// v4.2 overloaded - this should still be updated to return error check - refactor next version 
        virtual void    FlagsToString(int nStatus, LPWSTR lpszBuffer, int nBufferSize);
#endif

        // Gets last command response text data
        virtual LPCSTR  GetLastCommandResponseText();

protected:

        virtual void    OnAlertMessage(LPCSTR lpszAlertMsg);

        virtual void    OnExpunge(long nMsgNumber);

        virtual void    OnFetch();
        
        virtual void    OnExists(long nMsgNumber);
        
        virtual void    OnRecent(long nMsgNumber);

        virtual BOOL    NewMailThreadStarted();

        virtual void    NewMailThreadTerminated();

};



#endif  //#ifndef __midl
#endif // End IMAP4_c.h


By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Canada Canada
In January 2005, David Cunningham and Chris Maunder created TheUltimateToolbox.com, a new group dedicated to the continued development, support and growth of Dundas Software’s award winning line of MFC, C++ and ActiveX control products.

Ultimate Grid for MFC, Ultimate Toolbox for MFC, and Ultimate TCP/IP have been stalwarts of C++/MFC development for a decade. Thousands of developers have used these products to speed their time to market, improve the quality of their finished products, and enhance the reliability and flexibility of their software.
This is a Organisation

476 members

Comments and Discussions