1// Copyright (c) 2013 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 CHROME_BROWSER_SYNC_SYNC_STARTUP_TRACKER_H_
6#define CHROME_BROWSER_SYNC_SYNC_STARTUP_TRACKER_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "chrome/browser/sync/profile_sync_service_observer.h"
11
12class Profile;
13
14// SyncStartupTracker provides a centralized way for observers to detect when
15// ProfileSyncService has successfully started up, or when startup has failed
16// due to some kind of error. This code was originally part of SigninTracker
17// but now that sync initialization is no longer a required part of signin,
18// it has been broken out of that class so only those places that care about
19// sync initialization depend on it.
20class SyncStartupTracker : public ProfileSyncServiceObserver {
21 public:
22  // Observer interface used to notify observers when sync has started up.
23  class Observer {
24   public:
25    virtual ~Observer() {}
26
27    virtual void SyncStartupCompleted() = 0;
28    virtual void SyncStartupFailed() = 0;
29  };
30
31  SyncStartupTracker(Profile* profile, Observer* observer);
32  virtual ~SyncStartupTracker();
33
34  enum SyncServiceState {
35    // Sync backend is still starting up.
36    SYNC_STARTUP_PENDING,
37    // An error has been detected that prevents the sync backend from starting
38    // up.
39    SYNC_STARTUP_ERROR,
40    // Sync startup has completed (i.e. ProfileSyncService::sync_initialized()
41    // returns true).
42    SYNC_STARTUP_COMPLETE
43  };
44
45  // Returns the current state of the sync service.
46  static SyncServiceState GetSyncServiceState(Profile* profile);
47
48  // ProfileSyncServiceObserver implementation.
49  virtual void OnStateChanged() OVERRIDE;
50
51 private:
52  // Checks the current service state and notifies |observer_| if the state
53  // has changed. Note that it is expected that the observer will free this
54  // object, so callers should not reference this object after making this call.
55  void CheckServiceState();
56
57  // Profile whose ProfileSyncService we should track.
58  Profile* profile_;
59
60  // Weak pointer to the observer to notify.
61  Observer* observer_;
62
63  DISALLOW_COPY_AND_ASSIGN(SyncStartupTracker);
64};
65
66#endif  // CHROME_BROWSER_SYNC_SYNC_STARTUP_TRACKER_H_
67