Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(593)

Side by Side Diff: chrome/browser/chromeos/file_system_provider/fake_provided_file_system.cc

Issue 288113004: [fsp] Add FileStreamReader for the reading operation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed tests. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system .h" 5 #include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system .h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/files/file.h" 9 #include "base/files/file.h"
10 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/message_loop/message_loop_proxy.h"
(...skipping 13 matching lines...) Expand all
24 base::Time last_modified_time; 24 base::Time last_modified_time;
25 const bool result = base::Time::FromString(last_modified_time_string.c_str(), 25 const bool result = base::Time::FromString(last_modified_time_string.c_str(),
26 &last_modified_time); 26 &last_modified_time);
27 DCHECK(result); 27 DCHECK(result);
28 entry_list->push_back( 28 entry_list->push_back(
29 fileapi::DirectoryEntry(name, type, size, last_modified_time)); 29 fileapi::DirectoryEntry(name, type, size, last_modified_time));
30 } 30 }
31 31
32 } // namespace 32 } // namespace
33 33
34 const char kFakeFileName[] = "hello.txt";
35 const char kFakeFilePath[] = "/hello.txt";
36 const char kFakeFileText[] =
37 "This is a testing file. Lorem ipsum dolor sit amet est.";
38 const size_t kFakeFileSize = sizeof(kFakeFileText) - 1u;
39
34 FakeProvidedFileSystem::FakeProvidedFileSystem( 40 FakeProvidedFileSystem::FakeProvidedFileSystem(
35 const ProvidedFileSystemInfo& file_system_info) 41 const ProvidedFileSystemInfo& file_system_info)
36 : file_system_info_(file_system_info), last_file_handle_(0) { 42 : file_system_info_(file_system_info),
43 last_file_handle_(0),
44 weak_ptr_factory_(this) {
37 } 45 }
38 46
39 FakeProvidedFileSystem::~FakeProvidedFileSystem() {} 47 FakeProvidedFileSystem::~FakeProvidedFileSystem() {}
40 48
41 void FakeProvidedFileSystem::RequestUnmount( 49 void FakeProvidedFileSystem::RequestUnmount(
42 const fileapi::AsyncFileUtil::StatusCallback& callback) { 50 const fileapi::AsyncFileUtil::StatusCallback& callback) {
43 base::MessageLoopProxy::current()->PostTask( 51 base::MessageLoopProxy::current()->PostTask(
44 FROM_HERE, base::Bind(callback, base::File::FILE_OK)); 52 FROM_HERE, base::Bind(callback, base::File::FILE_OK));
45 } 53 }
46 54
47 void FakeProvidedFileSystem::GetMetadata( 55 void FakeProvidedFileSystem::GetMetadata(
48 const base::FilePath& entry_path, 56 const base::FilePath& entry_path,
49 const fileapi::AsyncFileUtil::GetFileInfoCallback& callback) { 57 const fileapi::AsyncFileUtil::GetFileInfoCallback& callback) {
50 // Return fake metadata for the root directory only. 58 if (entry_path.AsUTF8Unsafe() == "/") {
51 if (entry_path.AsUTF8Unsafe() != "/") { 59 base::File::Info file_info;
60 file_info.size = 0;
61 file_info.is_directory = true;
62 file_info.is_symbolic_link = false;
63 base::Time last_modified_time;
64 const bool result = base::Time::FromString("Thu Apr 24 00:46:52 UTC 2014",
65 &last_modified_time);
66 DCHECK(result);
67 file_info.last_modified = last_modified_time;
68
52 base::MessageLoopProxy::current()->PostTask( 69 base::MessageLoopProxy::current()->PostTask(
53 FROM_HERE, 70 FROM_HERE, base::Bind(callback, base::File::FILE_OK, file_info));
54 base::Bind(
55 callback, base::File::FILE_ERROR_NOT_FOUND, base::File::Info()));
56 return; 71 return;
57 } 72 }
58 73
59 base::File::Info file_info; 74 if (entry_path.AsUTF8Unsafe() == kFakeFilePath) {
60 file_info.size = 0; 75 base::File::Info file_info;
61 file_info.is_directory = true; 76 file_info.size = kFakeFileSize;
62 file_info.is_symbolic_link = false; 77 file_info.is_directory = false;
63 base::Time last_modified_time; 78 file_info.is_symbolic_link = false;
64 const bool result = base::Time::FromString("Thu Apr 24 00:46:52 UTC 2014", 79 base::Time last_modified_time;
65 &last_modified_time); 80 const bool result = base::Time::FromString("Fri Apr 25 01:47:53 UTC 2014",
66 DCHECK(result); 81 &last_modified_time);
67 file_info.last_modified = last_modified_time; 82 DCHECK(result);
83 file_info.last_modified = last_modified_time;
84
85 base::MessageLoopProxy::current()->PostTask(
86 FROM_HERE, base::Bind(callback, base::File::FILE_OK, file_info));
87 return;
88 }
68 89
69 base::MessageLoopProxy::current()->PostTask( 90 base::MessageLoopProxy::current()->PostTask(
70 FROM_HERE, base::Bind(callback, base::File::FILE_OK, file_info)); 91 FROM_HERE,
92 base::Bind(
93 callback, base::File::FILE_ERROR_NOT_FOUND, base::File::Info()));
71 } 94 }
72 95
73 void FakeProvidedFileSystem::ReadDirectory( 96 void FakeProvidedFileSystem::ReadDirectory(
74 const base::FilePath& directory_path, 97 const base::FilePath& directory_path,
75 const fileapi::AsyncFileUtil::ReadDirectoryCallback& callback) { 98 const fileapi::AsyncFileUtil::ReadDirectoryCallback& callback) {
76 // Return fake contents for the root directory only. 99 // Return fake contents for the root directory only.
77 if (directory_path.AsUTF8Unsafe() != "/") { 100 if (directory_path.AsUTF8Unsafe() != "/") {
78 base::MessageLoopProxy::current()->PostTask( 101 base::MessageLoopProxy::current()->PostTask(
79 FROM_HERE, 102 FROM_HERE,
80 base::Bind(callback, 103 base::Bind(callback,
81 base::File::FILE_ERROR_NOT_FOUND, 104 base::File::FILE_ERROR_NOT_FOUND,
82 fileapi::AsyncFileUtil::EntryList(), 105 fileapi::AsyncFileUtil::EntryList(),
83 false /* has_more */)); 106 false /* has_more */));
84 return; 107 return;
85 } 108 }
86 109
87 { 110 {
88 fileapi::AsyncFileUtil::EntryList entry_list; 111 fileapi::AsyncFileUtil::EntryList entry_list;
89 AddDirectoryEntry(&entry_list, 112 AddDirectoryEntry(&entry_list,
90 "hello.txt", 113 kFakeFileName,
91 fileapi::DirectoryEntry::FILE, 114 fileapi::DirectoryEntry::FILE,
92 1024 /* size */, 115 kFakeFileSize,
93 "Thu Apr 24 00:46:52 UTC 2014"); 116 "Thu Apr 24 00:46:52 UTC 2014");
94 117
95 AddDirectoryEntry(&entry_list, 118 AddDirectoryEntry(&entry_list,
96 "world.txt", 119 "world.txt",
97 fileapi::DirectoryEntry::FILE, 120 fileapi::DirectoryEntry::FILE,
98 1024 /* size */, 121 1024 /* size */,
99 "Wed Apr 23 00:20:30 UTC 2014"); 122 "Wed Apr 23 00:20:30 UTC 2014");
100 123
101 base::MessageLoopProxy::current()->PostTask( 124 base::MessageLoopProxy::current()->PostTask(
102 FROM_HERE, 125 FROM_HERE,
(...skipping 20 matching lines...) Expand all
123 OpenFileMode mode, 146 OpenFileMode mode,
124 bool create, 147 bool create,
125 const OpenFileCallback& callback) { 148 const OpenFileCallback& callback) {
126 if (file_path.AsUTF8Unsafe() != "/hello.txt" || 149 if (file_path.AsUTF8Unsafe() != "/hello.txt" ||
127 mode == OPEN_FILE_MODE_WRITE || create) { 150 mode == OPEN_FILE_MODE_WRITE || create) {
128 callback.Run(0 /* file_handle */, base::File::FILE_ERROR_SECURITY); 151 callback.Run(0 /* file_handle */, base::File::FILE_ERROR_SECURITY);
129 return; 152 return;
130 } 153 }
131 154
132 const int file_handle = ++last_file_handle_; 155 const int file_handle = ++last_file_handle_;
133 opened_files_.insert(file_handle); 156 opened_files_[file_handle] = file_path;
134 callback.Run(file_handle, base::File::FILE_OK); 157 callback.Run(file_handle, base::File::FILE_OK);
135 } 158 }
136 159
137 void FakeProvidedFileSystem::CloseFile( 160 void FakeProvidedFileSystem::CloseFile(
138 int file_handle, 161 int file_handle,
139 const fileapi::AsyncFileUtil::StatusCallback& callback) { 162 const fileapi::AsyncFileUtil::StatusCallback& callback) {
140 const std::set<int>::iterator opened_file_it = 163 const OpenedFilesMap::iterator opened_file_it =
141 opened_files_.find(file_handle); 164 opened_files_.find(file_handle);
142 if (opened_file_it == opened_files_.end()) { 165 if (opened_file_it == opened_files_.end()) {
143 base::MessageLoopProxy::current()->PostTask( 166 base::MessageLoopProxy::current()->PostTask(
144 FROM_HERE, base::Bind(callback, base::File::FILE_ERROR_NOT_FOUND)); 167 FROM_HERE, base::Bind(callback, base::File::FILE_ERROR_NOT_FOUND));
145 return; 168 return;
146 } 169 }
147 170
148 opened_files_.erase(opened_file_it); 171 opened_files_.erase(opened_file_it);
149 base::MessageLoopProxy::current()->PostTask( 172 base::MessageLoopProxy::current()->PostTask(
150 FROM_HERE, base::Bind(callback, base::File::FILE_OK)); 173 FROM_HERE, base::Bind(callback, base::File::FILE_OK));
151 } 174 }
152 175
153 void FakeProvidedFileSystem::ReadFile( 176 void FakeProvidedFileSystem::ReadFile(
154 int file_handle, 177 int file_handle,
155 net::IOBuffer* buffer, 178 net::IOBuffer* buffer,
156 int64 offset, 179 int64 offset,
157 int length, 180 int length,
158 const ProvidedFileSystemInterface::ReadChunkReceivedCallback& callback) { 181 const ProvidedFileSystemInterface::ReadChunkReceivedCallback& callback) {
159 // TODO(mtomasz): Implement together with the FileStreamReader. 182 const OpenedFilesMap::iterator opened_file_it =
160 base::MessageLoopProxy::current()->PostTask( 183 opened_files_.find(file_handle);
161 FROM_HERE, 184 if (opened_file_it == opened_files_.end() ||
162 base::Bind(callback, 185 opened_file_it->second.AsUTF8Unsafe() != kFakeFilePath) {
163 0 /* chunk_length */, 186 base::MessageLoopProxy::current()->PostTask(
164 false /* has_next */, 187 FROM_HERE,
165 base::File::FILE_ERROR_SECURITY)); 188 base::Bind(callback,
189 0 /* chunk_length */,
190 false /* has_next */,
191 base::File::FILE_ERROR_SECURITY));
192 return;
193 }
194
195 // Send the response byte by byte.
196 size_t current_offset = static_cast<size_t>(offset);
197 size_t current_length = static_cast<size_t>(length);
198
199 // Reading behind EOF, is fine, it will just read 0 bytes.
200 if (current_offset > kFakeFileSize || !current_length) {
201 base::MessageLoopProxy::current()->PostTask(
202 FROM_HERE,
203 base::Bind(callback,
204 0 /* chunk_length */,
205 false /* has_next */,
206 base::File::FILE_OK));
207 }
208
209 while (current_offset < kFakeFileSize && current_length) {
210 buffer->data()[current_offset - offset] = kFakeFileText[current_offset];
211 const bool has_next =
212 (current_offset + 1 < kFakeFileSize) && (current_length - 1);
213 callback.Run(1, has_next, base::File::FILE_OK);
214 current_offset++;
215 current_length--;
216 }
166 } 217 }
167 218
168 const ProvidedFileSystemInfo& FakeProvidedFileSystem::GetFileSystemInfo() 219 const ProvidedFileSystemInfo& FakeProvidedFileSystem::GetFileSystemInfo()
169 const { 220 const {
170 return file_system_info_; 221 return file_system_info_;
171 } 222 }
172 223
173 RequestManager* FakeProvidedFileSystem::GetRequestManager() { 224 RequestManager* FakeProvidedFileSystem::GetRequestManager() {
174 NOTREACHED(); 225 NOTREACHED();
175 return NULL; 226 return NULL;
176 } 227 }
177 228
178 ProvidedFileSystemInterface* FakeProvidedFileSystem::Create( 229 ProvidedFileSystemInterface* FakeProvidedFileSystem::Create(
179 extensions::EventRouter* event_router, 230 extensions::EventRouter* event_router,
180 const ProvidedFileSystemInfo& file_system_info) { 231 const ProvidedFileSystemInfo& file_system_info) {
181 return new FakeProvidedFileSystem(file_system_info); 232 return new FakeProvidedFileSystem(file_system_info);
182 } 233 }
183 234
235 base::WeakPtr<ProvidedFileSystemInterface>
236 FakeProvidedFileSystem::GetWeakPtr() {
237 return weak_ptr_factory_.GetWeakPtr();
238 }
239
184 } // namespace file_system_provider 240 } // namespace file_system_provider
185 } // namespace chromeos 241 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698