| Index: chrome/browser/sync/engine/all_status.h
|
| ===================================================================
|
| --- chrome/browser/sync/engine/all_status.h (revision 0)
|
| +++ chrome/browser/sync/engine/all_status.h (revision 0)
|
| @@ -0,0 +1,210 @@
|
| +// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +//
|
| +// The all status object watches various sync engine components and aggregates
|
| +// the status of all of them into one place.
|
| +//
|
| +#ifndef CHROME_BROWSER_SYNC_ENGINE_ALL_STATUS_H_
|
| +#define CHROME_BROWSER_SYNC_ENGINE_ALL_STATUS_H_
|
| +
|
| +#include <map>
|
| +
|
| +#include "base/atomicops.h"
|
| +#include "base/scoped_ptr.h"
|
| +#include "chrome/browser/sync/engine/syncer_status.h"
|
| +#include "chrome/browser/sync/util/event_sys.h"
|
| +#include "chrome/browser/sync/util/pthread_helpers.h"
|
| +
|
| +namespace browser_sync {
|
| +class AuthWatcher;
|
| +class GaiaAuthenticator;
|
| +class ScopedStatusLockWithNotify;
|
| +class ServerConnectionManager;
|
| +class Syncer;
|
| +class SyncerThread;
|
| +class TalkMediator;
|
| +struct AllStatusEvent;
|
| +struct AuthWatcherEvent;
|
| +struct GaiaAuthEvent;
|
| +struct ServerConnectionEvent;
|
| +struct SyncerEvent;
|
| +struct TalkMediatorEvent;
|
| +
|
| +class AllStatus {
|
| + friend class ScopedStatusLockWithNotify;
|
| + public:
|
| + typedef EventChannel<AllStatusEvent, PThreadMutex> Channel;
|
| +
|
| + // Status of the entire sync process distilled into a single enum.
|
| + enum SyncStatus {
|
| + // Can't connect to server, but there are no pending changes in
|
| + // our local dataase.
|
| + OFFLINE,
|
| + // Can't connect to server, and there are pending changes in our
|
| + // local cache.
|
| + OFFLINE_UNSYNCED,
|
| + // Connected and syncing.
|
| + SYNCING,
|
| + // Connected, no pending changes.
|
| + READY,
|
| + // Internal sync error.
|
| + CONFLICT,
|
| + // Can't connect to server, and we haven't completed the initial
|
| + // sync yet. So there's nothing we can do but wait for the server.
|
| + OFFLINE_UNUSABLE,
|
| + // For array sizing, etc.
|
| + ICON_STATUS_COUNT
|
| + };
|
| +
|
| + struct Status {
|
| + SyncStatus icon;
|
| + int unsynced_count;
|
| + int conflicting_count;
|
| + bool syncing;
|
| + bool authenticated; // Successfully authenticated via gaia
|
| + // True if we have received at least one good reply from the server.
|
| + bool server_up;
|
| + bool server_reachable;
|
| + // True after a client has done a first sync.
|
| + bool initial_sync_ended;
|
| + // True if any syncer is stuck.
|
| + bool syncer_stuck;
|
| + // True if any syncer is stopped because of server issues.
|
| + bool server_broken;
|
| + // True only if the notification listener has subscribed.
|
| + bool notifications_enabled;
|
| + // Notifications counters updated by the actions in synapi.
|
| + int notifications_received;
|
| + int notifications_sent;
|
| + // The max number of consecutive errors from any component.
|
| + int max_consecutive_errors;
|
| + bool disk_full;
|
| +
|
| + // Contains current transfer item meta handle
|
| + int64 current_item_meta_handle;
|
| + // The next two values will be equal if all updates have been received.
|
| + // total updates available.
|
| + int64 updates_available;
|
| + // total updates received.
|
| + int64 updates_received;
|
| + };
|
| +
|
| + // Maximum interval for exponential backoff.
|
| + static const int kMaxBackoffSeconds = 60 * 60 * 4; // 4 hours.
|
| +
|
| + AllStatus();
|
| + ~AllStatus();
|
| +
|
| + void WatchConnectionManager(ServerConnectionManager* conn_mgr);
|
| + void HandleServerConnectionEvent(const ServerConnectionEvent& event);
|
| +
|
| + // Both WatchAuthenticator/HandleGaiaAuthEvent and WatchAuthWatcher/
|
| + // HandleAuthWatcherEventachieve have the same goal; use only one of the
|
| + // following two. (The AuthWatcher is watched under Windows; the
|
| + // GaiaAuthenticator is watched under Mac/Linux.)
|
| + void WatchAuthenticator(GaiaAuthenticator* gaia);
|
| + void HandleGaiaAuthEvent(const GaiaAuthEvent& event);
|
| +
|
| + void WatchAuthWatcher(AuthWatcher* auth_watcher);
|
| + void HandleAuthWatcherEvent(const AuthWatcherEvent& event);
|
| +
|
| + void WatchSyncerThread(SyncerThread* syncer_thread);
|
| + void HandleSyncerEvent(const SyncerEvent& event);
|
| +
|
| + void WatchTalkMediator(
|
| + const browser_sync::TalkMediator* talk_mediator);
|
| + void HandleTalkMediatorEvent(
|
| + const browser_sync::TalkMediatorEvent& event);
|
| +
|
| + // Returns a string description of the SyncStatus (currently just the ascii
|
| + // version of the enum). Will LOG(FATAL) if the status us out of range.
|
| + static const char* GetSyncStatusString(SyncStatus status);
|
| +
|
| + Channel* channel() const { return channel_; }
|
| +
|
| + Status status() const;
|
| +
|
| + // DDOS avoidance function. The argument and return value is in seconds
|
| + static int GetRecommendedDelaySeconds(int base_delay_seconds);
|
| +
|
| + // This uses AllStatus' max_consecutive_errors as the error count
|
| + int GetRecommendedDelay(int base_delay) const;
|
| +
|
| + protected:
|
| + typedef PThreadScopedLock<PThreadMutex> MutexLock;
|
| + typedef std::map<Syncer*, EventListenerHookup*> Syncers;
|
| +
|
| + // Examines syncer to calculate syncing and the unsynced count,
|
| + // and returns a Status with new values.
|
| + Status CalcSyncing() const;
|
| + Status CalcSyncing(const SyncerEvent& event) const;
|
| + Status CreateBlankStatus() const;
|
| +
|
| + // Examines status to see what has changed, updates old_status in place.
|
| + int CalcStatusChanges(Status* old_status);
|
| +
|
| + Status status_;
|
| + Channel* const channel_;
|
| + scoped_ptr<EventListenerHookup> conn_mgr_hookup_;
|
| + scoped_ptr<EventListenerHookup> gaia_hookup_;
|
| + scoped_ptr<EventListenerHookup> authwatcher_hookup_;
|
| + scoped_ptr<EventListenerHookup> syncer_thread_hookup_;
|
| + scoped_ptr<EventListenerHookup> diskfull_hookup_;
|
| + scoped_ptr<EventListenerHookup> talk_mediator_hookup_;
|
| +
|
| + mutable PThreadMutex mutex_; // Protects all data members.
|
| +};
|
| +
|
| +struct AllStatusEvent {
|
| + enum { // A bit mask of which members have changed.
|
| + SHUTDOWN = 0x0000,
|
| + ICON = 0x0001,
|
| + UNSYNCED_COUNT = 0x0002,
|
| + AUTHENTICATED = 0x0004,
|
| + SYNCING = 0x0008,
|
| + SERVER_UP = 0x0010,
|
| + NOTIFICATIONS_ENABLED = 0x0020,
|
| + INITIAL_SYNC_ENDED = 0x0080,
|
| + SERVER_REACHABLE = 0x0100,
|
| + DISK_FULL = 0x0200,
|
| + OVER_QUOTA = 0x0400,
|
| + NOTIFICATIONS_RECEIVED = 0x0800,
|
| + NOTIFICATIONS_SENT = 0x1000,
|
| + TRASH_WARNING = 0x40000,
|
| + };
|
| + int what_changed;
|
| + AllStatus::Status status;
|
| +
|
| + typedef AllStatusEvent EventType;
|
| + static inline bool IsChannelShutdownEvent(const AllStatusEvent& e) {
|
| + return SHUTDOWN == e.what_changed;
|
| + }
|
| +};
|
| +
|
| +enum StatusNotifyPlan {
|
| + NOTIFY_IF_STATUS_CHANGED,
|
| + // A small optimization, don't do the big compare when we know
|
| + // nothing has changed.
|
| + DONT_NOTIFY,
|
| +};
|
| +
|
| +class ScopedStatusLockWithNotify {
|
| + public:
|
| + explicit ScopedStatusLockWithNotify(AllStatus* allstatus);
|
| + ~ScopedStatusLockWithNotify();
|
| + // Defaults to true, but can be explicitly reset so we don't have to
|
| + // do the big compare in the destructor. Small optimization.
|
| +
|
| + inline void set_notify_plan(StatusNotifyPlan plan) { plan_ = plan; }
|
| + void NotifyOverQuota();
|
| + protected:
|
| + AllStatusEvent event_;
|
| + AllStatus* const allstatus_;
|
| + StatusNotifyPlan plan_;
|
| +};
|
| +
|
| +} // namespace browser_sync
|
| +
|
| +#endif // CHROME_BROWSER_SYNC_ENGINE_ALL_STATUS_H_
|
|
|
| Property changes on: chrome\browser\sync\engine\all_status.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|