Salome HOME
Fix for bug PAL12235 : Init values on input port not retrievable after write/read...
[modules/superv.git] / src / GraphBase / DataFlowBase_XmlHandler.cxx
index 01a298c07dad0bf5185dd450277fb5fd9f0eb6c2..01fe6d9d7eac643480b10143b65fee52738fa07b 100644 (file)
@@ -47,22 +47,29 @@ GraphBase::XmlHandler::XmlHandler( CORBA::ORB_ptr Orb ,
     step[i] = 0 ;
   }
   VXSize = 0 ;
+  GraphsNumber = 0 ;
+
+  aLinkValue = CORBA::Any();
 }
 
 GraphBase::XmlHandler::XmlHandler() {}
 
 GraphBase::XmlHandler::~XmlHandler() {}
 
-QString GraphBase::XmlHandler::errorProtocol()
-{
-    return errorProt;
+QString GraphBase::XmlHandler::errorProtocol() {
+  return errorProt;
 }
 
-bool GraphBase::XmlHandler::startDocument()
-{
-    // at the beginning of parsing: do some initialization
-    errorProt = "";
-    return TRUE;
+bool GraphBase::XmlHandler::startDocument() {
+  MESSAGE( "====================startDocument " ) ;
+// at the beginning of parsing: do some initialization
+  errorProt = "";
+  return TRUE;
+}
+
+bool GraphBase::XmlHandler::endDocument() {
+  MESSAGE( "====================endDocument " ) ;
+  return TRUE;
 }
 
 bool GraphBase::XmlHandler::startElement( const QString&, const QString&, 
@@ -75,13 +82,26 @@ bool GraphBase::XmlHandler::startElement( const QString&, const QString&,
   MESSAGE( "====================startElement " << depth << " " << qName)
    
 #endif
-  if ( qName == "dataflow" && depth == 0 ) {
+
+  if ( ( qName == "dataflow" || qName == "supergraph" ) && depth == 0 ) {
     // Dataflow detected
+    aListOfDataFlows.resize( GraphsNumber + 1 ) ;
+    int i ;
+    for ( i = 0 ; i < maxlevel ; i++ ) {
+      fieldname[i] = NULLSTRING ;
+      fieldvalue[i] = NULLSTRING ;
+      step[i] = 0 ;
+    }
+    VXSize = 0 ;
     dataflowxml = TRUE;
   }
   if ( dataflowxml ) {
-//    fieldname[depth++] = (const char * ) qName ;
-    fieldname[depth++] = qName.latin1() ;
+    if ( qName == "supergraph" ) {
+      fieldname[depth] = qName.latin1() ;
+    }
+    else {
+      fieldname[depth++] = qName.latin1() ;
+    }
   }
   if ( depth == maxlevel+1 )
     return false ;
@@ -103,16 +123,27 @@ bool GraphBase::XmlHandler::endElement( const QString&,
                                         const QString&,
                                         const QString& qName) {
 
+  if ( qName == "supergraph" ) {
+#if TRACE
+    MESSAGE( " ====================endElement supergraph" ) ;
+#endif
+    return TRUE ;
+  }
+
+// ERRORs :
+// * On a eu endElement(dataflow)
+// * Ou bien on a eu uniquement startElement(dataflow) et qName != fieldname et fieldvalue != NULLSTRING
   if ( !dataflowxml ||
        ( qName != QString( fieldname[depth].c_str() ) &&
          fieldvalue[depth] != NULLSTRING ) ) {
-    MESSAGE( "endElement ERROR " << dataflowxml << " qName " << qName
-             << " fieldname<< fieldname[depth] << " fieldvalue "
+    MESSAGE( "endElement ERROR dataflowxml " << dataflowxml << " qName " << qName
+             << " fieldname[" << depth << "] "<< fieldname[depth] << " fieldvalue "
              << fieldvalue[depth] )
     return returnfalse( this , "top" , qName ) ;
   }
-  if ( fieldvalue[depth] == NULLSTRING )
+  if ( fieldvalue[depth] == NULLSTRING ) {
     depth -= 1 ;
+  }
 
 #if TRACE
   MESSAGE( " ====================endElement step[" << depth << "]="
@@ -122,6 +153,7 @@ bool GraphBase::XmlHandler::endElement( const QString&,
   switch ( depth ) {
     case 0 : {
       if ( step[depth] == 0 && qName == "dataflow" ) {
+        GraphsNumber += 1 ;
         dataflowxml = false ;
       }
       else
@@ -133,7 +165,7 @@ bool GraphBase::XmlHandler::endElement( const QString&,
       switch ( step[depth] ) {
         case 0 :
           if ( qName == "info-list" ) {
-//            aDataFlow.Info = aNode ;
+//            aListOfDataFlows[ GraphsNumber ].Info = aNode ;
             step[depth]++ ;
           }
           else
@@ -176,12 +208,12 @@ bool GraphBase::XmlHandler::endElement( const QString&,
           if ( qName == "node" ) {
 // Node ok
             if ( step[1] == 0 ) {
-              aDataFlow.Info = aNode ;
+              aListOfDataFlows[ GraphsNumber ].Info = aNode ;
            }
             else if ( step[1] == 1 ) {
-              int sizenode = aDataFlow.Nodes.size() ;
-              aDataFlow.Nodes.resize( sizenode+1 ) ;                
-              aDataFlow.Nodes[ sizenode ] = aNode ;               
+              int sizenode = aListOfDataFlows[ GraphsNumber ].Nodes.size() ;
+              aListOfDataFlows[ GraphsNumber ].Nodes.resize( sizenode+1 ) ;                
+              aListOfDataFlows[ GraphsNumber ].Nodes[ sizenode ] = aNode ;               
            }
             step[3] = 0 ;
             aNode.theService.ServiceinParameter.length( 0 ) ;
@@ -201,15 +233,15 @@ bool GraphBase::XmlHandler::endElement( const QString&,
          }
         case 1 :
           if ( qName == "link" ) {
-            int sizelink = aDataFlow.Links.size() ;
-            aDataFlow.Links.resize( sizelink+1 ) ;                
-            aDataFlow.Links[ sizelink ] = aLink ;               
+            int sizelink = aListOfDataFlows[ GraphsNumber ].Links.size() ;
+            aListOfDataFlows[ GraphsNumber ].Links.resize( sizelink+1 ) ;                
+            aListOfDataFlows[ GraphsNumber ].Links[ sizelink ] = aLink ;               
             if ( VXSize ) {
-              aDataFlow.Links[ sizelink ].aListOfCoords.resize( VXSize ) ;
+              aListOfDataFlows[ GraphsNumber ].Links[ sizelink ].aListOfCoords.resize( VXSize ) ;
               int ic ;
               for ( ic = 0 ; ic < VXSize ; ic++ ) {
-                aDataFlow.Links[ sizelink ].aListOfCoords[ ic ].theX = VX[ic] ;
-                aDataFlow.Links[ sizelink ].aListOfCoords[ ic ].theY = VY[ic] ;
+                aListOfDataFlows[ GraphsNumber ].Links[ sizelink ].aListOfCoords[ ic ].theX = VX[ic] ;
+                aListOfDataFlows[ GraphsNumber ].Links[ sizelink ].aListOfCoords[ ic ].theY = VY[ic] ;
              }
            }
             VXSize = 0 ;
@@ -227,15 +259,20 @@ bool GraphBase::XmlHandler::endElement( const QString&,
           if ( qName == "data" ) {
 // Data ok
             if ( constructor ) {
-              int sizedata = aDataFlow.Datas.size() ;
-              aDataFlow.Datas.resize( sizedata+1 ) ;                
-              aDataFlow.Datas[ sizedata ] = aLink ;               
+              int sizedata = aListOfDataFlows[ GraphsNumber ].Datas.size() ;
+              aListOfDataFlows[ GraphsNumber ].Datas.resize( sizedata+1 ) ;                
+
+             if ( aLink.aLinkValue.type()->kind() == CORBA::tk_double ) // mkr : PAL12235
+               aLink.aLinkValue = *aLinkDoubleValue ;
+
+             aListOfDataFlows[ GraphsNumber ].Datas[ sizedata ] = aLink ;               
+
               if ( VXSize ) {
-                aDataFlow.Datas[ sizedata ].aListOfCoords.resize( VXSize ) ;
+                aListOfDataFlows[ GraphsNumber ].Datas[ sizedata ].aListOfCoords.resize( VXSize ) ;
                 int ic ;
                 for ( ic = 0 ; ic < VXSize ; ic++ ) {
-                  aDataFlow.Datas[ sizedata ].aListOfCoords[ ic ].theX = VX[ic] ;
-                  aDataFlow.Datas[ sizedata ].aListOfCoords[ ic ].theY = VY[ic] ;
+                  aListOfDataFlows[ GraphsNumber ].Datas[ sizedata ].aListOfCoords[ ic ].theX = VX[ic] ;
+                  aListOfDataFlows[ GraphsNumber ].Datas[ sizedata ].aListOfCoords[ ic ].theY = VY[ic] ;
                }
              }
            }
@@ -327,7 +364,7 @@ bool GraphBase::XmlHandler::endElement( const QString&,
           else if ( qName == "streamgraph-deltatime" ) {
             if ( fieldvalue[depth] == NULLSTRING )
               return returnfalse( this , "depth3-3" , qName ) ;
-            sscanf( fieldvalue[depth].c_str() ,"%lf" , (int * ) &aNode.theDeltaTime ) ;
+            sscanf( fieldvalue[depth].c_str() ,"%lf" , (double * ) &aNode.theDeltaTime ) ;
             fieldvalue[depth] = NULLSTRING ;
             step[depth]++ ;
             step[4] = 0 ;
@@ -679,7 +716,8 @@ bool GraphBase::XmlHandler::endElement( const QString&,
             aLink.aLinkValue = CORBA::Any() ;
             switch ( Kind ) {
             case CORBA::tk_string: {
-              aLink.aLinkValue <<= (char *) NULL ;
+//Mandrake 10.1/Salome 3              aLink.aLinkValue <<= (char *) NULL ;
+              aLink.aLinkValue <<= (char *) "" ;
               char * t;
               aLink.aLinkValue >>= t;
 #if TRACE
@@ -688,8 +726,9 @@ bool GraphBase::XmlHandler::endElement( const QString&,
               break;
            }
             case CORBA::tk_double: {
-              aLink.aLinkValue <<= (double ) 0. ;
-              double d;
+              //aLink.aLinkValue <<= (double ) 0. ;
+             double d = 0.;
+             aLink.aLinkValue.replace(CORBA::TypeCode::PR_double_tc(), (void*)(&d));
               aLink.aLinkValue >>= d;
 #if TRACE
               MESSAGE( d << " (double)" );
@@ -729,8 +768,7 @@ bool GraphBase::XmlHandler::endElement( const QString&,
             if ( fieldvalue[depth] == NULLSTRING )
               return returnfalse( this , "depth4-4" , qName ) ;
             if ( !strcmp( fieldvalue[depth].c_str() , "?" ) ) {
-//              aLink.aLinkValue.Value = fieldvalue[depth].c_str() ;
-              aLink.aLinkValue = CORBA::Any() ; // ???
+              aLink.aLinkValue <<= "" ;
            }
             else {
               switch ( aLink.aLinkValue.type()->kind() ) {
@@ -746,9 +784,12 @@ bool GraphBase::XmlHandler::endElement( const QString&,
               case CORBA::tk_double: {
                 double d;
                 sscanf( fieldvalue[depth].c_str() , "%lf" , &d ) ;
-                aLink.aLinkValue <<= d;
+                //aLink.aLinkValue <<= d;
+               aLink.aLinkValue.replace(CORBA::TypeCode::PR_double_tc(), (void*)(&d));
+               aLinkValue.replace(CORBA::TypeCode::PR_double_tc(), (void*)(&d));
+               aLinkDoubleValue = new CORBA::Any( aLinkValue );
 #if TRACE
-                MESSAGE( d << " (double)" );
+               MESSAGE( d << " (double)" );
 #endif
                 break;
              }
@@ -908,7 +949,7 @@ bool GraphBase::XmlHandler::endElement( const QString&,
             fieldvalue[depth] = NULLSTRING ;
             step[depth]++ ;
 #if TRACE
-            cout << "InDataStreamParameter.inParameter-type " << anInDataStreamParameter.theDataStreamParameter.Parametertype << " step[" << depth << "]" << step[depth] << endl ;
+  //cout << "InDataStreamParameter.inParameter-type " << anInDataStreamParameter.theDataStreamParameter.Parametertype << " step[" << depth << "]" << step[depth] << endl ;
 #endif
             break ;
           }
@@ -928,7 +969,7 @@ bool GraphBase::XmlHandler::endElement( const QString&,
            }
             fieldvalue[depth] = NULLSTRING ;
 #if TRACE
-            cout << "InDataStreamParameter.inParameter-name " << anInDataStreamParameter.theDataStreamParameter.Parametername << " step[" << depth << "]" << step[depth] << endl ;
+  //cout << "InDataStreamParameter.inParameter-name " << anInDataStreamParameter.theDataStreamParameter.Parametername << " step[" << depth << "]" << step[depth] << endl ;
 #endif
 //            step[depth]++ ;
 //            step[depth] = 4 ;
@@ -940,8 +981,8 @@ bool GraphBase::XmlHandler::endElement( const QString&,
             sscanf( fieldvalue[depth].c_str() , "%d" , (int * ) &anInDataStreamParameter.theDataStreamParameter.Parameterdependency ) ;
             fieldvalue[depth] = NULLSTRING ;
 #if TRACE
-            cout << "InDataStreamParameter.inParameter-dependency " << anInDataStreamParameter.theDataStreamParameter.Parameterdependency << " step[" << depth << "]"
-                 << step[depth] << endl ;
+  //cout << "InDataStreamParameter.inParameter-dependency " << anInDataStreamParameter.theDataStreamParameter.Parameterdependency << " step[" << depth << "]"
+  //               << step[depth] << endl ;
 #endif
 //            step[depth]++ ;
 //            step[depth] = 4 ;
@@ -953,8 +994,8 @@ bool GraphBase::XmlHandler::endElement( const QString&,
             sscanf( fieldvalue[depth].c_str() , "%d" , (int * ) &anInDataStreamParameter.theKindOfSchema ) ;
             fieldvalue[depth] = NULLSTRING ;
 #if TRACE
-            cout << "InDataStreamParameter.inParameter-schema " << anInDataStreamParameter.theKindOfSchema << " step[" << depth << "]"
-                 << step[depth] << endl ;
+  //cout << "InDataStreamParameter.inParameter-schema " << anInDataStreamParameter.theKindOfSchema << " step[" << depth << "]"
+  //               << step[depth] << endl ;
 #endif
 //            step[depth]++ ;
 //            step[depth] = 4 ;
@@ -966,8 +1007,8 @@ bool GraphBase::XmlHandler::endElement( const QString&,
             sscanf( fieldvalue[depth].c_str() , "%d" , (int * ) &anInDataStreamParameter.theKindOfInterpolation ) ;
             fieldvalue[depth] = NULLSTRING ;
 #if TRACE
-            cout << "InDataStreamParameter.inParameter-interpolation " << anInDataStreamParameter.theKindOfInterpolation << " step[" << depth << "]"
-                 << step[depth] << endl ;
+  //cout << "InDataStreamParameter.inParameter-interpolation " << anInDataStreamParameter.theKindOfInterpolation << " step[" << depth << "]"
+  //               << step[depth] << endl ;
 #endif
 //            step[depth]++ ;
 //            step[depth] = 4 ;
@@ -981,8 +1022,8 @@ bool GraphBase::XmlHandler::endElement( const QString&,
 //            step[depth]++ ;
             step[depth] = 4 ;
 #if TRACE
-            cout << "InDataStreamParameter.inParameter-extrapolation " << anInDataStreamParameter.theKindOfExtrapolation << " step[" << depth << "]"
-                 << step[depth] << endl ;
+  //cout << "InDataStreamParameter.inParameter-extrapolation " << anInDataStreamParameter.theKindOfExtrapolation << " step[" << depth << "]"
+  //               << step[depth] << endl ;
 #endif
             break ;
           }
@@ -998,8 +1039,8 @@ bool GraphBase::XmlHandler::endElement( const QString&,
 //            step[depth]++ ;
             step[depth] = 7 ;
 #if TRACE
-            cout << "OutDataStreamParameter.outParameter-type " << anOutDataStreamParameter.theDataStreamParameter.Parametertype << " step[" << depth << "]"
-                 << step[depth] << endl ;
+  //cout << "OutDataStreamParameter.outParameter-type " << anOutDataStreamParameter.theDataStreamParameter.Parametertype << " step[" << depth << "]"
+  //               << step[depth] << endl ;
 #endif
           }
           else
@@ -1017,8 +1058,8 @@ bool GraphBase::XmlHandler::endElement( const QString&,
            }
             fieldvalue[depth] = NULLSTRING ;
 #if TRACE
-            cout << "OutDataStreamParameter.outParameter-name " << anOutDataStreamParameter.theDataStreamParameter.Parametername << " step[" << depth << "]"
-                 << step[depth] << endl ;
+  //cout << "OutDataStreamParameter.outParameter-name " << anOutDataStreamParameter.theDataStreamParameter.Parametername << " step[" << depth << "]"
+  //               << step[depth] << endl ;
 #endif
 //            step[depth]++ ;
 //            step[depth] = 6 ;
@@ -1029,8 +1070,8 @@ bool GraphBase::XmlHandler::endElement( const QString&,
             sscanf( fieldvalue[depth].c_str() , "%d" , (int * ) &anOutDataStreamParameter.theDataStreamParameter.Parameterdependency ) ;
             fieldvalue[depth] = NULLSTRING ;
 #if TRACE
-            cout << "OutDataStreamParameter.outParameter-dependency " << anOutDataStreamParameter.theDataStreamParameter.Parameterdependency << " step[" << depth << "]"
-                 << step[depth] << endl ;
+  //cout << "OutDataStreamParameter.outParameter-dependency " << anOutDataStreamParameter.theDataStreamParameter.Parameterdependency << " step[" << depth << "]"
+  //               << step[depth] << endl ;
 #endif
 //            step[depth]++ ;
 //            step[depth] = 6 ;
@@ -1043,8 +1084,8 @@ bool GraphBase::XmlHandler::endElement( const QString&,
 //            step[depth]++ ;
             step[depth] = 6 ;
 #if TRACE
-            cout << "OutDataStreamParameter.outParameter-values " << anOutDataStreamParameter.theNumberOfValues << " step[" << depth << "]"
-                 << step[depth] << endl ;
+  //cout << "OutDataStreamParameter.outParameter-values " << anOutDataStreamParameter.theNumberOfValues << " step[" << depth << "]"
+  //               << step[depth] << endl ;
 #endif
           }
           else
@@ -1165,7 +1206,7 @@ bool GraphBase::XmlHandler::endElement( const QString&,
   }
 
 #if TRACE
-  cout << "return from endElement " << qName << " step[" << depth << "]" << step[depth] << endl ;
+  //cout << "return from endElement " << qName << " step[" << depth << "]" << step[depth] << endl ;
 #endif
   return TRUE;
 }
@@ -1180,7 +1221,7 @@ bool GraphBase::XmlHandler::characters( const QString& ch ) {
   depth -= 1 ;
 #if TRACE
   MESSAGE( "characters step[" << depth << "]=" << step[depth]
-       << " ch " << ch << " fieldvalue_must_be_NULL " << fieldvalue[depth] )
+       << " ch " << ch << " fieldvalue_must_be_NULL : '" << fieldvalue[depth] << "'" ) ;
 #endif
   if ( depth < 0 || fieldvalue[depth] != NULLSTRING )
     return returnfalse( this , "characters " , ch ) ;
@@ -1192,7 +1233,7 @@ bool GraphBase::XmlHandler::characters( const QString& ch ) {
 
 
 QString GraphBase::XmlHandler::errorString() {
-  cout << "the document is not in the quote file format" << endl ;
+  //cout << "the document is not in the quote file format" << endl ;
   return "the document is not in the quote file format";
 }
 
@@ -1202,7 +1243,7 @@ bool GraphBase::XmlHandler::fatalError( const QXmlParseException& exception ) {
     .arg( exception.message() )
     .arg( exception.lineNumber() )
     .arg( exception.columnNumber() );
-  cout << "GraphBase::XmlHandler::fatalError " << errorProt.latin1() << endl ;
+  //cout << "GraphBase::XmlHandler::fatalError " << errorProt.latin1() << endl ;
   return QXmlDefaultHandler::fatalError( exception );
 }