Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / base / files / file_path_watcher_mac.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/files/file_path_watcher.h"
6 #include "base/files/file_path_watcher_kqueue.h"
7
8 #if !defined(OS_IOS)
9 #include "base/files/file_path_watcher_fsevents.h"
10 #endif
11
12 namespace base {
13
14 namespace {
15
16 class FilePathWatcherImpl : public FilePathWatcher::PlatformDelegate {
17  public:
18   virtual bool Watch(const FilePath& path,
19                      bool recursive,
20                      const FilePathWatcher::Callback& callback) OVERRIDE {
21     // Use kqueue for non-recursive watches and FSEvents for recursive ones.
22     DCHECK(!impl_.get());
23     if (recursive) {
24       if (!FilePathWatcher::RecursiveWatchAvailable())
25         return false;
26 #if !defined(OS_IOS)
27       impl_ = new FilePathWatcherFSEvents();
28 #endif  // OS_IOS
29     } else {
30       impl_ = new FilePathWatcherKQueue();
31     }
32     DCHECK(impl_.get());
33     return impl_->Watch(path, recursive, callback);
34   }
35
36   virtual void Cancel() OVERRIDE {
37     if (impl_.get())
38       impl_->Cancel();
39     set_cancelled();
40   }
41
42   virtual void CancelOnMessageLoopThread() OVERRIDE {
43     if (impl_.get())
44       impl_->Cancel();
45     set_cancelled();
46   }
47
48  protected:
49   virtual ~FilePathWatcherImpl() {}
50
51   scoped_refptr<PlatformDelegate> impl_;
52 };
53
54 }  // namespace
55
56 FilePathWatcher::FilePathWatcher() {
57   impl_ = new FilePathWatcherImpl();
58 }
59
60 }  // namespace base