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