Salome HOME
0023299: [CEA] Finalize multi-study removal
[modules/kernel.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 #define SALOMEDS_LIB_NAME "libSalomeDS.so"
33 #endif
34
35 #define SOBJECT_FACTORY      "SObjectFactory"
36 #define SCOMPONENT_FACTORY   "SComponentFactory"
37 #define STUDY_FACTORY        "StudyFactory"
38 #define BUILDER_FACTORY      "BuilderFactory"
39 #define GET_PARAMETERS       "GetIParameters"
40 #define CONVERT_SOBJECT      "ConvertSObject"
41 #define CONVERT_STUDY        "ConvertStudy"
42 #define CONVERT_BUILDER      "ConvertBuilder"
43
44 typedef SALOMEDSClient_SObject* (*SOBJECT_FACTORY_FUNCTION) (SALOMEDS::SObject_ptr);
45 typedef SALOMEDSClient_SComponent* (*SCOMPONENT_FACTORY_FUNCTION) (SALOMEDS::SComponent_ptr);
46 typedef SALOMEDSClient_Study* (*STUDY_FACTORY_FUNCTION) (SALOMEDS::Study_ptr);
47 typedef SALOMEDSClient_StudyBuilder* (*BUILDER_FACTORY_FUNCTION) (SALOMEDS::StudyBuilder_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 GET_PARAMETERS_FACTORY aGetIParameters = NULL;
59 static CONVERT_SOBJECT_FUNCTION aConvertSObject = NULL;
60 static CONVERT_STUDY_FUNCTION aConvertStudy = NULL;
61 static CONVERT_BUILDER_FUNCTION aConvertBuilder = NULL;
62
63 _PTR(SObject) ClientFactory::SObject(SALOMEDS::SObject_ptr theSObject)
64 {
65   SALOMEDSClient_SObject* so = NULL;
66
67 #ifdef WIN32
68   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
69   if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SOBJECT_FACTORY);
70 #else
71   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
72   if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION) dlsym(_libHandle, SOBJECT_FACTORY);
73 #endif
74
75   if(aSObjectFactory) so = aSObjectFactory(theSObject); 
76   return _PTR(SObject)(so);
77 }
78
79 _PTR(SComponent) ClientFactory::SComponent(SALOMEDS::SComponent_ptr theSComponent)
80 {
81   SALOMEDSClient_SComponent* sco = NULL; 
82
83 #ifdef WIN32
84   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
85   if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SCOMPONENT_FACTORY);
86 #else
87   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
88   if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION) dlsym(_libHandle, SCOMPONENT_FACTORY);
89 #endif
90
91   if(aSComponentFactory) sco = aSComponentFactory(theSComponent); 
92   return _PTR(SComponent)(sco);
93 }
94
95 _PTR(Study) ClientFactory::Study(SALOMEDS::Study_ptr theStudy)
96 {
97   SALOMEDSClient_Study* study = NULL;
98
99 #ifdef WIN32
100   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
101   if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION)::GetProcAddress(_libHandle, STUDY_FACTORY);
102 #else
103   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
104   if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION) dlsym(_libHandle, STUDY_FACTORY);
105 #endif
106
107   if(aStudyFactory) study = aStudyFactory(theStudy); 
108   return _PTR(Study)(study);
109 }
110
111 _PTR(StudyBuilder) ClientFactory::StudyBuilder(SALOMEDS::StudyBuilder_ptr theStudyBuilder)
112 {
113   SALOMEDSClient_StudyBuilder* studyBuilder = NULL;
114
115 #ifdef WIN32
116   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
117   if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION)::GetProcAddress(_libHandle, BUILDER_FACTORY);
118 #else
119   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
120   if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION) dlsym(_libHandle, BUILDER_FACTORY);
121 #endif
122
123   if(aBuilderFactory) studyBuilder = aBuilderFactory(theStudyBuilder); 
124   return _PTR(StudyBuilder)(studyBuilder);
125 }
126
127 _PTR(IParameters) ClientFactory::getIParameters(const _PTR(AttributeParameter)& ap)
128 {
129   SALOMEDSClient_IParameters* interface = NULL;
130
131 #ifdef WIN32
132   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
133   if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY)::GetProcAddress(_libHandle, GET_PARAMETERS);
134 #else
135   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
136   if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY) dlsym(_libHandle, GET_PARAMETERS);
137 #endif
138
139   if(aGetIParameters) interface = aGetIParameters(ap); 
140   return _PTR(IParameters)(interface);
141 }
142
143 SALOMEDS::SObject_ptr ClientFactory::crbSObject(const _PTR(SObject)& theSObject)
144 {
145   SALOMEDS::SObject_var so;
146
147 #ifdef WIN32
148   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
149   if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION)::GetProcAddress(_libHandle, CONVERT_SOBJECT);
150 #else
151   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
152   if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION) dlsym(_libHandle, CONVERT_SOBJECT);
153 #endif
154
155   if(aConvertSObject) so = aConvertSObject(theSObject); 
156
157   if(CORBA::is_nil(so)) return SALOMEDS::SObject::_nil();
158   return so._retn();
159 }
160
161
162 SALOMEDS::Study_ptr ClientFactory::crbStudy(const _PTR(Study)& theStudy)
163 {
164   SALOMEDS::Study_var study;
165
166 #ifdef WIN32
167   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
168   if(!aConvertStudy) aConvertStudy = (CONVERT_STUDY_FUNCTION)::GetProcAddress(_libHandle, CONVERT_STUDY);
169 #else
170   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
171   if(!aConvertStudy) aConvertStudy = (CONVERT_STUDY_FUNCTION) dlsym(_libHandle, CONVERT_STUDY);
172 #endif
173
174   if(aConvertStudy) study = aConvertStudy(theStudy); 
175   
176   if(CORBA::is_nil(study)) return SALOMEDS::Study::_nil();
177   return study._retn();
178 }
179
180 SALOMEDS::StudyBuilder_ptr ClientFactory::crbStudyBuilder(const _PTR(StudyBuilder)& theStudyBuilder)
181 {
182   SALOMEDS::StudyBuilder_var studyBuilder;
183
184 #ifdef WIN32
185   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
186   if(!aConvertBuilder)aConvertBuilder  = (CONVERT_BUILDER_FUNCTION)::GetProcAddress(_libHandle, CONVERT_BUILDER);
187 #else
188   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
189   if(!aConvertBuilder) aConvertBuilder = (CONVERT_BUILDER_FUNCTION) dlsym(_libHandle, CONVERT_BUILDER);
190 #endif
191
192   if(aConvertBuilder) studyBuilder = aConvertBuilder(theStudyBuilder); 
193   
194   if(CORBA::is_nil(studyBuilder)) return SALOMEDS::StudyBuilder::_nil();
195   return studyBuilder._retn();
196 }