Salome HOME
3c832879bd183dd150b10c2f4a65bb76ccdc462f
[modules/kernel.git] / src / SALOMEDSClient / SALOMEDSClient_ClientFactory.cxx
1 // Copyright (C) 2005  OPEN CASCADE, CEA, EDF R&D, LEG
2 //           PRINCIPIA R&D, EADS CCR, Lip6, BV, CEDRAT
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either 
6 // version 2.1 of the License.
7 // 
8 // This library is distributed in the hope that it will be useful 
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
11 // Lesser General Public License for more details.
12 // 
13 // You should have received a copy of the GNU Lesser General Public  
14 // License along with this library; if not, write to the Free Software 
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 // 
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 // 
19 #include "SALOMEDSClient_ClientFactory.hxx"
20
21 #ifdef WIN32
22 #include <windows.h>
23 static HMODULE _libHandle = 0;
24 #define SALOMEDS_LIB_NAME "SalomeDS.dll"
25 #else
26 #include <dlfcn.h>
27 static void* _libHandle = NULL;
28 #define SALOMEDS_LIB_NAME "libSalomeDS.so"
29 #endif
30
31 #define SOBJECT_FACTORY      "SObjectFactory"
32 #define SCOMPONENT_FACTORY   "SComponentFactory"
33 #define STUDY_FACTORY        "StudyFactory"
34 #define BUILDER_FACTORY      "BuilderFactory"
35 #define STUDYMANAGER_FACTORY "StudyManagerFactory"
36 #define STUDYMANAGER_CREATE  "CreateStudyManager"
37 #define GET_PARAMETERS       "GetIParameters"
38 #define CONVERT_SOBJECT      "ConvertSObject"
39 #define CONVERT_STUDY        "ConvertStudy"
40 #define CONVERT_BUILDER      "ConvertBuilder"
41
42 typedef SALOMEDSClient_SObject* (*SOBJECT_FACTORY_FUNCTION) (SALOMEDS::SObject_ptr);
43 typedef SALOMEDSClient_SComponent* (*SCOMPONENT_FACTORY_FUNCTION) (SALOMEDS::SComponent_ptr);
44 typedef SALOMEDSClient_Study* (*STUDY_FACTORY_FUNCTION) (SALOMEDS::Study_ptr);
45 typedef SALOMEDSClient_StudyManager* (*STUDYMANAGER_FACTORY_FUNCTION) ();
46 typedef SALOMEDSClient_StudyBuilder* (*BUILDER_FACTORY_FUNCTION) (SALOMEDS::StudyBuilder_ptr);
47 typedef SALOMEDSClient_StudyManager* (*STUDYMANAGER_CREATE_FUNCTION) (CORBA::ORB_ptr, PortableServer::POA_ptr);
48 typedef SALOMEDSClient_IParameters* (*GET_PARAMETERS_FACTORY) (const _PTR(AttributeParameter)&);
49 typedef SALOMEDS::SObject_ptr (*CONVERT_SOBJECT_FUNCTION) (const _PTR(SObject)&);
50 typedef SALOMEDS::Study_ptr (*CONVERT_STUDY_FUNCTION) (const _PTR(Study)&);
51 typedef SALOMEDS::StudyBuilder_ptr (*CONVERT_BUILDER_FUNCTION) (const _PTR(StudyBuilder)&);
52
53
54 static SOBJECT_FACTORY_FUNCTION aSObjectFactory = NULL;
55 static SCOMPONENT_FACTORY_FUNCTION aSComponentFactory = NULL;
56 static STUDY_FACTORY_FUNCTION aStudyFactory = NULL;
57 static BUILDER_FACTORY_FUNCTION aBuilderFactory = NULL;
58 static STUDYMANAGER_FACTORY_FUNCTION aManagerFactory = NULL;
59 static STUDYMANAGER_CREATE_FUNCTION aCreateFactory = NULL;
60 static GET_PARAMETERS_FACTORY aGetIParameters = NULL;
61 static CONVERT_SOBJECT_FUNCTION aConvertSObject = NULL;
62 static CONVERT_STUDY_FUNCTION aConvertStudy = NULL;
63 static CONVERT_BUILDER_FUNCTION aConvertBuilder = NULL;
64
65 using namespace std;
66
67 _PTR(SObject) ClientFactory::SObject(SALOMEDS::SObject_ptr theSObject)
68 {
69   SALOMEDSClient_SObject* so = NULL;
70
71 #ifdef WIN32
72   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
73   if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SOBJECT_FACTORY);
74 #else
75   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
76   if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION) dlsym(_libHandle, SOBJECT_FACTORY);
77 #endif
78
79   if(aSObjectFactory) so = aSObjectFactory(theSObject); 
80   return _PTR(SObject)(so);
81 }
82
83 _PTR(SComponent) ClientFactory::SComponent(SALOMEDS::SComponent_ptr theSComponent)
84 {
85   SALOMEDSClient_SComponent* sco = NULL; 
86
87 #ifdef WIN32
88   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
89   if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SCOMPONENT_FACTORY);
90 #else
91   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
92   if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION) dlsym(_libHandle, SCOMPONENT_FACTORY);
93 #endif
94
95   if(aSComponentFactory) sco = aSComponentFactory(theSComponent); 
96   return _PTR(SComponent)(sco);
97 }
98
99 _PTR(Study) ClientFactory::Study(SALOMEDS::Study_ptr theStudy)
100 {
101   SALOMEDSClient_Study* study = NULL;
102
103 #ifdef WIN32
104   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
105   if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION)::GetProcAddress(_libHandle, STUDY_FACTORY);
106 #else
107   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
108   if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION) dlsym(_libHandle, STUDY_FACTORY);
109 #endif
110
111   if(aStudyFactory) study = aStudyFactory(theStudy); 
112   return _PTR(Study)(study);
113 }
114
115 _PTR(StudyBuilder) ClientFactory::StudyBuilder(SALOMEDS::StudyBuilder_ptr theStudyBuilder)
116 {
117   SALOMEDSClient_StudyBuilder* studyBuilder = NULL;
118
119 #ifdef WIN32
120   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
121   if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION)::GetProcAddress(_libHandle, BUILDER_FACTORY);
122 #else
123   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
124   if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION) dlsym(_libHandle, BUILDER_FACTORY);
125 #endif
126
127   if(aBuilderFactory) studyBuilder = aBuilderFactory(theStudyBuilder); 
128   return _PTR(StudyBuilder)(studyBuilder);
129 }
130
131 _PTR(StudyManager) ClientFactory::StudyManager()
132 {
133   SALOMEDSClient_StudyManager* manager = NULL;
134
135 #ifdef WIN32
136   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
137   if(!aManagerFactory) aManagerFactory = (STUDYMANAGER_FACTORY_FUNCTION)::GetProcAddress(_libHandle, STUDYMANAGER_FACTORY);
138 #else
139   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
140   if(!aManagerFactory) aManagerFactory = (STUDYMANAGER_FACTORY_FUNCTION) dlsym(_libHandle, STUDYMANAGER_FACTORY);
141 #endif
142
143   if(aManagerFactory) manager = aManagerFactory(); 
144   return _PTR(StudyManager)(manager);
145 }
146
147 _PTR(StudyManager) ClientFactory::createStudyManager(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
148 {
149   SALOMEDSClient_StudyManager* manager = NULL;
150
151 #ifdef WIN32
152   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
153   if(!aCreateFactory) aCreateFactory = (STUDYMANAGER_CREATE_FUNCTION)::GetProcAddress(_libHandle, STUDYMANAGER_CREATE);
154 #else
155   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
156   if(!aCreateFactory) aCreateFactory = (STUDYMANAGER_CREATE_FUNCTION) dlsym(_libHandle, STUDYMANAGER_CREATE);
157 #endif
158
159   if(aCreateFactory)  manager = aCreateFactory(orb, poa);
160   return _PTR(StudyManager)(manager);
161 }
162
163 _PTR(IParameters) ClientFactory::getIParameters(const _PTR(AttributeParameter)& ap)
164 {
165   SALOMEDSClient_IParameters* interface = NULL;
166
167 #ifdef WIN32
168   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
169   if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY)::GetProcAddress(_libHandle, GET_PARAMETERS);
170 #else
171   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
172   if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY) dlsym(_libHandle, GET_PARAMETERS);
173 #endif
174
175   if(aGetIParameters) interface = aGetIParameters(ap); 
176   return _PTR(IParameters)(interface);
177 }
178
179 SALOMEDS::SObject_ptr ClientFactory::crbSObject(const _PTR(SObject)& theSObject)
180 {
181   SALOMEDS::SObject_var so;
182
183 #ifdef WIN32
184   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
185   if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION)::GetProcAddress(_libHandle, CONVERT_SOBJECT);
186 #else
187   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
188   if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION) dlsym(_libHandle, CONVERT_SOBJECT);
189 #endif
190
191   if(aConvertSObject) so = aConvertSObject(theSObject); 
192
193   if(CORBA::is_nil(so)) return SALOMEDS::SObject::_nil();
194   return so._retn();
195 }
196
197
198 SALOMEDS::Study_ptr ClientFactory::crbStudy(const _PTR(Study)& theStudy)
199 {
200   SALOMEDS::Study_var study;
201
202 #ifdef WIN32
203   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
204   if(!aConvertStudy) aConvertStudy = (CONVERT_STUDY_FUNCTION)::GetProcAddress(_libHandle, CONVERT_STUDY);
205 #else
206   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
207   if(!aConvertStudy) aConvertStudy = (CONVERT_STUDY_FUNCTION) dlsym(_libHandle, CONVERT_STUDY);
208 #endif
209
210   if(aConvertStudy) study = aConvertStudy(theStudy); 
211   
212   if(CORBA::is_nil(study)) return SALOMEDS::Study::_nil();
213   return study._retn();
214 }
215
216 SALOMEDS::StudyBuilder_ptr ClientFactory::crbStudyBuilder(const _PTR(StudyBuilder)& theStudyBuilder)
217 {
218   SALOMEDS::StudyBuilder_var studyBuilder;
219
220 #ifdef WIN32
221   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
222   if(!aConvertBuilder)aConvertBuilder  = (CONVERT_BUILDER_FUNCTION)::GetProcAddress(_libHandle, CONVERT_BUILDER);
223 #else
224   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
225   if(!aConvertBuilder) aConvertBuilder = (CONVERT_BUILDER_FUNCTION) dlsym(_libHandle, CONVERT_BUILDER);
226 #endif
227
228   if(aConvertBuilder) studyBuilder = aConvertBuilder(theStudyBuilder); 
229   
230   if(CORBA::is_nil(studyBuilder)) return SALOMEDS::StudyBuilder::_nil();
231   return studyBuilder._retn();
232 }