// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sync/engine/get_updates_delegate.h"
#include "sync/engine/directory_update_handler.h"
#include "sync/engine/get_updates_processor.h"
#include "sync/internal_api/public/events/configure_get_updates_request_event.h"
#include "sync/internal_api/public/events/normal_get_updates_request_event.h"
#include "sync/internal_api/public/events/poll_get_updates_request_event.h"
namespace syncer {
namespace {
void NonPassiveApplyUpdates(
ModelTypeSet gu_types,
sessions::StatusController* status_controller,
UpdateHandlerMap* update_handler_map) {
for (UpdateHandlerMap::iterator it = update_handler_map->begin();
it != update_handler_map->end(); ++it) {
if (gu_types.Has(it->first))
it->second->ApplyUpdates(status_controller);
}
}
void PassiveApplyUpdates(
ModelTypeSet gu_types,
sessions::StatusController* status_controller,
UpdateHandlerMap* update_handler_map) {
for (UpdateHandlerMap::iterator it = update_handler_map->begin();
it != update_handler_map->end(); ++it) {
if (gu_types.Has(it->first))
it->second->PassiveApplyUpdates(status_controller);
}
}
} // namespace
GetUpdatesDelegate::GetUpdatesDelegate() {}
GetUpdatesDelegate::~GetUpdatesDelegate() {}
NormalGetUpdatesDelegate::NormalGetUpdatesDelegate(
const sessions::NudgeTracker& nudge_tracker)
: nudge_tracker_(nudge_tracker) {}
NormalGetUpdatesDelegate::~NormalGetUpdatesDelegate() {}
// This function assumes the progress markers have already been populated.
void NormalGetUpdatesDelegate::HelpPopulateGuMessage(
sync_pb::GetUpdatesMessage* get_updates) const {
// Set legacy GetUpdatesMessage.GetUpdatesCallerInfo information.
get_updates->mutable_caller_info()->set_source(
nudge_tracker_.GetLegacySource());
// Set the new and improved version of source, too.
get_updates->set_get_updates_origin(sync_pb::SyncEnums::GU_TRIGGER);
get_updates->set_is_retry(nudge_tracker_.IsRetryRequired());
// Special case: A GU performed for no other reason than retry will have its
// origin set to RETRY.
if (nudge_tracker_.GetLegacySource() == sync_pb::GetUpdatesCallerInfo::RETRY)
get_updates->set_get_updates_origin(sync_pb::SyncEnums::RETRY);
// Fill in the notification hints.
for (int i = 0; i < get_updates->from_progress_marker_size(); ++i) {
sync_pb::DataTypeProgressMarker* progress_marker =
get_updates->mutable_from_progress_marker(i);
ModelType type = GetModelTypeFromSpecificsFieldNumber(
progress_marker->data_type_id());
DCHECK(!nudge_tracker_.IsTypeThrottled(type))
<< "Throttled types should have been removed from the request_types.";
nudge_tracker_.SetLegacyNotificationHint(type, progress_marker);
nudge_tracker_.FillProtoMessage(
type,
progress_marker->mutable_get_update_triggers());
}
}
void NormalGetUpdatesDelegate::ApplyUpdates(
ModelTypeSet gu_types,
sessions::StatusController* status_controller,
UpdateHandlerMap* update_handler_map) const {
NonPassiveApplyUpdates(gu_types, status_controller, update_handler_map);
}
scoped_ptr<ProtocolEvent> NormalGetUpdatesDelegate::GetNetworkRequestEvent(
base::Time timestamp,
const sync_pb::ClientToServerMessage& request) const {
return scoped_ptr<ProtocolEvent>(
new NormalGetUpdatesRequestEvent(timestamp, nudge_tracker_, request));
}
ConfigureGetUpdatesDelegate::ConfigureGetUpdatesDelegate(
sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source) : source_(source) {}
ConfigureGetUpdatesDelegate::~ConfigureGetUpdatesDelegate() {}
void ConfigureGetUpdatesDelegate::HelpPopulateGuMessage(
sync_pb::GetUpdatesMessage* get_updates) const {
get_updates->mutable_caller_info()->set_source(source_);
get_updates->set_get_updates_origin(ConvertConfigureSourceToOrigin(source_));
}
void ConfigureGetUpdatesDelegate::ApplyUpdates(
ModelTypeSet gu_types,
sessions::StatusController* status_controller,
UpdateHandlerMap* update_handler_map) const {
PassiveApplyUpdates(gu_types, status_controller, update_handler_map);
}
scoped_ptr<ProtocolEvent> ConfigureGetUpdatesDelegate::GetNetworkRequestEvent(
base::Time timestamp,
const sync_pb::ClientToServerMessage& request) const {
return scoped_ptr<ProtocolEvent>(
new ConfigureGetUpdatesRequestEvent(
timestamp,
ConvertConfigureSourceToOrigin(source_),
request));
}
sync_pb::SyncEnums::GetUpdatesOrigin
ConfigureGetUpdatesDelegate::ConvertConfigureSourceToOrigin(
sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source) {
switch (source) {
// Configurations:
case sync_pb::GetUpdatesCallerInfo::NEWLY_SUPPORTED_DATATYPE:
return sync_pb::SyncEnums::NEWLY_SUPPORTED_DATATYPE;
case sync_pb::GetUpdatesCallerInfo::MIGRATION:
return sync_pb::SyncEnums::MIGRATION;
case sync_pb::GetUpdatesCallerInfo::RECONFIGURATION:
return sync_pb::SyncEnums::RECONFIGURATION;
case sync_pb::GetUpdatesCallerInfo::NEW_CLIENT:
return sync_pb::SyncEnums::NEW_CLIENT;
default:
NOTREACHED();
return sync_pb::SyncEnums::UNKNOWN_ORIGIN;
}
}
PollGetUpdatesDelegate::PollGetUpdatesDelegate() {}
PollGetUpdatesDelegate::~PollGetUpdatesDelegate() {}
void PollGetUpdatesDelegate::HelpPopulateGuMessage(
sync_pb::GetUpdatesMessage* get_updates) const {
// Set legacy GetUpdatesMessage.GetUpdatesCallerInfo information.
get_updates->mutable_caller_info()->set_source(
sync_pb::GetUpdatesCallerInfo::PERIODIC);
// Set the new and improved version of source, too.
get_updates->set_get_updates_origin(sync_pb::SyncEnums::PERIODIC);
}
void PollGetUpdatesDelegate::ApplyUpdates(
ModelTypeSet gu_types,
sessions::StatusController* status_controller,
UpdateHandlerMap* update_handler_map) const {
NonPassiveApplyUpdates(gu_types, status_controller, update_handler_map);
}
scoped_ptr<ProtocolEvent> PollGetUpdatesDelegate::GetNetworkRequestEvent(
base::Time timestamp,
const sync_pb::ClientToServerMessage& request) const {
return scoped_ptr<ProtocolEvent>(
new PollGetUpdatesRequestEvent(timestamp, request));
}
} // namespace syncer