Updating trunk VERSION from 2139.0 to 2140.0
[chromium-blink-merge.git] / sync / protocol / proto_value_conversions.cc
blob62b611f1c62b6b1fd45e732bc8a1948f116714e4
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.
5 // Keep this file in sync with the .proto files in this directory.
7 #include "sync/protocol/proto_value_conversions.h"
9 #include <string>
11 #include "base/base64.h"
12 #include "base/basictypes.h"
13 #include "base/i18n/time_formatting.h"
14 #include "base/logging.h"
15 #include "base/strings/string_number_conversions.h"
16 #include "base/time/time.h"
17 #include "base/values.h"
18 #include "sync/internal_api/public/base/unique_position.h"
19 #include "sync/protocol/app_list_specifics.pb.h"
20 #include "sync/protocol/app_notification_specifics.pb.h"
21 #include "sync/protocol/app_setting_specifics.pb.h"
22 #include "sync/protocol/app_specifics.pb.h"
23 #include "sync/protocol/autofill_specifics.pb.h"
24 #include "sync/protocol/bookmark_specifics.pb.h"
25 #include "sync/protocol/dictionary_specifics.pb.h"
26 #include "sync/protocol/encryption.pb.h"
27 #include "sync/protocol/experiments_specifics.pb.h"
28 #include "sync/protocol/extension_setting_specifics.pb.h"
29 #include "sync/protocol/extension_specifics.pb.h"
30 #include "sync/protocol/favicon_image_specifics.pb.h"
31 #include "sync/protocol/favicon_tracking_specifics.pb.h"
32 #include "sync/protocol/history_delete_directive_specifics.pb.h"
33 #include "sync/protocol/nigori_specifics.pb.h"
34 #include "sync/protocol/password_specifics.pb.h"
35 #include "sync/protocol/preference_specifics.pb.h"
36 #include "sync/protocol/priority_preference_specifics.pb.h"
37 #include "sync/protocol/proto_enum_conversions.h"
38 #include "sync/protocol/search_engine_specifics.pb.h"
39 #include "sync/protocol/session_specifics.pb.h"
40 #include "sync/protocol/sync.pb.h"
41 #include "sync/protocol/synced_notification_app_info_specifics.pb.h"
42 #include "sync/protocol/synced_notification_specifics.pb.h"
43 #include "sync/protocol/theme_specifics.pb.h"
44 #include "sync/protocol/typed_url_specifics.pb.h"
45 #include "sync/protocol/unique_position.pb.h"
46 #include "sync/util/time.h"
48 namespace syncer {
50 namespace {
52 // Basic Type -> Value functions.
54 base::StringValue* MakeInt64Value(int64 x) {
55 return new base::StringValue(base::Int64ToString(x));
58 // TODO(akalin): Perhaps make JSONWriter support BinaryValue and use
59 // that instead of a StringValue.
60 base::StringValue* MakeBytesValue(const std::string& bytes) {
61 std::string bytes_base64;
62 base::Base64Encode(bytes, &bytes_base64);
63 return new base::StringValue(bytes_base64);
66 base::StringValue* MakeStringValue(const std::string& str) {
67 return new base::StringValue(str);
70 // T is the enum type.
71 template <class T>
72 base::StringValue* MakeEnumValue(T t, const char* (*converter_fn)(T)) {
73 return new base::StringValue(converter_fn(t));
76 // T is the field type, F is either RepeatedField or RepeatedPtrField,
77 // and V is a subclass of Value.
78 template <class T, class F, class V>
79 base::ListValue* MakeRepeatedValue(const F& fields, V* (*converter_fn)(T)) {
80 base::ListValue* list = new base::ListValue();
81 for (typename F::const_iterator it = fields.begin(); it != fields.end();
82 ++it) {
83 list->Append(converter_fn(*it));
85 return list;
88 base::StringValue* MakeTimestampValue(int64 tm) {
89 return new base::StringValue(
90 base::TimeFormatShortDateAndTime(syncer::ProtoTimeToTime(tm)));
93 } // namespace
95 // Helper macros to reduce the amount of boilerplate.
97 #define SET(field, fn) \
98 if (proto.has_##field()) { \
99 value->Set(#field, fn(proto.field())); \
101 #define SET_REP(field, fn) \
102 value->Set(#field, MakeRepeatedValue(proto.field(), fn))
103 #define SET_ENUM(field, fn) \
104 value->Set(#field, MakeEnumValue(proto.field(), fn))
106 #define SET_BOOL(field) SET(field, new base::FundamentalValue)
107 #define SET_BYTES(field) SET(field, MakeBytesValue)
108 #define SET_INT32(field) SET(field, MakeInt64Value)
109 #define SET_INT32_REP(field) SET_REP(field, MakeInt64Value)
110 #define SET_INT64(field) SET(field, MakeInt64Value)
111 #define SET_INT64_REP(field) SET_REP(field, MakeInt64Value)
112 #define SET_STR(field) SET(field, new base::StringValue)
113 #define SET_TIME_STR(field) SET(field, MakeTimestampValue)
114 #define SET_STR_REP(field) \
115 value->Set(#field, \
116 MakeRepeatedValue<const std::string&, \
117 google::protobuf::RepeatedPtrField< \
118 std::string >, \
119 base::StringValue>(proto.field(), \
120 MakeStringValue))
121 #define SET_EXPERIMENT_ENABLED_FIELD(field) \
122 do { \
123 if (proto.has_##field() && \
124 proto.field().has_enabled()) { \
125 value->Set(#field, \
126 new base::FundamentalValue( \
127 proto.field().enabled())); \
129 } while (0)
131 #define SET_FIELD(field, fn) \
132 do { \
133 if (specifics.has_##field()) { \
134 value->Set(#field, fn(specifics.field())); \
136 } while (0)
138 // If you add another macro, don't forget to add an #undef at the end
139 // of this file, too.
141 base::DictionaryValue* EncryptedDataToValue(
142 const sync_pb::EncryptedData& proto) {
143 base::DictionaryValue* value = new base::DictionaryValue();
144 SET_STR(key_name);
145 // TODO(akalin): Shouldn't blob be of type bytes instead of string?
146 SET_BYTES(blob);
147 return value;
150 base::DictionaryValue* AppSettingsToValue(
151 const sync_pb::AppNotificationSettings& proto) {
152 base::DictionaryValue* value = new base::DictionaryValue();
153 SET_BOOL(initial_setup_done);
154 SET_BOOL(disabled);
155 SET_STR(oauth_client_id);
156 return value;
159 base::DictionaryValue* SessionHeaderToValue(
160 const sync_pb::SessionHeader& proto) {
161 base::DictionaryValue* value = new base::DictionaryValue();
162 SET_REP(window, SessionWindowToValue);
163 SET_STR(client_name);
164 SET_ENUM(device_type, GetDeviceTypeString);
165 return value;
168 base::DictionaryValue* SessionTabToValue(const sync_pb::SessionTab& proto) {
169 base::DictionaryValue* value = new base::DictionaryValue();
170 SET_INT32(tab_id);
171 SET_INT32(window_id);
172 SET_INT32(tab_visual_index);
173 SET_INT32(current_navigation_index);
174 SET_BOOL(pinned);
175 SET_STR(extension_app_id);
176 SET_REP(navigation, TabNavigationToValue);
177 SET_BYTES(favicon);
178 SET_ENUM(favicon_type, GetFaviconTypeString);
179 SET_STR(favicon_source);
180 return value;
183 base::DictionaryValue* SessionWindowToValue(
184 const sync_pb::SessionWindow& proto) {
185 base::DictionaryValue* value = new base::DictionaryValue();
186 SET_INT32(window_id);
187 SET_INT32(selected_tab_index);
188 SET_INT32_REP(tab);
189 SET_ENUM(browser_type, GetBrowserTypeString);
190 return value;
193 base::DictionaryValue* TabNavigationToValue(
194 const sync_pb::TabNavigation& proto) {
195 base::DictionaryValue* value = new base::DictionaryValue();
196 SET_STR(virtual_url);
197 SET_STR(referrer);
198 SET_STR(title);
199 SET_STR(state);
200 SET_ENUM(page_transition, GetPageTransitionString);
201 SET_ENUM(redirect_type, GetPageTransitionRedirectTypeString);
202 SET_INT32(unique_id);
203 SET_INT64(timestamp_msec);
204 SET_BOOL(navigation_forward_back);
205 SET_BOOL(navigation_from_address_bar);
206 SET_BOOL(navigation_home_page);
207 SET_BOOL(navigation_chain_start);
208 SET_BOOL(navigation_chain_end);
209 SET_INT64(global_id);
210 SET_STR(search_terms);
211 SET_STR(favicon_url);
212 SET_ENUM(blocked_state, GetBlockedStateString);
213 SET_STR_REP(content_pack_categories);
214 SET_INT32(http_status_code);
215 SET_INT32(referrer_policy);
216 SET_BOOL(is_restored);
217 SET_REP(navigation_redirect, NavigationRedirectToValue);
218 SET_STR(last_navigation_redirect_url);
219 return value;
222 base::DictionaryValue* NavigationRedirectToValue(
223 const sync_pb::NavigationRedirect& proto) {
224 base::DictionaryValue* value = new base::DictionaryValue();
225 SET_STR(url);
226 return value;
229 base::DictionaryValue* PasswordSpecificsDataToValue(
230 const sync_pb::PasswordSpecificsData& proto) {
231 base::DictionaryValue* value = new base::DictionaryValue();
232 SET_INT32(scheme);
233 SET_STR(signon_realm);
234 SET_STR(origin);
235 SET_STR(action);
236 SET_STR(username_element);
237 SET_STR(username_value);
238 SET_STR(password_element);
239 value->SetString("password_value", "<redacted>");
240 SET_BOOL(ssl_valid);
241 SET_BOOL(preferred);
242 SET_INT64(date_created);
243 SET_BOOL(blacklisted);
244 SET_INT32(type);
245 SET_INT32(times_used);
246 return value;
249 base::DictionaryValue* GlobalIdDirectiveToValue(
250 const sync_pb::GlobalIdDirective& proto) {
251 base::DictionaryValue* value = new base::DictionaryValue();
252 SET_INT64_REP(global_id);
253 SET_INT64(start_time_usec);
254 SET_INT64(end_time_usec);
255 return value;
258 base::DictionaryValue* TimeRangeDirectiveToValue(
259 const sync_pb::TimeRangeDirective& proto) {
260 base::DictionaryValue* value = new base::DictionaryValue();
261 SET_INT64(start_time_usec);
262 SET_INT64(end_time_usec);
263 return value;
266 base::DictionaryValue* SyncedNotificationAppInfoToValue(
267 const sync_pb::SyncedNotificationAppInfo& proto) {
268 base::DictionaryValue* value = new base::DictionaryValue();
269 SET_STR_REP(app_id);
270 SET_STR(settings_display_name);
271 SET_STR(app_name);
272 SET_STR(settings_url);
273 SET_STR(info_url);
274 SET(icon, SyncedNotificationImageToValue);
275 // TODO(petewil): Add fields for the monochrome icon when it is available.
276 return value;
279 base::DictionaryValue* SyncedNotificationImageToValue(
280 const sync_pb::SyncedNotificationImage& proto) {
281 base::DictionaryValue* value = new base::DictionaryValue();
282 SET_STR(url);
283 SET_STR(alt_text);
284 SET_INT32(preferred_width);
285 SET_INT32(preferred_height);
286 return value;
289 base::DictionaryValue* SyncedNotificationProfileImageToValue(
290 const sync_pb::SyncedNotificationProfileImage& proto) {
291 base::DictionaryValue* value = new base::DictionaryValue();
292 SET_STR(image_url);
293 SET_STR(oid);
294 SET_STR(display_name);
295 return value;
298 base::DictionaryValue* MediaToValue(
299 const sync_pb::Media& proto) {
300 base::DictionaryValue* value = new base::DictionaryValue();
301 SET(image, SyncedNotificationImageToValue);
302 return value;
305 base::DictionaryValue* SyncedNotificationActionToValue(
306 const sync_pb::SyncedNotificationAction& proto) {
307 base::DictionaryValue* value = new base::DictionaryValue();
308 SET_STR(text);
309 SET(icon, SyncedNotificationImageToValue);
310 SET_STR(url);
311 SET_STR(request_data);
312 SET_STR(accessibility_label);
313 return value;
316 base::DictionaryValue* SyncedNotificationDestiationToValue(
317 const sync_pb::SyncedNotificationDestination& proto) {
318 base::DictionaryValue* value = new base::DictionaryValue();
319 SET_STR(text);
320 SET(icon, SyncedNotificationImageToValue);
321 SET_STR(url);
322 SET_STR(accessibility_label);
323 return value;
326 base::DictionaryValue* TargetToValue(
327 const sync_pb::Target& proto) {
328 base::DictionaryValue* value = new base::DictionaryValue();
329 SET(destination, SyncedNotificationDestiationToValue);
330 SET(action, SyncedNotificationActionToValue);
331 SET_STR(target_key);
332 return value;
335 base::DictionaryValue* SimpleCollapsedLayoutToValue(
336 const sync_pb::SimpleCollapsedLayout& proto) {
337 base::DictionaryValue* value = new base::DictionaryValue();
338 SET(app_icon, SyncedNotificationImageToValue);
339 SET_REP(profile_image, SyncedNotificationProfileImageToValue);
340 SET_STR(heading);
341 SET_STR(description);
342 SET_STR(annotation);
343 SET_REP(media, MediaToValue);
344 return value;
347 base::DictionaryValue* CollapsedInfoToValue(
348 const sync_pb::CollapsedInfo& proto) {
349 base::DictionaryValue* value = new base::DictionaryValue();
350 SET(simple_collapsed_layout, SimpleCollapsedLayoutToValue);
351 SET_INT64(creation_timestamp_usec);
352 SET(default_destination, SyncedNotificationDestiationToValue);
353 SET_REP(target, TargetToValue);
354 return value;
357 base::DictionaryValue* SyncedNotificationToValue(
358 const sync_pb::SyncedNotification& proto) {
359 base::DictionaryValue* value = new base::DictionaryValue();
360 SET_STR(type);
361 SET_STR(external_id);
362 // TODO(petewil) Add SyncedNotificationCreator here if we ever need it.
363 return value;
366 base::DictionaryValue* RenderInfoToValue(
367 const sync_pb::SyncedNotificationRenderInfo& proto) {
368 base::DictionaryValue* value = new base::DictionaryValue();
369 // TODO(petewil): Add the expanded info values once we start using them.
370 SET(collapsed_info, CollapsedInfoToValue);
371 return value;
374 base::DictionaryValue* CoalescedNotificationToValue(
375 const sync_pb::CoalescedSyncedNotification& proto) {
376 base::DictionaryValue* value = new base::DictionaryValue();
377 SET_STR(key);
378 SET_STR(app_id);
379 SET_REP(notification, SyncedNotificationToValue);
380 SET(render_info, RenderInfoToValue);
381 SET_INT32(read_state);
382 SET_INT64(creation_time_msec);
383 SET_INT32(priority);
384 return value;
387 base::DictionaryValue* AppListSpecificsToValue(
388 const sync_pb::AppListSpecifics& proto) {
389 base::DictionaryValue* value = new base::DictionaryValue();
390 SET_STR(item_id);
391 SET_ENUM(item_type, GetAppListItemTypeString);
392 SET_STR(item_name);
393 SET_STR(parent_id);
394 SET_STR(page_ordinal);
395 SET_STR(item_ordinal);
397 return value;
400 base::DictionaryValue* AppNotificationToValue(
401 const sync_pb::AppNotification& proto) {
402 base::DictionaryValue* value = new base::DictionaryValue();
403 SET_STR(guid);
404 SET_STR(app_id);
405 SET_INT64(creation_timestamp_ms);
406 SET_STR(title);
407 SET_STR(body_text);
408 SET_STR(link_url);
409 SET_STR(link_text);
410 return value;
413 base::DictionaryValue* AppSettingSpecificsToValue(
414 const sync_pb::AppSettingSpecifics& proto) {
415 base::DictionaryValue* value = new base::DictionaryValue();
416 SET(extension_setting, ExtensionSettingSpecificsToValue);
417 return value;
420 base::DictionaryValue* AppSpecificsToValue(
421 const sync_pb::AppSpecifics& proto) {
422 base::DictionaryValue* value = new base::DictionaryValue();
423 SET(extension, ExtensionSpecificsToValue);
424 SET(notification_settings, AppSettingsToValue);
425 SET_STR(app_launch_ordinal);
426 SET_STR(page_ordinal);
427 SET_ENUM(launch_type, GetLaunchTypeString);
428 SET_STR(bookmark_app_url);
429 SET_STR(bookmark_app_description);
431 return value;
434 base::DictionaryValue* AutofillSpecificsToValue(
435 const sync_pb::AutofillSpecifics& proto) {
436 base::DictionaryValue* value = new base::DictionaryValue();
437 SET_STR(name);
438 SET_STR(value);
439 SET_INT64_REP(usage_timestamp);
440 SET(profile, AutofillProfileSpecificsToValue);
441 return value;
444 base::DictionaryValue* AutofillProfileSpecificsToValue(
445 const sync_pb::AutofillProfileSpecifics& proto) {
446 base::DictionaryValue* value = new base::DictionaryValue();
447 SET_STR(guid);
448 SET_STR(origin);
450 SET_STR_REP(name_first);
451 SET_STR_REP(name_middle);
452 SET_STR_REP(name_last);
453 SET_STR_REP(name_full);
454 SET_STR_REP(email_address);
455 SET_STR(company_name);
457 SET_STR(address_home_line1);
458 SET_STR(address_home_line2);
459 SET_STR(address_home_city);
460 SET_STR(address_home_state);
461 SET_STR(address_home_zip);
462 SET_STR(address_home_country);
464 SET_STR(address_home_street_address);
465 SET_STR(address_home_sorting_code);
466 SET_STR(address_home_dependent_locality);
467 SET_STR(address_home_language_code);
469 SET_STR_REP(phone_home_whole_number);
470 return value;
473 base::DictionaryValue* MetaInfoToValue(
474 const sync_pb::MetaInfo& proto) {
475 base::DictionaryValue* value = new base::DictionaryValue();
476 SET_STR(key);
477 SET_STR(value);
478 return value;
481 base::DictionaryValue* BookmarkSpecificsToValue(
482 const sync_pb::BookmarkSpecifics& proto) {
483 base::DictionaryValue* value = new base::DictionaryValue();
484 SET_STR(url);
485 SET_BYTES(favicon);
486 SET_STR(title);
487 SET_INT64(creation_time_us);
488 SET_STR(icon_url);
489 SET_REP(meta_info, &MetaInfoToValue);
490 return value;
493 base::DictionaryValue* DeviceInfoSpecificsToValue(
494 const sync_pb::DeviceInfoSpecifics& proto) {
495 base::DictionaryValue* value = new base::DictionaryValue();
496 SET_STR(cache_guid);
497 SET_STR(client_name);
498 SET_ENUM(device_type, GetDeviceTypeString);
499 SET_STR(sync_user_agent);
500 SET_STR(chrome_version);
501 SET_TIME_STR(backup_timestamp);
502 SET_STR(signin_scoped_device_id);
503 return value;
506 base::DictionaryValue* DictionarySpecificsToValue(
507 const sync_pb::DictionarySpecifics& proto) {
508 base::DictionaryValue* value = new base::DictionaryValue();
509 SET_STR(word);
510 return value;
513 namespace {
515 base::DictionaryValue* FaviconSyncFlagsToValue(
516 const sync_pb::FaviconSyncFlags& proto) {
517 base::DictionaryValue* value = new base::DictionaryValue();
518 SET_BOOL(enabled);
519 SET_INT32(favicon_sync_limit);
520 return value;
523 base::DictionaryValue* EnhancedBookmarksFlagsToValue(
524 const sync_pb::EnhancedBookmarksFlags& proto) {
525 base::DictionaryValue* value = new base::DictionaryValue();
526 SET_BOOL(enabled);
527 SET_STR(extension_id);
528 return value;
531 } // namespace
533 base::DictionaryValue* ExperimentsSpecificsToValue(
534 const sync_pb::ExperimentsSpecifics& proto) {
535 base::DictionaryValue* value = new base::DictionaryValue();
536 SET_EXPERIMENT_ENABLED_FIELD(keystore_encryption);
537 SET_EXPERIMENT_ENABLED_FIELD(history_delete_directives);
538 SET_EXPERIMENT_ENABLED_FIELD(autofill_culling);
539 SET_EXPERIMENT_ENABLED_FIELD(pre_commit_update_avoidance);
540 SET(favicon_sync, FaviconSyncFlagsToValue);
541 SET_EXPERIMENT_ENABLED_FIELD(gcm_channel);
542 SET(enhanced_bookmarks, EnhancedBookmarksFlagsToValue);
543 SET_EXPERIMENT_ENABLED_FIELD(gcm_invalidations);
544 return value;
547 base::DictionaryValue* ExtensionSettingSpecificsToValue(
548 const sync_pb::ExtensionSettingSpecifics& proto) {
549 base::DictionaryValue* value = new base::DictionaryValue();
550 SET_STR(extension_id);
551 SET_STR(key);
552 SET_STR(value);
553 return value;
556 base::DictionaryValue* ExtensionSpecificsToValue(
557 const sync_pb::ExtensionSpecifics& proto) {
558 base::DictionaryValue* value = new base::DictionaryValue();
559 SET_STR(id);
560 SET_STR(version);
561 SET_STR(update_url);
562 SET_BOOL(enabled);
563 SET_BOOL(incognito_enabled);
564 SET_BOOL(remote_install);
565 SET_BOOL(installed_by_custodian);
566 SET_STR(name);
567 return value;
570 namespace {
571 base::DictionaryValue* FaviconDataToValue(
572 const sync_pb::FaviconData& proto) {
573 base::DictionaryValue* value = new base::DictionaryValue();
574 SET_BYTES(favicon);
575 SET_INT32(width);
576 SET_INT32(height);
577 return value;
579 } // namespace
581 base::DictionaryValue* FaviconImageSpecificsToValue(
582 const sync_pb::FaviconImageSpecifics& proto) {
583 base::DictionaryValue* value = new base::DictionaryValue();
584 SET_STR(favicon_url);
585 SET(favicon_web, FaviconDataToValue);
586 SET(favicon_web_32, FaviconDataToValue);
587 SET(favicon_touch_64, FaviconDataToValue);
588 SET(favicon_touch_precomposed_64, FaviconDataToValue);
589 return value;
592 base::DictionaryValue* FaviconTrackingSpecificsToValue(
593 const sync_pb::FaviconTrackingSpecifics& proto) {
594 base::DictionaryValue* value = new base::DictionaryValue();
595 SET_STR(favicon_url);
596 SET_INT64(last_visit_time_ms)
597 SET_BOOL(is_bookmarked);
598 return value;
601 base::DictionaryValue* HistoryDeleteDirectiveSpecificsToValue(
602 const sync_pb::HistoryDeleteDirectiveSpecifics& proto) {
603 base::DictionaryValue* value = new base::DictionaryValue();
604 SET(global_id_directive, GlobalIdDirectiveToValue);
605 SET(time_range_directive, TimeRangeDirectiveToValue);
606 return value;
609 base::DictionaryValue* ManagedUserSettingSpecificsToValue(
610 const sync_pb::ManagedUserSettingSpecifics& proto) {
611 base::DictionaryValue* value = new base::DictionaryValue();
612 SET_STR(name);
613 SET_STR(value);
614 return value;
617 base::DictionaryValue* ManagedUserSpecificsToValue(
618 const sync_pb::ManagedUserSpecifics& proto) {
619 base::DictionaryValue* value = new base::DictionaryValue();
620 SET_STR(id);
621 SET_STR(name);
622 SET_BOOL(acknowledged);
623 SET_STR(master_key);
624 SET_STR(chrome_avatar);
625 SET_STR(chromeos_avatar);
626 return value;
629 base::DictionaryValue* ManagedUserSharedSettingSpecificsToValue(
630 const sync_pb::ManagedUserSharedSettingSpecifics& proto) {
631 base::DictionaryValue* value = new base::DictionaryValue();
632 SET_STR(mu_id);
633 SET_STR(key);
634 SET_STR(value);
635 SET_BOOL(acknowledged);
636 return value;
639 base::DictionaryValue* NigoriSpecificsToValue(
640 const sync_pb::NigoriSpecifics& proto) {
641 base::DictionaryValue* value = new base::DictionaryValue();
642 SET(encryption_keybag, EncryptedDataToValue);
643 SET_BOOL(keybag_is_frozen);
644 SET_BOOL(encrypt_bookmarks);
645 SET_BOOL(encrypt_preferences);
646 SET_BOOL(encrypt_autofill_profile);
647 SET_BOOL(encrypt_autofill);
648 SET_BOOL(encrypt_themes);
649 SET_BOOL(encrypt_typed_urls);
650 SET_BOOL(encrypt_extension_settings);
651 SET_BOOL(encrypt_extensions);
652 SET_BOOL(encrypt_sessions);
653 SET_BOOL(encrypt_app_settings);
654 SET_BOOL(encrypt_apps);
655 SET_BOOL(encrypt_search_engines);
656 SET_BOOL(encrypt_dictionary);
657 SET_BOOL(encrypt_articles);
658 SET_BOOL(encrypt_app_list);
659 SET_BOOL(encrypt_everything);
660 SET_BOOL(sync_tab_favicons);
661 SET_ENUM(passphrase_type, PassphraseTypeString);
662 SET(keystore_decryptor_token, EncryptedDataToValue);
663 SET_INT64(keystore_migration_time);
664 SET_INT64(custom_passphrase_time);
665 return value;
668 base::DictionaryValue* ArticlePageToValue(
669 const sync_pb::ArticlePage& proto) {
670 base::DictionaryValue* value = new base::DictionaryValue();
671 SET_STR(url);
672 return value;
675 base::DictionaryValue* ArticleSpecificsToValue(
676 const sync_pb::ArticleSpecifics& proto) {
677 base::DictionaryValue* value = new base::DictionaryValue();
678 SET_STR(entry_id);
679 SET_STR(title);
680 SET_REP(pages, ArticlePageToValue);
681 return value;
684 base::DictionaryValue* PasswordSpecificsToValue(
685 const sync_pb::PasswordSpecifics& proto) {
686 base::DictionaryValue* value = new base::DictionaryValue();
687 SET(encrypted, EncryptedDataToValue);
688 return value;
691 base::DictionaryValue* PreferenceSpecificsToValue(
692 const sync_pb::PreferenceSpecifics& proto) {
693 base::DictionaryValue* value = new base::DictionaryValue();
694 SET_STR(name);
695 SET_STR(value);
696 return value;
699 base::DictionaryValue* PriorityPreferenceSpecificsToValue(
700 const sync_pb::PriorityPreferenceSpecifics& specifics) {
701 base::DictionaryValue* value = new base::DictionaryValue();
702 SET_FIELD(preference, PreferenceSpecificsToValue);
703 return value;
706 base::DictionaryValue* SyncedNotificationAppInfoSpecificsToValue(
707 const sync_pb::SyncedNotificationAppInfoSpecifics& proto) {
708 base::DictionaryValue* value = new base::DictionaryValue();
709 SET_REP(synced_notification_app_info, SyncedNotificationAppInfoToValue);
710 return value;
713 base::DictionaryValue* SyncedNotificationSpecificsToValue(
714 const sync_pb::SyncedNotificationSpecifics& proto) {
715 // There is a lot of data, for now just use heading, description, key, and
716 // the read state.
717 // TODO(petewil): Eventually add more data here.
718 base::DictionaryValue* value = new base::DictionaryValue();
719 SET(coalesced_notification, CoalescedNotificationToValue);
720 return value;
723 base::DictionaryValue* SearchEngineSpecificsToValue(
724 const sync_pb::SearchEngineSpecifics& proto) {
725 base::DictionaryValue* value = new base::DictionaryValue();
726 SET_STR(short_name);
727 SET_STR(keyword);
728 SET_STR(favicon_url);
729 SET_STR(url);
730 SET_BOOL(safe_for_autoreplace);
731 SET_STR(originating_url);
732 SET_INT64(date_created);
733 SET_STR(input_encodings);
734 SET_BOOL(show_in_default_list);
735 SET_STR(suggestions_url);
736 SET_INT32(prepopulate_id);
737 SET_BOOL(autogenerate_keyword);
738 SET_STR(instant_url);
739 SET_INT64(last_modified);
740 SET_STR(sync_guid);
741 SET_STR_REP(alternate_urls);
742 SET_STR(search_terms_replacement_key);
743 SET_STR(image_url);
744 SET_STR(search_url_post_params);
745 SET_STR(suggestions_url_post_params);
746 SET_STR(instant_url_post_params);
747 SET_STR(image_url_post_params);
748 SET_STR(new_tab_url);
749 return value;
752 base::DictionaryValue* SessionSpecificsToValue(
753 const sync_pb::SessionSpecifics& proto) {
754 base::DictionaryValue* value = new base::DictionaryValue();
755 SET_STR(session_tag);
756 SET(header, SessionHeaderToValue);
757 SET(tab, SessionTabToValue);
758 SET_INT32(tab_node_id);
759 return value;
762 base::DictionaryValue* ThemeSpecificsToValue(
763 const sync_pb::ThemeSpecifics& proto) {
764 base::DictionaryValue* value = new base::DictionaryValue();
765 SET_BOOL(use_custom_theme);
766 SET_BOOL(use_system_theme_by_default);
767 SET_STR(custom_theme_name);
768 SET_STR(custom_theme_id);
769 SET_STR(custom_theme_update_url);
770 return value;
773 base::DictionaryValue* TypedUrlSpecificsToValue(
774 const sync_pb::TypedUrlSpecifics& proto) {
775 base::DictionaryValue* value = new base::DictionaryValue();
776 SET_STR(url);
777 SET_STR(title);
778 SET_BOOL(hidden);
779 SET_INT64_REP(visits);
780 SET_INT32_REP(visit_transitions);
781 return value;
784 base::DictionaryValue* EntitySpecificsToValue(
785 const sync_pb::EntitySpecifics& specifics) {
786 base::DictionaryValue* value = new base::DictionaryValue();
787 SET_FIELD(app, AppSpecificsToValue);
788 SET_FIELD(app_list, AppListSpecificsToValue);
789 SET_FIELD(app_notification, AppNotificationToValue);
790 SET_FIELD(app_setting, AppSettingSpecificsToValue);
791 SET_FIELD(article, ArticleSpecificsToValue);
792 SET_FIELD(autofill, AutofillSpecificsToValue);
793 SET_FIELD(autofill_profile, AutofillProfileSpecificsToValue);
794 SET_FIELD(bookmark, BookmarkSpecificsToValue);
795 SET_FIELD(device_info, DeviceInfoSpecificsToValue);
796 SET_FIELD(dictionary, DictionarySpecificsToValue);
797 SET_FIELD(experiments, ExperimentsSpecificsToValue);
798 SET_FIELD(extension, ExtensionSpecificsToValue);
799 SET_FIELD(extension_setting, ExtensionSettingSpecificsToValue);
800 SET_FIELD(favicon_image, FaviconImageSpecificsToValue);
801 SET_FIELD(favicon_tracking, FaviconTrackingSpecificsToValue);
802 SET_FIELD(history_delete_directive, HistoryDeleteDirectiveSpecificsToValue);
803 SET_FIELD(managed_user_setting, ManagedUserSettingSpecificsToValue);
804 SET_FIELD(managed_user_shared_setting,
805 ManagedUserSharedSettingSpecificsToValue);
806 SET_FIELD(managed_user, ManagedUserSpecificsToValue);
807 SET_FIELD(nigori, NigoriSpecificsToValue);
808 SET_FIELD(password, PasswordSpecificsToValue);
809 SET_FIELD(preference, PreferenceSpecificsToValue);
810 SET_FIELD(priority_preference, PriorityPreferenceSpecificsToValue);
811 SET_FIELD(search_engine, SearchEngineSpecificsToValue);
812 SET_FIELD(session, SessionSpecificsToValue);
813 SET_FIELD(synced_notification, SyncedNotificationSpecificsToValue);
814 SET_FIELD(synced_notification_app_info,
815 SyncedNotificationAppInfoSpecificsToValue);
816 SET_FIELD(theme, ThemeSpecificsToValue);
817 SET_FIELD(typed_url, TypedUrlSpecificsToValue);
818 return value;
821 namespace {
823 base::StringValue* UniquePositionToStringValue(
824 const sync_pb::UniquePosition& proto) {
825 UniquePosition pos = UniquePosition::FromProto(proto);
826 return new base::StringValue(pos.ToDebugString());
829 } // namespace
831 base::DictionaryValue* SyncEntityToValue(const sync_pb::SyncEntity& proto,
832 bool include_specifics) {
833 base::DictionaryValue* value = new base::DictionaryValue();
834 SET_STR(id_string);
835 SET_STR(parent_id_string);
836 SET_STR(old_parent_id);
837 SET_INT64(version);
838 SET_INT64(mtime);
839 SET_INT64(ctime);
840 SET_STR(name);
841 SET_STR(non_unique_name);
842 SET_INT64(sync_timestamp);
843 SET_STR(server_defined_unique_tag);
844 SET_INT64(position_in_parent);
845 SET(unique_position, UniquePositionToStringValue);
846 SET_STR(insert_after_item_id);
847 SET_BOOL(deleted);
848 SET_STR(originator_cache_guid);
849 SET_STR(originator_client_item_id);
850 if (include_specifics)
851 SET(specifics, EntitySpecificsToValue);
852 SET_BOOL(folder);
853 SET_STR(client_defined_unique_tag);
854 SET_REP(attachment_id, AttachmentIdProtoToValue);
855 return value;
858 namespace {
860 base::ListValue* SyncEntitiesToValue(
861 const ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities,
862 bool include_specifics) {
863 base::ListValue* list = new base::ListValue();
864 ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>::const_iterator it;
865 for (it = entities.begin(); it != entities.end(); ++it) {
866 list->Append(SyncEntityToValue(*it, include_specifics));
869 return list;
872 base::DictionaryValue* ChromiumExtensionActivityToValue(
873 const sync_pb::ChromiumExtensionsActivity& proto) {
874 base::DictionaryValue* value = new base::DictionaryValue();
875 SET_STR(extension_id);
876 SET_INT32(bookmark_writes_since_last_commit);
877 return value;
880 base::DictionaryValue* CommitMessageToValue(
881 const sync_pb::CommitMessage& proto,
882 bool include_specifics) {
883 base::DictionaryValue* value = new base::DictionaryValue();
884 value->Set("entries",
885 SyncEntitiesToValue(proto.entries(), include_specifics));
886 SET_STR(cache_guid);
887 SET_REP(extensions_activity, ChromiumExtensionActivityToValue);
888 SET(config_params, ClientConfigParamsToValue);
889 return value;
892 base::DictionaryValue* GetUpdateTriggersToValue(
893 const sync_pb::GetUpdateTriggers& proto) {
894 base::DictionaryValue* value = new base::DictionaryValue();
895 SET_STR_REP(notification_hint);
896 SET_BOOL(client_dropped_hints);
897 SET_BOOL(invalidations_out_of_sync);
898 SET_INT64(local_modification_nudges);
899 SET_INT64(datatype_refresh_nudges);
900 return value;
903 base::DictionaryValue* DataTypeProgressMarkerToValue(
904 const sync_pb::DataTypeProgressMarker& proto) {
905 base::DictionaryValue* value = new base::DictionaryValue();
906 SET_INT32(data_type_id);
907 SET_BYTES(token);
908 SET_INT64(timestamp_token_for_migration);
909 SET_STR(notification_hint);
910 SET(get_update_triggers, GetUpdateTriggersToValue);
911 return value;
914 base::DictionaryValue* DataTypeContextToValue(
915 const sync_pb::DataTypeContext& proto) {
916 base::DictionaryValue* value = new base::DictionaryValue();
917 SET_INT32(data_type_id);
918 SET_STR(context);
919 SET_INT64(version);
920 return value;
923 base::DictionaryValue* GetUpdatesCallerInfoToValue(
924 const sync_pb::GetUpdatesCallerInfo& proto) {
925 base::DictionaryValue* value = new base::DictionaryValue();
926 SET_ENUM(source, GetUpdatesSourceString);
927 SET_BOOL(notifications_enabled);
928 return value;
931 base::DictionaryValue* GetUpdatesMessageToValue(
932 const sync_pb::GetUpdatesMessage& proto) {
933 base::DictionaryValue* value = new base::DictionaryValue();
934 SET(caller_info, GetUpdatesCallerInfoToValue);
935 SET_BOOL(fetch_folders);
936 SET_INT32(batch_size);
937 SET_REP(from_progress_marker, DataTypeProgressMarkerToValue);
938 SET_BOOL(streaming);
939 SET_BOOL(need_encryption_key);
940 SET_BOOL(create_mobile_bookmarks_folder);
941 SET_ENUM(get_updates_origin, GetUpdatesOriginString);
942 SET_REP(client_contexts, DataTypeContextToValue);
943 return value;
946 base::DictionaryValue* ClientStatusToValue(const sync_pb::ClientStatus& proto) {
947 base::DictionaryValue* value = new base::DictionaryValue();
948 SET_BOOL(hierarchy_conflict_detected);
949 return value;
952 base::DictionaryValue* EntryResponseToValue(
953 const sync_pb::CommitResponse::EntryResponse& proto) {
954 base::DictionaryValue* value = new base::DictionaryValue();
955 SET_ENUM(response_type, GetResponseTypeString);
956 SET_STR(id_string);
957 SET_STR(parent_id_string);
958 SET_INT64(position_in_parent);
959 SET_INT64(version);
960 SET_STR(name);
961 SET_STR(error_message);
962 SET_INT64(mtime);
963 return value;
966 base::DictionaryValue* CommitResponseToValue(
967 const sync_pb::CommitResponse& proto) {
968 base::DictionaryValue* value = new base::DictionaryValue();
969 SET_REP(entryresponse, EntryResponseToValue);
970 return value;
973 base::DictionaryValue* GetUpdatesResponseToValue(
974 const sync_pb::GetUpdatesResponse& proto,
975 bool include_specifics) {
976 base::DictionaryValue* value = new base::DictionaryValue();
977 value->Set("entries",
978 SyncEntitiesToValue(proto.entries(), include_specifics));
979 SET_INT64(changes_remaining);
980 SET_REP(new_progress_marker, DataTypeProgressMarkerToValue);
981 SET_REP(context_mutations, DataTypeContextToValue);
982 return value;
985 base::DictionaryValue* ClientCommandToValue(
986 const sync_pb::ClientCommand& proto) {
987 base::DictionaryValue* value = new base::DictionaryValue();
988 SET_INT32(set_sync_poll_interval);
989 SET_INT32(set_sync_long_poll_interval);
990 SET_INT32(max_commit_batch_size);
991 SET_INT32(sessions_commit_delay_seconds);
992 SET_INT32(throttle_delay_seconds);
993 SET_INT32(client_invalidation_hint_buffer_size);
994 return value;
997 base::DictionaryValue* ErrorToValue(
998 const sync_pb::ClientToServerResponse::Error& proto) {
999 base::DictionaryValue* value = new base::DictionaryValue();
1000 SET_ENUM(error_type, GetErrorTypeString);
1001 SET_STR(error_description);
1002 SET_STR(url);
1003 SET_ENUM(action, GetActionString);
1004 return value;
1007 } // namespace
1009 base::DictionaryValue* ClientToServerResponseToValue(
1010 const sync_pb::ClientToServerResponse& proto,
1011 bool include_specifics) {
1012 base::DictionaryValue* value = new base::DictionaryValue();
1013 SET(commit, CommitResponseToValue);
1014 if (proto.has_get_updates()) {
1015 value->Set("get_updates", GetUpdatesResponseToValue(proto.get_updates(),
1016 include_specifics));
1019 SET(error, ErrorToValue);
1020 SET_ENUM(error_code, GetErrorTypeString);
1021 SET_STR(error_message);
1022 SET_STR(store_birthday);
1023 SET(client_command, ClientCommandToValue);
1024 SET_INT32_REP(migrated_data_type_id);
1025 return value;
1028 base::DictionaryValue* ClientToServerMessageToValue(
1029 const sync_pb::ClientToServerMessage& proto,
1030 bool include_specifics) {
1031 base::DictionaryValue* value = new base::DictionaryValue();
1032 SET_STR(share);
1033 SET_INT32(protocol_version);
1034 if (proto.has_commit()) {
1035 value->Set("commit",
1036 CommitMessageToValue(proto.commit(), include_specifics));
1039 SET(get_updates, GetUpdatesMessageToValue);
1040 SET_STR(store_birthday);
1041 SET_BOOL(sync_problem_detected);
1042 SET(debug_info, DebugInfoToValue);
1043 SET(client_status, ClientStatusToValue);
1044 return value;
1047 base::DictionaryValue* DatatypeAssociationStatsToValue(
1048 const sync_pb::DatatypeAssociationStats& proto) {
1049 base::DictionaryValue* value = new base::DictionaryValue();
1050 SET_INT32(data_type_id);
1051 SET_INT32(num_local_items_before_association);
1052 SET_INT32(num_sync_items_before_association);
1053 SET_INT32(num_local_items_after_association);
1054 SET_INT32(num_sync_items_after_association);
1055 SET_INT32(num_local_items_added);
1056 SET_INT32(num_local_items_deleted);
1057 SET_INT32(num_local_items_modified);
1058 SET_INT32(num_sync_items_added);
1059 SET_INT32(num_sync_items_deleted);
1060 SET_INT32(num_sync_items_modified);
1061 SET_INT64(local_version_pre_association);
1062 SET_INT64(sync_version_pre_association)
1063 SET_BOOL(had_error);
1064 SET_INT64(download_wait_time_us);
1065 SET_INT64(download_time_us);
1066 SET_INT64(association_wait_time_for_high_priority_us);
1067 SET_INT64(association_wait_time_for_same_priority_us);
1068 return value;
1071 base::DictionaryValue* DebugEventInfoToValue(
1072 const sync_pb::DebugEventInfo& proto) {
1073 base::DictionaryValue* value = new base::DictionaryValue();
1074 SET_ENUM(singleton_event, SingletonDebugEventTypeString);
1075 SET(sync_cycle_completed_event_info, SyncCycleCompletedEventInfoToValue);
1076 SET_INT32(nudging_datatype);
1077 SET_INT32_REP(datatypes_notified_from_server);
1078 SET(datatype_association_stats, DatatypeAssociationStatsToValue);
1079 return value;
1082 base::DictionaryValue* DebugInfoToValue(const sync_pb::DebugInfo& proto) {
1083 base::DictionaryValue* value = new base::DictionaryValue();
1084 SET_REP(events, DebugEventInfoToValue);
1085 SET_BOOL(cryptographer_ready);
1086 SET_BOOL(cryptographer_has_pending_keys);
1087 SET_BOOL(events_dropped);
1088 return value;
1091 base::DictionaryValue* SyncCycleCompletedEventInfoToValue(
1092 const sync_pb::SyncCycleCompletedEventInfo& proto) {
1093 base::DictionaryValue* value = new base::DictionaryValue();
1094 SET_INT32(num_encryption_conflicts);
1095 SET_INT32(num_hierarchy_conflicts);
1096 SET_INT32(num_server_conflicts);
1097 SET_INT32(num_updates_downloaded);
1098 SET_INT32(num_reflected_updates_downloaded);
1099 SET(caller_info, GetUpdatesCallerInfoToValue);
1100 return value;
1103 base::DictionaryValue* ClientConfigParamsToValue(
1104 const sync_pb::ClientConfigParams& proto) {
1105 base::DictionaryValue* value = new base::DictionaryValue();
1106 SET_INT32_REP(enabled_type_ids);
1107 SET_BOOL(tabs_datatype_enabled);
1108 return value;
1111 base::DictionaryValue* AttachmentIdProtoToValue(
1112 const sync_pb::AttachmentIdProto& proto) {
1113 base::DictionaryValue* value = new base::DictionaryValue();
1114 SET_STR(unique_id);
1115 return value;
1118 #undef SET
1119 #undef SET_REP
1121 #undef SET_BOOL
1122 #undef SET_BYTES
1123 #undef SET_INT32
1124 #undef SET_INT64
1125 #undef SET_INT64_REP
1126 #undef SET_STR
1127 #undef SET_STR_REP
1129 #undef SET_FIELD
1131 } // namespace syncer