From 10f156c322d94d87375388dec09e49f1cd01a9a7 Mon Sep 17 00:00:00 2001 From: dcq Date: Fri, 26 Mar 2004 15:09:49 +0000 Subject: [PATCH] DCQ : Co-localisation --- idl/GEOM_Shape.idl | 2 ++ src/GEOM/GEOM_Shape_i.cc | 9 +++++++ src/GEOM/GEOM_Shape_i.hh | 2 ++ src/GEOMClient/GEOM_Client.cxx | 48 +++++++++++++++++++++++++--------- src/GEOMClient/GEOM_Client.hxx | 3 +++ 5 files changed, 52 insertions(+), 12 deletions(-) diff --git a/idl/GEOM_Shape.idl b/idl/GEOM_Shape.idl index b9091a0ed..a75c3486c 100644 --- a/idl/GEOM_Shape.idl +++ b/idl/GEOM_Shape.idl @@ -78,6 +78,8 @@ module GEOM // the generator engine GEOM_Gen Engine(); + // Get the TopoDS_Shape, for colocated case only + long getShape(); }; }; #endif diff --git a/src/GEOM/GEOM_Shape_i.cc b/src/GEOM/GEOM_Shape_i.cc index bf7cdf062..60db998b4 100644 --- a/src/GEOM/GEOM_Shape_i.cc +++ b/src/GEOM/GEOM_Shape_i.cc @@ -246,3 +246,12 @@ GEOM::GEOM_Gen_ptr GEOM_Shape_i::Engine() { return _engine; } + +//======================================================================= +//function : getShape +//purpose : return the TopoDS_Shape when client and servant are colocated, be careful +//======================================================================= + +long GEOM_Shape_i::getShape() { + return((long)(&_geom)); +} diff --git a/src/GEOM/GEOM_Shape_i.hh b/src/GEOM/GEOM_Shape_i.hh index a976b31c4..bf114b937 100644 --- a/src/GEOM/GEOM_Shape_i.hh +++ b/src/GEOM/GEOM_Shape_i.hh @@ -112,6 +112,8 @@ public: GEOM::GEOM_Shape::TMPFile* GetShapeStream(); GEOM::GEOM_Gen_ptr Engine(); + + long getShape(); }; #endif diff --git a/src/GEOMClient/GEOM_Client.cxx b/src/GEOMClient/GEOM_Client.cxx index e3fb21cb3..b5ee8f58e 100644 --- a/src/GEOMClient/GEOM_Client.cxx +++ b/src/GEOMClient/GEOM_Client.cxx @@ -47,34 +47,58 @@ using namespace std; #include +#include + +#define HST_CLIENT_LEN 256 + //======================================================================= // function : Load() // purpose : //======================================================================= -static TopoDS_Shape Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Shape_ptr aShape ) +TopoDS_Shape GEOM_Client::Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Shape_ptr aShape ) { - TopoDS_Shape S; - /* get sequence of bytes of resulting brep shape from GEOM server */ - GEOM::GEOM_Shape::TMPFile_var SeqFile = aShape->GetShapeStream(); - int sizebuf = SeqFile->length(); - char* buf; - buf = (char*) &SeqFile[0]; - istrstream streamBrep(buf,sizebuf); - BRep_Builder aBuilder; - BRepTools::Read(S, streamBrep, aBuilder); - return S; + char hst_client[HST_CLIENT_LEN]; + gethostname(hst_client, HST_CLIENT_LEN); + + Engines::Container_var ctn_server = geom->GetContainerRef(); + long pid_server = ctn_server->getPID(); + + if ( (pid_client==pid_server) && (strcmp(hst_client, ctn_server->getHostName())==0) ) { + TopoDS_Shape* S = (TopoDS_Shape*)(aShape->getShape()); + return(*S); + } else { + /* get sequence of bytes of resulting brep shape from GEOM server */ + TopoDS_Shape S; + GEOM::GEOM_Shape::TMPFile_var SeqFile = aShape->GetShapeStream(); + int sizebuf = SeqFile->length(); + char* buf; + buf = (char*) &SeqFile[0]; + istrstream streamBrep(buf,sizebuf); + BRep_Builder aBuilder; + BRepTools::Read(S, streamBrep, aBuilder); + return(S); + }; } //======================================================================= // function : Create() -// purpose : +// purpose : Create in client not in a container //======================================================================= GEOM_Client::GEOM_Client() { + pid_client = (-1); } +//======================================================================= +// function : Create() +// purpose : +//======================================================================= +GEOM_Client::GEOM_Client(Engines::Container_ptr client) +{ + pid_client = client->getPID(); +} //======================================================================= // function : Find() diff --git a/src/GEOMClient/GEOM_Client.hxx b/src/GEOMClient/GEOM_Client.hxx index 09d4351b7..0dbaddd63 100644 --- a/src/GEOMClient/GEOM_Client.hxx +++ b/src/GEOMClient/GEOM_Client.hxx @@ -75,18 +75,21 @@ public: // Methods PUBLIC // Standard_EXPORT GEOM_Client(); + Standard_EXPORT GEOM_Client(Engines::Container_ptr client); Standard_EXPORT Standard_Integer Find( const TCollection_AsciiString& ShapeIOR, TopoDS_Shape& S ) ; Standard_EXPORT void Bind( const TCollection_AsciiString& ShapeIOR, const TopoDS_Shape& S ) ; Standard_EXPORT TopoDS_Shape GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Shape_ptr aShape ); Standard_EXPORT void RemoveShapeFromBuffer( const TCollection_AsciiString& shapeIOR ) ; Standard_EXPORT void ClearClientBuffer() ; Standard_EXPORT unsigned int BufferLength() ; + TopoDS_Shape Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Shape_ptr aShape); private: // Fields PRIVATE // TColStd_SequenceOfAsciiString myIORs ; TopTools_SequenceOfShape myShapes ; + long pid_client; };