chromium/chromeos/ash/services/device_sync/cryptauth_device_registry.h

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_ASH_SERVICES_DEVICE_SYNC_CRYPTAUTH_DEVICE_REGISTRY_H_
#define CHROMEOS_ASH_SERVICES_DEVICE_SYNC_CRYPTAUTH_DEVICE_REGISTRY_H_

#include <ostream>
#include <string>

#include "base/containers/flat_map.h"
#include "base/values.h"
#include "chromeos/ash/services/device_sync/cryptauth_device.h"

namespace ash {

namespace device_sync {

// Stores the devices managed by CryptAuth v2 DeviceSync.
class CryptAuthDeviceRegistry {
 public:
  using InstanceIdToDeviceMap = base::flat_map<std::string, CryptAuthDevice>;

  CryptAuthDeviceRegistry(const CryptAuthDeviceRegistry&) = delete;
  CryptAuthDeviceRegistry& operator=(const CryptAuthDeviceRegistry&) = delete;

  virtual ~CryptAuthDeviceRegistry();

  // Returns a map from Instance ID to CryptAuthDevice.
  const InstanceIdToDeviceMap& instance_id_to_device_map() const;

  // Returns the device with Instance ID |instance_id| if it exists in the
  // registry, and returns null if it cannot be found.
  const CryptAuthDevice* GetDevice(const std::string& instance_id) const;

  // Adds |device| to the registry. If a device with the same Instance ID
  // already exists in the registry, the existing device will be overwritten.
  // Returns true if the registry changes.
  bool AddDevice(const CryptAuthDevice& device);

  // Removes the device with corresponding |instance_id|.  Returns true if the
  // registry changes.
  bool DeleteDevice(const std::string& instance_id);

  // Replaces the entire registry with |instance_id_to_device_map|. Returns true
  // if the registry changes.
  bool SetRegistry(const InstanceIdToDeviceMap& instance_id_to_device_map);

  // Converts the registry to a human-readable dictionary.
  base::Value::Dict AsReadableDictionary() const;

 protected:
  CryptAuthDeviceRegistry();

  // Invoked when the device map changes.
  virtual void OnDeviceRegistryUpdated() = 0;

 private:
  InstanceIdToDeviceMap instance_id_to_device_map_;
};

std::ostream& operator<<(std::ostream& stream,
                         const CryptAuthDeviceRegistry& registry);

}  // namespace device_sync

}  // namespace ash

#endif  // CHROMEOS_ASH_SERVICES_DEVICE_SYNC_CRYPTAUTH_DEVICE_REGISTRY_H_