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/gdata/gdata_file_system.h" | 5 #include "chrome/browser/chromeos/gdata/gdata_file_system.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 1098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1109 FilePath new_file(file_name); | 1109 FilePath new_file(file_name); |
1110 if (new_file.Extension() == | 1110 if (new_file.Extension() == |
1111 entry_proto->file_specific_info().document_extension()) { | 1111 entry_proto->file_specific_info().document_extension()) { |
1112 file_name = new_file.RemoveExtension().value(); | 1112 file_name = new_file.RemoveExtension().value(); |
1113 } | 1113 } |
1114 } | 1114 } |
1115 | 1115 |
1116 documents_service_->RenameResource( | 1116 documents_service_->RenameResource( |
1117 GURL(entry_proto->edit_url()), | 1117 GURL(entry_proto->edit_url()), |
1118 file_name, | 1118 file_name, |
1119 base::Bind(&GDataFileSystem::OnRenameResourceCompleted, | 1119 base::Bind(&GDataFileSystem::RenameFileOnFileSystem, |
1120 ui_weak_ptr_, | 1120 ui_weak_ptr_, |
1121 file_path, | 1121 file_path, |
1122 file_name, | 1122 file_name, |
1123 callback)); | 1123 callback)); |
1124 } | 1124 } |
1125 | 1125 |
1126 void GDataFileSystem::Move(const FilePath& src_file_path, | 1126 void GDataFileSystem::Move(const FilePath& src_file_path, |
1127 const FilePath& dest_file_path, | 1127 const FilePath& dest_file_path, |
1128 const FileOperationCallback& callback) { | 1128 const FileOperationCallback& callback) { |
1129 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || | 1129 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1185 FilePathUpdateCallback add_file_to_directory_callback = | 1185 FilePathUpdateCallback add_file_to_directory_callback = |
1186 base::Bind(&GDataFileSystem::AddEntryToDirectory, | 1186 base::Bind(&GDataFileSystem::AddEntryToDirectory, |
1187 ui_weak_ptr_, | 1187 ui_weak_ptr_, |
1188 dest_file_path.DirName(), | 1188 dest_file_path.DirName(), |
1189 callback); | 1189 callback); |
1190 | 1190 |
1191 FilePathUpdateCallback remove_file_from_directory_callback = | 1191 FilePathUpdateCallback remove_file_from_directory_callback = |
1192 base::Bind(&GDataFileSystem::RemoveEntryFromDirectory, | 1192 base::Bind(&GDataFileSystem::RemoveEntryFromDirectory, |
1193 ui_weak_ptr_, | 1193 ui_weak_ptr_, |
1194 src_file_path.DirName(), | 1194 src_file_path.DirName(), |
1195 add_file_to_directory_callback); | 1195 add_file_to_directory_callback); |
satorux1
2012/08/08 23:25:01
wow, move operation is super complicated...
| |
1196 | 1196 |
1197 Rename(src_file_path, dest_file_path.BaseName().value(), | 1197 Rename(src_file_path, dest_file_path.BaseName().value(), |
1198 remove_file_from_directory_callback); | 1198 remove_file_from_directory_callback); |
1199 } | 1199 } |
1200 | 1200 |
1201 void GDataFileSystem::AddEntryToDirectory( | 1201 void GDataFileSystem::AddEntryToDirectory( |
1202 const FilePath& dir_path, | 1202 const FilePath& dir_path, |
1203 const FileOperationCallback& callback, | 1203 const FileOperationCallback& callback, |
1204 GDataFileError error, | 1204 GDataFileError error, |
1205 const FilePath& file_path) { | 1205 const FilePath& file_path) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1260 MessageLoop::current()->PostTask(FROM_HERE, | 1260 MessageLoop::current()->PostTask(FROM_HERE, |
1261 base::Bind(callback, error, file_path)); | 1261 base::Bind(callback, error, file_path)); |
1262 } | 1262 } |
1263 return; | 1263 return; |
1264 } | 1264 } |
1265 | 1265 |
1266 documents_service_->RemoveResourceFromDirectory( | 1266 documents_service_->RemoveResourceFromDirectory( |
1267 dir->content_url(), | 1267 dir->content_url(), |
1268 entry->edit_url(), | 1268 entry->edit_url(), |
1269 entry->resource_id(), | 1269 entry->resource_id(), |
1270 base::Bind(&GDataFileSystem::OnRemoveEntryFromDirectoryCompleted, | 1270 base::Bind(&GDataFileSystem::RemoveEntryFromDirectoryOnFileSystem, |
1271 ui_weak_ptr_, | 1271 ui_weak_ptr_, |
1272 callback, | 1272 callback, |
1273 file_path, | 1273 file_path, |
1274 dir_path)); | 1274 dir_path)); |
1275 } | 1275 } |
1276 | 1276 |
1277 void GDataFileSystem::Remove(const FilePath& file_path, | 1277 void GDataFileSystem::Remove(const FilePath& file_path, |
1278 bool is_recursive, | 1278 bool is_recursive, |
1279 const FileOperationCallback& callback) { | 1279 const FileOperationCallback& callback) { |
1280 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || | 1280 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || |
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2001 scoped_ptr<GDataEntry> entry(it->second); | 2001 scoped_ptr<GDataEntry> entry(it->second); |
2002 // Skip if it's not a file (i.e. directory). | 2002 // Skip if it's not a file (i.e. directory). |
2003 if (!entry->AsGDataFile()) | 2003 if (!entry->AsGDataFile()) |
2004 continue; | 2004 continue; |
2005 directory->AddEntry(entry.release()); | 2005 directory->AddEntry(entry.release()); |
2006 } | 2006 } |
2007 | 2007 |
2008 // Note that there may be no change in the directory, but it's expensive to | 2008 // Note that there may be no change in the directory, but it's expensive to |
2009 // check if the new metadata matches the existing one, so we just always | 2009 // check if the new metadata matches the existing one, so we just always |
2010 // notify that the directory is changed. | 2010 // notify that the directory is changed. |
2011 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, | 2011 OnDirectoryChanged(directory_path); |
2012 observers_, OnDirectoryChanged(directory_path)); | |
2013 DVLOG(1) << "Directory refreshed: " << directory_path.value(); | 2012 DVLOG(1) << "Directory refreshed: " << directory_path.value(); |
2014 } | 2013 } |
2015 | 2014 |
2016 void GDataFileSystem::UpdateFileByResourceId( | 2015 void GDataFileSystem::UpdateFileByResourceId( |
2017 const std::string& resource_id, | 2016 const std::string& resource_id, |
2018 const FileOperationCallback& callback) { | 2017 const FileOperationCallback& callback) { |
2019 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || | 2018 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || |
2020 BrowserThread::CurrentlyOn(BrowserThread::IO)); | 2019 BrowserThread::CurrentlyOn(BrowserThread::IO)); |
2021 RunTaskOnUIThread( | 2020 RunTaskOnUIThread( |
2022 base::Bind(&GDataFileSystem::UpdateFileByResourceIdOnUIThread, | 2021 base::Bind(&GDataFileSystem::UpdateFileByResourceIdOnUIThread, |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2393 int root_feed_changestamp) { | 2392 int root_feed_changestamp) { |
2394 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2393 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2395 | 2394 |
2396 return feed_loader_->UpdateFromFeed(feed_list, | 2395 return feed_loader_->UpdateFromFeed(feed_list, |
2397 start_changestamp, | 2396 start_changestamp, |
2398 root_feed_changestamp); | 2397 root_feed_changestamp); |
2399 } | 2398 } |
2400 | 2399 |
2401 void GDataFileSystem::OnFilePathUpdated(const FileOperationCallback& callback, | 2400 void GDataFileSystem::OnFilePathUpdated(const FileOperationCallback& callback, |
2402 GDataFileError error, | 2401 GDataFileError error, |
2403 const FilePath& file_path) { | 2402 const FilePath& file_path) { |
satorux1
2012/08/08 23:25:01
this is weird. file_path is not used... can you co
achuithb
2012/08/09 00:12:51
Done.
We have this in a lot of places because we
satorux1
2012/08/09 00:26:24
don't have to spend time finding them but if we se
| |
2404 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2403 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2405 if (!callback.is_null()) | 2404 if (!callback.is_null()) |
2406 callback.Run(error); | 2405 callback.Run(error); |
2407 } | 2406 } |
2408 | 2407 |
2409 void GDataFileSystem::OnRenameResourceCompleted( | |
2410 const FilePath& file_path, | |
2411 const FilePath::StringType& new_name, | |
2412 const FilePathUpdateCallback& callback, | |
2413 GDataErrorCode status, | |
2414 const GURL& document_url) { | |
2415 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
2416 | |
2417 FilePath updated_file_path; | |
2418 GDataFileError error = util::GDataToGDataFileError(status); | |
2419 if (error == GDATA_FILE_OK) | |
2420 error = RenameFileOnFilesystem(file_path, new_name, &updated_file_path); | |
2421 | |
2422 if (!callback.is_null()) | |
2423 callback.Run(error, updated_file_path); | |
2424 } | |
2425 | |
2426 void GDataFileSystem::OnCopyDocumentCompleted( | 2408 void GDataFileSystem::OnCopyDocumentCompleted( |
2427 const FilePath& dir_path, | 2409 const FilePath& dir_path, |
2428 const FileOperationCallback& callback, | 2410 const FileOperationCallback& callback, |
2429 GDataErrorCode status, | 2411 GDataErrorCode status, |
2430 scoped_ptr<base::Value> data) { | 2412 scoped_ptr<base::Value> data) { |
2431 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2413 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2432 | 2414 |
2433 GDataFileError error = util::GDataToGDataFileError(status); | 2415 GDataFileError error = util::GDataToGDataFileError(status); |
2434 if (error != GDATA_FILE_OK) { | 2416 if (error != GDATA_FILE_OK) { |
2435 if (!callback.is_null()) | 2417 if (!callback.is_null()) |
2436 callback.Run(error); | 2418 callback.Run(error); |
2437 | 2419 |
2438 return; | 2420 return; |
2439 } | 2421 } |
2440 | 2422 |
2441 scoped_ptr<DocumentEntry> doc_entry(DocumentEntry::ExtractAndParse(*data)); | 2423 scoped_ptr<DocumentEntry> doc_entry(DocumentEntry::ExtractAndParse(*data)); |
2442 if (!doc_entry.get()) { | 2424 if (!doc_entry.get()) { |
2443 if (!callback.is_null()) | 2425 if (!callback.is_null()) |
2444 callback.Run(GDATA_FILE_ERROR_FAILED); | 2426 callback.Run(GDATA_FILE_ERROR_FAILED); |
2445 | 2427 |
2446 return; | 2428 return; |
2447 } | 2429 } |
2448 | 2430 |
2449 GDataEntry* entry = GDataEntry::FromDocumentEntry( | 2431 GDataEntry* entry = GDataEntry::FromDocumentEntry( |
2450 directory_service_->root(), doc_entry.get(), directory_service_.get()); | 2432 NULL, doc_entry.get(), directory_service_.get()); |
2451 if (!entry) { | 2433 if (!entry) { |
2452 if (!callback.is_null()) | 2434 if (!callback.is_null()) |
2453 callback.Run(GDATA_FILE_ERROR_FAILED); | 2435 callback.Run(GDATA_FILE_ERROR_FAILED); |
2454 | 2436 |
2455 return; | 2437 return; |
2456 } | 2438 } |
2457 | 2439 |
2458 // |entry| was added in the root directory on the server, so we should | 2440 // |entry| was added in the root directory on the server, so we should |
2459 // first add it to |root_| to mirror the state and then move it to the | 2441 // first add it to |root_| to mirror the state and then move it to the |
2460 // destination directory by AddEntryToDirectory(). | 2442 // destination directory by AddEntryToDirectory(). |
2461 directory_service_->root()->AddEntry(entry); | 2443 directory_service_->root()->AddEntry(entry); |
2462 AddEntryToDirectory(dir_path, callback, GDATA_FILE_OK, entry->GetFilePath()); | 2444 AddEntryToDirectory(dir_path, callback, GDATA_FILE_OK, entry->GetFilePath()); |
2463 } | 2445 } |
2464 | 2446 |
2465 void GDataFileSystem::OnAddEntryToDirectoryCompleted( | 2447 void GDataFileSystem::OnAddEntryToDirectoryCompleted( |
2466 const FileOperationCallback& callback, | 2448 const FileOperationCallback& callback, |
2467 const FilePath& file_path, | 2449 const FilePath& file_path, |
2468 const FilePath& dir_path, | 2450 const FilePath& dir_path, |
2469 GDataErrorCode status, | 2451 GDataErrorCode status, |
2470 const GURL& document_url) { | 2452 const GURL& document_url) { |
2471 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2453 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2472 | 2454 |
2473 GDataFileError error = util::GDataToGDataFileError(status); | 2455 GDataFileError error = util::GDataToGDataFileError(status); |
2474 if (error == GDATA_FILE_OK) { | 2456 if (error == GDATA_FILE_OK) { |
2475 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); | 2457 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); |
2476 if (entry) { | 2458 if (entry) { |
2477 DCHECK_EQ(directory_service_->root(), entry->parent()); | 2459 DCHECK_EQ(directory_service_->root(), entry->parent()); |
2478 error = AddEntryToDirectoryOnFilesystem(entry, dir_path); | 2460 directory_service_->AddEntryToDirectory(dir_path, entry, |
2461 base::Bind( | |
2462 &GDataFileSystem::OnAddEntryToDirectoryWithFileOperationCallback, | |
2463 ui_weak_ptr_, | |
2464 callback)); | |
2465 return; | |
2479 } else { | 2466 } else { |
2480 error = GDATA_FILE_ERROR_NOT_FOUND; | 2467 error = GDATA_FILE_ERROR_NOT_FOUND; |
2481 } | 2468 } |
2482 } | 2469 } |
2483 | 2470 |
2484 if (!callback.is_null()) | 2471 if (!callback.is_null()) |
2485 callback.Run(error); | 2472 callback.Run(error); |
2486 } | 2473 } |
2487 | 2474 |
2488 void GDataFileSystem::OnRemoveEntryFromDirectoryCompleted( | |
2489 const FilePathUpdateCallback& callback, | |
2490 const FilePath& file_path, | |
2491 const FilePath& dir_path, | |
2492 GDataErrorCode status, | |
2493 const GURL& document_url) { | |
2494 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
2495 | |
2496 FilePath updated_file_path = file_path; | |
2497 GDataFileError error = util::GDataToGDataFileError(status); | |
2498 if (error == GDATA_FILE_OK) | |
2499 error = RemoveEntryFromDirectoryOnFilesystem(file_path, dir_path, | |
2500 &updated_file_path); | |
2501 | |
2502 if (!callback.is_null()) | |
2503 callback.Run(error, updated_file_path); | |
2504 } | |
2505 | |
2506 void GDataFileSystem::OnRemovedDocument( | 2475 void GDataFileSystem::OnRemovedDocument( |
2507 const FileOperationCallback& callback, | 2476 const FileOperationCallback& callback, |
2508 const FilePath& file_path, | 2477 const FilePath& file_path, |
2509 GDataErrorCode status, | 2478 GDataErrorCode status, |
2510 const GURL& document_url) { | 2479 const GURL& document_url) { |
2511 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2480 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2512 | 2481 |
2513 GDataFileError error = util::GDataToGDataFileError(status); | 2482 GDataFileError error = util::GDataToGDataFileError(status); |
2514 | 2483 |
2515 if (error == GDATA_FILE_OK) | 2484 if (error == GDATA_FILE_OK) |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2619 } | 2588 } |
2620 } | 2589 } |
2621 | 2590 |
2622 void GDataFileSystem::OnDownloadStoredToCache(GDataFileError error, | 2591 void GDataFileSystem::OnDownloadStoredToCache(GDataFileError error, |
2623 const std::string& resource_id, | 2592 const std::string& resource_id, |
2624 const std::string& md5) { | 2593 const std::string& md5) { |
2625 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2594 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2626 // Nothing much to do here for now. | 2595 // Nothing much to do here for now. |
2627 } | 2596 } |
2628 | 2597 |
2629 GDataFileError GDataFileSystem::RenameFileOnFilesystem( | 2598 void GDataFileSystem::RenameFileOnFileSystem( |
2630 const FilePath& file_path, | 2599 const FilePath& file_path, |
2631 const FilePath::StringType& new_name, | 2600 const FilePath::StringType& new_name, |
2632 FilePath* updated_file_path) { | 2601 const FilePathUpdateCallback& callback, |
2602 GDataErrorCode status, | |
2603 const GURL& document_url) { | |
2633 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2604 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2634 DCHECK(updated_file_path); | 2605 |
2606 const GDataFileError error = util::GDataToGDataFileError(status); | |
2607 if (error != GDATA_FILE_OK) { | |
2608 if (!callback.is_null()) | |
2609 callback.Run(error, FilePath()); | |
2610 return; | |
2611 } | |
2635 | 2612 |
2636 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); | 2613 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); |
2637 if (!entry) | 2614 if (!entry) { |
2638 return GDATA_FILE_ERROR_NOT_FOUND; | 2615 if (!callback.is_null()) |
2616 callback.Run(GDATA_FILE_ERROR_NOT_FOUND, FilePath()); | |
2617 return; | |
2618 } | |
2639 | 2619 |
2640 DCHECK(entry->parent()); | 2620 DCHECK(entry->parent()); |
2641 entry->set_title(new_name); | 2621 entry->set_title(new_name); |
2642 // After changing the title of the entry, call TakeFile() to remove the | 2622 // After changing the title of the entry, call AddEntryToDirectory() to remove |
2643 // entry from its parent directory and then add it back in order to go | 2623 // the entry from its parent directory and then add it back in order to go |
2644 // through the file name de-duplication. | 2624 // through the file name de-duplication. |
2645 // TODO(achuith/satorux/zel): This code is fragile. The title has been | 2625 // TODO(achuith/satorux/zel): This code is fragile. The title has been |
2646 // changed, but not the file_name. TakeEntry removes the child based on the | 2626 // changed, but not the file_name. AddEntryToDirectory calls RemoveChild to |
2647 // old file_name, and then re-adds the child by first assigning the new title | 2627 // remove the child based on the old file_name, and then re-adds the child by |
2648 // to file_name. http://crbug.com/30157 | 2628 // first assigning the new title to file_name. http://crbug.com/30157 |
2649 if (!entry->parent()->TakeEntry(entry)) | 2629 directory_service_->AddEntryToDirectory(entry->parent()->GetFilePath(), entry, |
satorux1
2012/08/08 23:25:01
nit: when it cannot fit one line, let's align para
achuithb
2012/08/09 00:12:51
Done.
| |
2650 return GDATA_FILE_ERROR_FAILED; | 2630 base::Bind(&GDataFileSystem::OnAddEntryToDirectoryWithFileUpdateCallback, |
2651 | 2631 ui_weak_ptr_, |
2652 *updated_file_path = entry->GetFilePath(); | 2632 callback)); |
2653 | |
2654 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | |
2655 OnDirectoryChanged(updated_file_path->DirName())); | |
2656 return GDATA_FILE_OK; | |
2657 } | 2633 } |
2658 | 2634 |
2659 GDataFileError GDataFileSystem::AddEntryToDirectoryOnFilesystem( | 2635 void GDataFileSystem::RemoveEntryFromDirectoryOnFileSystem( |
2660 GDataEntry* entry, const FilePath& dir_path) { | 2636 const FilePathUpdateCallback& callback, |
2637 const FilePath& file_path, | |
2638 const FilePath& dir_path, | |
2639 GDataErrorCode status, | |
2640 const GURL& document_url) { | |
2661 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2641 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2662 DCHECK(entry); | |
2663 | 2642 |
2664 GDataEntry* dir_entry = directory_service_->FindEntryByPathSync(dir_path); | 2643 const GDataFileError error = util::GDataToGDataFileError(status); |
2665 if (!dir_entry) | 2644 if (error != GDATA_FILE_OK) { |
2666 return GDATA_FILE_ERROR_NOT_FOUND; | 2645 if (!callback.is_null()) |
2646 callback.Run(error, FilePath()); | |
2647 return; | |
2648 } | |
2667 | 2649 |
2668 GDataDirectory* dir = dir_entry->AsGDataDirectory(); | 2650 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); |
2669 if (!dir) | 2651 if (!entry) { |
2670 return GDATA_FILE_ERROR_NOT_A_DIRECTORY; | 2652 if (!callback.is_null()) |
2653 callback.Run(GDATA_FILE_ERROR_NOT_FOUND, FilePath()); | |
2654 return; | |
2655 } | |
2671 | 2656 |
2672 if (!dir->TakeEntry(entry)) | 2657 directory_service_->AddEntryToDirectory( |
2673 return GDATA_FILE_ERROR_FAILED; | 2658 directory_service_->root()->GetFilePath(), entry, |
satorux1
2012/08/08 23:25:01
nit: move entry to the next line
achuithb
2012/08/09 00:12:51
Done.
| |
2674 | 2659 base::Bind(&GDataFileSystem::OnAddEntryToDirectoryWithFileUpdateCallback, |
2675 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 2660 ui_weak_ptr_, |
2676 OnDirectoryChanged(dir_path)); | 2661 callback)); |
2677 return GDATA_FILE_OK; | |
2678 } | 2662 } |
2679 | 2663 |
2680 GDataFileError GDataFileSystem::RemoveEntryFromDirectoryOnFilesystem( | 2664 void GDataFileSystem::OnAddEntryToDirectoryWithFileUpdateCallback( |
2681 const FilePath& file_path, const FilePath& dir_path, | 2665 const FilePathUpdateCallback& callback, |
2682 FilePath* updated_file_path) { | 2666 GDataFileError error, |
2683 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2667 const FilePath& updated_file_path) { |
2684 DCHECK(updated_file_path); | 2668 if (error == GDATA_FILE_OK) |
2669 OnDirectoryChanged(updated_file_path.DirName()); | |
2685 | 2670 |
2686 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); | 2671 if (!callback.is_null()) |
2687 if (!entry) | 2672 callback.Run(error, updated_file_path); |
2688 return GDATA_FILE_ERROR_NOT_FOUND; | 2673 } |
2689 | 2674 |
2690 GDataEntry* dir = directory_service_->FindEntryByPathSync(dir_path); | 2675 void GDataFileSystem::OnAddEntryToDirectoryWithFileOperationCallback( |
2691 if (!dir) | 2676 const FileOperationCallback& callback, |
2692 return GDATA_FILE_ERROR_NOT_FOUND; | 2677 GDataFileError error, |
2678 const FilePath& updated_file_path) { | |
2679 if (error == GDATA_FILE_OK) | |
2680 OnDirectoryChanged(updated_file_path.DirName()); | |
2693 | 2681 |
2694 if (!dir->AsGDataDirectory()) | 2682 if (!callback.is_null()) |
2695 return GDATA_FILE_ERROR_NOT_A_DIRECTORY; | 2683 callback.Run(error); |
2696 | |
2697 DCHECK_EQ(dir->AsGDataDirectory(), entry->parent()); | |
2698 | |
2699 if (!directory_service_->root()->TakeEntry(entry)) | |
2700 return GDATA_FILE_ERROR_FAILED; | |
2701 | |
2702 *updated_file_path = entry->GetFilePath(); | |
2703 | |
2704 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | |
2705 OnDirectoryChanged(updated_file_path->DirName())); | |
2706 return GDATA_FILE_OK; | |
2707 } | 2684 } |
2708 | 2685 |
2709 GDataFileError GDataFileSystem::RemoveEntryFromFileSystem( | 2686 GDataFileError GDataFileSystem::RemoveEntryFromFileSystem( |
2710 const FilePath& file_path) { | 2687 const FilePath& file_path) { |
2711 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2688 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2712 | 2689 |
2713 std::string resource_id; | 2690 std::string resource_id; |
2714 GDataFileError error = RemoveEntryFromGData(file_path, &resource_id); | 2691 GDataFileError error = RemoveEntryFromGData(file_path, &resource_id); |
2715 if (error != GDATA_FILE_OK) | 2692 if (error != GDATA_FILE_OK) |
2716 return error; | 2693 return error; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2787 return GDATA_FILE_ERROR_FAILED; | 2764 return GDATA_FILE_ERROR_FAILED; |
2788 | 2765 |
2789 // Check if parent is a directory since in theory since this is a callback | 2766 // Check if parent is a directory since in theory since this is a callback |
2790 // something could in the meantime have nuked the parent dir and created a | 2767 // something could in the meantime have nuked the parent dir and created a |
2791 // file with the exact same name. | 2768 // file with the exact same name. |
2792 GDataDirectory* parent_dir = entry->AsGDataDirectory(); | 2769 GDataDirectory* parent_dir = entry->AsGDataDirectory(); |
2793 if (!parent_dir) | 2770 if (!parent_dir) |
2794 return GDATA_FILE_ERROR_FAILED; | 2771 return GDATA_FILE_ERROR_FAILED; |
2795 | 2772 |
2796 GDataEntry* new_entry = GDataEntry::FromDocumentEntry( | 2773 GDataEntry* new_entry = GDataEntry::FromDocumentEntry( |
2797 parent_dir, doc_entry.get(), directory_service_.get()); | 2774 NULL, doc_entry.get(), directory_service_.get()); |
2798 if (!new_entry) | 2775 if (!new_entry) |
2799 return GDATA_FILE_ERROR_FAILED; | 2776 return GDATA_FILE_ERROR_FAILED; |
2800 | 2777 |
2801 parent_dir->AddEntry(new_entry); | 2778 parent_dir->AddEntry(new_entry); |
2802 | 2779 |
2803 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 2780 OnDirectoryChanged(directory_path); |
2804 OnDirectoryChanged(directory_path)); | |
2805 return GDATA_FILE_OK; | 2781 return GDATA_FILE_OK; |
2806 } | 2782 } |
2807 | 2783 |
2808 GDataFileSystem::FindMissingDirectoryResult | 2784 GDataFileSystem::FindMissingDirectoryResult |
2809 GDataFileSystem::FindFirstMissingParentDirectory( | 2785 GDataFileSystem::FindFirstMissingParentDirectory( |
2810 const FilePath& directory_path, | 2786 const FilePath& directory_path, |
2811 GURL* last_dir_content_url, | 2787 GURL* last_dir_content_url, |
2812 FilePath* first_missing_parent_path) { | 2788 FilePath* first_missing_parent_path) { |
2813 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2789 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2814 | 2790 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2855 return GDATA_FILE_ERROR_ACCESS_DENIED; | 2831 return GDATA_FILE_ERROR_ACCESS_DENIED; |
2856 | 2832 |
2857 // If it's a file (only files have resource id), get its resource id so that | 2833 // If it's a file (only files have resource id), get its resource id so that |
2858 // we can remove it after releasing the auto lock. | 2834 // we can remove it after releasing the auto lock. |
2859 if (entry->AsGDataFile()) | 2835 if (entry->AsGDataFile()) |
2860 *resource_id = entry->AsGDataFile()->resource_id(); | 2836 *resource_id = entry->AsGDataFile()->resource_id(); |
2861 | 2837 |
2862 GDataDirectory* parent_dir = entry->parent(); | 2838 GDataDirectory* parent_dir = entry->parent(); |
2863 parent_dir->RemoveEntry(entry); | 2839 parent_dir->RemoveEntry(entry); |
2864 | 2840 |
2865 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 2841 OnDirectoryChanged(parent_dir->GetFilePath()); |
2866 OnDirectoryChanged(parent_dir->GetFilePath())); | |
2867 return GDATA_FILE_OK; | 2842 return GDATA_FILE_OK; |
2868 } | 2843 } |
2869 | 2844 |
2870 void GDataFileSystem::AddUploadedFile( | 2845 void GDataFileSystem::AddUploadedFile( |
2871 UploadMode upload_mode, | 2846 UploadMode upload_mode, |
2872 const FilePath& virtual_dir_path, | 2847 const FilePath& virtual_dir_path, |
2873 scoped_ptr<DocumentEntry> entry, | 2848 scoped_ptr<DocumentEntry> entry, |
2874 const FilePath& file_content_path, | 2849 const FilePath& file_content_path, |
2875 GDataCache::FileOperationType cache_operation, | 2850 GDataCache::FileOperationType cache_operation, |
2876 const base::Closure& callback) { | 2851 const base::Closure& callback) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2912 virtual_dir_path); | 2887 virtual_dir_path); |
2913 if (!dir_entry) | 2888 if (!dir_entry) |
2914 return; | 2889 return; |
2915 | 2890 |
2916 GDataDirectory* parent_dir = dir_entry->AsGDataDirectory(); | 2891 GDataDirectory* parent_dir = dir_entry->AsGDataDirectory(); |
2917 if (!parent_dir) | 2892 if (!parent_dir) |
2918 return; | 2893 return; |
2919 | 2894 |
2920 scoped_ptr<GDataEntry> new_entry( | 2895 scoped_ptr<GDataEntry> new_entry( |
2921 GDataEntry::FromDocumentEntry( | 2896 GDataEntry::FromDocumentEntry( |
2922 parent_dir, entry.get(), directory_service_.get())); | 2897 NULL, entry.get(), directory_service_.get())); |
2923 if (!new_entry.get()) | 2898 if (!new_entry.get()) |
2924 return; | 2899 return; |
2925 | 2900 |
2926 if (upload_mode == UPLOAD_EXISTING_FILE) { | 2901 if (upload_mode == UPLOAD_EXISTING_FILE) { |
2927 // Remove an existing entry, which should be present. | 2902 // Remove an existing entry, which should be present. |
2928 const std::string& resource_id = new_entry->resource_id(); | 2903 const std::string& resource_id = new_entry->resource_id(); |
2929 directory_service_->GetEntryByResourceIdAsync(resource_id, | 2904 directory_service_->GetEntryByResourceIdAsync(resource_id, |
2930 base::Bind(&RemoveStaleEntryOnUpload, resource_id, parent_dir)); | 2905 base::Bind(&RemoveStaleEntryOnUpload, resource_id, parent_dir)); |
2931 } | 2906 } |
2932 | 2907 |
2933 GDataFile* file = new_entry->AsGDataFile(); | 2908 GDataFile* file = new_entry->AsGDataFile(); |
2934 DCHECK(file); | 2909 DCHECK(file); |
2935 const std::string& resource_id = file->resource_id(); | 2910 const std::string& resource_id = file->resource_id(); |
2936 const std::string& md5 = file->file_md5(); | 2911 const std::string& md5 = file->file_md5(); |
2937 parent_dir->AddEntry(new_entry.release()); | 2912 parent_dir->AddEntry(new_entry.release()); |
2938 | 2913 |
2939 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 2914 OnDirectoryChanged(virtual_dir_path); |
2940 OnDirectoryChanged(virtual_dir_path)); | |
2941 | 2915 |
2942 if (upload_mode == UPLOAD_NEW_FILE) { | 2916 if (upload_mode == UPLOAD_NEW_FILE) { |
2943 // Add the file to the cache if we have uploaded a new file. | 2917 // Add the file to the cache if we have uploaded a new file. |
2944 cache_->StoreOnUIThread(resource_id, | 2918 cache_->StoreOnUIThread(resource_id, |
2945 md5, | 2919 md5, |
2946 file_content_path, | 2920 file_content_path, |
2947 cache_operation, | 2921 cache_operation, |
2948 base::Bind(&OnCacheUpdatedForAddUploadedFile, | 2922 base::Bind(&OnCacheUpdatedForAddUploadedFile, |
2949 callback_runner.Release())); | 2923 callback_runner.Release())); |
2950 } else if (upload_mode == UPLOAD_EXISTING_FILE) { | 2924 } else if (upload_mode == UPLOAD_EXISTING_FILE) { |
(...skipping 10 matching lines...) Expand all Loading... | |
2961 void GDataFileSystem::Observe(int type, | 2935 void GDataFileSystem::Observe(int type, |
2962 const content::NotificationSource& source, | 2936 const content::NotificationSource& source, |
2963 const content::NotificationDetails& details) { | 2937 const content::NotificationDetails& details) { |
2964 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2938 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2965 | 2939 |
2966 if (type == chrome::NOTIFICATION_PREF_CHANGED) { | 2940 if (type == chrome::NOTIFICATION_PREF_CHANGED) { |
2967 std::string* pref_name = content::Details<std::string>(details).ptr(); | 2941 std::string* pref_name = content::Details<std::string>(details).ptr(); |
2968 if (*pref_name == prefs::kDisableGDataHostedFiles) { | 2942 if (*pref_name == prefs::kDisableGDataHostedFiles) { |
2969 const FilePath root_path = directory_service_->root()->GetFilePath(); | 2943 const FilePath root_path = directory_service_->root()->GetFilePath(); |
2970 // Kick off directory refresh when this setting changes. | 2944 // Kick off directory refresh when this setting changes. |
2971 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 2945 OnDirectoryChanged(root_path); |
2972 OnDirectoryChanged(root_path)); | |
2973 } | 2946 } |
2974 } else { | 2947 } else { |
2975 NOTREACHED(); | 2948 NOTREACHED(); |
2976 } | 2949 } |
2977 } | 2950 } |
2978 | 2951 |
2979 //============= GDataFileSystem: internal helper functions ===================== | 2952 //============= GDataFileSystem: internal helper functions ===================== |
2980 | 2953 |
2981 void GDataFileSystem::InitializePreferenceObserver() { | 2954 void GDataFileSystem::InitializePreferenceObserver() { |
2982 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2955 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3405 } | 3378 } |
3406 | 3379 |
3407 PlatformFileInfoProto entry_file_info; | 3380 PlatformFileInfoProto entry_file_info; |
3408 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); | 3381 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); |
3409 *entry_proto->mutable_file_info() = entry_file_info; | 3382 *entry_proto->mutable_file_info() = entry_file_info; |
3410 if (!callback.is_null()) | 3383 if (!callback.is_null()) |
3411 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); | 3384 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); |
3412 } | 3385 } |
3413 | 3386 |
3414 } // namespace gdata | 3387 } // namespace gdata |
OLD | NEW |