blob: 4fd30f49176cf36bfe7082e17ecb915846ef1260 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_USER_COMMUNICATOR_IMPL_H_
#define PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_USER_COMMUNICATOR_IMPL_H_
#include <memory>
#include <set>
#include <string>
#include <fuchsia/netconnector/cpp/fidl.h>
#include <lib/callback/auto_cleanable.h>
#include <lib/component/cpp/service_provider_impl.h>
#include <lib/netconnector/cpp/message_relay.h>
#include "peridot/bin/ledger/coroutine/coroutine.h"
#include "peridot/bin/ledger/p2p_provider/public/p2p_provider.h"
#include "peridot/bin/ledger/p2p_provider/public/types.h"
#include "peridot/bin/ledger/p2p_provider/public/user_id_provider.h"
#include "peridot/bin/ledger/p2p_sync/impl/device_mesh.h"
#include "peridot/bin/ledger/p2p_sync/public/user_communicator.h"
#include "peridot/lib/convert/convert.h"
namespace p2p_sync {
class LedgerCommunicatorImpl;
class UserCommunicatorImpl : public UserCommunicator,
public DeviceMesh,
public p2p_provider::P2PProvider::Client {
public:
explicit UserCommunicatorImpl(
std::unique_ptr<p2p_provider::P2PProvider> provider,
coroutine::CoroutineService* coroutine_service);
~UserCommunicatorImpl() override;
// UserCommunicator:
void Start() override;
std::unique_ptr<LedgerCommunicator> GetLedgerCommunicator(
std::string namespace_id) override;
// DeviceMesh:
DeviceSet GetDeviceList() override;
void Send(fxl::StringView device_name,
convert::ExtendedStringView data) override;
private:
// P2PProvider::Client
void OnDeviceChange(fxl::StringView remote_device,
p2p_provider::DeviceChangeType change_type) override;
void OnNewMessage(fxl::StringView source, fxl::StringView data) override;
// Set of active ledgers.
std::map<std::string, LedgerCommunicatorImpl*, convert::StringViewComparator>
ledgers_;
std::set<std::string, convert::StringViewComparator> devices_;
bool started_ = false;
std::string user_token_;
std::unique_ptr<component::ServiceProviderImpl> network_service_provider_;
std::unique_ptr<p2p_provider::P2PProvider> p2p_provider_;
coroutine::CoroutineService* const coroutine_service_;
};
} // namespace p2p_sync
#endif // PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_USER_COMMUNICATOR_IMPL_H_