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