blob: 1fcdb9f3c979facdd57396ed656bc0ab29334977 [file] [log] [blame]
// Copyright 2016 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 BLIMP_HELIUM_SYNC_MANAGER_H_
#define BLIMP_HELIUM_SYNC_MANAGER_H_
#include <stdint.h>
#include <memory>
#include "base/macros.h"
namespace blimp {
namespace helium {
class HeliumObject;
class HeliumTransport;
class Syncable;
using HeliumObjectId = uint32_t;
// TODO(kmarshall): Define this type.
class HeliumTransport {};
class SyncManager {
public:
// RAII object for managing the sync control and registration status of a
// Syncable. When a Syncable is registered, it should hold onto the resulting
// SyncRegistration object.
//
// When the Syncable is destroyed, it will delete the
// SyncRegistration along with it, which will automatically unregister the
// object from the SyncManager.
//
// If a Syncable wishes to halt synchronization for any reason (e.g. a tab
// is hidden on the Client), it may call SyncRegistration::Pause(), which will
// tell the SyncManager to exclude or include the Syncable in state sync.
class SyncRegistration {
public:
SyncRegistration(SyncManager* sync_manager, HeliumObjectId id);
~SyncRegistration();
// Tells the HeliumSyncManager to pause or unpause synchronization for the
// HeliumObject associated with |this|.
void Pause(bool paused);
HeliumObjectId id() { return id_; }
private:
HeliumObjectId id_;
SyncManager* sync_manager_;
DISALLOW_COPY_AND_ASSIGN(SyncRegistration);
};
virtual ~SyncManager() {}
// Returns a concrete implementation of HeliumSyncManager.
static std::unique_ptr<SyncManager> Create(
std::unique_ptr<HeliumTransport> transport);
// Registers a new Syncable for synchronization. The Sync layer allocates a
// unique identifier to the Object (including guaranteeing no clashes between
// Client & Engine).
// The identifier may be used by other Objects to refer to |object|. E.g. the
// tab-list Object might include the Id for each tab’s Object.
virtual std::unique_ptr<SyncRegistration> Register(Syncable* syncable) = 0;
// Registers a Syncable for synchronization with a pre-existing ID.
// This form is used when the remote peer has created a new Syncable, to
// register our local equivalent.
virtual std::unique_ptr<SyncRegistration> RegisterExisting(
HeliumObjectId id,
Syncable* syncable) = 0;
protected:
friend class SyncManager::SyncRegistration;
// Tells the HeliumSyncManager to pause or unpause synchronization for the
// HeliumObject associated with |this|.
virtual void Pause(HeliumObjectId id, bool paused) = 0;
// Indicates that a Syncable is being destroyed, and should no longer be
// synchronized.
// Because the Syncable is being destroyed, it is assumed that in-flight
// messages
// about it are now irrelevant, and the Sync layer should tear down underlying
// resources, such as the HeliumStream, immediately.
virtual void Unregister(HeliumObjectId id) = 0;
};
} // namespace helium
} // namespace blimp
#endif // BLIMP_HELIUM_SYNC_MANAGER_H_