19 #ifndef INCLUDE_RCF_TEST_TRANSPORTFACTORIES_HPP
20 #define INCLUDE_RCF_TEST_TRANSPORTFACTORIES_HPP
29 #include <boost/config.hpp>
30 #include <boost/shared_ptr.hpp>
31 #include <boost/version.hpp>
33 #include <RCF/ClientStub.hpp>
34 #include <RCF/InitDeinit.hpp>
35 #include <RCF/ThreadLibrary.hpp>
37 #include <RCF/TcpAsioServerTransport.hpp>
38 #include <RCF/Asio.hpp>
39 #include <RCF/Config.hpp>
41 #ifdef RCF_HAS_LOCAL_SOCKETS
42 #include <RCF/UnixLocalClientTransport.hpp>
43 #include <RCF/UnixLocalServerTransport.hpp>
46 #if RCF_FEATURE_NAMEDPIPE==1
47 #include <RCF/Win32NamedPipeClientTransport.hpp>
48 #include <RCF/Win32NamedPipeEndpoint.hpp>
49 #include <RCF/Win32NamedPipeServerTransport.hpp>
52 #include <RCF/TcpClientTransport.hpp>
53 #include <RCF/UdpClientTransport.hpp>
54 #include <RCF/UdpServerTransport.hpp>
56 #include <RCF/ObjectFactoryService.hpp>
58 template<
typename Interface>
59 inline bool tryCreateRemoteObject(
60 RCF::I_RcfClient &rcfClient,
61 std::string objectName =
"")
65 rcfClient.getClientStub().createRemoteObject(objectName);
68 catch (
const RCF::Exception &e)
78 typedef boost::shared_ptr<ClientTransportAutoPtr> ClientTransportAutoPtrPtr;
80 typedef std::pair<ServerTransportPtr, ClientTransportAutoPtrPtr> TransportPair;
82 class I_TransportFactory
85 virtual ~I_TransportFactory() {}
86 virtual TransportPair createTransports() = 0;
87 virtual TransportPair createNonListeningTransports() = 0;
88 virtual bool isConnectionOriented() = 0;
89 virtual bool supportsTransportFilters() = 0;
90 virtual std::string desc() = 0;
93 typedef boost::shared_ptr<I_TransportFactory> TransportFactoryPtr;
95 typedef std::vector<TransportFactoryPtr> TransportFactories;
97 static TransportFactories &getTransportFactories()
99 static TransportFactories transportFactories;
100 return transportFactories;
103 static TransportFactories &getIpTransportFactories()
105 static TransportFactories ipTransportFactories;
106 return ipTransportFactories;
112 static std::string loopBackV4 =
"127.0.0.1";
113 static std::string loopBackV6 =
"::1";
115 #if RCF_FEATURE_NAMEDPIPE==1
117 class Win32NamedPipeTransportFactory :
public I_TransportFactory
120 TransportPair createTransports()
122 typedef boost::shared_ptr<Win32NamedPipeServerTransport> Win32NamedPipeServerTransportPtr;
123 Win32NamedPipeServerTransportPtr serverTransportPtr(
124 new Win32NamedPipeServerTransport(RCF_T(
"")));
126 tstring pipeName = serverTransportPtr->getPipeName();
128 ClientTransportAutoPtrPtr clientTransportAutoPtrPtr(
129 new ClientTransportAutoPtr(
130 new Win32NamedPipeClientTransport(pipeName)));
132 return std::make_pair(
133 ServerTransportPtr(serverTransportPtr),
134 clientTransportAutoPtrPtr);
138 TransportPair createNonListeningTransports()
140 return std::make_pair(
141 ServerTransportPtr(
new Win32NamedPipeServerTransport( RCF_T(
"")) ),
142 ClientTransportAutoPtrPtr());
146 bool isConnectionOriented()
151 bool supportsTransportFilters()
158 return "Win32NamedPipeTransportFactory";
164 #if RCF_FEATURE_TCP==1
166 class TcpAsioTransportFactory :
public I_TransportFactory
170 TcpAsioTransportFactory(IpAddress::Type type = IpAddress::V4)
174 case IpAddress::V4: mLoopback = loopBackV4;
break;
175 case IpAddress::V6: mLoopback = loopBackV6;
break;
176 default: RCF_ASSERT(0);
180 TransportPair createTransports()
182 typedef boost::shared_ptr<TcpAsioServerTransport> TcpAsioServerTransportPtr;
183 TcpAsioServerTransportPtr tcpServerTransportPtr(
184 new TcpAsioServerTransport( IpAddress(mLoopback, 0)));
186 tcpServerTransportPtr->open();
187 int port = tcpServerTransportPtr->getPort();
189 ClientTransportAutoPtrPtr clientTransportAutoPtrPtr(
190 new ClientTransportAutoPtr(
191 new TcpClientTransport( IpAddress(mLoopback, port))));
193 return std::make_pair(
194 ServerTransportPtr(tcpServerTransportPtr),
195 clientTransportAutoPtrPtr);
198 TransportPair createNonListeningTransports()
200 return std::make_pair(
201 ServerTransportPtr(
new TcpAsioServerTransport( IpAddress(mLoopback, 0)) ),
202 ClientTransportAutoPtrPtr());
205 bool isConnectionOriented()
210 bool supportsTransportFilters()
217 return "TcpAsioTransportFactory (" + mLoopback +
")";
222 std::string mLoopback;
228 #if RCF_FEATURE_LOCALSOCKET==1
230 class UnixLocalTransportFactory :
public I_TransportFactory
234 UnixLocalTransportFactory() : mIndex(0)
240 TransportPair createTransports()
242 std::string pipeName = generateNewPipeName();
244 RCF_LOG_2()(pipeName) <<
"Creating unix local socket transport pair";
246 return std::make_pair(
247 ServerTransportPtr(
new UnixLocalServerTransport(pipeName) ),
248 ClientTransportAutoPtrPtr(
249 new ClientTransportAutoPtr(
250 new UnixLocalClientTransport(pipeName))));
253 TransportPair createNonListeningTransports()
255 return std::make_pair(
256 ServerTransportPtr(
new UnixLocalServerTransport(
"") ),
257 ClientTransportAutoPtrPtr());
260 bool isConnectionOriented()
265 bool supportsTransportFilters()
272 bool fileExists(
const std::string & path)
274 struct stat stFileInfo = {};
275 int ret = stat(path.c_str(), &stFileInfo);
279 std::string generateNewPipeName()
281 std::string tempDir = RCF::getRelativeTestDataPath();
283 std::string candidate;
285 while (candidate.empty() || fileExists(candidate))
287 std::ostringstream os;
293 candidate = os.str();
301 return "UnixLocalTransportFactory";
308 #endif // RCF_HAS_LOCAL_SOCKETS
310 #if RCF_FEATURE_UDP==1
312 class UdpTransportFactory :
public I_TransportFactory
316 UdpTransportFactory(IpAddress::Type type = IpAddress::V4)
320 case IpAddress::V4: mLoopback = loopBackV4;
break;
321 case IpAddress::V6: mLoopback = loopBackV6;
break;
322 default: RCF_ASSERT(0);
326 TransportPair createTransports()
328 typedef boost::shared_ptr<UdpServerTransport> UdpServerTransportPtr;
329 UdpServerTransportPtr udpServerTransportPtr(
330 new UdpServerTransport( IpAddress(mLoopback, 0) ));
332 udpServerTransportPtr->open();
333 int port = udpServerTransportPtr->getPort();
335 ClientTransportAutoPtrPtr clientTransportAutoPtrPtr(
336 new ClientTransportAutoPtr(
337 new UdpClientTransport( IpAddress(mLoopback, port) )));
339 return std::make_pair(
340 ServerTransportPtr(udpServerTransportPtr),
341 clientTransportAutoPtrPtr);
344 TransportPair createNonListeningTransports()
346 return std::make_pair(
347 ServerTransportPtr(
new UdpServerTransport( IpAddress(mLoopback, 0) ) ),
348 ClientTransportAutoPtrPtr());
351 bool isConnectionOriented()
356 bool supportsTransportFilters()
363 return "UdpTransportFactory (" + mLoopback +
")";
368 std::string mLoopback;
373 typedef TcpAsioTransportFactory TcpTransportFactory;
375 void initializeTransportFactories()
378 #if RCF_FEATURE_IPV6==1
379 const bool compileTimeIpv6 =
true;
381 IpAddress(
"::1").resolve(ePtr);
382 const bool runTimeIpv6 = (ePtr.get() == NULL);
384 const bool compileTimeIpv6 =
false;
385 const bool runTimeIpv6 =
false;
388 #if RCF_FEATURE_NAMEDPIPE==1
390 getTransportFactories().push_back(
391 TransportFactoryPtr(
new Win32NamedPipeTransportFactory()));
395 #if RCF_FEATURE_TCP==1
397 getTransportFactories().push_back(
398 TransportFactoryPtr(
new TcpAsioTransportFactory(IpAddress::V4)));
400 getIpTransportFactories().push_back(
401 TransportFactoryPtr(
new TcpAsioTransportFactory(IpAddress::V4)));
403 if (compileTimeIpv6 && runTimeIpv6)
405 getTransportFactories().push_back(
406 TransportFactoryPtr(
new TcpAsioTransportFactory(IpAddress::V6)));
408 getIpTransportFactories().push_back(
409 TransportFactoryPtr(
new TcpAsioTransportFactory(IpAddress::V6)));
414 #if RCF_FEATURE_LOCALSOCKET==1
416 getTransportFactories().push_back(
417 TransportFactoryPtr(
new UnixLocalTransportFactory()));
421 #if RCF_FEATURE_UDP==1
423 getTransportFactories().push_back(
424 TransportFactoryPtr(
new UdpTransportFactory(IpAddress::V4)));
426 getIpTransportFactories().push_back(
427 TransportFactoryPtr(
new UdpTransportFactory(IpAddress::V4)));
429 if (compileTimeIpv6 && runTimeIpv6)
431 getTransportFactories().push_back(
432 TransportFactoryPtr(
new UdpTransportFactory(IpAddress::V6)));
434 getIpTransportFactories().push_back(
435 TransportFactoryPtr(
new UdpTransportFactory(IpAddress::V6)));
444 #endif // ! INCLUDE_RCF_TEST_TRANSPORTFACTORIES_HPP