Home | History | Annotate | Download | only in browser
      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