| Index: chrome/browser/media_galleries/fileapi/file_path_watcher_util.cc
|
| diff --git a/chrome/browser/media_galleries/fileapi/file_path_watcher_util.cc b/chrome/browser/media_galleries/fileapi/file_path_watcher_util.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b9a42a7ab226025c198c44d3967d2900dc3380e1
|
| --- /dev/null
|
| +++ b/chrome/browser/media_galleries/fileapi/file_path_watcher_util.cc
|
| @@ -0,0 +1,64 @@
|
| +// Copyright 2013 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/media_galleries/fileapi/file_path_watcher_util.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/callback.h"
|
| +#include "base/location.h"
|
| +#include "base/logging.h"
|
| +#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +
|
| +namespace chrome {
|
| +
|
| +namespace {
|
| +
|
| +// Bounces |path| and |error| to |callback| from the FILE thread to the media
|
| +// task runner.
|
| +void OnFilePathChangedOnFileThread(
|
| + const base::FilePathWatcher::Callback& callback,
|
| + const base::FilePath& path,
|
| + bool error) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
|
| + MediaFileSystemBackend::MediaTaskRunner()->PostTask(
|
| + FROM_HERE, base::Bind(callback, path, error));
|
| +}
|
| +
|
| +// The watch has to be started on the FILE thread, and the callback called by
|
| +// the FilePathWatcher also needs to run on the FILE thread.
|
| +void StartFilePathWatchOnFileThread(
|
| + const base::FilePath& path,
|
| + const FileWatchStartedCallback& watch_started_callback,
|
| + const base::FilePathWatcher::Callback& path_changed_callback) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
|
| + // The watcher is created on the FILE thread because it is very difficult
|
| + // to safely pass an already-created file watcher to a different thread.
|
| + scoped_ptr<base::FilePathWatcher> watcher(new base::FilePathWatcher);
|
| + bool success = watcher->Watch(
|
| + path,
|
| + false /* recursive */,
|
| + base::Bind(&OnFilePathChangedOnFileThread, path_changed_callback));
|
| + if (!success)
|
| + LOG(ERROR) << "Adding watch for " << path.value() << " failed";
|
| + MediaFileSystemBackend::MediaTaskRunner()->PostTask(
|
| + FROM_HERE, base::Bind(watch_started_callback, base::Passed(&watcher)));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void StartFilePathWatchOnMediaTaskRunner(
|
| + const base::FilePath& path,
|
| + const FileWatchStartedCallback& watch_started_callback,
|
| + const base::FilePathWatcher::Callback& path_changed_callback) {
|
| + DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
|
| + content::BrowserThread::PostTask(content::BrowserThread::FILE,
|
| + FROM_HERE,
|
| + base::Bind(&StartFilePathWatchOnFileThread,
|
| + path,
|
| + watch_started_callback,
|
| + path_changed_callback));
|
| +}
|
| +
|
| +} // namespace chrome
|
|
|