1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/engine/clear_data_command.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string>
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/engine/syncer.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/engine/syncer_proto_util.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/engine/syncproto.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/sessions/sync_session.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/syncable/directory_manager.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing syncable::ScopedDirLookup;
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace browser_sync {
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing sessions::StatusController;
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing sessions::SyncSession;
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing std::string;
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing syncable::FIRST_REAL_MODEL_TYPE;
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing syncable::MODEL_TYPE_COUNT;
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenClearDataCommand::ClearDataCommand() {}
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenClearDataCommand::~ClearDataCommand() {}
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ClearDataCommand::ExecuteImpl(SyncSession* session) {
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ClientToServerMessage client_to_server_message;
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ClientToServerResponse client_to_server_response;
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  client_to_server_message.set_share(session->context()->account_name());
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  client_to_server_message.set_message_contents(
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ClientToServerMessage::CLEAR_DATA);
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  client_to_server_message.mutable_clear_user_data();
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ScopedDirLookup dir(session->context()->directory_manager(),
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      session->context()->account_name());
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!dir.good()) {
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(ERROR) << "Scoped dir lookup failed!";
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SyncerProtoUtil::AddRequestBirthday(dir, &client_to_server_message);
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Clearing server data";
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool ok = SyncerProtoUtil::PostClientToServerMessage(
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      client_to_server_message,
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &client_to_server_response,
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      session);
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DVLOG(1) << SyncerProtoUtil::ClientToServerResponseDebugString(
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      client_to_server_response);
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Clear pending indicates that the server has received our clear message
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!ok || !client_to_server_response.has_error_code() ||
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      client_to_server_response.error_code() !=
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      sync_pb::ClientToServerResponse::SUCCESS) {
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // On failure, subsequent requests to the server will cause it to attempt
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // to resume the clear.  The client will handle disabling of sync in
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // response to a store birthday error from the server.
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SyncEngineEvent event(SyncEngineEvent::CLEAR_SERVER_DATA_FAILED);
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    session->context()->NotifyListeners(event);
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(ERROR) << "Error posting ClearData.";
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SyncEngineEvent event(SyncEngineEvent::CLEAR_SERVER_DATA_SUCCEEDED);
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  session->context()->NotifyListeners(event);
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  session->delegate()->OnShouldStopSyncingPermanently();
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "ClearData succeeded.";
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace browser_sync
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
83