uninstall_app_task.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/uninstall_app_task.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/drive/drive_api_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/drive/drive_service_interface.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/tracker_id_set.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync_file_system/syncable_file_system_util.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/drive/drive_api_parser.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/drive/gdata_wapi_parser.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_file_system { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace drive_backend { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UninstallAppTask::UninstallAppTask(SyncEngineContext* sync_context, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& app_id, 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UninstallFlag uninstall_flag) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : sync_context_(sync_context), 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_id_(app_id), 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uninstall_flag_(uninstall_flag), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_root_tracker_id_(0), 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_(this) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UninstallAppTask::~UninstallAppTask() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UninstallAppTask::RunExclusive(const SyncStatusCallback& callback) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsContextReady()) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunSoon(FROM_HERE, base::Bind(callback, SYNC_STATUS_FAILED)); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uninstall_flag_ == RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata_database()->UnregisterApp(app_id_, callback); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_EQ(RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, uninstall_flag_); 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int64 sync_root_tracker_id = metadata_database()->GetSyncRootTrackerID(); 50 TrackerIDSet trackers; 51 if (!metadata_database()->FindTrackersByParentAndTitle( 52 sync_root_tracker_id, app_id_, &trackers) || 53 !trackers.has_active()) { 54 RunSoon(FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); 55 return; 56 } 57 58 FileTracker app_root_tracker; 59 if (!metadata_database()->FindTrackerByTrackerID( 60 trackers.active_tracker(), &app_root_tracker)) { 61 NOTREACHED(); 62 callback.Run(SYNC_STATUS_FAILED); 63 return; 64 } 65 app_root_tracker_id_ = app_root_tracker.tracker_id(); 66 DCHECK(app_root_tracker.has_synced_details()); 67 68 drive_service()->DeleteResource( 69 app_root_tracker.file_id(), 70 std::string(), // etag 71 base::Bind(&UninstallAppTask::DidDeleteAppRoot, 72 weak_ptr_factory_.GetWeakPtr(), 73 callback, 74 metadata_database()->GetLargestKnownChangeID())); 75} 76 77void UninstallAppTask::DidDeleteAppRoot(const SyncStatusCallback& callback, 78 int64 change_id, 79 google_apis::GDataErrorCode error) { 80 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); 81 if (status != SYNC_STATUS_OK && 82 error != google_apis::HTTP_NOT_FOUND) { 83 callback.Run(SYNC_STATUS_FAILED); 84 return; 85 } 86 87 metadata_database()->UnregisterApp(app_id_, callback); 88} 89 90bool UninstallAppTask::IsContextReady() { 91 return sync_context_->GetMetadataDatabase() && 92 sync_context_->GetDriveService(); 93} 94 95MetadataDatabase* UninstallAppTask::metadata_database() { 96 return sync_context_->GetMetadataDatabase(); 97} 98 99drive::DriveServiceInterface* UninstallAppTask::drive_service() { 100 set_used_network(true); 101 return sync_context_->GetDriveService(); 102} 103 104} // namespace drive_backend 105} // namespace sync_file_system 106