// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Keep this file in sync with the .proto files in this directory.

#ifndef SYNC_PROTOCOL_PROTO_VALUE_CONVERSIONS_H_
#define SYNC_PROTOCOL_PROTO_VALUE_CONVERSIONS_H_

#include "sync/base/sync_export.h"

namespace base {
class DictionaryValue;
}

namespace sync_pb {
class AppListSpecifics;
class AppNotification;
class AppNotificationSettings;
class AppSettingSpecifics;
class AppSpecifics;
class ArticleSpecifics;
class AttachmentIdProto;
class AutofillProfileSpecifics;
class AutofillSpecifics;
class BookmarkSpecifics;
class ClientConfigParams;
class ClientToServerMessage;
class ClientToServerResponse;
class CoalescedSyncedNotification;
class CollapsedInfo;
class DatatypeAssociationStats;
class DebugEventInfo;
class DebugInfo;
class DeviceInfoSpecifics;
class DeviceInformation;
class DictionarySpecifics;
class EncryptedData;
class EntitySpecifics;
class EverythingDirective;
class ExperimentsSpecifics;
class ExtensionSettingSpecifics;
class ExtensionSpecifics;
class FaviconImageSpecifics;
class FaviconTrackingSpecifics;
class GlobalIdDirective;
class HistoryDeleteDirectiveSpecifics;
class KeystoreEncryptionFlagsSpecifics;
class Media;
class ManagedUserSettingSpecifics;
class ManagedUserSharedSettingSpecifics;
class ManagedUserSpecifics;
class NavigationRedirect;
class NigoriSpecifics;
class PasswordSpecifics;
class PasswordSpecificsData;
class PreferenceSpecifics;
class PriorityPreferenceSpecifics;
class SearchEngineSpecifics;
class SessionHeader;
class SessionSpecifics;
class SessionTab;
class SessionWindow;
class SimpleCollapsedLayout;
class SyncCycleCompletedEventInfo;
class SyncEntity;
class SyncedNotification;
class SyncedNotificationAction;
class SyncedNotificationAppInfo;
class SyncedNotificationAppInfoSpecifics;
class SyncedNotificationDestination;
class SyncedNotificationImage;
class SyncedNotificationProfileImage;
class SyncedNotificationRenderInfo;
class SyncedNotificationSpecifics;
class TabNavigation;
class Target;
class ThemeSpecifics;
class TimeRangeDirective;
class TypedUrlSpecifics;
}  // namespace sync_pb

// Utility functions to convert sync protocol buffers to dictionaries.
// Each protocol field is mapped to a key of the same name.  Repeated
// fields are mapped to array values and sub-messages are mapped to
// sub-dictionary values.
//
// TODO(akalin): Add has_* information.
//
// TODO(akalin): Improve enum support.

namespace syncer {

// Ownership of all returned DictionaryValues are transferred to the
// caller.

// TODO(akalin): Perhaps extend this to decrypt?
SYNC_EXPORT_PRIVATE base::DictionaryValue* EncryptedDataToValue(
    const sync_pb::EncryptedData& encrypted_data);

// Sub-protocol of AppListSpecifics.
SYNC_EXPORT_PRIVATE base::DictionaryValue* AppListSpecificsToValue(
    const sync_pb::AppListSpecifics& proto);

// Sub-protocol of AppSpecifics.
SYNC_EXPORT_PRIVATE base::DictionaryValue* AppSettingsToValue(
    const sync_pb::AppNotificationSettings& app_notification_settings);

// Sub-protocols of SessionSpecifics.

SYNC_EXPORT_PRIVATE base::DictionaryValue* SessionHeaderToValue(
    const sync_pb::SessionHeader& session_header);

SYNC_EXPORT_PRIVATE base::DictionaryValue* SessionTabToValue(
    const sync_pb::SessionTab& session_tab);

SYNC_EXPORT_PRIVATE base::DictionaryValue* SessionWindowToValue(
    const sync_pb::SessionWindow& session_window);

SYNC_EXPORT_PRIVATE base::DictionaryValue* TabNavigationToValue(
    const sync_pb::TabNavigation& tab_navigation);

SYNC_EXPORT_PRIVATE base::DictionaryValue* NavigationRedirectToValue(
    const sync_pb::NavigationRedirect& navigation_redirect);

// Sub-protocol of PasswordSpecifics.

SYNC_EXPORT_PRIVATE base::DictionaryValue* PasswordSpecificsDataToValue(
    const sync_pb::PasswordSpecificsData& password_specifics_data);

// Sub-protocol of NigoriSpecifics.

base::DictionaryValue* DeviceInformationToValue(
    const sync_pb::DeviceInformation& device_information);

// Sub-protocol of HistoryDeleteDirectiveSpecifics.

base::DictionaryValue* GlobalIdDirectiveToValue(
    const sync_pb::GlobalIdDirective& global_id_directive);

base::DictionaryValue* TimeRangeDirectiveToValue(
    const sync_pb::TimeRangeDirective& time_range_directive);

// Sub-protocol of Experiments.

base::DictionaryValue* KeystoreEncryptionToValue(
    const sync_pb::KeystoreEncryptionFlagsSpecifics& proto);

// Sub protocols of SyncedNotifications.

base::DictionaryValue* SimpleCollapsedLayoutToValue(
    const sync_pb::SimpleCollapsedLayout& proto);

base::DictionaryValue* CollapsedInfoToValue(
    const sync_pb::CollapsedInfo& proto);

base::DictionaryValue* RenderInfoToValue(
    const sync_pb::SyncedNotificationRenderInfo& proto);

base::DictionaryValue* CoalescedNotificationToValue(
    const sync_pb::CoalescedSyncedNotification& proto);

base::DictionaryValue* SyncedNotificationActionToValue(
    const sync_pb::SyncedNotificationAction& action);

base::DictionaryValue* SyncedNotificationDestinationToValue(
    const sync_pb::SyncedNotificationDestination& destination);

base::DictionaryValue* SyncedNotificationToValue(
    const sync_pb::SyncedNotification& notification);

SYNC_EXPORT_PRIVATE base::DictionaryValue* SessionSpecificsToValue(
    const sync_pb::SessionSpecifics& session_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* SyncedNotificationImageToValue(
    const sync_pb::SyncedNotificationImage& image);

SYNC_EXPORT_PRIVATE base::DictionaryValue*
    SyncedNotificationProfileImageToValue(
        const sync_pb::SyncedNotificationProfileImage& image);

SYNC_EXPORT_PRIVATE base::DictionaryValue* TargetToValue(
    const sync_pb::Target& target);

// Main *SpecificsToValue functions.

SYNC_EXPORT_PRIVATE base::DictionaryValue* AppNotificationToValue(
    const sync_pb::AppNotification& app_notification_specifics);

base::DictionaryValue* AppSettingSpecificsToValue(
    const sync_pb::AppSettingSpecifics& app_setting_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* AppSpecificsToValue(
    const sync_pb::AppSpecifics& app_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* ArticleSpecificsToValue(
    const sync_pb::ArticleSpecifics& article_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* AutofillSpecificsToValue(
    const sync_pb::AutofillSpecifics& autofill_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* AutofillProfileSpecificsToValue(
    const sync_pb::AutofillProfileSpecifics& autofill_profile_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* BookmarkSpecificsToValue(
    const sync_pb::BookmarkSpecifics& bookmark_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* DeviceInfoSpecificsToValue(
    const sync_pb::DeviceInfoSpecifics& device_info_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* DictionarySpecificsToValue(
    const sync_pb::DictionarySpecifics& dictionary_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* ExperimentsSpecificsToValue(
    const sync_pb::ExperimentsSpecifics& proto);

SYNC_EXPORT_PRIVATE base::DictionaryValue* PriorityPreferenceSpecificsToValue(
    const sync_pb::PriorityPreferenceSpecifics& proto);

SYNC_EXPORT_PRIVATE base::DictionaryValue* ExtensionSettingSpecificsToValue(
    const sync_pb::ExtensionSettingSpecifics& extension_setting_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* ExtensionSpecificsToValue(
    const sync_pb::ExtensionSpecifics& extension_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* FaviconImageSpecificsToValue(
    const sync_pb::FaviconImageSpecifics& favicon_image_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* FaviconTrackingSpecificsToValue(
    const sync_pb::FaviconTrackingSpecifics& favicon_tracking_specifics);

SYNC_EXPORT base::DictionaryValue* HistoryDeleteDirectiveSpecificsToValue(
    const sync_pb::HistoryDeleteDirectiveSpecifics&
        history_delete_directive_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* ManagedUserSettingSpecificsToValue(
    const sync_pb::ManagedUserSettingSpecifics& managed_user_setting_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* ManagedUserSpecificsToValue(
    const sync_pb::ManagedUserSpecifics& managed_user_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue*
    ManagedUserSharedSettingSpecificsToValue(
        const sync_pb::ManagedUserSharedSettingSpecifics&
            managed_user_shared_setting_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* MediaToValue(
    const sync_pb::Media& media);

SYNC_EXPORT_PRIVATE base::DictionaryValue* NigoriSpecificsToValue(
    const sync_pb::NigoriSpecifics& nigori_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* PasswordSpecificsToValue(
    const sync_pb::PasswordSpecifics& password_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* PreferenceSpecificsToValue(
    const sync_pb::PreferenceSpecifics& password_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue*
    SyncedNotificationAppInfoSpecificsToValue(
        const sync_pb::SyncedNotificationAppInfoSpecifics&
        synced_notification_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* SyncedNotificationSpecificsToValue(
    const sync_pb::SyncedNotificationSpecifics&
    synced_notification_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* SearchEngineSpecificsToValue(
    const sync_pb::SearchEngineSpecifics& search_engine_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* ThemeSpecificsToValue(
    const sync_pb::ThemeSpecifics& theme_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* TypedUrlSpecificsToValue(
    const sync_pb::TypedUrlSpecifics& typed_url_specifics);

// Any present extensions are mapped to sub-dictionary values with the
// key equal to the extension name.
SYNC_EXPORT_PRIVATE base::DictionaryValue* EntitySpecificsToValue(
    const sync_pb::EntitySpecifics& specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* SyncEntityToValue(
    const sync_pb::SyncEntity& entity,
    bool include_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* ClientToServerMessageToValue(
    const sync_pb::ClientToServerMessage& proto,
    bool include_specifics);

SYNC_EXPORT_PRIVATE base::DictionaryValue* ClientToServerResponseToValue(
    const sync_pb::ClientToServerResponse& proto,
    bool include_specifics);

base::DictionaryValue* DatatypeAssociationStatsToValue(
    const sync_pb::DatatypeAssociationStats& proto);

base::DictionaryValue* DebugEventInfoToValue(
    const sync_pb::DebugEventInfo& proto);

base::DictionaryValue* DebugInfoToValue(
    const sync_pb::DebugInfo& proto);

base::DictionaryValue* SyncCycleCompletedEventInfoToValue(
    const sync_pb::SyncCycleCompletedEventInfo& proto);

base::DictionaryValue* ClientConfigParamsToValue(
    const sync_pb::ClientConfigParams& proto);

SYNC_EXPORT_PRIVATE base::DictionaryValue* AttachmentIdProtoToValue(
    const sync_pb::AttachmentIdProto& proto);

}  // namespace syncer

#endif  // SYNC_PROTOCOL_PROTO_VALUE_CONVERSIONS_H_