Home | History | Annotate | Download | only in sessions
      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 SYNC_SESSIONS_DIRECTORY_TYPE_DEBUG_INFO_EMITTER_H_
      6 #define SYNC_SESSIONS_DIRECTORY_TYPE_DEBUG_INFO_EMITTER_H_
      7 
      8 #include "base/macros.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/observer_list.h"
     11 #include "base/values.h"
     12 #include "sync/base/sync_export.h"
     13 #include "sync/internal_api/public/sessions/commit_counters.h"
     14 #include "sync/internal_api/public/sessions/update_counters.h"
     15 #include "sync/syncable/directory.h"
     16 
     17 namespace syncer {
     18 
     19 class DirectoryCommitContributor;
     20 class TypeDebugInfoObserver;
     21 
     22 // Supports various kinds of debugging requests for a certain directory type.
     23 //
     24 // The GetAllNodes() function is used to help export a snapshot of all current
     25 // nodes to its caller.  The complexity required to manage the request mostly
     26 // lives elsewhere.
     27 //
     28 // The Emit*() functions send updates to registered TypeDebugInfoObservers.
     29 // The DirectoryTypeDebugInfoEmitter does not directly own that list; it is
     30 // managed by the ModelTypeRegistry.
     31 //
     32 // For Update and Commit counters, the job of keeping the counters up to date
     33 // is delegated to the UpdateHandler and CommitContributors.  For the Stats
     34 // counters, the emitter will use its type_ and directory_ members to fetch all
     35 // the required information on demand.
     36 class SYNC_EXPORT_PRIVATE DirectoryTypeDebugInfoEmitter {
     37  public:
     38   // Standard constructor for non-tests.
     39   //
     40   // The |directory| and |observers| arguments are not owned.  Both may be
     41   // modified outside of this object and both are expected to outlive this
     42   // object.
     43   DirectoryTypeDebugInfoEmitter(
     44       syncable::Directory* directory,
     45       syncer::ModelType type,
     46       ObserverList<TypeDebugInfoObserver>* observers);
     47 
     48   // A simple constructor for tests.  Should not be used in real code.
     49   DirectoryTypeDebugInfoEmitter(
     50       ModelType type,
     51       ObserverList<TypeDebugInfoObserver>* observers);
     52 
     53   virtual ~DirectoryTypeDebugInfoEmitter();
     54 
     55   // Returns a ListValue representation of all known nodes of this type.
     56   scoped_ptr<base::ListValue> GetAllNodes();
     57 
     58   // Returns a reference to the current commit counters.
     59   const CommitCounters& GetCommitCounters() const;
     60 
     61   // Allows others to mutate the commit counters.
     62   CommitCounters* GetMutableCommitCounters();
     63 
     64   // Triggerss a commit counters update to registered observers.
     65   void EmitCommitCountersUpdate();
     66 
     67   // Returns a reference to the current update counters.
     68   const UpdateCounters& GetUpdateCounters() const;
     69 
     70   // Allows others to mutate the update counters.
     71   UpdateCounters* GetMutableUpdateCounters();
     72 
     73   // Triggers an update counters update to registered observers.
     74   void EmitUpdateCountersUpdate();
     75 
     76   // Triggers a status counters update to registered observers.
     77   void EmitStatusCountersUpdate();
     78 
     79  private:
     80   syncable::Directory* directory_;
     81 
     82   const ModelType type_;
     83 
     84   CommitCounters commit_counters_;
     85   UpdateCounters update_counters_;
     86 
     87   // Because there are so many emitters that come into and out of existence, it
     88   // doesn't make sense to have them manage their own observer list.  They all
     89   // share one observer list that is provided by their owner and which is
     90   // guaranteed to outlive them.
     91   ObserverList<TypeDebugInfoObserver>* type_debug_info_observers_;
     92 
     93   DISALLOW_COPY_AND_ASSIGN(DirectoryTypeDebugInfoEmitter);
     94 };
     95 
     96 }  // namespace syncer
     97 
     98 #endif  // SYNC_SESSIONS_DIRECTORY_TYPE_DEBUG_INFO_EMITTER_H_
     99