Salome HOME
add options-help get from launcher
[modules/kernel.git] / src / SALOMEDSClient / SALOMEDSClient_ClientFactory.cxx
1 // Copyright (C) 2007-2024  CEA, EDF, 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 #ifdef UNICODE
29 #define SALOMEDS_LIB_NAME L"SalomeDS.dll"
30 #else
31 #define SALOMEDS_LIB_NAME "SalomeDS.dll"
32 #endif
33 #else
34 #include <dlfcn.h>
35 static void* _libHandle = NULL;
36 #ifdef __APPLE__
37 #define SALOMEDS_LIB_NAME "libSalomeDS.dylib"
38 #else
39 #define SALOMEDS_LIB_NAME "libSalomeDS.so"
40 #endif
41 #endif
42
43 #define SOBJECT_FACTORY         "SObjectFactory"
44 #define SCOMPONENT_FACTORY      "SComponentFactory"
45 #define STUDY_FACTORY           "StudyFactory"
46 #define STUDY_CREATE            "CreateStudy"
47 #define STUDY_CREATE_WITHOUT_NS "CreateStudyWithoutNS"
48 #define BUILDER_FACTORY         "BuilderFactory"
49 #define GET_PARAMETERS          "GetIParameters"
50 #define CONVERT_SOBJECT         "ConvertSObject"
51 #define CONVERT_BUILDER         "ConvertBuilder"
52
53 typedef SALOMEDSClient_SObject* (*SOBJECT_FACTORY_FUNCTION) (SALOMEDS::SObject_ptr);
54 typedef SALOMEDSClient_SComponent* (*SCOMPONENT_FACTORY_FUNCTION) (SALOMEDS::SComponent_ptr);
55 typedef SALOMEDSClient_Study* (*STUDY_FACTORY_FUNCTION) (SALOMEDS::Study_ptr);
56 typedef void                  (*STUDY_CREATE_FUNCTION) (CORBA::ORB_ptr, PortableServer::POA_ptr);
57 typedef SALOMEDSClient_StudyBuilder* (*BUILDER_FACTORY_FUNCTION) (SALOMEDS::StudyBuilder_ptr);
58 typedef SALOMEDSClient_IParameters* (*GET_PARAMETERS_FACTORY) (const _PTR(AttributeParameter)&);
59 typedef SALOMEDS::SObject_ptr (*CONVERT_SOBJECT_FUNCTION) (const _PTR(SObject)&);
60 typedef SALOMEDS::StudyBuilder_ptr (*CONVERT_BUILDER_FUNCTION) (const _PTR(StudyBuilder)&);
61
62
63 static SOBJECT_FACTORY_FUNCTION aSObjectFactory = NULL;
64 static SCOMPONENT_FACTORY_FUNCTION aSComponentFactory = NULL;
65 static STUDY_FACTORY_FUNCTION aStudyFactory = NULL;
66 static STUDY_CREATE_FUNCTION aCreateFactory = NULL;
67 static BUILDER_FACTORY_FUNCTION aBuilderFactory = NULL;
68 static GET_PARAMETERS_FACTORY aGetIParameters = NULL;
69 static CONVERT_SOBJECT_FUNCTION aConvertSObject = NULL;
70 static CONVERT_BUILDER_FUNCTION aConvertBuilder = NULL;
71
72 _PTR(SObject) ClientFactory::SObject(SALOMEDS::SObject_ptr theSObject)
73 {
74   SALOMEDSClient_SObject* so = NULL;
75
76 #ifdef WIN32
77   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
78   if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SOBJECT_FACTORY);
79 #else
80   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
81   if(!aSObjectFactory) aSObjectFactory = (SOBJECT_FACTORY_FUNCTION) dlsym(_libHandle, SOBJECT_FACTORY);
82 #endif
83
84   if(aSObjectFactory) so = aSObjectFactory(theSObject); 
85   return _PTR(SObject)(so);
86 }
87
88 _PTR(SComponent) ClientFactory::SComponent(SALOMEDS::SComponent_ptr theSComponent)
89 {
90   SALOMEDSClient_SComponent* sco = NULL; 
91
92 #ifdef WIN32
93   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
94   if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION)::GetProcAddress(_libHandle, SCOMPONENT_FACTORY);
95 #else
96   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
97   if(!aSComponentFactory) aSComponentFactory = (SCOMPONENT_FACTORY_FUNCTION) dlsym(_libHandle, SCOMPONENT_FACTORY);
98 #endif
99
100   if(aSComponentFactory) sco = aSComponentFactory(theSComponent); 
101   return _PTR(SComponent)(sco);
102 }
103
104 _PTR(Study) ClientFactory::Study(SALOMEDS::Study_ptr theStudy)
105 {
106   SALOMEDSClient_Study* study = NULL;
107
108 #ifdef WIN32
109   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
110   if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION)::GetProcAddress(_libHandle, STUDY_FACTORY);
111 #else
112   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
113   if(!aStudyFactory) aStudyFactory = (STUDY_FACTORY_FUNCTION) dlsym(_libHandle, STUDY_FACTORY);
114 #endif
115
116   if(aStudyFactory) study = aStudyFactory(theStudy); 
117   return _PTR(Study)(study);
118 }
119
120 void ClientFactory::createStudy(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
121 {
122 #ifdef WIN32
123   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
124   if(!aCreateFactory) aCreateFactory = (STUDY_CREATE_FUNCTION)::GetProcAddress(_libHandle, STUDY_CREATE);
125 #else
126   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
127   if(!aCreateFactory) aCreateFactory = (STUDY_CREATE_FUNCTION) dlsym(_libHandle, STUDY_CREATE);
128 #endif
129
130   if(aCreateFactory) aCreateFactory(orb, poa);
131 }
132
133 void ClientFactory::createStudyWithoutNS(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
134 {
135 #ifdef WIN32
136   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
137   if(!aCreateFactory) aCreateFactory = (STUDY_CREATE_FUNCTION)::GetProcAddress(_libHandle, STUDY_CREATE_WITHOUT_NS);
138 #else
139   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
140   if(!aCreateFactory) aCreateFactory = (STUDY_CREATE_FUNCTION) dlsym(_libHandle, STUDY_CREATE_WITHOUT_NS);
141 #endif
142
143   if(aCreateFactory) aCreateFactory(orb, poa);
144 }
145
146 _PTR(StudyBuilder) ClientFactory::StudyBuilder(SALOMEDS::StudyBuilder_ptr theStudyBuilder)
147 {
148   SALOMEDSClient_StudyBuilder* studyBuilder = NULL;
149
150 #ifdef WIN32
151   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
152   if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION)::GetProcAddress(_libHandle, BUILDER_FACTORY);
153 #else
154   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
155   if(!aBuilderFactory) aBuilderFactory = (BUILDER_FACTORY_FUNCTION) dlsym(_libHandle, BUILDER_FACTORY);
156 #endif
157
158   if(aBuilderFactory) studyBuilder = aBuilderFactory(theStudyBuilder); 
159   return _PTR(StudyBuilder)(studyBuilder);
160 }
161
162 _PTR(IParameters) ClientFactory::getIParameters(const _PTR(AttributeParameter)& ap)
163 {
164   SALOMEDSClient_IParameters* interface = NULL;
165
166 #ifdef WIN32
167   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
168   if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY)::GetProcAddress(_libHandle, GET_PARAMETERS);
169 #else
170   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
171   if(!aGetIParameters) aGetIParameters = (GET_PARAMETERS_FACTORY) dlsym(_libHandle, GET_PARAMETERS);
172 #endif
173
174   if(aGetIParameters) interface = aGetIParameters(ap); 
175   return _PTR(IParameters)(interface);
176 }
177
178 SALOMEDS::SObject_ptr ClientFactory::crbSObject(const _PTR(SObject)& theSObject)
179 {
180   SALOMEDS::SObject_var so;
181
182 #ifdef WIN32
183   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
184   if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION)::GetProcAddress(_libHandle, CONVERT_SOBJECT);
185 #else
186   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
187   if(!aConvertSObject) aConvertSObject = (CONVERT_SOBJECT_FUNCTION) dlsym(_libHandle, CONVERT_SOBJECT);
188 #endif
189
190   if(aConvertSObject) so = aConvertSObject(theSObject); 
191
192   if(CORBA::is_nil(so)) return SALOMEDS::SObject::_nil();
193   return so._retn();
194 }
195
196 SALOMEDS::StudyBuilder_ptr ClientFactory::crbStudyBuilder(const _PTR(StudyBuilder)& theStudyBuilder)
197 {
198   SALOMEDS::StudyBuilder_var studyBuilder;
199
200 #ifdef WIN32
201   if(!_libHandle) _libHandle = ::LoadLibrary(SALOMEDS_LIB_NAME);
202   if(!aConvertBuilder)aConvertBuilder  = (CONVERT_BUILDER_FUNCTION)::GetProcAddress(_libHandle, CONVERT_BUILDER);
203 #else
204   if(!_libHandle) _libHandle = dlopen(SALOMEDS_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
205   if(!aConvertBuilder) aConvertBuilder = (CONVERT_BUILDER_FUNCTION) dlsym(_libHandle, CONVERT_BUILDER);
206 #endif
207
208   if(aConvertBuilder) studyBuilder = aConvertBuilder(theStudyBuilder); 
209   
210   if(CORBA::is_nil(studyBuilder)) return SALOMEDS::StudyBuilder::_nil();
211   return studyBuilder._retn();
212 }