31 #include <boost/thread.hpp>
37 #ifdef RSB_WITH_SOCKET_TRANSPORT
65 &inprocess::InPushConnector::create,
69 #ifdef RSB_WITH_SOCKET_TRANSPORT
72 options.insert(
"host");
73 options.insert(
"port");
74 options.insert(
"server");
75 options.insert(
"tcpnodelay");
78 &socket::InPushConnector::create,
92 &inprocess::InPullConnector::create,
96 #ifdef RSB_WITH_SOCKET_TRANSPORT
99 options.insert(
"host");
100 options.insert(
"port");
101 options.insert(
"server");
102 options.insert(
"tcpnodelay");
105 &socket::InPullConnector::create,
118 &inprocess::OutConnector::create,
122 #ifdef RSB_WITH_SOCKET_TRANSPORT
125 options.insert(
"host");
126 options.insert(
"port");
127 options.insert(
"server");
128 options.insert(
"tcpnodelay");
131 &socket::OutConnector::create,
143 struct intersection {
144 set<string> operator()(
const set<string>& left,
145 const set<string>& right)
const {
147 set_intersection(left.begin(), left.end(), right.begin(), right.end(),
148 inserter(result, result.begin()));
153 if (requiredDirections == 0) {
154 throw invalid_argument(
"At least one required direction has to be specified.");
158 set<string> inPullTransports;
161 for (set<InPullFactory::ConnectorInfo>::const_iterator it
162 = infos.begin(); it != infos.end(); ++it) {
163 inPullTransports.insert(it->getName());
164 result.insert(it->getName());
167 set<string> inPushTransports;
170 for (set<InPushFactory::ConnectorInfo>::const_iterator it
171 = infos.begin(); it != infos.end(); ++it) {
172 inPushTransports.insert(it->getName());
173 result.insert(it->getName());
176 set<string> outTransports;
179 for (set<OutFactory::ConnectorInfo>::const_iterator it
180 = infos.begin(); it != infos.end(); ++it) {
181 outTransports.insert(it->getName());
182 result.insert(it->getName());
186 if (requiredDirections &
IN_PULL) {
187 result = intersection()(result, inPullTransports);
189 if (requiredDirections &
IN_PUSH) {
190 result = intersection()(result, inPushTransports);
192 if (requiredDirections &
OUT) {
193 result = intersection()(result, outTransports);
200 unsigned int requiredDirections) {
201 if (requiredDirections == 0) {
202 throw invalid_argument(
"At least one required direction has to be specified.");
205 if (requiredDirections &
IN_PULL) {
208 }
catch (
const rsc::runtime::NoSuchObject&) {
212 if (requiredDirections &
IN_PUSH) {
215 }
catch (
const rsc::runtime::NoSuchObject&) {
219 if (requiredDirections &
OUT) {
222 }
catch (
const rsc::runtime::NoSuchObject&) {
231 bool validResult =
false;
238 }
catch (
const rsc::runtime::NoSuchObject&) {
244 if (validResult && (remote != info.
isRemote())) {
245 throw std::logic_error(
"connectors of one transport disagree about remoteness.");
249 }
catch (
const rsc::runtime::NoSuchObject&) {
255 if (validResult && (remote != info.
isRemote())) {
256 throw std::logic_error(
"connectors of one transport disagree about remoteness.");
260 }
catch (
const rsc::runtime::NoSuchObject&) {
263 throw rsc::runtime::NoSuchObject(transportName);