+ if (encoding == Stream::STREAM_ENCODING_METACUBE) {
+ // Add a Metacube block header before the data.
+ metacube_block_header hdr;
+ memcpy(hdr.sync, METACUBE_SYNC, sizeof(hdr.sync));
+ hdr.size = htonl(bytes);
+ hdr.flags = htonl(0);
+
+ iovec iov;
+ iov.iov_base = new char[bytes + sizeof(hdr)];
+ iov.iov_len = bytes + sizeof(hdr);
+
+ memcpy(iov.iov_base, &hdr, sizeof(hdr));
+ memcpy(reinterpret_cast<char *>(iov.iov_base) + sizeof(hdr), data, bytes);
+
+ queued_data.push_back(iov);
+ } else if (encoding == Stream::STREAM_ENCODING_RAW) {
+ // Just add the data itself.
+ iovec iov;
+ iov.iov_base = new char[bytes];
+ memcpy(iov.iov_base, data, bytes);
+ iov.iov_len = bytes;
+
+ queued_data.push_back(iov);
+ } else {
+ assert(encoding == Stream::STREAM_ENCODING_RAW);
+ }
+}
+
+void Stream::process_queued_data()
+{
+ if (queued_data.empty()) {
+ return;
+ }
+
+ add_data_raw(queued_data);
+ for (size_t i = 0; i < queued_data.size(); ++i) {
+ char *data = reinterpret_cast<char *>(queued_data[i].iov_base);
+ delete[] data;
+ }
+ queued_data.clear();
+
+ // We have more data, so wake up all clients.