8 , d_destination(destination)
23 vrpn_CONNECTIONFORWARDERRECORD *dlp;
30 d_list->sourceServiceId);
45 const char *sourceServiceId,
46 const char *destinationName,
47 const char *destinationServiceId,
48 vrpn_uint32 classOfService)
51 vrpn_CONNECTIONFORWARDERRECORD *newList =
52 new vrpn_CONNECTIONFORWARDERRECORD(
53 d_source, d_destination, sourceName, sourceServiceId,
54 destinationName, destinationServiceId, classOfService);
56 if (!newList)
return -1;
58 newList->next = d_list;
63 newList->sourceServiceId);
69 const char *sourceServiceId,
70 const char *destinationName,
71 const char *destinationServiceId,
72 vrpn_uint32 classOfService)
75 vrpn_CONNECTIONFORWARDERRECORD **snitch;
76 vrpn_CONNECTIONFORWARDERRECORD *victim;
78 vrpn_int32 st, ss, dt, ds;
85 for (snitch = &d_list, victim = *snitch; victim;
86 snitch = &(victim->next), victim = *snitch) {
88 if ((victim->sourceId == st) && (victim->sourceServiceId == ss) &&
89 (victim->destinationId == dt) &&
90 (victim->destinationServiceId == ds) &&
91 (victim->classOfService == classOfService)) {
92 (*snitch)->next = victim->next;
102 int vrpn_ConnectionForwarder::handle_message(
void *userdata,
108 vrpn_int32
id = p.
type;
109 vrpn_int32 serviceId = p.
sender;
110 vrpn_uint32 serviceClass;
118 retval = me->map(&
id, &serviceId, &serviceClass);
119 if (retval)
return -1;
121 if (me->d_destination) {
123 serviceId, p.
buffer, serviceClass);
132 vrpn_int32 vrpn_ConnectionForwarder::map(vrpn_int32 *
id, vrpn_int32 *serviceId,
133 vrpn_uint32 *classOfService)
136 vrpn_CONNECTIONFORWARDERRECORD *dlp;
138 for (dlp = d_list; dlp; dlp = dlp->next)
139 if ((*
id == dlp->sourceId) && (*serviceId == dlp->sourceServiceId)) {
140 *
id = dlp->destinationId;
141 *serviceId = dlp->destinationServiceId;
142 *classOfService = dlp->classOfService;
152 vrpn_ConnectionForwarder::vrpn_CONNECTIONFORWARDERRECORD::
155 const char *iSourceServiceId,
157 const char *iDestServiceId, vrpn_uint32 cos)
158 : sourceId(source->register_message_type(iSourceId))
159 , sourceServiceId(source->register_sender(iSourceServiceId))
160 , destinationId(dest->register_message_type(iDestId))
161 , destinationServiceId(dest->register_sender(iDestServiceId))
162 , classOfService(cos)
168 const char *sourceServiceName,
170 const char *destinationServiceName)
172 , d_sourceService(source->register_sender(sourceServiceName))
173 , d_destination(destination)
174 , d_destinationService(destination->register_sender(destinationServiceName))
189 vrpn_STREAMFORWARDERRECORD *dlp;
211 const char *destinationName,
212 vrpn_uint32 classOfService)
215 vrpn_STREAMFORWARDERRECORD *newList =
new vrpn_STREAMFORWARDERRECORD(
216 d_source, d_destination, sourceName, destinationName, classOfService);
218 if (!newList)
return -1;
220 newList->next = d_list;
231 const char *destinationName,
232 vrpn_uint32 classOfService)
235 vrpn_STREAMFORWARDERRECORD **snitch;
236 vrpn_STREAMFORWARDERRECORD *victim;
243 for (snitch = &d_list, victim = *snitch; victim;
244 snitch = &(victim->next), victim = *snitch) {
246 if ((victim->sourceId == st) && (victim->destinationId == dt) &&
247 (victim->classOfService == classOfService)) {
248 (*snitch)->next = victim->next;
263 vrpn_int32
id = p.
type;
264 vrpn_uint32 serviceClass;
272 retval = me->map(&
id, &serviceClass);
273 if (retval)
return -1;
275 if (me->d_destination) {
277 me->d_destinationService, p.
buffer,
287 vrpn_int32 vrpn_StreamForwarder::map(vrpn_int32 *
id,
288 vrpn_uint32 *classOfService)
291 vrpn_STREAMFORWARDERRECORD *dlp;
293 for (dlp = d_list; dlp; dlp = dlp->next)
294 if (*
id == dlp->sourceId) {
295 *
id = dlp->destinationId;
296 *classOfService = dlp->classOfService;
306 vrpn_StreamForwarder::vrpn_STREAMFORWARDERRECORD::vrpn_STREAMFORWARDERRECORD(
308 const char *iDestId, vrpn_uint32 cos)
309 : sourceId(source->register_message_type(iSourceId))
310 , destinationId(dest->register_message_type(iDestId))
311 , classOfService(cos)
vrpn_ConnectionForwarder(vrpn_Connection *source, vrpn_Connection *destination)
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...
virtual int unregister_handler(vrpn_int32 type, vrpn_MESSAGEHANDLER handler, void *userdata, vrpn_int32 sender=vrpn_ANY_SENDER)
vrpn_StreamForwarder(vrpn_Connection *source, const char *sourceServiceName, vrpn_Connection *destination, const char *destinationServiceName)
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)
virtual vrpn_int32 register_sender(const char *name)
Get a token to use for the string name of the sender or type. Remember to check for -1 meaning failur...
~vrpn_StreamForwarder(void)
Generic connection class not specific to the transport mechanism.
~vrpn_ConnectionForwarder(void)
virtual int register_handler(vrpn_int32 type, vrpn_MESSAGEHANDLER handler, void *userdata, vrpn_int32 sender=vrpn_ANY_SENDER)
Set up (or remove) a handler for a message of a given type. Optionally, specify which sender to handl...
int unforward(const char *sourceName, const char *destinationName, vrpn_uint32 classOfService=vrpn_CONNECTION_RELIABLE)
This structure is what is passed to a vrpn_Connection message callback.
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...
void addReference()
Counting references to this connection.
virtual vrpn_int32 register_message_type(const char *name)
int forward(const char *sourceName, const char *destinationName, vrpn_uint32 classOfService=vrpn_CONNECTION_RELIABLE)