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

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

Issue 2580713004: mediaview: Implement ArcDocumentsProviderBackendDelegate. (Closed)
Patch Set: Remove WeakPtrFactory & add TODO for unit tests. Created 3 years, 11 months 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_file_stream_reader.cc
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_file_stream_reader.cc b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_file_stream_reader.cc
new file mode 100644
index 0000000000000000000000000000000000000000..dee5497ad5367563c39e3ca6bfb5b3770fd020ab
--- /dev/null
+++ b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_file_stream_reader.cc
@@ -0,0 +1,117 @@
+// Copyright 2016 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/chromeos/arc/fileapi/arc_documents_provider_file_stream_reader.h"
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.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 "content/public/browser/browser_thread.h"
+#include "net/base/io_buffer.h"
+#include "net/base/net_errors.h"
+#include "url/gurl.h"
+
+using content::BrowserThread;
+
+namespace arc {
+
+ArcDocumentsProviderFileStreamReader::ArcDocumentsProviderFileStreamReader(
+ const storage::FileSystemURL& url,
+ int64_t offset,
+ ArcDocumentsProviderRootMap* roots)
+ : offset_(offset), content_url_resolved_(false), weak_ptr_factory_(this) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ base::FilePath path;
+ ArcDocumentsProviderRoot* root = roots->ParseAndLookup(url, &path);
+ if (!root) {
+ content_url_resolved_ = true;
+ return;
+ }
+ root->ResolveToContentUrl(
+ path,
+ base::Bind(&ArcDocumentsProviderFileStreamReader::OnResolveToContentUrl,
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+ArcDocumentsProviderFileStreamReader::~ArcDocumentsProviderFileStreamReader() {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+}
+
+int ArcDocumentsProviderFileStreamReader::Read(
+ net::IOBuffer* buffer,
+ int buffer_length,
+ const net::CompletionCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (!content_url_resolved_) {
+ pending_operations_.emplace_back(base::Bind(
+ &ArcDocumentsProviderFileStreamReader::RunPendingRead,
+ base::Unretained(this), base::Passed(make_scoped_refptr(buffer)),
+ buffer_length, callback));
+ return net::ERR_IO_PENDING;
+ }
+ if (!underlying_reader_)
+ return net::ERR_FILE_NOT_FOUND;
+ return underlying_reader_->Read(buffer, buffer_length, callback);
+}
+
+int64_t ArcDocumentsProviderFileStreamReader::GetLength(
+ const net::Int64CompletionCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (!content_url_resolved_) {
+ pending_operations_.emplace_back(
+ base::Bind(&ArcDocumentsProviderFileStreamReader::RunPendingGetLength,
+ base::Unretained(this), callback));
+ return net::ERR_IO_PENDING;
+ }
+ if (!underlying_reader_)
+ return net::ERR_FILE_NOT_FOUND;
+ return underlying_reader_->GetLength(callback);
+}
+
+void ArcDocumentsProviderFileStreamReader::OnResolveToContentUrl(
+ const GURL& content_url) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DCHECK(!content_url_resolved_);
+
+ if (content_url.is_valid()) {
+ underlying_reader_ = base::MakeUnique<ArcContentFileSystemFileStreamReader>(
+ content_url, offset_);
+ }
+ content_url_resolved_ = true;
+
+ std::vector<base::Closure> pending_operations;
+ pending_operations.swap(pending_operations_);
+ for (const base::Closure& callback : pending_operations) {
+ callback.Run();
+ }
+}
+
+void ArcDocumentsProviderFileStreamReader::RunPendingRead(
+ scoped_refptr<net::IOBuffer> buffer,
+ int buffer_length,
+ const net::CompletionCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DCHECK(content_url_resolved_);
+ int result =
+ underlying_reader_
+ ? underlying_reader_->Read(buffer.get(), buffer_length, callback)
+ : net::ERR_FILE_NOT_FOUND;
+ if (result != net::ERR_IO_PENDING)
+ callback.Run(result);
+}
+
+void ArcDocumentsProviderFileStreamReader::RunPendingGetLength(
+ const net::Int64CompletionCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DCHECK(content_url_resolved_);
+ int64_t result = underlying_reader_ ? underlying_reader_->GetLength(callback)
+ : net::ERR_FILE_NOT_FOUND;
+ if (result != net::ERR_IO_PENDING)
+ callback.Run(result);
+}
+
+} // namespace arc

Powered by Google App Engine
This is Rietveld 408576698