blob: 397feb197f95316fae36b1b602b91c2eca8cfb71 [file] [log] [blame]
// Copyright (c) 2010 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.
// This module provides a way to monitor a file for changes.
#ifndef CHROME_BROWSER_FILE_WATCHER_H_
#define CHROME_BROWSER_FILE_WATCHER_H_
#include "base/basictypes.h"
#include "base/ref_counted.h"
#include "chrome/browser/chrome_thread.h"
class FilePath;
// This class lets you register interest in changes on a file. The delegate
// will get called whenever the file is changed, including created or deleted.
// WARNING: To be able to get create/delete notifications and to work cross
// platform, we actually listen for changes to the directory containing
// the file.
// WARNING: On OSX and Windows, the OS API doesn't tell us which file in the
// directory changed. We work around this by watching the file time, but this
// can result in some extra notifications if we get other notifications within
// 2s of the file having changed.
class FileWatcher {
public:
class Delegate {
public:
virtual ~Delegate() {}
virtual void OnFileChanged(const FilePath& path) = 0;
};
FileWatcher();
~FileWatcher() {}
// Register interest in any changes on the file |path|.
// OnFileChanged will be called back for each change to the file. Any
// background operations will be ran on |backend_thread_id|. Note: The
// directory containing |path| must exist before you try to watch the file.
// Returns false if the watch can't be added.
bool Watch(const FilePath& path, Delegate* delegate) {
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
return impl_->Watch(path, delegate);
}
// Used internally to encapsulate different members on different platforms.
class PlatformDelegate
: public base::RefCountedThreadSafe<PlatformDelegate,
ChromeThread::DeleteOnFileThread> {
public:
virtual ~PlatformDelegate() {}
virtual bool Watch(const FilePath& path, Delegate* delegate) = 0;
};
private:
scoped_refptr<PlatformDelegate> impl_;
DISALLOW_COPY_AND_ASSIGN(FileWatcher);
};
#endif // CHROME_BROWSER_FILE_WATCHER_H_