15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/files/file_path.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/scoped_ptr.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/drive/file_system_interface.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_system_util.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/fileapi/async_file_util.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/fileapi/fileapi_worker.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/drive/drive_api_util.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/browser_thread.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/blob/file_stream_reader.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h"
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing content::BrowserThread;
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace drive {
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Called on the UI thread after GetRedirectURLForContentsOnUIThread. Obtains
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the browser URL from |entry|. |callback| will be called on the IO thread.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GetRedirectURLForContentsOnUIThreadWithResourceEntry(
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const storage::URLCallback& callback,
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FileError error,
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<ResourceEntry> entry) {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_CURRENTLY_ON(BrowserThread::UI);
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL url;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (error == FILE_ERROR_OK && entry->has_file_specific_info() &&
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      entry->file_specific_info().is_hosted_document()) {
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    url = GURL(entry->file_specific_info().alternate_url());
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BrowserThread::PostTask(
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BrowserThread::IO, FROM_HERE, base::Bind(callback, url));
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Called on the UI thread after
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// FileSystemBackendDelegate::GetRedirectURLForContents.  Requestes to obtain
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// ResourceEntry for the |url|.
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GetRedirectURLForContentsOnUIThread(
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const storage::FileSystemURL& url,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const storage::URLCallback& callback) {
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_CURRENTLY_ON(BrowserThread::UI);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FileSystemInterface* const file_system =
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      fileapi_internal::GetFileSystemFromUrl(url);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!file_system) {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BrowserThread::PostTask(
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        BrowserThread::IO, FROM_HERE, base::Bind(callback, GURL()));
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (file_path.empty()) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BrowserThread::PostTask(
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        BrowserThread::IO, FROM_HERE, base::Bind(callback, GURL()));
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  file_system->GetResourceEntry(
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      file_path,
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&GetRedirectURLForContentsOnUIThreadWithResourceEntry,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 callback));
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FileSystemBackendDelegate::FileSystemBackendDelegate()
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : async_file_util_(new internal::AsyncFileUtil) {
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemBackendDelegate::~FileSystemBackendDelegate() {
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::AsyncFileUtil* FileSystemBackendDelegate::GetAsyncFileUtil(
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemType type) {
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK_EQ(storage::kFileSystemTypeDrive, type);
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return async_file_util_.get();
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_ptr<storage::FileStreamReader>
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemBackendDelegate::CreateFileStreamReader(
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int64 offset,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int64 max_bytes_to_read,
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::Time& expected_modification_time,
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemContext* context) {
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK_EQ(storage::kFileSystemTypeDrive, url.type());
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (file_path.empty())
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return scoped_ptr<storage::FileStreamReader>();
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return scoped_ptr<storage::FileStreamReader>(
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new internal::WebkitFileStreamReaderImpl(
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          context->default_file_task_runner(),
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          file_path,
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          offset,
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          expected_modification_time));
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_ptr<storage::FileStreamWriter>
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemBackendDelegate::CreateFileStreamWriter(
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int64 offset,
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemContext* context) {
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK_EQ(storage::kFileSystemTypeDrive, url.type());
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Hosted documents don't support stream writer.
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (file_path.empty() || util::HasHostedDocumentExtension(file_path))
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return scoped_ptr<storage::FileStreamWriter>();
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return scoped_ptr<storage::FileStreamWriter>(
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new internal::WebkitFileStreamWriterImpl(
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          context->default_file_task_runner(),
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          file_path,
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          offset));
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistorage::WatcherManager* FileSystemBackendDelegate::GetWatcherManager(
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const storage::FileSystemURL& url) {
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTIMPLEMENTED();
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid FileSystemBackendDelegate::GetRedirectURLForContents(
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const storage::FileSystemURL& url,
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const storage::URLCallback& callback) {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_CURRENTLY_ON(BrowserThread::IO);
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BrowserThread::PostTask(
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BrowserThread::UI,
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FROM_HERE,
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&GetRedirectURLForContentsOnUIThread, url, callback));
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace drive
148