// Copyright (c) 2010 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_DATA_H_
#define CHROME_BROWSER_SYNC_GLUE_EXTENSION_DATA_H_
#pragma once

// ExtensionData is the class used to manage the client and server
// versions of the data for a particular extension.

#include <map>

#include "chrome/browser/sync/protocol/extension_specifics.pb.h"

namespace browser_sync {

class ExtensionData {
 public:
  enum Source {
    CLIENT,
    SERVER,
  };

  // Returns an ExtensionData constructed from the given data from the
  // given source.  merged_data() will be equal to |data| and
  // NeedsUpdate(source) will return false.
  static ExtensionData FromData(
      Source source, const sync_pb::ExtensionSpecifics& data);

  ~ExtensionData();

  // Implicit copy constructor and assignment operator welcome.

  // Returns the version of the data that all sources should
  // eventually have.
  const sync_pb::ExtensionSpecifics& merged_data() const;

  // Returns whether or not the data from the given source needs to be
  // updated from merged_data().
  bool NeedsUpdate(Source source) const;

  // Stores the given data as being from the given source, merging it
  // into merged_data().  May change what NeedsUpdate() returns for
  // any source.
  void SetData(
      Source source, bool merge_user_properties,
      const sync_pb::ExtensionSpecifics& data);

  // Marks the data from the given data as updated,
  // i.e. NeedsUpdate(source) will return false.
  void ResolveData(Source source);

 private:
  typedef std::map<Source, sync_pb::ExtensionSpecifics> SourceDataMap;
  SourceDataMap source_data_;
  sync_pb::ExtensionSpecifics merged_data_;

  // This is private; clients must use FromData().
  ExtensionData();
};

}  // namespace

#endif  // CHROME_BROWSER_SYNC_GLUE_EXTENSION_DATA_H_