Home | History | Annotate | Download | only in files
      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 #include "build/build_config.h"
      8 
      9 #if !defined(OS_IOS)
     10 #include "base/files/file_path_watcher_fsevents.h"
     11 #endif
     12 
     13 namespace base {
     14 
     15 namespace {
     16 
     17 class FilePathWatcherImpl : public FilePathWatcher::PlatformDelegate {
     18  public:
     19   bool Watch(const FilePath& path,
     20              bool recursive,
     21              const FilePathWatcher::Callback& callback) override {
     22     // Use kqueue for non-recursive watches and FSEvents for recursive ones.
     23     DCHECK(!impl_.get());
     24     if (recursive) {
     25       if (!FilePathWatcher::RecursiveWatchAvailable())
     26         return false;
     27 #if !defined(OS_IOS)
     28       impl_ = new FilePathWatcherFSEvents();
     29 #endif  // OS_IOS
     30     } else {
     31       impl_ = new FilePathWatcherKQueue();
     32     }
     33     DCHECK(impl_.get());
     34     return impl_->Watch(path, recursive, callback);
     35   }
     36 
     37   void Cancel() override {
     38     if (impl_.get())
     39       impl_->Cancel();
     40     set_cancelled();
     41   }
     42 
     43   void CancelOnMessageLoopThread() override {
     44     if (impl_.get())
     45       impl_->Cancel();
     46     set_cancelled();
     47   }
     48 
     49  protected:
     50   ~FilePathWatcherImpl() override {}
     51 
     52   scoped_refptr<PlatformDelegate> impl_;
     53 };
     54 
     55 }  // namespace
     56 
     57 FilePathWatcher::FilePathWatcher() {
     58   impl_ = new FilePathWatcherImpl();
     59 }
     60 
     61 }  // namespace base
     62