17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_SYNC_STARTUP_TRACKER_H_
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CHROME_BROWSER_SYNC_SYNC_STARTUP_TRACKER_H_
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/basictypes.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/compiler_specific.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_observer.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class Profile;
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// SyncStartupTracker provides a centralized way for observers to detect when
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// ProfileSyncService has successfully started up, or when startup has failed
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// due to some kind of error. This code was originally part of SigninTracker
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// but now that sync initialization is no longer a required part of signin,
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// it has been broken out of that class so only those places that care about
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// sync initialization depend on it.
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class SyncStartupTracker : public ProfileSyncServiceObserver {
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Observer interface used to notify observers when sync has started up.
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  class Observer {
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   public:
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Observer() {}
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    virtual void SyncStartupCompleted() = 0;
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    virtual void SyncStartupFailed() = 0;
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SyncStartupTracker(Profile* profile, Observer* observer);
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~SyncStartupTracker();
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  enum SyncServiceState {
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Sync backend is still starting up.
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    SYNC_STARTUP_PENDING,
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // An error has been detected that prevents the sync backend from starting
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // up.
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    SYNC_STARTUP_ERROR,
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Sync startup has completed (i.e. ProfileSyncService::sync_initialized()
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // returns true).
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    SYNC_STARTUP_COMPLETE
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Returns the current state of the sync service.
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static SyncServiceState GetSyncServiceState(Profile* profile);
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // ProfileSyncServiceObserver implementation.
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnStateChanged() OVERRIDE;
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Checks the current service state and notifies |observer_| if the state
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // has changed. Note that it is expected that the observer will free this
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // object, so callers should not reference this object after making this call.
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void CheckServiceState();
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Profile whose ProfileSyncService we should track.
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Profile* profile_;
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Weak pointer to the observer to notify.
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Observer* observer_;
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SyncStartupTracker);
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_SYNC_STARTUP_TRACKER_H_
67