src/Network/Endpoint.cc
author Tero Marttila <terom@fixme.fi>
Sun, 02 Jun 2013 16:15:23 +0300
changeset 448 34bdf0783874
parent 382 190f81d30624
permissions -rw-r--r--
network: fix size_t compile errors

#include "Endpoint.hh"

#include <sstream>

NetworkEndpoint::NetworkEndpoint (void) :
    hostname(), service()
{

}

NetworkEndpoint::NetworkEndpoint (std::string service) :
    hostname(), service(service)
{

}
        
NetworkEndpoint::NetworkEndpoint (std::string hostname, std::string service) :
    hostname(hostname), service(service)
{

}
       
addrinfo* NetworkEndpoint::get_addrinfo (int family, int socktype, int protocol, int flags) const {
    addrinfo hints, *results;
    int err;
    
    // initialize flags
    hints.ai_flags = flags;
    hints.ai_family = family;
    hints.ai_socktype = socktype;
    hints.ai_protocol = protocol;
    hints.ai_addrlen = 0;
    hints.ai_canonname = NULL;
    hints.ai_next = NULL;

    // hostname + service may be NULL
    const char *hostname = this->hostname.empty() ? NULL : this->hostname.c_str();
    const char *service = this->service.empty() ? NULL : this->service.c_str();

    // do getaddrinfo()
    if ((err = getaddrinfo(hostname, service, &hints, &results)))
        throw NetworkAddressError(*this, "getaddrinfo", gai_strerror(err));

    // done
    return results;
}
        
void NetworkEndpoint::free_addrinfo (addrinfo *info) const {
    freeaddrinfo(info);
}

std::ostream& operator<< (std::ostream &s, const NetworkEndpoint &addr) {
    s << "[" << addr.get_hostname() << ":" << addr.get_service() << "]";

    return s;

}
 
std::string NetworkAddressError::build_str (const NetworkEndpoint &addr, const char *op, const char *msg) {
    std::stringstream ss;

    ss << op << ": " << addr << ": " << msg;

    return ss.str();
}

NetworkAddressError::NetworkAddressError (const NetworkEndpoint &addr, const char *op, const char *msg) :
    Error(build_str(addr, op, msg))
{

}