Salome HOME
Make the RequestSwitcher able to listVars and fetch data
[modules/yacs.git] / src / SALOMEDSClient / SALOMEDSClient_ClientFactory.cxx
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
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.
10 //
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.
15 //
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
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 #include "SALOMEDSClient_ClientFactory.hxx"
24
25 #ifdef WIN32
26 #include <windows.h>
27 static HMODULE _libHandle = 0;
28 #define SALOMEDS_LIB_NAME "SalomeDS.dll"
29 #else
30 #include <dlfcn.h>
31 static void* _libHandle = NULL;
32 #ifdef __APPLE__
33 #define SALOMEDS_LIB_NAME "libSalomeDS.dylib"
34 #else
35 #define SALOMEDS_LIB_NAME "libSalomeDS.so"
36 #endif
37 #endif
38
39 #define SOBJECT_FACTORY      "SObjectFactory"
40 #define SCOMPONENT_FACTORY   "SComponentFactory"
41 #define STUDY_FACTORY        "StudyFactory"
42 #define BUILDER_FACTORY      "BuilderFactory"
43 #define STUDYMANAGER_FACTORY "StudyManagerFactory"
44 #define STUDYMANAGER_CREATE  "CreateStudyManager"
45 #define GET_PARAMETERS       "GetIParameters"
46 #define CONVERT_SOBJECT      "ConvertSObject"
47 #define CONVERT_STUDY        "ConvertStudy"
48 #define CONVERT_BUILDER      "ConvertBuilder"
49
50 typedef SALOMEDSClient_SObject* (*SOBJECT_FACTORY_FUNCTION) (SALOMEDS::SObject_ptr);
51 typedef SALOMEDSClient_SComponent* (*SCOMPONENT_FACTORY_FUNCTION) (SALOMEDS::SComponent_ptr);
52 typedef SALOMEDSClient_Study* (*STUDY_FACTORY_FUNCTION) (SALOMEDS::Study_ptr);
53 typedef SALOMEDSClient_StudyManager* (*STUDYMANAGER_FACTORY_FUNCTION) ();
54 typedef SALOMEDSClient_StudyBuilder* (*BUILDER_FACTORY_FUNCTION) (SALOMEDS::StudyBuilder_ptr);
55 typedef SALOMEDSClient_StudyManager* (*STUDYMANAGER_CREATE_FUNCTION) (CORBA::ORB_ptr, PortableServer::POA_ptr);
56 typedef SALOMEDSClient_IParameters* (*GET_PARAMETERS_FACTORY) (const _PTR(AttributeParameter)&);
57 typedef SALOMEDS::SObject_ptr (*CONVERT_SOBJECT_FUNCTION) (const _PTR(SObject)&);
58 typedef SALOMEDS::Study_ptr (*CONVERT_STUDY_FUNCTION) (const _PTR(Study)&);
59 typedef SALOMEDS::StudyBuilder_ptr (*CONVERT_BUILDER_FUNCTION) (const _PTR(StudyBuilder)&);
60
61
62 static SOBJECT_FACTORY_FUNCTION aSObjectFactory = NULL;
63 static SCOMPONENT_FACTORY_FUNCTION aSComponentFactory = NULL;
64 static STUDY_FACTORY_FUNCTION aStudyFactory = NULL;
65 static BUILDER_FACTORY_FUNCTION aBuilderFactory = NULL;
66 static STUDYMANAGER_FACTORY_FUNCTION aManagerFactory = NULL;
67 static STUDYMANAGER_CREATE_FUNCTION aCreateFactory = NULL;
68 static GET_PARAMETERS_FACTORY aGetIParameters = NULL;
69 static CONVERT_SOBJECT_FUNCTION aConvertSObject = NULL;
70 static CONVERT_STUDY_FUNCTION aConvertStudy = NULL;
71 static CONVERT_BUILDER_FUNCTION aConvertBuilder = NULL;
72
73 _PTR(SObject) ClientFactory::SObject(SALOMEDS::SObject_ptr theSObject)
74 {
75   SALOMEDSClient_SObject* so = NULL;
76
77 #ifdef WIN32
78   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
79   if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SOBJECT_FACTORY);
80 #else
81   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
82   if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION) dlsym(_libHandle, SOBJECT_FACTORY);
83 #endif
84
85   if(aSObjectFactory) so = aSObjectFactory(theSObject); 
86   return _PTR(SObject)(so);
87 }
88
89 _PTR(SComponent) ClientFactory::SComponent(SALOMEDS::SComponent_ptr theSComponent)
90 {
91   SALOMEDSClient_SComponent* sco = NULL; 
92
93 #ifdef WIN32
94   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
95   if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SCOMPONENT_FACTORY);
96 #else
97   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
98   if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION) dlsym(_libHandle, SCOMPONENT_FACTORY);
99 #endif
100
101   if(aSComponentFactory) sco = aSComponentFactory(theSComponent); 
102   return _PTR(SComponent)(sco);
103 }
104
105 _PTR(Study) ClientFactory::Study(SALOMEDS::Study_ptr theStudy)
106 {
107   SALOMEDSClient_Study* study = NULL;
108
109 #ifdef WIN32
110   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
111   if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION)::GetProcAddress(_libHandle, STUDY_FACTORY);
112 #else
113   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
114   if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION) dlsym(_libHandle, STUDY_FACTORY);
115 #endif
116
117   if(aStudyFactory) study = aStudyFactory(theStudy); 
118   return _PTR(Study)(study);
119 }
120
121 _PTR(StudyBuilder) ClientFactory::StudyBuilder(SALOMEDS::StudyBuilder_ptr theStudyBuilder)
122 {
123   SALOMEDSClient_StudyBuilder* studyBuilder = NULL;
124
125 #ifdef WIN32
126   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
127   if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION)::GetProcAddress(_libHandle, BUILDER_FACTORY);
128 #else
129   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
130   if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION) dlsym(_libHandle, BUILDER_FACTORY);
131 #endif
132
133   if(aBuilderFactory) studyBuilder = aBuilderFactory(theStudyBuilder); 
134   return _PTR(StudyBuilder)(studyBuilder);
135 }
136
137 _PTR(StudyManager) ClientFactory::StudyManager()
138 {
139   SALOMEDSClient_StudyManager* manager = NULL;
140
141 #ifdef WIN32
142   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
143   if(!aManagerFactory) aManagerFactory = (STUDYMANAGER_FACTORY_FUNCTION)::GetProcAddress(_libHandle, STUDYMANAGER_FACTORY);
144 #else
145   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
146   if(!aManagerFactory) aManagerFactory = (STUDYMANAGER_FACTORY_FUNCTION) dlsym(_libHandle, STUDYMANAGER_FACTORY);
147 #endif
148
149   if(aManagerFactory) manager = aManagerFactory(); 
150   return _PTR(StudyManager)(manager);
151 }
152
153 _PTR(StudyManager) ClientFactory::createStudyManager(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
154 {
155   SALOMEDSClient_StudyManager* manager = NULL;
156
157 #ifdef WIN32
158   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
159   if(!aCreateFactory) aCreateFactory = (STUDYMANAGER_CREATE_FUNCTION)::GetProcAddress(_libHandle, STUDYMANAGER_CREATE);
160 #else
161   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
162   if(!aCreateFactory) aCreateFactory = (STUDYMANAGER_CREATE_FUNCTION) dlsym(_libHandle, STUDYMANAGER_CREATE);
163 #endif
164
165   if(aCreateFactory)  manager = aCreateFactory(orb, poa);
166   return _PTR(StudyManager)(manager);
167 }
168
169 _PTR(IParameters) ClientFactory::getIParameters(const _PTR(AttributeParameter)& ap)
170 {
171   SALOMEDSClient_IParameters* interface = NULL;
172
173 #ifdef WIN32
174   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
175   if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY)::GetProcAddress(_libHandle, GET_PARAMETERS);
176 #else
177   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
178   if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY) dlsym(_libHandle, GET_PARAMETERS);
179 #endif
180
181   if(aGetIParameters) interface = aGetIParameters(ap); 
182   return _PTR(IParameters)(interface);
183 }
184
185 SALOMEDS::SObject_ptr ClientFactory::crbSObject(const _PTR(SObject)& theSObject)
186 {
187   SALOMEDS::SObject_var so;
188
189 #ifdef WIN32
190   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
191   if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION)::GetProcAddress(_libHandle, CONVERT_SOBJECT);
192 #else
193   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
194   if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION) dlsym(_libHandle, CONVERT_SOBJECT);
195 #endif
196
197   if(aConvertSObject) so = aConvertSObject(theSObject); 
198
199   if(CORBA::is_nil(so)) return SALOMEDS::SObject::_nil();
200   return so._retn();
201 }
202
203
204 SALOMEDS::Study_ptr ClientFactory::crbStudy(const _PTR(Study)& theStudy)
205 {
206   SALOMEDS::Study_var study;
207
208 #ifdef WIN32
209   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
210   if(!aConvertStudy) aConvertStudy = (CONVERT_STUDY_FUNCTION)::GetProcAddress(_libHandle, CONVERT_STUDY);
211 #else
212   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
213   if(!aConvertStudy) aConvertStudy = (CONVERT_STUDY_FUNCTION) dlsym(_libHandle, CONVERT_STUDY);
214 #endif
215
216   if(aConvertStudy) study = aConvertStudy(theStudy); 
217   
218   if(CORBA::is_nil(study)) return SALOMEDS::Study::_nil();
219   return study._retn();
220 }
221
222 SALOMEDS::StudyBuilder_ptr ClientFactory::crbStudyBuilder(const _PTR(StudyBuilder)& theStudyBuilder)
223 {
224   SALOMEDS::StudyBuilder_var studyBuilder;
225
226 #ifdef WIN32
227   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
228   if(!aConvertBuilder)aConvertBuilder  = (CONVERT_BUILDER_FUNCTION)::GetProcAddress(_libHandle, CONVERT_BUILDER);
229 #else
230   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
231   if(!aConvertBuilder) aConvertBuilder = (CONVERT_BUILDER_FUNCTION) dlsym(_libHandle, CONVERT_BUILDER);
232 #endif
233
234   if(aConvertBuilder) studyBuilder = aConvertBuilder(theStudyBuilder); 
235   
236   if(CORBA::is_nil(studyBuilder)) return SALOMEDS::StudyBuilder::_nil();
237   return studyBuilder._retn();
238 }