// Copyright (c) 2011 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.
#ifndef CHROME_BROWSER_SYNC_GLUE_EXTENSION_UTIL_H_
#define CHROME_BROWSER_SYNC_GLUE_EXTENSION_UTIL_H_
#pragma once
// This file contains some low-level utility functions used by
// extensions sync.
#include <string>
class Extension;
class ExtensionPrefs;
class ExtensionServiceInterface;
struct ExtensionSyncData;
struct UninstalledExtensionInfo;
namespace sync_pb {
class ExtensionSpecifics;
} // sync_pb
namespace browser_sync {
// Returns whether or not the given extension is one we want to sync.
bool IsExtensionValid(const Extension& extension);
// Stringifies the given ExtensionSpecifics.
std::string ExtensionSpecificsToString(
const sync_pb::ExtensionSpecifics& specifics);
// Returns whether or not the values of the given specifics are valid,
// in particular the id, version, and update URL.
bool IsExtensionSpecificsValid(
const sync_pb::ExtensionSpecifics& specifics);
// Equivalent to DCHECK(IsExtensionSpecificsValid(specifics)) <<
// ExtensionSpecificsToString(specifics);
void DcheckIsExtensionSpecificsValid(
const sync_pb::ExtensionSpecifics& specifics);
// Returns true iff two ExtensionSpecifics denote the same extension
// state. Neither |a| nor |b| need to be valid.
bool AreExtensionSpecificsEqual(const sync_pb::ExtensionSpecifics& a,
const sync_pb::ExtensionSpecifics& b);
// Returns true iff the given ExtensionSpecifics is equal to the empty
// ExtensionSpecifics object. |specifics| does not have to be valid
// and indeed, IsExtensionSpecificsValid(specifics) ->
// !IsExtensionSpecificsUnset(specifics).
bool IsExtensionSpecificsUnset(
const sync_pb::ExtensionSpecifics& specifics);
// Copies the user properties from |specifics| into |dest_specifics|.
// User properties are properties that are set by the user, i.e. not
// inherent to the extension. Currently they include |enabled| and
// |incognito_enabled|. Neither parameter need be valid.
void CopyUserProperties(
const sync_pb::ExtensionSpecifics& specifics,
sync_pb::ExtensionSpecifics* dest_specifics);
// Copies everything but non-user properties. Neither parameter need
// be valid.
void CopyNonUserProperties(
const sync_pb::ExtensionSpecifics& specifics,
sync_pb::ExtensionSpecifics* dest_specifics);
// Returns true iff two ExtensionSpecifics have the same user
// properties. Neither |a| nor |b| need to be valid.
bool AreExtensionSpecificsUserPropertiesEqual(
const sync_pb::ExtensionSpecifics& a,
const sync_pb::ExtensionSpecifics& b);
// Returns true iff two ExtensionSpecifics have the same non-user
// properties. Neither |a| nor |b| need to be valid.
bool AreExtensionSpecificsNonUserPropertiesEqual(
const sync_pb::ExtensionSpecifics& a,
const sync_pb::ExtensionSpecifics& b);
// Fills |specifics| with information taken from |extension|, which
// must be a syncable extension. |specifics| will be valid after this
// function is called.
void GetExtensionSpecifics(const Extension& extension,
const ExtensionServiceInterface& extension_service,
sync_pb::ExtensionSpecifics* specifics);
// Merge |specifics| into |merged_specifics|. Both must be valid and
// have the same ID. The merge policy is currently to copy the
// non-user properties of |specifics| into |merged_specifics| (and the
// user properties if |merge_user_properties| is set) if |specifics|
// has a more recent or the same version as |merged_specifics|.
void MergeExtensionSpecifics(
const sync_pb::ExtensionSpecifics& specifics,
bool merge_user_properties,
sync_pb::ExtensionSpecifics* merged_specifics);
// Fills |sync_data| with the data from |specifics|. Returns true iff
// succesful.
bool GetExtensionSyncData(
const sync_pb::ExtensionSpecifics& specifics,
ExtensionSyncData* sync_data);
} // namespace browser_sync
#endif // CHROME_BROWSER_SYNC_GLUE_EXTENSION_UTIL_H_