Home | History | Annotate | Download | only in host
      1 // Copyright 2014 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_HOST_HOST_EXTENSION_SESSION_MANAGER_H_
      6 #define REMOTING_HOST_HOST_EXTENSION_SESSION_MANAGER_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/memory/scoped_vector.h"
     13 
     14 namespace webrtc {
     15 class DesktopCapturer;
     16 }
     17 
     18 namespace remoting {
     19 
     20 class ClientSessionControl;
     21 class HostExtension;
     22 class HostExtensionSession;
     23 class VideoEncoder;
     24 
     25 namespace protocol {
     26 class ClientStub;
     27 class ExtensionMessage;
     28 }
     29 
     30 // Helper class used to create and manage a set of HostExtensionSession
     31 // instances depending upon the set of registered HostExtensions, and the
     32 // set of capabilities negotiated between client and host.
     33 class HostExtensionSessionManager {
     34  public:
     35   typedef std::vector<HostExtension*> HostExtensions;
     36 
     37   // Creates an extension manager for the specified |extensions|.
     38   HostExtensionSessionManager(const HostExtensions& extensions,
     39                               ClientSessionControl* client_session_control);
     40   virtual ~HostExtensionSessionManager();
     41 
     42   // Returns the union of all capabilities supported by registered extensions.
     43   std::string GetCapabilities() const;
     44 
     45   // Calls the corresponding hook functions for each extension, to allow them
     46   // to wrap or replace video pipeline components. Only extensions which return
     47   // true from ModifiesVideoPipeline() will be called.
     48   // The order in which extensions are called is undefined.
     49   void OnCreateVideoCapturer(scoped_ptr<webrtc::DesktopCapturer>* capturer);
     50   void OnCreateVideoEncoder(scoped_ptr<VideoEncoder>* encoder);
     51 
     52   // Handles completion of authentication and capabilities negotiation, creating
     53   // the set of HostExtensionSessions to match the client's capabilities.
     54   void OnNegotiatedCapabilities(protocol::ClientStub* client_stub,
     55                                 const std::string& capabilities);
     56 
     57   // Passes |message| to each HostExtensionSession in turn until the message
     58   // is handled, or none remain. Returns true if the message was handled.
     59   // It is not valid for more than one extension to handle the same message.
     60   bool OnExtensionMessage(const protocol::ExtensionMessage& message);
     61 
     62  private:
     63   typedef ScopedVector<HostExtensionSession> HostExtensionSessions;
     64 
     65   // Passed to HostExtensionSessions to allow them to send messages,
     66   // disconnect the session, etc.
     67   ClientSessionControl* client_session_control_;
     68   protocol::ClientStub* client_stub_;
     69 
     70   // The HostExtensions to instantiate for the session, if it reaches the
     71   // authenticated state.
     72   HostExtensions extensions_;
     73 
     74   // The instantiated HostExtensionSessions, used to handle extension messages.
     75   HostExtensionSessions extension_sessions_;
     76 
     77   DISALLOW_COPY_AND_ASSIGN(HostExtensionSessionManager);
     78 };
     79 
     80 }  // namespace remoting
     81 
     82 #endif  // REMOTING_HOST_HOST_EXTENSION_SESSION_MANAGER_H_
     83