summaryrefslogtreecommitdiffstats
path: root/remoting/protocol/messages_decoder.h
diff options
context:
space:
mode:
Diffstat (limited to 'remoting/protocol/messages_decoder.h')
-rw-r--r--remoting/protocol/messages_decoder.h89
1 files changed, 89 insertions, 0 deletions
diff --git a/remoting/protocol/messages_decoder.h b/remoting/protocol/messages_decoder.h
new file mode 100644
index 0000000..66014f6
--- /dev/null
+++ b/remoting/protocol/messages_decoder.h
@@ -0,0 +1,89 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef REMOTING_PROTOCOL_MESSAGES_DECODER_H_
+#define REMOTING_PROTOCOL_MESSAGES_DECODER_H_
+
+#include <deque>
+#include <list>
+
+#include "base/ref_counted.h"
+#include "google/protobuf/message_lite.h"
+#include "net/base/io_buffer.h"
+#include "remoting/base/protocol/chromotocol.pb.h"
+
+namespace remoting {
+
+typedef std::list<ChromotingHostMessage*> HostMessageList;
+typedef std::list<ChromotingClientMessage*> ClientMessageList;
+
+// A protocol decoder is used to decode data transmitted in the chromoting
+// network.
+// TODO(hclam): Defines the interface and implement methods.
+class MessagesDecoder {
+ public:
+ MessagesDecoder();
+ virtual ~MessagesDecoder();
+
+ // Parse data received from network into ClientMessages. Output is written
+ // to |messages|.
+ virtual void ParseClientMessages(scoped_refptr<net::IOBuffer> data,
+ int data_size,
+ ClientMessageList* messages);
+
+ // Parse data received from network into HostMessages. Output is
+ // written to |messages|.
+ virtual void ParseHostMessages(scoped_refptr<net::IOBuffer> data,
+ int data_size,
+ HostMessageList* messages);
+
+ private:
+ // DataChunk stores reference to a net::IOBuffer and size of the data
+ // stored in that buffer.
+ struct DataChunk {
+ DataChunk(net::IOBuffer* data, size_t data_size)
+ : data(data),
+ data_size(data_size) {
+ }
+
+ scoped_refptr<net::IOBuffer> data;
+ size_t data_size;
+ };
+
+ // TODO(sergeyu): It might be more efficient to memcopy data to one big buffer
+ // instead of storing chunks in dqueue.
+ typedef std::deque<DataChunk> DataList;
+
+ // A private method used to parse data received from network into protocol
+ // buffers.
+ template <typename T>
+ void ParseMessages(scoped_refptr<net::IOBuffer> data,
+ int data_size,
+ std::list<T*>* messages);
+
+ // Parse one message from |data_list_|. Return true if sucessful.
+ template <typename T>
+ bool ParseOneMessage(T** messages);
+
+ // A utility method to read payload size of the protocol buffer from the
+ // data list. Return false if we don't have enough data.
+ bool GetPayloadSize(int* size);
+
+ DataList data_list_;
+ size_t last_read_position_;
+
+ // Count the number of bytes in |data_list_| not read.
+ size_t available_bytes_;
+
+ // Stores the size of the next payload if known.
+ size_t next_payload_;
+
+ // True if the size of the next payload is known. After one payload is read,
+ // this is reset to false.
+ bool next_payload_known_;
+};
+
+} // namespace remoting
+
+#endif // REMOTING_PROTOCOL_MESSAGES_DECODER_H_