]> rtime.felk.cvut.cz Git - orte.git/blob - orte/liborte/parameter.c
updated email address - petr@smoliku.cz
[orte.git] / orte / liborte / parameter.c
1 /*
2  *  $Id: parameter.c,v 0.0.0.1          2003/10/13
3  *
4  *  DEBUG:  section 11                  parameter
5  *
6  *  -------------------------------------------------------------------  
7  *                                ORTE                                 
8  *                      Open Real-Time Ethernet                       
9  *                                                                    
10  *                      Copyright (C) 2001-2006                       
11  *  Department of Control Engineering FEE CTU Prague, Czech Republic  
12  *                      http://dce.felk.cvut.cz                       
13  *                      http://www.ocera.org                          
14  *                                                                    
15  *  Author:              Petr Smolik    petr@smoliku.cz             
16  *  Advisor:             Pavel Pisa                                   
17  *  Project Responsible: Zdenek Hanzalek                              
18  *  --------------------------------------------------------------------
19  *
20  *  This program is free software; you can redistribute it and/or modify
21  *  it under the terms of the GNU General Public License as published by
22  *  the Free Software Foundation; either version 2 of the License, or
23  *  (at your option) any later version.
24  *  
25  *  This program is distributed in the hope that it will be useful,
26  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
27  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28  *  GNU General Public License for more details.
29  *  
30  */ 
31
32 #include "orte_all.h"
33
34 /*****************************************************************************/
35 void
36 parameterPutString(ParameterSequence *ps,int8_t id,int8_t *sstr) 
37 {
38   int               len;
39
40   len=strlen((char*)sstr)+1;
41   ps->parameterID=id;
42   ps->parameterLength=len;
43   ps->parameter=NULL;
44
45   if (MAX_PARAMETER_LOCAL_LENGTH<len) {
46      ps->parameter=(u_char*)MALLOC(len);
47      strncpy((char *)ps->parameter, (const char*)sstr,len);
48   } else {
49      strncpy((char *)ps->parameterLocal.asStr, (const char*)sstr,len);
50   } 
51 }
52
53 /*****************************************************************************/
54 int
55 parameterDelete(CSChange *csChange) {
56   ParameterSequence *ps;
57
58   ul_list_for_each(CSChangeAttributes,
59                    csChange,
60                    ps) {
61     if ((ps->parameterLength) > MAX_PARAMETER_LOCAL_LENGTH)
62       FREE(ps->parameter);
63   }
64   //ps is like one piece of memory
65   if (CSChangeAttributes_first(csChange))
66     FREE(CSChangeAttributes_first(csChange));
67   CSChangeAttributes_init_head(csChange);  
68   return ORTE_TRUE;
69
70
71
72 /*****************************************************************************/
73 int
74 parameterCodeCodecFromCSChange(CSChange *csChange,CDR_Codec *cdrCodec)
75 {
76   ParameterSequence *ps;
77
78   ul_list_for_each(CSChangeAttributes,
79                    csChange,
80                    ps) {
81
82     if (CDR_put_ushort(cdrCodec,ps->parameterID)==CORBA_FALSE) return -1;
83     if (CDR_put_ushort(cdrCodec,ps->parameterLength)==CORBA_FALSE) return -1;
84
85     debug(11,10) ("parameterCodeCodecToCSChange: parameterID-0x%x, len-%d\n",
86                   ps->parameterID,ps->parameterLength);
87
88     switch (ps->parameterID) {
89       case PID_SENTINEL:
90         break;
91       //NtpTime
92       case PID_EXPIRATION_TIME:
93       case PID_PERSISTENCE:
94       case PID_MINIMUM_SEPARATION:
95         /* time in seconds */
96         if (CDR_put_long(cdrCodec, ps->parameterLocal.asNtpTime.seconds)==
97             CORBA_FALSE) return -1;
98         /* time in seconds / 2^32 */
99         if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asNtpTime.fraction)==
100             CORBA_FALSE) return -1;     
101         break;
102       //CORBA_unsigned_long
103       case PID_TYPE_CHECKSUM:
104       case PID_STRENGTH:
105       case PID_SEND_QUEUE_SIZE:
106       case PID_RECV_QUEUE_SIZE:
107       case PID_RELIABILITY_OFFERED:
108       case PID_RELIABILITY_REQUESTED:
109       case PID_MANAGER_KEY:
110       case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
111       case PID_APP_IPADDRESS:
112       case PID_USERDATA_MULTICAST_IPADDRESS:
113       case PID_METATRAFFIC_UNICAST_PORT:
114       case PID_USERDATA_UNICAST_PORT:
115         if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asLong)==
116             CORBA_FALSE) return -1;     
117         break;
118       //VendorId
119       case PID_VENDOR_ID:
120         if (CDR_put_octet(cdrCodec, ps->parameterLocal.asVendorId.major)==
121             CORBA_FALSE) return -1;     
122         if (CDR_put_octet(cdrCodec, ps->parameterLocal.asVendorId.minor)==
123             CORBA_FALSE) return -1;     
124         break;
125       //ProtocolVersion
126       case PID_PROTOCOL_VERSION:
127         if (CDR_put_octet(cdrCodec, ps->parameterLocal.asProtocolVersion.major)==
128             CORBA_FALSE) return -1;     
129         if (CDR_put_octet(cdrCodec, ps->parameterLocal.asProtocolVersion.minor)==
130             CORBA_FALSE) return -1;     
131         break;
132       //SequenceNumber
133       case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
134         if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asSequenceNumber.high)==
135             CORBA_FALSE) return -1;     
136         if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asSequenceNumber.low)==
137             CORBA_FALSE) return -1;     
138         break;
139       //Boolean
140       case PID_EXPECTS_ACK:
141         if (CDR_put_octet(cdrCodec,ps->parameterLocal.asOctet)==
142             CORBA_FALSE) return -1;     
143         break;
144       //PathName,TypeName
145       case PID_TOPIC:
146       case PID_TYPE_NAME:{
147         int wptr,len;
148         
149         wptr=cdrCodec->wptr;
150         
151         len=ps->parameterLength;
152         if (len % 4) {                    //length alignment to 4
153           len&=~3;
154           len+=4;
155         }
156         len+=4;                           //data size
157         cdrCodec->wptr-=2;                //new alignments value 
158         if (CDR_put_ushort(cdrCodec,(CORBA_unsigned_short)len)==CORBA_FALSE) return -1; 
159
160         if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH) {
161           if (CDR_put_string(cdrCodec,(char*)ps->parameter)==
162             CORBA_FALSE) return -1;     
163         } else {
164           if (CDR_put_string(cdrCodec,(char*)ps->parameterLocal.asStr)==
165             CORBA_FALSE) return -1;     
166         }
167
168         cdrCodec->wptr=wptr+len;
169         } break;
170       case PID_PAD:
171         break;
172       default:
173         debug(11,1) ("parameterCodeCodecFromCSChange: undefined parameterID: %d\n",
174                       ps->parameterID);
175         break;
176     }
177   }
178   return 0;
179 }
180
181 /*****************************************************************************/
182 int
183 parameterDecodeCodecToCSChange(CSChange *csChange,CDR_Codec *cdrCodec)
184 {
185   ParameterId       parameterId;
186   ParameterLength   parameterLength;
187   ParameterSequence *ps;
188   uint16_t          counter=0;
189   unsigned int      rptr;
190
191   CSChangeAttributes_init_head(csChange);
192   rptr=cdrCodec->rptr;
193
194   //count number of parameters -> we need one memory allocation for ps
195   while (cdrCodec->rptr<cdrCodec->buf_len) {
196     if (CDR_get_ushort(cdrCodec,&parameterId)==CORBA_FALSE) 
197       break;
198     if (CDR_get_ushort(cdrCodec,&parameterLength)==CORBA_FALSE) 
199       break;
200     if (parameterId==PID_SENTINEL) 
201       break;
202     counter++;
203     cdrCodec->rptr+=parameterLength;
204   }
205
206   ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*(counter+1));
207   cdrCodec->rptr=rptr;
208
209   while (counter) {
210     CDR_get_ushort(cdrCodec,&parameterId);
211     CDR_get_ushort(cdrCodec,&parameterLength);
212
213     ps->parameterID=parameterId;
214     ps->parameterLength=parameterLength;
215     ps->parameter=NULL;
216
217     /* save start position of parameter */
218     rptr=cdrCodec->rptr;  
219
220     debug(11,10) ("parameterDecodeCodecToCSChange: parameterID-0x%x, len-%d\n",
221                   parameterId,parameterLength);
222     switch (parameterId) {
223       case PID_SENTINEL:
224         counter=1;
225         break;
226       //NtpTime
227       case PID_EXPIRATION_TIME:
228       case PID_PERSISTENCE:
229       case PID_MINIMUM_SEPARATION:
230         /* time in seconds */
231         CDR_get_long(cdrCodec, &ps->parameterLocal.asNtpTime.seconds);
232         /* time in seconds / 2^32 */
233         CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&ps->parameterLocal.asNtpTime.fraction);
234         break;
235       //CORBA_unsigned_long
236       case PID_TYPE_CHECKSUM:
237       case PID_STRENGTH:
238       case PID_SEND_QUEUE_SIZE:
239       case PID_RECV_QUEUE_SIZE:
240       case PID_RELIABILITY_OFFERED:
241       case PID_RELIABILITY_REQUESTED:
242       case PID_MANAGER_KEY:
243       case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
244       case PID_APP_IPADDRESS:
245       case PID_USERDATA_MULTICAST_IPADDRESS:
246       case PID_METATRAFFIC_UNICAST_PORT:
247       case PID_USERDATA_UNICAST_PORT:
248         CDR_get_ulong(cdrCodec, &ps->parameterLocal.asLong);
249         break;
250       //VendorId
251       case PID_VENDOR_ID:
252         CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asVendorId.major);
253         CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asVendorId.minor);
254         break;
255       //ProtocolVersion
256       case PID_PROTOCOL_VERSION:
257         CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asProtocolVersion.major);
258         CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asProtocolVersion.minor);
259         break;
260       //SequenceNumber
261       case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
262         CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&ps->parameterLocal.asSequenceNumber.high);
263         CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&ps->parameterLocal.asSequenceNumber.low);
264         break;
265       //Boolean
266       case PID_EXPECTS_ACK:
267         CDR_get_octet(cdrCodec, ps->parameterLocal.asStr);
268         break;
269       //PathName,TypeName
270       case PID_TOPIC:
271       case PID_TYPE_NAME:{
272         CORBA_unsigned_long len;
273
274         CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&len);  
275         cdrCodec->rptr-=4;
276         ps->parameterLength=(uint16_t)len;
277         if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH) {       
278           CDR_get_string(cdrCodec,(CORBA_char**)&ps->parameter);
279         } else {
280           CDR_get_string_buff(cdrCodec,(CORBA_char*)ps->parameterLocal.asStr);
281         }
282         } break;
283       case PID_PAD:
284         break;
285       default:
286         debug(11,1) ("parameterDecodeCodecToCSChange: undefined parameterID: %d\n",
287                       parameterId);
288         break;
289     }
290     CSChangeAttributes_insert(csChange,ps);
291     ps++; //next ps
292     counter--;
293
294     cdrCodec->rptr=rptr+parameterLength;  
295   }
296   //SENTINEL
297   ps->parameterID=PID_SENTINEL;
298   ps->parameterLength=0;
299   ps->parameter=NULL;
300   CSChangeAttributes_insert(csChange,ps);
301   return ORTE_TRUE;
302 }
303
304 /*****************************************************************************/
305 int
306 parameterUpdateCSChange(
307      CSChange *csChange,AppParams *ap,Boolean Manager) {
308   ParameterSequence *ps;
309   int               i;
310
311   i=ap->managerKeyCount+
312     ap->metatrafficMulticastIPAddressCount+
313     ap->unicastIPAddressCount+7;
314   if (!Manager) i--;
315   CSChangeAttributes_init_head(csChange);
316   ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*i);
317   //EXPIRATION_TIME
318   ps->parameterID=PID_EXPIRATION_TIME;
319   ps->parameterLength=8;
320   memcpy(ps->parameterLocal.asStr,&ap->expirationTime,ps->parameterLength);
321   ps->parameter=NULL;
322   CSChangeAttributes_insert(csChange,ps);
323   ps++;  
324   //MATATRAFFIC_MULTICAST_IPADDRESS
325   for (i=0;i<ap->metatrafficMulticastIPAddressCount;i++) {
326     ps->parameterID=PID_MATATRAFFIC_MULTICAST_IPADDRESS;
327     ps->parameterLength=4;
328     ps->parameterLocal.asIPAddress=ap->metatrafficMulticastIPAddressList[i];
329     ps->parameter=NULL;
330     CSChangeAttributes_insert(csChange,ps);
331     ps++;
332   }
333   //METATRAFFIC_UNICAST_PORT
334   ps->parameterID=PID_METATRAFFIC_UNICAST_PORT;
335   ps->parameterLength=4;
336   ps->parameterLocal.asPort=ap->metatrafficUnicastPort;
337   ps->parameter=NULL;
338   CSChangeAttributes_insert(csChange,ps);
339   ps++;  
340   //USERDATA_UNICAST_PORT
341   ps->parameterID=PID_USERDATA_UNICAST_PORT;
342   ps->parameterLength=4;
343   ps->parameterLocal.asPort=ap->userdataUnicastPort;
344   ps->parameter=NULL;
345   CSChangeAttributes_insert(csChange,ps);
346   ps++;  
347   //APP_IPADDRESS
348   for (i=0;i<ap->unicastIPAddressCount;i++) {
349     ps->parameterID=PID_APP_IPADDRESS;;
350     ps->parameterLength=4;
351     ps->parameterLocal.asIPAddress=ap->unicastIPAddressList[i];
352     ps->parameter=NULL;
353     CSChangeAttributes_insert(csChange,ps);
354     ps++;
355   }
356   //PROTOCOL_VERSION
357   ps->parameterID=PID_PROTOCOL_VERSION;
358   ps->parameterLength=2;
359   ps->parameterLocal.asProtocolVersion=ap->protocolVersion;
360   ps->parameter=NULL;
361   CSChangeAttributes_insert(csChange,ps);
362   ps++;  
363   //VENDOR_ID
364   ps->parameterID=PID_VENDOR_ID;
365   ps->parameterLength=2;
366   ps->parameterLocal.asVendorId=ap->vendorId;
367   ps->parameter=NULL;
368   CSChangeAttributes_insert(csChange,ps);
369   ps++;  
370   if (Manager) {    //Manager
371     //VARGAPPS_SEQUENCE_NUMBER_LAST
372     ps->parameterID=PID_VARGAPPS_SEQUENCE_NUMBER_LAST;
373     ps->parameterLength=8;
374     ps->parameterLocal.asSequenceNumber=ap->vargAppsSequenceNumber;
375     ps->parameter=NULL;
376     CSChangeAttributes_insert(csChange,ps);
377     ps++;  
378   }
379   //MANAGER_KEY
380   for (i=0;i<ap->managerKeyCount;i++) {
381     ps->parameterID=PID_MANAGER_KEY;
382     ps->parameterLength=4;
383     ps->parameterLocal.asUInt32=ap->managerKeyList[i];
384     ps->parameter=NULL;
385     CSChangeAttributes_insert(csChange,ps);
386     ps++;
387   }
388   //SENTINEL
389   ps->parameterID=PID_SENTINEL;
390   ps->parameterLength=0;
391   ps->parameter=NULL;
392   CSChangeAttributes_insert(csChange,ps);
393   return 0;
394
395
396 /*****************************************************************************/
397 int
398 parameterUpdateCSChangeFromPublication(CSChange *csChange,ORTEPublProp *pp) {
399   ParameterSequence *ps;
400   
401   CSChangeAttributes_init_head(csChange);
402   ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*8);
403   //persistence
404   ps->parameterID=PID_PERSISTENCE;
405   ps->parameterLength=8;
406   memcpy(ps->parameterLocal.asStr,&pp->persistence,ps->parameterLength);
407   ps->parameter=NULL;
408   CSChangeAttributes_insert(csChange,ps);
409   ps++;  
410   /* reliabitityOffered */
411   ps->parameterID=PID_RELIABILITY_OFFERED;
412   ps->parameterLength=4;
413   ps->parameterLocal.asUInt32=pp->reliabilityOffered;
414   ps->parameter=NULL;
415   CSChangeAttributes_insert(csChange,ps);
416   ps++;
417   /* sendQueueSize */
418   ps->parameterID=PID_SEND_QUEUE_SIZE;
419   ps->parameterLength=4;
420   ps->parameterLocal.asUInt32=pp->sendQueueSize;
421   ps->parameter=NULL;
422   CSChangeAttributes_insert(csChange,ps);
423   ps++;
424   /* strength */
425   ps->parameterID=PID_STRENGTH;
426   ps->parameterLength=4;
427   ps->parameterLocal.asUInt32=pp->strength;
428   ps->parameter=NULL;
429   CSChangeAttributes_insert(csChange,ps);
430   ps++;
431   /* topic */
432   parameterPutString(ps,PID_TOPIC,pp->topic);
433   CSChangeAttributes_insert(csChange,ps);
434   ps++;  
435   /* typeCheckSum */
436   ps->parameterID=PID_TYPE_CHECKSUM;
437   ps->parameterLength=4;
438   ps->parameterLocal.asUInt32=pp->typeChecksum;
439   ps->parameter=NULL;
440   CSChangeAttributes_insert(csChange,ps);
441   ps++;
442   /* typeName */
443   parameterPutString(ps,PID_TYPE_NAME,pp->typeName);
444   CSChangeAttributes_insert(csChange,ps);
445   ps++;  
446   /* sentinel -> end */  
447   ps->parameterID=PID_SENTINEL;
448   ps->parameterLength=0;
449   ps->parameter=NULL;
450   CSChangeAttributes_insert(csChange,ps);
451   return 0;
452
453
454 /*****************************************************************************/
455 int
456 parameterUpdateCSChangeFromSubscription(CSChange *csChange,ORTESubsProp *sp) {
457   ParameterSequence *ps;
458   
459   CSChangeAttributes_init_head(csChange);
460   ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*8);
461   //minimum separation
462   ps->parameterID=PID_MINIMUM_SEPARATION;
463   ps->parameterLength=8;
464   memcpy(ps->parameterLocal.asStr,&sp->minimumSeparation,ps->parameterLength);
465   ps->parameter=NULL;
466   CSChangeAttributes_insert(csChange,ps);
467   ps++;  
468   /* receive queue size*/
469   ps->parameterID=PID_RECV_QUEUE_SIZE;
470   ps->parameterLength=4;
471   ps->parameterLocal.asUInt32=sp->recvQueueSize;
472   ps->parameter=NULL;
473   CSChangeAttributes_insert(csChange,ps);
474   ps++;
475   /* reliabitityRequested */
476   ps->parameterID=PID_RELIABILITY_REQUESTED;
477   ps->parameterLength=4;
478   ps->parameterLocal.asUInt32=sp->reliabilityRequested;
479   ps->parameter=NULL;
480   CSChangeAttributes_insert(csChange,ps);
481   ps++;
482   /* topic */
483   parameterPutString(ps,PID_TOPIC,sp->topic);
484   CSChangeAttributes_insert(csChange,ps);
485   ps++;  
486   /* typeCheckSum */
487   ps->parameterID=PID_TYPE_CHECKSUM;
488   ps->parameterLength=4;
489   ps->parameterLocal.asUInt32=sp->typeChecksum;
490   ps->parameter=NULL;
491   CSChangeAttributes_insert(csChange,ps);
492   ps++;
493   /* typeName */
494   parameterPutString(ps,PID_TYPE_NAME,sp->typeName);
495   CSChangeAttributes_insert(csChange,ps);
496   ps++;  
497   /* userdata multicast ipaddress */
498   ps->parameterID=PID_USERDATA_MULTICAST_IPADDRESS;
499   ps->parameterLength=4;
500   ps->parameterLocal.asIPAddress=sp->multicast;
501   ps->parameter=NULL;
502   CSChangeAttributes_insert(csChange,ps);
503   ps++;
504   /* sentinel -> end */  
505   ps->parameterID=PID_SENTINEL;
506   ps->parameterLength=0;
507   ps->parameter=NULL;
508   CSChangeAttributes_insert(csChange,ps);
509   return 0;
510
511
512 /*****************************************************************************/
513 int
514 parameterUpdateApplication(CSChange *csChange,AppParams *ap) {
515   ParameterSequence   *ps;
516
517   ap->managerKeyCount=0;
518   ap->metatrafficMulticastIPAddressCount=0;
519   ap->unicastIPAddressCount=0;
520   ap->appId=csChange->guid.aid;
521   ap->hostId=csChange->guid.hid;
522   ul_list_for_each(CSChangeAttributes,csChange,ps) {
523     switch (ps->parameterID) {
524       case PID_EXPIRATION_TIME:
525         ap->expirationTime=ps->parameterLocal.asNtpTime;
526         break;
527       case PID_MANAGER_KEY:
528         ap->managerKeyList[ap->managerKeyCount]=
529             ps->parameterLocal.asUInt32;
530         ap->managerKeyCount++;
531         break;
532       case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
533         ap->metatrafficMulticastIPAddressList[ap->metatrafficMulticastIPAddressCount]=
534             ps->parameterLocal.asIPAddress;
535         ap->metatrafficMulticastIPAddressCount++;
536         break;
537       case PID_APP_IPADDRESS:
538         ap->unicastIPAddressList[ap->unicastIPAddressCount]=
539             ps->parameterLocal.asIPAddress;
540         ap->unicastIPAddressCount++;
541         break;
542       case PID_USERDATA_MULTICAST_IPADDRESS:
543         break;
544       case PID_METATRAFFIC_UNICAST_PORT:
545         ap->metatrafficUnicastPort=ps->parameterLocal.asPort;
546         break;
547       case PID_USERDATA_UNICAST_PORT:
548         ap->userdataUnicastPort=ps->parameterLocal.asPort;
549         break;
550       case PID_VENDOR_ID:
551         ap->vendorId=ps->parameterLocal.asVendorId;
552         break;
553       case PID_PROTOCOL_VERSION:
554         ap->protocolVersion=ps->parameterLocal.asProtocolVersion;
555         break;
556       case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
557         ap->vargAppsSequenceNumber=ps->parameterLocal.asSequenceNumber;
558         break;
559     }
560   }
561   return 0;
562 }
563
564 /*****************************************************************************/
565 int
566 parameterUpdatePublication(CSChange *csChange,ORTEPublProp *pp) {
567   ParameterSequence   *ps;
568
569   ul_list_for_each(CSChangeAttributes,csChange,ps) {
570     switch (ps->parameterID) {
571       case PID_EXPECTS_ACK:
572         pp->expectsAck=*(Boolean*)&ps->parameterLocal;
573       break;
574       case PID_PERSISTENCE:
575         pp->persistence=ps->parameterLocal.asNtpTime;
576       break;
577       case PID_RELIABILITY_OFFERED:
578         pp->reliabilityOffered=ps->parameterLocal.asUInt32;
579       break;
580       case PID_SEND_QUEUE_SIZE:
581         pp->sendQueueSize=ps->parameterLocal.asUInt32;
582       break;
583       case PID_STRENGTH:
584         pp->strength=ps->parameterLocal.asUInt32;
585       break;
586       case PID_TOPIC:
587         if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
588           strncpy((char *)pp->topic, (const char*)ps->parameter,ps->parameterLength);
589         else
590           strncpy((char *)pp->topic, (const char*)ps->parameterLocal.asStr,ps->parameterLength);
591       break;
592       case PID_TYPE_CHECKSUM:
593         pp->typeChecksum=ps->parameterLocal.asTypeChecksum;
594       break;
595       case PID_TYPE_NAME:
596         if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
597           strncpy((char *)pp->typeName, (const char*)ps->parameter,ps->parameterLength);
598         else
599           strncpy((char *)pp->typeName, (const char*)ps->parameterLocal.asStr,ps->parameterLength);
600       break;      
601     }
602   }
603   return 0;
604 }
605
606 /*****************************************************************************/
607 int
608 parameterUpdateSubscription(CSChange *csChange,ORTESubsProp *sp) {
609   ParameterSequence   *ps;
610
611   ul_list_for_each(CSChangeAttributes,csChange,ps) {
612     switch (ps->parameterID) {
613       case PID_MINIMUM_SEPARATION:
614         sp->minimumSeparation=ps->parameterLocal.asNtpTime;
615       break;
616       case PID_RECV_QUEUE_SIZE:
617         sp->recvQueueSize=ps->parameterLocal.asUInt32;
618       break;
619       case PID_RELIABILITY_REQUESTED:
620         sp->reliabilityRequested=ps->parameterLocal.asUInt32;
621       break;
622       case PID_TOPIC:
623         if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
624           strncpy((char *)sp->topic, (const char*)ps->parameter,ps->parameterLength);
625         else
626           strncpy((char *)sp->topic, (const char*)ps->parameterLocal.asStr,ps->parameterLength);
627       break;
628       case PID_TYPE_CHECKSUM:
629         sp->typeChecksum=ps->parameterLocal.asTypeChecksum;
630       break;
631       case PID_TYPE_NAME:
632         if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
633           strncpy((char *)sp->typeName, (const char*)ps->parameter,ps->parameterLength);
634         else
635           strncpy((char *)sp->typeName, (const char*)ps->parameterLocal.asStr,ps->parameterLength);
636       break;
637       case PID_USERDATA_MULTICAST_IPADDRESS:
638         sp->multicast=ps->parameterLocal.asIPAddress;
639       break;
640     }
641   }
642   return 0;
643 }
644