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/sessions/sync_session.h" 6 7 #include <algorithm> 8 #include <iterator> 9 10 #include "base/logging.h" 11 #include "sync/internal_api/public/base/model_type.h" 12 #include "sync/internal_api/public/engine/model_safe_worker.h" 13 #include "sync/syncable/directory.h" 14 15 namespace syncer { 16 namespace sessions { 17 18 // static 19 SyncSession* SyncSession::Build(SyncSessionContext* context, 20 Delegate* delegate) { 21 return new SyncSession(context, delegate); 22 } 23 24 SyncSession::SyncSession( 25 SyncSessionContext* context, 26 Delegate* delegate) 27 : context_(context), 28 delegate_(delegate) { 29 status_controller_.reset(new StatusController()); 30 } 31 32 SyncSession::~SyncSession() {} 33 34 SyncSessionSnapshot SyncSession::TakeSnapshot() const { 35 return TakeSnapshotWithSource(sync_pb::GetUpdatesCallerInfo::UNKNOWN); 36 } 37 38 SyncSessionSnapshot SyncSession::TakeSnapshotWithSource( 39 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource legacy_updates_source) const { 40 syncable::Directory* dir = context_->directory(); 41 42 ProgressMarkerMap download_progress_markers; 43 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { 44 ModelType type(ModelTypeFromInt(i)); 45 dir->GetDownloadProgressAsString(type, &download_progress_markers[type]); 46 } 47 48 std::vector<int> num_entries_by_type(MODEL_TYPE_COUNT, 0); 49 std::vector<int> num_to_delete_entries_by_type(MODEL_TYPE_COUNT, 0); 50 dir->CollectMetaHandleCounts(&num_entries_by_type, 51 &num_to_delete_entries_by_type); 52 53 SyncSessionSnapshot snapshot( 54 status_controller_->model_neutral_state(), 55 download_progress_markers, 56 delegate_->IsCurrentlyThrottled(), 57 status_controller_->num_encryption_conflicts(), 58 status_controller_->num_hierarchy_conflicts(), 59 status_controller_->num_server_conflicts(), 60 context_->notifications_enabled(), 61 dir->GetEntriesCount(), 62 status_controller_->sync_start_time(), 63 num_entries_by_type, 64 num_to_delete_entries_by_type, 65 legacy_updates_source); 66 67 return snapshot; 68 } 69 70 void SyncSession::SendSyncCycleEndEventNotification( 71 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source) { 72 SyncCycleEvent event(SyncCycleEvent::SYNC_CYCLE_ENDED); 73 event.snapshot = TakeSnapshotWithSource(source); 74 75 DVLOG(1) << "Sending cycle end event with snapshot: " 76 << event.snapshot.ToString(); 77 FOR_EACH_OBSERVER(SyncEngineEventListener, 78 *(context_->listeners()), 79 OnSyncCycleEvent(event)); 80 } 81 82 void SyncSession::SendEventNotification(SyncCycleEvent::EventCause cause) { 83 SyncCycleEvent event(cause); 84 event.snapshot = TakeSnapshot(); 85 86 DVLOG(1) << "Sending event with snapshot: " << event.snapshot.ToString(); 87 FOR_EACH_OBSERVER(SyncEngineEventListener, 88 *(context_->listeners()), 89 OnSyncCycleEvent(event)); 90 } 91 92 void SyncSession::SendProtocolEvent(const ProtocolEvent& event) { 93 FOR_EACH_OBSERVER(SyncEngineEventListener, 94 *(context_->listeners()), 95 OnProtocolEvent(event)); 96 } 97 98 } // namespace sessions 99 } // namespace syncer 100