1 // Copyright 2013 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.
5 #ifndef COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_MODEL_H_
6 #define COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_MODEL_H_
11 #include "base/containers/hash_tables.h"
12 #include "base/id_map.h"
13 #include "components/dom_distiller/core/article_entry.h"
14 #include "sync/api/sync_change.h"
15 #include "sync/api/sync_change_processor.h" // syncer::SyncChangeList
16 #include "sync/api/sync_data.h"
19 namespace dom_distiller
{
21 // This stores the in-memory model of the DOM distiller list. Entries can be
22 // looked up by URL or by entry_id.
23 // The model assumes that an URL corresponds to at most a single entry. If this
24 // assumption is broken, lookup by URL may return unexpected results.
25 class DomDistillerModel
{
28 explicit DomDistillerModel(const std::vector
<ArticleEntry
>& initial_data
);
32 // Lookup an ArticleEntry by ID or URL. Returns whether a corresponding entry
33 // was found. On success, if |entry| is not null, it will contain the entry.
34 bool GetEntryById(const std::string
& entry_id
, ArticleEntry
* entry
) const;
35 bool GetEntryByUrl(const GURL
& url
, ArticleEntry
* entry
) const;
37 std::vector
<ArticleEntry
> GetEntries() const;
38 size_t GetNumEntries() const;
40 syncer::SyncDataList
GetAllSyncData() const;
42 // Convert a SyncDataList to a SyncChangeList of add or update changes based
43 // on the state of the model. Also calculate the entries missing from the
45 void CalculateChangesForMerge(const syncer::SyncDataList
& data
,
46 syncer::SyncChangeList
* changes_to_apply
,
47 syncer::SyncChangeList
* changes_missing
);
49 // Applies the change list to the model, appending the actual changes made to
50 // the model to |changes_applied|. If conflict resolution does not apply the
51 // requested change, then adds the "diff" between what was requested and what
52 // was actually applied to |changes_missing|.
53 // Note: Currently conflicts are resolved by just applying the requested
54 // change. This means nothing will be added to |changes_missing|.
55 void ApplyChangesToModel(const syncer::SyncChangeList
& change_list
,
56 syncer::SyncChangeList
* changes_applied
,
57 syncer::SyncChangeList
* changes_missing
);
60 typedef int32 KeyType
;
61 typedef base::hash_map
<KeyType
, ArticleEntry
> EntryMap
;
62 typedef base::hash_map
<std::string
, KeyType
> StringToKeyMap
;
64 void AddEntry(const ArticleEntry
& entry
);
65 void RemoveEntry(const ArticleEntry
& entry
);
67 // Lookup an entry's key by ID or URL. Returns whether a corresponding key was
68 // found. On success, if |key| is not null, it will contain the entry.
69 bool GetKeyById(const std::string
& entry_id
, KeyType
* key
) const;
70 bool GetKeyByUrl(const GURL
& url
, KeyType
* key
) const;
72 // If |entry| is not null, assigns the entry for |key| to it. |key| must map
73 // to an entry in |entries_|.
74 void GetEntryByKey(KeyType key
, ArticleEntry
* entry
) const;
76 void ApplyChangeToModel(const syncer::SyncChange
& change
,
77 syncer::SyncChangeList
* changes_applied
,
78 syncer::SyncChangeList
* changes_missing
);
82 StringToKeyMap url_to_key_map_
;
83 StringToKeyMap entry_id_to_key_map_
;
85 DISALLOW_COPY_AND_ASSIGN(DomDistillerModel
);
88 } // namespace dom_distiller
90 #endif // COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_MODEL_H_