uninstall_app_task.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_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::Run(const SyncStatusCallback& callback) { 38 if (!IsContextReady()) { 39 RunSoon(FROM_HERE, base::Bind(callback, SYNC_STATUS_FAILED)); 40 return; 41 } 42 43 if (uninstall_flag_ == RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE) { 44 metadata_database()->UnregisterApp(app_id_, callback); 45 return; 46 } 47 DCHECK_EQ(RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, uninstall_flag_); 48 49 int64 sync_root_tracker_id = metadata_database()->GetSyncRootTrackerID(); 50 TrackerSet 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 = trackers.active_tracker(); 59 app_root_tracker_id_ = app_root_tracker->tracker_id(); 60 DCHECK(app_root_tracker->has_synced_details()); 61 62 drive_service()->DeleteResource( 63 app_root_tracker->file_id(), 64 std::string(), // etag 65 base::Bind(&UninstallAppTask::DidDeleteAppRoot, 66 weak_ptr_factory_.GetWeakPtr(), 67 callback, 68 metadata_database()->GetLargestKnownChangeID())); 69} 70 71void UninstallAppTask::DidDeleteAppRoot(const SyncStatusCallback& callback, 72 int64 change_id, 73 google_apis::GDataErrorCode error) { 74 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); 75 if (status != SYNC_STATUS_OK && 76 error != google_apis::HTTP_NOT_FOUND) { 77 callback.Run(SYNC_STATUS_FAILED); 78 return; 79 } 80 81 metadata_database()->UnregisterApp(app_id_, callback); 82} 83 84bool UninstallAppTask::IsContextReady() { 85 return sync_context_->GetMetadataDatabase() && 86 sync_context_->GetDriveService(); 87} 88 89MetadataDatabase* UninstallAppTask::metadata_database() { 90 return sync_context_->GetMetadataDatabase(); 91} 92 93drive::DriveServiceInterface* UninstallAppTask::drive_service() { 94 set_used_network(true); 95 return sync_context_->GetDriveService(); 96} 97 98} // namespace drive_backend 99} // namespace sync_file_system 100