X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSupervision%2FPort_Impl.cxx;h=0bb051be3c6b9fe348f836c0a572d536f1df359a;hb=435dc5876950995409f0279cbd4cd94926d1439d;hp=cd6b4dc84a838dfb72f08f4cc37dadeab61f1329;hpb=d2ea75950816c9bb41f70a80a8c4339d3d0ff9a5;p=modules%2Fsuperv.git diff --git a/src/Supervision/Port_Impl.cxx b/src/Supervision/Port_Impl.cxx index cd6b4dc..0bb051b 100644 --- a/src/Supervision/Port_Impl.cxx +++ b/src/Supervision/Port_Impl.cxx @@ -1,18 +1,38 @@ -using namespace std; -//============================================================================= -// File : Port_Impl.cxx -// Created : Nov 2001 -// Author : Jean Rahuel -// Project : SALOME -// $Header: -//============================================================================= +// SUPERV Supervision : contains the implementation of interfaces of SuperVision described in SUPERV.idl +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : Port_Impl.cxx +// Author : Jean Rahuel +// Module : SUPERV +// $Header: +using namespace std; #include #include -#include +//#include #include -#include "utilities.h" +//#include "utilities.h" #include "Graph_Impl.hxx" #include "Port_Impl.hxx" @@ -24,33 +44,26 @@ Port_Impl::Port_Impl( CORBA::ORB_ptr orb , const char *interfaceName , GraphEditor::DataFlow * DataFlowEditor , GraphEditor::InNode * DataFlowNode , -// const char *ParameterName , GraphBase::Port * DataFlowPort , bool InputPort , const CORBA::Any * anAny ) : -// const SUPERV::Value_ptr aValue ) : Value_Impl(orb, poa, contId, instanceName, interfaceName, -// DataFlowEditor , DataFlowNode , ParameterName, aValue->ToAny() , DataFlowEditor , DataFlowNode , DataFlowPort->PortName(), anAny , false ) { -// MESSAGE("Value_Impl::Value_Impl activate object instanceName(" -// << instanceName << ") interfaceName(" << interfaceName << ") --> " -// << hex << (void *) this << dec ) +// MESSAGE("Port_Impl::Port_Impl activate object instanceName(" +// << instanceName << ") interfaceName(" << interfaceName +// << ") IsDataStream " << DataFlowPort->IsDataStream() ) _Orb = CORBA::ORB::_duplicate(orb); _Poa = poa ; _ContId = contId ; - _thisObj = this ; - _id = _poa->activate_object(_thisObj); + if ( !DataFlowPort->IsDataStream() ) { + _thisObj = this ; + _id = _poa->activate_object(_thisObj) ; + } _DataFlowEditor = DataFlowEditor ; _DataFlowNode = DataFlowNode ; -// _DataFlowPort = _DataFlowNode->GetChangeInPort( ParameterName ) ; _DataFlowPort = DataFlowPort ; -// _InputPort = true ; _InputPort = InputPort ; -// if ( _DataFlowPort == NULL ) { -// _DataFlowPort = _DataFlowNode->GetChangeOutPort( ParameterName ) ; -// _InputPort = false ; -// } InPort( _InputPort ) ; } @@ -61,30 +74,29 @@ Port_Impl::Port_Impl( CORBA::ORB_ptr orb , const char *interfaceName , GraphEditor::DataFlow * DataFlowEditor , GraphEditor::InNode * DataFlowNode , -// const char *ParameterName ) : GraphBase::Port * DataFlowPort , bool InputPort ) : Value_Impl(orb, poa, contId, instanceName, interfaceName, DataFlowEditor , DataFlowNode , DataFlowPort->PortName() , false ) { -// DataFlowEditor , DataFlowNode , ParameterName , false ) { -// MESSAGE("Value_Impl::Value_Impl activate object instanceName(" -// << instanceName << ") interfaceName(" << interfaceName << ") --> " -// << hex << (void *) this << dec ) + char * nodename = DataFlowEditor->Graph()->Name() ; + if ( DataFlowNode ) { + nodename = DataFlowNode->Name() ; + } +// MESSAGE("Port_Impl::Port_Impl activate object instanceName(" +// << instanceName << ") interfaceName(" << interfaceName +// << ") " << nodename << "(" << DataFlowPort->PortName() +// << ") IsDataStream " << DataFlowPort->IsDataStream() ) ; _Orb = CORBA::ORB::_duplicate(orb); _Poa = poa ; _ContId = contId ; - _thisObj = this ; - _id = _poa->activate_object(_thisObj); + if ( !DataFlowPort->IsDataStream() ) { + _thisObj = this ; + _id = _poa->activate_object(_thisObj) ; + } _DataFlowEditor = DataFlowEditor ; _DataFlowNode = DataFlowNode ; -// _DataFlowPort = _DataFlowNode->GetChangeInPort( ParameterName ) ; _DataFlowPort = DataFlowPort ; -// _InputPort = true ; _InputPort = InputPort ; -// if ( _DataFlowPort == NULL ) { -// _DataFlowPort = _DataFlowNode->GetChangeOutPort( ParameterName ) ; -// _InputPort = false ; -// } InPort( _InputPort ) ; } @@ -155,6 +167,10 @@ bool Port_Impl::Input( const CORBA::Any * anAny ) { *anAny ) ; } } + if ( !RetVal ) { + MESSAGE( "Port_Impl::Input returns false _InputPort " << _InputPort << " IsEditing " + << _DataFlowEditor->IsEditing() << " Executor " << _DataFlowEditor->Executor() ) ; + } endService( "Port_Impl::Input" ); return RetVal ; } @@ -175,24 +191,123 @@ char * Port_Impl::Type() { SUPERV::CNode_ptr Port_Impl::Node() { bool begin = true ; - SUPERV::CNode_var iobject = SUPERV::CNode::_nil() ; - if ( CORBA::is_nil( _DataFlowNode->ObjRef() ) ) { - if ( begin ) { - beginService( "Port_Impl::Node" ) ; - begin = false ; + SUPERV::CNode_var iobject ; + if ( _DataFlowNode ) { + MESSAGE( "Port_Impl::Node " << _DataFlowNode->Name() ) ; + iobject = SUPERV::CNode::_narrow( _DataFlowNode->ObjRef() ) ; + if ( CORBA::is_nil( iobject ) ) { + if ( begin ) { + beginService( "Port_Impl::Node" ) ; + begin = false ; + } + PortableServer::ObjectId * id ; + CORBA::Object_var obj ; + if ( _DataFlowNode->IsComputingNode() ) { + CNode_Impl * myNode = NULL ; + myNode = new CNode_Impl( _Orb , _Poa , _ContId , + instanceName() , interfaceName() , + _DataFlowEditor , + _DataFlowNode ) ; + id = myNode->getId() ; + obj = _poa->id_to_reference(*id); + iobject = SUPERV::CNode::_narrow( obj ) ; + myNode->SetObjRef( SUPERV::CNode::_duplicate( iobject ) ) ; + } + else if ( _DataFlowNode->IsFactoryNode() ) { + FNode_Impl * myNode = NULL ; + myNode = new FNode_Impl( _Orb , _Poa , _ContId , + instanceName() , interfaceName() , + _DataFlowEditor , + _DataFlowNode ) ; + id = myNode->getId() ; + obj = _poa->id_to_reference(*id); + SUPERV::FNode_var Fiobject = SUPERV::FNode::_narrow( obj ) ; + iobject = SUPERV::CNode::_narrow( Fiobject ) ; + myNode->SetObjRef( SUPERV::FNode::_duplicate( Fiobject ) ) ; + } + else if ( _DataFlowNode->IsInLineNode() ) { + INode_Impl * myNode = NULL ; + myNode = new INode_Impl( _Orb , _Poa , _ContId , + instanceName() , interfaceName() , + _DataFlowEditor , + _DataFlowNode ) ; + id = myNode->getId() ; + obj = _poa->id_to_reference(*id); + SUPERV::INode_var Iiobject = SUPERV::INode::_narrow( obj ) ; + iobject = SUPERV::CNode::_narrow( Iiobject ) ; + myNode->SetObjRef( SUPERV::INode::_duplicate( Iiobject ) ) ; + } + else if ( _DataFlowNode->IsGOTONode() ) { + GNode_Impl * myNode = NULL ; + myNode = new GNode_Impl( _Orb , _Poa , _ContId , + instanceName() , interfaceName() , + _DataFlowEditor , + _DataFlowNode ) ; + id = myNode->getId() ; + obj = _poa->id_to_reference(*id); + SUPERV::GNode_var Giobject = SUPERV::GNode::_narrow( obj ) ; + iobject = SUPERV::CNode::_narrow( Giobject ) ; + myNode->SetObjRef( SUPERV::GNode::_duplicate( Giobject ) ) ; + } + else if ( _DataFlowNode->IsLoopNode() ) { + LNode_Impl * myNode = NULL ; + myNode = new LNode_Impl( _Orb , _Poa , _ContId , + instanceName() , interfaceName() , + _DataFlowEditor , + _DataFlowNode ) ; + id = myNode->getId() ; + obj = _poa->id_to_reference(*id); + SUPERV::LNode_var Liobject = SUPERV::LNode::_narrow( obj ) ; + iobject = SUPERV::CNode::_narrow( Liobject ) ; + myNode->SetObjRef( SUPERV::LNode::_duplicate( Liobject ) ) ; + } + else if ( _DataFlowNode->IsEndLoopNode() ) { + ELNode_Impl * myNode = NULL ; + myNode = new ELNode_Impl( _Orb , _Poa , _ContId , + instanceName() , interfaceName() , + _DataFlowEditor , + _DataFlowNode ) ; + id = myNode->getId() ; + obj = _poa->id_to_reference(*id); + SUPERV::ELNode_var ELiobject = SUPERV::ELNode::_narrow( obj ) ; + iobject = SUPERV::CNode::_narrow( ELiobject ) ; + myNode->SetObjRef( SUPERV::ELNode::_duplicate( ELiobject ) ) ; + } + else if ( _DataFlowNode->IsSwitchNode() ) { + SNode_Impl * myNode = NULL ; + myNode = new SNode_Impl( _Orb , _Poa , _ContId , + instanceName() , interfaceName() , + _DataFlowEditor , + _DataFlowNode ) ; + id = myNode->getId() ; + obj = _poa->id_to_reference(*id); + SUPERV::SNode_var Siobject = SUPERV::SNode::_narrow( obj ) ; + iobject = SUPERV::CNode::_narrow( Siobject ) ; + myNode->SetObjRef( SUPERV::SNode::_duplicate( Siobject ) ) ; + } + else if ( _DataFlowNode->IsEndSwitchNode() ) { + ESNode_Impl * myNode = NULL ; + myNode = new ESNode_Impl( _Orb , _Poa , _ContId , + instanceName() , interfaceName() , + _DataFlowEditor , + _DataFlowNode ) ; + id = myNode->getId() ; + obj = _poa->id_to_reference(*id); + SUPERV::ESNode_var ESiobject = SUPERV::ESNode::_narrow( obj ) ; + iobject = SUPERV::CNode::_narrow( ESiobject ) ; + myNode->SetObjRef( SUPERV::ESNode::_duplicate( ESiobject ) ) ; + } + } + else { +// MESSAGE( "Port_Impl::Node known objref " << iobject->Name() ) ; } - CNode_Impl * myNode = new CNode_Impl( _Orb , _Poa , _ContId , - instanceName() , interfaceName() , - _DataFlowEditor , - _DataFlowNode ) ; - PortableServer::ObjectId * id = myNode->getId() ; - CORBA::Object_var obj = _poa->id_to_reference(*id); - SUPERV::CNode_var iobject ; - iobject = SUPERV::CNode::_narrow(obj) ; - myNode->SetObjRef( SUPERV::CNode::_duplicate( iobject ) ) ; } else { - iobject = _DataFlowNode->ObjRef() ; + MESSAGE( "Port_Impl::GraphNode " << _DataFlowEditor->Graph()->Name() ) ; + iobject = SUPERV::CNode::_narrow( _DataFlowEditor->Graph()->ObjRef() ) ; + if ( CORBA::is_nil( iobject ) ) { + MESSAGE( "Port_Impl::GraphNode NilRef" ) ; + } } if ( !begin ) { endService( "Port_Impl::Node" ) ; @@ -203,8 +318,18 @@ SUPERV::CNode_ptr Port_Impl::Node() { SUPERV::ListOfLinks * Port_Impl::Links() { beginService( "Port_Impl::Links" ) ; SUPERV::ListOfLinks_var RetVal = new SUPERV::ListOfLinks ; - RetVal = _DataFlowEditor->ObjImpl()->Links( _DataFlowNode->ComputingNode() , - _DataFlowPort->PortName() ) ; + RetVal = _DataFlowEditor->Graph()->ObjImpl()->Links( _DataFlowNode->ComputingNode() , + _DataFlowPort->PortName() ) ; + MESSAGE( "Links of Node " << _DataFlowNode->ComputingNode()->Name() + << " and of Port " << _DataFlowPort->PortName() + << " _InputPort " << _InputPort ) ; + int i ; + for ( i = 0 ; i < (int ) RetVal->length() ; i++ ) { + MESSAGE( "Link " << RetVal[i]->OutPort()->Node()->Name() << "(" + << RetVal[i]->OutPort()->Name() << ") --> " + << RetVal[i]->InPort()->Node()->Name() << "(" + << RetVal[i]->InPort()->Name() << ")" ) ; + } endService( "Port_Impl::Links" ) ; return ( RetVal._retn() ) ; } @@ -216,11 +341,10 @@ SUPERV::Link_ptr Port_Impl::Link() { beginService( "Port_Impl::Link" ) ; begin = false ; SUPERV::ListOfLinks_var Links = new SUPERV::ListOfLinks ; - cout << "Port_Impl::Link " << _DataFlowNode->Name() << " " - << _DataFlowPort->PortName() << endl ; - Links = _DataFlowEditor->ObjImpl()->Links( - _DataFlowNode->ComputingNode() , - _DataFlowPort->PortName() ) ; +// cout << "Port_Impl::Link " << _DataFlowNode->Name() << " " +// << _DataFlowPort->PortName() << endl ; + Links = _DataFlowEditor->Graph()->ObjImpl()->Links( _DataFlowNode->ComputingNode() , + _DataFlowPort->PortName() ) ; if ( Links->length() ) { iobject = Links[ 0 ] ; } @@ -241,23 +365,32 @@ SUPERV::Link_ptr Port_Impl::Link() { GraphBase::InPort * anInPort = _DataFlowNode->GetChangeInPort( _DataFlowPort->PortName() ) ; if ( anInPort->GetOutPort() ) { GraphBase::OutPort * anOutPort = anInPort->GetOutPort() ; - if ( CORBA::is_nil( anOutPort->InPortObjRef( anInPort ) ) ) { + if ( _DataFlowNode->IsEndLoopNode() && !strcmp( _DataFlowNode->CoupledNode()->Name() , + anOutPort->NodeName() ) ) { +// MESSAGE( "Link " << anOutPort->NodeName() << "(" +// << anOutPort->PortName() << ") --> " << _DataFlowNode->Name() << "(" +// << anInPort->PortName() << ")" << " ignored" ) ; + } + else if ( CORBA::is_nil( anOutPort->InPortObjRef( anInPort ) ) ) { if ( begin ) { beginService( "Port_Impl::Link" ) ; begin = false ; } + bool Success ; Link_Impl * myLink = new Link_Impl( _Orb , _Poa , _ContId , instanceName() , interfaceName() , _DataFlowEditor , _DataFlowNode , _DataFlowPort->PortName() , - (GraphEditor::InNode * ) _DataFlowEditor->GetChangeGraphNode( FromNodeName )->GetInNode() , + (GraphEditor::InNode * ) _DataFlowEditor->Graph()->GetChangeGraphNode( FromNodeName )->GetInNode() , FromServiceParameterName , - false ) ; - PortableServer::ObjectId * id = myLink->getId() ; - CORBA::Object_var obj = _poa->id_to_reference(*id); - iobject = SUPERV::Link::_narrow(obj) ; - anOutPort->AddInPortObjRef( anInPort , SUPERV::Link::_duplicate( iobject ) ) ; + false , true , Success ) ; + if ( Success ) { + PortableServer::ObjectId * id = myLink->getId() ; + CORBA::Object_var obj = _poa->id_to_reference(*id); + iobject = SUPERV::Link::_narrow(obj) ; + anOutPort->AddInPortObjRef( anInPort , SUPERV::Link::_duplicate( iobject ) ) ; + } } else { iobject = anOutPort->InPortObjRef( anInPort ) ; @@ -266,6 +399,8 @@ SUPERV::Link_ptr Port_Impl::Link() { } } if ( !begin ) { + MESSAGE( "Link " << iobject->OutPort()->Node()->Name() << "( " << iobject->OutPort()->Name() << " ) --> " + << iobject->InPort()->Node()->Name() << "( " << iobject->InPort()->Name() << " ) " ) ; endService( "Port_Impl::Link" ) ; } return SUPERV::Link::_duplicate( iobject ) ; @@ -274,22 +409,30 @@ SUPERV::Link_ptr Port_Impl::Link() { bool Port_Impl::IsInput() { // beginService( "Port_Impl::IsInput" ) ; bool RetVal = _InputPort ; +// MESSAGE( Name() << "IsInput() " << _InputPort ) ; // endService( "Port_Impl::IsInput" ) ; return RetVal ; } bool Port_Impl::IsLinked() { // beginService( "Port_Impl::IsLinked" ) ; - bool RetVal = true ; -#if 0 - if ( _DataFlowNode->IsEndSwitchNode() && _DataFlowPort->IsBus() ) { - } - else { -#endif - RetVal = _DataFlowNode->IsLinked( _DataFlowPort->PortName() ) ; -#if 0 + bool RetVal = false ; + if ( _DataFlowNode ) { + GraphBase::InPort * anInPort = _DataFlowNode->GetChangeInPort( _DataFlowPort->PortName() ) ; + GraphBase::OutPort * anOutPort = NULL ; + if ( anInPort) { + anOutPort = anInPort->GetOutPort() ; + } + if ( _DataFlowNode->IsEndLoopNode() && anOutPort && + !strcmp( _DataFlowNode->CoupledNode()->Name() , anOutPort->NodeName() ) ) { +// MESSAGE( "Link " << anOutPort->NodeName() << "(" +// << anOutPort->PortName() << ") --> " << _DataFlowNode->Name() << "(" +// << anInPort->PortName() << ")" << " ignored" ) ; + } + else { + RetVal = _DataFlowNode->IsLinked( _DataFlowPort->PortName() ) ; + } } -#endif // endService( "Port_Impl::IsLinked" ) ; return RetVal ; } @@ -301,6 +444,12 @@ SUPERV::KindOfPort Port_Impl::Kind() { return RetVal ; } +void Port_Impl::SetKind( SUPERV::KindOfPort aKindOfPort ) { +// beginService( "Port_Impl::SetKind" ) ; + _DataFlowPort->Kind( aKindOfPort ) ; +// endService( "Port_Impl::SetKind" ) ; +} + bool Port_Impl::IsParam() { // beginService( "Port_Impl::IsParam" ) ; bool RetVal = _DataFlowPort->IsParam() ; @@ -344,9 +493,21 @@ bool Port_Impl::IsEndSwitch() { return RetVal ; } +bool Port_Impl::IsDataStream() { +// beginService( "Port_Impl::IsDataStream" ) ; + bool RetVal = _DataFlowPort->IsDataStream() ; +// endService( "Port_Impl::IsDataStream" ) ; + return RetVal ; +} + bool Port_Impl::HasInput() { // beginService( "Port_Impl::" ) ; - bool RetVal = _DataFlowNode->HasInput( _DataFlowPort->PortName() ) ; + bool RetVal = false ; + if ( _DataFlowNode ) { + RetVal = _DataFlowNode->HasInput( _DataFlowPort->PortName() ) ; +// cout << "Port_Impl::HasInput " << RetVal << " NodeName " << _DataFlowPort->NodeName() << " PortName " +// << _DataFlowPort->PortName() << endl ; + } // endService( "Port_Impl::" ) ; return RetVal ; } @@ -378,3 +539,4 @@ bool Port_Impl::IsDone() { // endService( "Port_Impl::IsDone" ); return RetVal ; } +