/******************************************************************************\ * Copyright (c) 2004-2008 * * Author(s): * Volker Fischer * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined ( PROTOCOL_H__3B123453_4344_BB2392354455IUHF1912__INCLUDED_ ) #define PROTOCOL_H__3B123453_4344_BB2392354455IUHF1912__INCLUDED_ #include #include #include #include #include #include "global.h" #include "util.h" /* Definitions ****************************************************************/ // protocol message IDs #define PROTMESSID_ILLEGAL 0 // illegal ID #define PROTMESSID_ACKN 1 // acknowledge #define PROTMESSID_JITT_BUF_SIZE 10 // jitter buffer size #define PROTMESSID_REQ_JITT_BUF_SIZE 11 // request jitter buffer size #define PROTMESSID_PING 12 // OLD, not used anymore #define PROTMESSID_NET_BLSI_FACTOR 13 // network buffer size factor #define PROTMESSID_CHANNEL_GAIN 14 // set channel gain for mix #define PROTMESSID_CONN_CLIENTS_LIST 15 // connected client list #define PROTMESSID_SERVER_FULL 16 // server full message #define PROTMESSID_REQ_CONN_CLIENTS_LIST 17 // request connected client list #define PROTMESSID_CHANNEL_NAME 18 // set channel name for fader tag #define PROTMESSID_CHAT_TEXT 19 // contains a chat text #define PROTMESSID_PING_MS 20 // for measuring ping time // lengths of message as defined in protocol.cpp file #define MESS_HEADER_LENGTH_BYTE 7 // TAG (2), ID (2), cnt (1), length (2) #define MESS_LEN_WITHOUT_DATA_BYTE ( MESS_HEADER_LENGTH_BYTE + 2 /* CRC (2) */ ) // time out for message re-send if no acknowledgement was received #define SEND_MESS_TIMEOUT_MS 400 // ms /* Classes ********************************************************************/ class CProtocol : public QObject { Q_OBJECT public: CProtocol(); void CreateJitBufMes ( const int iJitBufSize ); void CreateReqJitBufMes(); void CreateReqConnClientsList(); void CreateServerFullMes(); void CreateNetwBlSiFactMes ( const int iNetwBlSiFact ); void CreateChanGainMes ( const int iChanID, const double dGain ); void CreateChanNameMes ( const QString strName ); void CreateChatTextMes ( const QString strChatText ); void CreatePingMes ( const int iMs ); void CreateConClientListMes ( const CVector& vecChanInfo ); void CreateAndSendAcknMess ( const int& iID, const int& iCnt ); bool ParseMessage ( const CVector& vecbyData, const int iNumBytes ); void DeleteSendMessQueue(); protected: class CSendMessage { public: CSendMessage() : vecMessage ( 0 ), iID ( PROTMESSID_ILLEGAL ), iCnt ( 0 ) {} CSendMessage ( const CVector& nMess, const int iNCnt, const int iNID ) : vecMessage ( nMess ), iID ( iNID ), iCnt ( iNCnt ) {} CSendMessage& operator= ( const CSendMessage& NewSendMess ) { vecMessage.Init ( NewSendMess.vecMessage.Size() ); vecMessage = NewSendMess.vecMessage; iID = NewSendMess.iID; iCnt = NewSendMess.iCnt; return *this; } CVector vecMessage; int iID, iCnt; }; void EnqueueMessage ( CVector& vecMessage, const int iCnt, const int iID ); bool ParseMessageFrame ( const CVector& vecIn, int& iCnt, int& iID, CVector& vecData ); void GenMessageFrame ( CVector& vecOut, const int iCnt, const int iID, const CVector& vecData ); void PutValOnStream ( CVector& vecIn, unsigned int& iPos, const uint32_t iVal, const unsigned int iNumOfBytes ); uint32_t GetValFromStream ( const CVector& vecIn, unsigned int& iPos, const unsigned int iNumOfBytes ); void SendMessage(); void CreateAndSendMessage ( const int iID, const CVector& vecData ); bool EvaluateJitBufMes ( const CVector& vecData ); bool EvaluateReqJitBufMes ( const CVector& vecData ); bool EvaluateReqConnClientsList ( const CVector& vecData ); bool EvaluateServerFullMes ( const CVector& vecData ); bool EvaluateNetwBlSiFactMes ( const CVector& vecData ); bool EvaluateChanGainMes ( const CVector& vecData ); bool EvaluateChanNameMes ( const CVector& vecData ); bool EvaluateChatTextMes ( const CVector& vecData ); bool EvaluateConClientListMes ( const CVector& vecData ); bool EvaluatePingMes ( const CVector& vecData ); int iOldRecID, iOldRecCnt; // these two objects must be sequred by a mutex uint8_t iCounter; std::list SendMessQueue; QTimer TimerSendMess; QMutex Mutex; public slots: void OnTimerSendMess() { SendMessage(); } signals: // transmitting void MessReadyForSending ( CVector vecMessage ); // receiving void ChangeJittBufSize ( int iNewJitBufSize ); void ChangeNetwBlSiFact ( int iNewNetwBlSiFact ); void ChangeChanGain ( int iChanID, double dNewGain ); void ChangeChanName ( QString strName ); void ChatTextReceived ( QString strChatText ); void PingReceived ( int iMs ); void ConClientListMesReceived ( CVector vecChanInfo ); void ReqJittBufSize(); void ReqConnClientsList(); void ServerFull(); }; #endif /* !defined ( PROTOCOL_H__3B123453_4344_BB2392354455IUHF1912__INCLUDED_ ) */