// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_GUEST_OS_GUEST_OS_FILE_WATCHER_H_
#define CHROME_BROWSER_ASH_GUEST_OS_GUEST_OS_FILE_WATCHER_H_
#include "base/files/file_path_watcher.h"
#include "chrome/browser/ash/file_manager/file_watcher.h"
#include "chrome/browser/ash/guest_os/guest_id.h"
#include "chromeos/ash/components/dbus/cicerone/cicerone_client.h"
namespace guest_os {
class GuestOsFileWatcher : public ash::CiceroneClient::Observer {
public:
// Creates a watcher for the given `guest_id`, which uses garcon and is
// sharing a directory mounted under `mount_path`, that watches for changes to
// `path` where `path` is relative to the share root. The created watcher is
// in an idle state, call Watch to actually start watching.
GuestOsFileWatcher(std::string owner_id,
GuestId guest_id,
base::FilePath mount_path,
base::FilePath path);
~GuestOsFileWatcher() override;
// Call this to start watching the path, destroy this watcher to stop
// watching. Will run `callback` once the watch is set up with either true on
// success or false on failure. If the watch is successfully set up,
// `file_watcher_callback` will be invoked on file changes with the path
// *outside* that's changed. For example, if the volume is mounted at
// /mnt/foo, the folder the VM is sharing is rooted at /home/user, and the
// watch is for baz, then if /home/user/baz is changed `file_watcher_callback`
// will be called with /mnt/foo/baz.
void Watch(base::FilePathWatcher::Callback file_watcher_callback,
file_manager::FileWatcher::BoolCallback callback);
// ash::CiceroneClient::Observer override.
void OnFileWatchTriggered(
const vm_tools::cicerone::FileWatchTriggeredSignal& signal) override;
private:
std::string owner_id_;
const guest_os::GuestId guest_id_;
// Runs this callback when the
base::FilePathWatcher::Callback file_watcher_callback_;
// The location on the host filesystem where the mount is rooted.
const base::FilePath mount_path_;
// The path, relative to the mount rooot, which is to be watched.
const base::FilePath path_;
};
} // namespace guest_os
#endif // CHROME_BROWSER_ASH_GUEST_OS_GUEST_OS_FILE_WATCHER_H_