uninstall_app_task.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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    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    callback.Run(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