Index: trunk/zoo-project/zoo-kernel/service_conf.y
===================================================================
--- trunk/zoo-project/zoo-kernel/service_conf.y	(revision 539)
+++ trunk/zoo-project/zoo-kernel/service_conf.y	(revision 607)
@@ -1,5 +1,3 @@
-%{
-//======================================================
-/**
+/*
  * Thx to Jean-Marie CODOL and Naitan GROLLEMUND
  * copyright 2009 GeoLabs SARL 
@@ -7,5 +5,5 @@
  *
  */
-//======================================================
+%{
 
 #include <string>
@@ -22,5 +20,5 @@
 static bool wait_defaults=false;
 static bool wait_supporteds=false;
-static bool wait_outputs=false;
+static bool wait_outputs=-1;
 static bool wait_data=false;
 static service* my_service=NULL;
@@ -34,17 +32,13 @@
 // namespace
 using namespace std;
-//======================================================
 
 // srerror
 void srerror(const char *s);
-//======================================================
 
 // usage ()
 void usage(void) ;
-//======================================================
 
 // srdebug
 extern int srdebug;
-//======================================================
 
 extern char srtext[];
@@ -52,15 +46,11 @@
 // srlineno
 extern int srlineno;
-//======================================================
 
 // srin
 extern FILE* srin;
-//======================================================
 
 // srlex
 extern int srlex(void);
 extern int srlex_destroy(void);
-
-//vector<char*> lattribute;
 
 %}
@@ -76,11 +66,11 @@
 /* STARTXMLDECL et ENDXMLDECL qui sont <?xml et ?>*/
 %token STARTXMLDECL ENDXMLDECL
-//======================================================
+
 /* version="xxx" et encoding="xxx" */
 %token VERSIONDECL ENCODINGDECL SDDECL
-//======================================================
+
 /* < et > */
 %token INFCAR SUPCAR 
-//======================================================
+
 /* / = a1  texte "texte" */
 %token SLASH Eq CHARDATA ATTVALUE PAIR SPAIR EPAIR ANID
@@ -88,8 +78,8 @@
 %type <chaine> EPAIR
 %type <chaine> SPAIR
-//======================================================
+
 /* <!-- xxx -> <? xxx yyy ?> */
 %token PI PIERROR /** COMMENT **/
-//======================================================
+
 /* <!-- xxx -> <? xxx yyy ?> */
 %token ERREURGENERALE CDATA WHITESPACE NEWLINE
@@ -97,14 +87,11 @@
 %type <s> ETag
 %type <s> ANID
-//======================================================
-// %start
-//======================================================
+
+// % start
 
 %%
-// document <//===
-//======================================================
+// document 
 // regle 1
 // on est a la racine du fichier xml
-//======================================================
 document
  : miscetoile element miscetoile {}
@@ -118,5 +105,4 @@
  ;
 // element
-//======================================================
 // regle 39
 // OUVRANTE CONTENU FERMANTE obligatoirement
@@ -124,5 +110,4 @@
 // on ne peut pas avoir Epsilon
 // un fichier xml ne peut pas etre vide ou seulement avec un prolog
-//======================================================
 element
  : STag contentetoile ETag	
@@ -136,12 +121,9 @@
  ;
 
-//======================================================
 // STag
-//======================================================
 // regle 40
 // BALISE OUVRANTE
 // on est obligé de faire appel a infcar et supcar
 // pour acceder aux start conditions DANSBALISE et INITIAL
-//======================================================
 STag
 : INFCAR ID Attributeetoile SUPCAR
@@ -150,4 +132,5 @@
   fprintf(stderr,"(%s %d) %s\n",__FILE__,__LINE__,$2);
   fflush(stderr);
+  dumpMap(current_content);
 #endif
   if(my_service->content==NULL){
@@ -163,5 +146,5 @@
   }
   if(strncasecmp($2,"DataInputs",10)==0){
-    if(wait_mainmetadata==true){
+    if(wait_mainmetadata==true && current_content!=NULL){
       addMapToMap(&my_service->metadata,current_content);
       freeMap(&current_content);
@@ -238,5 +221,5 @@
 	current_element->next=NULL;
       }
-      wait_outputs=true;
+      wait_outputs=1;
       current_data=2;
       previous_data=2;
@@ -323,11 +306,8 @@
  ;
 
-//======================================================
 // Attributeetoile
-//======================================================
 // regle 41
 // une liste qui peut etre vide d'attributs
 // utiliser la récursivité a gauche
-//======================================================
 Attributeetoile
  : Attributeetoile attribute  {}
@@ -335,7 +315,5 @@
  ;
 
-//======================================================
 // attribute
-//======================================================
 // regle 41
 // un attribut est compose d'un identifiant
@@ -343,5 +321,4 @@
 // et d'une définition de chaine de caractere
 // ( "xxx" ou 'xxx' )
-//======================================================
 attribute
  : ID Eq ATTVALUE		
@@ -353,7 +330,5 @@
  ;
 
-//======================================================
 // EmptyElemTag
-//======================================================
 // regle 44
 // ICI ON DEFINIT NEUTRE
@@ -361,5 +336,4 @@
 // parce qu'il n'y a pas de comparaisons a faire
 // avec un identifiant d'une balise jumelle
-//======================================================
 EmptyElemTag
  : INFCAR ID Attributeetoile SLASH SUPCAR	{
@@ -386,11 +360,7 @@
  ;
 
-//======================================================
 // ETag
-//======================================================
-// regle 42
 // BALISE FERMANTE
 // les separateurs après ID sont filtrés
-//======================================================
 ETag
  : INFCAR SLASH ID SUPCAR
@@ -401,4 +371,27 @@
   if(strcmp($3,"DataInputs")==0){
     current_data=1;
+    if(current_content!=NULL){
+      if(current_element->content==NULL){
+	addMapToMap(&current_element->content,current_content);
+      }
+      freeMap(&current_content);
+      free(current_content);
+      current_content=NULL;
+    }
+    if(current_element!=NULL){
+      if(my_service->content!=NULL && current_element->name!=NULL){
+	if(my_service->inputs==NULL){
+	  my_service->inputs=dupElements(current_element);
+	  my_service->inputs->next=NULL;
+	  tmp_count++;
+	}
+	else{
+	  addToElements(&my_service->inputs,current_element);
+	}
+	freeElements(&current_element);
+	free(current_element);
+	current_element=NULL;
+      }
+    }
   }
   if(strcmp($3,"DataOutputs")==0){
@@ -489,7 +482,5 @@
  ;
 
-//======================================================
 // texteinterbalise
-//======================================================
 // regle 14
 // DU TEXTE quelconque
@@ -499,9 +490,7 @@
 // maintenant on croise les ID dans les dbalises
 // et des CHARDATA hors des balises
-//======================================================
 texteinterbalise
  : CHARDATA		{}
  ;
-//======================================================
 
 pair: PAIR { if(debug) fprintf(stderr,"PAIR FOUND !!\n");if(curr_key!=NULL){free(curr_key);curr_key=NULL;} }
@@ -637,5 +626,5 @@
     else
       if(current_data==2){ 
-	wait_outputs=true;
+	wait_outputs=1;
 	if(wait_inputs){
 	  if(current_element!=NULL && current_element->name!=NULL){
@@ -746,5 +735,5 @@
 	  }
 	wait_inputs=false;
-	wait_outputs=true;
+	wait_outputs=1;
 	//wait_outputs=true;
       }
@@ -755,8 +744,9 @@
 %%
 
-// srerror
-//======================================================
-/* fonction qui affiche l erreur si il y en a une */
-//======================================================
+/**
+ * Print on stderr the message and the line number of the error which occured.
+ * 
+ * @param s the error message
+ */
 void srerror(const char *s)
 {
@@ -766,7 +756,10 @@
 
 /**
- * getServiceFromFile :
- * set service given as second parameter with informations extracted from the
- * definition file.
+ * Parse a ZCFG file and fill the service structure.
+ *
+ * @param conf the conf maps containing the main.cfg settings
+ * @param file the fullpath to the ZCFG file
+ * @param service the service structure to fill
+ * @return 0 on success, -1 on failure
  */
 int getServiceFromFile(maps* conf,const char* file,service** service){
@@ -792,5 +785,5 @@
   wait_defaults=false;
   wait_supporteds=false;
-  wait_outputs=false;
+  wait_outputs=-1;
   wait_data=false;
   data=-1;
@@ -810,7 +803,8 @@
 #ifdef DEBUG_SERVICE_CONF
   fprintf(stderr,"RESULT: %d %d\n",resultatYYParse,wait_outputs);
-#endif
-  if(wait_outputs && current_element!=NULL && current_element->name!=NULL){
-    if(my_service->outputs==NULL){      
+  dumpElements(current_element);
+#endif
+  if(wait_outputs>0 && current_element!=NULL && current_element->name!=NULL){
+    if(my_service->outputs==NULL){  
 #ifdef DEBUG_SERVICE_CONF
       fprintf(stderr,"(DATAOUTPUTS - %d) DUP current_element\n",__LINE__);
@@ -840,5 +834,10 @@
     current_element=NULL;
   }
+  int contentOnly=-1;
   if(current_content!=NULL){
+    if(my_service->content==NULL){
+      addMapToMap(&my_service->content,current_content);
+      contentOnly=1;
+    }
     freeMap(&current_content);
     free(current_content);
@@ -849,6 +848,5 @@
   dumpService(my_service);
 #endif
-  if(wait_outputs<0 || my_service==NULL || my_service->name==NULL || my_service->content==NULL || my_service->outputs==NULL){
-    fprintf(stderr,"%s %d\n",__FILE__,__LINE__);
+  if(contentOnly<0 && ((wait_outputs<0 && current_data==2 && my_service->outputs==NULL) || my_service==NULL || my_service->name==NULL || my_service->content==NULL)){
     setMapInMaps(conf,"lenv","message",srlval.chaine);
 #ifndef WIN32
