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