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