void Connection::processReadyRead() { if (state == WaitingForGreeting) { if (!readProtocolHeader()) return; if (currentDataType != Greeting) { abort(); return; } state = ReadingGreeting; } if (state == ReadingGreeting) { if (!hasEnoughData()) return; buffer = read(numBytesForCurrentDataType); if (buffer.size() != numBytesForCurrentDataType) { abort(); return; } username = QString(buffer) + '@' + peerAddress().toString() + ':' + QString::number(peerPort()); currentDataType = Undefined; numBytesForCurrentDataType = 0; buffer.clear(); if (!isValid()) { abort(); return; } if (!isGreetingMessageSent) sendGreetingMessage(); pingTimer.start(); pongTime.start(); state = ReadyForUse; emit readyForUse(); } do { if (currentDataType == Undefined) { if (!readProtocolHeader()) return; } if (!hasEnoughData()) return; processData(); } while (bytesAvailable() > 0); }
void Connection::processReadyRead() { if(!isValid()) { abort(); return; } do { if(m_currentDataType == Undefined) { if(!readProtocolHeader()) return; } if(!hasEnoughData()) return; processData(); } while(bytesAvailable() > 0); }
void DkConnection::readWhileBytesAvailable() { do { if (mCurrentDataType == Undefined) { if (readDataIntoBuffer() <= 0) return; if (!readProtocolHeader()) return; checkState(); } if (!hasEnoughData()) { return; } mBuffer = read(mNumBytesForCurrentDataType); if (mBuffer.size() != mNumBytesForCurrentDataType) { abort(); return; } processData(); } while (bytesAvailable() > 0); }
void DkConnection::checkState() { if (mState == WaitingForGreeting) { if (mCurrentDataType != Greeting) { abort(); return; } if (!hasEnoughData()) return; mBuffer = read(mNumBytesForCurrentDataType); if (mBuffer.size() != mNumBytesForCurrentDataType) { abort(); return; } if (!isValid()) { abort(); return; } if (!mIsGreetingMessageSent) sendGreetingMessage(mCurrentTitle); mState = ReadyForUse; mPortOfPeer = peerPort(); // save peer port ... otherwise connections where this instance is server can not be removed from peerList readGreetingMessage(); mBuffer.clear(); mNumBytesForCurrentDataType = 0; mCurrentDataType = Undefined; return; } if (mState==ReadyForUse && mCurrentDataType == startSynchronize) { if (!hasEnoughData()) return; mBuffer = read(mNumBytesForCurrentDataType); if (mBuffer.size() != mNumBytesForCurrentDataType) { abort(); return; } QDataStream ds(mBuffer); QList<quint16> synchronizedPeersOfOtherInstance; quint16 numberOfSynchronizedPeers; ds >> numberOfSynchronizedPeers; //qDebug() << "other client is sychronized with: "; for (int i=0; i < numberOfSynchronizedPeers; i++) { quint16 peerId; ds >> peerId; synchronizedPeersOfOtherInstance.push_back(peerId); //qDebug() << peerId; } mCurrentDataType = Undefined; mNumBytesForCurrentDataType = 0; mBuffer.clear(); if (!isValid()) { abort(); return; } mState = Synchronized; if (!mIsSynchronizeMessageSent) sendStartSynchronizeMessage(); mSynchronizedTimer->stop(); emit connectionStartSynchronize(synchronizedPeersOfOtherInstance, this); return; } if (mState==Synchronized && mCurrentDataType == stopSynchronize) { mState=ReadyForUse; this->mIsSynchronizeMessageSent=false; emit connectionStopSynchronize(this); mBuffer = read(mNumBytesForCurrentDataType); if (mBuffer.size() != mNumBytesForCurrentDataType) { abort(); return; } mCurrentDataType = Undefined; mNumBytesForCurrentDataType = 0; mBuffer.clear(); return; } if (mCurrentDataType == GoodBye) { //qDebug() << "received GoodBye from " << peerAddress() << ":" << peerPort(); emit connectionGoodBye(this); mCurrentDataType = Undefined; mNumBytesForCurrentDataType = 0; mBuffer.clear(); abort(); return; } }