1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "SALOMEDSClient_ClientFactory.hxx"
27 static HMODULE _libHandle = 0;
28 #define SALOMEDS_LIB_NAME "SalomeDS.dll"
31 static void* _libHandle = NULL;
32 #define SALOMEDS_LIB_NAME "libSalomeDS.so"
35 #define SOBJECT_FACTORY "SObjectFactory"
36 #define SCOMPONENT_FACTORY "SComponentFactory"
37 #define STUDY_FACTORY "StudyFactory"
38 #define BUILDER_FACTORY "BuilderFactory"
39 #define STUDYMANAGER_FACTORY "StudyManagerFactory"
40 #define STUDYMANAGER_CREATE "CreateStudyManager"
41 #define GET_PARAMETERS "GetIParameters"
42 #define CONVERT_SOBJECT "ConvertSObject"
43 #define CONVERT_STUDY "ConvertStudy"
44 #define CONVERT_BUILDER "ConvertBuilder"
46 typedef SALOMEDSClient_SObject* (*SOBJECT_FACTORY_FUNCTION) (SALOMEDS::SObject_ptr);
47 typedef SALOMEDSClient_SComponent* (*SCOMPONENT_FACTORY_FUNCTION) (SALOMEDS::SComponent_ptr);
48 typedef SALOMEDSClient_Study* (*STUDY_FACTORY_FUNCTION) (SALOMEDS::Study_ptr);
49 typedef SALOMEDSClient_StudyManager* (*STUDYMANAGER_FACTORY_FUNCTION) ();
50 typedef SALOMEDSClient_StudyBuilder* (*BUILDER_FACTORY_FUNCTION) (SALOMEDS::StudyBuilder_ptr);
51 typedef SALOMEDSClient_StudyManager* (*STUDYMANAGER_CREATE_FUNCTION) (CORBA::ORB_ptr, PortableServer::POA_ptr);
52 typedef SALOMEDSClient_IParameters* (*GET_PARAMETERS_FACTORY) (const _PTR(AttributeParameter)&);
53 typedef SALOMEDS::SObject_ptr (*CONVERT_SOBJECT_FUNCTION) (const _PTR(SObject)&);
54 typedef SALOMEDS::Study_ptr (*CONVERT_STUDY_FUNCTION) (const _PTR(Study)&);
55 typedef SALOMEDS::StudyBuilder_ptr (*CONVERT_BUILDER_FUNCTION) (const _PTR(StudyBuilder)&);
58 static SOBJECT_FACTORY_FUNCTION aSObjectFactory = NULL;
59 static SCOMPONENT_FACTORY_FUNCTION aSComponentFactory = NULL;
60 static STUDY_FACTORY_FUNCTION aStudyFactory = NULL;
61 static BUILDER_FACTORY_FUNCTION aBuilderFactory = NULL;
62 static STUDYMANAGER_FACTORY_FUNCTION aManagerFactory = NULL;
63 static STUDYMANAGER_CREATE_FUNCTION aCreateFactory = NULL;
64 static GET_PARAMETERS_FACTORY aGetIParameters = NULL;
65 static CONVERT_SOBJECT_FUNCTION aConvertSObject = NULL;
66 static CONVERT_STUDY_FUNCTION aConvertStudy = NULL;
67 static CONVERT_BUILDER_FUNCTION aConvertBuilder = NULL;
69 _PTR(SObject) ClientFactory::SObject(SALOMEDS::SObject_ptr theSObject)
71 SALOMEDSClient_SObject* so = NULL;
74 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
75 if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SOBJECT_FACTORY);
77 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
78 if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION) dlsym(_libHandle, SOBJECT_FACTORY);
81 if(aSObjectFactory) so = aSObjectFactory(theSObject);
82 return _PTR(SObject)(so);
85 _PTR(SComponent) ClientFactory::SComponent(SALOMEDS::SComponent_ptr theSComponent)
87 SALOMEDSClient_SComponent* sco = NULL;
90 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
91 if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SCOMPONENT_FACTORY);
93 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
94 if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION) dlsym(_libHandle, SCOMPONENT_FACTORY);
97 if(aSComponentFactory) sco = aSComponentFactory(theSComponent);
98 return _PTR(SComponent)(sco);
101 _PTR(Study) ClientFactory::Study(SALOMEDS::Study_ptr theStudy)
103 SALOMEDSClient_Study* study = NULL;
106 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
107 if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION)::GetProcAddress(_libHandle, STUDY_FACTORY);
109 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
110 if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION) dlsym(_libHandle, STUDY_FACTORY);
113 if(aStudyFactory) study = aStudyFactory(theStudy);
114 return _PTR(Study)(study);
117 _PTR(StudyBuilder) ClientFactory::StudyBuilder(SALOMEDS::StudyBuilder_ptr theStudyBuilder)
119 SALOMEDSClient_StudyBuilder* studyBuilder = NULL;
122 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
123 if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION)::GetProcAddress(_libHandle, BUILDER_FACTORY);
125 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
126 if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION) dlsym(_libHandle, BUILDER_FACTORY);
129 if(aBuilderFactory) studyBuilder = aBuilderFactory(theStudyBuilder);
130 return _PTR(StudyBuilder)(studyBuilder);
133 _PTR(StudyManager) ClientFactory::StudyManager()
135 SALOMEDSClient_StudyManager* manager = NULL;
138 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
139 if(!aManagerFactory) aManagerFactory = (STUDYMANAGER_FACTORY_FUNCTION)::GetProcAddress(_libHandle, STUDYMANAGER_FACTORY);
141 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
142 if(!aManagerFactory) aManagerFactory = (STUDYMANAGER_FACTORY_FUNCTION) dlsym(_libHandle, STUDYMANAGER_FACTORY);
145 if(aManagerFactory) manager = aManagerFactory();
146 return _PTR(StudyManager)(manager);
149 _PTR(StudyManager) ClientFactory::createStudyManager(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
151 SALOMEDSClient_StudyManager* manager = NULL;
154 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
155 if(!aCreateFactory) aCreateFactory = (STUDYMANAGER_CREATE_FUNCTION)::GetProcAddress(_libHandle, STUDYMANAGER_CREATE);
157 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
158 if(!aCreateFactory) aCreateFactory = (STUDYMANAGER_CREATE_FUNCTION) dlsym(_libHandle, STUDYMANAGER_CREATE);
161 if(aCreateFactory) manager = aCreateFactory(orb, poa);
162 return _PTR(StudyManager)(manager);
165 _PTR(IParameters) ClientFactory::getIParameters(const _PTR(AttributeParameter)& ap)
167 SALOMEDSClient_IParameters* interface = NULL;
170 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
171 if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY)::GetProcAddress(_libHandle, GET_PARAMETERS);
173 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
174 if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY) dlsym(_libHandle, GET_PARAMETERS);
177 if(aGetIParameters) interface = aGetIParameters(ap);
178 return _PTR(IParameters)(interface);
181 SALOMEDS::SObject_ptr ClientFactory::crbSObject(const _PTR(SObject)& theSObject)
183 SALOMEDS::SObject_var so;
186 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
187 if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION)::GetProcAddress(_libHandle, CONVERT_SOBJECT);
189 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
190 if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION) dlsym(_libHandle, CONVERT_SOBJECT);
193 if(aConvertSObject) so = aConvertSObject(theSObject);
195 if(CORBA::is_nil(so)) return SALOMEDS::SObject::_nil();
200 SALOMEDS::Study_ptr ClientFactory::crbStudy(const _PTR(Study)& theStudy)
202 SALOMEDS::Study_var study;
205 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
206 if(!aConvertStudy) aConvertStudy = (CONVERT_STUDY_FUNCTION)::GetProcAddress(_libHandle, CONVERT_STUDY);
208 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
209 if(!aConvertStudy) aConvertStudy = (CONVERT_STUDY_FUNCTION) dlsym(_libHandle, CONVERT_STUDY);
212 if(aConvertStudy) study = aConvertStudy(theStudy);
214 if(CORBA::is_nil(study)) return SALOMEDS::Study::_nil();
215 return study._retn();
218 SALOMEDS::StudyBuilder_ptr ClientFactory::crbStudyBuilder(const _PTR(StudyBuilder)& theStudyBuilder)
220 SALOMEDS::StudyBuilder_var studyBuilder;
223 if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
224 if(!aConvertBuilder)aConvertBuilder = (CONVERT_BUILDER_FUNCTION)::GetProcAddress(_libHandle, CONVERT_BUILDER);
226 if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
227 if(!aConvertBuilder) aConvertBuilder = (CONVERT_BUILDER_FUNCTION) dlsym(_libHandle, CONVERT_BUILDER);
230 if(aConvertBuilder) studyBuilder = aConvertBuilder(theStudyBuilder);
232 if(CORBA::is_nil(studyBuilder)) return SALOMEDS::StudyBuilder::_nil();
233 return studyBuilder._retn();