1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SYNC_GLUE_EXTENSION_DATA_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SYNC_GLUE_EXTENSION_DATA_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExtensionData is the class used to manage the client and server
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// versions of the data for a particular extension.
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/extension_specifics.pb.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionData {
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum Source {
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CLIENT,
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SERVER,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns an ExtensionData constructed from the given data from the
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // given source.  merged_data() will be equal to |data| and
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NeedsUpdate(source) will return false.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static ExtensionData FromData(
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Source source, const sync_pb::ExtensionSpecifics& data);
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ~ExtensionData();
32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implicit copy constructor and assignment operator welcome.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the version of the data that all sources should
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // eventually have.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const sync_pb::ExtensionSpecifics& merged_data() const;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether or not the data from the given source needs to be
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // updated from merged_data().
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool NeedsUpdate(Source source) const;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Stores the given data as being from the given source, merging it
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // into merged_data().  May change what NeedsUpdate() returns for
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // any source.
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetData(
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Source source, bool merge_user_properties,
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const sync_pb::ExtensionSpecifics& data);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Marks the data from the given data as updated,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // i.e. NeedsUpdate(source) will return false.
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ResolveData(Source source);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::map<Source, sync_pb::ExtensionSpecifics> SourceDataMap;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SourceDataMap source_data_;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sync_pb::ExtensionSpecifics merged_data_;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is private; clients must use FromData().
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionData();
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_SYNC_GLUE_EXTENSION_DATA_H_
66