]> rtime.felk.cvut.cz Git - orte.git/blob - orte/liborte/objectUtils.c
new version 0.2.3
[orte.git] / orte / liborte / objectUtils.c
1     /*
2  *  $Id: objectUtils.c,v 0.0.0.1         2003/09/10
3  *
4  *  DEBUG:  section 9                   Functions with objets
5  *  AUTHOR: Petr Smolik                 petr.smolik@wo.cz
6  *
7  *  ORTE - OCERA Real-Time Ethernet     http://www.ocera.org/
8  *  --------------------------------------------------------------------
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *  
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *  
20  */ 
21
22 #include "orte_all.h"
23
24 /*
25  * AppParamsInit - Initalization default values of an application
26  * @ap: pointer to an application 
27  *
28  */
29 void 
30 AppParamsInit(AppParams *ap) {
31   PROTOCOL_VERSION_1_0(ap->protocolVersion);
32   VENDOR_ID_UNKNOWN(ap->vendorId);
33   NTPTIME_BUILD(ap->expirationTime,180);
34   ap->metatrafficUnicastPort=PORT_INVALID;
35   ap->userdataUnicastPort=PORT_INVALID;
36   ap->unicastIPAddressCount=0;
37   ap->metatrafficMulticastIPAddressCount=0;
38   ap->managerKeyCount=0;
39   SEQUENCE_NUMBER_NONE(ap->vargAppsSequenceNumber);
40 }
41
42 /*
43  * PublParamsInit - Initalization default values of a publisher
44  * @p: pointer to a publisher
45  *
46  */
47 void 
48 PublParamsInit(ORTEPublProp *pp) {
49   pp->expectsAck=ORTE_TRUE;
50   NTPTIME_ZERO(pp->persistence);
51   pp->reliabilityOffered=0;
52   pp->sendQueueSize=1;
53   pp->strength=1;
54   strcpy(pp->topic,"DefaultTopic");
55   strcpy(pp->typeName,"");
56   pp->typeChecksum=0;
57   //additional params
58   NTPTIME_BUILD(pp->maxBlockTime,30);
59   pp->criticalQueueLevel=1;
60   NtpTimeAssembFromMs(pp->HBNornalRate,1,0);
61   NtpTimeAssembFromMs(pp->HBCQLRate,0,50);
62   pp->HBMaxRetries=10;
63 }
64
65 /*
66  * SubsParamsInit - Initalization default values of a subscription
67  * @s: pointer to a subscription
68  *
69  */
70 void 
71 SubsParamsInit(ORTESubsProp *sp) {
72   NTPTIME_ZERO(sp->minimumSeparation);
73   sp->recvQueueSize=1;
74   sp->reliabilityRequested=0;
75   strcpy(sp->topic,"DefaultTopic");
76   strcpy(sp->typeName,"");
77   sp->typeChecksum=0;
78 //  s->rcvMessageCallBack=NULL;
79 //  s->deadline=NTPTIME_ZERO;
80 }
81
82 /*
83  * UpdateORTEAppInfo - 
84  * @appParams: pointer to a source of data
85  * @appInfo: pointer to a destination of data
86  *
87  */
88 void
89 updateORTEAppInfo(AppParams *appParams,ORTEAppInfo *appInfo) {
90   appInfo->hostId=
91       appParams->hostId;
92   appInfo->appId=
93       appParams->appId;
94   appInfo->unicastIPAddressList=
95       appParams->unicastIPAddressList;
96   appInfo->unicastIPAddressCount=
97       appParams->unicastIPAddressCount;
98   appInfo->metatrafficMulticastIPAddressList=
99       appParams->metatrafficMulticastIPAddressList;
100   appInfo->metatrafficMulticastIPAddressCount=
101       appParams->metatrafficMulticastIPAddressCount;
102   appInfo->metatrafficUnicastPort=
103       appParams->metatrafficUnicastPort;
104   appInfo->userdataUnicastPort=
105       appParams->userdataUnicastPort;
106   appInfo->vendorId=
107       appParams->vendorId;
108   appInfo->protocolVersion=
109      appParams->protocolVersion;
110 }
111
112 /*
113  * generateEvent - Generate new and delete event up to an application
114  * @objectEntryOID: pointer to a OID structure
115  * @live: ORTE_TRUE if object is live
116  *
117  * Return: return ORTE_TRUE if object is acceptable by ORTE (new events)
118  */
119 Boolean
120 generateEvent(ORTEDomain *d,GUID_RTPS *guid,void *params,Boolean live) {
121   ObjectEntryOID  *objectEntryOID;
122   GUID_RTPS       guidapp;
123   Boolean         result=ORTE_TRUE;
124   
125   //generate event 
126   switch (guid->oid & 0x07) {
127     case OID_APPLICATION:
128         updateORTEAppInfo((AppParams*)params,&d->appInfo);
129         if (((guid->aid & 0x03)==MANAGER) && 
130             (d->domainEvents.onMgrNew) && live) 
131           result=d->domainEvents.onMgrNew(&d->appInfo,
132                                           d->domainEvents.onMgrNewParam);
133         if (((guid->aid & 0x03)==MANAGER) && 
134             (d->domainEvents.onMgrDelete) && (!live)) 
135           d->domainEvents.onMgrDelete(&d->appInfo,
136                                       d->domainEvents.onMgrDeleteParam);
137         if (((guid->aid & 0x03)==MANAGEDAPPLICATION) && 
138             (d->domainEvents.onAppRemoteNew) && live) 
139           result=d->domainEvents.onAppRemoteNew(&d->appInfo,
140                                           d->domainEvents.onAppRemoteNewParam);
141         if (((guid->aid & 0x03)==MANAGEDAPPLICATION) && 
142             (d->domainEvents.onAppDelete) && !live) 
143           d->domainEvents.onAppDelete(&d->appInfo,
144                                       d->domainEvents.onAppDeleteParam);
145       break;
146     case OID_PUBLICATION:
147       guidapp.hid=guid->hid;
148       guidapp.aid=guid->aid;
149       guidapp.oid=OID_APP;
150       objectEntryOID=objectEntryFind(d,&guidapp);
151       if (!objectEntryOID) return ORTE_FALSE;
152       updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);   
153       d->pubInfo.topic=((ORTEPublProp*)params)->topic;
154       d->pubInfo.type=((ORTEPublProp*)params)->typeName;
155       d->pubInfo.objectId=guid->oid;
156       if ((d->domainEvents.onPubRemoteNew) && live) 
157         result=d->domainEvents.onPubRemoteNew(&d->appInfo,&d->pubInfo,
158                                         d->domainEvents.onPubRemoteNewParam);
159       if ((d->domainEvents.onPubDelete) && !live) 
160         d->domainEvents.onPubDelete(&d->appInfo,&d->pubInfo,
161                                     d->domainEvents.onPubDeleteParam);
162       
163       break;
164     case OID_SUBSCRIPTION:
165       guidapp.hid=guid->hid;
166       guidapp.aid=guid->aid;
167       guidapp.oid=OID_APP;
168       objectEntryOID=objectEntryFind(d,&guidapp);
169       if (!objectEntryOID) return ORTE_FALSE;
170       updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);   
171       d->subInfo.topic=((ORTESubsProp*)params)->topic;
172       d->subInfo.type=((ORTESubsProp*)params)->typeName;
173       d->subInfo.objectId=guid->oid;
174       if ((d->domainEvents.onSubRemoteNew) && (live))
175         result=d->domainEvents.onSubRemoteNew(&d->appInfo,&d->subInfo,
176                                         d->domainEvents.onSubRemoteNewParam);
177       if ((d->domainEvents.onSubDelete) && (!live))
178         d->domainEvents.onSubDelete(&d->appInfo,&d->subInfo,
179                                     d->domainEvents.onSubDeleteParam);
180       
181       break;
182   }
183   return result;
184 }
185
186 /*
187  * GetTypeApp - Test if application is MOM or OAM
188  * @d: pointer to a domain
189  * @ap 
190  * @senderIPAddress:
191  *
192  * Return: return ORTE_TRUE if application MOM
193  */
194 Boolean
195 getTypeApp(ORTEDomain *d,AppParams *ap,IPAddress senderIPAddress) {
196   Boolean       result=ORTE_FALSE;
197   uint16_t      i,j,k;
198   
199   //test if the app is MOM
200   for (i=0;i<d->appParams->managerKeyCount;i++) {
201     for (j=0;j<ap->managerKeyCount;j++) {
202       if (ap->managerKeyList[j]!=StringToIPAddress("127.0.0.1")) {
203         if (ap->managerKeyList[j]==d->appParams->managerKeyList[i])
204           result=ORTE_TRUE;
205       } else {
206         if (senderIPAddress==StringToIPAddress("127.0.0.1"))
207           result=ORTE_TRUE;
208         for (k=0;k<d->domainProp.IFCount;k++) {
209           if (d->domainProp.IFProp[k].ipAddress==senderIPAddress)
210             result=ORTE_TRUE;
211         }
212       }
213     }
214   }
215   return result;
216 }
217
218 /*
219  * appSelfParamChanged - Self parameters changed
220  * @d: pointer to an domain
221  * @lock: lock CSTWriters at the start of function
222  * @unlock: unlock CSTWriters at the end of function
223  * @alive:
224  *
225  */
226 void 
227 appSelfParamChanged(ORTEDomain *d,
228     Boolean lock,Boolean unlock,Boolean forWM,Boolean alive) {
229   CSChange     *csChange;
230      
231   if (lock) {
232     pthread_rwlock_wrlock(&d->writerApplicationSelf.lock);
233     if (forWM)
234       pthread_rwlock_wrlock(&d->writerManagers.lock);
235   }
236   csChange=(CSChange*)MALLOC(sizeof(CSChange));
237   parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
238   csChange->guid=d->guid;
239   csChange->alive=alive;
240   csChange->cdrStream.buffer=NULL;
241   CSTWriterAddCSChange(d,&d->writerApplicationSelf,csChange);
242   if (forWM) {
243     csChange=(CSChange*)MALLOC(sizeof(CSChange));
244     parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
245     csChange->guid=d->guid;
246     csChange->alive=alive;
247     csChange->cdrStream.buffer=NULL;
248     CSTWriterAddCSChange(d,&d->writerManagers,csChange);
249   }
250   if (unlock) {
251     pthread_rwlock_unlock(&d->writerApplicationSelf.lock);
252     if (forWM)
253       pthread_rwlock_unlock(&d->writerManagers.lock);
254   }
255 }