blob: 2ebc43ac04054a2f75333a6068c2885cc9f658b9 [file] [log] [blame]
// Copyright 2015 The Chromium OS 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 LEADERD_PEERD_CLIENT_H_
#define LEADERD_PEERD_CLIENT_H_
#include <map>
#include <set>
#include <string>
#include <tuple>
#include <vector>
#include "peerd/dbus-proxies.h"
namespace leaderd {
class PeerdClient {
public:
class Delegate {
public:
virtual ~Delegate() = default;
virtual void OnPeerdAvailable() = 0;
virtual void OnPeerdDeath() = 0;
virtual void OnSelfIdChanged(const std::string& uuid) = 0;
virtual void OnPeerGroupsChanged(
const std::string& peer_uuid,
const std::set<std::string>& group_ids) = 0;
};
PeerdClient() = default;
virtual ~PeerdClient() = default;
void SetDelegate(Delegate* delegate);
std::set<std::string> GetPeersMatchingGroup(const std::string& in_group_id);
void StartMonitoring();
void StopMonitoring();
std::vector<std::tuple<std::vector<uint8_t>, uint16_t>> GetIPInfo(
const std::string& peer_uuid);
void PublishGroups(uint16_t port, const std::vector<std::string>& groups);
protected:
virtual org::chromium::peerd::PeerProxyInterface* GetPeerProxy(
const dbus::ObjectPath& object_path) = 0;
virtual org::chromium::peerd::ServiceProxyInterface* GetServiceProxy(
const dbus::ObjectPath& object_path) = 0;
virtual org::chromium::peerd::ManagerProxyInterface* GetManagerProxy() = 0;
void UpdatePeerService(
org::chromium::peerd::ServiceProxyInterface* service_proxy,
const dbus::ObjectPath& service_object_path);
void RemovePeerService(const dbus::ObjectPath& object_path);
Delegate* delegate_{nullptr};
bool monitoring_{false};
std::string monitor_token_;
std::map<std::string, dbus::ObjectPath> uuids_to_paths_;
private:
DISALLOW_COPY_AND_ASSIGN(PeerdClient);
};
class PeerdClientImpl : public PeerdClient {
public:
PeerdClientImpl(const scoped_refptr<dbus::Bus>& bus,
const std::string& peerd_service_name);
~PeerdClientImpl() override = default;
protected:
org::chromium::peerd::PeerProxyInterface* GetPeerProxy(
const dbus::ObjectPath& object_path) override;
org::chromium::peerd::ServiceProxyInterface* GetServiceProxy(
const dbus::ObjectPath& object_path) override;
org::chromium::peerd::ManagerProxyInterface* GetManagerProxy() override;
private:
void OnPeerdManagerAdded(org::chromium::peerd::ManagerProxy* manager_proxy);
void OnPeerdManagerRemoved(const dbus::ObjectPath& object_path);
void OnPeerdPeerAdded(org::chromium::peerd::PeerProxy* peer_proxy);
void OnPeerdServiceAdded(org::chromium::peerd::ServiceProxy* service_proxy);
void OnPeerdServiceRemoved(const dbus::ObjectPath& object_path);
void OnPeerdServiceChanged(org::chromium::peerd::ServiceProxy* service_proxy,
const std::string& property);
private:
scoped_refptr<dbus::Bus> bus_;
org::chromium::peerd::ObjectManagerProxy peerd_object_manager_proxy_;
base::WeakPtrFactory<PeerdClientImpl> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(PeerdClientImpl);
};
} // namespace leaderd
#endif // LEADERD_PEERD_CLIENT_H_