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

Side by Side Diff: apps/saved_files_service.cc

Issue 23146016: Add support for directory access to the file system API. (Closed) Base URL: http://git.chromium.org/chromium/src.git@simpler-write-permissions
Patch Set: Created 7 years, 3 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
« no previous file with comments | « apps/saved_files_service.h ('k') | apps/saved_files_service_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "apps/saved_files_service.h" 5 #include "apps/saved_files_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "apps/saved_files_service_factory.h" 9 #include "apps/saved_files_service_factory.h"
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 18 matching lines...) Expand all
29 namespace { 29 namespace {
30 30
31 // Preference keys 31 // Preference keys
32 32
33 // The file entries that the app has permission to access. 33 // The file entries that the app has permission to access.
34 const char kFileEntries[] = "file_entries"; 34 const char kFileEntries[] = "file_entries";
35 35
36 // The path to a file entry that the app had permission to access. 36 // The path to a file entry that the app had permission to access.
37 const char kFileEntryPath[] = "path"; 37 const char kFileEntryPath[] = "path";
38 38
39 // Whether or not the the entry refers to a directory.
40 const char kFileEntryIsDirectory[] = "is_directory";
41
39 // The sequence number in the LRU of the file entry. 42 // The sequence number in the LRU of the file entry.
40 const char kFileEntrySequenceNumber[] = "sequence_number"; 43 const char kFileEntrySequenceNumber[] = "sequence_number";
41 44
42 const size_t kMaxSavedFileEntries = 500; 45 const size_t kMaxSavedFileEntries = 500;
43 const int kMaxSequenceNumber = kint32max; 46 const int kMaxSequenceNumber = kint32max;
44 47
45 // These might be different to the constant values in tests. 48 // These might be different to the constant values in tests.
46 size_t g_max_saved_file_entries = kMaxSavedFileEntries; 49 size_t g_max_saved_file_entries = kMaxSavedFileEntries;
47 int g_max_sequence_number = kMaxSequenceNumber; 50 int g_max_sequence_number = kMaxSequenceNumber;
48 51
49 // Persists a SavedFileEntry in ExtensionPrefs. 52 // Persists a SavedFileEntry in ExtensionPrefs.
50 void AddSavedFileEntry(ExtensionPrefs* prefs, 53 void AddSavedFileEntry(ExtensionPrefs* prefs,
51 const std::string& extension_id, 54 const std::string& extension_id,
52 const SavedFileEntry& file_entry) { 55 const SavedFileEntry& file_entry) {
53 ExtensionPrefs::ScopedDictionaryUpdate update( 56 ExtensionPrefs::ScopedDictionaryUpdate update(
54 prefs, extension_id, kFileEntries); 57 prefs, extension_id, kFileEntries);
55 DictionaryValue* file_entries = update.Get(); 58 DictionaryValue* file_entries = update.Get();
56 if (!file_entries) 59 if (!file_entries)
57 file_entries = update.Create(); 60 file_entries = update.Create();
58 DCHECK(!file_entries->GetDictionaryWithoutPathExpansion(file_entry.id, NULL)); 61 DCHECK(!file_entries->GetDictionaryWithoutPathExpansion(file_entry.id, NULL));
59 62
60 DictionaryValue* file_entry_dict = new DictionaryValue(); 63 DictionaryValue* file_entry_dict = new DictionaryValue();
61 file_entry_dict->Set(kFileEntryPath, CreateFilePathValue(file_entry.path)); 64 file_entry_dict->Set(kFileEntryPath, CreateFilePathValue(file_entry.path));
65 file_entry_dict->SetBoolean(kFileEntryIsDirectory, file_entry.is_directory);
62 file_entry_dict->SetInteger(kFileEntrySequenceNumber, 66 file_entry_dict->SetInteger(kFileEntrySequenceNumber,
63 file_entry.sequence_number); 67 file_entry.sequence_number);
64 file_entries->SetWithoutPathExpansion(file_entry.id, file_entry_dict); 68 file_entries->SetWithoutPathExpansion(file_entry.id, file_entry_dict);
65 } 69 }
66 70
67 // Updates the sequence_number of a SavedFileEntry persisted in ExtensionPrefs. 71 // Updates the sequence_number of a SavedFileEntry persisted in ExtensionPrefs.
68 void UpdateSavedFileEntry(ExtensionPrefs* prefs, 72 void UpdateSavedFileEntry(ExtensionPrefs* prefs,
69 const std::string& extension_id, 73 const std::string& extension_id,
70 const SavedFileEntry& file_entry) { 74 const SavedFileEntry& file_entry) {
71 ExtensionPrefs::ScopedDictionaryUpdate update( 75 ExtensionPrefs::ScopedDictionaryUpdate update(
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 it.Advance()) { 115 it.Advance()) {
112 const DictionaryValue* file_entry = NULL; 116 const DictionaryValue* file_entry = NULL;
113 if (!it.value().GetAsDictionary(&file_entry)) 117 if (!it.value().GetAsDictionary(&file_entry))
114 continue; 118 continue;
115 const base::Value* path_value; 119 const base::Value* path_value;
116 if (!file_entry->Get(kFileEntryPath, &path_value)) 120 if (!file_entry->Get(kFileEntryPath, &path_value))
117 continue; 121 continue;
118 base::FilePath file_path; 122 base::FilePath file_path;
119 if (!GetValueAsFilePath(*path_value, &file_path)) 123 if (!GetValueAsFilePath(*path_value, &file_path))
120 continue; 124 continue;
125 bool is_directory = false;
126 file_entry->GetBoolean(kFileEntryIsDirectory, &is_directory);
121 int sequence_number = 0; 127 int sequence_number = 0;
122 if (!file_entry->GetInteger(kFileEntrySequenceNumber, &sequence_number)) 128 if (!file_entry->GetInteger(kFileEntrySequenceNumber, &sequence_number))
123 continue; 129 continue;
124 if (!sequence_number) 130 if (!sequence_number)
125 continue; 131 continue;
126 result.push_back(SavedFileEntry(it.key(), file_path, sequence_number)); 132 result.push_back(
133 SavedFileEntry(it.key(), file_path, is_directory, sequence_number));
127 } 134 }
128 return result; 135 return result;
129 } 136 }
130 137
131 } // namespace 138 } // namespace
132 139
133 SavedFileEntry::SavedFileEntry() : sequence_number(0) {} 140 SavedFileEntry::SavedFileEntry() : is_directory(false), sequence_number(0) {}
134 141
135 SavedFileEntry::SavedFileEntry(const std::string& id, 142 SavedFileEntry::SavedFileEntry(const std::string& id,
136 const base::FilePath& path, 143 const base::FilePath& path,
144 bool is_directory,
137 int sequence_number) 145 int sequence_number)
138 : id(id), 146 : id(id),
139 path(path), 147 path(path),
148 is_directory(is_directory),
140 sequence_number(sequence_number) {} 149 sequence_number(sequence_number) {}
141 150
142 class SavedFilesService::SavedFiles { 151 class SavedFilesService::SavedFiles {
143 public: 152 public:
144 SavedFiles(Profile* profile, const std::string& extension_id); 153 SavedFiles(Profile* profile, const std::string& extension_id);
145 ~SavedFiles(); 154 ~SavedFiles();
146 155
147 void RegisterFileEntry(const std::string& id, 156 void RegisterFileEntry(const std::string& id,
148 const base::FilePath& file_path); 157 const base::FilePath& file_path,
158 bool is_directory);
149 void EnqueueFileEntry(const std::string& id); 159 void EnqueueFileEntry(const std::string& id);
150 bool IsRegistered(const std::string& id) const; 160 bool IsRegistered(const std::string& id) const;
151 const SavedFileEntry* GetFileEntry(const std::string& id) const; 161 const SavedFileEntry* GetFileEntry(const std::string& id) const;
152 std::vector<SavedFileEntry> GetAllFileEntries() const; 162 std::vector<SavedFileEntry> GetAllFileEntries() const;
153 163
154 private: 164 private:
155 // Compacts sequence numbers if the largest sequence number is 165 // Compacts sequence numbers if the largest sequence number is
156 // g_max_sequence_number. Outside of testing, it is set to kint32max, so this 166 // g_max_sequence_number. Outside of testing, it is set to kint32max, so this
157 // will almost never do any real work. 167 // will almost never do any real work.
158 void MaybeCompactSequenceNumbers(); 168 void MaybeCompactSequenceNumbers();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 // Stop listening to NOTIFICATION_EXTENSION_HOST_DESTROYED in particular 222 // Stop listening to NOTIFICATION_EXTENSION_HOST_DESTROYED in particular
213 // as all extension hosts will be destroyed as a result of shutdown. 223 // as all extension hosts will be destroyed as a result of shutdown.
214 registrar_.RemoveAll(); 224 registrar_.RemoveAll();
215 break; 225 break;
216 } 226 }
217 } 227 }
218 } 228 }
219 229
220 void SavedFilesService::RegisterFileEntry(const std::string& extension_id, 230 void SavedFilesService::RegisterFileEntry(const std::string& extension_id,
221 const std::string& id, 231 const std::string& id,
222 const base::FilePath& file_path) { 232 const base::FilePath& file_path,
223 GetOrInsert(extension_id)->RegisterFileEntry(id, file_path); 233 bool is_directory) {
234 GetOrInsert(extension_id)->RegisterFileEntry(id, file_path, is_directory);
224 } 235 }
225 236
226 void SavedFilesService::EnqueueFileEntry(const std::string& extension_id, 237 void SavedFilesService::EnqueueFileEntry(const std::string& extension_id,
227 const std::string& id) { 238 const std::string& id) {
228 GetOrInsert(extension_id)->EnqueueFileEntry(id); 239 GetOrInsert(extension_id)->EnqueueFileEntry(id);
229 } 240 }
230 241
231 std::vector<SavedFileEntry> SavedFilesService::GetAllFileEntries( 242 std::vector<SavedFileEntry> SavedFilesService::GetAllFileEntries(
232 const std::string& extension_id) { 243 const std::string& extension_id) {
233 SavedFiles* saved_files = Get(extension_id); 244 SavedFiles* saved_files = Get(extension_id);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 : profile_(profile), 307 : profile_(profile),
297 extension_id_(extension_id), 308 extension_id_(extension_id),
298 registered_file_entries_deleter_(&registered_file_entries_) { 309 registered_file_entries_deleter_(&registered_file_entries_) {
299 LoadSavedFileEntriesFromPreferences(); 310 LoadSavedFileEntriesFromPreferences();
300 } 311 }
301 312
302 SavedFilesService::SavedFiles::~SavedFiles() {} 313 SavedFilesService::SavedFiles::~SavedFiles() {}
303 314
304 void SavedFilesService::SavedFiles::RegisterFileEntry( 315 void SavedFilesService::SavedFiles::RegisterFileEntry(
305 const std::string& id, 316 const std::string& id,
306 const base::FilePath& file_path) { 317 const base::FilePath& file_path,
318 bool is_directory) {
307 if (ContainsKey(registered_file_entries_, id)) 319 if (ContainsKey(registered_file_entries_, id))
308 return; 320 return;
309 321
310 registered_file_entries_.insert( 322 registered_file_entries_.insert(
311 std::make_pair(id, new SavedFileEntry(id, file_path, 0))); 323 std::make_pair(id, new SavedFileEntry(id, file_path, is_directory, 0)));
312 } 324 }
313 325
314 void SavedFilesService::SavedFiles::EnqueueFileEntry(const std::string& id) { 326 void SavedFilesService::SavedFiles::EnqueueFileEntry(const std::string& id) {
315 base::hash_map<std::string, SavedFileEntry*>::iterator it = 327 base::hash_map<std::string, SavedFileEntry*>::iterator it =
316 registered_file_entries_.find(id); 328 registered_file_entries_.find(id);
317 DCHECK(it != registered_file_entries_.end()); 329 DCHECK(it != registered_file_entries_.end());
318 330
319 SavedFileEntry* file_entry = it->second; 331 SavedFileEntry* file_entry = it->second;
320 int old_sequence_number = file_entry->sequence_number; 332 int old_sequence_number = file_entry->sequence_number;
321 if (!saved_file_lru_.empty()) { 333 if (!saved_file_lru_.empty()) {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 void SavedFilesService::SetLruSizeForTest(int size) { 449 void SavedFilesService::SetLruSizeForTest(int size) {
438 g_max_saved_file_entries = size; 450 g_max_saved_file_entries = size;
439 } 451 }
440 452
441 // static 453 // static
442 void SavedFilesService::ClearLruSizeForTest() { 454 void SavedFilesService::ClearLruSizeForTest() {
443 g_max_saved_file_entries = kMaxSavedFileEntries; 455 g_max_saved_file_entries = kMaxSavedFileEntries;
444 } 456 }
445 457
446 } // namespace apps 458 } // namespace apps
OLDNEW
« no previous file with comments | « apps/saved_files_service.h ('k') | apps/saved_files_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698