blob: 25d7a147b92d5aab93b521f89d709356350e04a7 [file] [log] [blame]
// Copyright 2014 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 PEERD_PEER_H_
#define PEERD_PEER_H_
#include <map>
#include <string>
#include <vector>
#include <stdint.h>
#include <chromeos/dbus/dbus_object.h>
#include <chromeos/dbus/exported_property_set.h>
#include <chromeos/errors/error.h>
#include <dbus/bus.h>
#include <gtest/gtest_prod.h>
#include "peerd/ip_addr.h"
#include "peerd/service.h"
#include "peerd/typedefs.h"
namespace peerd {
namespace errors {
namespace peer {
extern const char kInvalidUUID[];
extern const char kInvalidName[];
extern const char kInvalidNote[];
extern const char kInvalidTime[];
extern const char kUnknownService[];
} // namespace peer
} // namespace errors
// Exposes a Peer interface over DBus. We use this class to represent
// ourself over DBus to interested viewers. We also use it to represent
// remote peers that we've discovered over various mediums.
class Peer {
public:
Peer(const scoped_refptr<dbus::Bus>& bus,
chromeos::dbus_utils::ExportedObjectManager* object_manager,
const dbus::ObjectPath& path);
virtual ~Peer() = default;
bool RegisterAsync(
chromeos::ErrorPtr* error,
const std::string& uuid,
const std::string& friendly_name,
const std::string& note,
const base::Time& last_seen,
const CompletionAction& completion_callback);
virtual std::string GetUUID() const;
virtual std::string GetFriendlyName() const;
virtual std::string GetNote() const;
virtual base::Time GetLastSeen() const;
// Returns false on failure.
virtual bool SetFriendlyName(chromeos::ErrorPtr* error,
const std::string& friendly_name);
virtual bool SetNote(chromeos::ErrorPtr* error, const std::string& note);
virtual bool SetLastSeen(chromeos::ErrorPtr* error,
const base::Time& last_seen);
protected:
// Add a service to be exported by this peer. Can fail if this peer
// is already advertising a service with |service_id| or if |service_id|
// and/or |service_info| are malformed. Returns false on error, and can
// optionally provide detailed error information in |error|.
virtual bool AddService(
chromeos::ErrorPtr* error,
const std::string& service_id,
const std::vector<ip_addr>& addresses,
const std::map<std::string, std::string>& service_info);
// Remove a service advertised by this peer. Can fail if no service with id
// |service_id| is in this peer.
virtual bool RemoveService(chromeos::ErrorPtr* error,
const std::string& service_id);
bool IsValidFriendlyName(chromeos::ErrorPtr* error,
const std::string& friendly_name) const;
bool IsValidNote(chromeos::ErrorPtr* error,
const std::string& note) const;
bool IsValidUpdateTime(chromeos::ErrorPtr* error,
const base::Time& last_seen) const;
std::map<std::string, std::unique_ptr<Service>> services_;
private:
bool TimeToMillisecondsSinceEpoch(const base::Time& time,
uint64_t* ret) const;
scoped_refptr<dbus::Bus> bus_;
size_t services_added_{0};
chromeos::dbus_utils::ExportedProperty<std::string> uuid_;
chromeos::dbus_utils::ExportedProperty<std::string> name_;
chromeos::dbus_utils::ExportedProperty<std::string> note_;
chromeos::dbus_utils::ExportedProperty<uint64_t> last_seen_;
std::unique_ptr<chromeos::dbus_utils::DBusObject> dbus_object_;
dbus::ObjectPath service_path_prefix_;
friend class PeerTest;
friend class MockPeer;
DISALLOW_COPY_AND_ASSIGN(Peer);
};
} // namespace peerd
#endif // PEERD_PEER_H_