blob: 927c8dcbdd69bab9037d6ef7ea64213c8d58101e [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_HOST_RESIZING_HOST_OBSERVER_H_
#define REMOTING_HOST_RESIZING_HOST_OBSERVER_H_
#include <stddef.h>
#include <memory>
#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "remoting/host/screen_controls.h"
#include "remoting/host/screen_resolution.h"
namespace remoting {
class DesktopResizer;
// TODO(alexeypa): Rename this class to reflect that it is not
// HostStatusObserver any more.
// Uses the specified DesktopResizer to match host desktop size to the client
// view size as closely as is possible. When the connection closes, restores
// the original desktop size if restore is true.
class ResizingHostObserver : public ScreenControls {
public:
explicit ResizingHostObserver(
std::unique_ptr<DesktopResizer> desktop_resizer,
bool restore);
~ResizingHostObserver() override;
// ScreenControls interface.
void SetScreenResolution(const ScreenResolution& resolution) override;
// Provide a replacement for base::TimeTicks::Now so that this class can be
// unit-tested in a timely manner. This function will be called exactly
// once for each call to SetScreenResolution.
void SetNowFunctionForTesting(
const base::Callback<base::TimeTicks(void)>& now_function);
private:
void RestoreScreenResolution();
std::unique_ptr<DesktopResizer> desktop_resizer_;
ScreenResolution original_resolution_;
bool restore_;
// State to manage rate-limiting of desktop resizes.
base::OneShotTimer deferred_resize_timer_;
base::TimeTicks previous_resize_time_;
base::Callback<base::TimeTicks(void)> now_function_;
base::WeakPtrFactory<ResizingHostObserver> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(ResizingHostObserver);
};
} // namespace remoting
#endif // REMOTING_HOST_RESIZING_HOST_OBSERVER_H_