Index: chrome/browser/chromeos/drive/sync_client.cc |
diff --git a/chrome/browser/chromeos/drive/sync_client.cc b/chrome/browser/chromeos/drive/sync_client.cc |
index f2bd3c869d6fd495a21eeac017f0d8794d00c1bb..aa3e7aa4cd7a1510af5ecf24933c1698c74250f2 100644 |
--- a/chrome/browser/chromeos/drive/sync_client.cc |
+++ b/chrome/browser/chromeos/drive/sync_client.cc |
@@ -13,6 +13,7 @@ |
#include "chrome/browser/chromeos/drive/file_system/download_operation.h" |
#include "chrome/browser/chromeos/drive/file_system/update_operation.h" |
#include "chrome/browser/chromeos/drive/file_system_util.h" |
+#include "chrome/browser/chromeos/drive/sync/remove_performer.h" |
#include "chrome/browser/google_apis/task_util.h" |
#include "content/public/browser/browser_thread.h" |
@@ -42,24 +43,34 @@ const int kDelaySeconds = 5; |
// The delay constant is used to delay retrying a sync task on server errors. |
const int kLongDelaySeconds = 600; |
-// Iterates cache entries and appends IDs to |to_fetch| if the file is pinned |
-// but not fetched (not present locally), or to |to_upload| if the file is dirty |
-// but not uploaded. |
-void CollectBacklog(FileCache* cache, |
+// Iterates entries and appends IDs to |to_fetch| if the file is pinned but not |
+// fetched (not present locally), to |to_upload| if the file is dirty but not |
+// uploaded, or to |to_remove| if the entry is in the trash. |
+void CollectBacklog(ResourceMetadata* metadata, |
std::vector<std::string>* to_fetch, |
- std::vector<std::string>* to_upload) { |
+ std::vector<std::string>* to_upload, |
+ std::vector<std::string>* to_remove) { |
DCHECK(to_fetch); |
DCHECK(to_upload); |
+ DCHECK(to_remove); |
- scoped_ptr<FileCache::Iterator> it = cache->GetIterator(); |
+ scoped_ptr<ResourceMetadata::Iterator> it = metadata->GetIterator(); |
for (; !it->IsAtEnd(); it->Advance()) { |
- const FileCacheEntry& cache_entry = it->GetValue(); |
const std::string& local_id = it->GetID(); |
- if (cache_entry.is_pinned() && !cache_entry.is_present()) |
- to_fetch->push_back(local_id); |
+ const ResourceEntry& entry = it->GetValue(); |
+ if (entry.parent_local_id() == util::kDriveTrashDirLocalId) { |
+ to_remove->push_back(local_id); |
+ continue; |
+ } |
- if (cache_entry.is_dirty()) |
- to_upload->push_back(local_id); |
+ FileCacheEntry cache_entry; |
+ if (it->GetCacheEntry(&cache_entry)) { |
+ if (cache_entry.is_pinned() && !cache_entry.is_present()) |
+ to_fetch->push_back(local_id); |
+ |
+ if (cache_entry.is_dirty()) |
+ to_upload->push_back(local_id); |
+ } |
} |
DCHECK(!it->HasError()); |
} |
@@ -129,6 +140,9 @@ SyncClient::SyncClient(base::SequencedTaskRunner* blocking_task_runner, |
scheduler, |
metadata, |
cache)), |
+ remove_performer_(new RemovePerformer(blocking_task_runner, |
+ scheduler, |
+ metadata)), |
delay_(base::TimeDelta::FromSeconds(kDelaySeconds)), |
long_delay_(base::TimeDelta::FromSeconds(kLongDelaySeconds)), |
weak_ptr_factory_(this) { |
@@ -144,13 +158,15 @@ void SyncClient::StartProcessingBacklog() { |
std::vector<std::string>* to_fetch = new std::vector<std::string>; |
std::vector<std::string>* to_upload = new std::vector<std::string>; |
+ std::vector<std::string>* to_remove = new std::vector<std::string>; |
blocking_task_runner_->PostTaskAndReply( |
FROM_HERE, |
- base::Bind(&CollectBacklog, cache_, to_fetch, to_upload), |
+ base::Bind(&CollectBacklog, metadata_, to_fetch, to_upload, to_remove), |
base::Bind(&SyncClient::OnGetLocalIdsOfBacklog, |
weak_ptr_factory_.GetWeakPtr(), |
base::Owned(to_fetch), |
- base::Owned(to_upload))); |
+ base::Owned(to_upload), |
+ base::Owned(to_remove))); |
} |
void SyncClient::StartCheckingExistingPinnedFiles() { |
@@ -188,6 +204,16 @@ void SyncClient::AddUploadTask(const ClientContext& context, |
AddTaskToQueue(UPLOAD, context, local_id, delay_); |
} |
+void SyncClient::AddRemoveTask(const std::string& local_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ DVLOG(1) << "Removing " << local_id; |
+ remove_performer_->Remove(local_id, |
+ base::Bind(&SyncClient::OnRemoveComplete, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ local_id)); |
+} |
+ |
void SyncClient::AddTaskToQueue(SyncType type, |
const ClientContext& context, |
const std::string& local_id, |
@@ -268,7 +294,8 @@ void SyncClient::StartTask(SyncType type, |
void SyncClient::OnGetLocalIdsOfBacklog( |
const std::vector<std::string>* to_fetch, |
- const std::vector<std::string>* to_upload) { |
+ const std::vector<std::string>* to_upload, |
+ const std::vector<std::string>* to_remove) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
// Give priority to upload tasks over fetch tasks, so that dirty files are |
@@ -284,6 +311,12 @@ void SyncClient::OnGetLocalIdsOfBacklog( |
DVLOG(1) << "Queuing to fetch: " << local_id; |
AddTaskToQueue(FETCH, ClientContext(BACKGROUND), local_id, delay_); |
} |
+ |
+ for (size_t i = 0; i < to_remove->size(); ++i) { |
+ const std::string& local_id = (*to_remove)[i]; |
+ DVLOG(1) << "Queuing to remove: " << local_id; |
+ AddRemoveTask(local_id); |
+ } |
} |
void SyncClient::AddFetchTasks(const std::vector<std::string>* local_ids) { |
@@ -353,5 +386,33 @@ void SyncClient::OnUploadFileComplete(const std::string& local_id, |
} |
} |
+void SyncClient::OnRemoveComplete(const std::string& local_id, |
+ FileError error) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ if (error == FILE_ERROR_OK) { |
+ DVLOG(1) << "Removed " << local_id; |
+ } else { |
+ switch (error) { |
+ case FILE_ERROR_NO_CONNECTION: |
+ // Re-queue the task so that we'll retry once the connection is back. |
+ AddRemoveTask(local_id); |
+ break; |
+ case FILE_ERROR_SERVICE_UNAVAILABLE: |
+ // Re-queue the task so that we'll retry once the service is back. |
+ base::MessageLoopProxy::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&SyncClient::AddRemoveTask, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ local_id), |
+ long_delay_); |
+ break; |
+ default: |
+ LOG(WARNING) << "Failed to remove " << local_id << ": " |
+ << FileErrorToString(error); |
+ } |
+ } |
+} |
+ |
} // namespace internal |
} // namespace drive |