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