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
12namespace base {
13
14namespace {
15
16class 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
56FilePathWatcher::FilePathWatcher() {
57  impl_ = new FilePathWatcherImpl();
58}
59
60}  // namespace base
61