#ifndef __MESSAGES_HPP__
#define __MESSAGES_HPP__


enum
{
    MBFTMSG_CREATE_ENGINE               = WM_APP +  1,
    MBFTMSG_DELETE_ENGINE               = WM_APP +  2,
    MBFTMSG_HEART_BEAT                  = WM_APP +  3,
    MBFTMSG_BASIC                       = WM_APP +  4,
};


typedef enum
{
    EnumMCSChannelAdmitIndicationMsg,
    EnumMCSChannelExpelIndicationMsg,
    EnumMCSChannelJoinConfirmMsg,
    EnumMCSChannelConveneConfirmMsg,
    EnumMCSSendDataIndicationMsg,
    EnumGenericMBFTPDUMsg,
    EnumCreateSessionMsg,
    EnumDeleteSessionMsg,
    EnumPeerDeletedMsg,
    EnumSubmitFileSendMsg,
    EnumFileOfferNotifyMsg,
    EnumFileTransferControlMsg,
    EnumFileTransmitMsg,
    EnumFileErrorMsg,
    EnumPeerMsg,
    EnumInitUnInitNotifyMsg,
    EnumFileEventEndNotifyMsg,
}
    MBFT_MSG_TYPE;


class MBFTMsg
{
public:

    MBFTMsg(MBFT_MSG_TYPE eMsgType) : m_eMsgType(eMsgType) { }
    virtual ~MBFTMsg(void);

    MBFT_MSG_TYPE GetMsgType(void) { return m_eMsgType; }

protected:

    MBFT_MSG_TYPE     m_eMsgType;
};


class MCSChannelAdmitIndicationMsg : public MBFTMsg
{
public:

    MCSChannelAdmitIndicationMsg(T120ChannelID wChannelId, T120UserID ManagerID) :
        MBFTMsg(EnumMCSChannelAdmitIndicationMsg),
        m_wChannelId(wChannelId),
        m_ManagerID(ManagerID)
    {
    }

    T120ChannelID       m_wChannelId;
    T120UserID          m_ManagerID;
};

class MCSChannelExpelIndicationMsg : public MBFTMsg
{
public:

    MCSChannelExpelIndicationMsg(T120ChannelID wChannelId, Reason iReason) :
        MBFTMsg(EnumMCSChannelExpelIndicationMsg),
        m_wChannelId(wChannelId),
        m_iReason(iReason)
    {
    }

    T120ChannelID       m_wChannelId;
    Reason              m_iReason;
};

class  MCSChannelJoinConfirmMsg : public MBFTMsg
{
public:

    MCSChannelJoinConfirmMsg(T120ChannelID wChannelId, BOOL bSuccess) :
        MBFTMsg(EnumMCSChannelJoinConfirmMsg),
        m_wChannelId(wChannelId),
        m_bSuccess(bSuccess)
    {
    }

    T120ChannelID       m_wChannelId;
    BOOL                m_bSuccess;
};

class MCSChannelConveneConfirmMsg : public MBFTMsg
{
public:

    MCSChannelConveneConfirmMsg(T120ChannelID wChannelId, BOOL bSuccess) :
        MBFTMsg(EnumMCSChannelConveneConfirmMsg),
        m_wChannelId(wChannelId),
        m_bSuccess(bSuccess)
    {
    }

    T120ChannelID       m_wChannelId;
    BOOL                m_bSuccess;
};

class MCSSendDataIndicationMsg : public MBFTMsg
{
public:

    MCSSendDataIndicationMsg(T120ChannelID wChannelId,
                             T120Priority iPriority,
                             T120UserID SenderID,
                             LPBYTE lpBuffer,
                             ULONG ulDataLength,
                             BOOL IsUniformSendData);

    T120ChannelID       m_wChannelId;
    T120Priority        m_iPriority;
    T120UserID          m_SenderID;
    LPBYTE              m_lpBuffer;
    ULONG               m_ulDataLength;
    BOOL                m_IsUniformSendData;
};

class MBFTPDUMsg : public MBFTMsg
{
public:

    MBFTPDUMsg(T120ChannelID wChannelId,
               T120Priority iPriority,
               T120UserID SenderID,
               LPGENERICPDU lpNewPDU,
               BOOL IsUniformSendData,
               MBFTPDUType PDUType,
               LPSTR lpDecodedBuffer);

    ~MBFTPDUMsg(void);

    T120ChannelID       m_wChannelId;
    T120Priority        m_iPriority;
    T120UserID          m_SenderID;
    LPGENERICPDU        m_lpNewPDU;
    BOOL                m_IsUniformSendData;
    MBFTPDUType         m_PDUType;
    LPSTR               m_lpDecodedBuffer;
};

class CreateSessionMsg : public MBFTMsg
{
public:

    CreateSessionMsg(MBFT_SESSION_TYPE iSessionType,
                     MBFTEVENTHANDLE EventHandle,
                     T120SessionID SessionID = 0,
                     T120ChannelID wControlChannel = 0,
                     T120ChannelID wDataChannel = 0,
                     T120UserID SenderID = 0,
                     MBFTFILEHANDLE FileHandle = 0);

    MBFT_SESSION_TYPE   m_iSessionType;
    MBFTEVENTHANDLE     m_EventHandle;
    T120SessionID       m_SessionID;
    T120ChannelID       m_ControlChannel;
    T120ChannelID       m_DataChannel;
    T120UserID          m_SenderID;
    MBFTFILEHANDLE      m_FileHandle;
};

class MBFTSession;
class DeleteSessionMsg : public MBFTMsg
{
public:

    DeleteSessionMsg(MBFTSession * lpDeleteSession) :
        MBFTMsg(EnumDeleteSessionMsg),
        m_lpDeleteSession(lpDeleteSession)
    {
    }

    MBFTSession * m_lpDeleteSession;
};

class CPeerData;
class PeerDeletedMsg : public MBFTMsg
{
public:

    PeerDeletedMsg(CPeerData * lpPeerData) :
        MBFTMsg(EnumPeerDeletedMsg),
        m_lpPeerData(lpPeerData)
    {
    }
    ~PeerDeletedMsg(void);

    CPeerData * m_lpPeerData;
};


class SubmitFileSendMsg  :  public MBFTMsg
{
public:

    SubmitFileSendMsg::SubmitFileSendMsg(T120UserID	uidReceiver,
										 T120NodeID nidReceiver,
										 LPCSTR pszFilePath,
                                         MBFTFILEHANDLE nFileHandle,
                                         MBFTEVENTHANDLE EventHandle,
                                         BOOL bCompressFiles);

    ~SubmitFileSendMsg(void);

	T120UserID		m_nUserID;
	T120NodeID		m_nNodeID;
    LPSTR           m_pszFilePath;
    MBFTFILEHANDLE  m_nFileHandle;
    MBFTEVENTHANDLE m_EventHandle;
    BOOL            m_bCompressFiles;
};

class FileOfferNotifyMsg : public MBFTMsg
{
public:

    FileOfferNotifyMsg(MBFTEVENTHANDLE EventHandle,
                       T120UserID SenderID,
					   T120NodeID NodeID,
                       MBFTFILEHANDLE hFile,
                       LPCSTR lpszFilename,
                       ULONG FileSize,
                       time_t FileDateTime,
                       BOOL bAckNeeded);

    MBFTEVENTHANDLE     m_EventHandle;
    MBFTFILEHANDLE      m_hFile;
    ULONG               m_FileSize;
    time_t              m_FileDateTime;
    BOOL                m_bAckNeeded;
    T120UserID          m_SenderID;
	T120NodeID          m_NodeID;
    char                m_szFileName[_MAX_PATH];
};

class FileTransferControlMsg :  public MBFTMsg
{
public:

    enum FileTransferControl
    {
        EnumAcceptFile,
        EnumRejectFile,
        EnumAbortFile,
        EnumConductorAbortFile
    };

    FileTransferControlMsg(MBFTEVENTHANDLE EventHandle,
                           MBFTFILEHANDLE hFile,
                           LPCSTR lpszDirectory,
                           LPCSTR lpszFileName,
                           FileTransferControl iControlCommand);

    MBFTEVENTHANDLE     m_EventHandle;
    MBFTFILEHANDLE      m_hFile;
    FileTransferControl m_ControlCommand;
    char                m_szDirectory[_MAX_PATH];
    char                m_szFileName[_MAX_FNAME];
};

class FileTransmitMsg :  public MBFTMsg
{
public:

    FileTransmitMsg(MBFTEVENTHANDLE EventHandle,
                    MBFTFILEHANDLE hFile,
                    ULONG FileSize,
                    ULONG BytesTransmitted,
                    int      iTransmitStatus,
                    T120UserID   iUserID = 0,
                    BOOL     bIsBroadcastEvent = FALSE);

    MBFTEVENTHANDLE     m_EventHandle;
    MBFTFILEHANDLE      m_hFile;
    ULONG               m_FileSize;
    ULONG               m_BytesTransmitted;
    T120UserID          m_UserID;
    int                 m_TransmitStatus;
    BOOL                m_bIsBroadcastEvent;
};

class FileErrorMsg :   public MBFTMsg
{
public:

    FileErrorMsg(MBFTEVENTHANDLE EventHandle,
                 MBFTFILEHANDLE hFile,
                 int  iErrorType,
                 int  iErrorCode,
                 BOOL bIsLocalError,
                 T120UserID iUserID = 0,
                 BOOL   bIsBroadcastEvent = FALSE,
				 const char* pFileName = NULL,
				 ULONG nFileSize = 0);

    MBFTEVENTHANDLE     m_EventHandle;
    MBFTFILEHANDLE      m_hFile;
    int                 m_ErrorCode;
    int                 m_ErrorType;
    BOOL                m_bIsLocalError;
    T120UserID          m_UserID;
    BOOL                m_bIsBroadcastEvent;
	MBFT_RECEIVE_FILE_INFO m_stFileInfo;
};

class PeerMsg    :  public MBFTMsg
{
public:

    enum    PeerChange
    {
        EnumPeerAdded,
        EnumPeerRemoved
    };

    PeerMsg(T120NodeID NodeID,
            T120UserID MBFTPeerID,
            BOOL bIsLocalPeer,
            BOOL IsProsharePeer,
            LPCSTR   lpszAppKey,
            BOOL bPeerAdded,
            T120SessionID MBFTSessionID);

    T120NodeID          m_NodeID;
    T120UserID          m_MBFTPeerID;
    BOOL                m_bIsLocalPeer;
    BOOL                m_bIsProsharePeer;
    T120SessionID       m_MBFTSessionID;
    BOOL                m_bPeerAdded;
    char                m_szAppKey[MAX_APP_KEY_SIZE];
};


enum  InitUnInitNotifyType
{
    EnumInitFailed,
    EnumUnInitComplete,
    EnumInvoluntaryUnInit
};

class InitUnInitNotifyMsg   : public MBFTMsg
{
public:

    InitUnInitNotifyMsg(InitUnInitNotifyType iNotifyMessage) :
        MBFTMsg(EnumInitUnInitNotifyMsg),
        m_iNotifyMessage(iNotifyMessage)
    {
    }

    InitUnInitNotifyType    m_iNotifyMessage;
};

class FileEventEndNotifyMsg    :   public MBFTMsg
{
public:

    FileEventEndNotifyMsg(MBFTEVENTHANDLE EventHandle) :
        MBFTMsg(EnumFileEventEndNotifyMsg),
        m_EventHandle(EventHandle)
    {
    }

    MBFTEVENTHANDLE  m_EventHandle;
};

#endif  //__MESSAGES_HPP__