]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/liborte/objectUtils.c
updated email address - petr@smoliku.cz
[orte.git] / orte / liborte / objectUtils.c
index 2135f8762e67c2db172cb42c39f1171ba3715f98..43686aa83c0b9ecea7ea884f9217aa1e2823c521 100644 (file)
@@ -2,9 +2,19 @@
  *  $Id: objectUtils.c,v 0.0.0.1         2003/09/10
  *
  *  DEBUG:  section 9                   Functions with objets
- *  AUTHOR: Petr Smolik                 petr.smolik@wo.cz
  *
- *  ORTE - OCERA Real-Time Ethernet     http://www.ocera.org/
+ *  -------------------------------------------------------------------  
+ *                                ORTE                                 
+ *                      Open Real-Time Ethernet                       
+ *                                                                    
+ *                      Copyright (C) 2001-2006                       
+ *  Department of Control Engineering FEE CTU Prague, Czech Republic  
+ *                      http://dce.felk.cvut.cz                       
+ *                      http://www.ocera.org                          
+ *                                                                    
+ *  Author:             Petr Smolik    petr@smoliku.cz             
+ *  Advisor:            Pavel Pisa                                   
+ *  Project Responsible: Zdenek Hanzalek                              
  *  --------------------------------------------------------------------
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,7 +29,7 @@
  *  
  */ 
 
-#include "orte.h"
+#include "orte_all.h"
 
 /*
  * AppParamsInit - Initalization default values of an application
@@ -51,8 +61,8 @@ PublParamsInit(ORTEPublProp *pp) {
   pp->reliabilityOffered=0;
   pp->sendQueueSize=1;
   pp->strength=1;
-  strcpy(pp->topic,"DefaultTopic");
-  strcpy(pp->typeName,"");
+  strcpy((char *)pp->topic,"DefaultTopic");
+  strcpy((char *)pp->typeName,"");
   pp->typeChecksum=0;
   //additional params
   NTPTIME_BUILD(pp->maxBlockTime,30);
@@ -72,8 +82,8 @@ SubsParamsInit(ORTESubsProp *sp) {
   NTPTIME_ZERO(sp->minimumSeparation);
   sp->recvQueueSize=1;
   sp->reliabilityRequested=0;
-  strcpy(sp->topic,"DefaultTopic");
-  strcpy(sp->typeName,"");
+  strcpy((char *)sp->topic,"DefaultTopic");
+  strcpy((char *)sp->typeName,"");
   sp->typeChecksum=0;
 //  s->rcvMessageCallBack=NULL;
 //  s->deadline=NTPTIME_ZERO;
@@ -150,8 +160,8 @@ generateEvent(ORTEDomain *d,GUID_RTPS *guid,void *params,Boolean live) {
       objectEntryOID=objectEntryFind(d,&guidapp);
       if (!objectEntryOID) return ORTE_FALSE;
       updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);   
-      d->pubInfo.topic=((ORTEPublProp*)params)->topic;
-      d->pubInfo.type=((ORTEPublProp*)params)->typeName;
+      d->pubInfo.topic=(char*)((ORTEPublProp*)params)->topic;
+      d->pubInfo.type=(char*)((ORTEPublProp*)params)->typeName;
       d->pubInfo.objectId=guid->oid;
       if ((d->domainEvents.onPubRemoteNew) && live) 
         result=d->domainEvents.onPubRemoteNew(&d->appInfo,&d->pubInfo,
@@ -168,8 +178,8 @@ generateEvent(ORTEDomain *d,GUID_RTPS *guid,void *params,Boolean live) {
       objectEntryOID=objectEntryFind(d,&guidapp);
       if (!objectEntryOID) return ORTE_FALSE;
       updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);   
-      d->subInfo.topic=((ORTESubsProp*)params)->topic;
-      d->subInfo.type=((ORTESubsProp*)params)->typeName;
+      d->subInfo.topic=(char*)((ORTESubsProp*)params)->topic;
+      d->subInfo.type=(char*)((ORTESubsProp*)params)->typeName;
       d->subInfo.objectId=guid->oid;
       if ((d->domainEvents.onSubRemoteNew) && (live))
         result=d->domainEvents.onSubRemoteNew(&d->appInfo,&d->subInfo,
@@ -194,7 +204,7 @@ generateEvent(ORTEDomain *d,GUID_RTPS *guid,void *params,Boolean live) {
 Boolean
 getTypeApp(ORTEDomain *d,AppParams *ap,IPAddress senderIPAddress) {
   Boolean       result=ORTE_FALSE;
-  u_int16_t     i,j,k;
+  uint16_t      i,j,k;
   
   //test if the app is MOM
   for (i=0;i<d->appParams->managerKeyCount;i++) {
@@ -215,38 +225,136 @@ getTypeApp(ORTEDomain *d,AppParams *ap,IPAddress senderIPAddress) {
   return result;
 }
 
+/*
+ * matchMulticastAddresses - Test if objects contain same a multicast ip address
+ * @o1: pointer to a object
+ * @o2: pointer to a object
+ *
+ * Return: return ORTE_TRUE if a multicast ip address was match
+ */
+Boolean
+matchMulticastAddresses(ObjectEntryOID *o1,ObjectEntryOID *o2) 
+{
+  AppParams    *ap1,*ap2;
+  uint16_t      i,j;
+  
+  if ((o1->guid.oid!=OID_APP) || 
+      (o1->guid.oid!=OID_APP)) return ORTE_FALSE;
+
+  ap1=o1->attributes;
+  ap2=o2->attributes;
+  for (i=0;i<ap1->metatrafficMulticastIPAddressCount;i++) {
+    for (j=0;j<ap2->metatrafficMulticastIPAddressCount;j++) {
+      if (ap1->metatrafficMulticastIPAddressList[i]==
+          ap2->metatrafficMulticastIPAddressList[j])
+         return ORTE_TRUE;
+    }
+  }
+  return ORTE_FALSE;
+}
+
 /*
  * appSelfParamChanged - Self parameters changed
  * @d: pointer to an domain
  * @lock: lock CSTWriters at the start of function
  * @unlock: unlock CSTWriters at the end of function
+ * @alive:
  *
  */
 void 
 appSelfParamChanged(ORTEDomain *d,
-    Boolean lock,Boolean unlock,Boolean forWM) {
+    Boolean lock,Boolean unlock,Boolean forWM,Boolean alive) {
   CSChange     *csChange;
      
   if (lock) {
     pthread_rwlock_wrlock(&d->writerApplicationSelf.lock);
-    pthread_rwlock_wrlock(&d->writerManagers.lock);
+    if (forWM)
+      pthread_rwlock_wrlock(&d->writerManagers.lock);
   }
   csChange=(CSChange*)MALLOC(sizeof(CSChange));
   parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
   csChange->guid=d->guid;
-  csChange->alive=ORTE_TRUE;
-  csChange->cdrStream.buffer=NULL;
+  csChange->alive=alive;
+  csChange->cdrCodec.buffer=NULL;
   CSTWriterAddCSChange(d,&d->writerApplicationSelf,csChange);
   if (forWM) {
     csChange=(CSChange*)MALLOC(sizeof(CSChange));
     parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
     csChange->guid=d->guid;
-    csChange->alive=ORTE_TRUE;
-    csChange->cdrStream.buffer=NULL;
+    csChange->alive=alive;
+    csChange->cdrCodec.buffer=NULL;
     CSTWriterAddCSChange(d,&d->writerManagers,csChange);
   }
   if (unlock) {
     pthread_rwlock_unlock(&d->writerApplicationSelf.lock);
-    pthread_rwlock_unlock(&d->writerManagers.lock);
+    if (forWM)
+      pthread_rwlock_unlock(&d->writerManagers.lock);
+  }
+}
+
+/*
+ * getAppO2SRemoteReader - returns pointer to virtual multicat object in case multicast application
+ * @d: pointer to an domain
+ * @objectEntryOID:
+ * @ap: pointer to an application 
+ *
+ */
+ObjectEntryOID *
+getAppO2SRemoteReader(ORTEDomain *d,ObjectEntryOID *objectEntryOID,
+    AppParams *ap) {
+  GUID_RTPS         guid;
+  AppParams        *map;
+  IPAddress         maddr;
+
+  maddr=ap->metatrafficMulticastIPAddressList[0];
+  if (ap->metatrafficMulticastIPAddressCount &&
+      IN_MULTICAST(maddr)) {
+    map=(AppParams*)MALLOC(sizeof(AppParams));
+    guid.hid=maddr;
+    guid.aid=AID_UNKNOWN;
+    guid.oid=OID_APP;
+    objectEntryOID=objectEntryFind(d,&guid);
+    if (!objectEntryOID) {
+      memcpy(map,ap,sizeof(AppParams));
+      objectEntryOID=objectEntryAdd(d,&guid,(void*)map);
+      Domain2PortMulticastMetatraffic(d->domain,
+                                     objectEntryOID->multicastPort);
+      debug(9,2) ("new multicast application 0x%x-0x%x-0x%x temporary created\n",
+                   GUID_PRINTF(guid));
+    }
+  }
+  return objectEntryOID;
+}
+
+/*
+ * getSubsO2SRemoteReader - returns pointer to virtual multicat object in case multicast subscription
+ * @d: pointer to an domain
+ * @objectEntryOID:
+ * @sp: pointer to a subscription
+ *
+ */
+ObjectEntryOID *
+getSubsO2SRemoteReader(ORTEDomain *d,ObjectEntryOID *objectEntryOID,
+    ORTESubsProp *sp) {
+  AppParams        *map;
+  GUID_RTPS         guid;
+
+  if (IN_MULTICAST(sp->multicast)) {
+    map=(AppParams*)MALLOC(sizeof(AppParams));
+    guid.hid=sp->multicast;
+    guid.aid=AID_UNKNOWN;
+    guid.oid=OID_APP;
+    objectEntryOID=objectEntryFind(d,&guid);
+    if (!objectEntryOID) {
+      AppParamsInit(map);
+      map->metatrafficMulticastIPAddressList[0]=sp->multicast;
+      map->metatrafficMulticastIPAddressCount=1;
+      objectEntryOID=objectEntryAdd(d,&guid,(void*)map);
+      Domain2PortMulticastUserdata(d->domain,
+                                  objectEntryOID->multicastPort);
+      debug(9,2) ("new subs. multicast application 0x%x-0x%x-0x%x temporary created\n",
+                   GUID_PRINTF(guid));
+    }
   }
+  return objectEntryOID;
 }