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