summaryrefslogtreecommitdiffstats
path: root/chrome/browser/file_watcher_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/file_watcher_win.cc')
-rw-r--r--chrome/browser/file_watcher_win.cc111
1 files changed, 0 insertions, 111 deletions
diff --git a/chrome/browser/file_watcher_win.cc b/chrome/browser/file_watcher_win.cc
deleted file mode 100644
index d4ec0ed..0000000
--- a/chrome/browser/file_watcher_win.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (c) 2009 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.
-
-#include "chrome/browser/file_watcher.h"
-
-#include "base/file_path.h"
-#include "base/file_util.h"
-#include "base/logging.h"
-#include "base/object_watcher.h"
-#include "base/ref_counted.h"
-#include "base/time.h"
-
-namespace {
-
-class FileWatcherImpl : public FileWatcher::PlatformDelegate,
- public base::ObjectWatcher::Delegate {
- public:
- FileWatcherImpl() : delegate_(NULL), handle_(INVALID_HANDLE_VALUE) {}
-
- virtual bool Watch(const FilePath& path, FileWatcher::Delegate* delegate);
-
- // Callback from MessageLoopForIO.
- virtual void OnObjectSignaled(HANDLE object);
-
- private:
- virtual ~FileWatcherImpl();
-
- // Delegate to notify upon changes.
- scoped_refptr<FileWatcher::Delegate> delegate_;
-
- // Path we're watching (passed to delegate).
- FilePath path_;
-
- // Handle for FindFirstChangeNotification.
- HANDLE handle_;
-
- // ObjectWatcher to watch handle_ for events.
- base::ObjectWatcher watcher_;
-
- // Keep track of the last modified time of the file. We use nulltime
- // to represent the file not existing.
- base::Time last_modified_;
-
- DISALLOW_COPY_AND_ASSIGN(FileWatcherImpl);
-};
-
-FileWatcherImpl::~FileWatcherImpl() {
- if (handle_ != INVALID_HANDLE_VALUE) {
- watcher_.StopWatching();
- FindCloseChangeNotification(handle_);
- }
-}
-
-bool FileWatcherImpl::Watch(const FilePath& path,
- FileWatcher::Delegate* delegate) {
- DCHECK(path_.value().empty()); // Can only watch one path.
- file_util::FileInfo file_info;
- if (file_util::GetFileInfo(path, &file_info))
- last_modified_ = file_info.last_modified;
-
- // FindFirstChangeNotification watches directories, so use the parent path.
- handle_ = FindFirstChangeNotification(
- path.DirName().value().c_str(),
- false, // Don't watch subtrees
- FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE |
- FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_DIR_NAME);
- if (handle_ == INVALID_HANDLE_VALUE)
- return false;
-
- delegate_ = delegate;
- path_ = path;
- watcher_.StartWatching(handle_, this);
-
- return true;
-}
-
-void FileWatcherImpl::OnObjectSignaled(HANDLE object) {
- DCHECK(object == handle_);
- // Make sure we stay alive through the body of this function.
- scoped_refptr<FileWatcherImpl> keep_alive(this);
-
- file_util::FileInfo file_info;
- bool file_exists = file_util::GetFileInfo(path_, &file_info);
- if (file_exists && (last_modified_.is_null() ||
- last_modified_ != file_info.last_modified)) {
- last_modified_ = file_info.last_modified;
- delegate_->OnFileChanged(path_);
- } else if (file_exists && (base::Time::Now() - last_modified_ <
- base::TimeDelta::FromSeconds(2))) {
- // Since we only have a resolution of 1s, if we get a callback within
- // 2s of the file having changed, go ahead and notify our observer. This
- // might be from a different file change, but it's better to notify too
- // much rather than miss a notification.
- delegate_->OnFileChanged(path_);
- } else if (!file_exists && !last_modified_.is_null()) {
- last_modified_ = base::Time();
- delegate_->OnFileChanged(path_);
- }
-
- // Register for more notifications on file change.
- BOOL ok = FindNextChangeNotification(object);
- DCHECK(ok);
- watcher_.StartWatching(object, this);
-}
-
-} // namespace
-
-FileWatcher::FileWatcher() {
- impl_ = new FileWatcherImpl();
-}