| Index: chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.cc
|
| diff --git a/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.cc b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.cc
|
| index 8264bcad61dcee21f2018dcbc5eb01a53d092985..cbfd83fa2aca0443c0309fed3443db85be25bcba 100644
|
| --- a/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.cc
|
| +++ b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.cc
|
| @@ -95,6 +95,36 @@ void ArcDocumentsProviderRoot::ReadDirectory(
|
| weak_ptr_factory_.GetWeakPtr(), callback));
|
| }
|
|
|
| +void ArcDocumentsProviderRoot::AddWatcher(
|
| + const base::FilePath& path,
|
| + const WatcherCallback& watcher_callback,
|
| + const StatusCallback& callback) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + if (path_to_watcher_id_.count(path)) {
|
| + callback.Run(base::File::FILE_ERROR_FAILED);
|
| + return;
|
| + }
|
| + ResolveToDocumentId(
|
| + path, base::Bind(&ArcDocumentsProviderRoot::AddWatcherWithDocumentId,
|
| + weak_ptr_factory_.GetWeakPtr(), path, watcher_callback,
|
| + callback));
|
| +}
|
| +
|
| +void ArcDocumentsProviderRoot::RemoveWatcher(const base::FilePath& path,
|
| + const StatusCallback& callback) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + auto iter = path_to_watcher_id_.find(path);
|
| + if (iter == path_to_watcher_id_.end()) {
|
| + callback.Run(base::File::FILE_ERROR_FAILED);
|
| + return;
|
| + }
|
| + int64_t watcher_id = iter->second;
|
| + path_to_watcher_id_.erase(iter);
|
| + file_system_operation_runner_util::RemoveWatcherOnIOThread(
|
| + watcher_id, base::Bind(&ArcDocumentsProviderRoot::RemoveWatcherDone,
|
| + weak_ptr_factory_.GetWeakPtr(), callback));
|
| +}
|
| +
|
| void ArcDocumentsProviderRoot::ResolveToContentUrl(
|
| const base::FilePath& path,
|
| const ResolveToContentUrlCallback& callback) {
|
| @@ -182,6 +212,54 @@ void ArcDocumentsProviderRoot::ReadDirectoryWithNameToThinDocumentMap(
|
| callback.Run(base::File::FILE_OK, entry_list, false /* has_more */);
|
| }
|
|
|
| +void ArcDocumentsProviderRoot::AddWatcherWithDocumentId(
|
| + const base::FilePath& path,
|
| + const WatcherCallback& watcher_callback,
|
| + const StatusCallback& callback,
|
| + const std::string& document_id) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + if (document_id.empty()) {
|
| + callback.Run(base::File::FILE_ERROR_NOT_FOUND);
|
| + return;
|
| + }
|
| + file_system_operation_runner_util::AddWatcherOnIOThread(
|
| + authority_, document_id, watcher_callback,
|
| + base::Bind(&ArcDocumentsProviderRoot::AddWatcherDone,
|
| + weak_ptr_factory_.GetWeakPtr(), path, callback));
|
| +}
|
| +
|
| +void ArcDocumentsProviderRoot::AddWatcherDone(const base::FilePath& path,
|
| + const StatusCallback& callback,
|
| + int64_t watcher_id) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + if (watcher_id < 0) {
|
| + callback.Run(base::File::FILE_ERROR_FAILED);
|
| + return;
|
| + }
|
| + if (path_to_watcher_id_.count(path)) {
|
| + // Multiple watchers have been installed on the same file path in a race.
|
| + // Following the contract of WatcherManager, we reject all except the first.
|
| + file_system_operation_runner_util::RemoveWatcherOnIOThread(
|
| + watcher_id, base::Bind(&ArcDocumentsProviderRoot::AddWatcherAborted,
|
| + weak_ptr_factory_.GetWeakPtr(), callback));
|
| + return;
|
| + }
|
| + path_to_watcher_id_.insert(std::make_pair(path, watcher_id));
|
| + callback.Run(base::File::FILE_OK);
|
| +}
|
| +
|
| +void ArcDocumentsProviderRoot::AddWatcherAborted(const StatusCallback& callback,
|
| + bool success) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + callback.Run(base::File::FILE_ERROR_FAILED);
|
| +}
|
| +
|
| +void ArcDocumentsProviderRoot::RemoveWatcherDone(const StatusCallback& callback,
|
| + bool success) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + callback.Run(success ? base::File::FILE_OK : base::File::FILE_ERROR_FAILED);
|
| +}
|
| +
|
| void ArcDocumentsProviderRoot::ResolveToContentUrlWithDocumentId(
|
| const ResolveToContentUrlCallback& callback,
|
| const std::string& document_id) {
|
|
|