8 , d_destination(destination)
13 d_source->addReference();
16 d_destination->addReference();
22 vrpn_CONNECTIONFORWARDERRECORD *dlp;
28 d_source->unregister_handler(d_list->sourceId, handle_message,
this,
29 d_list->sourceServiceId);
33 fprintf(stderr,
"vrpn_ConnectionForwarder::~vrpn_ConnectionForwarder(): delete failed\n");
40 d_source->removeReference();
43 d_destination->removeReference();
48 const char *sourceServiceId,
49 const char *destinationName,
50 const char *destinationServiceId,
51 vrpn_uint32 classOfService)
53 vrpn_CONNECTIONFORWARDERRECORD *newList = NULL;
55 new vrpn_CONNECTIONFORWARDERRECORD(
56 d_source, d_destination, sourceName, sourceServiceId,
57 destinationName, destinationServiceId, classOfService);
58 }
catch (...) {
return -1; }
60 newList->next = d_list;
64 d_source->register_handler(newList->sourceId, handle_message,
this,
65 newList->sourceServiceId);
71 const char *sourceServiceId,
72 const char *destinationName,
73 const char *destinationServiceId,
74 vrpn_uint32 classOfService)
77 vrpn_CONNECTIONFORWARDERRECORD **snitch;
78 vrpn_CONNECTIONFORWARDERRECORD *victim;
80 vrpn_int32 st, ss, dt, ds;
82 st = d_source->register_message_type(sourceName);
83 ss = d_source->register_sender(sourceServiceId);
84 dt = d_destination->register_message_type(destinationName);
85 ds = d_source->register_sender(destinationServiceId);
87 for (snitch = &d_list, victim = *snitch; victim;
88 snitch = &(victim->next), victim = *snitch) {
90 if ((victim->sourceId == st) && (victim->sourceServiceId == ss) &&
91 (victim->destinationId == dt) &&
92 (victim->destinationServiceId == ds) &&
93 (victim->classOfService == classOfService)) {
94 (*snitch)->next = victim->next;
98 fprintf(stderr,
"vrpn_ConnectionForwarder::unforward(): delete failed\n");
109int vrpn_ConnectionForwarder::handle_message(
void *userdata,
115 vrpn_int32
id = p.
type;
116 vrpn_int32 serviceId = p.
sender;
117 vrpn_uint32 serviceClass;
125 retval = me->map(&
id, &serviceId, &serviceClass);
126 if (retval)
return -1;
128 if (me->d_destination) {
130 serviceId, p.
buffer, serviceClass);
139vrpn_int32 vrpn_ConnectionForwarder::map(vrpn_int32 *
id, vrpn_int32 *serviceId,
140 vrpn_uint32 *classOfService)
143 vrpn_CONNECTIONFORWARDERRECORD *dlp;
145 for (dlp = d_list; dlp; dlp = dlp->next)
146 if ((*
id == dlp->sourceId) && (*serviceId == dlp->sourceServiceId)) {
147 *
id = dlp->destinationId;
148 *serviceId = dlp->destinationServiceId;
149 *classOfService = dlp->classOfService;
159vrpn_ConnectionForwarder::vrpn_CONNECTIONFORWARDERRECORD::
162 const char *iSourceServiceId,
164 const char *iDestServiceId, vrpn_uint32 cos)
165 : sourceId(source->register_message_type(iSourceId))
166 , sourceServiceId(source->register_sender(iSourceServiceId))
167 , destinationId(dest->register_message_type(iDestId))
168 , destinationServiceId(dest->register_sender(iDestServiceId))
169 , classOfService(cos)
175 const char *sourceServiceName,
177 const char *destinationServiceName)
179 , d_sourceService(source->register_sender(sourceServiceName))
180 , d_destination(destination)
181 , d_destinationService(destination->register_sender(destinationServiceName))
186 d_source->addReference();
189 d_destination->addReference();
196 vrpn_STREAMFORWARDERRECORD *dlp;
202 d_source->unregister_handler(d_list->sourceId, handle_message,
this,
208 fprintf(stderr,
"vrpn_StreamForwarder::~vrpn_StreamForwarder(): delete failed\n");
215 d_source->removeReference();
218 d_destination->removeReference();
223 const char *destinationName,
224 vrpn_uint32 classOfService)
226 vrpn_STREAMFORWARDERRECORD *newList = NULL;
227 try { newList =
new vrpn_STREAMFORWARDERRECORD(
228 d_source, d_destination, sourceName, destinationName, classOfService);
229 }
catch (...) {
return -1; }
231 newList->next = d_list;
235 d_source->register_handler(newList->sourceId, handle_message,
this,
242 const char *destinationName,
243 vrpn_uint32 classOfService)
246 vrpn_STREAMFORWARDERRECORD **snitch;
247 vrpn_STREAMFORWARDERRECORD *victim;
251 st = d_source->register_message_type(sourceName);
252 dt = d_destination->register_message_type(destinationName);
254 for (snitch = &d_list, victim = *snitch; victim;
255 snitch = &(victim->next), victim = *snitch) {
257 if ((victim->sourceId == st) && (victim->destinationId == dt) &&
258 (victim->classOfService == classOfService)) {
259 (*snitch)->next = victim->next;
263 fprintf(stderr,
"vrpn_StreamForwarder::unforward(): delete failed\n");
279 vrpn_int32
id = p.
type;
280 vrpn_uint32 serviceClass;
288 retval = me->map(&
id, &serviceClass);
289 if (retval)
return -1;
291 if (me->d_destination) {
293 me->d_destinationService, p.
buffer,
303vrpn_int32 vrpn_StreamForwarder::map(vrpn_int32 *
id,
304 vrpn_uint32 *classOfService)
307 vrpn_STREAMFORWARDERRECORD *dlp;
309 for (dlp = d_list; dlp; dlp = dlp->next)
310 if (*
id == dlp->sourceId) {
311 *
id = dlp->destinationId;
312 *classOfService = dlp->classOfService;
322vrpn_StreamForwarder::vrpn_STREAMFORWARDERRECORD::vrpn_STREAMFORWARDERRECORD(
324 const char *iDestId, vrpn_uint32 cos)
325 : sourceId(source->register_message_type(iSourceId))
326 , destinationId(dest->register_message_type(iDestId))
327 , classOfService(cos)
vrpn_ConnectionForwarder(vrpn_Connection *source, vrpn_Connection *destination)
~vrpn_ConnectionForwarder(void)
int unforward(const char *sourceName, const char *sourceServiceName, const char *destinationName, const char *destinationServiceName, vrpn_uint32 classOfService=vrpn_CONNECTION_RELIABLE)
int forward(const char *sourceName, const char *sourceServiceName, const char *destinationName, const char *destinationServiceName, vrpn_uint32 classOfService=vrpn_CONNECTION_RELIABLE)
Generic connection class not specific to the transport mechanism.
virtual int pack_message(vrpn_uint32 len, struct timeval time, vrpn_int32 type, vrpn_int32 sender, const char *buffer, vrpn_uint32 class_of_service)
Pack a message that will be sent the next time mainloop() is called. Turn off the RELIABLE flag if yo...
virtual int mainloop(const struct timeval *timeout=NULL)=0
Call each time through program main loop to handle receiving any incoming messages and sending any pa...
int forward(const char *sourceName, const char *destinationName, vrpn_uint32 classOfService=vrpn_CONNECTION_RELIABLE)
int unforward(const char *sourceName, const char *destinationName, vrpn_uint32 classOfService=vrpn_CONNECTION_RELIABLE)
~vrpn_StreamForwarder(void)
vrpn_StreamForwarder(vrpn_Connection *source, const char *sourceServiceName, vrpn_Connection *destination, const char *destinationServiceName)
This structure is what is passed to a vrpn_Connection message callback.