Index: components/password_manager/core/browser/log_router.h |
diff --git a/components/password_manager/core/browser/log_router.h b/components/password_manager/core/browser/log_router.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c7ab218e4951433fd37ea73a7b3a13b2d79e2a67 |
--- /dev/null |
+++ b/components/password_manager/core/browser/log_router.h |
@@ -0,0 +1,68 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_LOG_ROUTER_H_ |
+#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_LOG_ROUTER_H_ |
+ |
+#include <set> |
+#include <string> |
+ |
+#include "base/macros.h" |
+#include "base/observer_list.h" |
+ |
+namespace password_manager { |
+ |
+class PasswordManagerClient; |
+class PasswordManagerLogger; |
+ |
+// The router stands between PasswordManagerClient instances and log receivers. |
+// During the process of saving a password, the password manager code generates |
+// the log strings, and passes them to the router. The router distributes the |
+// logs to the receivers for displaying. |
+// |
+// TODO(vabr): The receivers are objects of type PasswordManagerLogger. That |
+// type should be renamed to LogReceiver instead. |
+class LogRouter { |
+ public: |
+ LogRouter(); |
+ virtual ~LogRouter(); |
+ |
+ // Passes logs to the router. Only call when there are receivers registered. |
+ void ProcessLog(const std::string& text); |
+ |
+ // All four (Unr|R)egister* methods below are safe to call from the |
+ // constructor of the registered object, because they do not call that object, |
+ // and the router only runs on a single thread. |
+ |
+ // The clients must register to be notified about whether there are some |
+ // receivers or not. RegisterClient adds |client| to the right observer list |
+ // and returns true iff there are some receivers registered. |
+ bool RegisterClient(PasswordManagerClient* client); |
+ // Remove |client| from the observers list. |
+ void UnregisterClient(PasswordManagerClient* client); |
+ |
+ // The receivers must register to get updates with new logs in the future. |
+ // RegisterReceiver adds |receiver| to the right observer list, and returns |
+ // the logs accumulated so far. (It returns by value, not const ref, to |
+ // provide a snapshot as opposed to a link to |accumulated_logs_|.) |
+ std::string RegisterReceiver(PasswordManagerLogger* receiver); |
+ // Remove |receiver| from the observers list. |
+ void UnregisterReceiver(PasswordManagerLogger* receiver); |
+ |
+ private: |
+ // Observer lists for clients and receivers. The |true| in the template |
+ // specialisation means that they will check that all observers were removed |
+ // on destruction. |
+ ObserverList<PasswordManagerClient, true> clients_; |
+ ObserverList<PasswordManagerLogger, true> receivers_; |
+ |
+ // Logs accumulated since the first receiver was registered. |
+ std::string accumulated_logs_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LogRouter); |
+}; |
+ |
+} // namespace password_manager |
+ |
+#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_LOG_ROUTER_H_ |