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#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_LOG_ROUTER_H_
6#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_LOG_ROUTER_H_
7
8#include <set>
9#include <string>
10
11#include "base/macros.h"
12#include "base/observer_list.h"
13
14namespace password_manager {
15
16class LogReceiver;
17class PasswordManagerClient;
18
19// The router stands between PasswordManagerClient instances and log receivers.
20// During the process of saving a password, the password manager code generates
21// the log strings, and passes them to the router. The router distributes the
22// logs to the receivers for displaying.
23class LogRouter {
24 public:
25  LogRouter();
26  virtual ~LogRouter();
27
28  // Passes logs to the router. Only call when there are receivers registered.
29  void ProcessLog(const std::string& text);
30
31  // All four (Unr|R)egister* methods below are safe to call from the
32  // constructor of the registered object, because they do not call that object,
33  // and the router only runs on a single thread.
34
35  // The clients must register to be notified about whether there are some
36  // receivers or not. RegisterClient adds |client| to the right observer list
37  // and returns true iff there are some receivers registered.
38  bool RegisterClient(PasswordManagerClient* client);
39  // Remove |client| from the observers list.
40  void UnregisterClient(PasswordManagerClient* client);
41
42  // The receivers must register to get updates with new logs in the future.
43  // RegisterReceiver adds |receiver| to the right observer list, and returns
44  // the logs accumulated so far. (It returns by value, not const ref, to
45  // provide a snapshot as opposed to a link to |accumulated_logs_|.)
46  std::string RegisterReceiver(LogReceiver* receiver);
47  // Remove |receiver| from the observers list.
48  void UnregisterReceiver(LogReceiver* receiver);
49
50 private:
51  // Observer lists for clients and receivers. The |true| in the template
52  // specialisation means that they will check that all observers were removed
53  // on destruction.
54  ObserverList<PasswordManagerClient, true> clients_;
55  ObserverList<LogReceiver, true> receivers_;
56
57  // Logs accumulated since the first receiver was registered.
58  std::string accumulated_logs_;
59
60  DISALLOW_COPY_AND_ASSIGN(LogRouter);
61};
62
63}  // namespace password_manager
64
65#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_LOG_ROUTER_H_
66