- add sources.
[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/google_apis/drive_api_parser.h"
12 #include "chrome/browser/google_apis/gdata_wapi_parser.h"
13 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
14 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
15 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
16 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h"
17 #include "chrome/browser/sync_file_system/drive_backend/tracker_set.h"
18 #include "chrome/browser/sync_file_system/syncable_file_system_util.h"
19
20 namespace sync_file_system {
21 namespace drive_backend {
22
23 UninstallAppTask::UninstallAppTask(SyncEngineContext* sync_context,
24                                    const std::string& app_id,
25                                    UninstallFlag uninstall_flag)
26     : sync_context_(sync_context),
27       app_id_(app_id),
28       uninstall_flag_(uninstall_flag),
29       app_root_tracker_id_(0),
30       weak_ptr_factory_(this) {
31 }
32
33 UninstallAppTask::~UninstallAppTask() {
34 }
35
36 void UninstallAppTask::Run(const SyncStatusCallback& callback) {
37   if (!metadata_database() || !drive_service()) {
38     RunSoon(FROM_HERE, base::Bind(callback, SYNC_STATUS_FAILED));
39     return;
40   }
41
42   if (uninstall_flag_ == RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE) {
43     metadata_database()->UnregisterApp(app_id_, callback);
44     return;
45   }
46   DCHECK_EQ(RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, uninstall_flag_);
47
48   int64 sync_root_tracker_id = metadata_database()->GetSyncRootTrackerID();
49   TrackerSet trackers;
50   if (!metadata_database()->FindTrackersByParentAndTitle(
51           sync_root_tracker_id, app_id_, &trackers) ||
52       !trackers.has_active()) {
53     RunSoon(FROM_HERE, base::Bind(callback, SYNC_STATUS_OK));
54     return;
55   }
56
57   FileTracker* app_root_tracker = trackers.active_tracker();
58   app_root_tracker_id_ = app_root_tracker->tracker_id();
59   DCHECK(app_root_tracker->has_synced_details());
60
61   drive_service()->DeleteResource(
62       app_root_tracker->file_id(),
63       std::string(),  // etag
64       base::Bind(&UninstallAppTask::DidDeleteAppRoot,
65                  weak_ptr_factory_.GetWeakPtr(),
66                  callback,
67                  metadata_database()->GetLargestChangeID()));
68 }
69
70 void UninstallAppTask::DidDeleteAppRoot(const SyncStatusCallback& callback,
71                                         int64 change_id,
72                                         google_apis::GDataErrorCode error) {
73   if (error != google_apis::HTTP_SUCCESS &&
74       error != google_apis::HTTP_NOT_FOUND) {
75     callback.Run(SYNC_STATUS_FAILED);
76     return;
77   }
78
79   metadata_database()->UnregisterApp(app_id_, callback);
80 }
81
82 MetadataDatabase* UninstallAppTask::metadata_database() {
83   return sync_context_->GetMetadataDatabase();
84 }
85
86 drive::DriveServiceInterface* UninstallAppTask::drive_service() {
87   return sync_context_->GetDriveService();
88 }
89
90 }  // namespace drive_backend
91 }  // namespace sync_file_system