10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system.h" 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/files/file.h" 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/message_loop/message_loop_proxy.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/base/io_buffer.h" 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace chromeos { 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace file_system_provider { 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kFakeFileName[] = "hello.txt"; 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kFakeFileText[] = 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "This is a testing file. Lorem ipsum dolor sit amet est."; 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const size_t kFakeFileSize = sizeof(kFakeFileText) - 1u; 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kFakeFileModificationTime[] = "Fri Apr 25 01:47:53 UTC 2014"; 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kFakeFileMimeType[] = "text/plain"; 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kFakeFilePath[] = "/hello.txt"; 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciFakeEntry::FakeEntry() { 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciFakeEntry::FakeEntry(scoped_ptr<EntryMetadata> metadata, 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& contents) 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : metadata(metadata.Pass()), contents(contents) { 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciFakeEntry::~FakeEntry() { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 370529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochFakeProvidedFileSystem::FakeProvidedFileSystem( 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const ProvidedFileSystemInfo& file_system_info) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : file_system_info_(file_system_info), 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) last_file_handle_(0), 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) weak_ptr_factory_(this) { 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddEntry( 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe("/"), true, "", 0, base::Time(), "", ""); 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Time modification_time; 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(base::Time::FromString(kFakeFileModificationTime, &modification_time)); 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddEntry(base::FilePath::FromUTF8Unsafe(kFakeFilePath), 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFakeFileName, 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFakeFileSize, 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch modification_time, 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFakeFileMimeType, 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFakeFileText); 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 560529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochFakeProvidedFileSystem::~FakeProvidedFileSystem() {} 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid FakeProvidedFileSystem::AddEntry(const base::FilePath& entry_path, 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_directory, 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& name, 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int64 size, 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Time modification_time, 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string mime_type, 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string contents) { 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(entries_.find(entry_path) == entries_.end()); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<EntryMetadata> metadata(new EntryMetadata); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->is_directory = is_directory; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->name = name; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->size = size; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->modification_time = modification_time; 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->mime_type = mime_type; 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entries_[entry_path] = 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci make_linked_ptr(new FakeEntry(metadata.Pass(), contents)); 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst FakeEntry* FakeProvidedFileSystem::GetEntry( 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::FilePath& entry_path) const { 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Entries::const_iterator entry_it = entries_.find(entry_path); 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (entry_it == entries_.end()) 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return entry_it->second.get(); 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)FakeProvidedFileSystem::RequestUnmount( 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, base::File::FILE_OK)); 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::GetMetadata( 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::FilePath& entry_path, 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProvidedFileSystemInterface::MetadataFieldMask fields, 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ProvidedFileSystemInterface::GetMetadataCallback& callback) { 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Entries::const_iterator entry_it = entries_.find(entry_path); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (entry_it == entries_.end()) { 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return PostAbortableTask( 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(callback, 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Passed(make_scoped_ptr<EntryMetadata>(NULL)), 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::File::FILE_ERROR_NOT_FOUND)); 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<EntryMetadata> metadata(new EntryMetadata); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->is_directory = entry_it->second->metadata->is_directory; 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->name = entry_it->second->metadata->name; 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->size = entry_it->second->metadata->size; 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->modification_time = entry_it->second->metadata->modification_time; 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->mime_type = entry_it->second->metadata->mime_type; 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->thumbnail = entry_it->second->metadata->thumbnail; 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask( 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(callback, base::Passed(&metadata), base::File::FILE_OK)); 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)FakeProvidedFileSystem::ReadDirectory( 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::FilePath& directory_path, 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::ReadDirectoryCallback& callback) { 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::AsyncFileUtil::EntryList entry_list; 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (Entries::const_iterator it = entries_.begin(); it != entries_.end(); 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++it) { 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath file_path = it->first; 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (file_path == directory_path || directory_path.IsParent(file_path)) { 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const EntryMetadata* const metadata = it->second->metadata.get(); 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) entry_list.push_back(storage::DirectoryEntry( 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->name, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->is_directory ? storage::DirectoryEntry::DIRECTORY 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : storage::DirectoryEntry::FILE, 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->size, 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata->modification_time)); 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind( 13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callback, base::File::FILE_OK, entry_list, false /* has_more */)); 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::OpenFile( 14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::FilePath& entry_path, 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OpenFileMode mode, 14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const OpenFileCallback& callback) { 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Entries::const_iterator entry_it = entries_.find(entry_path); 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (entry_it == entries_.end()) { 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind( 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callback, 0 /* file_handle */, base::File::FILE_ERROR_NOT_FOUND)); 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int file_handle = ++last_file_handle_; 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch opened_files_[file_handle] = entry_path; 15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask( 15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(callback, file_handle, base::File::FILE_OK)); 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::CloseFile( 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int file_handle, 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const OpenedFilesMap::iterator opened_file_it = 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) opened_files_.find(file_handle); 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (opened_file_it == opened_files_.end()) { 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask( 16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_NOT_FOUND)); 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) opened_files_.erase(opened_file_it); 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, base::File::FILE_OK)); 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::ReadFile( 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int file_handle, 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::IOBuffer* buffer, 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 offset, 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int length, 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ProvidedFileSystemInterface::ReadChunkReceivedCallback& callback) { 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const OpenedFilesMap::iterator opened_file_it = 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) opened_files_.find(file_handle); 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (opened_file_it == opened_files_.end() || 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) opened_file_it->second.AsUTF8Unsafe() != kFakeFilePath) { 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask( 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(callback, 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 0 /* chunk_length */, 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) false /* has_more */, 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::File::FILE_ERROR_INVALID_OPERATION)); 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Entries::const_iterator entry_it = 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch entries_.find(opened_file_it->second); 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (entry_it == entries_.end()) { 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask( 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(callback, 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0 /* chunk_length */, 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* has_more */, 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::File::FILE_ERROR_INVALID_OPERATION)); 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Send the response byte by byte. 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int64 current_offset = offset; 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int current_length = length; 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Reading behind EOF is fine, it will just return 0 bytes. 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (current_offset >= entry_it->second->metadata->size || !current_length) { 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, 20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0 /* chunk_length */, 21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) false /* has_more */, 21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::File::FILE_OK)); 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const FakeEntry* const entry = entry_it->second.get(); 21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<int> task_ids; 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (current_offset < entry->metadata->size && current_length) { 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->data()[current_offset - offset] = entry->contents[current_offset]; 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const bool has_more = 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (current_offset + 1 < entry->metadata->size) && (current_length - 1); 22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const int task_id = tracker_.PostTask( 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoopProxy::current().get(), 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind( 22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback, 1 /* chunk_length */, has_more, base::File::FILE_OK)); 22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_ids.push_back(task_id); 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_offset++; 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_length--; 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return base::Bind(&FakeProvidedFileSystem::AbortMany, 23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_ids); 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback 23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)FakeProvidedFileSystem::CreateDirectory( 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath& directory_path, 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool recursive, 23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(mtomasz): Implement it once needed. 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, base::File::FILE_OK)); 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::DeleteEntry( 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath& entry_path, 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool recursive, 24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(mtomasz): Implement it once needed. 24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, base::File::FILE_OK)); 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 25203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::CreateFile( 2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::FilePath& file_path, 25403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::File::Error result = file_path.AsUTF8Unsafe() != kFakeFilePath 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ? base::File::FILE_ERROR_EXISTS 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : base::File::FILE_OK; 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, result)); 2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::CopyEntry( 2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::FilePath& source_path, 2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::FilePath& target_path, 26503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // TODO(mtomasz): Implement it once needed. 26703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, base::File::FILE_OK)); 2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 27003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::MoveEntry( 2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::FilePath& source_path, 2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::FilePath& target_path, 27303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 27403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // TODO(mtomasz): Implement it once needed. 27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, base::File::FILE_OK)); 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::Truncate( 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::FilePath& file_path, 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 length, 28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // TODO(mtomasz): Implement it once needed. 28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, base::File::FILE_OK)); 2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback FakeProvidedFileSystem::WriteFile( 2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int file_handle, 2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::IOBuffer* buffer, 2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 offset, 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int length, 29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const OpenedFilesMap::iterator opened_file_it = 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opened_files_.find(file_handle); 2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (opened_file_it == opened_files_.end() || 2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opened_file_it->second.AsUTF8Unsafe() != kFakeFilePath) { 29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask( 2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_INVALID_OPERATION)); 2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Entries::iterator entry_it = entries_.find(opened_file_it->second); 3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (entry_it == entries_.end()) { 30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask( 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_INVALID_OPERATION)); 3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakeEntry* const entry = entry_it->second.get(); 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (offset > entry->metadata->size) { 30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask( 3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_INVALID_OPERATION)); 3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Allocate the string size in advance. 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (offset + length > entry->metadata->size) { 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entry->metadata->size = offset + length; 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entry->contents.resize(entry->metadata->size); 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) entry->contents.replace(offset, length, buffer->data(), length); 3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return PostAbortableTask(base::Bind(callback, base::File::FILE_OK)); 3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst ProvidedFileSystemInfo& FakeProvidedFileSystem::GetFileSystemInfo() 3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const { 3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return file_system_info_; 3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3290529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochRequestManager* FakeProvidedFileSystem::GetRequestManager() { 3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NOTREACHED(); 3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return NULL; 3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3340529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochProvidedFileSystemInterface* FakeProvidedFileSystem::Create( 335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Profile* profile, 3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const ProvidedFileSystemInfo& file_system_info) { 3370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return new FakeProvidedFileSystem(file_system_info); 3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::WeakPtr<ProvidedFileSystemInterface> 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FakeProvidedFileSystem::GetWeakPtr() { 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return weak_ptr_factory_.GetWeakPtr(); 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystemInterface::AbortCallback 34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)FakeProvidedFileSystem::PostAbortableTask(const base::Closure& callback) { 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int task_id = tracker_.PostTask( 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoopProxy::current().get(), FROM_HERE, callback); 34903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return base::Bind( 35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &FakeProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), task_id); 35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void FakeProvidedFileSystem::Abort( 35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int task_id, 35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) tracker_.TryCancel(task_id); 35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callback.Run(base::File::FILE_OK); 35803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 35903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 36003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void FakeProvidedFileSystem::AbortMany( 36103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::vector<int>& task_ids, 36203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::StatusCallback& callback) { 36303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (size_t i = 0; i < task_ids.size(); ++i) { 36403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) tracker_.TryCancel(task_ids[i]); 36503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 36603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callback.Run(base::File::FILE_OK); 36703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 36803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace file_system_provider 3700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace chromeos 371