Index: chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc |
diff --git a/chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc b/chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc |
index f8fd16eb60df4a659f9e6c6298c00149454f1ef5..52e1c68011722df35d4d33059d76a017f3229c4f 100644 |
--- a/chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc |
+++ b/chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc |
@@ -31,9 +31,17 @@ void AddDirectoryEntry(fileapi::AsyncFileUtil::EntryList* entry_list, |
} // namespace |
+const char kFakeFileName[] = "hello.txt"; |
+const char kFakeFilePath[] = "/hello.txt"; |
+const char kFakeFileText[] = |
+ "This is a testing file. Lorem ipsum dolor sit amet est."; |
+const size_t kFakeFileSize = sizeof(kFakeFileText) - 1u; |
+ |
FakeProvidedFileSystem::FakeProvidedFileSystem( |
const ProvidedFileSystemInfo& file_system_info) |
- : file_system_info_(file_system_info), last_file_handle_(0) { |
+ : file_system_info_(file_system_info), |
+ last_file_handle_(0), |
+ weak_ptr_factory_(this) { |
} |
FakeProvidedFileSystem::~FakeProvidedFileSystem() {} |
@@ -47,27 +55,42 @@ void FakeProvidedFileSystem::RequestUnmount( |
void FakeProvidedFileSystem::GetMetadata( |
const base::FilePath& entry_path, |
const fileapi::AsyncFileUtil::GetFileInfoCallback& callback) { |
- // Return fake metadata for the root directory only. |
- if (entry_path.AsUTF8Unsafe() != "/") { |
+ if (entry_path.AsUTF8Unsafe() == "/") { |
+ base::File::Info file_info; |
+ file_info.size = 0; |
+ file_info.is_directory = true; |
+ file_info.is_symbolic_link = false; |
+ base::Time last_modified_time; |
+ const bool result = base::Time::FromString("Thu Apr 24 00:46:52 UTC 2014", |
+ &last_modified_time); |
+ DCHECK(result); |
+ file_info.last_modified = last_modified_time; |
+ |
base::MessageLoopProxy::current()->PostTask( |
- FROM_HERE, |
- base::Bind( |
- callback, base::File::FILE_ERROR_NOT_FOUND, base::File::Info())); |
+ FROM_HERE, base::Bind(callback, base::File::FILE_OK, file_info)); |
return; |
} |
- base::File::Info file_info; |
- file_info.size = 0; |
- file_info.is_directory = true; |
- file_info.is_symbolic_link = false; |
- base::Time last_modified_time; |
- const bool result = base::Time::FromString("Thu Apr 24 00:46:52 UTC 2014", |
- &last_modified_time); |
- DCHECK(result); |
- file_info.last_modified = last_modified_time; |
+ if (entry_path.AsUTF8Unsafe() == kFakeFilePath) { |
+ base::File::Info file_info; |
+ file_info.size = kFakeFileSize; |
+ file_info.is_directory = false; |
+ file_info.is_symbolic_link = false; |
+ base::Time last_modified_time; |
+ const bool result = base::Time::FromString("Fri Apr 25 01:47:53 UTC 2014", |
+ &last_modified_time); |
+ DCHECK(result); |
+ file_info.last_modified = last_modified_time; |
+ |
+ base::MessageLoopProxy::current()->PostTask( |
+ FROM_HERE, base::Bind(callback, base::File::FILE_OK, file_info)); |
+ return; |
+ } |
base::MessageLoopProxy::current()->PostTask( |
- FROM_HERE, base::Bind(callback, base::File::FILE_OK, file_info)); |
+ FROM_HERE, |
+ base::Bind( |
+ callback, base::File::FILE_ERROR_NOT_FOUND, base::File::Info())); |
} |
void FakeProvidedFileSystem::ReadDirectory( |
@@ -87,9 +110,9 @@ void FakeProvidedFileSystem::ReadDirectory( |
{ |
fileapi::AsyncFileUtil::EntryList entry_list; |
AddDirectoryEntry(&entry_list, |
- "hello.txt", |
+ kFakeFileName, |
fileapi::DirectoryEntry::FILE, |
- 1024 /* size */, |
+ kFakeFileSize, |
"Thu Apr 24 00:46:52 UTC 2014"); |
AddDirectoryEntry(&entry_list, |
@@ -130,14 +153,14 @@ void FakeProvidedFileSystem::OpenFile(const base::FilePath& file_path, |
} |
const int file_handle = ++last_file_handle_; |
- opened_files_.insert(file_handle); |
+ opened_files_[file_handle] = file_path; |
callback.Run(file_handle, base::File::FILE_OK); |
} |
void FakeProvidedFileSystem::CloseFile( |
int file_handle, |
const fileapi::AsyncFileUtil::StatusCallback& callback) { |
- const std::set<int>::iterator opened_file_it = |
+ const OpenedFilesMap::iterator opened_file_it = |
opened_files_.find(file_handle); |
if (opened_file_it == opened_files_.end()) { |
base::MessageLoopProxy::current()->PostTask( |
@@ -156,13 +179,41 @@ void FakeProvidedFileSystem::ReadFile( |
int64 offset, |
int length, |
const ProvidedFileSystemInterface::ReadChunkReceivedCallback& callback) { |
- // TODO(mtomasz): Implement together with the FileStreamReader. |
- base::MessageLoopProxy::current()->PostTask( |
- FROM_HERE, |
- base::Bind(callback, |
- 0 /* chunk_length */, |
- false /* has_next */, |
- base::File::FILE_ERROR_SECURITY)); |
+ const OpenedFilesMap::iterator opened_file_it = |
+ opened_files_.find(file_handle); |
+ if (opened_file_it == opened_files_.end() || |
+ opened_file_it->second.AsUTF8Unsafe() != kFakeFilePath) { |
+ base::MessageLoopProxy::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, |
+ 0 /* chunk_length */, |
+ false /* has_next */, |
+ base::File::FILE_ERROR_SECURITY)); |
+ return; |
+ } |
+ |
+ // Send the response byte by byte. |
+ size_t current_offset = static_cast<size_t>(offset); |
+ size_t current_length = static_cast<size_t>(length); |
+ |
+ // Reading behind EOF, is fine, it will just read 0 bytes. |
+ if (current_offset > kFakeFileSize || !current_length) { |
+ base::MessageLoopProxy::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, |
+ 0 /* chunk_length */, |
+ false /* has_next */, |
+ base::File::FILE_OK)); |
+ } |
+ |
+ while (current_offset < kFakeFileSize && current_length) { |
+ buffer->data()[current_offset - offset] = kFakeFileText[current_offset]; |
+ const bool has_next = |
+ (current_offset + 1 < kFakeFileSize) && (current_length - 1); |
+ callback.Run(1, has_next, base::File::FILE_OK); |
+ current_offset++; |
+ current_length--; |
+ } |
} |
const ProvidedFileSystemInfo& FakeProvidedFileSystem::GetFileSystemInfo() |
@@ -181,5 +232,10 @@ ProvidedFileSystemInterface* FakeProvidedFileSystem::Create( |
return new FakeProvidedFileSystem(file_system_info); |
} |
+base::WeakPtr<ProvidedFileSystemInterface> |
+FakeProvidedFileSystem::GetWeakPtr() { |
+ return weak_ptr_factory_.GetWeakPtr(); |
+} |
+ |
} // namespace file_system_provider |
} // namespace chromeos |