Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: chrome/browser/extensions/app_notification_manager.cc

Issue 10662035: [Sync] Put everything in sync/api into csync namespace (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix comments Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/app_notification_manager.h" 5 #include "chrome/browser/extensions/app_notification_manager.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/file_path.h" 9 #include "base/file_path.h"
10 #include "base/location.h" 10 #include "base/location.h"
11 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
12 #include "base/perftimer.h" 12 #include "base/perftimer.h"
13 #include "base/stl_util.h" 13 #include "base/stl_util.h"
14 #include "base/time.h" 14 #include "base/time.h"
15 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/common/chrome_notification_types.h" 16 #include "chrome/common/chrome_notification_types.h"
17 #include "chrome/common/extensions/extension.h" 17 #include "chrome/common/extensions/extension.h"
18 #include "content/public/browser/notification_service.h" 18 #include "content/public/browser/notification_service.h"
19 #include "sync/api/sync_error_factory.h" 19 #include "sync/api/sync_error_factory.h"
20 #include "sync/protocol/app_notification_specifics.pb.h" 20 #include "sync/protocol/app_notification_specifics.pb.h"
21 #include "sync/protocol/sync.pb.h" 21 #include "sync/protocol/sync.pb.h"
22 22
23 using content::BrowserThread; 23 using content::BrowserThread;
24 24
25 typedef std::map<std::string, SyncData> SyncDataMap; 25 typedef std::map<std::string, csync::SyncData> SyncDataMap;
26 26
27 namespace { 27 namespace {
28 28
29 class GuidComparator 29 class GuidComparator
30 : public std::binary_function<linked_ptr<AppNotification>, 30 : public std::binary_function<linked_ptr<AppNotification>,
31 std::string, 31 std::string,
32 bool> { 32 bool> {
33 public: 33 public:
34 bool operator() (linked_ptr<AppNotification> notif, 34 bool operator() (linked_ptr<AppNotification> notif,
35 const std::string& guid) const { 35 const std::string& guid) const {
(...skipping 11 matching lines...) Expand all
47 void RemoveByGuid(AppNotificationList* list, const std::string& guid) { 47 void RemoveByGuid(AppNotificationList* list, const std::string& guid) {
48 if (!list) 48 if (!list)
49 return; 49 return;
50 50
51 AppNotificationList::iterator iter = std::find_if( 51 AppNotificationList::iterator iter = std::find_if(
52 list->begin(), list->end(), std::bind2nd(GuidComparator(), guid)); 52 list->begin(), list->end(), std::bind2nd(GuidComparator(), guid));
53 if (iter != list->end()) 53 if (iter != list->end())
54 list->erase(iter); 54 list->erase(iter);
55 } 55 }
56 56
57 void PopulateGuidToSyncDataMap(const SyncDataList& sync_data, 57 void PopulateGuidToSyncDataMap(const csync::SyncDataList& sync_data,
58 SyncDataMap* data_map) { 58 SyncDataMap* data_map) {
59 for (SyncDataList::const_iterator iter = sync_data.begin(); 59 for (csync::SyncDataList::const_iterator iter = sync_data.begin();
60 iter != sync_data.end(); ++iter) { 60 iter != sync_data.end(); ++iter) {
61 (*data_map)[iter->GetSpecifics().app_notification().guid()] = *iter; 61 (*data_map)[iter->GetSpecifics().app_notification().guid()] = *iter;
62 } 62 }
63 } 63 }
64 } // namespace 64 } // namespace
65 65
66 const unsigned int AppNotificationManager::kMaxNotificationPerApp = 5; 66 const unsigned int AppNotificationManager::kMaxNotificationPerApp = 5;
67 67
68 AppNotificationManager::AppNotificationManager(Profile* profile) 68 AppNotificationManager::AppNotificationManager(Profile* profile)
69 : profile_(profile), 69 : profile_(profile),
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 } 171 }
172 172
173 void AppNotificationManager::Observe( 173 void AppNotificationManager::Observe(
174 int type, 174 int type,
175 const content::NotificationSource& source, 175 const content::NotificationSource& source,
176 const content::NotificationDetails& details) { 176 const content::NotificationDetails& details) {
177 CHECK(type == chrome::NOTIFICATION_EXTENSION_UNINSTALLED); 177 CHECK(type == chrome::NOTIFICATION_EXTENSION_UNINSTALLED);
178 ClearAll(*content::Details<const std::string>(details).ptr()); 178 ClearAll(*content::Details<const std::string>(details).ptr());
179 } 179 }
180 180
181 SyncDataList AppNotificationManager::GetAllSyncData( 181 csync::SyncDataList AppNotificationManager::GetAllSyncData(
182 syncable::ModelType type) const { 182 syncable::ModelType type) const {
183 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 183 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
184 DCHECK(loaded()); 184 DCHECK(loaded());
185 DCHECK_EQ(syncable::APP_NOTIFICATIONS, type); 185 DCHECK_EQ(syncable::APP_NOTIFICATIONS, type);
186 SyncDataList data; 186 csync::SyncDataList data;
187 for (NotificationMap::const_iterator iter = notifications_->begin(); 187 for (NotificationMap::const_iterator iter = notifications_->begin();
188 iter != notifications_->end(); ++iter) { 188 iter != notifications_->end(); ++iter) {
189 189
190 // Skip local notifications since they should not be synced. 190 // Skip local notifications since they should not be synced.
191 const AppNotificationList list = (*iter).second; 191 const AppNotificationList list = (*iter).second;
192 for (AppNotificationList::const_iterator list_iter = list.begin(); 192 for (AppNotificationList::const_iterator list_iter = list.begin();
193 list_iter != list.end(); ++list_iter) { 193 list_iter != list.end(); ++list_iter) {
194 const AppNotification* notification = (*list_iter).get(); 194 const AppNotification* notification = (*list_iter).get();
195 if (notification->is_local()) { 195 if (notification->is_local()) {
196 continue; 196 continue;
197 } 197 }
198 data.push_back(CreateSyncDataFromNotification(*notification)); 198 data.push_back(CreateSyncDataFromNotification(*notification));
199 } 199 }
200 } 200 }
201 201
202 return data; 202 return data;
203 } 203 }
204 204
205 SyncError AppNotificationManager::ProcessSyncChanges( 205 csync::SyncError AppNotificationManager::ProcessSyncChanges(
206 const tracked_objects::Location& from_here, 206 const tracked_objects::Location& from_here,
207 const SyncChangeList& change_list) { 207 const csync::SyncChangeList& change_list) {
208 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 208 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
209 DCHECK(loaded()); 209 DCHECK(loaded());
210 if (!models_associated_) { 210 if (!models_associated_) {
211 return sync_error_factory_->CreateAndUploadError( 211 return sync_error_factory_->CreateAndUploadError(
212 FROM_HERE, 212 FROM_HERE,
213 "Models not yet associated."); 213 "Models not yet associated.");
214 } 214 }
215 215
216 AutoReset<bool> processing_changes(&processing_syncer_changes_, true); 216 AutoReset<bool> processing_changes(&processing_syncer_changes_, true);
217 217
218 SyncError error; 218 csync::SyncError error;
219 for (SyncChangeList::const_iterator iter = change_list.begin(); 219 for (csync::SyncChangeList::const_iterator iter = change_list.begin();
220 iter != change_list.end(); ++iter) { 220 iter != change_list.end(); ++iter) {
221 SyncData sync_data = iter->sync_data(); 221 csync::SyncData sync_data = iter->sync_data();
222 DCHECK_EQ(syncable::APP_NOTIFICATIONS, sync_data.GetDataType()); 222 DCHECK_EQ(syncable::APP_NOTIFICATIONS, sync_data.GetDataType());
223 SyncChange::SyncChangeType change_type = iter->change_type(); 223 csync::SyncChange::SyncChangeType change_type = iter->change_type();
224 224
225 scoped_ptr<AppNotification> new_notif(CreateNotificationFromSyncData( 225 scoped_ptr<AppNotification> new_notif(CreateNotificationFromSyncData(
226 sync_data)); 226 sync_data));
227 if (!new_notif.get()) { 227 if (!new_notif.get()) {
228 NOTREACHED() << "Failed to read notification."; 228 NOTREACHED() << "Failed to read notification.";
229 continue; 229 continue;
230 } 230 }
231 const AppNotification* existing_notif = GetNotification( 231 const AppNotification* existing_notif = GetNotification(
232 new_notif->extension_id(), new_notif->guid()); 232 new_notif->extension_id(), new_notif->guid());
233 if (existing_notif && existing_notif->is_local()) { 233 if (existing_notif && existing_notif->is_local()) {
234 NOTREACHED() << "Matched with notification marked as local"; 234 NOTREACHED() << "Matched with notification marked as local";
235 error = sync_error_factory_->CreateAndUploadError( 235 error = sync_error_factory_->CreateAndUploadError(
236 FROM_HERE, 236 FROM_HERE,
237 "ProcessSyncChanges received a local only notification" + 237 "ProcessSyncChanges received a local only notification" +
238 SyncChange::ChangeTypeToString(change_type)); 238 csync::SyncChange::ChangeTypeToString(change_type));
239 continue; 239 continue;
240 } 240 }
241 241
242 switch (change_type) { 242 switch (change_type) {
243 case SyncChange::ACTION_ADD: 243 case csync::SyncChange::ACTION_ADD:
244 if (!existing_notif) { 244 if (!existing_notif) {
245 Add(new_notif.release()); 245 Add(new_notif.release());
246 } else { 246 } else {
247 DLOG(ERROR) << "Got ADD change for an existing item.\n" 247 DLOG(ERROR) << "Got ADD change for an existing item.\n"
248 << "Existing item: " << existing_notif->ToString() 248 << "Existing item: " << existing_notif->ToString()
249 << "\nItem in ADD change: " << new_notif->ToString(); 249 << "\nItem in ADD change: " << new_notif->ToString();
250 } 250 }
251 break; 251 break;
252 case SyncChange::ACTION_DELETE: 252 case csync::SyncChange::ACTION_DELETE:
253 if (existing_notif) { 253 if (existing_notif) {
254 Remove(new_notif->extension_id(), new_notif->guid()); 254 Remove(new_notif->extension_id(), new_notif->guid());
255 } else { 255 } else {
256 // This should never happen. But we are seeting this sometimes, and 256 // This should never happen. But we are seeting this sometimes, and
257 // it stops all of sync. See bug http://crbug.com/108088 257 // it stops all of sync. See bug http://crbug.com/108088
258 // So until we figure out the root cause, log an error and ignore. 258 // So until we figure out the root cause, log an error and ignore.
259 DLOG(ERROR) << "Got DELETE change for non-existing item.\n" 259 DLOG(ERROR) << "Got DELETE change for non-existing item.\n"
260 << "Item in DELETE change: " << new_notif->ToString(); 260 << "Item in DELETE change: " << new_notif->ToString();
261 } 261 }
262 break; 262 break;
263 case SyncChange::ACTION_UPDATE: 263 case csync::SyncChange::ACTION_UPDATE:
264 // Although app notifications are immutable from the model perspective, 264 // Although app notifications are immutable from the model perspective,
265 // sync can send UPDATE changes due to encryption / meta-data changes. 265 // sync can send UPDATE changes due to encryption / meta-data changes.
266 // So ignore UPDATE changes when the exitsing and new notification 266 // So ignore UPDATE changes when the exitsing and new notification
267 // objects are the same. Log an error otherwise. 267 // objects are the same. Log an error otherwise.
268 if (!existing_notif) { 268 if (!existing_notif) {
269 DLOG(ERROR) << "Got UPDATE change for non-existing item." 269 DLOG(ERROR) << "Got UPDATE change for non-existing item."
270 << "Item in UPDATE change: " << new_notif->ToString(); 270 << "Item in UPDATE change: " << new_notif->ToString();
271 } else if (!existing_notif->Equals(*new_notif)) { 271 } else if (!existing_notif->Equals(*new_notif)) {
272 DLOG(ERROR) << "Got invalid UPDATE change:" 272 DLOG(ERROR) << "Got invalid UPDATE change:"
273 << "New and existing notifications should be the same.\n" 273 << "New and existing notifications should be the same.\n"
274 << "Existing item: " << existing_notif->ToString() << "\n" 274 << "Existing item: " << existing_notif->ToString() << "\n"
275 << "Item in UPDATE change: " << new_notif->ToString(); 275 << "Item in UPDATE change: " << new_notif->ToString();
276 } 276 }
277 break; 277 break;
278 default: 278 default:
279 break; 279 break;
280 } 280 }
281 } 281 }
282 282
283 return error; 283 return error;
284 } 284 }
285 285
286 SyncError AppNotificationManager::MergeDataAndStartSyncing( 286 csync::SyncError AppNotificationManager::MergeDataAndStartSyncing(
287 syncable::ModelType type, 287 syncable::ModelType type,
288 const SyncDataList& initial_sync_data, 288 const csync::SyncDataList& initial_sync_data,
289 scoped_ptr<SyncChangeProcessor> sync_processor, 289 scoped_ptr<csync::SyncChangeProcessor> sync_processor,
290 scoped_ptr<SyncErrorFactory> sync_error_factory) { 290 scoped_ptr<csync::SyncErrorFactory> sync_error_factory) {
291 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 291 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
292 // AppNotificationDataTypeController ensures that modei is fully should before 292 // AppNotificationDataTypeController ensures that modei is fully should before
293 // this method is called by waiting until the load notification is received 293 // this method is called by waiting until the load notification is received
294 // from AppNotificationManager. 294 // from AppNotificationManager.
295 DCHECK(loaded()); 295 DCHECK(loaded());
296 DCHECK_EQ(type, syncable::APP_NOTIFICATIONS); 296 DCHECK_EQ(type, syncable::APP_NOTIFICATIONS);
297 DCHECK(!sync_processor_.get()); 297 DCHECK(!sync_processor_.get());
298 DCHECK(sync_processor.get()); 298 DCHECK(sync_processor.get());
299 DCHECK(sync_error_factory.get()); 299 DCHECK(sync_error_factory.get());
300 sync_processor_ = sync_processor.Pass(); 300 sync_processor_ = sync_processor.Pass();
301 sync_error_factory_ = sync_error_factory.Pass(); 301 sync_error_factory_ = sync_error_factory.Pass();
302 302
303 // We may add, or remove notifications here, so ensure we don't step on 303 // We may add, or remove notifications here, so ensure we don't step on
304 // our own toes. 304 // our own toes.
305 AutoReset<bool> processing_changes(&processing_syncer_changes_, true); 305 AutoReset<bool> processing_changes(&processing_syncer_changes_, true);
306 306
307 SyncDataMap local_data_map; 307 SyncDataMap local_data_map;
308 PopulateGuidToSyncDataMap(GetAllSyncData(syncable::APP_NOTIFICATIONS), 308 PopulateGuidToSyncDataMap(GetAllSyncData(syncable::APP_NOTIFICATIONS),
309 &local_data_map); 309 &local_data_map);
310 310
311 for (SyncDataList::const_iterator iter = initial_sync_data.begin(); 311 for (csync::SyncDataList::const_iterator iter = initial_sync_data.begin();
312 iter != initial_sync_data.end(); ++iter) { 312 iter != initial_sync_data.end(); ++iter) {
313 const SyncData& sync_data = *iter; 313 const csync::SyncData& sync_data = *iter;
314 DCHECK_EQ(syncable::APP_NOTIFICATIONS, sync_data.GetDataType()); 314 DCHECK_EQ(syncable::APP_NOTIFICATIONS, sync_data.GetDataType());
315 scoped_ptr<AppNotification> sync_notif(CreateNotificationFromSyncData( 315 scoped_ptr<AppNotification> sync_notif(CreateNotificationFromSyncData(
316 sync_data)); 316 sync_data));
317 CHECK(sync_notif.get()); 317 CHECK(sync_notif.get());
318 const AppNotification* local_notif = GetNotification( 318 const AppNotification* local_notif = GetNotification(
319 sync_notif->extension_id(), sync_notif->guid()); 319 sync_notif->extension_id(), sync_notif->guid());
320 if (local_notif) { 320 if (local_notif) {
321 local_data_map.erase(sync_notif->guid()); 321 local_data_map.erase(sync_notif->guid());
322 // Local notification should always match with sync notification as 322 // Local notification should always match with sync notification as
323 // notifications are immutable. 323 // notifications are immutable.
324 if (local_notif->is_local() || !sync_notif->Equals(*local_notif)) { 324 if (local_notif->is_local() || !sync_notif->Equals(*local_notif)) {
325 return sync_error_factory_->CreateAndUploadError( 325 return sync_error_factory_->CreateAndUploadError(
326 FROM_HERE, 326 FROM_HERE,
327 "MergeDataAndStartSyncing failed: local notification and sync " 327 "MergeDataAndStartSyncing failed: local notification and sync "
328 "notification have same guid but different data."); 328 "notification have same guid but different data.");
329 } 329 }
330 } else { 330 } else {
331 // Sync model has a notification that local model does not, add it. 331 // Sync model has a notification that local model does not, add it.
332 Add(sync_notif.release()); 332 Add(sync_notif.release());
333 } 333 }
334 } 334 }
335 335
336 // TODO(munjal): crbug.com/10059. Work with Lingesh/Antony to resolve. 336 // TODO(munjal): crbug.com/10059. Work with Lingesh/Antony to resolve.
337 SyncChangeList new_changes; 337 csync::SyncChangeList new_changes;
338 for (SyncDataMap::const_iterator iter = local_data_map.begin(); 338 for (SyncDataMap::const_iterator iter = local_data_map.begin();
339 iter != local_data_map.end(); ++iter) { 339 iter != local_data_map.end(); ++iter) {
340 new_changes.push_back(SyncChange(SyncChange::ACTION_ADD, iter->second)); 340 new_changes.push_back(
341 csync::SyncChange(csync::SyncChange::ACTION_ADD, iter->second));
341 } 342 }
342 343
343 SyncError error; 344 csync::SyncError error;
344 if (new_changes.size() > 0) 345 if (new_changes.size() > 0)
345 error = sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes); 346 error = sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes);
346 models_associated_ = !error.IsSet(); 347 models_associated_ = !error.IsSet();
347 return error; 348 return error;
348 } 349 }
349 350
350 void AppNotificationManager::StopSyncing(syncable::ModelType type) { 351 void AppNotificationManager::StopSyncing(syncable::ModelType type) {
351 DCHECK_EQ(type, syncable::APP_NOTIFICATIONS); 352 DCHECK_EQ(type, syncable::APP_NOTIFICATIONS);
352 models_associated_ = false; 353 models_associated_ = false;
353 sync_processor_.reset(); 354 sync_processor_.reset();
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 void AppNotificationManager::SyncAddChange(const AppNotification& notif) { 484 void AppNotificationManager::SyncAddChange(const AppNotification& notif) {
484 // Skip if either: 485 // Skip if either:
485 // - Notification is marked as local. 486 // - Notification is marked as local.
486 // - Sync is not enabled by user. 487 // - Sync is not enabled by user.
487 // - Change is generated from within the manager. 488 // - Change is generated from within the manager.
488 if (notif.is_local() || !models_associated_ || processing_syncer_changes_) 489 if (notif.is_local() || !models_associated_ || processing_syncer_changes_)
489 return; 490 return;
490 491
491 // TODO(munjal): crbug.com/10059. Work with Lingesh/Antony to resolve. 492 // TODO(munjal): crbug.com/10059. Work with Lingesh/Antony to resolve.
492 493
493 SyncChangeList changes; 494 csync::SyncChangeList changes;
494 SyncData sync_data = CreateSyncDataFromNotification(notif); 495 csync::SyncData sync_data = CreateSyncDataFromNotification(notif);
495 changes.push_back(SyncChange(SyncChange::ACTION_ADD, sync_data)); 496 changes.push_back(
497 csync::SyncChange(csync::SyncChange::ACTION_ADD, sync_data));
496 sync_processor_->ProcessSyncChanges(FROM_HERE, changes); 498 sync_processor_->ProcessSyncChanges(FROM_HERE, changes);
497 } 499 }
498 500
499 void AppNotificationManager::SyncRemoveChange(const AppNotification& notif) { 501 void AppNotificationManager::SyncRemoveChange(const AppNotification& notif) {
500 // Skip if either: 502 // Skip if either:
501 // - Sync is not enabled by user. 503 // - Sync is not enabled by user.
502 // - Change is generated from within the manager. 504 // - Change is generated from within the manager.
503 if (notif.is_local() || !models_associated_) { 505 if (notif.is_local() || !models_associated_) {
504 return; 506 return;
505 } 507 }
506 508
507 SyncChangeList changes; 509 csync::SyncChangeList changes;
508 SyncData sync_data = CreateSyncDataFromNotification(notif); 510 csync::SyncData sync_data = CreateSyncDataFromNotification(notif);
509 changes.push_back(SyncChange(SyncChange::ACTION_DELETE, sync_data)); 511 changes.push_back(
512 csync::SyncChange(csync::SyncChange::ACTION_DELETE, sync_data));
510 sync_processor_->ProcessSyncChanges(FROM_HERE, changes); 513 sync_processor_->ProcessSyncChanges(FROM_HERE, changes);
511 } 514 }
512 515
513 void AppNotificationManager::SyncClearAllChange( 516 void AppNotificationManager::SyncClearAllChange(
514 const AppNotificationList& list) { 517 const AppNotificationList& list) {
515 // Skip if either: 518 // Skip if either:
516 // - Sync is not enabled by user. 519 // - Sync is not enabled by user.
517 // - Change is generated from within the manager. 520 // - Change is generated from within the manager.
518 if (!models_associated_ || processing_syncer_changes_) 521 if (!models_associated_ || processing_syncer_changes_)
519 return; 522 return;
520 523
521 SyncChangeList changes; 524 csync::SyncChangeList changes;
522 for (AppNotificationList::const_iterator iter = list.begin(); 525 for (AppNotificationList::const_iterator iter = list.begin();
523 iter != list.end(); ++iter) { 526 iter != list.end(); ++iter) {
524 const AppNotification& notif = *iter->get(); 527 const AppNotification& notif = *iter->get();
525 // Skip notifications marked as local. 528 // Skip notifications marked as local.
526 if (notif.is_local()) 529 if (notif.is_local())
527 continue; 530 continue;
528 changes.push_back(SyncChange( 531 changes.push_back(csync::SyncChange(
529 SyncChange::ACTION_DELETE, 532 csync::SyncChange::ACTION_DELETE,
530 CreateSyncDataFromNotification(notif))); 533 CreateSyncDataFromNotification(notif)));
531 } 534 }
532 sync_processor_->ProcessSyncChanges(FROM_HERE, changes); 535 sync_processor_->ProcessSyncChanges(FROM_HERE, changes);
533 } 536 }
534 537
535 // static 538 // static
536 SyncData AppNotificationManager::CreateSyncDataFromNotification( 539 csync::SyncData AppNotificationManager::CreateSyncDataFromNotification(
537 const AppNotification& notification) { 540 const AppNotification& notification) {
538 DCHECK(!notification.is_local()); 541 DCHECK(!notification.is_local());
539 sync_pb::EntitySpecifics specifics; 542 sync_pb::EntitySpecifics specifics;
540 sync_pb::AppNotification* notif_specifics = 543 sync_pb::AppNotification* notif_specifics =
541 specifics.mutable_app_notification(); 544 specifics.mutable_app_notification();
542 notif_specifics->set_app_id(notification.extension_id()); 545 notif_specifics->set_app_id(notification.extension_id());
543 notif_specifics->set_creation_timestamp_ms( 546 notif_specifics->set_creation_timestamp_ms(
544 notification.creation_time().ToInternalValue()); 547 notification.creation_time().ToInternalValue());
545 notif_specifics->set_body_text(notification.body()); 548 notif_specifics->set_body_text(notification.body());
546 notif_specifics->set_guid(notification.guid()); 549 notif_specifics->set_guid(notification.guid());
547 notif_specifics->set_link_text(notification.link_text()); 550 notif_specifics->set_link_text(notification.link_text());
548 notif_specifics->set_link_url(notification.link_url().spec()); 551 notif_specifics->set_link_url(notification.link_url().spec());
549 notif_specifics->set_title(notification.title()); 552 notif_specifics->set_title(notification.title());
550 return SyncData::CreateLocalData( 553 return csync::SyncData::CreateLocalData(
551 notif_specifics->guid(), notif_specifics->app_id(), specifics); 554 notif_specifics->guid(), notif_specifics->app_id(), specifics);
552 } 555 }
553 556
554 // static 557 // static
555 AppNotification* AppNotificationManager::CreateNotificationFromSyncData( 558 AppNotification* AppNotificationManager::CreateNotificationFromSyncData(
556 const SyncData& sync_data) { 559 const csync::SyncData& sync_data) {
557 sync_pb::AppNotification specifics = 560 sync_pb::AppNotification specifics =
558 sync_data.GetSpecifics().app_notification(); 561 sync_data.GetSpecifics().app_notification();
559 562
560 // Check for mandatory fields. 563 // Check for mandatory fields.
561 if (!specifics.has_app_id() || !specifics.has_guid() || 564 if (!specifics.has_app_id() || !specifics.has_guid() ||
562 !specifics.has_title() || !specifics.has_body_text() || 565 !specifics.has_title() || !specifics.has_body_text() ||
563 !specifics.has_creation_timestamp_ms()) { 566 !specifics.has_creation_timestamp_ms()) {
564 return NULL; 567 return NULL;
565 } 568 }
566 569
567 AppNotification* notification = new AppNotification( 570 AppNotification* notification = new AppNotification(
568 false, base::Time::FromInternalValue(specifics.creation_timestamp_ms()), 571 false, base::Time::FromInternalValue(specifics.creation_timestamp_ms()),
569 specifics.guid(), specifics.app_id(), 572 specifics.guid(), specifics.app_id(),
570 specifics.title(), specifics.body_text()); 573 specifics.title(), specifics.body_text());
571 if (specifics.has_link_text()) 574 if (specifics.has_link_text())
572 notification->set_link_text(specifics.link_text()); 575 notification->set_link_text(specifics.link_text());
573 if (specifics.has_link_url()) 576 if (specifics.has_link_url())
574 notification->set_link_url(GURL(specifics.link_url())); 577 notification->set_link_url(GURL(specifics.link_url()));
575 return notification; 578 return notification;
576 } 579 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698