Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
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();
}