using namespace CORBA ;
+extern GraphExecutor::FiniteStateMachine * theAutomaton ;
+
//static PyObject * MyPyObjSignal = NULL ;
static PyObject * MyPyObjRef = NULL ;
static PyObject * MyPyObjIor = NULL ;
return Result ;
}
-#define PyDynInvokeTrace 0
+#define PyDynInvokeTrace 1
bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod ,
const char *method ,
- ServicesAnyData * inParams , int nInParams ,
- ServicesAnyData * outParams , int nOutParams ) {
+ ServicesAnyData * InParametersList , int nInParams ,
+ ServicesAnyData * OutParametersList , int nOutParams ) {
int i ;
bool RetVal = true ;
- int n_in = nInParams ;
- int n_out = nOutParams ;
const char * sname;
#if PyDynInvokeTrace
- cdebug_in << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name() << " method " << method
- << " " << n_in << " InArgs " << n_out << " OutArgs MyPyRunMethod " ;
+ cdebug_in << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
+ << " method " << method
+ << " InParametersList " << InParametersList
+ << " OutParametersList " << OutParametersList
+ << " " << nInParams << " InArgs " << nOutParams
+ << " OutArgs MyPyRunMethod " ;
#endif
if ( MyPyRunMethod ) {
#if PyDynInvokeTrace
PyObject * ResultIor = NULL ;
CORBA::Object_ptr ObjRef ;
+
char * IORObjRef ;
if ( !PyCallable_Check( MyPyRunMethod ) ) {
RetVal = false ;
}
else {
- ArgsList = PyTuple_New( n_in ) ;
+ ArgsList = PyTuple_New( nInParams ) ;
- for ( i = 0 ; i < n_in ; i++ ) {
- data = inParams[i].Value ;
- sname = inParams[i].Name.c_str() ;
+ for ( i = 0 ; i < nInParams ; i++ ) {
+ data = InParametersList[i].Value ;
+ sname = InParametersList[i].Name.c_str() ;
switch ( data.type()->kind() ) {
case CORBA::tk_string : {
char * t ;
RetVal = false ;
}
else {
- for ( i = 0 ; i < n_out ; i++ ) {
- data = outParams[i].Value ;
- sname = outParams[i].Name.c_str() ;
+ for ( i = 0 ; i < nOutParams ; i++ ) {
+ data = OutParametersList[i].Value ;
+ sname = OutParametersList[i].Name.c_str() ;
switch ( data.type()->kind() ) {
case CORBA::tk_string : {
char * t = "" ;
}
//JR 04.04.2005 Debug if ( !PyInt_Check( ArgValue ) ) {
//Difficult to understand that behavior ... Python char type is a string of length 1 !
- if ( !PyString_Check( ArgValue ) ) {
+// or type is int ...
+ if ( !PyString_Check( ArgValue ) && !PyInt_Check( ArgValue ) ) {
cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (char)" << endl ;
RetVal = false ;
}
char * IOR = NULL ;
IOR = PyString_AsString( ResultIor ) ;
ObjRef = StringToObject( IOR ) ;
+//JR 05.08.2005 BUG OMNIORB4 ? : that line does run with SALOME_3 (OMNIOrb4) for
+// object references ... (It's Ok with OMNIOrb3)
+// IOR and ObjRef and IORObjRef are Ok
+// BUT data contains a nil reference !!!
+#if !omniORB_4_0_5
data <<= ObjRef ;
+#else
+ SUPERV::SuperG_var mySuperVisionComponent ;
+ mySuperVisionComponent = theAutomaton->SuperVisionComponent() ;
+ if ( CORBA::is_nil( mySuperVisionComponent ) ) {
+ Engines::Container_var myContainer ;
+ Engines::Component_var myObjComponent ;
+ _OutNode->Graph()->StartComponent( ThreadNo() , "SuperVisionContainer" ,
+ "SUPERV" ,
+ myContainer , myObjComponent ) ;
+ mySuperVisionComponent = SUPERV::SuperG::_narrow( myObjComponent ) ;
+ theAutomaton->SuperVisionComponent( mySuperVisionComponent ) ;
+ }
+//JR 24.08.2005 BUG OMNIORB4 ? : That does not run also ==> Comments
+// CORBA::Object_ptr ObjRef1 ;
+// ObjRef1 = mySuperVisionComponent->ToObject( ObjRef ) ;
+// data <<= ObjRef1 ;
+//JR 24.08.2005 BUG OMNIORB4 ? : BUT THAT RUNS WITH THE "IDENTITY METHOD ToObject of SUPERV.idl :
+// Object ToObject( in Object anObject ) ;
+//CODE of that method !!! :
+//CORBA::Object_ptr SuperV_Impl::ToObject( CORBA::Object_ptr anObjectRef ) {
+// beginService( "SuperV_Impl::ToObject" );
+// CORBA::Object_ptr anObject ;
+// anObject = CORBA::Object::_duplicate( anObjectRef ) ;
+// endService( "SuperV_Impl::ToObject" );
+// return anObject ;
+//}
+//BUT THAT RUNS ONLY IF WE USE Dynamic invocation of CORBA (DynInvoke)
+ ServicesAnyData anInParametersList ;
+ anInParametersList.Name = "anObjRef" ;
+ anInParametersList.Value <<= ObjRef ;
+ DynInvoke( mySuperVisionComponent , "ToObject" ,
+ &anInParametersList , 1 , &OutParametersList[i] , 1 ) ;
+ data = OutParametersList[i].Value ;
+#endif
IORObjRef = ObjectToString( ObjRef ) ;
#if PyDynInvokeTrace
- cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << IORObjRef << " (objref) "
- << endl ;
+ cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value IORPy "
+ << IOR << " IORObjRef " << IORObjRef << " (objref) " << endl ;
#endif
if ( CORBA::is_nil( ObjRef ) ) {
+#if PyDynInvokeTrace
+ cdebug << "ObjRef ERROR(nil reference) ResultIor->ob_refcnt "
+ << ResultIor->ob_refcnt-1 << endl ;
+#endif
ResultIor = NULL ;
}
else {
#if PyDynInvokeTrace
- cdebug << "ResultIor->ob_refcnt " << ResultIor->ob_refcnt-1 << endl ;
+ cdebug << "ObjRef NOT(nil reference)ResultIor->ob_refcnt "
+ << ResultIor->ob_refcnt-1 << endl ;
#endif
Py_DECREF( ResultIor ) ;
}
RetVal = false ;
}
}
- outParams[i].Value = data ;
+//JR 05.08.2005 BUG OMNIORB4 ? : that line does run with SALOME_3 (OMNIOrb4) for
+// object references ...
+ OutParametersList[i].Value = data ;
+// if ( data.type()->kind() == CORBA::tk_objref ) {
+// IORObjRef = ObjectToString( ObjRef ) ;
+//#if PyDynInvokeTrace
+// cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
+// << "ArgOut" << i << " : " << sname << " " << method << " ObjRef "
+// << IORObjRef << " (objref) " << endl ;
+// Engines::Component_var theObjComponent ;
+// theObjComponent = Engines::Component::_narrow( ObjRef ) ;
+// DynInvoke( theObjComponent , "ping" , NULL , 0 , NULL , 0 ) ;
+//#endif
+// Engines::Container_var myContainer ;
+// Engines::Component_var myObjComponent ;
+// _OutNode->Graph()->StartComponent( ThreadNo() , "SuperVisionContainer" ,
+// "SUPERV" ,
+// myContainer , myObjComponent ) ;
+// SUPERV::SuperG_var mySuperVisionComponent ;
+// mySuperVisionComponent = SUPERV::SuperG::_narrow( myObjComponent ) ;
+// CORBA::Object_ptr ObjRef1 ;
+// ObjRef1 = mySuperVisionComponent->ToObject( IORObjRef ) ;
+//#if PyDynInvokeTrace
+// IORObjRef = ObjectToString( ObjRef1 ) ;
+// cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
+// << "ArgOut" << i << " : " << sname << " " << method << " ToObject "
+// << IORObjRef << " (objref) " << endl ;
+//#endif
+
+// ServicesAnyData anInParametersList ;
+// anInParametersList.Name = "anIORObjRef" ;
+// anInParametersList.Value <<= IORObjRef ;
+// DynInvoke( mySuperVisionComponent , "ToObject" ,
+// &anInParametersList , 1 , &OutParametersList[i] , 1 ) ;
+//#if PyDynInvokeTrace
+// OutParametersList[i].Value >>= ObjRef1 ;
+// IORObjRef = ObjectToString( ObjRef1 ) ;
+// cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
+// << "ArgOut" << i << " : " << sname << " " << method
+// << " DynInvoke(ToObject) " << IORObjRef << " (objref) " << endl ;
+//#endif
+// }
}
-// int k ;
-// for ( k = 0 ; k < n_out ; k++ ) {
-// cdebug << "Result" << k << "->ob_refcnt " << PyTuple_GetItem( Result , k )->ob_refcnt << endl ;
-// Py_DECREF( PyTuple_GetItem( Result , k ) ) ;
-// }
-
#if PyDynInvokeTrace
cdebug << "InNode::PyDynInvoke Result->ob_refcnt " << Result->ob_refcnt-1 << endl ;
#endif
Py_DECREF( Result ) ;
}
-// int k ;
-// for ( k = 0 ; k < n_in ; k++ ) {
-// cdebug << "ArgsList" << k << "->ob_refcnt " << PyTuple_GetItem( ArgsList , k )->ob_refcnt << endl ;
-// Py_DECREF( PyTuple_GetItem( ArgsList , k ) ) ;
-// }
-
#if PyDynInvokeTrace
cdebug << "InNode::PyDynInvoke ArgsList->ob_refcnt " << ArgsList->ob_refcnt-1 << endl ;
#endif
Py_DECREF( ArgsList ) ;
}
+#if 0
+ {
+ int i ;
+ for ( i = 0 ; i < nInParams ; i++ ) { // Without Gates
+ cdebug << "InParametersList[" << i << "] : "
+ << InParametersList[i].Name << " "
+ << AnyValue( InParametersList[i].Value ) << endl ;
+ }
+ for ( i = 0 ; i < nOutParams ; i++ ) { // Without Gates
+ cdebug << "OutParametersList[" << i << "] : "
+ << OutParametersList[i].Name << " "
+ << AnyValue( OutParametersList[i].Value ) << endl ;
+ }
+ }
+#endif
+
#if PyDynInvokeTrace
cdebug_out << "GraphExecutor::InNode::PyDynInvoke Node " << Name() << " method " << method << " " << RetVal
<< endl ;
const bool ErrorValue = true;
bool aRet;
try {
- MESSAGE( pthread_self() << "Python method beginning : " << thePyString );
#if PyDynInvokeTrace
+ MESSAGE( pthread_self() << "Python method beginning : " << thePyString );
cdebug_in << pthread_self() << "Python method beginning : " << thePyString << endl ;
#endif
aRet = PyRun_SimpleString( thePyString );
// asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
//aRet = _OutNode->SuperVisionContainer()->ActivatePythonExecution( thePyString ) ;
- MESSAGE( pthread_self() << "Python method finished." );
#if PyDynInvokeTrace
+ MESSAGE( pthread_self() << "Python method finished." );
cdebug_out << pthread_self() << "Python method finished." << endl ;
#endif
} catch( ... ) {