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