#include <string>
#include <utility>
#include <boost/test/minimal.hpp>
#include <SF/utility.hpp> // serialization for std::pair
#include <RCF/Idl.hpp>
#include <RCF/RcfServer.hpp>
#include <RCF/CurrentSession.hpp>
#include <RCF/Session.hpp>
#include <RCF/test/TransportFactories.hpp>
#include <RCF/util/CommandLine.hpp>
class GetMyAddress
{
public:
std::pair<std::string, int> getMyAddress()
{
const RCF::I_RemoteAddress &address = RCF::getCurrentSessionPtr()->getRemoteAddress();
const RCF::IpAddress &ipAddress = dynamic_cast<const RCF::IpAddress &>(address);
return std::make_pair(ipAddress.getIp(), ipAddress.getPort());
}
};
typedef std::pair<std::string, int> StringIntPair;
RCF_BEGIN(I_GetMyAddress, "I_GetMyAddress")
RCF_METHOD_R0(StringIntPair, getMyAddress)
RCF_END(I_GetMyAddress)
int test_main(int argc, char **argv)
{
util::CommandLine::getSingleton().parse(argc, argv);
for (int i=0; i<RCF::getIpTransportFactories().size(); ++i)
{
RCF::TransportFactoryPtr transportFactoryPtr = RCF::getTransportFactories()[i];
std::pair<RCF::ServerTransportPtr, RCF::ClientTransportAutoPtrPtr> transports = transportFactoryPtr->createTransports();
RCF::ServerTransportPtr serverTransportPtr( transports.first );
RCF::ClientTransportAutoPtr clientTransportAutoPtr( *transports.second );
RCF::writeTransportTypes(std::cout, *serverTransportPtr, *clientTransportAutoPtr);
GetMyAddress getMyAddress;
RCF::RcfServer server(serverTransportPtr);
server.bind<I_GetMyAddress>(getMyAddress);
server.start();
std::pair<std::string, int> myAddress = RcfClient<I_GetMyAddress>(clientTransportAutoPtr).getMyAddress(RCF::Twoway);
BOOST_CHECK(myAddress.first == "127.0.0.1");
BOOST_CHECK(myAddress.second > 0);
}
return boost::exit_success;
}