From: mpa Date: Wed, 19 Oct 2016 09:46:44 +0000 (+0300) Subject: add method createStudy() X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=4d3691443a04de8e12481bc19430affe1d0ac58d;p=modules%2Fyacs.git add method createStudy() --- diff --git a/src/SALOMEDS/SALOMEDS.cxx b/src/SALOMEDS/SALOMEDS.cxx index 42ba79c59..86cfc7996 100644 --- a/src/SALOMEDS/SALOMEDS.cxx +++ b/src/SALOMEDS/SALOMEDS.cxx @@ -28,6 +28,7 @@ // #include "SALOMEDS.hxx" #include "SALOMEDS_Study.hxx" +#include "SALOMEDS_Study_i.hxx" #include "SALOMEDS_StudyBuilder.hxx" #include "SALOMEDS_SObject.hxx" #include "SALOMEDS_SComponent.hxx" @@ -102,6 +103,31 @@ extern "C" return new SALOMEDS_StudyBuilder(theBuilder); } + SALOMEDS_EXPORT + SALOMEDSClient_Study* CreateStudy(CORBA::ORB_ptr orb, PortableServer::POA_ptr root_poa) + { + SALOME_NamingService namingService(orb); + CORBA::Object_var obj = namingService.Resolve( "/Study" ); + SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow( obj ); + SALOMEDS_Study_i* aStudy_i; + if( CORBA::is_nil(aStudy) ) { + aStudy_i = new SALOMEDS_Study_i(orb); + + // Activate the objects. This tells the POA that the objects are ready to accept requests. + PortableServer::ObjectId_var aStudy_iid = root_poa->activate_object(aStudy_i); + aStudy = aStudy_i->_this(); + + //give ownership to the poa : the object will be deleted by the poa + aStudy_i->_remove_ref(); + namingService.Register(aStudy.in(), "/Study"); + + // Assign the value of the IOR in the study->root + CORBA::String_var IORStudy = orb->object_to_string(aStudy); + aStudy_i->GetImpl()->SetTransientReference((char*)IORStudy.in()); + } + return new SALOMEDS_Study(aStudy_i->GetImpl()); + } + SALOMEDS_EXPORT SALOMEDSClient_IParameters* GetIParameters(const _PTR(AttributeParameter)& ap) { diff --git a/src/SALOMEDSClient/SALOMEDSClient_ClientFactory.cxx b/src/SALOMEDSClient/SALOMEDSClient_ClientFactory.cxx index b42b4b12e..76f5221ff 100644 --- a/src/SALOMEDSClient/SALOMEDSClient_ClientFactory.cxx +++ b/src/SALOMEDSClient/SALOMEDSClient_ClientFactory.cxx @@ -35,6 +35,7 @@ static void* _libHandle = NULL; #define SOBJECT_FACTORY "SObjectFactory" #define SCOMPONENT_FACTORY "SComponentFactory" #define STUDY_FACTORY "StudyFactory" +#define STUDY_CREATE "CreateStudy" #define BUILDER_FACTORY "BuilderFactory" #define GET_PARAMETERS "GetIParameters" #define CONVERT_SOBJECT "ConvertSObject" @@ -44,6 +45,7 @@ static void* _libHandle = NULL; typedef SALOMEDSClient_SObject* (*SOBJECT_FACTORY_FUNCTION) (SALOMEDS::SObject_ptr); typedef SALOMEDSClient_SComponent* (*SCOMPONENT_FACTORY_FUNCTION) (SALOMEDS::SComponent_ptr); typedef SALOMEDSClient_Study* (*STUDY_FACTORY_FUNCTION) (SALOMEDS::Study_ptr); +typedef SALOMEDSClient_Study* (*STUDY_CREATE_FUNCTION) (CORBA::ORB_ptr, PortableServer::POA_ptr); typedef SALOMEDSClient_StudyBuilder* (*BUILDER_FACTORY_FUNCTION) (SALOMEDS::StudyBuilder_ptr); typedef SALOMEDSClient_IParameters* (*GET_PARAMETERS_FACTORY) (const _PTR(AttributeParameter)&); typedef SALOMEDS::SObject_ptr (*CONVERT_SOBJECT_FUNCTION) (const _PTR(SObject)&); @@ -54,6 +56,7 @@ typedef SALOMEDS::StudyBuilder_ptr (*CONVERT_BUILDER_FUNCTION) (const _PTR(Study static SOBJECT_FACTORY_FUNCTION aSObjectFactory = NULL; static SCOMPONENT_FACTORY_FUNCTION aSComponentFactory = NULL; static STUDY_FACTORY_FUNCTION aStudyFactory = NULL; +static STUDY_CREATE_FUNCTION aCreateFactory = NULL; static BUILDER_FACTORY_FUNCTION aBuilderFactory = NULL; static GET_PARAMETERS_FACTORY aGetIParameters = NULL; static CONVERT_SOBJECT_FUNCTION aConvertSObject = NULL; @@ -108,6 +111,21 @@ _PTR(Study) ClientFactory::Study(SALOMEDS::Study_ptr theStudy) return _PTR(Study)(study); } +_PTR(Study) ClientFactory::createStudy(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa) +{ + SALOMEDSClient_Study* study = NULL; +#ifdef WIN32 + if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME); + if(!aCreateFactory) aCreateFactory = (STUDY_CREATE_FUNCTION)::GetProcAddress(_libHandle, STUDY_CREATE); +#else + if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL); + if(!aCreateFactory) aCreateFactory = (STUDY_CREATE_FUNCTION) dlsym(_libHandle, STUDY_CREATE); +#endif + + if(aCreateFactory) study = aCreateFactory(orb, poa); + return _PTR(Study)(study); +} + _PTR(StudyBuilder) ClientFactory::StudyBuilder(SALOMEDS::StudyBuilder_ptr theStudyBuilder) { SALOMEDSClient_StudyBuilder* studyBuilder = NULL; diff --git a/src/SALOMEDSClient/SALOMEDSClient_ClientFactory.hxx b/src/SALOMEDSClient/SALOMEDSClient_ClientFactory.hxx index a3d5ca4fa..7c407f898 100644 --- a/src/SALOMEDSClient/SALOMEDSClient_ClientFactory.hxx +++ b/src/SALOMEDSClient/SALOMEDSClient_ClientFactory.hxx @@ -58,6 +58,11 @@ public: */ static _PTR(Study) Study(SALOMEDS::Study_ptr theStudy); + /*! + * Creates and returns a client Study wrapper + */ + static _PTR(Study) createStudy(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa); + /*! * Returns a client StudyBuilder wrapper that corresponds %theStudy */