1// Copyright (c) 2012 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 "sync/internal_api/js_sync_manager_observer.h"
6
7#include <cstddef>
8
9#include "base/location.h"
10#include "base/logging.h"
11#include "base/strings/string_number_conversions.h"
12#include "base/values.h"
13#include "sync/internal_api/public/base/model_type.h"
14#include "sync/internal_api/public/change_record.h"
15#include "sync/internal_api/public/sessions/sync_session_snapshot.h"
16#include "sync/internal_api/public/util/sync_string_conversions.h"
17#include "sync/js/js_event_details.h"
18#include "sync/js/js_event_handler.h"
19
20namespace syncer {
21
22JsSyncManagerObserver::JsSyncManagerObserver() {}
23
24JsSyncManagerObserver::~JsSyncManagerObserver() {}
25
26void JsSyncManagerObserver::SetJsEventHandler(
27    const WeakHandle<JsEventHandler>& event_handler) {
28  event_handler_ = event_handler;
29}
30
31void JsSyncManagerObserver::OnSyncCycleCompleted(
32    const sessions::SyncSessionSnapshot& snapshot) {
33  if (!event_handler_.IsInitialized()) {
34    return;
35  }
36  base::DictionaryValue details;
37  details.Set("snapshot", snapshot.ToValue());
38  HandleJsEvent(FROM_HERE, "onSyncCycleCompleted", JsEventDetails(&details));
39}
40
41void JsSyncManagerObserver::OnConnectionStatusChange(ConnectionStatus status) {
42  if (!event_handler_.IsInitialized()) {
43    return;
44  }
45  base::DictionaryValue details;
46  details.SetString("status", ConnectionStatusToString(status));
47  HandleJsEvent(FROM_HERE,
48                "onConnectionStatusChange", JsEventDetails(&details));
49}
50
51void JsSyncManagerObserver::OnActionableError(
52    const SyncProtocolError& sync_error) {
53  if (!event_handler_.IsInitialized()) {
54    return;
55  }
56  base::DictionaryValue details;
57  details.Set("syncError",  sync_error.ToValue());
58  HandleJsEvent(FROM_HERE, "onActionableError",
59                JsEventDetails(&details));
60}
61
62void JsSyncManagerObserver::OnProtocolEvent(
63    const ProtocolEvent& event) { }
64
65void JsSyncManagerObserver::OnMigrationRequested(ModelTypeSet types) { }
66
67void JsSyncManagerObserver::OnInitializationComplete(
68    const WeakHandle<JsBackend>& js_backend,
69    const WeakHandle<DataTypeDebugInfoListener>& debug_info_listener,
70    bool success, syncer::ModelTypeSet restored_types) {
71  if (!event_handler_.IsInitialized()) {
72    return;
73  }
74  // Ignore the |js_backend| argument; it's not really convertible to
75  // JSON anyway.
76
77  base::DictionaryValue details;
78  details.Set("restoredTypes", ModelTypeSetToValue(restored_types));
79
80  HandleJsEvent(FROM_HERE,
81                "onInitializationComplete",
82                JsEventDetails(&details));
83}
84
85void JsSyncManagerObserver::HandleJsEvent(
86    const tracked_objects::Location& from_here,
87    const std::string& name, const JsEventDetails& details) {
88  if (!event_handler_.IsInitialized()) {
89    NOTREACHED();
90    return;
91  }
92  event_handler_.Call(from_here,
93                      &JsEventHandler::HandleJsEvent, name, details);
94}
95
96}  // namespace syncer
97