Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(683)

Unified Diff: chrome/browser/chromeos/arc/fileapi/arc_documents_provider_async_file_util.cc

Issue 2572683004: mediaview: Introduce ArcDocumentsProviderRoot. (Closed)
Patch Set: Addressed lhchavez's comments. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/arc/fileapi/arc_documents_provider_async_file_util.cc
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_async_file_util.cc b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_async_file_util.cc
index d14a96ac86b43c395a1063f0562ab92a9c412e50..dda144dc4512e6d92ec327e1053fbada569f6998 100644
--- a/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_async_file_util.cc
+++ b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_async_file_util.cc
@@ -4,19 +4,28 @@
#include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_async_file_util.h"
+#include <utility>
+
+#include "base/bind.h"
#include "base/callback.h"
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/logging.h"
+#include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.h"
+#include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root_map.h"
+#include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.h"
#include "content/public/browser/browser_thread.h"
#include "storage/browser/blob/shareable_file_reference.h"
+#include "storage/browser/fileapi/file_system_operation_context.h"
+#include "storage/browser/fileapi/file_system_url.h"
using content::BrowserThread;
namespace arc {
-ArcDocumentsProviderAsyncFileUtil::ArcDocumentsProviderAsyncFileUtil() =
- default;
+ArcDocumentsProviderAsyncFileUtil::ArcDocumentsProviderAsyncFileUtil(
+ ArcDocumentsProviderRootMap* roots)
+ : roots_(roots), weak_ptr_factory_(this) {}
ArcDocumentsProviderAsyncFileUtil::~ArcDocumentsProviderAsyncFileUtil() =
default;
@@ -59,8 +68,22 @@ void ArcDocumentsProviderAsyncFileUtil::GetFileInfo(
int fields,
const GetFileInfoCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
- NOTIMPLEMENTED(); // TODO(crbug.com/671511): Implement this function.
- callback.Run(base::File::FILE_ERROR_NOT_FOUND, base::File::Info());
+ DCHECK_EQ(storage::kFileSystemTypeArcDocumentsProvider, url.type());
+
+ base::FilePath path;
+ ArcDocumentsProviderRoot* root = roots_->ParseAndLookup(url, &path);
+ if (!root) {
+ callback.Run(base::File::FILE_ERROR_NOT_FOUND, base::File::Info());
+ return;
+ }
+
+ root->GetFileInfo(
+ path,
+ base::Bind(&ArcDocumentsProviderAsyncFileUtil::OnGetFileInfo,
+ // It is guaranteed that |this| outlives |context|, so keep
hashimoto 2016/12/15 03:53:22 I don't understand why this becomes the reason to
Shuhei Takahashi 2016/12/15 05:21:53 From AsyncFileUtil comment: // As far as an inst
Shuhei Takahashi 2016/12/15 05:26:15 Oh, BTW, you're right that weak_ptr_factory_ is us
hashimoto 2016/12/15 10:34:57 Sorry, I still don't understand why the said comme
+ // |context| until the operation finishes.
+ base::Unretained(this), base::Passed(std::move(context)),
hashimoto 2016/12/15 03:53:22 Why don't you use the newly added WeakPtrFactory h
Shuhei Takahashi 2016/12/15 05:21:53 Ditto.
+ callback));
}
void ArcDocumentsProviderAsyncFileUtil::ReadDirectory(
@@ -68,9 +91,27 @@ void ArcDocumentsProviderAsyncFileUtil::ReadDirectory(
const storage::FileSystemURL& url,
const ReadDirectoryCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
- NOTIMPLEMENTED(); // TODO(crbug.com/671511): Implement this function.
- callback.Run(base::File::FILE_ERROR_NOT_FOUND, EntryList(),
- false /* has_more */);
+ DCHECK_EQ(storage::kFileSystemTypeArcDocumentsProvider, url.type());
+
+ base::FilePath path;
+ ArcDocumentsProviderRoot* root = roots_->ParseAndLookup(url, &path);
+ if (!root) {
+ callback.Run(base::File::FILE_ERROR_NOT_FOUND, EntryList(), false);
+ return;
+ }
+
+ root->ReadDirectory(
+ path,
+ base::Bind(
+ &ArcDocumentsProviderAsyncFileUtil::OnReadDirectory,
+ // It is guaranteed that |this| outlives |context|, so keep
hashimoto 2016/12/15 03:53:21 ditto.
Shuhei Takahashi 2016/12/15 05:21:53 Ditto.
+ // |context| until the operation finishes.
+ // In this case we can't use base::Passed() because the callback
+ // might be called multiple times with |has_more| = true.
+ base::Unretained(this),
hashimoto 2016/12/15 03:53:22 ditto.
Shuhei Takahashi 2016/12/15 05:21:53 Ditto.
+ base::Owned(new std::unique_ptr<storage::FileSystemOperationContext>(
+ std::move(context))),
+ callback));
}
void ArcDocumentsProviderAsyncFileUtil::Touch(
@@ -165,4 +206,28 @@ void ArcDocumentsProviderAsyncFileUtil::CreateSnapshotFile(
scoped_refptr<storage::ShareableFileReference>());
}
+void ArcDocumentsProviderAsyncFileUtil::OnGetFileInfo(
+ std::unique_ptr<storage::FileSystemOperationContext> context,
+ const GetFileInfoCallback& callback,
+ base::File::Error result,
+ const base::File::Info& file_info) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ callback.Run(result, file_info);
+}
+
+void ArcDocumentsProviderAsyncFileUtil::OnReadDirectory(
+ std::unique_ptr<storage::FileSystemOperationContext>* context,
+ const ReadDirectoryCallback& callback,
+ base::File::Error result,
+ const EntryList& file_list,
+ bool has_more) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ callback.Run(result, file_list, has_more);
+ // |has_more| = false indicates the last call, so release |context|.
+ if (!has_more) {
+ DCHECK(*context);
+ context->reset();
+ }
+}
+
} // namespace arc

Powered by Google App Engine
This is Rietveld 408576698