• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 namespace password_manager {
15 
16 class LogReceiver;
17 class 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.
23 class 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