// 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_CONFIG_FILE_WATCHER_H_
#define REMOTING_HOST_CONFIG_FILE_WATCHER_H_

#include "base/compiler_specific.h"
#include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
#include "remoting/host/config_watcher.h"

namespace base {
class SingleThreadTaskRunner;
}  // namespace base

namespace remoting {

extern const char kHostConfigSwitchName[];
extern const base::FilePath::CharType kDefaultHostConfigFile[];

class ConfigFileWatcherImpl;

class ConfigFileWatcher : public ConfigWatcher {
 public:
  // Creates a configuration file watcher that lives at the |io_task_runner|
  // thread but posts config file updates on on |main_task_runner|.
  ConfigFileWatcher(
      scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
      scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
      const base::FilePath& config_path);

  ConfigFileWatcher(const ConfigFileWatcher&) = delete;
  ConfigFileWatcher& operator=(const ConfigFileWatcher&) = delete;

  ~ConfigFileWatcher() override;

  // Inherited from ConfigWatcher.
  void Watch(Delegate* delegate) override;

 private:
  scoped_refptr<ConfigFileWatcherImpl> impl_;
};

}  // namespace remoting

#endif  // REMOTING_HOST_CONFIG_FILE_WATCHER_H_
