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.
4
5 // Keep this file in sync with the .proto files in this directory.
6
7 #include "sync/protocol/proto_value_conversions.h"
8
9 #include <string>
10
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"
47
48 namespace syncer {
49
50 namespace {
51
52 // Basic Type -> Value functions.
53
MakeInt64Value(int64 x)54 base::StringValue* MakeInt64Value(int64 x) {
55 return new base::StringValue(base::Int64ToString(x));
56 }
57
58 // TODO(akalin): Perhaps make JSONWriter support BinaryValue and use
59 // that instead of a StringValue.
MakeBytesValue(const std::string & bytes)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);
64 }
65
MakeStringValue(const std::string & str)66 base::StringValue* MakeStringValue(const std::string& str) {
67 return new base::StringValue(str);
68 }
69
70 // T is the enum type.
71 template <class T>
MakeEnumValue(T t,const char * (* converter_fn)(T))72 base::StringValue* MakeEnumValue(T t, const char* (*converter_fn)(T)) {
73 return new base::StringValue(converter_fn(t));
74 }
75
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>
MakeRepeatedValue(const F & fields,V * (* converter_fn)(T))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));
84 }
85 return list;
86 }
87
MakeTimestampValue(int64 tm)88 base::StringValue* MakeTimestampValue(int64 tm) {
89 return new base::StringValue(
90 base::TimeFormatShortDateAndTime(syncer::ProtoTimeToTime(tm)));
91 }
92
93 } // namespace
94
95 // Helper macros to reduce the amount of boilerplate.
96
97 #define SET(field, fn) \
98 if (proto.has_##field()) { \
99 value->Set(#field, fn(proto.field())); \
100 }
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))
105
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())); \
128 } \
129 } while (0)
130
131 #define SET_FIELD(field, fn) \
132 do { \
133 if (specifics.has_##field()) { \
134 value->Set(#field, fn(specifics.field())); \
135 } \
136 } while (0)
137
138 // If you add another macro, don't forget to add an #undef at the end
139 // of this file, too.
140
EncryptedDataToValue(const sync_pb::EncryptedData & proto)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;
148 }
149
AppSettingsToValue(const sync_pb::AppNotificationSettings & proto)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;
157 }
158
SessionHeaderToValue(const sync_pb::SessionHeader & proto)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;
166 }
167
SessionTabToValue(const sync_pb::SessionTab & proto)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;
181 }
182
SessionWindowToValue(const sync_pb::SessionWindow & proto)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;
191 }
192
TabNavigationToValue(const sync_pb::TabNavigation & proto)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;
220 }
221
NavigationRedirectToValue(const sync_pb::NavigationRedirect & proto)222 base::DictionaryValue* NavigationRedirectToValue(
223 const sync_pb::NavigationRedirect& proto) {
224 base::DictionaryValue* value = new base::DictionaryValue();
225 SET_STR(url);
226 return value;
227 }
228
PasswordSpecificsDataToValue(const sync_pb::PasswordSpecificsData & proto)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 SET_STR(display_name);
247 SET_STR(avatar_url);
248 SET_STR(federation_url);
249 return value;
250 }
251
GlobalIdDirectiveToValue(const sync_pb::GlobalIdDirective & proto)252 base::DictionaryValue* GlobalIdDirectiveToValue(
253 const sync_pb::GlobalIdDirective& proto) {
254 base::DictionaryValue* value = new base::DictionaryValue();
255 SET_INT64_REP(global_id);
256 SET_INT64(start_time_usec);
257 SET_INT64(end_time_usec);
258 return value;
259 }
260
TimeRangeDirectiveToValue(const sync_pb::TimeRangeDirective & proto)261 base::DictionaryValue* TimeRangeDirectiveToValue(
262 const sync_pb::TimeRangeDirective& proto) {
263 base::DictionaryValue* value = new base::DictionaryValue();
264 SET_INT64(start_time_usec);
265 SET_INT64(end_time_usec);
266 return value;
267 }
268
SyncedNotificationAppInfoToValue(const sync_pb::SyncedNotificationAppInfo & proto)269 base::DictionaryValue* SyncedNotificationAppInfoToValue(
270 const sync_pb::SyncedNotificationAppInfo& proto) {
271 base::DictionaryValue* value = new base::DictionaryValue();
272 SET_STR_REP(app_id);
273 SET_STR(settings_display_name);
274 SET_STR(app_name);
275 SET_STR(settings_url);
276 SET_STR(info_url);
277 SET(icon, SyncedNotificationImageToValue);
278 // TODO(petewil): Add fields for the monochrome icon when it is available.
279 return value;
280 }
281
SyncedNotificationImageToValue(const sync_pb::SyncedNotificationImage & proto)282 base::DictionaryValue* SyncedNotificationImageToValue(
283 const sync_pb::SyncedNotificationImage& proto) {
284 base::DictionaryValue* value = new base::DictionaryValue();
285 SET_STR(url);
286 SET_STR(alt_text);
287 SET_INT32(preferred_width);
288 SET_INT32(preferred_height);
289 return value;
290 }
291
SyncedNotificationProfileImageToValue(const sync_pb::SyncedNotificationProfileImage & proto)292 base::DictionaryValue* SyncedNotificationProfileImageToValue(
293 const sync_pb::SyncedNotificationProfileImage& proto) {
294 base::DictionaryValue* value = new base::DictionaryValue();
295 SET_STR(image_url);
296 SET_STR(oid);
297 SET_STR(display_name);
298 return value;
299 }
300
MediaToValue(const sync_pb::Media & proto)301 base::DictionaryValue* MediaToValue(
302 const sync_pb::Media& proto) {
303 base::DictionaryValue* value = new base::DictionaryValue();
304 SET(image, SyncedNotificationImageToValue);
305 return value;
306 }
307
SyncedNotificationActionToValue(const sync_pb::SyncedNotificationAction & proto)308 base::DictionaryValue* SyncedNotificationActionToValue(
309 const sync_pb::SyncedNotificationAction& proto) {
310 base::DictionaryValue* value = new base::DictionaryValue();
311 SET_STR(text);
312 SET(icon, SyncedNotificationImageToValue);
313 SET_STR(url);
314 SET_STR(request_data);
315 SET_STR(accessibility_label);
316 return value;
317 }
318
SyncedNotificationDestiationToValue(const sync_pb::SyncedNotificationDestination & proto)319 base::DictionaryValue* SyncedNotificationDestiationToValue(
320 const sync_pb::SyncedNotificationDestination& proto) {
321 base::DictionaryValue* value = new base::DictionaryValue();
322 SET_STR(text);
323 SET(icon, SyncedNotificationImageToValue);
324 SET_STR(url);
325 SET_STR(accessibility_label);
326 return value;
327 }
328
TargetToValue(const sync_pb::Target & proto)329 base::DictionaryValue* TargetToValue(
330 const sync_pb::Target& proto) {
331 base::DictionaryValue* value = new base::DictionaryValue();
332 SET(destination, SyncedNotificationDestiationToValue);
333 SET(action, SyncedNotificationActionToValue);
334 SET_STR(target_key);
335 return value;
336 }
337
SimpleCollapsedLayoutToValue(const sync_pb::SimpleCollapsedLayout & proto)338 base::DictionaryValue* SimpleCollapsedLayoutToValue(
339 const sync_pb::SimpleCollapsedLayout& proto) {
340 base::DictionaryValue* value = new base::DictionaryValue();
341 SET(app_icon, SyncedNotificationImageToValue);
342 SET_REP(profile_image, SyncedNotificationProfileImageToValue);
343 SET_STR(heading);
344 SET_STR(description);
345 SET_STR(annotation);
346 SET_REP(media, MediaToValue);
347 return value;
348 }
349
CollapsedInfoToValue(const sync_pb::CollapsedInfo & proto)350 base::DictionaryValue* CollapsedInfoToValue(
351 const sync_pb::CollapsedInfo& proto) {
352 base::DictionaryValue* value = new base::DictionaryValue();
353 SET(simple_collapsed_layout, SimpleCollapsedLayoutToValue);
354 SET_INT64(creation_timestamp_usec);
355 SET(default_destination, SyncedNotificationDestiationToValue);
356 SET_REP(target, TargetToValue);
357 return value;
358 }
359
SyncedNotificationToValue(const sync_pb::SyncedNotification & proto)360 base::DictionaryValue* SyncedNotificationToValue(
361 const sync_pb::SyncedNotification& proto) {
362 base::DictionaryValue* value = new base::DictionaryValue();
363 SET_STR(type);
364 SET_STR(external_id);
365 // TODO(petewil) Add SyncedNotificationCreator here if we ever need it.
366 return value;
367 }
368
RenderInfoToValue(const sync_pb::SyncedNotificationRenderInfo & proto)369 base::DictionaryValue* RenderInfoToValue(
370 const sync_pb::SyncedNotificationRenderInfo& proto) {
371 base::DictionaryValue* value = new base::DictionaryValue();
372 // TODO(petewil): Add the expanded info values once we start using them.
373 SET(collapsed_info, CollapsedInfoToValue);
374 return value;
375 }
376
CoalescedNotificationToValue(const sync_pb::CoalescedSyncedNotification & proto)377 base::DictionaryValue* CoalescedNotificationToValue(
378 const sync_pb::CoalescedSyncedNotification& proto) {
379 base::DictionaryValue* value = new base::DictionaryValue();
380 SET_STR(key);
381 SET_STR(app_id);
382 SET_REP(notification, SyncedNotificationToValue);
383 SET(render_info, RenderInfoToValue);
384 SET_INT32(read_state);
385 SET_INT64(creation_time_msec);
386 SET_INT32(priority);
387 return value;
388 }
389
AppListSpecificsToValue(const sync_pb::AppListSpecifics & proto)390 base::DictionaryValue* AppListSpecificsToValue(
391 const sync_pb::AppListSpecifics& proto) {
392 base::DictionaryValue* value = new base::DictionaryValue();
393 SET_STR(item_id);
394 SET_ENUM(item_type, GetAppListItemTypeString);
395 SET_STR(item_name);
396 SET_STR(parent_id);
397 SET_STR(page_ordinal);
398 SET_STR(item_ordinal);
399
400 return value;
401 }
402
AppNotificationToValue(const sync_pb::AppNotification & proto)403 base::DictionaryValue* AppNotificationToValue(
404 const sync_pb::AppNotification& proto) {
405 base::DictionaryValue* value = new base::DictionaryValue();
406 SET_STR(guid);
407 SET_STR(app_id);
408 SET_INT64(creation_timestamp_ms);
409 SET_STR(title);
410 SET_STR(body_text);
411 SET_STR(link_url);
412 SET_STR(link_text);
413 return value;
414 }
415
AppSettingSpecificsToValue(const sync_pb::AppSettingSpecifics & proto)416 base::DictionaryValue* AppSettingSpecificsToValue(
417 const sync_pb::AppSettingSpecifics& proto) {
418 base::DictionaryValue* value = new base::DictionaryValue();
419 SET(extension_setting, ExtensionSettingSpecificsToValue);
420 return value;
421 }
422
AppSpecificsToValue(const sync_pb::AppSpecifics & proto)423 base::DictionaryValue* AppSpecificsToValue(
424 const sync_pb::AppSpecifics& proto) {
425 base::DictionaryValue* value = new base::DictionaryValue();
426 SET(extension, ExtensionSpecificsToValue);
427 SET(notification_settings, AppSettingsToValue);
428 SET_STR(app_launch_ordinal);
429 SET_STR(page_ordinal);
430 SET_ENUM(launch_type, GetLaunchTypeString);
431 SET_STR(bookmark_app_url);
432 SET_STR(bookmark_app_description);
433
434 return value;
435 }
436
AutofillSpecificsToValue(const sync_pb::AutofillSpecifics & proto)437 base::DictionaryValue* AutofillSpecificsToValue(
438 const sync_pb::AutofillSpecifics& proto) {
439 base::DictionaryValue* value = new base::DictionaryValue();
440 SET_STR(name);
441 SET_STR(value);
442 SET_INT64_REP(usage_timestamp);
443 SET(profile, AutofillProfileSpecificsToValue);
444 return value;
445 }
446
AutofillProfileSpecificsToValue(const sync_pb::AutofillProfileSpecifics & proto)447 base::DictionaryValue* AutofillProfileSpecificsToValue(
448 const sync_pb::AutofillProfileSpecifics& proto) {
449 base::DictionaryValue* value = new base::DictionaryValue();
450 SET_STR(guid);
451 SET_STR(origin);
452
453 SET_STR_REP(name_first);
454 SET_STR_REP(name_middle);
455 SET_STR_REP(name_last);
456 SET_STR_REP(name_full);
457 SET_STR_REP(email_address);
458 SET_STR(company_name);
459
460 SET_STR(address_home_line1);
461 SET_STR(address_home_line2);
462 SET_STR(address_home_city);
463 SET_STR(address_home_state);
464 SET_STR(address_home_zip);
465 SET_STR(address_home_country);
466
467 SET_STR(address_home_street_address);
468 SET_STR(address_home_sorting_code);
469 SET_STR(address_home_dependent_locality);
470 SET_STR(address_home_language_code);
471
472 SET_STR_REP(phone_home_whole_number);
473 return value;
474 }
475
MetaInfoToValue(const sync_pb::MetaInfo & proto)476 base::DictionaryValue* MetaInfoToValue(
477 const sync_pb::MetaInfo& proto) {
478 base::DictionaryValue* value = new base::DictionaryValue();
479 SET_STR(key);
480 SET_STR(value);
481 return value;
482 }
483
BookmarkSpecificsToValue(const sync_pb::BookmarkSpecifics & proto)484 base::DictionaryValue* BookmarkSpecificsToValue(
485 const sync_pb::BookmarkSpecifics& proto) {
486 base::DictionaryValue* value = new base::DictionaryValue();
487 SET_STR(url);
488 SET_BYTES(favicon);
489 SET_STR(title);
490 SET_INT64(creation_time_us);
491 SET_STR(icon_url);
492 SET_REP(meta_info, &MetaInfoToValue);
493 return value;
494 }
495
DeviceInfoSpecificsToValue(const sync_pb::DeviceInfoSpecifics & proto)496 base::DictionaryValue* DeviceInfoSpecificsToValue(
497 const sync_pb::DeviceInfoSpecifics& proto) {
498 base::DictionaryValue* value = new base::DictionaryValue();
499 SET_STR(cache_guid);
500 SET_STR(client_name);
501 SET_ENUM(device_type, GetDeviceTypeString);
502 SET_STR(sync_user_agent);
503 SET_STR(chrome_version);
504 SET_TIME_STR(backup_timestamp);
505 SET_STR(signin_scoped_device_id);
506 return value;
507 }
508
DictionarySpecificsToValue(const sync_pb::DictionarySpecifics & proto)509 base::DictionaryValue* DictionarySpecificsToValue(
510 const sync_pb::DictionarySpecifics& proto) {
511 base::DictionaryValue* value = new base::DictionaryValue();
512 SET_STR(word);
513 return value;
514 }
515
516 namespace {
517
FaviconSyncFlagsToValue(const sync_pb::FaviconSyncFlags & proto)518 base::DictionaryValue* FaviconSyncFlagsToValue(
519 const sync_pb::FaviconSyncFlags& proto) {
520 base::DictionaryValue* value = new base::DictionaryValue();
521 SET_BOOL(enabled);
522 SET_INT32(favicon_sync_limit);
523 return value;
524 }
525
EnhancedBookmarksFlagsToValue(const sync_pb::EnhancedBookmarksFlags & proto)526 base::DictionaryValue* EnhancedBookmarksFlagsToValue(
527 const sync_pb::EnhancedBookmarksFlags& proto) {
528 base::DictionaryValue* value = new base::DictionaryValue();
529 SET_BOOL(enabled);
530 SET_STR(extension_id);
531 return value;
532 }
533
534 } // namespace
535
ExperimentsSpecificsToValue(const sync_pb::ExperimentsSpecifics & proto)536 base::DictionaryValue* ExperimentsSpecificsToValue(
537 const sync_pb::ExperimentsSpecifics& proto) {
538 base::DictionaryValue* value = new base::DictionaryValue();
539 SET_EXPERIMENT_ENABLED_FIELD(keystore_encryption);
540 SET_EXPERIMENT_ENABLED_FIELD(history_delete_directives);
541 SET_EXPERIMENT_ENABLED_FIELD(autofill_culling);
542 SET_EXPERIMENT_ENABLED_FIELD(pre_commit_update_avoidance);
543 SET(favicon_sync, FaviconSyncFlagsToValue);
544 SET_EXPERIMENT_ENABLED_FIELD(gcm_channel);
545 SET(enhanced_bookmarks, EnhancedBookmarksFlagsToValue);
546 SET_EXPERIMENT_ENABLED_FIELD(gcm_invalidations);
547 return value;
548 }
549
ExtensionSettingSpecificsToValue(const sync_pb::ExtensionSettingSpecifics & proto)550 base::DictionaryValue* ExtensionSettingSpecificsToValue(
551 const sync_pb::ExtensionSettingSpecifics& proto) {
552 base::DictionaryValue* value = new base::DictionaryValue();
553 SET_STR(extension_id);
554 SET_STR(key);
555 SET_STR(value);
556 return value;
557 }
558
ExtensionSpecificsToValue(const sync_pb::ExtensionSpecifics & proto)559 base::DictionaryValue* ExtensionSpecificsToValue(
560 const sync_pb::ExtensionSpecifics& proto) {
561 base::DictionaryValue* value = new base::DictionaryValue();
562 SET_STR(id);
563 SET_STR(version);
564 SET_STR(update_url);
565 SET_BOOL(enabled);
566 SET_BOOL(incognito_enabled);
567 SET_BOOL(remote_install);
568 SET_BOOL(installed_by_custodian);
569 SET_STR(name);
570 return value;
571 }
572
573 namespace {
FaviconDataToValue(const sync_pb::FaviconData & proto)574 base::DictionaryValue* FaviconDataToValue(
575 const sync_pb::FaviconData& proto) {
576 base::DictionaryValue* value = new base::DictionaryValue();
577 SET_BYTES(favicon);
578 SET_INT32(width);
579 SET_INT32(height);
580 return value;
581 }
582 } // namespace
583
FaviconImageSpecificsToValue(const sync_pb::FaviconImageSpecifics & proto)584 base::DictionaryValue* FaviconImageSpecificsToValue(
585 const sync_pb::FaviconImageSpecifics& proto) {
586 base::DictionaryValue* value = new base::DictionaryValue();
587 SET_STR(favicon_url);
588 SET(favicon_web, FaviconDataToValue);
589 SET(favicon_web_32, FaviconDataToValue);
590 SET(favicon_touch_64, FaviconDataToValue);
591 SET(favicon_touch_precomposed_64, FaviconDataToValue);
592 return value;
593 }
594
FaviconTrackingSpecificsToValue(const sync_pb::FaviconTrackingSpecifics & proto)595 base::DictionaryValue* FaviconTrackingSpecificsToValue(
596 const sync_pb::FaviconTrackingSpecifics& proto) {
597 base::DictionaryValue* value = new base::DictionaryValue();
598 SET_STR(favicon_url);
599 SET_INT64(last_visit_time_ms)
600 SET_BOOL(is_bookmarked);
601 return value;
602 }
603
HistoryDeleteDirectiveSpecificsToValue(const sync_pb::HistoryDeleteDirectiveSpecifics & proto)604 base::DictionaryValue* HistoryDeleteDirectiveSpecificsToValue(
605 const sync_pb::HistoryDeleteDirectiveSpecifics& proto) {
606 base::DictionaryValue* value = new base::DictionaryValue();
607 SET(global_id_directive, GlobalIdDirectiveToValue);
608 SET(time_range_directive, TimeRangeDirectiveToValue);
609 return value;
610 }
611
ManagedUserSettingSpecificsToValue(const sync_pb::ManagedUserSettingSpecifics & proto)612 base::DictionaryValue* ManagedUserSettingSpecificsToValue(
613 const sync_pb::ManagedUserSettingSpecifics& proto) {
614 base::DictionaryValue* value = new base::DictionaryValue();
615 SET_STR(name);
616 SET_STR(value);
617 return value;
618 }
619
ManagedUserSpecificsToValue(const sync_pb::ManagedUserSpecifics & proto)620 base::DictionaryValue* ManagedUserSpecificsToValue(
621 const sync_pb::ManagedUserSpecifics& proto) {
622 base::DictionaryValue* value = new base::DictionaryValue();
623 SET_STR(id);
624 SET_STR(name);
625 SET_BOOL(acknowledged);
626 SET_STR(master_key);
627 SET_STR(chrome_avatar);
628 SET_STR(chromeos_avatar);
629 return value;
630 }
631
ManagedUserSharedSettingSpecificsToValue(const sync_pb::ManagedUserSharedSettingSpecifics & proto)632 base::DictionaryValue* ManagedUserSharedSettingSpecificsToValue(
633 const sync_pb::ManagedUserSharedSettingSpecifics& proto) {
634 base::DictionaryValue* value = new base::DictionaryValue();
635 SET_STR(mu_id);
636 SET_STR(key);
637 SET_STR(value);
638 SET_BOOL(acknowledged);
639 return value;
640 }
641
NigoriSpecificsToValue(const sync_pb::NigoriSpecifics & proto)642 base::DictionaryValue* NigoriSpecificsToValue(
643 const sync_pb::NigoriSpecifics& proto) {
644 base::DictionaryValue* value = new base::DictionaryValue();
645 SET(encryption_keybag, EncryptedDataToValue);
646 SET_BOOL(keybag_is_frozen);
647 SET_BOOL(encrypt_bookmarks);
648 SET_BOOL(encrypt_preferences);
649 SET_BOOL(encrypt_autofill_profile);
650 SET_BOOL(encrypt_autofill);
651 SET_BOOL(encrypt_themes);
652 SET_BOOL(encrypt_typed_urls);
653 SET_BOOL(encrypt_extension_settings);
654 SET_BOOL(encrypt_extensions);
655 SET_BOOL(encrypt_sessions);
656 SET_BOOL(encrypt_app_settings);
657 SET_BOOL(encrypt_apps);
658 SET_BOOL(encrypt_search_engines);
659 SET_BOOL(encrypt_dictionary);
660 SET_BOOL(encrypt_articles);
661 SET_BOOL(encrypt_app_list);
662 SET_BOOL(encrypt_everything);
663 SET_BOOL(sync_tab_favicons);
664 SET_ENUM(passphrase_type, PassphraseTypeString);
665 SET(keystore_decryptor_token, EncryptedDataToValue);
666 SET_INT64(keystore_migration_time);
667 SET_INT64(custom_passphrase_time);
668 return value;
669 }
670
ArticlePageToValue(const sync_pb::ArticlePage & proto)671 base::DictionaryValue* ArticlePageToValue(
672 const sync_pb::ArticlePage& proto) {
673 base::DictionaryValue* value = new base::DictionaryValue();
674 SET_STR(url);
675 return value;
676 }
677
ArticleSpecificsToValue(const sync_pb::ArticleSpecifics & proto)678 base::DictionaryValue* ArticleSpecificsToValue(
679 const sync_pb::ArticleSpecifics& proto) {
680 base::DictionaryValue* value = new base::DictionaryValue();
681 SET_STR(entry_id);
682 SET_STR(title);
683 SET_REP(pages, ArticlePageToValue);
684 return value;
685 }
686
PasswordSpecificsToValue(const sync_pb::PasswordSpecifics & proto)687 base::DictionaryValue* PasswordSpecificsToValue(
688 const sync_pb::PasswordSpecifics& proto) {
689 base::DictionaryValue* value = new base::DictionaryValue();
690 SET(encrypted, EncryptedDataToValue);
691 return value;
692 }
693
PreferenceSpecificsToValue(const sync_pb::PreferenceSpecifics & proto)694 base::DictionaryValue* PreferenceSpecificsToValue(
695 const sync_pb::PreferenceSpecifics& proto) {
696 base::DictionaryValue* value = new base::DictionaryValue();
697 SET_STR(name);
698 SET_STR(value);
699 return value;
700 }
701
PriorityPreferenceSpecificsToValue(const sync_pb::PriorityPreferenceSpecifics & specifics)702 base::DictionaryValue* PriorityPreferenceSpecificsToValue(
703 const sync_pb::PriorityPreferenceSpecifics& specifics) {
704 base::DictionaryValue* value = new base::DictionaryValue();
705 SET_FIELD(preference, PreferenceSpecificsToValue);
706 return value;
707 }
708
SyncedNotificationAppInfoSpecificsToValue(const sync_pb::SyncedNotificationAppInfoSpecifics & proto)709 base::DictionaryValue* SyncedNotificationAppInfoSpecificsToValue(
710 const sync_pb::SyncedNotificationAppInfoSpecifics& proto) {
711 base::DictionaryValue* value = new base::DictionaryValue();
712 SET_REP(synced_notification_app_info, SyncedNotificationAppInfoToValue);
713 return value;
714 }
715
SyncedNotificationSpecificsToValue(const sync_pb::SyncedNotificationSpecifics & proto)716 base::DictionaryValue* SyncedNotificationSpecificsToValue(
717 const sync_pb::SyncedNotificationSpecifics& proto) {
718 // There is a lot of data, for now just use heading, description, key, and
719 // the read state.
720 // TODO(petewil): Eventually add more data here.
721 base::DictionaryValue* value = new base::DictionaryValue();
722 SET(coalesced_notification, CoalescedNotificationToValue);
723 return value;
724 }
725
SearchEngineSpecificsToValue(const sync_pb::SearchEngineSpecifics & proto)726 base::DictionaryValue* SearchEngineSpecificsToValue(
727 const sync_pb::SearchEngineSpecifics& proto) {
728 base::DictionaryValue* value = new base::DictionaryValue();
729 SET_STR(short_name);
730 SET_STR(keyword);
731 SET_STR(favicon_url);
732 SET_STR(url);
733 SET_BOOL(safe_for_autoreplace);
734 SET_STR(originating_url);
735 SET_INT64(date_created);
736 SET_STR(input_encodings);
737 SET_BOOL(show_in_default_list);
738 SET_STR(suggestions_url);
739 SET_INT32(prepopulate_id);
740 SET_BOOL(autogenerate_keyword);
741 SET_STR(instant_url);
742 SET_INT64(last_modified);
743 SET_STR(sync_guid);
744 SET_STR_REP(alternate_urls);
745 SET_STR(search_terms_replacement_key);
746 SET_STR(image_url);
747 SET_STR(search_url_post_params);
748 SET_STR(suggestions_url_post_params);
749 SET_STR(instant_url_post_params);
750 SET_STR(image_url_post_params);
751 SET_STR(new_tab_url);
752 return value;
753 }
754
SessionSpecificsToValue(const sync_pb::SessionSpecifics & proto)755 base::DictionaryValue* SessionSpecificsToValue(
756 const sync_pb::SessionSpecifics& proto) {
757 base::DictionaryValue* value = new base::DictionaryValue();
758 SET_STR(session_tag);
759 SET(header, SessionHeaderToValue);
760 SET(tab, SessionTabToValue);
761 SET_INT32(tab_node_id);
762 return value;
763 }
764
ThemeSpecificsToValue(const sync_pb::ThemeSpecifics & proto)765 base::DictionaryValue* ThemeSpecificsToValue(
766 const sync_pb::ThemeSpecifics& proto) {
767 base::DictionaryValue* value = new base::DictionaryValue();
768 SET_BOOL(use_custom_theme);
769 SET_BOOL(use_system_theme_by_default);
770 SET_STR(custom_theme_name);
771 SET_STR(custom_theme_id);
772 SET_STR(custom_theme_update_url);
773 return value;
774 }
775
TypedUrlSpecificsToValue(const sync_pb::TypedUrlSpecifics & proto)776 base::DictionaryValue* TypedUrlSpecificsToValue(
777 const sync_pb::TypedUrlSpecifics& proto) {
778 base::DictionaryValue* value = new base::DictionaryValue();
779 SET_STR(url);
780 SET_STR(title);
781 SET_BOOL(hidden);
782 SET_INT64_REP(visits);
783 SET_INT32_REP(visit_transitions);
784 return value;
785 }
786
EntitySpecificsToValue(const sync_pb::EntitySpecifics & specifics)787 base::DictionaryValue* EntitySpecificsToValue(
788 const sync_pb::EntitySpecifics& specifics) {
789 base::DictionaryValue* value = new base::DictionaryValue();
790 SET_FIELD(app, AppSpecificsToValue);
791 SET_FIELD(app_list, AppListSpecificsToValue);
792 SET_FIELD(app_notification, AppNotificationToValue);
793 SET_FIELD(app_setting, AppSettingSpecificsToValue);
794 SET_FIELD(article, ArticleSpecificsToValue);
795 SET_FIELD(autofill, AutofillSpecificsToValue);
796 SET_FIELD(autofill_profile, AutofillProfileSpecificsToValue);
797 SET_FIELD(bookmark, BookmarkSpecificsToValue);
798 SET_FIELD(device_info, DeviceInfoSpecificsToValue);
799 SET_FIELD(dictionary, DictionarySpecificsToValue);
800 SET_FIELD(experiments, ExperimentsSpecificsToValue);
801 SET_FIELD(extension, ExtensionSpecificsToValue);
802 SET_FIELD(extension_setting, ExtensionSettingSpecificsToValue);
803 SET_FIELD(favicon_image, FaviconImageSpecificsToValue);
804 SET_FIELD(favicon_tracking, FaviconTrackingSpecificsToValue);
805 SET_FIELD(history_delete_directive, HistoryDeleteDirectiveSpecificsToValue);
806 SET_FIELD(managed_user_setting, ManagedUserSettingSpecificsToValue);
807 SET_FIELD(managed_user_shared_setting,
808 ManagedUserSharedSettingSpecificsToValue);
809 SET_FIELD(managed_user, ManagedUserSpecificsToValue);
810 SET_FIELD(nigori, NigoriSpecificsToValue);
811 SET_FIELD(password, PasswordSpecificsToValue);
812 SET_FIELD(preference, PreferenceSpecificsToValue);
813 SET_FIELD(priority_preference, PriorityPreferenceSpecificsToValue);
814 SET_FIELD(search_engine, SearchEngineSpecificsToValue);
815 SET_FIELD(session, SessionSpecificsToValue);
816 SET_FIELD(synced_notification, SyncedNotificationSpecificsToValue);
817 SET_FIELD(synced_notification_app_info,
818 SyncedNotificationAppInfoSpecificsToValue);
819 SET_FIELD(theme, ThemeSpecificsToValue);
820 SET_FIELD(typed_url, TypedUrlSpecificsToValue);
821 return value;
822 }
823
824 namespace {
825
UniquePositionToStringValue(const sync_pb::UniquePosition & proto)826 base::StringValue* UniquePositionToStringValue(
827 const sync_pb::UniquePosition& proto) {
828 UniquePosition pos = UniquePosition::FromProto(proto);
829 return new base::StringValue(pos.ToDebugString());
830 }
831
832 } // namespace
833
SyncEntityToValue(const sync_pb::SyncEntity & proto,bool include_specifics)834 base::DictionaryValue* SyncEntityToValue(const sync_pb::SyncEntity& proto,
835 bool include_specifics) {
836 base::DictionaryValue* value = new base::DictionaryValue();
837 SET_STR(id_string);
838 SET_STR(parent_id_string);
839 SET_STR(old_parent_id);
840 SET_INT64(version);
841 SET_INT64(mtime);
842 SET_INT64(ctime);
843 SET_STR(name);
844 SET_STR(non_unique_name);
845 SET_INT64(sync_timestamp);
846 SET_STR(server_defined_unique_tag);
847 SET_INT64(position_in_parent);
848 SET(unique_position, UniquePositionToStringValue);
849 SET_STR(insert_after_item_id);
850 SET_BOOL(deleted);
851 SET_STR(originator_cache_guid);
852 SET_STR(originator_client_item_id);
853 if (include_specifics)
854 SET(specifics, EntitySpecificsToValue);
855 SET_BOOL(folder);
856 SET_STR(client_defined_unique_tag);
857 SET_REP(attachment_id, AttachmentIdProtoToValue);
858 return value;
859 }
860
861 namespace {
862
SyncEntitiesToValue(const::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity> & entities,bool include_specifics)863 base::ListValue* SyncEntitiesToValue(
864 const ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities,
865 bool include_specifics) {
866 base::ListValue* list = new base::ListValue();
867 ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>::const_iterator it;
868 for (it = entities.begin(); it != entities.end(); ++it) {
869 list->Append(SyncEntityToValue(*it, include_specifics));
870 }
871
872 return list;
873 }
874
ChromiumExtensionActivityToValue(const sync_pb::ChromiumExtensionsActivity & proto)875 base::DictionaryValue* ChromiumExtensionActivityToValue(
876 const sync_pb::ChromiumExtensionsActivity& proto) {
877 base::DictionaryValue* value = new base::DictionaryValue();
878 SET_STR(extension_id);
879 SET_INT32(bookmark_writes_since_last_commit);
880 return value;
881 }
882
CommitMessageToValue(const sync_pb::CommitMessage & proto,bool include_specifics)883 base::DictionaryValue* CommitMessageToValue(
884 const sync_pb::CommitMessage& proto,
885 bool include_specifics) {
886 base::DictionaryValue* value = new base::DictionaryValue();
887 value->Set("entries",
888 SyncEntitiesToValue(proto.entries(), include_specifics));
889 SET_STR(cache_guid);
890 SET_REP(extensions_activity, ChromiumExtensionActivityToValue);
891 SET(config_params, ClientConfigParamsToValue);
892 return value;
893 }
894
GetUpdateTriggersToValue(const sync_pb::GetUpdateTriggers & proto)895 base::DictionaryValue* GetUpdateTriggersToValue(
896 const sync_pb::GetUpdateTriggers& proto) {
897 base::DictionaryValue* value = new base::DictionaryValue();
898 SET_STR_REP(notification_hint);
899 SET_BOOL(client_dropped_hints);
900 SET_BOOL(invalidations_out_of_sync);
901 SET_INT64(local_modification_nudges);
902 SET_INT64(datatype_refresh_nudges);
903 return value;
904 }
905
DataTypeProgressMarkerToValue(const sync_pb::DataTypeProgressMarker & proto)906 base::DictionaryValue* DataTypeProgressMarkerToValue(
907 const sync_pb::DataTypeProgressMarker& proto) {
908 base::DictionaryValue* value = new base::DictionaryValue();
909 SET_INT32(data_type_id);
910 SET_BYTES(token);
911 SET_INT64(timestamp_token_for_migration);
912 SET_STR(notification_hint);
913 SET(get_update_triggers, GetUpdateTriggersToValue);
914 return value;
915 }
916
DataTypeContextToValue(const sync_pb::DataTypeContext & proto)917 base::DictionaryValue* DataTypeContextToValue(
918 const sync_pb::DataTypeContext& proto) {
919 base::DictionaryValue* value = new base::DictionaryValue();
920 SET_INT32(data_type_id);
921 SET_STR(context);
922 SET_INT64(version);
923 return value;
924 }
925
GetUpdatesCallerInfoToValue(const sync_pb::GetUpdatesCallerInfo & proto)926 base::DictionaryValue* GetUpdatesCallerInfoToValue(
927 const sync_pb::GetUpdatesCallerInfo& proto) {
928 base::DictionaryValue* value = new base::DictionaryValue();
929 SET_ENUM(source, GetUpdatesSourceString);
930 SET_BOOL(notifications_enabled);
931 return value;
932 }
933
GetUpdatesMessageToValue(const sync_pb::GetUpdatesMessage & proto)934 base::DictionaryValue* GetUpdatesMessageToValue(
935 const sync_pb::GetUpdatesMessage& proto) {
936 base::DictionaryValue* value = new base::DictionaryValue();
937 SET(caller_info, GetUpdatesCallerInfoToValue);
938 SET_BOOL(fetch_folders);
939 SET_INT32(batch_size);
940 SET_REP(from_progress_marker, DataTypeProgressMarkerToValue);
941 SET_BOOL(streaming);
942 SET_BOOL(need_encryption_key);
943 SET_BOOL(create_mobile_bookmarks_folder);
944 SET_ENUM(get_updates_origin, GetUpdatesOriginString);
945 SET_REP(client_contexts, DataTypeContextToValue);
946 return value;
947 }
948
ClientStatusToValue(const sync_pb::ClientStatus & proto)949 base::DictionaryValue* ClientStatusToValue(const sync_pb::ClientStatus& proto) {
950 base::DictionaryValue* value = new base::DictionaryValue();
951 SET_BOOL(hierarchy_conflict_detected);
952 return value;
953 }
954
EntryResponseToValue(const sync_pb::CommitResponse::EntryResponse & proto)955 base::DictionaryValue* EntryResponseToValue(
956 const sync_pb::CommitResponse::EntryResponse& proto) {
957 base::DictionaryValue* value = new base::DictionaryValue();
958 SET_ENUM(response_type, GetResponseTypeString);
959 SET_STR(id_string);
960 SET_STR(parent_id_string);
961 SET_INT64(position_in_parent);
962 SET_INT64(version);
963 SET_STR(name);
964 SET_STR(error_message);
965 SET_INT64(mtime);
966 return value;
967 }
968
CommitResponseToValue(const sync_pb::CommitResponse & proto)969 base::DictionaryValue* CommitResponseToValue(
970 const sync_pb::CommitResponse& proto) {
971 base::DictionaryValue* value = new base::DictionaryValue();
972 SET_REP(entryresponse, EntryResponseToValue);
973 return value;
974 }
975
GetUpdatesResponseToValue(const sync_pb::GetUpdatesResponse & proto,bool include_specifics)976 base::DictionaryValue* GetUpdatesResponseToValue(
977 const sync_pb::GetUpdatesResponse& proto,
978 bool include_specifics) {
979 base::DictionaryValue* value = new base::DictionaryValue();
980 value->Set("entries",
981 SyncEntitiesToValue(proto.entries(), include_specifics));
982 SET_INT64(changes_remaining);
983 SET_REP(new_progress_marker, DataTypeProgressMarkerToValue);
984 SET_REP(context_mutations, DataTypeContextToValue);
985 return value;
986 }
987
ClientCommandToValue(const sync_pb::ClientCommand & proto)988 base::DictionaryValue* ClientCommandToValue(
989 const sync_pb::ClientCommand& proto) {
990 base::DictionaryValue* value = new base::DictionaryValue();
991 SET_INT32(set_sync_poll_interval);
992 SET_INT32(set_sync_long_poll_interval);
993 SET_INT32(max_commit_batch_size);
994 SET_INT32(sessions_commit_delay_seconds);
995 SET_INT32(throttle_delay_seconds);
996 SET_INT32(client_invalidation_hint_buffer_size);
997 return value;
998 }
999
ErrorToValue(const sync_pb::ClientToServerResponse::Error & proto)1000 base::DictionaryValue* ErrorToValue(
1001 const sync_pb::ClientToServerResponse::Error& proto) {
1002 base::DictionaryValue* value = new base::DictionaryValue();
1003 SET_ENUM(error_type, GetErrorTypeString);
1004 SET_STR(error_description);
1005 SET_STR(url);
1006 SET_ENUM(action, GetActionString);
1007 return value;
1008 }
1009
1010 } // namespace
1011
ClientToServerResponseToValue(const sync_pb::ClientToServerResponse & proto,bool include_specifics)1012 base::DictionaryValue* ClientToServerResponseToValue(
1013 const sync_pb::ClientToServerResponse& proto,
1014 bool include_specifics) {
1015 base::DictionaryValue* value = new base::DictionaryValue();
1016 SET(commit, CommitResponseToValue);
1017 if (proto.has_get_updates()) {
1018 value->Set("get_updates", GetUpdatesResponseToValue(proto.get_updates(),
1019 include_specifics));
1020 }
1021
1022 SET(error, ErrorToValue);
1023 SET_ENUM(error_code, GetErrorTypeString);
1024 SET_STR(error_message);
1025 SET_STR(store_birthday);
1026 SET(client_command, ClientCommandToValue);
1027 SET_INT32_REP(migrated_data_type_id);
1028 return value;
1029 }
1030
ClientToServerMessageToValue(const sync_pb::ClientToServerMessage & proto,bool include_specifics)1031 base::DictionaryValue* ClientToServerMessageToValue(
1032 const sync_pb::ClientToServerMessage& proto,
1033 bool include_specifics) {
1034 base::DictionaryValue* value = new base::DictionaryValue();
1035 SET_STR(share);
1036 SET_INT32(protocol_version);
1037 if (proto.has_commit()) {
1038 value->Set("commit",
1039 CommitMessageToValue(proto.commit(), include_specifics));
1040 }
1041
1042 SET(get_updates, GetUpdatesMessageToValue);
1043 SET_STR(store_birthday);
1044 SET_BOOL(sync_problem_detected);
1045 SET(debug_info, DebugInfoToValue);
1046 SET(client_status, ClientStatusToValue);
1047 return value;
1048 }
1049
DatatypeAssociationStatsToValue(const sync_pb::DatatypeAssociationStats & proto)1050 base::DictionaryValue* DatatypeAssociationStatsToValue(
1051 const sync_pb::DatatypeAssociationStats& proto) {
1052 base::DictionaryValue* value = new base::DictionaryValue();
1053 SET_INT32(data_type_id);
1054 SET_INT32(num_local_items_before_association);
1055 SET_INT32(num_sync_items_before_association);
1056 SET_INT32(num_local_items_after_association);
1057 SET_INT32(num_sync_items_after_association);
1058 SET_INT32(num_local_items_added);
1059 SET_INT32(num_local_items_deleted);
1060 SET_INT32(num_local_items_modified);
1061 SET_INT32(num_sync_items_added);
1062 SET_INT32(num_sync_items_deleted);
1063 SET_INT32(num_sync_items_modified);
1064 SET_INT64(local_version_pre_association);
1065 SET_INT64(sync_version_pre_association)
1066 SET_BOOL(had_error);
1067 SET_INT64(download_wait_time_us);
1068 SET_INT64(download_time_us);
1069 SET_INT64(association_wait_time_for_high_priority_us);
1070 SET_INT64(association_wait_time_for_same_priority_us);
1071 return value;
1072 }
1073
DebugEventInfoToValue(const sync_pb::DebugEventInfo & proto)1074 base::DictionaryValue* DebugEventInfoToValue(
1075 const sync_pb::DebugEventInfo& proto) {
1076 base::DictionaryValue* value = new base::DictionaryValue();
1077 SET_ENUM(singleton_event, SingletonDebugEventTypeString);
1078 SET(sync_cycle_completed_event_info, SyncCycleCompletedEventInfoToValue);
1079 SET_INT32(nudging_datatype);
1080 SET_INT32_REP(datatypes_notified_from_server);
1081 SET(datatype_association_stats, DatatypeAssociationStatsToValue);
1082 return value;
1083 }
1084
DebugInfoToValue(const sync_pb::DebugInfo & proto)1085 base::DictionaryValue* DebugInfoToValue(const sync_pb::DebugInfo& proto) {
1086 base::DictionaryValue* value = new base::DictionaryValue();
1087 SET_REP(events, DebugEventInfoToValue);
1088 SET_BOOL(cryptographer_ready);
1089 SET_BOOL(cryptographer_has_pending_keys);
1090 SET_BOOL(events_dropped);
1091 return value;
1092 }
1093
SyncCycleCompletedEventInfoToValue(const sync_pb::SyncCycleCompletedEventInfo & proto)1094 base::DictionaryValue* SyncCycleCompletedEventInfoToValue(
1095 const sync_pb::SyncCycleCompletedEventInfo& proto) {
1096 base::DictionaryValue* value = new base::DictionaryValue();
1097 SET_INT32(num_encryption_conflicts);
1098 SET_INT32(num_hierarchy_conflicts);
1099 SET_INT32(num_server_conflicts);
1100 SET_INT32(num_updates_downloaded);
1101 SET_INT32(num_reflected_updates_downloaded);
1102 SET(caller_info, GetUpdatesCallerInfoToValue);
1103 return value;
1104 }
1105
ClientConfigParamsToValue(const sync_pb::ClientConfigParams & proto)1106 base::DictionaryValue* ClientConfigParamsToValue(
1107 const sync_pb::ClientConfigParams& proto) {
1108 base::DictionaryValue* value = new base::DictionaryValue();
1109 SET_INT32_REP(enabled_type_ids);
1110 SET_BOOL(tabs_datatype_enabled);
1111 return value;
1112 }
1113
AttachmentIdProtoToValue(const sync_pb::AttachmentIdProto & proto)1114 base::DictionaryValue* AttachmentIdProtoToValue(
1115 const sync_pb::AttachmentIdProto& proto) {
1116 base::DictionaryValue* value = new base::DictionaryValue();
1117 SET_STR(unique_id);
1118 return value;
1119 }
1120
1121 #undef SET
1122 #undef SET_REP
1123
1124 #undef SET_BOOL
1125 #undef SET_BYTES
1126 #undef SET_INT32
1127 #undef SET_INT64
1128 #undef SET_INT64_REP
1129 #undef SET_STR
1130 #undef SET_STR_REP
1131
1132 #undef SET_FIELD
1133
1134 } // namespace syncer
1135