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.
5 #include "chrome/browser/sync_file_system/drive_backend/uninstall_app_task.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"
21 namespace sync_file_system
{
22 namespace drive_backend
{
24 UninstallAppTask::UninstallAppTask(SyncEngineContext
* sync_context
,
25 const std::string
& app_id
,
26 UninstallFlag uninstall_flag
)
27 : sync_context_(sync_context
),
29 uninstall_flag_(uninstall_flag
),
30 app_root_tracker_id_(0),
31 weak_ptr_factory_(this) {
34 UninstallAppTask::~UninstallAppTask() {
37 void UninstallAppTask::RunExclusive(const SyncStatusCallback
& callback
) {
38 if (!IsContextReady()) {
39 callback
.Run(SYNC_STATUS_FAILED
);
43 if (uninstall_flag_
== RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE
) {
44 SyncStatusCode status
= metadata_database()->UnregisterApp(app_id_
);
48 DCHECK_EQ(RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE
, uninstall_flag_
);
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
);
59 FileTracker app_root_tracker
;
60 if (!metadata_database()->FindTrackerByTrackerID(
61 trackers
.active_tracker(), &app_root_tracker
)) {
63 callback
.Run(SYNC_STATUS_FAILED
);
66 app_root_tracker_id_
= app_root_tracker
.tracker_id();
67 DCHECK(app_root_tracker
.has_synced_details());
69 drive_service()->DeleteResource(
70 app_root_tracker
.file_id(),
71 std::string(), // etag
72 base::Bind(&UninstallAppTask::DidDeleteAppRoot
,
73 weak_ptr_factory_
.GetWeakPtr(),
75 metadata_database()->GetLargestKnownChangeID()));
78 void UninstallAppTask::DidDeleteAppRoot(const SyncStatusCallback
& callback
,
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
);
88 status
= metadata_database()->UnregisterApp(app_id_
);
92 bool UninstallAppTask::IsContextReady() {
93 return sync_context_
->GetMetadataDatabase() &&
94 sync_context_
->GetDriveService();
97 MetadataDatabase
* UninstallAppTask::metadata_database() {
98 return sync_context_
->GetMetadataDatabase();
101 drive::DriveServiceInterface
* UninstallAppTask::drive_service() {
102 set_used_network(true);
103 return sync_context_
->GetDriveService();
106 } // namespace drive_backend
107 } // namespace sync_file_system