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_notification_specifics.pb.h"
18 #include "sync/protocol/app_setting_specifics.pb.h"
19 #include "sync/protocol/app_specifics.pb.h"
20 #include "sync/protocol/autofill_specifics.pb.h"
21 #include "sync/protocol/bookmark_specifics.pb.h"
22 #include "sync/protocol/dictionary_specifics.pb.h"
23 #include "sync/protocol/encryption.pb.h"
24 #include "sync/protocol/experiments_specifics.pb.h"
25 #include "sync/protocol/extension_setting_specifics.pb.h"
26 #include "sync/protocol/extension_specifics.pb.h"
27 #include "sync/protocol/favicon_image_specifics.pb.h"
28 #include "sync/protocol/favicon_tracking_specifics.pb.h"
29 #include "sync/protocol/history_delete_directive_specifics.pb.h"
30 #include "sync/protocol/nigori_specifics.pb.h"
31 #include "sync/protocol/password_specifics.pb.h"
32 #include "sync/protocol/preference_specifics.pb.h"
33 #include "sync/protocol/priority_preference_specifics.pb.h"
34 #include "sync/protocol/proto_enum_conversions.h"
35 #include "sync/protocol/search_engine_specifics.pb.h"
36 #include "sync/protocol/session_specifics.pb.h"
37 #include "sync/protocol/sync.pb.h"
38 #include "sync/protocol/synced_notification_specifics.pb.h"
39 #include "sync/protocol/theme_specifics.pb.h"
40 #include "sync/protocol/typed_url_specifics.pb.h"
41 #include "sync/protocol/unique_position.pb.h"
47 // Basic Type -> Value functions.
49 base::StringValue
* MakeInt64Value(int64 x
) {
50 return new base::StringValue(base::Int64ToString(x
));
53 // TODO(akalin): Perhaps make JSONWriter support BinaryValue and use
54 // that instead of a StringValue.
55 base::StringValue
* MakeBytesValue(const std::string
& bytes
) {
56 std::string bytes_base64
;
57 if (!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
);
209 base::DictionaryValue
* PasswordSpecificsDataToValue(
210 const sync_pb::PasswordSpecificsData
& proto
) {
211 base::DictionaryValue
* value
= new base::DictionaryValue();
213 SET_STR(signon_realm
);
216 SET_STR(username_element
);
217 SET_STR(username_value
);
218 SET_STR(password_element
);
219 value
->SetString("password_value", "<redacted>");
222 SET_INT64(date_created
);
223 SET_BOOL(blacklisted
);
227 base::DictionaryValue
* GlobalIdDirectiveToValue(
228 const sync_pb::GlobalIdDirective
& proto
) {
229 base::DictionaryValue
* value
= new base::DictionaryValue();
230 SET_INT64_REP(global_id
);
231 SET_INT64(start_time_usec
);
232 SET_INT64(end_time_usec
);
236 base::DictionaryValue
* TimeRangeDirectiveToValue(
237 const sync_pb::TimeRangeDirective
& proto
) {
238 base::DictionaryValue
* value
= new base::DictionaryValue();
239 SET_INT64(start_time_usec
);
240 SET_INT64(end_time_usec
);
244 base::DictionaryValue
* SyncedNotificationImageToValue(
245 const sync_pb::SyncedNotificationImage
& proto
) {
246 base::DictionaryValue
* value
= new base::DictionaryValue();
249 SET_INT32(preferred_width
);
250 SET_INT32(preferred_height
);
254 base::DictionaryValue
* SyncedNotificationProfileImageToValue(
255 const sync_pb::SyncedNotificationProfileImage
& proto
) {
256 base::DictionaryValue
* value
= new base::DictionaryValue();
259 SET_STR(display_name
);
263 base::DictionaryValue
* MediaToValue(
264 const sync_pb::Media
& proto
) {
265 base::DictionaryValue
* value
= new base::DictionaryValue();
266 SET(image
, SyncedNotificationImageToValue
);
270 base::DictionaryValue
* SyncedNotificationActionToValue(
271 const sync_pb::SyncedNotificationAction
& proto
) {
272 base::DictionaryValue
* value
= new base::DictionaryValue();
274 SET(icon
, SyncedNotificationImageToValue
);
276 SET_STR(request_data
);
277 SET_STR(accessibility_label
);
281 base::DictionaryValue
* SyncedNotificationDestiationToValue(
282 const sync_pb::SyncedNotificationDestination
& proto
) {
283 base::DictionaryValue
* value
= new base::DictionaryValue();
285 SET(icon
, SyncedNotificationImageToValue
);
287 SET_STR(accessibility_label
);
291 base::DictionaryValue
* TargetToValue(
292 const sync_pb::Target
& proto
) {
293 base::DictionaryValue
* value
= new base::DictionaryValue();
294 SET(destination
, SyncedNotificationDestiationToValue
);
295 SET(action
, SyncedNotificationActionToValue
);
300 base::DictionaryValue
* SimpleCollapsedLayoutToValue(
301 const sync_pb::SimpleCollapsedLayout
& proto
) {
302 base::DictionaryValue
* value
= new base::DictionaryValue();
303 SET(app_icon
, SyncedNotificationImageToValue
);
304 SET_REP(profile_image
, SyncedNotificationProfileImageToValue
);
306 SET_STR(description
);
308 SET_REP(media
, MediaToValue
);
312 base::DictionaryValue
* CollapsedInfoToValue(
313 const sync_pb::CollapsedInfo
& proto
) {
314 base::DictionaryValue
* value
= new base::DictionaryValue();
315 SET(simple_collapsed_layout
, SimpleCollapsedLayoutToValue
);
316 SET_INT64(creation_timestamp_usec
);
317 SET(default_destination
, SyncedNotificationDestiationToValue
);
318 SET_REP(target
, TargetToValue
);
322 base::DictionaryValue
* SyncedNotificationToValue(
323 const sync_pb::SyncedNotification
& proto
) {
324 base::DictionaryValue
* value
= new base::DictionaryValue();
326 SET_STR(external_id
);
327 // TODO(petewil) Add SyncedNotificationCreator here if we ever need it.
331 base::DictionaryValue
* RenderInfoToValue(
332 const sync_pb::SyncedNotificationRenderInfo
& proto
) {
333 base::DictionaryValue
* value
= new base::DictionaryValue();
334 // TODO(petewil): Add the expanded info values once we start using them.
335 SET(collapsed_info
, CollapsedInfoToValue
);
339 base::DictionaryValue
* CoalescedNotificationToValue(
340 const sync_pb::CoalescedSyncedNotification
& proto
) {
341 base::DictionaryValue
* value
= new base::DictionaryValue();
344 SET_REP(notification
, SyncedNotificationToValue
);
345 SET(render_info
, RenderInfoToValue
);
346 SET_INT32(read_state
);
347 SET_INT64(creation_time_msec
);
352 base::DictionaryValue
* AppNotificationToValue(
353 const sync_pb::AppNotification
& proto
) {
354 base::DictionaryValue
* value
= new base::DictionaryValue();
357 SET_INT64(creation_timestamp_ms
);
365 base::DictionaryValue
* AppSettingSpecificsToValue(
366 const sync_pb::AppSettingSpecifics
& proto
) {
367 base::DictionaryValue
* value
= new base::DictionaryValue();
368 SET(extension_setting
, ExtensionSettingSpecificsToValue
);
372 base::DictionaryValue
* AppSpecificsToValue(
373 const sync_pb::AppSpecifics
& proto
) {
374 base::DictionaryValue
* value
= new base::DictionaryValue();
375 SET(extension
, ExtensionSpecificsToValue
);
376 SET(notification_settings
, AppSettingsToValue
);
377 SET_STR(app_launch_ordinal
);
378 SET_STR(page_ordinal
);
383 base::DictionaryValue
* AutofillSpecificsToValue(
384 const sync_pb::AutofillSpecifics
& proto
) {
385 base::DictionaryValue
* value
= new base::DictionaryValue();
388 SET_INT64_REP(usage_timestamp
);
389 SET(profile
, AutofillProfileSpecificsToValue
);
393 base::DictionaryValue
* AutofillProfileSpecificsToValue(
394 const sync_pb::AutofillProfileSpecifics
& proto
) {
395 base::DictionaryValue
* value
= new base::DictionaryValue();
399 SET_STR_REP(name_first
);
400 SET_STR_REP(name_middle
);
401 SET_STR_REP(name_last
);
402 SET_STR_REP(email_address
);
403 SET_STR(company_name
);
405 SET_STR(address_home_line1
);
406 SET_STR(address_home_line2
);
407 SET_STR(address_home_city
);
408 SET_STR(address_home_state
);
409 SET_STR(address_home_zip
);
410 SET_STR(address_home_country
);
412 SET_STR_REP(phone_home_whole_number
);
416 base::DictionaryValue
* BookmarkSpecificsToValue(
417 const sync_pb::BookmarkSpecifics
& proto
) {
418 base::DictionaryValue
* value
= new base::DictionaryValue();
422 SET_INT64(creation_time_us
);
427 base::DictionaryValue
* DeviceInfoSpecificsToValue(
428 const sync_pb::DeviceInfoSpecifics
& proto
) {
429 base::DictionaryValue
* value
= new base::DictionaryValue();
431 SET_STR(client_name
);
432 SET_ENUM(device_type
, GetDeviceTypeString
);
433 SET_STR(sync_user_agent
);
434 SET_STR(chrome_version
);
438 base::DictionaryValue
* DictionarySpecificsToValue(
439 const sync_pb::DictionarySpecifics
& proto
) {
440 base::DictionaryValue
* value
= new base::DictionaryValue();
447 base::DictionaryValue
* FaviconSyncFlagsToValue(
448 const sync_pb::FaviconSyncFlags
& proto
) {
449 base::DictionaryValue
* value
= new base::DictionaryValue();
451 SET_INT32(favicon_sync_limit
);
457 base::DictionaryValue
* ExperimentsSpecificsToValue(
458 const sync_pb::ExperimentsSpecifics
& proto
) {
459 base::DictionaryValue
* value
= new base::DictionaryValue();
460 SET_EXPERIMENT_ENABLED_FIELD(keystore_encryption
);
461 SET_EXPERIMENT_ENABLED_FIELD(history_delete_directives
);
462 SET_EXPERIMENT_ENABLED_FIELD(autofill_culling
);
463 SET_EXPERIMENT_ENABLED_FIELD(pre_commit_update_avoidance
);
464 if (proto
.has_favicon_sync())
465 SET(favicon_sync
, FaviconSyncFlagsToValue
);
469 base::DictionaryValue
* ExtensionSettingSpecificsToValue(
470 const sync_pb::ExtensionSettingSpecifics
& proto
) {
471 base::DictionaryValue
* value
= new base::DictionaryValue();
472 SET_STR(extension_id
);
478 base::DictionaryValue
* ExtensionSpecificsToValue(
479 const sync_pb::ExtensionSpecifics
& proto
) {
480 base::DictionaryValue
* value
= new base::DictionaryValue();
485 SET_BOOL(incognito_enabled
);
491 base::DictionaryValue
* FaviconDataToValue(
492 const sync_pb::FaviconData
& proto
) {
493 base::DictionaryValue
* value
= new base::DictionaryValue();
501 base::DictionaryValue
* FaviconImageSpecificsToValue(
502 const sync_pb::FaviconImageSpecifics
& proto
) {
503 base::DictionaryValue
* value
= new base::DictionaryValue();
504 SET_STR(favicon_url
);
505 SET(favicon_web
, FaviconDataToValue
);
506 SET(favicon_web_32
, FaviconDataToValue
);
507 SET(favicon_touch_64
, FaviconDataToValue
);
508 SET(favicon_touch_precomposed_64
, FaviconDataToValue
);
512 base::DictionaryValue
* FaviconTrackingSpecificsToValue(
513 const sync_pb::FaviconTrackingSpecifics
& proto
) {
514 base::DictionaryValue
* value
= new base::DictionaryValue();
515 SET_STR(favicon_url
);
516 SET_INT64(last_visit_time_ms
)
517 SET_BOOL(is_bookmarked
);
521 base::DictionaryValue
* HistoryDeleteDirectiveSpecificsToValue(
522 const sync_pb::HistoryDeleteDirectiveSpecifics
& proto
) {
523 base::DictionaryValue
* value
= new base::DictionaryValue();
524 SET(global_id_directive
, GlobalIdDirectiveToValue
);
525 SET(time_range_directive
, TimeRangeDirectiveToValue
);
529 base::DictionaryValue
* ManagedUserSettingSpecificsToValue(
530 const sync_pb::ManagedUserSettingSpecifics
& proto
) {
531 base::DictionaryValue
* value
= new base::DictionaryValue();
537 base::DictionaryValue
* ManagedUserSpecificsToValue(
538 const sync_pb::ManagedUserSpecifics
& proto
) {
539 base::DictionaryValue
* value
= new base::DictionaryValue();
542 SET_BOOL(acknowledged
);
544 SET_STR(chrome_avatar
);
545 SET_STR(chromeos_avatar
);
549 base::DictionaryValue
* NigoriSpecificsToValue(
550 const sync_pb::NigoriSpecifics
& proto
) {
551 base::DictionaryValue
* value
= new base::DictionaryValue();
552 SET(encryption_keybag
, EncryptedDataToValue
);
553 SET_BOOL(keybag_is_frozen
);
554 SET_BOOL(encrypt_bookmarks
);
555 SET_BOOL(encrypt_preferences
);
556 SET_BOOL(encrypt_autofill_profile
);
557 SET_BOOL(encrypt_autofill
);
558 SET_BOOL(encrypt_themes
);
559 SET_BOOL(encrypt_typed_urls
);
560 SET_BOOL(encrypt_extension_settings
);
561 SET_BOOL(encrypt_extensions
);
562 SET_BOOL(encrypt_sessions
);
563 SET_BOOL(encrypt_app_settings
);
564 SET_BOOL(encrypt_apps
);
565 SET_BOOL(encrypt_search_engines
);
566 SET_BOOL(encrypt_dictionary
);
567 SET_BOOL(encrypt_articles
);
568 SET_BOOL(encrypt_everything
);
569 SET_BOOL(sync_tab_favicons
);
570 SET_ENUM(passphrase_type
, PassphraseTypeString
);
571 SET(keystore_decryptor_token
, EncryptedDataToValue
);
572 SET_INT64(keystore_migration_time
);
573 SET_INT64(custom_passphrase_time
);
577 base::DictionaryValue
* ArticlePageToValue(
578 const sync_pb::ArticlePage
& proto
) {
579 base::DictionaryValue
* value
= new base::DictionaryValue();
584 base::DictionaryValue
* ArticleSpecificsToValue(
585 const sync_pb::ArticleSpecifics
& proto
) {
586 base::DictionaryValue
* value
= new base::DictionaryValue();
589 SET_REP(pages
, ArticlePageToValue
);
593 base::DictionaryValue
* PasswordSpecificsToValue(
594 const sync_pb::PasswordSpecifics
& proto
) {
595 base::DictionaryValue
* value
= new base::DictionaryValue();
596 SET(encrypted
, EncryptedDataToValue
);
600 base::DictionaryValue
* PreferenceSpecificsToValue(
601 const sync_pb::PreferenceSpecifics
& proto
) {
602 base::DictionaryValue
* value
= new base::DictionaryValue();
608 base::DictionaryValue
* PriorityPreferenceSpecificsToValue(
609 const sync_pb::PriorityPreferenceSpecifics
& specifics
) {
610 base::DictionaryValue
* value
= new base::DictionaryValue();
611 SET_FIELD(preference
, PreferenceSpecificsToValue
);
615 base::DictionaryValue
* SyncedNotificationSpecificsToValue(
616 const sync_pb::SyncedNotificationSpecifics
& proto
) {
617 // There is a lot of data, for now just use heading, description, key, and
619 // TODO(petewil): Eventually add more data here.
620 base::DictionaryValue
* value
= new base::DictionaryValue();
621 SET(coalesced_notification
, CoalescedNotificationToValue
);
625 base::DictionaryValue
* SearchEngineSpecificsToValue(
626 const sync_pb::SearchEngineSpecifics
& proto
) {
627 base::DictionaryValue
* value
= new base::DictionaryValue();
630 SET_STR(favicon_url
);
632 SET_BOOL(safe_for_autoreplace
);
633 SET_STR(originating_url
);
634 SET_INT64(date_created
);
635 SET_STR(input_encodings
);
636 SET_BOOL(show_in_default_list
);
637 SET_STR(suggestions_url
);
638 SET_INT32(prepopulate_id
);
639 SET_BOOL(autogenerate_keyword
);
640 SET_STR(instant_url
);
641 SET_INT64(last_modified
);
643 SET_STR_REP(alternate_urls
);
644 SET_STR(search_terms_replacement_key
);
646 SET_STR(search_url_post_params
);
647 SET_STR(suggestions_url_post_params
);
648 SET_STR(instant_url_post_params
);
649 SET_STR(image_url_post_params
);
650 SET_STR(new_tab_url
);
654 base::DictionaryValue
* SessionSpecificsToValue(
655 const sync_pb::SessionSpecifics
& proto
) {
656 base::DictionaryValue
* value
= new base::DictionaryValue();
657 SET_STR(session_tag
);
658 SET(header
, SessionHeaderToValue
);
659 SET(tab
, SessionTabToValue
);
660 SET_INT32(tab_node_id
);
664 base::DictionaryValue
* ThemeSpecificsToValue(
665 const sync_pb::ThemeSpecifics
& proto
) {
666 base::DictionaryValue
* value
= new base::DictionaryValue();
667 SET_BOOL(use_custom_theme
);
668 SET_BOOL(use_system_theme_by_default
);
669 SET_STR(custom_theme_name
);
670 SET_STR(custom_theme_id
);
671 SET_STR(custom_theme_update_url
);
675 base::DictionaryValue
* TypedUrlSpecificsToValue(
676 const sync_pb::TypedUrlSpecifics
& proto
) {
677 base::DictionaryValue
* value
= new base::DictionaryValue();
681 SET_INT64_REP(visits
);
682 SET_INT32_REP(visit_transitions
);
686 base::DictionaryValue
* EntitySpecificsToValue(
687 const sync_pb::EntitySpecifics
& specifics
) {
688 base::DictionaryValue
* value
= new base::DictionaryValue();
689 SET_FIELD(app
, AppSpecificsToValue
);
690 SET_FIELD(app_notification
, AppNotificationToValue
);
691 SET_FIELD(app_setting
, AppSettingSpecificsToValue
);
692 SET_FIELD(article
, ArticleSpecificsToValue
);
693 SET_FIELD(autofill
, AutofillSpecificsToValue
);
694 SET_FIELD(autofill_profile
, AutofillProfileSpecificsToValue
);
695 SET_FIELD(bookmark
, BookmarkSpecificsToValue
);
696 SET_FIELD(device_info
, DeviceInfoSpecificsToValue
);
697 SET_FIELD(dictionary
, DictionarySpecificsToValue
);
698 SET_FIELD(experiments
, ExperimentsSpecificsToValue
);
699 SET_FIELD(extension
, ExtensionSpecificsToValue
);
700 SET_FIELD(extension_setting
, ExtensionSettingSpecificsToValue
);
701 SET_FIELD(favicon_image
, FaviconImageSpecificsToValue
);
702 SET_FIELD(favicon_tracking
, FaviconTrackingSpecificsToValue
);
703 SET_FIELD(history_delete_directive
, HistoryDeleteDirectiveSpecificsToValue
);
704 SET_FIELD(managed_user_setting
, ManagedUserSettingSpecificsToValue
);
705 SET_FIELD(managed_user
, ManagedUserSpecificsToValue
);
706 SET_FIELD(nigori
, NigoriSpecificsToValue
);
707 SET_FIELD(password
, PasswordSpecificsToValue
);
708 SET_FIELD(preference
, PreferenceSpecificsToValue
);
709 SET_FIELD(priority_preference
, PriorityPreferenceSpecificsToValue
);
710 SET_FIELD(search_engine
, SearchEngineSpecificsToValue
);
711 SET_FIELD(session
, SessionSpecificsToValue
);
712 SET_FIELD(synced_notification
, SyncedNotificationSpecificsToValue
);
713 SET_FIELD(theme
, ThemeSpecificsToValue
);
714 SET_FIELD(typed_url
, TypedUrlSpecificsToValue
);
720 base::StringValue
* UniquePositionToStringValue(
721 const sync_pb::UniquePosition
& proto
) {
722 UniquePosition pos
= UniquePosition::FromProto(proto
);
723 return new base::StringValue(pos
.ToDebugString());
726 base::DictionaryValue
* SyncEntityToValue(const sync_pb::SyncEntity
& proto
,
727 bool include_specifics
) {
728 base::DictionaryValue
* value
= new base::DictionaryValue();
730 SET_STR(parent_id_string
);
731 SET_STR(old_parent_id
);
736 SET_STR(non_unique_name
);
737 SET_INT64(sync_timestamp
);
738 SET_STR(server_defined_unique_tag
);
739 SET_INT64(position_in_parent
);
740 SET(unique_position
, UniquePositionToStringValue
);
741 SET_STR(insert_after_item_id
);
743 SET_STR(originator_cache_guid
);
744 SET_STR(originator_client_item_id
);
745 if (include_specifics
)
746 SET(specifics
, EntitySpecificsToValue
);
748 SET_STR(client_defined_unique_tag
);
752 base::ListValue
* SyncEntitiesToValue(
753 const ::google::protobuf::RepeatedPtrField
<sync_pb::SyncEntity
>& entities
,
754 bool include_specifics
) {
755 base::ListValue
* list
= new base::ListValue();
756 ::google::protobuf::RepeatedPtrField
<sync_pb::SyncEntity
>::const_iterator it
;
757 for (it
= entities
.begin(); it
!= entities
.end(); ++it
) {
758 list
->Append(SyncEntityToValue(*it
, include_specifics
));
764 base::DictionaryValue
* ChromiumExtensionActivityToValue(
765 const sync_pb::ChromiumExtensionsActivity
& proto
) {
766 base::DictionaryValue
* value
= new base::DictionaryValue();
767 SET_STR(extension_id
);
768 SET_INT32(bookmark_writes_since_last_commit
);
772 base::DictionaryValue
* CommitMessageToValue(
773 const sync_pb::CommitMessage
& proto
,
774 bool include_specifics
) {
775 base::DictionaryValue
* value
= new base::DictionaryValue();
776 value
->Set("entries",
777 SyncEntitiesToValue(proto
.entries(), include_specifics
));
779 SET_REP(extensions_activity
, ChromiumExtensionActivityToValue
);
780 SET(config_params
, ClientConfigParamsToValue
);
784 base::DictionaryValue
* GetUpdateTriggersToValue(
785 const sync_pb::GetUpdateTriggers
& proto
) {
786 base::DictionaryValue
* value
= new base::DictionaryValue();
787 SET_STR_REP(notification_hint
);
788 SET_BOOL(client_dropped_hints
);
789 SET_BOOL(invalidations_out_of_sync
);
790 SET_INT64(local_modification_nudges
);
791 SET_INT64(datatype_refresh_nudges
);
795 base::DictionaryValue
* DataTypeProgressMarkerToValue(
796 const sync_pb::DataTypeProgressMarker
& proto
) {
797 base::DictionaryValue
* value
= new base::DictionaryValue();
798 SET_INT32(data_type_id
);
800 SET_INT64(timestamp_token_for_migration
);
801 SET_STR(notification_hint
);
802 SET(get_update_triggers
, GetUpdateTriggersToValue
);
806 base::DictionaryValue
* GetUpdatesCallerInfoToValue(
807 const sync_pb::GetUpdatesCallerInfo
& proto
) {
808 base::DictionaryValue
* value
= new base::DictionaryValue();
809 SET_ENUM(source
, GetUpdatesSourceString
);
810 SET_BOOL(notifications_enabled
);
814 base::DictionaryValue
* GetUpdatesMessageToValue(
815 const sync_pb::GetUpdatesMessage
& proto
) {
816 base::DictionaryValue
* value
= new base::DictionaryValue();
817 SET(caller_info
, GetUpdatesCallerInfoToValue
);
818 SET_BOOL(fetch_folders
);
819 SET_INT32(batch_size
);
820 SET_REP(from_progress_marker
, DataTypeProgressMarkerToValue
);
822 SET_BOOL(need_encryption_key
);
823 SET_BOOL(create_mobile_bookmarks_folder
);
824 SET_ENUM(get_updates_origin
, GetUpdatesOriginString
);
828 base::DictionaryValue
* ClientStatusToValue(const sync_pb::ClientStatus
& proto
) {
829 base::DictionaryValue
* value
= new base::DictionaryValue();
830 SET_BOOL(hierarchy_conflict_detected
);
834 base::DictionaryValue
* EntryResponseToValue(
835 const sync_pb::CommitResponse::EntryResponse
& proto
) {
836 base::DictionaryValue
* value
= new base::DictionaryValue();
837 SET_ENUM(response_type
, GetResponseTypeString
);
839 SET_STR(parent_id_string
);
840 SET_INT64(position_in_parent
);
843 SET_STR(error_message
);
848 base::DictionaryValue
* CommitResponseToValue(
849 const sync_pb::CommitResponse
& proto
) {
850 base::DictionaryValue
* value
= new base::DictionaryValue();
851 SET_REP(entryresponse
, EntryResponseToValue
);
855 base::DictionaryValue
* GetUpdatesResponseToValue(
856 const sync_pb::GetUpdatesResponse
& proto
,
857 bool include_specifics
) {
858 base::DictionaryValue
* value
= new base::DictionaryValue();
859 value
->Set("entries",
860 SyncEntitiesToValue(proto
.entries(), include_specifics
));
861 SET_INT64(changes_remaining
);
862 SET_REP(new_progress_marker
, DataTypeProgressMarkerToValue
);
866 base::DictionaryValue
* ClientCommandToValue(
867 const sync_pb::ClientCommand
& proto
) {
868 base::DictionaryValue
* value
= new base::DictionaryValue();
869 SET_INT32(set_sync_poll_interval
);
870 SET_INT32(set_sync_long_poll_interval
);
871 SET_INT32(max_commit_batch_size
);
872 SET_INT32(sessions_commit_delay_seconds
);
873 SET_INT32(throttle_delay_seconds
);
874 SET_INT32(client_invalidation_hint_buffer_size
);
878 base::DictionaryValue
* ErrorToValue(
879 const sync_pb::ClientToServerResponse::Error
& proto
) {
880 base::DictionaryValue
* value
= new base::DictionaryValue();
881 SET_ENUM(error_type
, GetErrorTypeString
);
882 SET_STR(error_description
);
884 SET_ENUM(action
, GetActionString
);
890 base::DictionaryValue
* ClientToServerResponseToValue(
891 const sync_pb::ClientToServerResponse
& proto
,
892 bool include_specifics
) {
893 base::DictionaryValue
* value
= new base::DictionaryValue();
894 SET(commit
, CommitResponseToValue
);
895 if (proto
.has_get_updates()) {
896 value
->Set("get_updates", GetUpdatesResponseToValue(proto
.get_updates(),
900 SET(error
, ErrorToValue
);
901 SET_ENUM(error_code
, GetErrorTypeString
);
902 SET_STR(error_message
);
903 SET_STR(store_birthday
);
904 SET(client_command
, ClientCommandToValue
);
905 SET_INT32_REP(migrated_data_type_id
);
909 base::DictionaryValue
* ClientToServerMessageToValue(
910 const sync_pb::ClientToServerMessage
& proto
,
911 bool include_specifics
) {
912 base::DictionaryValue
* value
= new base::DictionaryValue();
914 SET_INT32(protocol_version
);
915 if (proto
.has_commit()) {
917 CommitMessageToValue(proto
.commit(), include_specifics
));
920 SET(get_updates
, GetUpdatesMessageToValue
);
921 SET_STR(store_birthday
);
922 SET_BOOL(sync_problem_detected
);
923 SET(debug_info
, DebugInfoToValue
);
924 SET(client_status
, ClientStatusToValue
);
928 base::DictionaryValue
* DatatypeAssociationStatsToValue(
929 const sync_pb::DatatypeAssociationStats
& proto
) {
930 base::DictionaryValue
* value
= new base::DictionaryValue();
931 SET_INT32(data_type_id
);
932 SET_INT32(num_local_items_before_association
);
933 SET_INT32(num_sync_items_before_association
);
934 SET_INT32(num_local_items_after_association
);
935 SET_INT32(num_sync_items_after_association
);
936 SET_INT32(num_local_items_added
);
937 SET_INT32(num_local_items_deleted
);
938 SET_INT32(num_local_items_modified
);
939 SET_INT32(num_sync_items_added
);
940 SET_INT32(num_sync_items_deleted
);
941 SET_INT32(num_sync_items_modified
);
942 SET_INT64(local_version_pre_association
);
943 SET_INT64(sync_version_pre_association
)
945 SET_INT64(download_wait_time_us
);
946 SET_INT64(download_time_us
);
947 SET_INT64(association_wait_time_for_high_priority_us
);
948 SET_INT64(association_wait_time_for_same_priority_us
);
952 base::DictionaryValue
* DebugEventInfoToValue(
953 const sync_pb::DebugEventInfo
& proto
) {
954 base::DictionaryValue
* value
= new base::DictionaryValue();
955 SET_ENUM(singleton_event
, SingletonEventTypeString
);
956 SET(sync_cycle_completed_event_info
, SyncCycleCompletedEventInfoToValue
);
957 SET_INT32(nudging_datatype
);
958 SET_INT32_REP(datatypes_notified_from_server
);
959 SET(datatype_association_stats
, DatatypeAssociationStatsToValue
);
963 base::DictionaryValue
* DebugInfoToValue(const sync_pb::DebugInfo
& proto
) {
964 base::DictionaryValue
* value
= new base::DictionaryValue();
965 SET_REP(events
, DebugEventInfoToValue
);
966 SET_BOOL(cryptographer_ready
);
967 SET_BOOL(cryptographer_has_pending_keys
);
968 SET_BOOL(events_dropped
);
972 base::DictionaryValue
* SyncCycleCompletedEventInfoToValue(
973 const sync_pb::SyncCycleCompletedEventInfo
& proto
) {
974 base::DictionaryValue
* value
= new base::DictionaryValue();
975 SET_INT32(num_encryption_conflicts
);
976 SET_INT32(num_hierarchy_conflicts
);
977 SET_INT32(num_server_conflicts
);
978 SET_INT32(num_updates_downloaded
);
979 SET_INT32(num_reflected_updates_downloaded
);
980 SET(caller_info
, GetUpdatesCallerInfoToValue
);
984 base::DictionaryValue
* ClientConfigParamsToValue(
985 const sync_pb::ClientConfigParams
& proto
) {
986 base::DictionaryValue
* value
= new base::DictionaryValue();
987 SET_INT32_REP(enabled_type_ids
);
988 SET_BOOL(tabs_datatype_enabled
);
1005 } // namespace syncer