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/fake_host_extension.h"
6
7#include <string>
8
9#include "base/logging.h"
10#include "remoting/codec/video_encoder.h"
11#include "remoting/host/host_extension_session.h"
12#include "remoting/proto/control.pb.h"
13#include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h"
14
15namespace remoting {
16
17class FakeExtension::Session : public HostExtensionSession {
18 public:
19  Session(FakeExtension* extension, const std::string& message_type);
20  virtual ~Session() {}
21
22  // HostExtensionSession interface.
23  virtual void OnCreateVideoCapturer(
24      scoped_ptr<webrtc::DesktopCapturer>* encoder) OVERRIDE;
25  virtual void OnCreateVideoEncoder(scoped_ptr<VideoEncoder>* encoder) OVERRIDE;
26  virtual bool ModifiesVideoPipeline() const OVERRIDE;
27  virtual bool OnExtensionMessage(
28      ClientSessionControl* client_session_control,
29      protocol::ClientStub* client_stub,
30      const protocol::ExtensionMessage& message) OVERRIDE;
31
32 private:
33  FakeExtension* extension_;
34  std::string message_type_;
35
36  DISALLOW_COPY_AND_ASSIGN(Session);
37};
38
39FakeExtension::Session::Session(
40    FakeExtension* extension, const std::string& message_type)
41  : extension_(extension),
42    message_type_(message_type) {
43}
44
45void FakeExtension::Session::OnCreateVideoCapturer(
46    scoped_ptr<webrtc::DesktopCapturer>* capturer) {
47  extension_->has_wrapped_video_capturer_ = true;
48  if (extension_->steal_video_capturer_) {
49    capturer->reset();
50  }
51}
52
53void FakeExtension::Session::OnCreateVideoEncoder(
54    scoped_ptr<VideoEncoder>* encoder) {
55  extension_->has_wrapped_video_encoder_ = true;
56}
57
58bool FakeExtension::Session::ModifiesVideoPipeline() const {
59  return extension_->steal_video_capturer_;
60}
61
62bool FakeExtension::Session::OnExtensionMessage(
63    ClientSessionControl* client_session_control,
64    protocol::ClientStub* client_stub,
65    const protocol::ExtensionMessage& message) {
66  if (message.type() == message_type_) {
67    extension_->has_handled_message_ = true;
68    return true;
69  }
70  return false;
71}
72
73FakeExtension::FakeExtension(const std::string& message_type,
74                             const std::string& capability)
75  : message_type_(message_type),
76    capability_(capability),
77    steal_video_capturer_(false),
78    has_handled_message_(false),
79    has_wrapped_video_encoder_(false),
80    has_wrapped_video_capturer_(false),
81    was_instantiated_(false) {
82}
83
84FakeExtension::~FakeExtension() {
85}
86
87std::string FakeExtension::capability() const {
88  return capability_;
89}
90
91scoped_ptr<HostExtensionSession> FakeExtension::CreateExtensionSession(
92    ClientSessionControl* client_session_control,
93    protocol::ClientStub* client_stub) {
94  DCHECK(!was_instantiated());
95  was_instantiated_ = true;
96  scoped_ptr<HostExtensionSession> session(new Session(this, message_type_));
97  return session.Pass();
98}
99
100} // namespace remoting
101