Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Unified Diff: remoting/protocol/channel_multiplexer.h

Issue 10830046: Implement ChannelMultiplexer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/protocol/channel_multiplexer.h
diff --git a/remoting/protocol/channel_multiplexer.h b/remoting/protocol/channel_multiplexer.h
new file mode 100644
index 0000000000000000000000000000000000000000..217b349d4961fea74f1ad5094e47e3ddb0c1d350
--- /dev/null
+++ b/remoting/protocol/channel_multiplexer.h
@@ -0,0 +1,69 @@
+// Copyright (c) 2012 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_CHANNEL_MULTIPLEXER_H_
+#define REMOTING_PROTOCOL_CHANNEL_MULTIPLEXER_H_
+
+#include "remoting/proto/mux.pb.h"
+#include "remoting/protocol/buffered_socket_writer.h"
+#include "remoting/protocol/channel_factory.h"
+#include "remoting/protocol/message_reader.h"
+
+namespace remoting {
+namespace protocol {
+
+class ChannelMultiplexer : public ChannelFactory {
+ public:
+ static const char kMuxChannelName[];
+
+ // |factory| is used to create underlying sockets.
Wez 2012/08/06 23:14:07 nit: You mean it's used to create the channel(s) u
Sergey Ulanov 2012/08/07 20:12:22 Done.
+ ChannelMultiplexer(ChannelFactory* factory);
Wez 2012/08/06 23:14:07 nit: Allow the multiplex channel name (or channel
Sergey Ulanov 2012/08/07 20:12:22 Done.
+ virtual ~ChannelMultiplexer();
+
+ virtual void CreateStreamChannel(
Wez 2012/08/06 23:14:07 nit: Precede with comment "ChannelFactory interfac
Sergey Ulanov 2012/08/07 20:12:22 Done.
+ const std::string& name,
+ const StreamChannelCallback& callback) OVERRIDE;
+ virtual void CreateDatagramChannel(
+ const std::string& name,
+ const DatagramChannelCallback& callback) OVERRIDE;
+
+ private:
+ struct PendingChannel;
+ class MuxChannel;
+ class MuxSocket;
+ friend class MuxChannel;
+
+ void OnBaseChannelReady(scoped_ptr<net::StreamSocket> socket);
+ MuxChannel* GetOrCreateChannel(const std::string& name);
+
+ void OnWriteFailed(int error);
+ void OnIncomingPacket(scoped_ptr<MuxPacket> packet,
+ const base::Closure& done_task);
+ // Called by MuxChannel.
Wez 2012/08/06 23:14:07 nit: Why is there a comment on this method, but no
Sergey Ulanov 2012/08/07 20:12:22 Done.
+ void DoWrite(scoped_ptr<MuxPacket> packet, const base::Closure& done_task);
+
+ // The underlying socket.
Wez 2012/08/06 23:14:07 nit: The channel over which to multiplex?
Sergey Ulanov 2012/08/07 20:12:22 Done.
+ scoped_ptr<net::StreamSocket> base_channel_;
+
+ // True if creation of |base_channel_| has failed.
+ bool base_channel_failed_;
+
+ // List of requested channels while we are waiting for |base_channel_|.
+ std::list<PendingChannel> pending_channels_;
+
+ int next_channel_id_;
+ std::map<std::string, MuxChannel*> channels_;
Wez 2012/08/06 23:14:07 nit: channels_by_name_
Sergey Ulanov 2012/08/07 20:12:22 I think the current naming is better because it ma
+ std::map<int, MuxChannel*> channels_by_remote_id_;
Wez 2012/08/06 23:14:07 nit: channels_by_id_
Wez 2012/08/06 23:14:07 nit: Why map name->channel and id->channel rather
Sergey Ulanov 2012/08/07 20:12:22 that would be confusing because each channel has t
Sergey Ulanov 2012/08/07 20:12:22 initially, when a channel is created, we don't kno
Wez 2012/08/07 21:44:44 You've renamed the id in MuxChannel to receive_id,
Wez 2012/08/07 21:44:44 I see what you mean. I'm beginning to wonder wheth
Sergey Ulanov 2012/08/07 22:25:14 I renamed it to channels_by_receive_id_
+
+ BufferedSocketWriter writer_;
+ ProtobufMessageReader<MuxPacket> reader_;
+
+ DISALLOW_COPY_AND_ASSIGN(ChannelMultiplexer);
+};
+
+} // namespace protocol
+} // namespace remoting
+
+
+#endif // REMOTING_PROTOCOL_CHANNEL_MULTIPLEXER_H_

Powered by Google App Engine
This is Rietveld 408576698