8dc86a6329df33e77a6e75b6a4fc8fb1f0a39331
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / drive_backend / uninstall_app_task.cc
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
21 namespace sync_file_system {
22 namespace drive_backend {
23
24 UninstallAppTask::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
34 UninstallAppTask::~UninstallAppTask() {
35 }
36
37 void 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
77 void 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
90 bool UninstallAppTask::IsContextReady() {
91   return sync_context_->GetMetadataDatabase() &&
92       sync_context_->GetDriveService();
93 }
94
95 MetadataDatabase* UninstallAppTask::metadata_database() {
96   return sync_context_->GetMetadataDatabase();
97 }
98
99 drive::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