peerplays_migrated/libraries/net/include/graphene/net/peer_database.hpp

124 lines
4.4 KiB
C++

/*
* Copyright (c) 2015 Cryptonomex, Inc., and contributors.
*
* The MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#pragma once
#include <boost/iterator/iterator_facade.hpp>
#include <graphene/chain/protocol/types.hpp>
#include <fc/network/ip.hpp>
#include <fc/time.hpp>
#include <fc/io/enum_type.hpp>
#include <fc/reflect/reflect.hpp>
#include <fc/reflect/variant.hpp>
#include <fc/exception/exception.hpp>
namespace graphene { namespace net {
enum potential_peer_last_connection_disposition
{
never_attempted_to_connect,
last_connection_failed,
last_connection_rejected,
last_connection_handshaking_failed,
last_connection_succeeded
};
struct potential_peer_record
{
fc::ip::endpoint endpoint;
fc::time_point_sec last_seen_time;
fc::enum_type<uint8_t,potential_peer_last_connection_disposition> last_connection_disposition;
fc::time_point_sec last_connection_attempt_time;
uint32_t number_of_successful_connection_attempts;
uint32_t number_of_failed_connection_attempts;
fc::optional<fc::exception> last_error;
potential_peer_record() :
number_of_successful_connection_attempts(0),
number_of_failed_connection_attempts(0){}
potential_peer_record(fc::ip::endpoint endpoint,
fc::time_point_sec last_seen_time = fc::time_point_sec(),
potential_peer_last_connection_disposition last_connection_disposition = never_attempted_to_connect) :
endpoint(endpoint),
last_seen_time(last_seen_time),
last_connection_disposition(last_connection_disposition),
number_of_successful_connection_attempts(0),
number_of_failed_connection_attempts(0)
{}
};
namespace detail
{
class peer_database_impl;
class peer_database_iterator_impl;
class peer_database_iterator : public boost::iterator_facade<peer_database_iterator, const potential_peer_record, boost::forward_traversal_tag>
{
public:
peer_database_iterator();
~peer_database_iterator();
explicit peer_database_iterator(peer_database_iterator_impl* impl);
peer_database_iterator( const peer_database_iterator& c );
private:
friend class boost::iterator_core_access;
void increment();
bool equal(const peer_database_iterator& other) const;
const potential_peer_record& dereference() const;
private:
std::unique_ptr<peer_database_iterator_impl> my;
};
}
class peer_database
{
public:
peer_database();
~peer_database();
void open(const fc::path& databaseFilename);
void close();
void clear();
void erase(const fc::ip::endpoint& endpointToErase);
void update_entry(const potential_peer_record& updatedRecord);
potential_peer_record lookup_or_create_entry_for_endpoint(const fc::ip::endpoint& endpointToLookup);
fc::optional<potential_peer_record> lookup_entry_for_endpoint(const fc::ip::endpoint& endpointToLookup);
typedef detail::peer_database_iterator iterator;
iterator begin() const;
iterator end() const;
size_t size() const;
private:
std::unique_ptr<detail::peer_database_impl> my;
};
} } // end namespace graphene::net
FC_REFLECT_TYPENAME( graphene::net::potential_peer_record )
GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::net::potential_peer_record)