#ifndef __MBFT_HPP__ #define __MBFT_HPP__ #include "osshelp.hpp" #include "messages.hpp" #include // LONCHANC: temporarily enable conductorship // #define ENABLE_CONDUCTORSHIP 1 //Intel specific non-collapsing capabilities values.... enum NonCollapsCaps { _iMBFT_FIRST_PROSHARE_CAPABILITY_ID = 0x100, _iMBFT_PROSHARE_VERSION_ID____NOT_USED, _iMBFT_PROSHARE_FILE_EOF_ACK_ID, _iMBFT_LAST_NON_COLLAPSING_CAPABILITIES }; //Intel specific collapsing capabilities values.... //Note: The size of _iMBFT_MAX_FILEDATA_PDU_LENGTH actually controls the maximum number //of bytes in the file start and data PDUs. If this is increased, the corresponding constant //in MCSHELP.HPP (_MAX_MCS_MESSAGE_SIZE) must also be increased... const USHORT _iMBFT_MAX_FILEDATA_PDU_LENGTH = 25000; const USHORT _iMBFT_DEFAULT_MAX_FILEDATA_PDU_LENGTH = 8192; const ULONG _iMBFT_MAX_FILE_SIZE = 0xFFFFFFFFUL; const USHORT _iMBFT_V42_NO_OF_CODEWORDS = 512; const USHORT _iMBFT_V42_MAX_STRING_LENGTH = 6; const USHORT _iMBFT_V42_COMPRESSION_SUPPORTED = TRUE; const USHORT _iMBFT_MAX_COLLAPSING_CAPABILITIES = 3; #define _iMBFT_MAX_NON_COLLAPSING_CAPABILITIES _iMBFT_LAST_NON_COLLAPSING_CAPABILITIES - _iMBFT_FIRST_PROSHARE_CAPABILITY_ID //Added by Atul -- another magic number that we subtract from MCSMaxDomainPDU size //presumably to allow for the overhead added by the lower layers... const USHORT _iMBFT_FILEDATA_PDU_SUBTRACT = 64; //In our implementation we get the max pdu by a proprietary MCS api called //GetDomainParameters. No such liberties with MSFT stuff!! const unsigned int _iMBFT_DEFAULT_MAX_MCS_SIZE = MAX_MCS_DATA_SIZE; //Standard MBFT identifiers and channel IDs const USHORT _MBFT_MAX_FILE_SIZE_ID = 1; const USHORT _MBFT_MAX_DATA_PAYLOAD_ID = 2; const USHORT _MBFT_V42_COMPRESSION_ID = 3; const USHORT _MBFT_V42_NO_OF_CODEWORDS_ID = 4; const USHORT _MBFT_V42_MAX_STRING_LENGTH_ID = 5; MBFTEVENTHANDLE GetNewEventHandle(void); MBFTFILEHANDLE GetNewFileHandle(void); enum MBFTState { IdleNotInitialized, IdleInitialized }; class MBFTInterface; class MBFTMsg; class MBFTPDUMsg; class CAppletWindow; class MBFTSession; class CSessionList : public CList { DEFINE_CLIST(CSessionList, MBFTSession *) void Delete(MBFTSession *); }; class CPeerData; class CPeerList : public CList { DEFINE_CLIST(CPeerList, CPeerData *) CPeerData *Find(T120UserID uidPeer); BOOL IsValidPeerID(T120UserID uidPeer) { return (NULL != Find(uidPeer)); } CPeerData * CPeerList::FindSamePeer(CPeerData *pPeer); void CPeerList::Delete(CPeerData *p); void DeleteAll(void); }; // // MBFT engine, one per conference // class MBFTEngine : public CRefCount { public: MBFTEngine(MBFTInterface *, MBFT_MODE, T120SessionID); ~MBFTEngine(void); private: IT120AppletSession *m_pAppletSession; T120Error m_eLastSendDataError; MBFTInterface *m_pMBFTIntf; T120ConfID m_nConfID; MBFT_MODE m_eMBFTMode; T120SessionID m_SessionID; T120UserID m_uidMyself; T120NodeID m_nidMyself; T120EntityID m_eidMyself; T120ChannelID m_MBFTControlChannel; T120ChannelID m_MBFTDataChannel; T120ChannelID m_aStaticChannels[2]; #ifdef USE_MULTICAST_SESSION T120ResourceRequest m_aJoinResourceReqs[1]; #endif T120JoinSessionRequest m_JoinSessionReq; BOOL m_fConfAvailable; BOOL m_fJoinedConf; MBFTState m_State; // LONCHANC: NetMeeting's Node Controller does not exercise conductorship. #ifdef ENABLE_CONDUCTORSHIP BOOL m_bInConductedMode; T120NodeID m_ConductorNodeID; T120UserID m_MBFTConductorID; ULONG m_ConductedModePermission; BOOL m_bWaitingForPermission; #endif // ENABLE_CONDUCTORSHIP CSessionList m_SessionList; CPeerList m_PeerList; ULONG m_nRosterInstance; ULONG m_MBFTMaxFileSize; ULONG m_MBFTMaxDataPayload; ULONG m_MBFTMaxSendDataPayload; BOOL m_bV42CompressionSupported; USHORT m_v42bisP1; USHORT m_v42bisP2; MBFTEVENTHANDLE m_lEventHandle; CAppletWindow *m_pWindow; #ifdef ENABLE_HEARTBEAT_TIMER UINT_PTR m_nTimerID; #endif public: // // Handy inline methods // T120Error GetLastSendDataError(void) { return m_eLastSendDataError; } CPeerList *GetPeerList(void) { return &m_PeerList; } ULONG GetPeerCount(void) { return m_PeerList.GetCount(); } T120ConfID GetConfID(void) { return m_nConfID; } T120UserID GetUserID(void) { return m_uidMyself; } T120NodeID GetNodeID(void) { return m_nidMyself; } T120SessionID GetSessionID(void) { return m_SessionID; } T120ChannelID GetDefaultControlChannel(void) { return m_MBFTControlChannel; } T120ChannelID GetDefaultDataChannel(void) { return m_MBFTDataChannel; } BOOL Has2xNodeInConf(void); BOOL HasSDK(void); void SetConferenceAvailable(BOOL fConfAvailable) { m_fConfAvailable = fConfAvailable; } BOOL IsValidPeerID(T120UserID uidPeer) { return m_PeerList.IsValidPeerID(uidPeer); } ULONG GetRosterInstance(void) { return m_nRosterInstance; } HRESULT SafePostMessage(MBFTMsg *p); HRESULT SafePostNotifyMessage(MBFTMsg *p); void ClearInterfacePointer(void) { m_pMBFTIntf = NULL; } MBFTInterface *GetInterfacePointer(void) { return m_pMBFTIntf; } void SetInterfacePointer(MBFTInterface *pIntf); #ifdef ENABLE_HEARTBEAT_TIMER UINT_PTR GetTimerID(void) { return m_nTimerID; } #endif void SetWindow(CAppletWindow *pWindow) { m_pWindow = pWindow; } // // Conducted-mode methods // // LONCHANC: NetMeeting's Node Controller does not exercise conductorship. #ifdef ENABLE_CONDUCTORSHIP void OnConductAssignIndication(GCCConductorAssignInd *); void OnConductReleaseIndication(GCCConferenceID); void OnConductGrantIndication(GCCConductorPermitGrantInd *); void AbortAllSends(void); void ApplyForPermission(void); BOOL ConductedModeOK(void); #else BOOL ConductedModeOK(void) { return TRUE; } #endif // ENABLE_CONDUCTORSHIP // // Notification for file transfer protocol // BOOL OnReceivedPrivateChannelInvitePDU(T120ChannelID, T120Priority, T120UserID, LPPRIVATECHANNELINVITEPDU lpNewPDU, BOOL IsUniformSendData); BOOL OnReceivedFileRequestPDU(T120ChannelID, T120Priority, T120UserID, LPFILEREQUESTPDU lpNewPDU, BOOL IsUniformSendData); BOOL OnReceivedDirectoryRequestPDU(T120ChannelID, T120Priority, T120UserID, LPDIRECTORYREQUESTPDU lpNewPDU, BOOL IsUniformSendData); BOOL OnReceivedPrivilegeAssignPDU(T120ChannelID, T120Priority, T120UserID, LPPRIVILEGEASSIGNPDU lpNewPDU, BOOL IsUniformSendData); // // Common public methods // BOOL HandleSessionCreation(MBFTMsg *pMsg); BOOL DispatchPDUMessage(MBFTSession *, MBFTPDUMsg *); BOOL ProcessMessage(MBFTMsg *pMsg); BOOL DoStateMachine(MBFTMsg *pMsg); void AddAllPeers(void); BOOL NoUIMode(void) { return (m_pWindow == NULL); } private: void AddPeerNotification(T120NodeID, T120UserID, BOOL IsLocalNode, BOOL IsProshareNode, BOOL bPeerAdded, LPCSTR lpszAppKey, T120SessionID); BOOL SimpleChannelRequest(AppletChannelCommand, T120ChannelID); T120NodeID GetNodeIdByUserID(T120UserID UserID); public: // // T120 service request // BOOL MCSChannelJoinRequest(T120ChannelID nChannelID) { return SimpleChannelRequest(APPLET_JOIN_CHANNEL, nChannelID); } BOOL MCSChannelLeaveRequest(T120ChannelID nChannelID) { return SimpleChannelRequest(APPLET_LEAVE_CHANNEL, nChannelID); } BOOL MCSChannelConveneRequest(void) { return SimpleChannelRequest(APPLET_CONVENE_CHANNEL, 0); } BOOL MCSChannelDisbandRequest(T120ChannelID nChannelID) { return SimpleChannelRequest(APPLET_DISBAND_CHANNEL, nChannelID); } BOOL MCSChannelAdmitRequest(T120ChannelID, T120UserID *, ULONG cUsers); BOOL SendDataRequest(T120ChannelID, T120Priority, LPBYTE lpBuffer, ULONG ulSize); // // Notification for T.120 applet // void OnPermitToEnrollIndication(GCCAppPermissionToEnrollInd *); void OnJoinSessionConfirm(T120JoinSessionConfirm *); void OnDetachUserIndication(T120UserID, T120Reason); void OnRosterReportIndication(ULONG cRosters, GCCAppRoster **); void OnChannelAdmitIndication(T120ChannelID, T120UserID uidManager); void OnSendDataIndication( BOOL fUniformSend, T120UserID nSenderID, T120ChannelID nChannelID, T120Priority ePriority, ULONG cbBufSize, LPBYTE pBufData); }; typedef MBFTEngine * LPMBFTENGINE; // // Peer data // class CPeerData { private: T120UserID m_NodeID; T120UserID m_MBFTUserID; BOOL m_bIsLocalNode; BOOL m_bIsProshareNode; BOOL m_bCanConduct; BOOL m_bEOFAcknowledgment; char m_szAppKey[MAX_APP_KEY_SIZE]; DWORD m_dwVersion; public: CPeerData(UserID NodeID,UserID MBFTUserID,BOOL IsLocalNode, BOOL IsProshareNode,BOOL bCanConduct,BOOL m_bEOFAcknowledgment, LPCSTR lpszAppKey, DWORD dwVersion); ~CPeerData(void) {} T120UserID GetUserID(void) { return m_MBFTUserID; } T120NodeID GetNodeID(void) { return m_NodeID; } BOOL GetIsLocalNode(void) { return m_bIsLocalNode; } BOOL GetIsProshareNode(void) { return m_bIsProshareNode; } BOOL GetCanConduct(void) { return m_bCanConduct; } BOOL GetEOFAcknowledge(void) { return m_bEOFAcknowledgment; } LPCSTR GetAppKey(void) { return m_szAppKey; } DWORD GetVersion(void) { return m_dwVersion; } }; typedef CPeerData * LPPEERDATA; // // MBFT sub session, the interface class of // MBFTPrivateSend // MBFTPrivateReceive // MBFTBroadcastReceive // class MBFTSession { public: MBFTSession::MBFTSession(MBFTEngine *pEngine, MBFTEVENTHANDLE nEventHandle, MBFT_SESSION_TYPE eType) : m_lpParentEngine(pEngine), m_EventHandle(nEventHandle), m_MBFTSessionType(eType) { } virtual ~MBFTSession(void) = 0; MBFTEVENTHANDLE GetEventHandle(void) { return m_EventHandle; } MBFT_SESSION_TYPE GetSessionType(void) { return m_MBFTSessionType; } BOOL IsSendSession(void) { return (MBFT_PRIVATE_SEND_TYPE == m_MBFTSessionType); } BOOL IsReceiveSession(void) { return (MBFT_PRIVATE_SEND_TYPE != m_MBFTSessionType); } // // T120 callback // virtual BOOL OnMCSChannelJoinConfirm(T120ChannelID, BOOL bSuccess) = 0; // // File transfer protocal callback // virtual BOOL OnReceivedFileErrorPDU(T120ChannelID, T120Priority, T120UserID, LPFILEERRORPDU lpNewPDU, BOOL IsUniformSendData) = 0; virtual void OnPeerDeletedNotification(CPeerData * lpPeerData) = 0; virtual void OnControlNotification(MBFTFILEHANDLE, FileTransferControlMsg::FileTransferControl iControlCommand, LPCSTR lpszDirectory, LPCSTR lpszFileName) = 0; virtual void DoStateMachine(void) = 0; virtual void UnInitialize(BOOL bIsShutDown) = 0; protected: LPMBFTENGINE m_lpParentEngine; MBFTEVENTHANDLE m_EventHandle; MBFT_SESSION_TYPE m_MBFTSessionType; }; typedef class MBFTSession * LPMBFTSESSION; #endif //__MBFT_HPP__