void MessageQueue::writeData() { if(_sendbuflen==0) { // If send buffer is empty, serialize the next message in the queue. // The snapshot upload queue has lower priority than the normal queue. if(!_sendqueue.isEmpty()) { // There are messages in the higher priority queue, send one MessagePtr msg = _sendqueue.dequeue(); _sendbuflen = msg->serialize(_sendbuffer); if(msg->type() == protocol::MSG_DISCONNECT) { // Automatically disconnect after Disconnect notification is sent _closeWhenReady = true; _sendqueue.clear(); } } else if(!_snapshot_send.isEmpty()) { // When the main send queue is empty, messages from the snapshot queue are sent SnapshotMode mode(SnapshotMode::SNAPSHOT); _sendbuflen = mode.serialize(_sendbuffer); _sendbuflen += _snapshot_send.takeFirst()->serialize(_sendbuffer + _sendbuflen); } } if(_sentcount < _sendbuflen) { int sent = _socket->write(_sendbuffer+_sentcount, _sendbuflen-_sentcount); if(sent<0) { // Error emit socketError(_socket->errorString()); return; } _sentcount += sent; if(_sentcount == _sendbuflen) { _sendbuflen=0; _sentcount=0; if(_closeWhenReady) { _socket->disconnectFromHost(); } else { writeData(); } } } }