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 #include "remoting/host/host_extension_session_manager.h"
6 
7 #include "base/check.h"
8 #include "remoting/base/capabilities.h"
9 #include "remoting/host/client_session_details.h"
10 #include "remoting/host/host_extension.h"
11 #include "remoting/host/host_extension_session.h"
12 
13 namespace remoting {
14 
HostExtensionSessionManager(const HostExtensions & extensions,ClientSessionDetails * client_session_details)15 HostExtensionSessionManager::HostExtensionSessionManager(
16     const HostExtensions& extensions,
17     ClientSessionDetails* client_session_details)
18     : client_session_details_(client_session_details),
19       client_stub_(nullptr),
20       extensions_(extensions) {}
21 
22 HostExtensionSessionManager::~HostExtensionSessionManager() = default;
23 
GetCapabilities() const24 std::string HostExtensionSessionManager::GetCapabilities() const {
25   std::string capabilities;
26   for (auto* extension : extensions_) {
27     const std::string& capability = extension->capability();
28     if (capability.empty()) {
29       continue;
30     }
31     if (!capabilities.empty()) {
32       capabilities.append(" ");
33     }
34     capabilities.append(capability);
35   }
36   return capabilities;
37 }
38 
OnNegotiatedCapabilities(protocol::ClientStub * client_stub,const std::string & capabilities)39 void HostExtensionSessionManager::OnNegotiatedCapabilities(
40     protocol::ClientStub* client_stub,
41     const std::string& capabilities) {
42   DCHECK(client_stub);
43   DCHECK(!client_stub_);
44 
45   client_stub_ = client_stub;
46 
47   for (auto* extension : extensions_) {
48     // If the extension requires a capability that was not negotiated then do
49     // not instantiate it.
50     if (!extension->capability().empty() &&
51         !HasCapability(capabilities, extension->capability())) {
52       continue;
53     }
54 
55     std::unique_ptr<HostExtensionSession> extension_session =
56         extension->CreateExtensionSession(client_session_details_,
57                                           client_stub_);
58     DCHECK(extension_session);
59 
60     extension_sessions_.push_back(std::move(extension_session));
61   }
62 }
63 
OnExtensionMessage(const protocol::ExtensionMessage & message)64 bool HostExtensionSessionManager::OnExtensionMessage(
65     const protocol::ExtensionMessage& message) {
66   for (const auto& session : extension_sessions_) {
67     if (session->OnExtensionMessage(client_session_details_, client_stub_,
68                                     message)) {
69       return true;
70     }
71   }
72   return false;
73 }
74 
75 }  // namespace remoting
76