void MessageQueue::readData() { // Append data to our internal buffer _recvbuffer.append(_socket->readAll()); // We have enough to at least know how many bytes we need. Loop // until we have extracted all the packets we can. bool signal = false; while(_recvbuffer.length()>=3) { if(_expecting==0) { _expecting = Packet::sniffLength(_recvbuffer); if(_expecting==0) { emit badData(); return; } } if(_expecting <= _recvbuffer.length()) { Packet *pkt = Packet::deserialize(_recvbuffer); if(pkt==0) { emit badData(); return; } signal = true; _recvbuffer = _recvbuffer.mid(pkt->length()); _recvqueue.enqueue(pkt); _expecting=0; } else { break; } } if(signal) emit messageAvailable(); }
void MessageQueue::readData() { bool gotmessage = false, gotsnapshot = false; int read, totalread=0; do { // Read available data read = _socket->read(_recvbuffer+_recvcount, MAX_BUF_LEN-_recvcount); if(read<0) { // Error! emit socketError(_socket->errorString()); return; } _recvcount += read; // Extract all complete messages int len; while(2 < _recvcount && (len=Message::sniffLength(_recvbuffer)) <= _recvcount) { // Whole message received! Message *msg = Message::deserialize((const uchar*)_recvbuffer); if(!msg) { emit badData(len, _recvbuffer[2]); } else { if(msg->type() == MSG_STREAMPOS) { // Special handling for Stream Position message emit expectingBytes(static_cast<StreamPos*>(msg)->bytes() + totalread); delete msg; } else if(_expectingSnapshot) { // A message preceded by SnapshotMode::SNAPSHOT goes into the snapshot queue _snapshot_recv.enqueue(MessagePtr(msg)); _expectingSnapshot = false; gotsnapshot = true; } else { if(msg->type() == MSG_SNAPSHOT && static_cast<SnapshotMode*>(msg)->mode() == SnapshotMode::SNAPSHOT) { delete msg; _expectingSnapshot = true; } else { _recvqueue.enqueue(MessagePtr(msg)); gotmessage = true; } } } if(len < _recvcount) { memmove(_recvbuffer, _recvbuffer+len, _recvcount-len); } _recvcount -= len; } totalread += read; } while(read>0); if(totalread) emit bytesReceived(totalread); if(gotmessage) emit messageAvailable(); if(gotsnapshot) emit snapshotAvailable(); }