Index: chrome/browser/chromeos/arc/fileapi/arc_documents_provider_backend_delegate.cc |
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_backend_delegate.cc b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_backend_delegate.cc |
index 6572b4c6050203801703db1a3bd0d5399d0cbcd8..3b05c55f95b04157c95fb66e3530d2b7f81effe6 100644 |
--- a/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_backend_delegate.cc |
+++ b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_backend_delegate.cc |
@@ -7,6 +7,10 @@ |
#include <utility> |
#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
+#include "chrome/browser/chromeos/arc/fileapi/arc_content_file_system_url_util.h" |
+#include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_file_stream_reader.h" |
+#include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.h" |
#include "content/public/browser/browser_thread.h" |
#include "storage/browser/fileapi/file_stream_reader.h" |
#include "storage/browser/fileapi/file_stream_writer.h" |
@@ -17,7 +21,7 @@ using content::BrowserThread; |
namespace arc { |
ArcDocumentsProviderBackendDelegate::ArcDocumentsProviderBackendDelegate() |
- : async_file_util_(&roots_) {} |
+ : async_file_util_(&roots_), weak_ptr_factory_(this) {} |
ArcDocumentsProviderBackendDelegate::~ArcDocumentsProviderBackendDelegate() { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
@@ -37,8 +41,21 @@ ArcDocumentsProviderBackendDelegate::CreateFileStreamReader( |
const base::Time& expected_modification_time, |
storage::FileSystemContext* context) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- NOTIMPLEMENTED(); // TODO(crbug.com/671511): Implement this function. |
- return nullptr; |
+ |
+ std::unique_ptr<ArcDocumentsProviderFileStreamReader> reader = |
hidehiko
2016/12/18 14:29:18
Optional: I'd recommend to use "auto", because of
Shuhei Takahashi
2016/12/19 03:05:56
Sure, changed to use auto.
|
+ base::MakeUnique<ArcDocumentsProviderFileStreamReader>(offset); |
+ |
+ base::FilePath path; |
+ ArcDocumentsProviderRoot* root = roots_.ParseAndLookup(url, &path); |
+ if (!root) { |
+ reader->SetContentUrl(GURL()); |
+ return std::move(reader); |
Luis Héctor Chávez
2016/12/17 00:05:26
Huh, why did the pessimizing move warning not trig
Shuhei Takahashi
2016/12/17 00:23:09
I'm not sure why, but returning std::unique_ptr<De
hidehiko
2016/12/18 14:29:18
IIUC, it's C++11 spec about copy elision.
cf) htt
Shuhei Takahashi
2016/12/19 03:05:55
I know that spec but I was wondering why gcc 5.x a
|
+ } |
+ |
+ root->ResolveToContentUrl( |
+ path, base::Bind(&ArcDocumentsProviderFileStreamReader::SetContentUrl, |
+ reader->GetWeakPtr())); |
+ return std::move(reader); |
} |
std::unique_ptr<storage::FileStreamWriter> |
@@ -62,8 +79,26 @@ void ArcDocumentsProviderBackendDelegate::GetRedirectURLForContents( |
const storage::FileSystemURL& url, |
const storage::URLCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- NOTIMPLEMENTED(); // TODO(crbug.com/671511): Implement this function. |
- callback.Run(GURL()); |
+ |
+ base::FilePath path; |
+ ArcDocumentsProviderRoot* root = roots_.ParseAndLookup(url, &path); |
+ if (!root) { |
+ callback.Run(GURL()); |
+ return; |
+ } |
+ |
+ root->ResolveToContentUrl( |
+ path, base::Bind(&ArcDocumentsProviderBackendDelegate:: |
+ GetRedirectURLForContentsWithContentUrl, |
+ weak_ptr_factory_.GetWeakPtr(), callback)); |
+} |
+ |
+void ArcDocumentsProviderBackendDelegate:: |
+ GetRedirectURLForContentsWithContentUrl( |
+ const storage::URLCallback& callback, |
+ const GURL& content_url) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ callback.Run(ArcUrlToExternalFileUrl(content_url)); |
} |
} // namespace arc |