Index: chrome/browser/sync/engine/syncapi.cc |
=================================================================== |
--- chrome/browser/sync/engine/syncapi.cc (revision 71618) |
+++ chrome/browser/sync/engine/syncapi.cc (working copy) |
@@ -7,6 +7,7 @@ |
#include <bitset> |
#include <iomanip> |
#include <list> |
+#include <map> |
#include <string> |
#include <vector> |
@@ -83,6 +84,7 @@ |
static const int kThreadExitTimeoutMsec = 60000; |
static const int kSSLPort = 443; |
+const int kSyncerThreadDelayMsec = 250; |
#if defined(OS_CHROMEOS) |
static const int kChromeOSNetworkChangeReactionDelayHackMsec = 5000; |
@@ -2194,26 +2196,37 @@ |
void SyncManager::SyncInternal::OnIncomingNotification( |
const IncomingNotificationData& notification_data) { |
syncable::ModelTypeBitSet model_types; |
+ std::map<syncable::ModelType, std::string> payloads; |
// Check if the service url is a sync URL. An empty service URL is |
// treated as a legacy sync notification. If we're listening to |
// server-issued notifications, no need to check the service_url. |
if (notifier_options_.notification_method == |
notifier::NOTIFICATION_SERVER) { |
- VLOG(1) << "Sync received server notification: " << |
+ VLOG(1) << "Sync received server notification from " << |
+ notification_data.service_url << ": " << |
notification_data.service_specific_data; |
+ const std::string& model_type_list = notification_data.service_url; |
+ const std::string& notification_payload = |
+ notification_data.service_specific_data; |
- if (!syncable::ModelTypeBitSetFromString( |
- notification_data.service_specific_data, |
- &model_types)) { |
+ if (!syncable::ModelTypeBitSetFromString(model_type_list, &model_types)) { |
LOG(DFATAL) << "Could not extract model types from server data."; |
model_types.set(); |
} |
+ |
+ for (size_t i = syncable::FIRST_REAL_MODEL_TYPE; |
+ i < model_types.size(); |
+ ++i) { |
+ if (model_types[i]) { |
+ payloads[syncable::ModelTypeFromInt(i)] = notification_payload; |
+ } |
+ } |
} else if (notification_data.service_url.empty() || |
- (notification_data.service_url == |
- browser_sync::kSyncLegacyServiceUrl) || |
- (notification_data.service_url == |
- browser_sync::kSyncServiceUrl)) { |
+ (notification_data.service_url == |
+ browser_sync::kSyncLegacyServiceUrl) || |
+ (notification_data.service_url == |
+ browser_sync::kSyncServiceUrl)) { |
VLOG(1) << "Sync received P2P notification."; |
// Catch for sync integration tests (uses p2p). Just set all datatypes. |
@@ -2225,11 +2238,10 @@ |
if (model_types.any()) { |
if (syncer_thread()) { |
- // Introduce a delay to help coalesce initial notifications. |
- syncer_thread()->NudgeSyncerWithDataTypes( |
- 250, |
- SyncerThread::kNotification, |
- model_types); |
+ syncer_thread()->NudgeSyncerWithPayloads( |
+ kSyncerThreadDelayMsec, |
+ SyncerThread::kNotification, |
+ payloads); |
} |
allstatus_.IncrementNotificationsReceived(); |
} else { |