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"
11 #include "base/base64.h"
12 #include "base/basictypes.h"
13 #include "base/logging.h"
14 #include "base/strings/string_number_conversions.h"
15 #include "base/values.h"
16 #include "sync/internal_api/public/base/unique_position.h"
17 #include "sync/protocol/app_list_specifics.pb.h"
18 #include "sync/protocol/app_notification_specifics.pb.h"
19 #include "sync/protocol/app_setting_specifics.pb.h"
20 #include "sync/protocol/app_specifics.pb.h"
21 #include "sync/protocol/autofill_specifics.pb.h"
22 #include "sync/protocol/bookmark_specifics.pb.h"
23 #include "sync/protocol/dictionary_specifics.pb.h"
24 #include "sync/protocol/encryption.pb.h"
25 #include "sync/protocol/experiments_specifics.pb.h"
26 #include "sync/protocol/extension_setting_specifics.pb.h"
27 #include "sync/protocol/extension_specifics.pb.h"
28 #include "sync/protocol/favicon_image_specifics.pb.h"
29 #include "sync/protocol/favicon_tracking_specifics.pb.h"
30 #include "sync/protocol/history_delete_directive_specifics.pb.h"
31 #include "sync/protocol/nigori_specifics.pb.h"
32 #include "sync/protocol/password_specifics.pb.h"
33 #include "sync/protocol/preference_specifics.pb.h"
34 #include "sync/protocol/priority_preference_specifics.pb.h"
35 #include "sync/protocol/proto_enum_conversions.h"
36 #include "sync/protocol/search_engine_specifics.pb.h"
37 #include "sync/protocol/session_specifics.pb.h"
38 #include "sync/protocol/sync.pb.h"
39 #include "sync/protocol/synced_notification_app_info_specifics.pb.h"
40 #include "sync/protocol/synced_notification_specifics.pb.h"
41 #include "sync/protocol/theme_specifics.pb.h"
42 #include "sync/protocol/typed_url_specifics.pb.h"
43 #include "sync/protocol/unique_position.pb.h"
49 // Basic Type -> Value functions.
51 base::StringValue* MakeInt64Value(int64 x) {
52 return new base::StringValue(base::Int64ToString(x));
55 // TODO(akalin): Perhaps make JSONWriter support BinaryValue and use
56 // that instead of a StringValue.
57 base::StringValue* MakeBytesValue(const std::string& bytes) {
58 std::string bytes_base64;
59 base::Base64Encode(bytes, &bytes_base64);
60 return new base::StringValue(bytes_base64);
63 base::StringValue* MakeStringValue(const std::string& str) {
64 return new base::StringValue(str);
67 // T is the enum type.
69 base::StringValue* MakeEnumValue(T t, const char* (*converter_fn)(T)) {
70 return new base::StringValue(converter_fn(t));
73 // T is the field type, F is either RepeatedField or RepeatedPtrField,
74 // and V is a subclass of Value.
75 template <class T, class F, class V>
76 base::ListValue* MakeRepeatedValue(const F& fields, V* (*converter_fn)(T)) {
77 base::ListValue* list = new base::ListValue();
78 for (typename F::const_iterator it = fields.begin(); it != fields.end();
80 list->Append(converter_fn(*it));
87 // Helper macros to reduce the amount of boilerplate.
89 #define SET(field, fn) \
90 if (proto.has_##field()) { \
91 value->Set(#field, fn(proto.field())); \
93 #define SET_REP(field, fn) \
94 value->Set(#field, MakeRepeatedValue(proto.field(), fn))
95 #define SET_ENUM(field, fn) \
96 value->Set(#field, MakeEnumValue(proto.field(), fn))
98 #define SET_BOOL(field) SET(field, new base::FundamentalValue)
99 #define SET_BYTES(field) SET(field, MakeBytesValue)
100 #define SET_INT32(field) SET(field, MakeInt64Value)
101 #define SET_INT32_REP(field) SET_REP(field, MakeInt64Value)
102 #define SET_INT64(field) SET(field, MakeInt64Value)
103 #define SET_INT64_REP(field) SET_REP(field, MakeInt64Value)
104 #define SET_STR(field) SET(field, new base::StringValue)
105 #define SET_STR_REP(field) \
107 MakeRepeatedValue<const std::string&, \
108 google::protobuf::RepeatedPtrField< \
110 base::StringValue>(proto.field(), \
112 #define SET_EXPERIMENT_ENABLED_FIELD(field) \
114 if (proto.has_##field() && \
115 proto.field().has_enabled()) { \
117 new base::FundamentalValue( \
118 proto.field().enabled())); \
122 #define SET_FIELD(field, fn) \
124 if (specifics.has_##field()) { \
125 value->Set(#field, fn(specifics.field())); \
129 // If you add another macro, don't forget to add an #undef at the end
130 // of this file, too.
132 base::DictionaryValue* EncryptedDataToValue(
133 const sync_pb::EncryptedData& proto) {
134 base::DictionaryValue* value = new base::DictionaryValue();
136 // TODO(akalin): Shouldn't blob be of type bytes instead of string?
141 base::DictionaryValue* AppSettingsToValue(
142 const sync_pb::AppNotificationSettings& proto) {
143 base::DictionaryValue* value = new base::DictionaryValue();
144 SET_BOOL(initial_setup_done);
146 SET_STR(oauth_client_id);
150 base::DictionaryValue* SessionHeaderToValue(
151 const sync_pb::SessionHeader& proto) {
152 base::DictionaryValue* value = new base::DictionaryValue();
153 SET_REP(window, SessionWindowToValue);
154 SET_STR(client_name);
155 SET_ENUM(device_type, GetDeviceTypeString);
159 base::DictionaryValue* SessionTabToValue(const sync_pb::SessionTab& proto) {
160 base::DictionaryValue* value = new base::DictionaryValue();
162 SET_INT32(window_id);
163 SET_INT32(tab_visual_index);
164 SET_INT32(current_navigation_index);
166 SET_STR(extension_app_id);
167 SET_REP(navigation, TabNavigationToValue);
169 SET_ENUM(favicon_type, GetFaviconTypeString);
170 SET_STR(favicon_source);
174 base::DictionaryValue* SessionWindowToValue(
175 const sync_pb::SessionWindow& proto) {
176 base::DictionaryValue* value = new base::DictionaryValue();
177 SET_INT32(window_id);
178 SET_INT32(selected_tab_index);
180 SET_ENUM(browser_type, GetBrowserTypeString);
184 base::DictionaryValue* TabNavigationToValue(
185 const sync_pb::TabNavigation& proto) {
186 base::DictionaryValue* value = new base::DictionaryValue();
187 SET_STR(virtual_url);
191 SET_ENUM(page_transition, GetPageTransitionString);
192 SET_ENUM(redirect_type, GetPageTransitionRedirectTypeString);
193 SET_INT32(unique_id);
194 SET_INT64(timestamp_msec);
195 SET_BOOL(navigation_forward_back);
196 SET_BOOL(navigation_from_address_bar);
197 SET_BOOL(navigation_home_page);
198 SET_BOOL(navigation_chain_start);
199 SET_BOOL(navigation_chain_end);
200 SET_INT64(global_id);
201 SET_STR(search_terms);
202 SET_STR(favicon_url);
203 SET_ENUM(blocked_state, GetBlockedStateString);
204 SET_STR_REP(content_pack_categories);
205 SET_INT32(http_status_code);
206 SET_INT32(referrer_policy);
207 SET_BOOL(is_restored);
211 base::DictionaryValue* PasswordSpecificsDataToValue(
212 const sync_pb::PasswordSpecificsData& proto) {
213 base::DictionaryValue* value = new base::DictionaryValue();
215 SET_STR(signon_realm);
218 SET_STR(username_element);
219 SET_STR(username_value);
220 SET_STR(password_element);
221 value->SetString("password_value", "<redacted>");
224 SET_INT64(date_created);
225 SET_BOOL(blacklisted);
229 base::DictionaryValue* GlobalIdDirectiveToValue(
230 const sync_pb::GlobalIdDirective& proto) {
231 base::DictionaryValue* value = new base::DictionaryValue();
232 SET_INT64_REP(global_id);
233 SET_INT64(start_time_usec);
234 SET_INT64(end_time_usec);
238 base::DictionaryValue* TimeRangeDirectiveToValue(
239 const sync_pb::TimeRangeDirective& proto) {
240 base::DictionaryValue* value = new base::DictionaryValue();
241 SET_INT64(start_time_usec);
242 SET_INT64(end_time_usec);
246 base::DictionaryValue* SyncedNotificationAppInfoToValue(
247 const sync_pb::SyncedNotificationAppInfo& proto) {
248 base::DictionaryValue* value = new base::DictionaryValue();
250 SET_STR(settings_display_name);
251 SET(icon, SyncedNotificationImageToValue);
252 // TODO(petewil): Add fields for the monochrome icon when it is available.
256 base::DictionaryValue* SyncedNotificationImageToValue(
257 const sync_pb::SyncedNotificationImage& proto) {
258 base::DictionaryValue* value = new base::DictionaryValue();
261 SET_INT32(preferred_width);
262 SET_INT32(preferred_height);
266 base::DictionaryValue* SyncedNotificationProfileImageToValue(
267 const sync_pb::SyncedNotificationProfileImage& proto) {
268 base::DictionaryValue* value = new base::DictionaryValue();
271 SET_STR(display_name);
275 base::DictionaryValue* MediaToValue(
276 const sync_pb::Media& proto) {
277 base::DictionaryValue* value = new base::DictionaryValue();
278 SET(image, SyncedNotificationImageToValue);
282 base::DictionaryValue* SyncedNotificationActionToValue(
283 const sync_pb::SyncedNotificationAction& proto) {
284 base::DictionaryValue* value = new base::DictionaryValue();
286 SET(icon, SyncedNotificationImageToValue);
288 SET_STR(request_data);
289 SET_STR(accessibility_label);
293 base::DictionaryValue* SyncedNotificationDestiationToValue(
294 const sync_pb::SyncedNotificationDestination& proto) {
295 base::DictionaryValue* value = new base::DictionaryValue();
297 SET(icon, SyncedNotificationImageToValue);
299 SET_STR(accessibility_label);
303 base::DictionaryValue* TargetToValue(
304 const sync_pb::Target& proto) {
305 base::DictionaryValue* value = new base::DictionaryValue();
306 SET(destination, SyncedNotificationDestiationToValue);
307 SET(action, SyncedNotificationActionToValue);
312 base::DictionaryValue* SimpleCollapsedLayoutToValue(
313 const sync_pb::SimpleCollapsedLayout& proto) {
314 base::DictionaryValue* value = new base::DictionaryValue();
315 SET(app_icon, SyncedNotificationImageToValue);
316 SET_REP(profile_image, SyncedNotificationProfileImageToValue);
318 SET_STR(description);
320 SET_REP(media, MediaToValue);
324 base::DictionaryValue* CollapsedInfoToValue(
325 const sync_pb::CollapsedInfo& proto) {
326 base::DictionaryValue* value = new base::DictionaryValue();
327 SET(simple_collapsed_layout, SimpleCollapsedLayoutToValue);
328 SET_INT64(creation_timestamp_usec);
329 SET(default_destination, SyncedNotificationDestiationToValue);
330 SET_REP(target, TargetToValue);
334 base::DictionaryValue* SyncedNotificationToValue(
335 const sync_pb::SyncedNotification& proto) {
336 base::DictionaryValue* value = new base::DictionaryValue();
338 SET_STR(external_id);
339 // TODO(petewil) Add SyncedNotificationCreator here if we ever need it.
343 base::DictionaryValue* RenderInfoToValue(
344 const sync_pb::SyncedNotificationRenderInfo& proto) {
345 base::DictionaryValue* value = new base::DictionaryValue();
346 // TODO(petewil): Add the expanded info values once we start using them.
347 SET(collapsed_info, CollapsedInfoToValue);
351 base::DictionaryValue* CoalescedNotificationToValue(
352 const sync_pb::CoalescedSyncedNotification& proto) {
353 base::DictionaryValue* value = new base::DictionaryValue();
356 SET_REP(notification, SyncedNotificationToValue);
357 SET(render_info, RenderInfoToValue);
358 SET_INT32(read_state);
359 SET_INT64(creation_time_msec);
364 base::DictionaryValue* AppListSpecificsToValue(
365 const sync_pb::AppListSpecifics& proto) {
366 base::DictionaryValue* value = new base::DictionaryValue();
368 SET_ENUM(item_type, GetAppListItemTypeString);
371 SET_STR(page_ordinal);
372 SET_STR(item_ordinal);
377 base::DictionaryValue* AppNotificationToValue(
378 const sync_pb::AppNotification& proto) {
379 base::DictionaryValue* value = new base::DictionaryValue();
382 SET_INT64(creation_timestamp_ms);
390 base::DictionaryValue* AppSettingSpecificsToValue(
391 const sync_pb::AppSettingSpecifics& proto) {
392 base::DictionaryValue* value = new base::DictionaryValue();
393 SET(extension_setting, ExtensionSettingSpecificsToValue);
397 base::DictionaryValue* AppSpecificsToValue(
398 const sync_pb::AppSpecifics& proto) {
399 base::DictionaryValue* value = new base::DictionaryValue();
400 SET(extension, ExtensionSpecificsToValue);
401 SET(notification_settings, AppSettingsToValue);
402 SET_STR(app_launch_ordinal);
403 SET_STR(page_ordinal);
404 SET_ENUM(launch_type, GetLaunchTypeString);
409 base::DictionaryValue* AutofillSpecificsToValue(
410 const sync_pb::AutofillSpecifics& proto) {
411 base::DictionaryValue* value = new base::DictionaryValue();
414 SET_INT64_REP(usage_timestamp);
415 SET(profile, AutofillProfileSpecificsToValue);
419 base::DictionaryValue* AutofillProfileSpecificsToValue(
420 const sync_pb::AutofillProfileSpecifics& proto) {
421 base::DictionaryValue* value = new base::DictionaryValue();
425 SET_STR_REP(name_first);
426 SET_STR_REP(name_middle);
427 SET_STR_REP(name_last);
428 SET_STR_REP(email_address);
429 SET_STR(company_name);
431 SET_STR(address_home_line1);
432 SET_STR(address_home_line2);
433 SET_STR(address_home_city);
434 SET_STR(address_home_state);
435 SET_STR(address_home_zip);
436 SET_STR(address_home_country);
438 SET_STR(address_home_street_address);
439 SET_STR(address_home_sorting_code);
440 SET_STR(address_home_dependent_locality);
442 SET_STR_REP(phone_home_whole_number);
446 base::DictionaryValue* MetaInfoToValue(
447 const sync_pb::MetaInfo& proto) {
448 base::DictionaryValue* value = new base::DictionaryValue();
454 base::DictionaryValue* BookmarkSpecificsToValue(
455 const sync_pb::BookmarkSpecifics& proto) {
456 base::DictionaryValue* value = new base::DictionaryValue();
460 SET_INT64(creation_time_us);
462 SET_REP(meta_info, &MetaInfoToValue);
466 base::DictionaryValue* DeviceInfoSpecificsToValue(
467 const sync_pb::DeviceInfoSpecifics& proto) {
468 base::DictionaryValue* value = new base::DictionaryValue();
470 SET_STR(client_name);
471 SET_ENUM(device_type, GetDeviceTypeString);
472 SET_STR(sync_user_agent);
473 SET_STR(chrome_version);
477 base::DictionaryValue* DictionarySpecificsToValue(
478 const sync_pb::DictionarySpecifics& proto) {
479 base::DictionaryValue* value = new base::DictionaryValue();
486 base::DictionaryValue* FaviconSyncFlagsToValue(
487 const sync_pb::FaviconSyncFlags& proto) {
488 base::DictionaryValue* value = new base::DictionaryValue();
490 SET_INT32(favicon_sync_limit);
496 base::DictionaryValue* ExperimentsSpecificsToValue(
497 const sync_pb::ExperimentsSpecifics& proto) {
498 base::DictionaryValue* value = new base::DictionaryValue();
499 SET_EXPERIMENT_ENABLED_FIELD(keystore_encryption);
500 SET_EXPERIMENT_ENABLED_FIELD(history_delete_directives);
501 SET_EXPERIMENT_ENABLED_FIELD(autofill_culling);
502 SET_EXPERIMENT_ENABLED_FIELD(pre_commit_update_avoidance);
503 SET(favicon_sync, FaviconSyncFlagsToValue);
504 SET_EXPERIMENT_ENABLED_FIELD(gcm_channel);
505 SET_EXPERIMENT_ENABLED_FIELD(enhanced_bookmarks);
506 SET_EXPERIMENT_ENABLED_FIELD(gcm_invalidations);
510 base::DictionaryValue* ExtensionSettingSpecificsToValue(
511 const sync_pb::ExtensionSettingSpecifics& proto) {
512 base::DictionaryValue* value = new base::DictionaryValue();
513 SET_STR(extension_id);
519 base::DictionaryValue* ExtensionSpecificsToValue(
520 const sync_pb::ExtensionSpecifics& proto) {
521 base::DictionaryValue* value = new base::DictionaryValue();
526 SET_BOOL(incognito_enabled);
532 base::DictionaryValue* FaviconDataToValue(
533 const sync_pb::FaviconData& proto) {
534 base::DictionaryValue* value = new base::DictionaryValue();
542 base::DictionaryValue* FaviconImageSpecificsToValue(
543 const sync_pb::FaviconImageSpecifics& proto) {
544 base::DictionaryValue* value = new base::DictionaryValue();
545 SET_STR(favicon_url);
546 SET(favicon_web, FaviconDataToValue);
547 SET(favicon_web_32, FaviconDataToValue);
548 SET(favicon_touch_64, FaviconDataToValue);
549 SET(favicon_touch_precomposed_64, FaviconDataToValue);
553 base::DictionaryValue* FaviconTrackingSpecificsToValue(
554 const sync_pb::FaviconTrackingSpecifics& proto) {
555 base::DictionaryValue* value = new base::DictionaryValue();
556 SET_STR(favicon_url);
557 SET_INT64(last_visit_time_ms)
558 SET_BOOL(is_bookmarked);
562 base::DictionaryValue* HistoryDeleteDirectiveSpecificsToValue(
563 const sync_pb::HistoryDeleteDirectiveSpecifics& proto) {
564 base::DictionaryValue* value = new base::DictionaryValue();
565 SET(global_id_directive, GlobalIdDirectiveToValue);
566 SET(time_range_directive, TimeRangeDirectiveToValue);
570 base::DictionaryValue* ManagedUserSettingSpecificsToValue(
571 const sync_pb::ManagedUserSettingSpecifics& proto) {
572 base::DictionaryValue* value = new base::DictionaryValue();
578 base::DictionaryValue* ManagedUserSpecificsToValue(
579 const sync_pb::ManagedUserSpecifics& proto) {
580 base::DictionaryValue* value = new base::DictionaryValue();
583 SET_BOOL(acknowledged);
585 SET_STR(chrome_avatar);
586 SET_STR(chromeos_avatar);
590 base::DictionaryValue* ManagedUserSharedSettingSpecificsToValue(
591 const sync_pb::ManagedUserSharedSettingSpecifics& proto) {
592 base::DictionaryValue* value = new base::DictionaryValue();
596 SET_BOOL(acknowledged);
600 base::DictionaryValue* NigoriSpecificsToValue(
601 const sync_pb::NigoriSpecifics& proto) {
602 base::DictionaryValue* value = new base::DictionaryValue();
603 SET(encryption_keybag, EncryptedDataToValue);
604 SET_BOOL(keybag_is_frozen);
605 SET_BOOL(encrypt_bookmarks);
606 SET_BOOL(encrypt_preferences);
607 SET_BOOL(encrypt_autofill_profile);
608 SET_BOOL(encrypt_autofill);
609 SET_BOOL(encrypt_themes);
610 SET_BOOL(encrypt_typed_urls);
611 SET_BOOL(encrypt_extension_settings);
612 SET_BOOL(encrypt_extensions);
613 SET_BOOL(encrypt_sessions);
614 SET_BOOL(encrypt_app_settings);
615 SET_BOOL(encrypt_apps);
616 SET_BOOL(encrypt_search_engines);
617 SET_BOOL(encrypt_dictionary);
618 SET_BOOL(encrypt_articles);
619 SET_BOOL(encrypt_app_list);
620 SET_BOOL(encrypt_everything);
621 SET_BOOL(sync_tab_favicons);
622 SET_ENUM(passphrase_type, PassphraseTypeString);
623 SET(keystore_decryptor_token, EncryptedDataToValue);
624 SET_INT64(keystore_migration_time);
625 SET_INT64(custom_passphrase_time);
629 base::DictionaryValue* ArticlePageToValue(
630 const sync_pb::ArticlePage& proto) {
631 base::DictionaryValue* value = new base::DictionaryValue();
636 base::DictionaryValue* ArticleSpecificsToValue(
637 const sync_pb::ArticleSpecifics& proto) {
638 base::DictionaryValue* value = new base::DictionaryValue();
641 SET_REP(pages, ArticlePageToValue);
645 base::DictionaryValue* PasswordSpecificsToValue(
646 const sync_pb::PasswordSpecifics& proto) {
647 base::DictionaryValue* value = new base::DictionaryValue();
648 SET(encrypted, EncryptedDataToValue);
652 base::DictionaryValue* PreferenceSpecificsToValue(
653 const sync_pb::PreferenceSpecifics& proto) {
654 base::DictionaryValue* value = new base::DictionaryValue();
660 base::DictionaryValue* PriorityPreferenceSpecificsToValue(
661 const sync_pb::PriorityPreferenceSpecifics& specifics) {
662 base::DictionaryValue* value = new base::DictionaryValue();
663 SET_FIELD(preference, PreferenceSpecificsToValue);
667 base::DictionaryValue* SyncedNotificationAppInfoSpecificsToValue(
668 const sync_pb::SyncedNotificationAppInfoSpecifics& proto) {
669 base::DictionaryValue* value = new base::DictionaryValue();
670 SET_REP(synced_notification_app_info, SyncedNotificationAppInfoToValue);
674 base::DictionaryValue* SyncedNotificationSpecificsToValue(
675 const sync_pb::SyncedNotificationSpecifics& proto) {
676 // There is a lot of data, for now just use heading, description, key, and
678 // TODO(petewil): Eventually add more data here.
679 base::DictionaryValue* value = new base::DictionaryValue();
680 SET(coalesced_notification, CoalescedNotificationToValue);
684 base::DictionaryValue* SearchEngineSpecificsToValue(
685 const sync_pb::SearchEngineSpecifics& proto) {
686 base::DictionaryValue* value = new base::DictionaryValue();
689 SET_STR(favicon_url);
691 SET_BOOL(safe_for_autoreplace);
692 SET_STR(originating_url);
693 SET_INT64(date_created);
694 SET_STR(input_encodings);
695 SET_BOOL(show_in_default_list);
696 SET_STR(suggestions_url);
697 SET_INT32(prepopulate_id);
698 SET_BOOL(autogenerate_keyword);
699 SET_STR(instant_url);
700 SET_INT64(last_modified);
702 SET_STR_REP(alternate_urls);
703 SET_STR(search_terms_replacement_key);
705 SET_STR(search_url_post_params);
706 SET_STR(suggestions_url_post_params);
707 SET_STR(instant_url_post_params);
708 SET_STR(image_url_post_params);
709 SET_STR(new_tab_url);
713 base::DictionaryValue* SessionSpecificsToValue(
714 const sync_pb::SessionSpecifics& proto) {
715 base::DictionaryValue* value = new base::DictionaryValue();
716 SET_STR(session_tag);
717 SET(header, SessionHeaderToValue);
718 SET(tab, SessionTabToValue);
719 SET_INT32(tab_node_id);
723 base::DictionaryValue* ThemeSpecificsToValue(
724 const sync_pb::ThemeSpecifics& proto) {
725 base::DictionaryValue* value = new base::DictionaryValue();
726 SET_BOOL(use_custom_theme);
727 SET_BOOL(use_system_theme_by_default);
728 SET_STR(custom_theme_name);
729 SET_STR(custom_theme_id);
730 SET_STR(custom_theme_update_url);
734 base::DictionaryValue* TypedUrlSpecificsToValue(
735 const sync_pb::TypedUrlSpecifics& proto) {
736 base::DictionaryValue* value = new base::DictionaryValue();
740 SET_INT64_REP(visits);
741 SET_INT32_REP(visit_transitions);
745 base::DictionaryValue* EntitySpecificsToValue(
746 const sync_pb::EntitySpecifics& specifics) {
747 base::DictionaryValue* value = new base::DictionaryValue();
748 SET_FIELD(app, AppSpecificsToValue);
749 SET_FIELD(app_list, AppListSpecificsToValue);
750 SET_FIELD(app_notification, AppNotificationToValue);
751 SET_FIELD(app_setting, AppSettingSpecificsToValue);
752 SET_FIELD(article, ArticleSpecificsToValue);
753 SET_FIELD(autofill, AutofillSpecificsToValue);
754 SET_FIELD(autofill_profile, AutofillProfileSpecificsToValue);
755 SET_FIELD(bookmark, BookmarkSpecificsToValue);
756 SET_FIELD(device_info, DeviceInfoSpecificsToValue);
757 SET_FIELD(dictionary, DictionarySpecificsToValue);
758 SET_FIELD(experiments, ExperimentsSpecificsToValue);
759 SET_FIELD(extension, ExtensionSpecificsToValue);
760 SET_FIELD(extension_setting, ExtensionSettingSpecificsToValue);
761 SET_FIELD(favicon_image, FaviconImageSpecificsToValue);
762 SET_FIELD(favicon_tracking, FaviconTrackingSpecificsToValue);
763 SET_FIELD(history_delete_directive, HistoryDeleteDirectiveSpecificsToValue);
764 SET_FIELD(managed_user_setting, ManagedUserSettingSpecificsToValue);
765 SET_FIELD(managed_user_shared_setting,
766 ManagedUserSharedSettingSpecificsToValue);
767 SET_FIELD(managed_user, ManagedUserSpecificsToValue);
768 SET_FIELD(nigori, NigoriSpecificsToValue);
769 SET_FIELD(password, PasswordSpecificsToValue);
770 SET_FIELD(preference, PreferenceSpecificsToValue);
771 SET_FIELD(priority_preference, PriorityPreferenceSpecificsToValue);
772 SET_FIELD(search_engine, SearchEngineSpecificsToValue);
773 SET_FIELD(session, SessionSpecificsToValue);
774 SET_FIELD(synced_notification, SyncedNotificationSpecificsToValue);
775 SET_FIELD(synced_notification_app_info,
776 SyncedNotificationAppInfoSpecificsToValue);
777 SET_FIELD(theme, ThemeSpecificsToValue);
778 SET_FIELD(typed_url, TypedUrlSpecificsToValue);
784 base::StringValue* UniquePositionToStringValue(
785 const sync_pb::UniquePosition& proto) {
786 UniquePosition pos = UniquePosition::FromProto(proto);
787 return new base::StringValue(pos.ToDebugString());
790 base::DictionaryValue* SyncEntityToValue(const sync_pb::SyncEntity& proto,
791 bool include_specifics) {
792 base::DictionaryValue* value = new base::DictionaryValue();
794 SET_STR(parent_id_string);
795 SET_STR(old_parent_id);
800 SET_STR(non_unique_name);
801 SET_INT64(sync_timestamp);
802 SET_STR(server_defined_unique_tag);
803 SET_INT64(position_in_parent);
804 SET(unique_position, UniquePositionToStringValue);
805 SET_STR(insert_after_item_id);
807 SET_STR(originator_cache_guid);
808 SET_STR(originator_client_item_id);
809 if (include_specifics)
810 SET(specifics, EntitySpecificsToValue);
812 SET_STR(client_defined_unique_tag);
816 base::ListValue* SyncEntitiesToValue(
817 const ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities,
818 bool include_specifics) {
819 base::ListValue* list = new base::ListValue();
820 ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>::const_iterator it;
821 for (it = entities.begin(); it != entities.end(); ++it) {
822 list->Append(SyncEntityToValue(*it, include_specifics));
828 base::DictionaryValue* ChromiumExtensionActivityToValue(
829 const sync_pb::ChromiumExtensionsActivity& proto) {
830 base::DictionaryValue* value = new base::DictionaryValue();
831 SET_STR(extension_id);
832 SET_INT32(bookmark_writes_since_last_commit);
836 base::DictionaryValue* CommitMessageToValue(
837 const sync_pb::CommitMessage& proto,
838 bool include_specifics) {
839 base::DictionaryValue* value = new base::DictionaryValue();
840 value->Set("entries",
841 SyncEntitiesToValue(proto.entries(), include_specifics));
843 SET_REP(extensions_activity, ChromiumExtensionActivityToValue);
844 SET(config_params, ClientConfigParamsToValue);
848 base::DictionaryValue* GetUpdateTriggersToValue(
849 const sync_pb::GetUpdateTriggers& proto) {
850 base::DictionaryValue* value = new base::DictionaryValue();
851 SET_STR_REP(notification_hint);
852 SET_BOOL(client_dropped_hints);
853 SET_BOOL(invalidations_out_of_sync);
854 SET_INT64(local_modification_nudges);
855 SET_INT64(datatype_refresh_nudges);
859 base::DictionaryValue* DataTypeProgressMarkerToValue(
860 const sync_pb::DataTypeProgressMarker& proto) {
861 base::DictionaryValue* value = new base::DictionaryValue();
862 SET_INT32(data_type_id);
864 SET_INT64(timestamp_token_for_migration);
865 SET_STR(notification_hint);
866 SET(get_update_triggers, GetUpdateTriggersToValue);
870 base::DictionaryValue* GetUpdatesCallerInfoToValue(
871 const sync_pb::GetUpdatesCallerInfo& proto) {
872 base::DictionaryValue* value = new base::DictionaryValue();
873 SET_ENUM(source, GetUpdatesSourceString);
874 SET_BOOL(notifications_enabled);
878 base::DictionaryValue* GetUpdatesMessageToValue(
879 const sync_pb::GetUpdatesMessage& proto) {
880 base::DictionaryValue* value = new base::DictionaryValue();
881 SET(caller_info, GetUpdatesCallerInfoToValue);
882 SET_BOOL(fetch_folders);
883 SET_INT32(batch_size);
884 SET_REP(from_progress_marker, DataTypeProgressMarkerToValue);
886 SET_BOOL(need_encryption_key);
887 SET_BOOL(create_mobile_bookmarks_folder);
888 SET_ENUM(get_updates_origin, GetUpdatesOriginString);
892 base::DictionaryValue* ClientStatusToValue(const sync_pb::ClientStatus& proto) {
893 base::DictionaryValue* value = new base::DictionaryValue();
894 SET_BOOL(hierarchy_conflict_detected);
898 base::DictionaryValue* EntryResponseToValue(
899 const sync_pb::CommitResponse::EntryResponse& proto) {
900 base::DictionaryValue* value = new base::DictionaryValue();
901 SET_ENUM(response_type, GetResponseTypeString);
903 SET_STR(parent_id_string);
904 SET_INT64(position_in_parent);
907 SET_STR(error_message);
912 base::DictionaryValue* CommitResponseToValue(
913 const sync_pb::CommitResponse& proto) {
914 base::DictionaryValue* value = new base::DictionaryValue();
915 SET_REP(entryresponse, EntryResponseToValue);
919 base::DictionaryValue* GetUpdatesResponseToValue(
920 const sync_pb::GetUpdatesResponse& proto,
921 bool include_specifics) {
922 base::DictionaryValue* value = new base::DictionaryValue();
923 value->Set("entries",
924 SyncEntitiesToValue(proto.entries(), include_specifics));
925 SET_INT64(changes_remaining);
926 SET_REP(new_progress_marker, DataTypeProgressMarkerToValue);
930 base::DictionaryValue* ClientCommandToValue(
931 const sync_pb::ClientCommand& proto) {
932 base::DictionaryValue* value = new base::DictionaryValue();
933 SET_INT32(set_sync_poll_interval);
934 SET_INT32(set_sync_long_poll_interval);
935 SET_INT32(max_commit_batch_size);
936 SET_INT32(sessions_commit_delay_seconds);
937 SET_INT32(throttle_delay_seconds);
938 SET_INT32(client_invalidation_hint_buffer_size);
942 base::DictionaryValue* ErrorToValue(
943 const sync_pb::ClientToServerResponse::Error& proto) {
944 base::DictionaryValue* value = new base::DictionaryValue();
945 SET_ENUM(error_type, GetErrorTypeString);
946 SET_STR(error_description);
948 SET_ENUM(action, GetActionString);
954 base::DictionaryValue* ClientToServerResponseToValue(
955 const sync_pb::ClientToServerResponse& proto,
956 bool include_specifics) {
957 base::DictionaryValue* value = new base::DictionaryValue();
958 SET(commit, CommitResponseToValue);
959 if (proto.has_get_updates()) {
960 value->Set("get_updates", GetUpdatesResponseToValue(proto.get_updates(),
964 SET(error, ErrorToValue);
965 SET_ENUM(error_code, GetErrorTypeString);
966 SET_STR(error_message);
967 SET_STR(store_birthday);
968 SET(client_command, ClientCommandToValue);
969 SET_INT32_REP(migrated_data_type_id);
973 base::DictionaryValue* ClientToServerMessageToValue(
974 const sync_pb::ClientToServerMessage& proto,
975 bool include_specifics) {
976 base::DictionaryValue* value = new base::DictionaryValue();
978 SET_INT32(protocol_version);
979 if (proto.has_commit()) {
981 CommitMessageToValue(proto.commit(), include_specifics));
984 SET(get_updates, GetUpdatesMessageToValue);
985 SET_STR(store_birthday);
986 SET_BOOL(sync_problem_detected);
987 SET(debug_info, DebugInfoToValue);
988 SET(client_status, ClientStatusToValue);
992 base::DictionaryValue* DatatypeAssociationStatsToValue(
993 const sync_pb::DatatypeAssociationStats& proto) {
994 base::DictionaryValue* value = new base::DictionaryValue();
995 SET_INT32(data_type_id);
996 SET_INT32(num_local_items_before_association);
997 SET_INT32(num_sync_items_before_association);
998 SET_INT32(num_local_items_after_association);
999 SET_INT32(num_sync_items_after_association);
1000 SET_INT32(num_local_items_added);
1001 SET_INT32(num_local_items_deleted);
1002 SET_INT32(num_local_items_modified);
1003 SET_INT32(num_sync_items_added);
1004 SET_INT32(num_sync_items_deleted);
1005 SET_INT32(num_sync_items_modified);
1006 SET_INT64(local_version_pre_association);
1007 SET_INT64(sync_version_pre_association)
1008 SET_BOOL(had_error);
1009 SET_INT64(download_wait_time_us);
1010 SET_INT64(download_time_us);
1011 SET_INT64(association_wait_time_for_high_priority_us);
1012 SET_INT64(association_wait_time_for_same_priority_us);
1016 base::DictionaryValue* DebugEventInfoToValue(
1017 const sync_pb::DebugEventInfo& proto) {
1018 base::DictionaryValue* value = new base::DictionaryValue();
1019 SET_ENUM(singleton_event, SingletonDebugEventTypeString);
1020 SET(sync_cycle_completed_event_info, SyncCycleCompletedEventInfoToValue);
1021 SET_INT32(nudging_datatype);
1022 SET_INT32_REP(datatypes_notified_from_server);
1023 SET(datatype_association_stats, DatatypeAssociationStatsToValue);
1027 base::DictionaryValue* DebugInfoToValue(const sync_pb::DebugInfo& proto) {
1028 base::DictionaryValue* value = new base::DictionaryValue();
1029 SET_REP(events, DebugEventInfoToValue);
1030 SET_BOOL(cryptographer_ready);
1031 SET_BOOL(cryptographer_has_pending_keys);
1032 SET_BOOL(events_dropped);
1036 base::DictionaryValue* SyncCycleCompletedEventInfoToValue(
1037 const sync_pb::SyncCycleCompletedEventInfo& proto) {
1038 base::DictionaryValue* value = new base::DictionaryValue();
1039 SET_INT32(num_encryption_conflicts);
1040 SET_INT32(num_hierarchy_conflicts);
1041 SET_INT32(num_server_conflicts);
1042 SET_INT32(num_updates_downloaded);
1043 SET_INT32(num_reflected_updates_downloaded);
1044 SET(caller_info, GetUpdatesCallerInfoToValue);
1048 base::DictionaryValue* ClientConfigParamsToValue(
1049 const sync_pb::ClientConfigParams& proto) {
1050 base::DictionaryValue* value = new base::DictionaryValue();
1051 SET_INT32_REP(enabled_type_ids);
1052 SET_BOOL(tabs_datatype_enabled);
1063 #undef SET_INT64_REP
1069 } // namespace syncer