SALOMEDS_UseCaseIterator_i.cxx \
SALOMEDS_ChildIterator_i.cxx \
SALOMEDS_SComponentIterator_i.cxx \
+ SALOMEDS_SimanStudy_i.cxx \
+ SALOMEDS_SimanStudy.cxx \
SALOMEDS_Study_i.cxx \
SALOMEDS_StudyBuilder_i.cxx \
SALOMEDS_SObject_i.cxx \
SALOMEDS_SComponent_i.hxx \
SALOMEDS_SComponentIterator.hxx \
SALOMEDS_SComponentIterator_i.hxx \
+ SALOMEDS_SimanStudy.hxx \
+ SALOMEDS_SimanStudy_i.hxx \
SALOMEDS_SObject.hxx \
SALOMEDS_SObject_i.hxx \
SALOMEDS_StudyBuilder.hxx \
SALOMEDS_AttributeString_i.hxx \
SALOMEDS_TMPFile_i.hxx
+if WITH_SIMANIO
+
+COMMON_CPPFLAGS += -DWITH_SIMANIO
+
+endif
+
libSalomeDS_la_CPPFLAGS = $(COMMON_CPPFLAGS)
libSalomeDS_la_LDFLAGS = -Wl,-E -no-undefined -version-info=0:0:0 @LDEXPDYNFLAGS@
libSalomeDS_la_LIBADD = $(COMMON_LIBS)
--- /dev/null
+// Copyright (C) 2007-2012 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
+//
+// 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
+//
+
+// File : SALOMEDS_SimanStudy.cxx
+// Author : Mikhail PONIKAROV
+// Module : SALOME
+//
+#include "utilities.h"
+
+#include "SALOMEDS_SimanStudy.hxx"
+
+#include "SALOMEDS.hxx"
+#include "SALOMEDS_Study.hxx"
+
+#include "SALOMEDSImpl_Study.hxx"
+
+#include "SALOMEDS_SimanStudy_i.hxx"
+
+#include "Basics_Utils.hxx"
+
+#include "Utils_ORB_INIT.hxx"
+#include "Utils_SINGLETON.hxx"
+
+SALOMEDS_SimanStudy::SALOMEDS_SimanStudy(SALOMEDSImpl_SimanStudy* theStudy)
+{
+ _isLocal = true;
+ _local_impl = theStudy;
+ _corba_impl = SALOMEDS::SimanStudy::_nil();
+ init_orb();
+}
+
+SALOMEDS_SimanStudy::SALOMEDS_SimanStudy(SALOMEDS::SimanStudy_ptr theStudy)
+{
+#ifdef WIN32
+ long pid = (long)_getpid();
+#else
+ long pid = (long)getpid();
+#endif
+
+ long addr = theStudy->GetLocalImpl(Kernel_Utils::GetHostname().c_str(), pid, _isLocal);
+ if(_isLocal) {
+ _local_impl = reinterpret_cast<SALOMEDSImpl_SimanStudy*>(addr);
+ _corba_impl = SALOMEDS::SimanStudy::_duplicate(theStudy);
+ }
+ else {
+ _local_impl = NULL;
+ _corba_impl = SALOMEDS::SimanStudy::_duplicate(theStudy);
+ }
+
+ init_orb();
+}
+
+SALOMEDS_SimanStudy::~SALOMEDS_SimanStudy()
+{
+}
+
+void SALOMEDS_SimanStudy::CheckOut(const _PTR(Study) theTarget)
+{
+ if (!theTarget) return;
+ SALOMEDS_Study* aStudy = dynamic_cast<SALOMEDS_Study*>(theTarget.get());
+ if (_isLocal) {
+ //SALOMEDS::Locker lock; mpv: this may cause dedlock when importData in module calls another SALOMEDS method with lock
+ _local_impl->CheckOut(aStudy->GetLocalImpl());
+ }
+ else _corba_impl->CheckOut(aStudy->GetStudy());
+}
+
+void SALOMEDS_SimanStudy::CheckIn(const std::string theModuleName)
+{
+ if (_isLocal) {
+ //SALOMEDS::Locker lock; mpv: this may cause dedlock when getModifiedData in module calls another SALOMEDS method with lock
+ _local_impl->CheckIn(theModuleName);
+ }
+ else _corba_impl->CheckIn((char*)theModuleName.c_str());
+}
+
+_PTR(Study) SALOMEDS_SimanStudy::getReferencedStudy()
+{
+ SALOMEDSClient_Study* aStudy = NULL;
+ if (_isLocal) {
+ SALOMEDS::Locker lock;
+
+ SALOMEDSImpl_Study* aStudy_impl = _local_impl->getReferencedStudy();
+ if (!aStudy_impl) return _PTR(Study)(aStudy);
+ aStudy = new SALOMEDS_Study(aStudy_impl);
+ }
+ else {
+ SALOMEDS::Study_var aStudy_impl = _corba_impl->getReferencedStudy();
+ if (CORBA::is_nil(aStudy_impl)) return _PTR(Study)(aStudy);
+ aStudy = new SALOMEDS_Study(aStudy_impl);
+ }
+ return _PTR(Study)(aStudy);
+}
+
+std::string SALOMEDS_SimanStudy::StudyId()
+{
+ std::string anId;
+ if (_isLocal) {
+ SALOMEDS::Locker lock;
+ anId = _local_impl->StudyId();
+ }
+ else anId = (CORBA::String_var)_corba_impl->StudyId();
+ return anId;
+}
+
+void SALOMEDS_SimanStudy::StudyId(const std::string theId)
+{
+ if (_isLocal) {
+ SALOMEDS::Locker lock;
+ _local_impl->StudyId(theId);
+ }
+ else _corba_impl->StudyId((char*)theId.c_str());
+}
+
+std::string SALOMEDS_SimanStudy::ScenarioId()
+{
+ std::string anId;
+ if (_isLocal) {
+ SALOMEDS::Locker lock;
+ anId = _local_impl->ScenarioId();
+ }
+ else anId = (CORBA::String_var)_corba_impl->ScenarioId();
+ return anId;
+}
+
+void SALOMEDS_SimanStudy::ScenarioId(const std::string theId)
+{
+ if (_isLocal) {
+ SALOMEDS::Locker lock;
+ _local_impl->ScenarioId(theId);
+ }
+ else _corba_impl->ScenarioId((char*)theId.c_str());
+}
+
+std::string SALOMEDS_SimanStudy::UserId()
+{
+ std::string anId;
+ if (_isLocal) {
+ SALOMEDS::Locker lock;
+ anId = _local_impl->UserId();
+ }
+ else anId = (CORBA::String_var)_corba_impl->UserId();
+ return anId;
+}
+
+void SALOMEDS_SimanStudy::UserId(const std::string theId)
+{
+ if (_isLocal) {
+ SALOMEDS::Locker lock;
+ _local_impl->UserId(theId);
+ }
+ else _corba_impl->UserId((char*)theId.c_str());
+}
+
+void SALOMEDS_SimanStudy::init_orb()
+{
+ ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
+ ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
+ _orb = init(0, 0);
+}
--- /dev/null
+// Copyright (C) 2007-2012 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
+//
+// 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
+//
+
+// File : SALOMEDS_SimanStudy.hxx
+// Author : Mikhail PONIKAROV
+// Module : SALOME
+//
+#ifndef __SALOMEDS_SIMANSTUDY_H__
+#define __SALOMEDS_SIMANSTUDY_H__
+
+#include <vector>
+#include <string>
+
+#include "SALOMEDSClient.hxx"
+#include "SALOMEDSImpl_SimanStudy.hxx"
+
+// IDL headers
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SALOMEDS)
+
+class Standard_EXPORT SALOMEDS_SimanStudy: public SALOMEDSClient_SimanStudy
+{
+
+private:
+ bool _isLocal;
+ SALOMEDSImpl_SimanStudy* _local_impl;
+ SALOMEDS::SimanStudy_var _corba_impl;
+ CORBA::ORB_var _orb;
+
+public:
+
+ SALOMEDS_SimanStudy(SALOMEDSImpl_SimanStudy* theStudy);
+ SALOMEDS_SimanStudy(SALOMEDS::SimanStudy_ptr theStudy);
+ ~SALOMEDS_SimanStudy();
+
+ virtual void CheckOut(const _PTR(Study) theTarget);
+ virtual void CheckIn(const std::string theModuleName);
+ virtual _PTR(Study) getReferencedStudy() ;
+ virtual std::string StudyId();
+ virtual void StudyId(const std::string theId);
+ virtual std::string ScenarioId();
+ virtual void ScenarioId(const std::string theId);
+ virtual std::string UserId();
+ virtual void UserId(const std::string theId);
+
+private:
+ void init_orb();
+
+};
+#endif
--- /dev/null
+// Copyright (C) 2007-2012 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
+//
+// 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
+//
+
+// File : SALOMEDS_SimanStudy_i.cxx
+// Author : Mikhail PONIKAROV
+// Module : SALOME
+//
+#include "utilities.h"
+#include "SALOMEDS_SimanStudy_i.hxx"
+#include "SALOMEDSImpl_SimanStudy.hxx"
+#include "SALOMEDSImpl_StudyManager.hxx"
+#include "SALOMEDS_Study_i.hxx"
+#include "SALOMEDS_Study.hxx"
+
+#include "Basics_Utils.hxx"
+
+//============================================================================
+/*! Function : SALOMEDS_SimanStudy_i
+ * Purpose : standard constructor
+ */
+//============================================================================
+SALOMEDS_SimanStudy_i::SALOMEDS_SimanStudy_i(SALOMEDSImpl_SimanStudy* theImpl, CORBA::ORB_ptr orb)
+{
+ _orb = CORBA::ORB::_duplicate(orb);
+ _impl = theImpl;
+}
+
+//============================================================================
+/*! Function : ~SALOMEDS_SimanStudy_i
+ * Purpose : standard destructor
+ */
+//============================================================================
+SALOMEDS_SimanStudy_i::~SALOMEDS_SimanStudy_i()
+{
+ //delete implementation
+ delete _impl;
+}
+
+//============================================================================
+/*! Function : CheckOut
+ * Purpose : Get data from SIMAN and put it to the given study
+ */
+//============================================================================
+void SALOMEDS_SimanStudy_i::CheckOut(SALOMEDS::Study_ptr theTarget)
+{
+ // SimanStudy and Study must be located at the same place anyway
+ SALOMEDS_Study aStudy(theTarget);
+ _study = aStudy.GetLocalImpl();
+ if (_study) {
+ _impl->CheckOut(_study);
+ }
+}
+
+//============================================================================
+/*! Function : CheckIn
+ * Purpose : Get data from SIMAN study and stores to SIMAN
+ */
+//============================================================================
+void SALOMEDS_SimanStudy_i::CheckIn(const char* theModuleName)
+{
+ if (_study) {
+ _impl->CheckIn(theModuleName);
+ }
+}
+
+//============================================================================
+/*! Function : getReferencedStudy
+ * Purpose : Returns the %Study with checked out data
+ */
+//============================================================================
+SALOMEDS::Study_ptr SALOMEDS_SimanStudy_i::getReferencedStudy()
+{
+ SALOMEDS::Study_var aStudy = (new SALOMEDS_Study_i(_study, _orb))->_this();
+ return aStudy._retn();
+}
+
+//============================================================================
+/*! Function : StudyId
+ * Purpose : The ID of the study in SIMAN server
+ */
+//============================================================================
+char* SALOMEDS_SimanStudy_i::StudyId()
+{
+ return CORBA::string_dup(_impl->StudyId().c_str());
+}
+
+//============================================================================
+/*! Function : StudyId
+ * Purpose : The ID of the study in SIMAN server
+ */
+//============================================================================
+void SALOMEDS_SimanStudy_i::StudyId(const char* theId)
+{
+ _impl->StudyId(theId);
+}
+
+//============================================================================
+/*! Function : ScenarioId
+ * Purpose : The ID of the scenario in SIMAN server
+ */
+//============================================================================
+char* SALOMEDS_SimanStudy_i::ScenarioId()
+{
+ return CORBA::string_dup(_impl->ScenarioId().c_str());
+}
+
+//============================================================================
+/*! Function : ScenarioId
+ * Purpose : The ID of the scenario in SIMAN server
+ */
+//============================================================================
+void SALOMEDS_SimanStudy_i::ScenarioId(const char* theId)
+{
+ _impl->StudyId(theId);
+}
+
+//============================================================================
+/*! Function : UserId
+ * Purpose : The ID of the user in SIMAN server
+ */
+//============================================================================
+char* SALOMEDS_SimanStudy_i::UserId()
+{
+ return CORBA::string_dup(_impl->UserId().c_str());
+}
+
+//============================================================================
+/*! Function : UserId
+ * Purpose : The ID of the user in SIMAN server
+ */
+//============================================================================
+void SALOMEDS_SimanStudy_i::UserId(const char* theId)
+{
+ _impl->UserId(theId);
+}
+
+
+SALOMEDS_SimanStudy_i* SALOMEDS_SimanStudy_i::GetSimanServant(SALOMEDSImpl_SimanStudy* aSimanImpl, CORBA::ORB_ptr orb)
+{
+ static SALOMEDS_SimanStudy_i* aServant = 0;
+ if (aServant == 0) {
+ aServant = new SALOMEDS_SimanStudy_i(aSimanImpl, orb);
+ }
+ return aServant;
+}
+
+/// PRIVATE FUNCTIONS
+CORBA::LongLong SALOMEDS_SimanStudy_i::GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal)
+{
+#ifdef WIN32
+ long pid = (long)_getpid();
+#else
+ long pid = (long)getpid();
+#endif
+ isLocal = (strcmp(theHostname, Kernel_Utils::GetHostname().c_str()) == 0 && pid == thePID)?1:0;
+ return reinterpret_cast<CORBA::LongLong>(_impl);
+}
--- /dev/null
+// Copyright (C) 2007-2012 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
+//
+// 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
+//
+
+// File : SALOMEDS_SimanStudy_i.hxx
+// Author : Mikhail PONIKAROV
+// Module : SALOME
+//
+#ifndef __SALOMEDS_SIMANSTUDY_I_H__
+#define __SALOMEDS_SIMANSTUDY_I_H__
+
+// IDL headers
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SALOMEDS)
+
+//SALOMEDS headers
+#include "SALOMEDS_Study_i.hxx"
+
+class SALOMEDSImpl_SimanStudy;
+class SALOMEDSImpl_Study;
+
+class Standard_EXPORT SALOMEDS_SimanStudy_i: public POA_SALOMEDS::SimanStudy
+{
+private:
+ CORBA::ORB_var _orb;
+ SALOMEDSImpl_SimanStudy* _impl;
+ SALOMEDSImpl_Study* _study;
+
+public:
+
+ //! standard constructor
+ SALOMEDS_SimanStudy_i(SALOMEDSImpl_SimanStudy*, CORBA::ORB_ptr);
+
+ //! standard destructor
+ virtual ~SALOMEDS_SimanStudy_i();
+
+ /*! \brief Get data from SIMAN and put it to the given study
+
+ This method is called for just created study to make it referenced
+ by this Siman study. Also it fills this study by the checked out
+ data from SIMAN server.
+ Warning: StudyID, ScenarioID and User Id must be set before calling of this method!
+
+ \param theTarget referenced study for checking out
+ */
+ virtual void CheckOut(SALOMEDS::Study_ptr theTarget);
+
+ /*! \brief Get data from all modules and calls the corresponding SimanIO methods to store it.
+
+ It works only with already checked out study
+ */
+ virtual void CheckIn(const char* themoduleName);
+
+ /*! \brief Returns the %Study with checked out data
+
+ If study is null, there is no such study in this application instance, or Salome was
+ launched without siman option.
+ */
+ virtual SALOMEDS::Study_ptr getReferencedStudy();
+
+ /*! \brief The ID of the study in SIMAN server
+
+ Returns the Id of SIMAN study, used for CheckOut before.
+ */
+ virtual char* StudyId();
+
+ /*! \brief The ID of the study in SIMAN server
+
+ Defines the Id of SIMAN study, used for CheckOut after.
+ */
+ virtual void StudyId(const char* theId);
+
+ /*! \brief The ID of the scenario in SIMAN server
+
+ Returns the Id of SIMAN scenario, used for CheckOut before.
+ */
+ virtual char* ScenarioId();
+
+ /*! \brief The ID of the scenario in SIMAN server
+
+ Defines the Id of SIMAN scenario, used for CheckOut after.
+ */
+ virtual void ScenarioId(const char* theId);
+
+ /*! \brief The ID of the user in SIMAN server
+
+ Returns the Id of SIMAN user, used for CheckOut before.
+ */
+ virtual char* UserId();
+
+ /*! \brief The ID of the user in SIMAN server
+
+ Defines the Id of SIMAN user, used for CheckOut after.
+ */
+ virtual void UserId(const char* theId);
+
+ virtual CORBA::LongLong GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal);
+
+ static SALOMEDS_SimanStudy_i* GetSimanServant(SALOMEDSImpl_SimanStudy*, CORBA::ORB_ptr orb);
+};
+#endif
CORBA::Object_ptr ConvertIORToObject(const std::string& theIOR);
SALOMEDS::Study_ptr GetStudy();
-
+
+ SALOMEDSImpl_Study* GetLocalImpl() { return _local_impl; }
+
private:
void init_orb();
#include "Basics_Utils.hxx"
+#include "SALOMEDS_SimanStudy.hxx"
+
#ifdef WIN32
#include <process.h>
#else
return driver;
}
+
+_PTR(SimanStudy) SALOMEDS_StudyManager::GetSimanStudy()
+{
+ SALOMEDSClient_SimanStudy* aSiman = NULL;
+ if (_isLocal) {
+ SALOMEDS::Locker lock;
+
+ SALOMEDSImpl_SimanStudy* aSiman_impl = _local_impl->GetSimanStudy();
+ if(!aSiman_impl) return _PTR(SimanStudy)(aSiman);
+ aSiman = new SALOMEDS_SimanStudy(aSiman_impl);
+ }
+ else {
+ SALOMEDS::SimanStudy_var aSiman_impl = _corba_impl->GetSimanStudy();
+ if(CORBA::is_nil(aSiman_impl)) return _PTR(SimanStudy)(aSiman);
+ aSiman = new SALOMEDS_SimanStudy(aSiman_impl);
+ }
+ return _PTR(SimanStudy)(aSiman);
+}
virtual bool Copy(const _PTR(SObject)& theSO);
virtual bool CanPaste(const _PTR(SObject)& theSO);
virtual _PTR(SObject) Paste(const _PTR(SObject)& theSO);
+ virtual _PTR(SimanStudy) GetSimanStudy();
private:
void init_orb();
#include "Basics_Utils.hxx"
#include "SALOME_GenericObj_i.hh"
+#include "SALOMEDS_SimanStudy_i.hxx"
+
#include <sstream>
#include <vector>
#include <map>
+
#ifdef WIN32
#include <process.h>
#else
exit( EXIT_SUCCESS );
}
+//============================================================================
+/*! Function : GetSimanStudy
+ * Purpose : Retruns the created or cashed SimanStudy
+ */
+//============================================================================
+SALOMEDS::SimanStudy_ptr SALOMEDS_StudyManager_i::GetSimanStudy()
+{
+ SALOMEDS::Locker lock;
+
+ SALOMEDSImpl_SimanStudy* aSimanImpl = _impl->GetSimanStudy();
+
+ SALOMEDS_SimanStudy_i* aSiman_servant = SALOMEDS_SimanStudy_i::GetSimanServant(aSimanImpl, _orb);
+ return aSiman_servant->_this();
+}
+
//===========================================================================
// PRIVATE FUNCTIONS
//===========================================================================
static PortableServer::POA_ptr GetPOA(const SALOMEDS::Study_ptr theStudy);
void Shutdown() { if(!CORBA::is_nil(_orb)) _orb->shutdown(0); }
+
+ virtual SALOMEDS::SimanStudy_ptr GetSimanStudy();
};
#endif
$(RPATH)/SALOMEDS/libSalomeDS.la \
$(top_builddir)/idl/libSalomeIDLKernel.la
+if WITH_SIMANIO
+ COMMON_CPPFLAGS += -DWITH_SIMANIO
+endif
+
#
# ===============================================================
# Libraries targets
SALOMEDSClient_SComponentIterator.hxx \
SALOMEDSClient_SObject.hxx \
SALOMEDSClient_Study.hxx \
+ SALOMEDSClient_SimanStudy.hxx \
SALOMEDSClient_StudyBuilder.hxx \
SALOMEDSClient_StudyManager.hxx \
SALOMEDSClient_UseCaseBuilder.hxx \
-I$(top_builddir)/idl \
@CORBA_CXXFLAGS@ @CORBA_INCLUDES@
+if WITH_SIMANIO
+COMMON_CPPFLAGS += -DWITH_SIMANIO
+
+endif
+
# This local variable defines the list of dependant libraries common to all target in this package.
COMMON_LIBS = $(top_builddir)/idl/libSalomeIDLKernel.la
#include "SALOMEDSClient_UseCaseBuilder.hxx"
#include "SALOMEDSClient_UseCaseIterator.hxx"
+#ifdef WITH_SIMANIO
+#include "SALOMEDSClient_SimanStudy.hxx"
+#endif
+
#endif
--- /dev/null
+// Copyright (C) 2007-2012 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
+//
+// 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
+//
+
+// File : SALOMEDSClient_SimanStudy.hxx
+// Author : Mikhail PONIKAROV
+// Module : SALOME
+//
+#ifndef __SALOMEDSClient_SIMANSTUDY_H__
+#define __SALOMEDSClient_SIMANSTUDY_H__
+
+#include <vector>
+#include <string>
+
+#include "SALOMEDSClient_definitions.hxx"
+#include "SALOMEDSClient_Study.hxx"
+#include <SALOMEconfig.h>
+#include CORBA_CLIENT_HEADER(SALOMEDS)
+
+class SALOMEDSClient_SimanStudy
+{
+
+public:
+ virtual ~SALOMEDSClient_SimanStudy() {}
+
+ virtual void CheckOut(const _PTR(Study) theTarget) = 0;
+ virtual void CheckIn(const std::string theModuleName) = 0;
+ virtual _PTR(Study) getReferencedStudy() = 0;
+ virtual std::string StudyId() = 0;
+ virtual void StudyId(const std::string theId) = 0;
+ virtual std::string ScenarioId() = 0;
+ virtual void ScenarioId(const std::string theId) = 0;
+ virtual std::string UserId() = 0;
+ virtual void UserId(const std::string theId) = 0;
+};
+
+
+#endif
#include "SALOMEDSClient_definitions.hxx"
#include "SALOMEDSClient_Study.hxx"
+#include "SALOMEDSClient_SimanStudy.hxx"
class SALOMEDSClient_StudyManager
{
virtual bool Copy(const _PTR(SObject)& theSO) = 0;
virtual bool CanPaste(const _PTR(SObject)& theSO) = 0;
virtual _PTR(SObject) Paste(const _PTR(SObject)& theSO) = 0;
+
+ virtual _PTR(SimanStudy) GetSimanStudy() = 0;
};
SALOMEDSImpl_GenericAttribute.hxx \
SALOMEDSImpl_SComponent.hxx \
SALOMEDSImpl_SComponentIterator.hxx \
+ SALOMEDSImpl_SimanStudy.hxx \
+ SALOMEDSImpl_SimanStudy.cxx \
SALOMEDSImpl_SObject.hxx \
SALOMEDSImpl_StudyBuilder.hxx \
SALOMEDSImpl_StudyHandle.hxx \
SALOMEDSImpl_GenericVariable.hxx \
SALOMEDSImpl_ScalarVariable.hxx
+if WITH_SIMANIO
+
+COMMON_CPPFLAGS += -DWITH_SIMANIO @SIMANIO_CPPFLAGS@ \
+ -I$(srcdir)/../KernelHelpers -I$(srcdir)/../NamingService -I$(srcdir)/../LifeCycleCORBA -I$(srcdir)/../Utils \
+ -I$(srcdir)/../Container -I$(srcdir)/../TOOLSDS
+
+COMMON_LIBS += @SIMANIO_LIBS@ ../KernelHelpers/libSalomeKernelHelpers.la ../LifeCycleCORBA/libSalomeLifeCycleCORBA.la \
+ ../Container/libSalomeContainer.la ../TOOLSDS/libTOOLSDS.la
+
+endif
+
libSalomeDSImpl_la_CPPFLAGS = $(COMMON_CPPFLAGS)
libSalomeDSImpl_la_LDFLAGS = -no-undefined -version-info=0:0:0
libSalomeDSImpl_la_LIBADD = $(COMMON_LIBS) $(CORBA_LIBS)
-
+
#
# ===============================================================
# Executables targets
--- /dev/null
+// Copyright (C) 2007-2012 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
+//
+// 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
+//
+
+// File : SALOMEDSImpl_SimanStudy.cxx
+// Author : Mikhail PONIKAROV
+// Module : SALOME
+//
+#include "SALOMEDSImpl_SimanStudy.hxx"
+
+#ifdef WITH_SIMANIO
+#include <SimanIO_Link.hxx>
+#include <SimanIO_Activity.hxx>
+#include <SALOME_KernelServices.hxx>
+#include <SALOME_DataContainer_i.hxx>
+#include <Basics_Utils.hxx>
+#include <Basics_DirUtils.hxx>
+#include <SALOMEDS_Tool.hxx>
+#endif
+
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SALOME_Component)
+
+using namespace std;
+
+//============================================================================
+/*! Function : SALOMEDSImpl_SimanStudy
+ * Purpose : SALOMEDSImpl_SimanStudy constructor
+ */
+//============================================================================
+SALOMEDSImpl_SimanStudy::SALOMEDSImpl_SimanStudy()
+{
+ _study = 0;
+ _checkedOut = new SimanIO_Configuration;
+}
+
+//============================================================================
+/*! Function : ~SALOMEDSImpl_SimanStudy
+ * Purpose : SALOMEDSImpl_SimanStudy destructor
+ */
+//============================================================================
+SALOMEDSImpl_SimanStudy::~SALOMEDSImpl_SimanStudy()
+{
+ if (_checkedOut) {
+#ifdef WITH_SIMANIO
+ SimanIO_Configuration::ActivitiesIterator actIter(*_checkedOut);
+ for(; actIter.More(); actIter.Next()) {
+ SimanIO_Activity::DocumentsIterator aDocIter(actIter.Activity());
+ for(; aDocIter.More(); aDocIter.Next()) {
+ const SimanIO_Document& aDoc = aDocIter.Document();
+ SimanIO_Document::FilesIterator aFileIter(aDoc);
+ for(; aFileIter.More(); aFileIter.Next()) {
+ string aURL = aFileIter.URL();
+ string aDir = Kernel_Utils::GetDirName(aURL);
+ aDir += "/";
+ string aFileName = aURL.substr(aDir.size());
+ SALOMEDS::ListOfFileNames aTmpFiles;
+ aTmpFiles.length(1);
+ aTmpFiles[0] = aFileName.c_str();
+ // try to removetemporary directory that contains this file if directory becomes empty
+ SALOMEDS_Tool::RemoveTemporaryFiles(aDir, aTmpFiles, true);
+ }
+ }
+ }
+#endif
+ delete _checkedOut;
+ }
+}
+
+//============================================================================
+/*! Function : CheckOut
+ * Purpose : Fills the referenced study by the SIMAN data
+ */
+//============================================================================
+void SALOMEDSImpl_SimanStudy::CheckOut(SALOMEDSImpl_Study* theTarget)
+{
+ _study = theTarget;
+#ifdef WITH_SIMANIO
+ int aLocked = _study->GetProperties()->IsLocked();
+ if (aLocked) _study->GetProperties()->SetLocked(false);
+
+ SimanIO_Link aLink(_studyId.c_str(), _scenarioId.c_str(), _userId.c_str());
+ if (aLink.IsConnected()) {
+ // Set "C" locale temporarily to avoid possible localization problems
+ Kernel_Utils::Localizer loc;
+ *_checkedOut = aLink.RetrieveConf();
+ SimanIO_Configuration::ActivitiesIterator actIter(*_checkedOut);
+ for(; actIter.More(); actIter.Next()) {
+ Engines::EngineComponent_var aComp =
+ KERNEL::getLifeCycleCORBA()->FindOrLoad_Component("FactoryServerPy", actIter.Activity().Module());
+ if (CORBA::is_nil(aComp)) // it is not python container, try to find in C++ container
+ aComp = KERNEL::getLifeCycleCORBA()->FindOrLoad_Component("FactoryServer", actIter.Activity().Module());
+ if (CORBA::is_nil(aComp)) {
+ MESSAGE("Checkout: component "<<actIter.Activity().Module()<<" is nil");
+ } else {
+ SimanIO_Activity::DocumentsIterator aDocIter(actIter.Activity());
+ for(; aDocIter.More(); aDocIter.Next()) {
+ if (_filesId.find(aDocIter.DocId()) == _filesId.end())
+ _filesId[aDocIter.DocId()] = map<string, int>();
+ const SimanIO_Document& aDoc = aDocIter.Document();
+ SimanIO_Document::FilesIterator aFileIter(aDoc);
+ for(; aFileIter.More(); aFileIter.Next()) {
+ if (aFileIter.GetProcessing() == FILE_IMPORT) {
+ // files provided by SIMAN will be removed later, on study close
+ Engines::DataContainer_var aData = (new Engines_DataContainer_i(
+ aFileIter.URL(), aDoc.Name(), "", false))->_this();
+ Engines::ListOfOptions anEmptyOpts;
+ Engines::ListOfIdentifiers_var anIds = aComp->importData(_study->StudyId(), aData, anEmptyOpts);
+ for(int anIdNum = 0; anIdNum < anIds->length(); anIdNum++) {
+ const char* anId = anIds[anIdNum];
+ _filesId[aDocIter.DocId()][anId] = aFileIter.Id();
+ }
+ } else {
+ cout<<"!!! File just downloaded, not imported:"<<aFileIter.Id()<<endl;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ MESSAGE("There is no connection to SIMAN!")
+ }
+
+ if (aLocked) _study->GetProperties()->SetLocked(true);
+
+#endif
+}
+
+//============================================================================
+/*! Function : CheckIn
+ * Purpose : Fills the SIMAN by the SIMAN study data
+ */
+//============================================================================
+void SALOMEDSImpl_SimanStudy::CheckIn(const std::string theModuleName)
+{
+#ifdef WITH_SIMANIO
+ if (!_study) {
+ MESSAGE("No siman study defined");
+ return;
+ }
+ SimanIO_Link aLink(_studyId.c_str(), _scenarioId.c_str(), _userId.c_str());
+ if (aLink.IsConnected()) {
+ // Set "C" locale temporarily to avoid possible localization problems
+ Kernel_Utils::Localizer loc;
+ SimanIO_Configuration aToStore; // here create and store data in this configuration to check in to SIMAN
+ string aTmpDir = SALOMEDS_Tool::GetTmpDir(); // temporary directory for checked in files
+ int aFileIndex = 0; // for unique file name generation
+ list<string> aTemporaryFileNames;
+ SimanIO_Configuration::ActivitiesIterator actIter(*_checkedOut);
+ for(; actIter.More(); actIter.Next()) {
+ int aDocId = actIter.Activity().DocumentMaxID();
+ if (aDocId < 0) continue; // no documents => no check in
+ if (!theModuleName.empty() && theModuleName != actIter.Activity().Module()) {
+ continue;
+ }
+ Engines::EngineComponent_var aComp =
+ KERNEL::getLifeCycleCORBA()->FindOrLoad_Component("FactoryServerPy", actIter.Activity().Module());
+ if (CORBA::is_nil(aComp)) // it is not python container, try to find in C++ container
+ aComp = KERNEL::getLifeCycleCORBA()->FindOrLoad_Component("FactoryServer", actIter.Activity().Module());
+ if (CORBA::is_nil(aComp)) {
+ MESSAGE("Checkin: component "<<actIter.Activity().Module()<<" is nil");
+ } else {
+ const SimanIO_Document& aDoc = actIter.Activity().Document(aDocId);
+ Engines::ListOfData_var aList = aComp->getModifiedData(_study->StudyId());
+ int aNumData = aList->length();
+ for(int aDataIndex = 0; aDataIndex < aNumData; aDataIndex++) {
+ Engines::DataContainer_var aData = aList[aDataIndex];
+ // store this in the configuration
+ SimanIO_Activity& aStoreActivity = aToStore.GetOrCreateActivity(actIter.ActivityId());
+ aStoreActivity.SetName(actIter.Activity().Name());
+ aStoreActivity.SetModule(actIter.Activity().Module());
+ SimanIO_Document& aStoreDoc = aStoreActivity.GetOrCreateDocument(aDocId);
+ aStoreDoc.SetName(aDoc.Name());
+ // prepare a file to store
+ SimanIO_File aStoreFile;
+
+ stringstream aNumStore;
+ aNumStore<<"file"<<(++aFileIndex);
+ string aFileName(aNumStore.str());
+ string anExtension(aData->extension());
+ aFileName += "." + anExtension;
+ string aFullPath = aTmpDir + aFileName;
+ Engines::TMPFile* aFileStream = aData->get();
+ const char *aBuffer = (const char*)aFileStream->NP_data();
+#ifdef WIN32
+ std::ofstream aFile(aFullPath.c_str(), std::ios::binary);
+#else
+ std::ofstream aFile(aFullPath.c_str());
+#endif
+ aFile.write(aBuffer, aFileStream->length());
+ aFile.close();
+ aTemporaryFileNames.push_back(aFileName);
+
+ aStoreFile.url = aFullPath;
+ if (_filesId[aDocId].find(aData->identifier()) != _filesId[aDocId].end()) { // file is already exists
+ aStoreFile.id = _filesId[aDocId][aData->identifier()];
+ aStoreFile.result = aDoc.File(aStoreFile.id).result;
+ } else {
+ aStoreFile.id = -1; // to be created as new
+ aStoreFile.result = true; // new is always result
+ }
+
+ aStoreDoc.AddFile(aStoreFile);
+ }
+ }
+ }
+ aLink.StoreConf(aToStore);
+ // after files have been stored, remove them from the temporary directory
+ SALOMEDS::ListOfFileNames aTmpFiles;
+ aTmpFiles.length(aTemporaryFileNames.size());
+ list<string>::iterator aFilesIter = aTemporaryFileNames.begin();
+ for(int a = 0; aFilesIter != aTemporaryFileNames.end(); aFilesIter++, a++)
+ aTmpFiles[a] = aFilesIter->c_str();
+ SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aTmpFiles, true);
+ } else {
+ MESSAGE("There is no connection to SIMAN!")
+ }
+#endif
+}
+
+//============================================================================
+/*! Function : getReferencedStudy
+ * Purpose :
+ */
+//============================================================================
+SALOMEDSImpl_Study* SALOMEDSImpl_SimanStudy::getReferencedStudy()
+{
+ return _study;
+}
+
+//============================================================================
+/*! Function : StudyId
+ * Purpose :
+ */
+//============================================================================
+std::string SALOMEDSImpl_SimanStudy::StudyId()
+{
+ return _studyId;
+}
+
+//============================================================================
+/*! Function : StudyId
+ * Purpose :
+ */
+//============================================================================
+void SALOMEDSImpl_SimanStudy::StudyId(const std::string theId)
+{
+ _studyId = theId;
+}
+
+//============================================================================
+/*! Function : ScenarioId
+ * Purpose :
+ */
+//============================================================================
+std::string SALOMEDSImpl_SimanStudy::ScenarioId()
+{
+ return _scenarioId;
+}
+
+//============================================================================
+/*! Function : ScenarioId
+ * Purpose :
+ */
+//============================================================================
+void SALOMEDSImpl_SimanStudy::ScenarioId(const std::string theId)
+{
+ _scenarioId = theId;
+}
+
+//============================================================================
+/*! Function : UserId
+ * Purpose :
+ */
+//============================================================================
+std::string SALOMEDSImpl_SimanStudy::UserId()
+{
+ return _userId;
+}
+
+//============================================================================
+/*! Function : UserId
+ * Purpose :
+ */
+//============================================================================
+void SALOMEDSImpl_SimanStudy::UserId(const std::string theId)
+{
+ _userId = theId;
+}
--- /dev/null
+// Copyright (C) 2007-2012 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
+//
+// 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
+//
+
+// File : SALOMEDSImpl_SimanStudy.hxx
+// Author : Mikhail PONIKAROV
+// Module : SALOME
+//
+#ifndef __SALOMEDSIMPL_SIMANSTUDY_I_H__
+#define __SALOMEDSIMPL_SIMANSTUDY_I_H__
+
+// std C++ headers
+#include <iostream>
+#include <string>
+
+//SALOMEDSImpl headers
+#include "SALOMEDSImpl_Defines.hxx"
+#include "SALOMEDSImpl_Study.hxx"
+
+class SimanIO_Configuration;
+
+class SALOMEDSIMPL_EXPORT SALOMEDSImpl_SimanStudy
+{
+private:
+ SALOMEDSImpl_Study* _study; // referenced study
+ std::string _studyId; // SIMAN ID
+ std::string _scenarioId; // SIMAN ID
+ std::string _userId; // SIMAN ID
+
+ SimanIO_Configuration* _checkedOut; // pointer to information about checked out data
+ std::map<int, std::map<std::string, int> > _filesId; // map from document id to component identifiers to SIMAN file ID
+
+public:
+
+ virtual void CheckOut(SALOMEDSImpl_Study* theTarget);
+ virtual void CheckIn(const std::string theModuleName);
+ virtual SALOMEDSImpl_Study* getReferencedStudy();
+ virtual std::string StudyId();
+ virtual void StudyId(const std::string theId);
+ virtual std::string ScenarioId();
+ virtual void ScenarioId(const std::string theId);
+ virtual std::string UserId();
+ virtual void UserId(const std::string theId);
+
+ //! standard constructor
+ SALOMEDSImpl_SimanStudy();
+
+ //! standard destructor
+ virtual ~SALOMEDSImpl_SimanStudy();
+};
+#endif
#include "SALOMEDSImpl_SComponent.hxx"
#include "SALOMEDSImpl_GenericAttribute.hxx"
#include "SALOMEDSImpl_ScalarVariable.hxx"
+#include "SALOMEDSImpl_SimanStudy.hxx"
+
#include <map>
#include "HDFOI.hxx"
_appli = new DF_Application();
_IDcounter = 0;
_clipboard = _appli->NewDocument("SALOME_STUDY");
+ _siman = 0;
}
//============================================================================
_appli->Close(_clipboard);
// Destroy application
delete _appli;
+ if (_siman) delete _siman;
}
theGroup->CloseOnDisk();
}
+
+//============================================================================
+/*! Function : GetSimanStudy
+ * Purpose : Retruns the created or cashed SimanStudy
+ */
+//==================================================T==========================
+SALOMEDSImpl_SimanStudy* SALOMEDSImpl_StudyManager::GetSimanStudy()
+{
+ if (_siman == 0)
+ _siman = new SALOMEDSImpl_SimanStudy();
+ return _siman;
+}
#include "DF_Document.hxx"
class HDFgroup;
+class SALOMEDSImpl_SimanStudy;
class SALOMEDSIMPL_EXPORT SALOMEDSImpl_StudyManager
{
int _IDcounter;
DF_Document* _clipboard;
std::string _errorCode;
+ SALOMEDSImpl_SimanStudy* _siman;
public:
std::string GetErrorCode() { return _errorCode; }
virtual bool IsError() { return _errorCode != ""; }
+ //! Retruns the created or cashed SimanStudy
+ virtual SALOMEDSImpl_SimanStudy* GetSimanStudy();
+
};
#endif