1// Copyright 2014 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/password_manager/core/browser/log_router.h"
6
7#include "base/stl_util.h"
8#include "components/password_manager/core/browser/log_receiver.h"
9#include "components/password_manager/core/browser/password_manager_client.h"
10
11namespace password_manager {
12
13LogRouter::LogRouter() {
14}
15
16LogRouter::~LogRouter() {
17}
18
19void LogRouter::ProcessLog(const std::string& text) {
20  // This may not be called when there are no receivers (i.e., the router is
21  // inactive), because in that case the logs cannot be displayed.
22  DCHECK(receivers_.might_have_observers());
23  accumulated_logs_.append(text);
24  FOR_EACH_OBSERVER(
25      LogReceiver, receivers_, LogSavePasswordProgress(text));
26}
27
28bool LogRouter::RegisterClient(PasswordManagerClient* client) {
29  DCHECK(client);
30  clients_.AddObserver(client);
31  return receivers_.might_have_observers();
32}
33
34void LogRouter::UnregisterClient(PasswordManagerClient* client) {
35  DCHECK(clients_.HasObserver(client));
36  clients_.RemoveObserver(client);
37}
38
39std::string LogRouter::RegisterReceiver(LogReceiver* receiver) {
40  DCHECK(receiver);
41  DCHECK(accumulated_logs_.empty() || receivers_.might_have_observers());
42
43  if (!receivers_.might_have_observers()) {
44    FOR_EACH_OBSERVER(
45        PasswordManagerClient, clients_, OnLogRouterAvailabilityChanged(true));
46  }
47  receivers_.AddObserver(receiver);
48  return accumulated_logs_;
49}
50
51void LogRouter::UnregisterReceiver(LogReceiver* receiver) {
52  DCHECK(receivers_.HasObserver(receiver));
53  receivers_.RemoveObserver(receiver);
54  if (!receivers_.might_have_observers()) {
55    accumulated_logs_.clear();
56    FOR_EACH_OBSERVER(
57        PasswordManagerClient, clients_, OnLogRouterAvailabilityChanged(false));
58  }
59}
60
61}  // namespace password_manager
62