OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/drive/resource_metadata.h" | 5 #include "chrome/browser/chromeos/drive/resource_metadata.h" |
6 | 6 |
7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "base/sys_info.h" | 9 #include "base/sys_info.h" |
10 #include "chrome/browser/chromeos/drive/drive.pb.h" | 10 #include "chrome/browser/chromeos/drive/drive.pb.h" |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 storage_(new ResourceMetadataStorage(data_directory_path)), | 132 storage_(new ResourceMetadataStorage(data_directory_path)), |
133 weak_ptr_factory_(this) { | 133 weak_ptr_factory_(this) { |
134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
135 } | 135 } |
136 | 136 |
137 void ResourceMetadata::Initialize(const FileOperationCallback& callback) { | 137 void ResourceMetadata::Initialize(const FileOperationCallback& callback) { |
138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
139 DCHECK(!callback.is_null()); | 139 DCHECK(!callback.is_null()); |
140 | 140 |
141 base::PostTaskAndReplyWithResult( | 141 base::PostTaskAndReplyWithResult( |
142 blocking_task_runner_, | 142 blocking_task_runner_.get(), |
143 FROM_HERE, | 143 FROM_HERE, |
144 base::Bind(&ResourceMetadata::InitializeOnBlockingPool, | 144 base::Bind(&ResourceMetadata::InitializeOnBlockingPool, |
145 base::Unretained(this)), | 145 base::Unretained(this)), |
146 callback); | 146 callback); |
147 } | 147 } |
148 | 148 |
149 void ResourceMetadata::Destroy() { | 149 void ResourceMetadata::Destroy() { |
150 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 150 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
151 | 151 |
152 weak_ptr_factory_.InvalidateWeakPtrs(); | 152 weak_ptr_factory_.InvalidateWeakPtrs(); |
153 blocking_task_runner_->PostTask( | 153 blocking_task_runner_->PostTask( |
154 FROM_HERE, | 154 FROM_HERE, |
155 base::Bind(&ResourceMetadata::DestroyOnBlockingPool, | 155 base::Bind(&ResourceMetadata::DestroyOnBlockingPool, |
156 base::Unretained(this))); | 156 base::Unretained(this))); |
157 } | 157 } |
158 | 158 |
159 void ResourceMetadata::ResetOnUIThread(const FileOperationCallback& callback) { | 159 void ResourceMetadata::ResetOnUIThread(const FileOperationCallback& callback) { |
160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
161 DCHECK(!callback.is_null()); | 161 DCHECK(!callback.is_null()); |
162 | 162 |
163 base::PostTaskAndReplyWithResult( | 163 base::PostTaskAndReplyWithResult( |
164 blocking_task_runner_, | 164 blocking_task_runner_.get(), |
165 FROM_HERE, | 165 FROM_HERE, |
166 base::Bind(&ResourceMetadata::Reset, | 166 base::Bind(&ResourceMetadata::Reset, base::Unretained(this)), |
167 base::Unretained(this)), | |
168 callback); | 167 callback); |
169 } | 168 } |
170 | 169 |
171 FileError ResourceMetadata::Reset() { | 170 FileError ResourceMetadata::Reset() { |
172 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); | 171 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
173 | 172 |
174 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) | 173 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) |
175 return FILE_ERROR_NO_SPACE; | 174 return FILE_ERROR_NO_SPACE; |
176 | 175 |
177 if (!storage_->SetLargestChangestamp(0) || | 176 if (!storage_->SetLargestChangestamp(0) || |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 void ResourceMetadata::DestroyOnBlockingPool() { | 224 void ResourceMetadata::DestroyOnBlockingPool() { |
226 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); | 225 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
227 delete this; | 226 delete this; |
228 } | 227 } |
229 | 228 |
230 void ResourceMetadata::GetLargestChangestampOnUIThread( | 229 void ResourceMetadata::GetLargestChangestampOnUIThread( |
231 const GetChangestampCallback& callback) { | 230 const GetChangestampCallback& callback) { |
232 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 231 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
233 DCHECK(!callback.is_null()); | 232 DCHECK(!callback.is_null()); |
234 base::PostTaskAndReplyWithResult( | 233 base::PostTaskAndReplyWithResult( |
235 blocking_task_runner_, | 234 blocking_task_runner_.get(), |
236 FROM_HERE, | 235 FROM_HERE, |
237 base::Bind(&ResourceMetadata::GetLargestChangestamp, | 236 base::Bind(&ResourceMetadata::GetLargestChangestamp, |
238 base::Unretained(this)), | 237 base::Unretained(this)), |
239 callback); | 238 callback); |
240 } | 239 } |
241 | 240 |
242 void ResourceMetadata::SetLargestChangestampOnUIThread( | 241 void ResourceMetadata::SetLargestChangestampOnUIThread( |
243 int64 value, | 242 int64 value, |
244 const FileOperationCallback& callback) { | 243 const FileOperationCallback& callback) { |
245 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 244 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
246 DCHECK(!callback.is_null()); | 245 DCHECK(!callback.is_null()); |
247 base::PostTaskAndReplyWithResult( | 246 base::PostTaskAndReplyWithResult( |
248 blocking_task_runner_, | 247 blocking_task_runner_.get(), |
249 FROM_HERE, | 248 FROM_HERE, |
250 base::Bind(&ResourceMetadata::SetLargestChangestamp, | 249 base::Bind(&ResourceMetadata::SetLargestChangestamp, |
251 base::Unretained(this), | 250 base::Unretained(this), |
252 value), | 251 value), |
253 callback); | 252 callback); |
254 } | 253 } |
255 | 254 |
256 int64 ResourceMetadata::GetLargestChangestamp() { | 255 int64 ResourceMetadata::GetLargestChangestamp() { |
257 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); | 256 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
258 return storage_->GetLargestChangestamp(); | 257 return storage_->GetLargestChangestamp(); |
259 } | 258 } |
260 | 259 |
261 FileError ResourceMetadata::SetLargestChangestamp(int64 value) { | 260 FileError ResourceMetadata::SetLargestChangestamp(int64 value) { |
262 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); | 261 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
263 | 262 |
264 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) | 263 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) |
265 return FILE_ERROR_NO_SPACE; | 264 return FILE_ERROR_NO_SPACE; |
266 | 265 |
267 storage_->SetLargestChangestamp(value); | 266 storage_->SetLargestChangestamp(value); |
268 return FILE_ERROR_OK; | 267 return FILE_ERROR_OK; |
269 } | 268 } |
270 | 269 |
271 void ResourceMetadata::AddEntryOnUIThread(const ResourceEntry& entry, | 270 void ResourceMetadata::AddEntryOnUIThread(const ResourceEntry& entry, |
272 const FileMoveCallback& callback) { | 271 const FileMoveCallback& callback) { |
273 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 272 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
274 DCHECK(!callback.is_null()); | 273 DCHECK(!callback.is_null()); |
275 | 274 |
276 PostFileMoveTask(blocking_task_runner_, | 275 PostFileMoveTask( |
277 base::Bind(&AddEntryWithFilePath, | 276 blocking_task_runner_.get(), |
278 base::Unretained(this), | 277 base::Bind(&AddEntryWithFilePath, base::Unretained(this), entry), |
279 entry), | 278 callback); |
280 callback); | |
281 } | 279 } |
282 | 280 |
283 FileError ResourceMetadata::AddEntry(const ResourceEntry& entry) { | 281 FileError ResourceMetadata::AddEntry(const ResourceEntry& entry) { |
284 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); | 282 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
285 | 283 |
286 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) | 284 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) |
287 return FILE_ERROR_NO_SPACE; | 285 return FILE_ERROR_NO_SPACE; |
288 | 286 |
289 scoped_ptr<ResourceEntry> existing_entry = | 287 scoped_ptr<ResourceEntry> existing_entry = |
290 storage_->GetEntry(entry.resource_id()); | 288 storage_->GetEntry(entry.resource_id()); |
(...skipping 11 matching lines...) Expand all Loading... |
302 return FILE_ERROR_OK; | 300 return FILE_ERROR_OK; |
303 } | 301 } |
304 | 302 |
305 void ResourceMetadata::MoveEntryToDirectoryOnUIThread( | 303 void ResourceMetadata::MoveEntryToDirectoryOnUIThread( |
306 const base::FilePath& file_path, | 304 const base::FilePath& file_path, |
307 const base::FilePath& directory_path, | 305 const base::FilePath& directory_path, |
308 const FileMoveCallback& callback) { | 306 const FileMoveCallback& callback) { |
309 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 307 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
310 DCHECK(!callback.is_null()); | 308 DCHECK(!callback.is_null()); |
311 | 309 |
312 PostFileMoveTask(blocking_task_runner_, | 310 PostFileMoveTask(blocking_task_runner_.get(), |
313 base::Bind(&ResourceMetadata::MoveEntryToDirectory, | 311 base::Bind(&ResourceMetadata::MoveEntryToDirectory, |
314 base::Unretained(this), | 312 base::Unretained(this), |
315 file_path, | 313 file_path, |
316 directory_path), | 314 directory_path), |
317 callback); | 315 callback); |
318 } | 316 } |
319 | 317 |
320 void ResourceMetadata::RenameEntryOnUIThread(const base::FilePath& file_path, | 318 void ResourceMetadata::RenameEntryOnUIThread(const base::FilePath& file_path, |
321 const std::string& new_name, | 319 const std::string& new_name, |
322 const FileMoveCallback& callback) { | 320 const FileMoveCallback& callback) { |
323 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 321 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
324 DCHECK(!callback.is_null()); | 322 DCHECK(!callback.is_null()); |
325 | 323 |
326 PostFileMoveTask(blocking_task_runner_, | 324 PostFileMoveTask(blocking_task_runner_.get(), |
327 base::Bind(&ResourceMetadata::RenameEntry, | 325 base::Bind(&ResourceMetadata::RenameEntry, |
328 base::Unretained(this), | 326 base::Unretained(this), |
329 file_path, | 327 file_path, |
330 new_name), | 328 new_name), |
331 callback); | 329 callback); |
332 } | 330 } |
333 | 331 |
334 FileError ResourceMetadata::RemoveEntry(const std::string& resource_id) { | 332 FileError ResourceMetadata::RemoveEntry(const std::string& resource_id) { |
335 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); | 333 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
336 | 334 |
(...skipping 15 matching lines...) Expand all Loading... |
352 | 350 |
353 void ResourceMetadata::GetResourceEntryByIdOnUIThread( | 351 void ResourceMetadata::GetResourceEntryByIdOnUIThread( |
354 const std::string& resource_id, | 352 const std::string& resource_id, |
355 const GetResourceEntryCallback& callback) { | 353 const GetResourceEntryCallback& callback) { |
356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 354 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
357 DCHECK(!callback.is_null()); | 355 DCHECK(!callback.is_null()); |
358 | 356 |
359 scoped_ptr<ResourceEntry> entry(new ResourceEntry); | 357 scoped_ptr<ResourceEntry> entry(new ResourceEntry); |
360 ResourceEntry* entry_ptr = entry.get(); | 358 ResourceEntry* entry_ptr = entry.get(); |
361 base::PostTaskAndReplyWithResult( | 359 base::PostTaskAndReplyWithResult( |
362 blocking_task_runner_, | 360 blocking_task_runner_.get(), |
363 FROM_HERE, | 361 FROM_HERE, |
364 base::Bind(&ResourceMetadata::GetResourceEntryById, | 362 base::Bind(&ResourceMetadata::GetResourceEntryById, |
365 base::Unretained(this), | 363 base::Unretained(this), |
366 resource_id, | 364 resource_id, |
367 entry_ptr), | 365 entry_ptr), |
368 base::Bind(&RunGetResourceEntryCallback, | 366 base::Bind(&RunGetResourceEntryCallback, callback, base::Passed(&entry))); |
369 callback, | |
370 base::Passed(&entry))); | |
371 } | 367 } |
372 | 368 |
373 FileError ResourceMetadata::GetResourceEntryById( | 369 FileError ResourceMetadata::GetResourceEntryById( |
374 const std::string& resource_id, | 370 const std::string& resource_id, |
375 ResourceEntry* out_entry) { | 371 ResourceEntry* out_entry) { |
376 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); | 372 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
377 DCHECK(!resource_id.empty()); | 373 DCHECK(!resource_id.empty()); |
378 DCHECK(out_entry); | 374 DCHECK(out_entry); |
379 | 375 |
380 scoped_ptr<ResourceEntry> entry = storage_->GetEntry(resource_id); | 376 scoped_ptr<ResourceEntry> entry = storage_->GetEntry(resource_id); |
381 if (!entry) | 377 if (!entry) |
382 return FILE_ERROR_NOT_FOUND; | 378 return FILE_ERROR_NOT_FOUND; |
383 | 379 |
384 out_entry->Swap(entry.get()); | 380 out_entry->Swap(entry.get()); |
385 return FILE_ERROR_OK; | 381 return FILE_ERROR_OK; |
386 } | 382 } |
387 | 383 |
388 void ResourceMetadata::GetResourceEntryByPathOnUIThread( | 384 void ResourceMetadata::GetResourceEntryByPathOnUIThread( |
389 const base::FilePath& file_path, | 385 const base::FilePath& file_path, |
390 const GetResourceEntryCallback& callback) { | 386 const GetResourceEntryCallback& callback) { |
391 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 387 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
392 DCHECK(!callback.is_null()); | 388 DCHECK(!callback.is_null()); |
393 | 389 |
394 scoped_ptr<ResourceEntry> entry(new ResourceEntry); | 390 scoped_ptr<ResourceEntry> entry(new ResourceEntry); |
395 ResourceEntry* entry_ptr = entry.get(); | 391 ResourceEntry* entry_ptr = entry.get(); |
396 base::PostTaskAndReplyWithResult( | 392 base::PostTaskAndReplyWithResult( |
397 blocking_task_runner_, | 393 blocking_task_runner_.get(), |
398 FROM_HERE, | 394 FROM_HERE, |
399 base::Bind(&ResourceMetadata::GetResourceEntryByPath, | 395 base::Bind(&ResourceMetadata::GetResourceEntryByPath, |
400 base::Unretained(this), | 396 base::Unretained(this), |
401 file_path, | 397 file_path, |
402 entry_ptr), | 398 entry_ptr), |
403 base::Bind(&RunGetResourceEntryCallback, | 399 base::Bind(&RunGetResourceEntryCallback, callback, base::Passed(&entry))); |
404 callback, | |
405 base::Passed(&entry))); | |
406 } | 400 } |
407 | 401 |
408 FileError ResourceMetadata::GetResourceEntryByPath(const base::FilePath& path, | 402 FileError ResourceMetadata::GetResourceEntryByPath(const base::FilePath& path, |
409 ResourceEntry* out_entry) { | 403 ResourceEntry* out_entry) { |
410 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); | 404 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
411 DCHECK(out_entry); | 405 DCHECK(out_entry); |
412 | 406 |
413 scoped_ptr<ResourceEntry> entry = FindEntryByPathSync(path); | 407 scoped_ptr<ResourceEntry> entry = FindEntryByPathSync(path); |
414 if (!entry) | 408 if (!entry) |
415 return FILE_ERROR_NOT_FOUND; | 409 return FILE_ERROR_NOT_FOUND; |
416 | 410 |
417 *out_entry = *entry; | 411 *out_entry = *entry; |
418 return FILE_ERROR_OK; | 412 return FILE_ERROR_OK; |
419 } | 413 } |
420 | 414 |
421 void ResourceMetadata::ReadDirectoryByPathOnUIThread( | 415 void ResourceMetadata::ReadDirectoryByPathOnUIThread( |
422 const base::FilePath& file_path, | 416 const base::FilePath& file_path, |
423 const ReadDirectoryCallback& callback) { | 417 const ReadDirectoryCallback& callback) { |
424 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 418 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
425 DCHECK(!callback.is_null()); | 419 DCHECK(!callback.is_null()); |
426 | 420 |
427 scoped_ptr<ResourceEntryVector> entries(new ResourceEntryVector); | 421 scoped_ptr<ResourceEntryVector> entries(new ResourceEntryVector); |
428 ResourceEntryVector* entries_ptr = entries.get(); | 422 ResourceEntryVector* entries_ptr = entries.get(); |
429 base::PostTaskAndReplyWithResult( | 423 base::PostTaskAndReplyWithResult( |
430 blocking_task_runner_, | 424 blocking_task_runner_.get(), |
431 FROM_HERE, | 425 FROM_HERE, |
432 base::Bind(&ResourceMetadata::ReadDirectoryByPath, | 426 base::Bind(&ResourceMetadata::ReadDirectoryByPath, |
433 base::Unretained(this), | 427 base::Unretained(this), |
434 file_path, | 428 file_path, |
435 entries_ptr), | 429 entries_ptr), |
436 base::Bind(&RunReadDirectoryCallback, | 430 base::Bind(&RunReadDirectoryCallback, callback, base::Passed(&entries))); |
437 callback, | |
438 base::Passed(&entries))); | |
439 } | 431 } |
440 | 432 |
441 FileError ResourceMetadata::ReadDirectoryByPath( | 433 FileError ResourceMetadata::ReadDirectoryByPath( |
442 const base::FilePath& path, | 434 const base::FilePath& path, |
443 ResourceEntryVector* out_entries) { | 435 ResourceEntryVector* out_entries) { |
444 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); | 436 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
445 DCHECK(out_entries); | 437 DCHECK(out_entries); |
446 | 438 |
447 scoped_ptr<ResourceEntry> entry = FindEntryByPathSync(path); | 439 scoped_ptr<ResourceEntry> entry = FindEntryByPathSync(path); |
448 if (!entry) | 440 if (!entry) |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 return FILE_ERROR_OK; | 486 return FILE_ERROR_OK; |
495 } | 487 } |
496 | 488 |
497 void ResourceMetadata::RefreshDirectoryOnUIThread( | 489 void ResourceMetadata::RefreshDirectoryOnUIThread( |
498 const DirectoryFetchInfo& directory_fetch_info, | 490 const DirectoryFetchInfo& directory_fetch_info, |
499 const ResourceEntryMap& entry_map, | 491 const ResourceEntryMap& entry_map, |
500 const FileMoveCallback& callback) { | 492 const FileMoveCallback& callback) { |
501 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 493 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
502 DCHECK(!callback.is_null()); | 494 DCHECK(!callback.is_null()); |
503 | 495 |
504 PostFileMoveTask(blocking_task_runner_, | 496 PostFileMoveTask(blocking_task_runner_.get(), |
505 base::Bind(&ResourceMetadata::RefreshDirectory, | 497 base::Bind(&ResourceMetadata::RefreshDirectory, |
506 base::Unretained(this), | 498 base::Unretained(this), |
507 directory_fetch_info, | 499 directory_fetch_info, |
508 entry_map), | 500 entry_map), |
509 callback); | 501 callback); |
510 } | 502 } |
511 | 503 |
512 void ResourceMetadata::GetChildDirectories( | 504 void ResourceMetadata::GetChildDirectories( |
513 const std::string& resource_id, | 505 const std::string& resource_id, |
514 std::set<base::FilePath>* child_directories) { | 506 std::set<base::FilePath>* child_directories) { |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 for (size_t i = 0; i < children.size(); ++i) { | 823 for (size_t i = 0; i < children.size(); ++i) { |
832 if (!RemoveEntryRecursively(children[i])) | 824 if (!RemoveEntryRecursively(children[i])) |
833 return false; | 825 return false; |
834 } | 826 } |
835 } | 827 } |
836 return storage_->RemoveEntry(resource_id); | 828 return storage_->RemoveEntry(resource_id); |
837 } | 829 } |
838 | 830 |
839 } // namespace internal | 831 } // namespace internal |
840 } // namespace drive | 832 } // namespace drive |
OLD | NEW |