From d8d0072eb7c5065caf04ebdd88c2cf6e56658dfa Mon Sep 17 00:00:00 2001 From: Volker Fischer Date: Sun, 19 Feb 2006 14:50:18 +0000 Subject: [PATCH] pressing return after writing the IP address in client starts the connection, bug fix in protocol implementation --- src/llconclientdlg.cpp | 6 +++- src/protocol.cpp | 76 ++++++++++++++++++++++++++++++++++++------ src/protocol.h | 11 +++++- 3 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/llconclientdlg.cpp b/src/llconclientdlg.cpp index 0d606da5..31f27ecf 100755 --- a/src/llconclientdlg.cpp +++ b/src/llconclientdlg.cpp @@ -162,7 +162,11 @@ CLlconClientDlg::CLlconClientDlg ( CClient* pNCliP, QWidget* parent, this, SLOT(OnRevSelL())); QObject::connect(RadioButtonRevSelR, SIGNAL(clicked()), this, SLOT(OnRevSelR())); - + + /* text edit controls */ + QObject::connect(LineEditServerAddr, SIGNAL(returnPressed()), + this, SLOT(OnConnectDisconBut())); + /* timers --------------------------------------------------------------- */ /* start timer for status bar */ diff --git a/src/protocol.cpp b/src/protocol.cpp index ba2937aa..cbd19564 100755 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -64,17 +64,15 @@ bool CProtocol::ParseMessage ( const CVector& vecIn ) // decode header ----- iCurPos = 0; // start from beginning - for ( i = 0; i < MESS_HEADER_LENGTH_BYTE; i++ ) - { - /* 2 bytes ID */ - iID = static_cast ( GetValFromStream ( vecIn, iCurPos, 2 ) ); - /* 1 byte cnt */ - iCnt = static_cast ( GetValFromStream ( vecIn, iCurPos, 1 ) ); + /* 2 bytes ID */ + iID = static_cast ( GetValFromStream ( vecIn, iCurPos, 2 ) ); - /* 2 bytes length */ - iLenBy = static_cast ( GetValFromStream ( vecIn, iCurPos, 2 ) ); - } + /* 1 byte cnt */ + iCnt = static_cast ( GetValFromStream ( vecIn, iCurPos, 1 ) ); + + /* 2 bytes length */ + iLenBy = static_cast ( GetValFromStream ( vecIn, iCurPos, 2 ) ); // make sure the length is correct if ( iLenBy != iVecInLenByte - MESS_LEN_WITHOUT_DATA_BYTE ) @@ -119,8 +117,66 @@ uint32_t CProtocol::GetValFromStream ( const CVector& vecIn, uint32_t iRet = 0; for ( int i = 0; i < iNumOfBytes; i++ ) { - iRet |= vecIn[iPos + i] << ( i * 8 /* size of byte */ ); + iRet |= vecIn[iPos] << ( i * 8 /* size of byte */ ); + iPos++; } return iRet; } + +void CProtocol::GenMessage ( CVector& vecOut, + const int iCnt, + const int iID, + const CVector& vecData) +{ + // query length of data vector + const int iDataLenByte = vecData.Size(); + + // total length of message = 7 + "iDataLenByte" + // 2 byte ID + 1 byte cnt + 2 byte length + n bytes data + 2 bytes CRC + const int iTotLenByte = 7 + iDataLenByte; + + // init message vector + vecOut.Init( iTotLenByte ); + + // encode header ----- + unsigned int iCurPos = 0; // init position pointer + + /* 2 bytes ID */ + PutValOnStream ( vecOut, iCurPos, + static_cast ( iID ), 2 ); + + /* 1 byte cnt */ + PutValOnStream ( vecOut, iCurPos, + static_cast ( iCnt ), 1 ); + + /* 2 bytes length */ + PutValOnStream ( vecOut, iCurPos, + static_cast ( iDataLenByte ), 2 ); + +// TODO data, CRC + +} + + + +void CProtocol::PutValOnStream ( CVector& vecIn, + unsigned int& iPos, + const uint32_t iVal, + const unsigned int iNumOfBytes ) +{ +/* + note: iPos is automatically incremented in this function +*/ + // 4 bytes maximum since we use uint32 + ASSERT ( ( iNumOfBytes > 0 ) && ( iNumOfBytes <= 4 ) ); + ASSERT ( vecIn.Size() >= iPos + iNumOfBytes ); + + for ( int i = 0; i < iNumOfBytes; i++ ) + { + vecIn[iPos] = + ( iVal >> ( i * 8 /* size of byte */ ) ) & 255 /* 11111111 */; + + iPos++; + } +} diff --git a/src/protocol.h b/src/protocol.h index 58e928cc..7615e80d 100755 --- a/src/protocol.h +++ b/src/protocol.h @@ -45,7 +45,16 @@ public: virtual ~CProtocol() {} protected: - bool ParseMessage ( const CVector& vecIn ); + bool ParseMessage ( const CVector& vecIn ); + void GenMessage ( 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 );