1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef REMOTING_PROTOCOL_CHANNEL_DISPATCHER_BASE_H_ 6 #define REMOTING_PROTOCOL_CHANNEL_DISPATCHER_BASE_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/callback.h" 12 #include "base/memory/scoped_ptr.h" 13 14 namespace net { 15 class StreamSocket; 16 } // namespace net 17 18 namespace remoting { 19 namespace protocol { 20 21 struct ChannelConfig; 22 class StreamChannelFactory; 23 class Session; 24 25 // Base class for channel message dispatchers. It's responsible for 26 // creating the named channel. Derived dispatchers then dispatch 27 // incoming messages on this channel as well as send outgoing 28 // messages. 29 class ChannelDispatcherBase { 30 public: 31 // The callback is called when initialization is finished. The 32 // parameter is set to true on success. 33 typedef base::Callback<void(bool)> InitializedCallback; 34 35 virtual ~ChannelDispatcherBase(); 36 37 // Creates and connects the channel in the specified 38 // |session|. Caller retains ownership of the Session. 39 void Init(Session* session, 40 const ChannelConfig& config, 41 const InitializedCallback& callback); 42 43 // Returns true if the channel is currently connected. is_connected()44 bool is_connected() { return channel() != NULL; } 45 46 protected: 47 explicit ChannelDispatcherBase(const char* channel_name); 48 channel()49 net::StreamSocket* channel() { return channel_.get(); } 50 51 // Called when channel is initialized. Must be overriden in the 52 // child classes. Should not delete the dispatcher. 53 virtual void OnInitialized() = 0; 54 55 private: 56 void OnChannelReady(scoped_ptr<net::StreamSocket> socket); 57 58 std::string channel_name_; 59 StreamChannelFactory* channel_factory_; 60 InitializedCallback initialized_callback_; 61 scoped_ptr<net::StreamSocket> channel_; 62 63 DISALLOW_COPY_AND_ASSIGN(ChannelDispatcherBase); 64 }; 65 66 } // namespace protocol 67 } // namespace remoting 68 69 #endif // REMOTING_PROTOCOL_CHANNEL_DISPATCHER_BASE_H_ 70