-// GEOM GEOMClient : tool to transfer BREP files from GEOM server to GEOM client
+// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
-// 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
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+// GEOM GEOMClient : tool to transfer BREP files from GEOM server to GEOM client
// File : GEOM_Client.cxx
// Author : Yves FRICAUD/Lucien PIGNOLONI
// Module : GEOM
// $Header$
+//
+#include <Standard_Stream.hxx>
-#include <strstream>
+#include <Standard_Stream.hxx>
-using namespace std;
+#include <sstream>
#include "GEOM_Client.hxx"
#include <SALOMEconfig.h>
-#include "OpUtil.hxx"
+#include "Basics_Utils.hxx"
#include "utilities.h"
-#include CORBA_SERVER_HEADER(SALOMEDS)
-#include CORBA_SERVER_HEADER(GEOM_Gen)
-
#include <BRep_Builder.hxx>
#include <BRepTools.hxx>
#include <TopoDS_Shape.hxx>
#include <TopAbs.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
+#ifdef WNT
+#include <process.h>
+#else
#include <unistd.h>
+#endif
-#define HST_CLIENT_LEN 256
+#include CORBA_SERVER_HEADER(SALOMEDS)
+#include CORBA_SERVER_HEADER(GEOM_Gen)
+#define HST_CLIENT_LEN 256
//=======================================================================
// function : Load()
-// purpose :
+// purpose :
//=======================================================================
TopoDS_Shape GEOM_Client::Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape )
{
- string hst_client = GetHostname();
-
- Engines::Container_var ctn_server = geom->GetContainerRef();
- long pid_server = ctn_server->getPID();
-
- if ( (pid_client==pid_server) && (strcmp(hst_client.c_str(), 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;
- SALOMEDS::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);
- };
+ std::string hst_client = Kernel_Utils::GetHostname();
+
+ Engines::Container_var ctn_server = geom->GetContainerRef();
+ long pid_server = ctn_server->getPID();
+
+ CORBA::String_var hostname = ctn_server->getHostName();
+ if ( pid_client == pid_server && !strcmp(hst_client.c_str(), hostname.in()) ) {
+ TopoDS_Shape* S = (TopoDS_Shape*)(aShape->getShape());
+ return(*S);
+ } else {
+ /* get sequence of bytes of resulting brep shape from GEOM server */
+ TopoDS_Shape S;
+ SALOMEDS::TMPFile_var SeqFile = aShape->GetShapeStream();
+ int sizebuf = SeqFile->length();
+ char* buf;
+ buf = (char*) &SeqFile[0];
+ std::istringstream streamBrep(buf);
+ BRep_Builder aBuilder;
+ BRepTools::Read(S, streamBrep, aBuilder);
+ return(S);
+ }
}
-
//=======================================================================
// function : Create()
// purpose : Create in client not in a container
//=======================================================================
GEOM_Client::GEOM_Client()
{
- pid_client = (long)getpid();
+ pid_client =
+#ifdef WNT
+ (long)_getpid();
+#else
+ (long)getpid();
+#endif
}
//=======================================================================
// function : Create()
-// purpose :
+// purpose :
//=======================================================================
GEOM_Client::GEOM_Client(Engines::Container_ptr client)
{
//=======================================================================
// function : Find()
-// purpose :
+// purpose :
//=======================================================================
Standard_Integer GEOM_Client::Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S )
{
//=======================================================================
// function : Find()
-// purpose :
+// purpose :
//=======================================================================
Standard_Integer GEOM_Client::Find( const TopoDS_Shape& S, TCollection_AsciiString& IOR )
{
void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR)
{
if( myIORs.IsEmpty() )
- return ;
-
- TopoDS_Shape S ;
- Standard_Integer anIndex = Find( IOR, S ) ;
+ return;
+
+ TopoDS_Shape S;
+ Standard_Integer anIndex = Find( IOR, S );
if( anIndex != 0 ) {
- myIORs.Remove(anIndex) ;
- myShapes.Remove(anIndex) ;
+ myIORs.Remove(anIndex);
+ myShapes.Remove(anIndex);
}
- return ;
+ return;
}
-
//=======================================================================
// function : ClearClientBuffer()
// purpose : purge buffer
void GEOM_Client::ClearClientBuffer()
{
if( myIORs.IsEmpty() )
- return ;
- myIORs.Clear() ;
- myShapes.Clear() ;
- return ;
+ return;
+ myIORs.Clear();
+ myShapes.Clear();
+ return;
}
//=======================================================================
//=======================================================================
unsigned int GEOM_Client::BufferLength()
{
- return myIORs.Length() ;
+ return myIORs.Length();
}
-
//=======================================================================
// function : GetShape()
-// purpose :
+// purpose :
//=======================================================================
+TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape )
+{
+ TopoDS_Shape S;
+ CORBA::String_var anIOR = geom->GetStringFromIOR(aShape);
+ TCollection_AsciiString IOR = (char*)anIOR.in();
+ Standard_Integer anIndex = Find(IOR, S);
+
+ if (anIndex != 0) return S;
+
+ /******* in case of a MAIN GEOM::SHAPE ********/
+ if (aShape->IsMainShape()) {
+ S = Load(geom, aShape);
+ Bind(IOR, S);
+ return S;
+ }
-TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape )
-{
- TopoDS_Shape S;
- TCollection_AsciiString IOR = geom->GetStringFromIOR(aShape);
- Standard_Integer anIndex = Find(IOR, S);
-
- if (anIndex !=0 ) return S ;
-
- /******* in case of a MAIN GEOM::SHAPE ********/
- if (aShape->IsMainShape()) {
- S = Load(geom, aShape);
- Bind(IOR, S);
- return S;
- }
-
- /******* in case of SUB GEOM::SHAPE ***********/
- // Load and Explore the Main Shape
- TopoDS_Shape aMainShape = GetShape (geom, aShape->GetMainShape());
- GEOM::ListOfLong_var list = aShape->GetSubShapeIndices();
+ /******* in case of SUB GEOM::SHAPE ***********/
+ // Load and Explore the Main Shape
+ TopoDS_Shape aMainShape = GetShape (geom, aShape->GetMainShape());
+ GEOM::ListOfLong_var list = aShape->GetSubShapeIndices();
TopTools_IndexedMapOfShape anIndices;
TopExp::MapShapes(aMainShape, anIndices);
- /* Case of only one subshape */
- if (list->length() == 1)
- {
- S = anIndices.FindKey(list[0]);
- }
+ /* Case of only one subshape */
+ if (list->length() == 1 && list[0] > 0) {
+ S = anIndices.FindKey(list[0]);
+ }
else {
BRep_Builder B;
TopoDS_Compound aCompound;
B.MakeCompound(aCompound);
- for(int i=0; i<list->length(); i++) {
- TopoDS_Shape aSubShape = anIndices.FindKey(list[i]);
- B.Add(aCompound, aSubShape);
+ for (int i = 0; i < list->length(); i++) {
+ if (0 < list[i] && list[i] <= anIndices.Extent()) {
+ TopoDS_Shape aSubShape = anIndices.FindKey(list[i]);
+ B.Add(aCompound, aSubShape);
+ }
}
S = aCompound;
}
- Bind(IOR, S);
- return S;
-}
-
+ Bind(IOR, S);
+ return S;
+}