// 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. #ifndef SYNC_INTERNAL_API_PUBLIC_BASE_INVALIDATION_H_ #define SYNC_INTERNAL_API_PUBLIC_BASE_INVALIDATION_H_ #include <string> #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/values.h" #include "google/cacheinvalidation/include/types.h" #include "sync/base/sync_export.h" #include "sync/internal_api/public/base/ack_handle.h" #include "sync/internal_api/public/util/weak_handle.h" namespace syncer { class DroppedInvalidationTracker; class AckHandler; // Represents a local invalidation, and is roughly analogous to // invalidation::Invalidation. Unlike invalidation::Invalidation, this class // supports "local" ack-tracking and simple serialization to pref values. class SYNC_EXPORT Invalidation { public: // Factory functions. static Invalidation Init( const invalidation::ObjectId& id, int64 version, const std::string& payload); static Invalidation InitUnknownVersion(const invalidation::ObjectId& id); static Invalidation InitFromDroppedInvalidation(const Invalidation& dropped); static scoped_ptr<Invalidation> InitFromValue( const base::DictionaryValue& value); ~Invalidation(); // Compares two invalidations. The comparison ignores ack-tracking state. bool Equals(const Invalidation& other) const; invalidation::ObjectId object_id() const; bool is_unknown_version() const; // Safe to call only if is_unknown_version() returns false. int64 version() const; // Safe to call only if is_unknown_version() returns false. const std::string& payload() const; const AckHandle& ack_handle() const; // Sets the AckHandler to be used to track this Invalidation. // // This should be set by the class that generates the invalidation. Clients // of the Invalidations API should not need to call this. // // Note that some sources of invalidations do not support ack tracking, and do // not set the ack_handler. This will be hidden from users of this class. void set_ack_handler(syncer::WeakHandle<AckHandler> ack_handler); // Returns whether or not this instance supports ack tracking. This will // depend on whether or not the source of invaliadations supports // invalidations. // // Clients can safely ignore this flag. They can assume that all // invalidations support ack tracking. If they're wrong, then invalidations // will be less reliable, but their behavior will be no less correct. bool SupportsAcknowledgement() const; // Acknowledges the receipt of this invalidation. // // Clients should call this on a received invalidation when they have fully // processed the invalidation and persisted the results to disk. Once this // function is called, the invalidations system is under no obligation to // re-deliver this invalidation in the event of a crash or restart. void Acknowledge() const; // Informs the ack tracker that this invalidation will not be serviced. // // If a client's buffer reaches its limit and it is forced to start dropping // invalidations, it should call this function before dropping its // invalidations in order to allow the ack tracker to drop the invalidation, // too. // // The drop record will be tracked by the specified // DroppedInvalidationTracker. The caller should hang on to this tracker. It // will need to use it when it recovers from this drop event, or if it needs // to record another drop event for the same ObjectID. Refer to the // documentation of DroppedInvalidationTracker for more details. void Drop(DroppedInvalidationTracker* tracker) const; scoped_ptr<base::DictionaryValue> ToValue() const; std::string ToString() const; private: Invalidation(const invalidation::ObjectId& id, bool is_unknown_version, int64 version, const std::string& payload, AckHandle ack_handle); // The ObjectId to which this invalidation belongs. invalidation::ObjectId id_; // This flag is set to true if this is an unknown version invalidation. bool is_unknown_version_; // The version number of this invalidation. Should not be accessed if this is // an unkown version invalidation. int64 version_; // The payaload associated with this invalidation. Should not be accessed if // this is an unknown version invalidation. std::string payload_; // A locally generated unique ID used to manage local acknowledgements. AckHandle ack_handle_; syncer::WeakHandle<AckHandler> ack_handler_; }; } // namespace syncer #endif // SYNC_INTERNAL_API_PUBLIC_BASE_INVALIDATION_H_