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