uninstall_app_task.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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::RunSequential(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 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