#ifndef __MBFTRECV_HPP__ #define __MBFTRECV_HPP__ class CMBFTFile; class MBFTReceiveSubEvent; class CT120ChannelList : public CList { DEFINE_CLIST_(CT120ChannelList, T120ChannelID) }; class CRecvSubEventList : public CList { DEFINE_CLIST(CRecvSubEventList, MBFTReceiveSubEvent*) MBFTReceiveSubEvent * FindEquiv(MBFTReceiveSubEvent *); void Delete(MBFTReceiveSubEvent *); void DeleteAll(void); }; class CChannelUidQueue : public CQueue { DEFINE_CQUEUE_(CChannelUidQueue, UINT_PTR) BOOL RemoveByChannelID(T120ChannelID nChannelID); UINT_PTR FindByChannelID(T120ChannelID nChannelID); }; class MBFTPrivateReceive : public MBFTSession { public: enum MBFTPrivateReceiveState { EnumIdleNotInitialized, EnumIdleInitialized, EnumInitializationFailed, EnumWaitJoinControlChannel, EnumWaitRequestJoinControl, EnumWaitRequestControlConvene, EnumWaitRequestDataConvene, EnumWaitAdmitControlChannelIndication, EnumWaitAdmitDataChannelIndication, EnumWaitSendChannelResponsePDU, EnumWaitUserConfirmation, EnumWaitSendFileAcceptPDU, EnumWaitSendFileRejectPDU, EnumWaitFileOfferPDU, EnumWaitFileStartPDU, EnumWaitFileDataPDU, EnumWaitSendFileEndAcknowledgePDU, EnumWaitSendChannelLeavePDU, EnumWaitJoinDataChannel, EnumWaitRejoinDataChannel, EnumWaitRequestJoinData, EnumWaitAdmitControlChannel, EnumWaitChannelDisband, EnumWaitForTermination }; MBFTPrivateReceive(LPMBFTENGINE, MBFTFILEHANDLE, T120ChannelID chidControl, T120ChannelID chidData); ~MBFTPrivateReceive(void); BOOL OnMCSChannelJoinConfirm(T120ChannelID, BOOL bSuccess); BOOL OnMCSChannelAdmitIndication(T120ChannelID, T120UserID uidManager); BOOL OnMCSChannelExpelIndication(T120ChannelID, Reason); virtual BOOL OnReceivedFileOfferPDU(T120ChannelID, T120Priority, T120UserID uidSender, T120NodeID uidNode, LPFILEOFFERPDU lpNewPDU, BOOL IsUniformSendData); BOOL OnReceivedFileStartPDU(T120ChannelID, T120Priority, T120UserID uidSender, LPFILESTARTPDU lpNewPDU, BOOL IsUniformSendData); BOOL OnReceivedFileDataPDU(T120ChannelID, T120Priority, T120UserID uidSender, LPFILEDATAPDU lpNewPDU, BOOL IsUniformSendData); BOOL OnReceivedFileErrorPDU(T120ChannelID, T120Priority, T120UserID uidSender, LPFILEERRORPDU lpNewPDU, BOOL IsUniformSendData); void OnPeerDeletedNotification(CPeerData * lpPeerData); void OnControlNotification(MBFTFILEHANDLE hFile, FileTransferControlMsg::FileTransferControl iControlCommand, LPCSTR lpszDirectory, LPCSTR lpszFileName); void DoStateMachine(void); void UnInitialize(BOOL bIsShutDown = FALSE); protected: T120UserID m_LocalMBFTUserID; T120ChannelID m_PrivateMBFTControlChannel; CT120ChannelList m_PrivateMBFTDataChannelList; T120ChannelID m_PrivateMBFTDataChannel; T120UserID m_MBFTControlSenderID; T120UserID m_MBFTDataSenderID; T120UserID m_ProshareSenderID; MBFTFILEHANDLE m_CurrentAcceptHandle; // ??? MBFTFILEHANDLE m_CurrentRejectHandle; // ??? MBFTFILEHANDLE m_CurrentFileEndHandle; MBFTPrivateReceiveState m_State; MBFTPrivateReceiveState m_PreviousRejectState; BOOL m_bProshareTransfer; CRecvSubEventList m_ReceiveList; MBFTReceiveSubEvent *m_CurrentReceiveEvent; BOOL m_JoinedToDataChannel; BOOL m_bOKToLeaveDataChannel; BOOL m_bEventEndPosted; CChannelUidQueue m_AdmittedChannelQueue; void JoinControlChannel(void); void JoinDataChannel(void); void LeaveDataChannel(void); void SendChannelResponsePDU(void); BOOL SendFileAcceptPDU(MBFTFILEHANDLE iFileHandle = 0); void SendFileRejectPDU(MBFTFILEHANDLE iFileHandle = 0); void SendFileEndAcknowledgePDU(MBFTFILEHANDLE iFileHandle = 0); void SendChannelLeavePDU(void); void DeleteReceiveEvent(MBFTReceiveSubEvent * lpReceive,BOOL bNotifyUser); void TerminateReceiveSession(void); void ReportError(MBFTReceiveSubEvent * lpReceiveEvent, int iErrorType, int iErrorCode, BOOL bIsLocalError = TRUE, T120UserID SenderID = 0, const char* pFileName = NULL, ULONG lFileSize = 0); void ReportReceiverError(MBFTReceiveSubEvent * lpReceiveEvent, int iErrorType, int iErrorCode, MBFTFILEHANDLE iFileHandle = 0); void DeleteNotificationMessages(MBFT_NOTIFICATION iNotificationType); int DecompressAndWrite(MBFTReceiveSubEvent * lpReceiveEvent, LPCSTR lpBuffer,LONG BufferLength,LPINT lpDecompressedSize); }; #ifdef USE_BROADCAST_RECEIVE class MBFTBroadcastReceive : public MBFTPrivateReceive { private: T120UserID m_SenderID; MBFTFILEHANDLE m_FileHandle; public: MBFTBroadcastReceive(LPMBFTENGINE lpParentEngine, MBFTEVENTHANDLE EventHandle, T120ChannelID wControlChannel, T120ChannelID wDataChannel, T120UserID SenderID, MBFTFILEHANDLE FileHandle); BOOL OnMCSChannelJoinConfirm(T120ChannelID, BOOL bSuccess); BOOL OnReceivedFileOfferPDU(T120ChannelID, T120Priority, T120UserID uidSender, T120NodeID uidNode, LPFILEOFFERPDU lpNewPDU, BOOL IsUniformSendData); BOOL OnReceivedFileStartPDU(T120ChannelID, T120Priority, T120UserID uidSender, LPFILESTARTPDU lpNewPDU, BOOL IsUniformSendData); BOOL OnReceivedFileDataPDU(T120ChannelID, T120Priority, T120UserID, LPFILEDATAPDU lpNewPDU, BOOL IsUniformSendData); void OnControlNotification(MBFTFILEHANDLE hFile, FileTransferControlMsg::FileTransferControl iControlCommand, LPCSTR lpszDirectory, LPCSTR lpszFileName); void OnPeerDeletedNotification(CPeerData * lpPeerData); void DoStateMachine(void); void UnInitialize(BOOL bIsShutDown = FALSE); }; #endif // USE_BROADCAST_RECEIVE typedef class MBFTPrivateReceive FAR * LPMBFTPRIVATESUBSESSIONRECEIVE; class MBFTReceiveSubEvent { private: friend class MBFTPrivateReceive; #ifdef USE_BROADCAST_RECEIVE friend class MBFTBroadcastReceive; #endif // USE_BROADCAST_RECEIVE MBFTPrivateReceive::MBFTPrivateReceiveState m_State; BOOL m_bIsBroadcast; MBFTFILEHANDLE m_hFile; ULONG m_FileSize; ULONG m_TotalBytesReceived; ULONG m_cbRecvLastNotify; T120UserID m_SenderID; CMBFTFile *m_lpFile; BOOL m_UserAccepted; BOOL m_bFileCompressed; BOOL m_bEOFAcknowledge; time_t m_FileDateTime; LPVOID m_lpV42bisPointer; char m_szFileName[_MAX_FNAME]; char m_szFileDirectory[_MAX_PATH]; public: MBFTReceiveSubEvent(MBFTFILEHANDLE FileHandle, LONG FileSize, LPCSTR lpszFileName, time_t FileDateTime, T120UserID SenderID, BOOL bIsBroadcast, BOOL bIsCompressed, BOOL bEOFAcknowledge); ~MBFTReceiveSubEvent(void); BOOL Init(void); BOOL IsEqual(MBFTReceiveSubEvent *lpObject); void InitV42DeCompression(int v42bisP1,int v42bisP2); }; #endif //__MBFTRECV_HPP__