| Index: sync/notifier/p2p_invalidator.h
|
| diff --git a/sync/notifier/p2p_invalidator.h b/sync/notifier/p2p_invalidator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..07f46e72e28990a634c6434fabcad9dbffed8a65
|
| --- /dev/null
|
| +++ b/sync/notifier/p2p_invalidator.h
|
| @@ -0,0 +1,150 @@
|
| +// Copyright 2012 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.
|
| +//
|
| +// An invalidator that uses p2p invalidations based on XMPP push
|
| +// notifications. Used only for sync integration tests.
|
| +
|
| +#ifndef SYNC_NOTIFIER_P2P_INVALIDATOR_H_
|
| +#define SYNC_NOTIFIER_P2P_INVALIDATOR_H_
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/compiler_specific.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "base/observer_list.h"
|
| +#include "base/threading/thread_checker.h"
|
| +#include "jingle/notifier/base/notifier_options.h"
|
| +#include "jingle/notifier/listener/push_client.h"
|
| +#include "jingle/notifier/listener/push_client_observer.h"
|
| +#include "sync/base/sync_export.h"
|
| +#include "sync/internal_api/public/base/model_type.h"
|
| +#include "sync/notifier/invalidator.h"
|
| +#include "sync/notifier/invalidator_registrar.h"
|
| +#include "sync/notifier/invalidator_state.h"
|
| +#include "sync/notifier/object_id_invalidation_map.h"
|
| +
|
| +namespace notifier {
|
| +class PushClient;
|
| +} // namespace notifier
|
| +
|
| +namespace syncer {
|
| +
|
| +// The channel to use for sync notifications.
|
| +SYNC_EXPORT extern const char kSyncP2PNotificationChannel[];
|
| +
|
| +// The intended recipient(s) of a P2P notification.
|
| +enum P2PNotificationTarget {
|
| + NOTIFY_SELF,
|
| + FIRST_NOTIFICATION_TARGET = NOTIFY_SELF,
|
| + NOTIFY_OTHERS,
|
| + NOTIFY_ALL,
|
| + LAST_NOTIFICATION_TARGET = NOTIFY_ALL
|
| +};
|
| +
|
| +SYNC_EXPORT_PRIVATE std::string P2PNotificationTargetToString(
|
| + P2PNotificationTarget target);
|
| +
|
| +// If |target_str| can't be parsed, assumes NOTIFY_SELF.
|
| +SYNC_EXPORT_PRIVATE P2PNotificationTarget P2PNotificationTargetFromString(
|
| + const std::string& target_str);
|
| +
|
| +// Helper notification data class that can be serialized to and
|
| +// deserialized from a string.
|
| +class SYNC_EXPORT_PRIVATE P2PNotificationData {
|
| + public:
|
| + // Initializes with an empty sender ID, target set to NOTIFY_SELF,
|
| + // and empty changed types.
|
| + P2PNotificationData();
|
| + P2PNotificationData(const std::string& sender_id,
|
| + P2PNotificationTarget target,
|
| + const ObjectIdInvalidationMap& invalidation_map);
|
| +
|
| + ~P2PNotificationData();
|
| +
|
| + // Returns true if the given ID is targeted by this notification.
|
| + bool IsTargeted(const std::string& id) const;
|
| +
|
| + const ObjectIdInvalidationMap& GetIdInvalidationMap() const;
|
| +
|
| + bool Equals(const P2PNotificationData& other) const;
|
| +
|
| + std::string ToString() const;
|
| +
|
| + // Returns whether parsing |str| was successful. If parsing was
|
| + // unsuccessful, the state of the notification is undefined.
|
| + bool ResetFromString(const std::string& str);
|
| +
|
| + private:
|
| + // The unique ID of the client that sent the notification.
|
| + std::string sender_id_;
|
| + // The intendent recipient(s) of the notification.
|
| + P2PNotificationTarget target_;
|
| + // The invalidation map for the notification.
|
| + ObjectIdInvalidationMap invalidation_map_;
|
| +};
|
| +
|
| +class SYNC_EXPORT_PRIVATE P2PInvalidator
|
| + : public Invalidator,
|
| + public NON_EXPORTED_BASE(notifier::PushClientObserver) {
|
| + public:
|
| + // The |send_notification_target| parameter was added to allow us to send
|
| + // self-notifications in some cases, but not others. The value should be
|
| + // either NOTIFY_ALL to send notifications to all clients, or NOTIFY_OTHERS
|
| + // to send notifications to all clients except for the one that triggered the
|
| + // notification. See crbug.com/97780.
|
| + P2PInvalidator(scoped_ptr<notifier::PushClient> push_client,
|
| + const std::string& invalidator_client_id,
|
| + P2PNotificationTarget send_notification_target);
|
| +
|
| + virtual ~P2PInvalidator();
|
| +
|
| + // Invalidator implementation.
|
| + virtual void RegisterHandler(InvalidationHandler* handler) OVERRIDE;
|
| + virtual void UpdateRegisteredIds(InvalidationHandler* handler,
|
| + const ObjectIdSet& ids) OVERRIDE;
|
| + virtual void UnregisterHandler(InvalidationHandler* handler) OVERRIDE;
|
| + virtual InvalidatorState GetInvalidatorState() const OVERRIDE;
|
| + virtual void UpdateCredentials(
|
| + const std::string& email, const std::string& token) OVERRIDE;
|
| + virtual void RequestDetailedStatus(
|
| + base::Callback<void(const base::DictionaryValue&)> callback) const
|
| + OVERRIDE;
|
| +
|
| + // PushClientObserver implementation.
|
| + virtual void OnNotificationsEnabled() OVERRIDE;
|
| + virtual void OnNotificationsDisabled(
|
| + notifier::NotificationsDisabledReason reason) OVERRIDE;
|
| + virtual void OnIncomingNotification(
|
| + const notifier::Notification& notification) OVERRIDE;
|
| +
|
| + void SendInvalidation(const ObjectIdSet& ids);
|
| +
|
| + void SendNotificationDataForTest(
|
| + const P2PNotificationData& notification_data);
|
| +
|
| + private:
|
| + void SendNotificationData(const P2PNotificationData& notification_data);
|
| +
|
| + base::ThreadChecker thread_checker_;
|
| +
|
| + InvalidatorRegistrar registrar_;
|
| +
|
| + // The push client.
|
| + scoped_ptr<notifier::PushClient> push_client_;
|
| + // Our unique ID.
|
| + std::string invalidator_client_id_;
|
| + // Whether we have called UpdateCredentials() yet.
|
| + bool logged_in_;
|
| + bool notifications_enabled_;
|
| + // Which set of clients should be sent notifications.
|
| + P2PNotificationTarget send_notification_target_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(P2PInvalidator);
|
| +};
|
| +
|
| +} // namespace syncer
|
| +
|
| +#endif // SYNC_NOTIFIER_P2P_INVALIDATOR_H_
|
|
|