//*****************************************************************************
// RCF - Remote Call Framework
// Copyright (c) 2005. All rights reserved.
// Developed by Jarl Lindrud.
// Contact: jlindrud@hotmail.com .
//*****************************************************************************
#include <utility>
#include <boost/shared_ptr.hpp>
#include <RCF/TcpEndpoint.hpp>
#include <RCF/UdpEndpoint.hpp>
#include <RCF/util/AutoRun.hpp>
#include <RCF/util/PortNumbers.hpp>
namespace RCF {
typedef std::pair< boost::shared_ptr<I_Endpoint>, boost::shared_ptr<I_Endpoint> > EndpointPair;
class I_EndpointPairFactory
{
public:
virtual ~I_EndpointPairFactory() {}
virtual EndpointPair createEndpointPair() = 0;
};
typedef boost::shared_ptr<I_EndpointPairFactory> EndpointPairFactoryPtr;
class TcpEndpointFactory : public I_EndpointPairFactory
{
public:
EndpointPair createEndpointPair()
{
int port = util::Ports::getNext();
return EndpointPair(
boost::shared_ptr<I_Endpoint>(new TcpEndpoint(port)),
boost::shared_ptr<I_Endpoint>(new TcpEndpoint("localhost", port)));
}
};
class UdpEndpointFactory : public I_EndpointPairFactory
{
public:
EndpointPair createEndpointPair()
{
int port = util::Ports::getNext();
return EndpointPair(
boost::shared_ptr<I_Endpoint>(new UdpEndpoint(port)),
boost::shared_ptr<I_Endpoint>(new UdpEndpoint("127.0.0.1", port)));
}
};
static void writeEndpointTypes(std::ostream &os, const I_Endpoint &serverEndpoint, const I_Endpoint &clientEndpoint)
{
os
<< "Server endpoint: " << typeid(serverEndpoint).name() << ", "
<< "Client endpoint: " << typeid(clientEndpoint).name()
<< std::endl;
}
typedef std::vector< boost::shared_ptr<RCF::I_EndpointPairFactory> > EndpointPairFactories;
static EndpointPairFactories &getEndpointPairFactories()
{
static EndpointPairFactories endpointPairFactories;
return endpointPairFactories;
}
AUTO_RUN( getEndpointPairFactories().push_back( RCF::EndpointPairFactoryPtr(new RCF::TcpEndpointFactory)));
AUTO_RUN( getEndpointPairFactories().push_back( RCF::EndpointPairFactoryPtr(new RCF::UdpEndpointFactory)));
} // namespace RCF