1 // Copyright 2018 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.
4 
5 #include "components/offline_items_collection/core/filtered_offline_item_observer.h"
6 #include <utility>
7 
8 namespace offline_items_collection {
9 
FilteredOfflineItemObserver(OfflineContentProvider * provider)10 FilteredOfflineItemObserver::FilteredOfflineItemObserver(
11     OfflineContentProvider* provider)
12     : provider_(provider) {
13   provider_->AddObserver(this);
14 }
15 
~FilteredOfflineItemObserver()16 FilteredOfflineItemObserver::~FilteredOfflineItemObserver() {
17   provider_->RemoveObserver(this);
18 }
19 
AddObserver(const ContentId & id,Observer * observer)20 void FilteredOfflineItemObserver::AddObserver(const ContentId& id,
21                                               Observer* observer) {
22   if (observers_.find(id) == observers_.end())
23     observers_.insert(std::make_pair(id, std::make_unique<ObserverValue>()));
24 
25   observers_[id]->AddObserver(observer);
26 }
27 
RemoveObserver(const ContentId & id,Observer * observer)28 void FilteredOfflineItemObserver::RemoveObserver(const ContentId& id,
29                                                  Observer* observer) {
30   auto it = observers_.find(id);
31   if (it == observers_.end())
32     return;
33 
34   it->second->RemoveObserver(observer);
35 
36   if (!it->second->might_have_observers())
37     observers_.erase(it);
38 }
39 
OnItemsAdded(const OfflineContentProvider::OfflineItemList & items)40 void FilteredOfflineItemObserver::OnItemsAdded(
41     const OfflineContentProvider::OfflineItemList& items) {}
42 
OnItemRemoved(const ContentId & id)43 void FilteredOfflineItemObserver::OnItemRemoved(const ContentId& id) {
44   auto it = observers_.find(id);
45   if (it == observers_.end())
46     return;
47 
48   for (auto& observer : *(it->second))
49     observer.OnItemRemoved(id);
50 }
51 
OnItemUpdated(const OfflineItem & item,const base::Optional<UpdateDelta> & update_delta)52 void FilteredOfflineItemObserver::OnItemUpdated(
53     const OfflineItem& item,
54     const base::Optional<UpdateDelta>& update_delta) {
55   auto it = observers_.find(item.id);
56   if (it == observers_.end())
57     return;
58 
59   for (auto& observer : *(it->second))
60     observer.OnItemUpdated(item, update_delta);
61 }
62 
63 }  // namespace offline_items_collection
64