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