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