124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Copyright 2014 The Chromium Authors. All rights reserved.
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Use of this source code is governed by a BSD-style license that can be
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// found in the LICENSE file.
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef REMOTING_PROTOCOL_MONITORED_VIDEO_STUB_H_
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define REMOTING_PROTOCOL_MONITORED_VIDEO_STUB_H_
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "base/callback.h"
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "base/threading/thread_checker.h"
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "base/timer/timer.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "remoting/protocol/video_stub.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace base {
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ThreadChecker;
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace base
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace remoting {
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace protocol {
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MonitoredVideoStub is responsible for notifying the event handler if no
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// frames have been received within |connectivity_check_delay|.
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The implementation uses the decorator pattern in which the MonitoredVideoStub
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// implements the same interface as the VideoStub. It overrides the
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ProcessVideoPacket function to provide notification to the client when the
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// video channel is connected and forward the packet to the underlying
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// VideoStub. Multiple decorators can be stacked on top of each other if more
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// functionality is needed in the future.
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MonitoredVideoStub : public VideoStub {
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public:
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  // Callback to be called when channel state changes.  The Callback should not
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  // destroy the MonitoredVideoStub object.
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  typedef base::Callback<void(bool connected)> ChannelStateCallback;
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  static const int kConnectivityCheckDelaySeconds = 2;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  MonitoredVideoStub(
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      VideoStub* video_stub,
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      base::TimeDelta connectivity_check_delay,
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      const ChannelStateCallback& callback);
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  virtual ~MonitoredVideoStub();
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  // VideoStub implementation.
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  virtual void ProcessVideoPacket(scoped_ptr<VideoPacket> packet,
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                  const base::Closure& done) OVERRIDE;
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner private:
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  void OnConnectivityCheckTimeout();
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  void NotifyChannelState(bool connected);
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  VideoStub* video_stub_;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  ChannelStateCallback callback_;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  base::ThreadChecker thread_checker_;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  bool is_connected_;
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  base::DelayTimer<MonitoredVideoStub> connectivity_check_timer_;
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  DISALLOW_COPY_AND_ASSIGN(MonitoredVideoStub);
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}  // namespace protocol
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}  // namespace remoting
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // REMOTING_PROTOCOL_MONITORED_VIDEO_STUB_H_
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner