15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/sessions/sync_session.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iterator>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/engine/model_safe_worker.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/directory.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sessions {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// static
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)SyncSession* SyncSession::Build(SyncSessionContext* context,
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                Delegate* delegate) {
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return new SyncSession(context, delegate);
22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SyncSession::SyncSession(
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SyncSessionContext* context,
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    Delegate* delegate)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : context_(context),
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      delegate_(delegate) {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  status_controller_.reset(new StatusController());
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncSession::~SyncSession() {}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncSessionSnapshot SyncSession::TakeSnapshot() const {
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return TakeSnapshotWithSource(sync_pb::GetUpdatesCallerInfo::UNKNOWN);
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SyncSessionSnapshot SyncSession::TakeSnapshotWithSource(
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  sync_pb::GetUpdatesCallerInfo::GetUpdatesSource legacy_updates_source) const {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::Directory* dir = context_->directory();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProgressMarkerMap download_progress_markers;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModelType type(ModelTypeFromInt(i));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dir->GetDownloadProgressAsString(type, &download_progress_markers[type]);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<int> num_entries_by_type(MODEL_TYPE_COUNT, 0);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<int> num_to_delete_entries_by_type(MODEL_TYPE_COUNT, 0);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dir->CollectMetaHandleCounts(&num_entries_by_type,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               &num_to_delete_entries_by_type);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SyncSessionSnapshot snapshot(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status_controller_->model_neutral_state(),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_progress_markers,
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      delegate_->IsCurrentlyThrottled(),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status_controller_->num_encryption_conflicts(),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status_controller_->num_hierarchy_conflicts(),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status_controller_->num_server_conflicts(),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_->notifications_enabled(),
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dir->GetEntriesCount(),
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      status_controller_->sync_start_time(),
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      num_entries_by_type,
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      num_to_delete_entries_by_type,
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      legacy_updates_source);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return snapshot;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void SyncSession::SendSyncCycleEndEventNotification(
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source) {
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SyncCycleEvent event(SyncCycleEvent::SYNC_CYCLE_ENDED);
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  event.snapshot = TakeSnapshotWithSource(source);
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DVLOG(1) << "Sending cycle end event with snapshot: "
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      << event.snapshot.ToString();
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(SyncEngineEventListener,
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    *(context_->listeners()),
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    OnSyncCycleEvent(event));
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SyncSession::SendEventNotification(SyncCycleEvent::EventCause cause) {
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SyncCycleEvent event(cause);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.snapshot = TakeSnapshot();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Sending event with snapshot: " << event.snapshot.ToString();
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(SyncEngineEventListener,
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    *(context_->listeners()),
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    OnSyncCycleEvent(event));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid SyncSession::SendProtocolEvent(const ProtocolEvent& event) {
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FOR_EACH_OBSERVER(SyncEngineEventListener,
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    *(context_->listeners()),
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    OnProtocolEvent(event));
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sessions
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
100