uninstall_app_task.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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 3// found in the LICENSE file. 4 5#include "chrome/browser/sync_file_system/drive_backend/uninstall_app_task.h" 6 7#include "base/bind.h" 8#include "base/location.h" 9#include "chrome/browser/drive/drive_api_util.h" 10#include "chrome/browser/drive/drive_service_interface.h" 11#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h" 12#include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" 13#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" 14#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" 15#include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" 16#include "chrome/browser/sync_file_system/drive_backend/tracker_id_set.h" 17#include "chrome/browser/sync_file_system/syncable_file_system_util.h" 18#include "google_apis/drive/drive_api_parser.h" 19#include "google_apis/drive/gdata_wapi_parser.h" 20 21namespace sync_file_system { 22namespace drive_backend { 23 24UninstallAppTask::UninstallAppTask(SyncEngineContext* sync_context, 25 const std::string& app_id, 26 UninstallFlag uninstall_flag) 27 : sync_context_(sync_context), 28 app_id_(app_id), 29 uninstall_flag_(uninstall_flag), 30 app_root_tracker_id_(0), 31 weak_ptr_factory_(this) { 32} 33 34UninstallAppTask::~UninstallAppTask() { 35} 36 37void UninstallAppTask::RunExclusive(const SyncStatusCallback& callback) { 38 if (!IsContextReady()) { 39 callback.Run(SYNC_STATUS_FAILED); 40 return; 41 } 42 43 if (uninstall_flag_ == RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE) { 44 SyncStatusCode status = metadata_database()->UnregisterApp(app_id_); 45 callback.Run(status); 46 return; 47 } 48 DCHECK_EQ(RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, uninstall_flag_); 49 50 int64 sync_root_tracker_id = metadata_database()->GetSyncRootTrackerID(); 51 TrackerIDSet trackers; 52 if (!metadata_database()->FindTrackersByParentAndTitle( 53 sync_root_tracker_id, app_id_, &trackers) || 54 !trackers.has_active()) { 55 callback.Run(SYNC_STATUS_OK); 56 return; 57 } 58 59 FileTracker app_root_tracker; 60 if (!metadata_database()->FindTrackerByTrackerID( 61 trackers.active_tracker(), &app_root_tracker)) { 62 NOTREACHED(); 63 callback.Run(SYNC_STATUS_FAILED); 64 return; 65 } 66 app_root_tracker_id_ = app_root_tracker.tracker_id(); 67 DCHECK(app_root_tracker.has_synced_details()); 68 69 drive_service()->DeleteResource( 70 app_root_tracker.file_id(), 71 std::string(), // etag 72 base::Bind(&UninstallAppTask::DidDeleteAppRoot, 73 weak_ptr_factory_.GetWeakPtr(), 74 callback, 75 metadata_database()->GetLargestKnownChangeID())); 76} 77 78void UninstallAppTask::DidDeleteAppRoot(const SyncStatusCallback& callback, 79 int64 change_id, 80 google_apis::GDataErrorCode error) { 81 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); 82 if (status != SYNC_STATUS_OK && 83 error != google_apis::HTTP_NOT_FOUND) { 84 callback.Run(SYNC_STATUS_FAILED); 85 return; 86 } 87 88 status = metadata_database()->UnregisterApp(app_id_); 89 callback.Run(status); 90} 91 92bool UninstallAppTask::IsContextReady() { 93 return sync_context_->GetMetadataDatabase() && 94 sync_context_->GetDriveService(); 95} 96 97MetadataDatabase* UninstallAppTask::metadata_database() { 98 return sync_context_->GetMetadataDatabase(); 99} 100 101drive::DriveServiceInterface* UninstallAppTask::drive_service() { 102 set_used_network(true); 103 return sync_context_->GetDriveService(); 104} 105 106} // namespace drive_backend 107} // namespace sync_file_system 108