Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <vcl/svapp.hxx>
21 : #include <osl/module.hxx>
22 : #include <osl/file.hxx>
23 : #include <unotools/transliterationwrapper.hxx>
24 :
25 : #include "callform.hxx"
26 : #include "global.hxx"
27 : #include "adiasync.hxx"
28 :
29 : //------------------------------------------------------------------------
30 :
31 : extern "C" {
32 :
33 : typedef void (CALLTYPE* ExFuncPtr1)(void*);
34 : typedef void (CALLTYPE* ExFuncPtr2)(void*, void*);
35 : typedef void (CALLTYPE* ExFuncPtr3)(void*, void*, void*);
36 : typedef void (CALLTYPE* ExFuncPtr4)(void*, void*, void*, void*);
37 : typedef void (CALLTYPE* ExFuncPtr5)(void*, void*, void*, void*, void*);
38 : typedef void (CALLTYPE* ExFuncPtr6)(void*, void*, void*, void*, void*, void*);
39 : typedef void (CALLTYPE* ExFuncPtr7)(void*, void*, void*, void*, void*, void*, void*);
40 : typedef void (CALLTYPE* ExFuncPtr8)(void*, void*, void*, void*, void*, void*, void*, void*);
41 : typedef void (CALLTYPE* ExFuncPtr9)(void*, void*, void*, void*, void*, void*, void*, void*, void*);
42 : typedef void (CALLTYPE* ExFuncPtr10)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
43 : typedef void (CALLTYPE* ExFuncPtr11)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
44 : typedef void (CALLTYPE* ExFuncPtr12)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
45 : typedef void (CALLTYPE* ExFuncPtr13)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
46 : typedef void (CALLTYPE* ExFuncPtr14)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
47 : typedef void (CALLTYPE* ExFuncPtr15)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
48 : typedef void (CALLTYPE* ExFuncPtr16)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
49 :
50 : typedef void (CALLTYPE* GetFuncCountPtr)(sal_uInt16& nCount);
51 : typedef void (CALLTYPE* GetFuncDataPtr)
52 : (sal_uInt16& nNo, sal_Char* pFuncName, sal_uInt16& nParamCount, ParamType* peType, sal_Char* pInternalName);
53 :
54 : typedef void (CALLTYPE* SetLanguagePtr)( sal_uInt16& nLanguage );
55 : typedef void (CALLTYPE* GetParamDesc)
56 : (sal_uInt16& nNo, sal_uInt16& nParam, sal_Char* pName, sal_Char* pDesc );
57 :
58 : typedef void (CALLTYPE* IsAsync) ( sal_uInt16& nNo,
59 : ParamType* peType );
60 : typedef void (CALLTYPE* Advice) ( sal_uInt16& nNo,
61 : AdvData& pfCallback );
62 : typedef void (CALLTYPE* Unadvice)( double& nHandle );
63 :
64 : typedef void (CALLTYPE* FARPROC) ( void );
65 :
66 : }
67 :
68 : #define GETFUNCTIONCOUNT "GetFunctionCount"
69 : #define GETFUNCTIONDATA "GetFunctionData"
70 : #define SETLANGUAGE "SetLanguage"
71 : #define GETPARAMDESC "GetParameterDescription"
72 : #define ISASYNC "IsAsync"
73 : #define ADVICE "Advice"
74 : #define UNADVICE "Unadvice"
75 :
76 : class ModuleData
77 : {
78 : friend class ModuleCollection;
79 : rtl::OUString aName;
80 : osl::Module* pInstance;
81 : public:
82 0 : ModuleData(const rtl::OUString& rStr, osl::Module* pInst) : aName(rStr), pInstance(pInst) {}
83 : ModuleData(const ModuleData& rData) : aName(rData.aName)
84 : {
85 : #ifndef DISABLE_DYNLOADING
86 : pInstance = new osl::Module(aName);
87 : #else
88 : pInstance = NULL;
89 : #endif
90 : }
91 0 : ~ModuleData() { delete pInstance; }
92 :
93 0 : const rtl::OUString& GetName() const { return aName; }
94 0 : osl::Module* GetInstance() const { return pInstance; }
95 : void FreeInstance() { delete pInstance; pInstance = 0; }
96 : };
97 :
98 : //------------------------------------------------------------------------
99 :
100 0 : FuncData::FuncData(const ModuleData*pModule,
101 : const rtl::OUString& rIName,
102 : const rtl::OUString& rFName,
103 : sal_uInt16 nNo,
104 : sal_uInt16 nCount,
105 : const ParamType* peType,
106 : ParamType eType) :
107 : pModuleData (pModule),
108 : aInternalName (rIName),
109 : aFuncName (rFName),
110 : nNumber (nNo),
111 : nParamCount (nCount),
112 0 : eAsyncType (eType)
113 : {
114 0 : for (sal_uInt16 i = 0; i < MAXFUNCPARAM; i++)
115 0 : eParamType[i] = peType[i];
116 0 : }
117 :
118 : //------------------------------------------------------------------------
119 :
120 0 : FuncData::FuncData(const FuncData& rData) :
121 : pModuleData (rData.pModuleData),
122 : aInternalName (rData.aInternalName),
123 : aFuncName (rData.aFuncName),
124 : nNumber (rData.nNumber),
125 : nParamCount (rData.nParamCount),
126 0 : eAsyncType (rData.eAsyncType)
127 : {
128 0 : for (sal_uInt16 i = 0; i < MAXFUNCPARAM; i++)
129 0 : eParamType[i] = rData.eParamType[i];
130 0 : }
131 :
132 : namespace {
133 :
134 5 : class ModuleCollection
135 : {
136 : typedef boost::ptr_map<rtl::OUString, ModuleData> MapType;
137 : MapType maData;
138 : public:
139 5 : ModuleCollection() {}
140 : ModuleCollection(const ModuleCollection& r) : maData(r.maData) {}
141 :
142 : const ModuleData* findByName(const rtl::OUString& rName) const;
143 : void insert(ModuleData* pNew);
144 : void clear();
145 : };
146 :
147 0 : const ModuleData* ModuleCollection::findByName(const rtl::OUString& rName) const
148 : {
149 0 : MapType::const_iterator it = maData.find(rName);
150 0 : return it == maData.end() ? NULL : it->second;
151 : }
152 :
153 0 : void ModuleCollection::insert(ModuleData* pNew)
154 : {
155 0 : if (!pNew)
156 0 : return;
157 :
158 0 : rtl::OUString aName = pNew->GetName();
159 0 : maData.insert(aName, pNew);
160 : }
161 :
162 0 : void ModuleCollection::clear()
163 : {
164 0 : maData.clear();
165 0 : }
166 :
167 5 : ModuleCollection aModuleCollection;
168 :
169 : }
170 :
171 : //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
172 :
173 0 : bool InitExternalFunc(const rtl::OUString& rModuleName)
174 : {
175 : #ifdef DISABLE_DYNLOADING
176 : (void) rModuleName;
177 : return false;
178 : #else
179 : // Module already loaded?
180 0 : const ModuleData* pTemp = aModuleCollection.findByName(rModuleName);
181 0 : if (pTemp)
182 0 : return false;
183 :
184 0 : rtl::OUString aNP;
185 0 : aNP = rModuleName;
186 :
187 0 : bool bRet = false;
188 0 : osl::Module* pLib = new osl::Module( aNP );
189 0 : if (pLib->is())
190 : {
191 0 : FARPROC fpGetCount = (FARPROC)pLib->getFunctionSymbol(GETFUNCTIONCOUNT);
192 0 : FARPROC fpGetData = (FARPROC)pLib->getFunctionSymbol(GETFUNCTIONDATA);
193 0 : if ((fpGetCount != NULL) && (fpGetData != NULL))
194 : {
195 0 : FARPROC fpIsAsync = (FARPROC)pLib->getFunctionSymbol(ISASYNC);
196 0 : FARPROC fpAdvice = (FARPROC)pLib->getFunctionSymbol(ADVICE);
197 0 : FARPROC fpSetLanguage = (FARPROC)pLib->getFunctionSymbol(SETLANGUAGE);
198 0 : if ( fpSetLanguage )
199 : {
200 0 : LanguageType eLanguage = Application::GetSettings().GetUILanguageTag().getLanguageType();
201 0 : sal_uInt16 nLanguage = (sal_uInt16) eLanguage;
202 0 : (*((SetLanguagePtr)fpSetLanguage))( nLanguage );
203 : }
204 :
205 : // Module in die Collection aufnehmen
206 0 : ModuleData* pModuleData = new ModuleData(rModuleName, pLib);
207 0 : aModuleCollection.insert(pModuleData);
208 :
209 : // Schnittstelle initialisieren
210 0 : AdvData pfCallBack = &ScAddInAsyncCallBack;
211 : FuncData* pFuncData;
212 0 : FuncCollection* pFuncCol = ScGlobal::GetFuncCollection();
213 : sal_uInt16 nCount;
214 0 : (*((GetFuncCountPtr)fpGetCount))(nCount);
215 0 : for (sal_uInt16 i=0; i < nCount; i++)
216 : {
217 : sal_Char cFuncName[256];
218 : sal_Char cInternalName[256];
219 : sal_uInt16 nParamCount;
220 : ParamType eParamType[MAXFUNCPARAM];
221 0 : ParamType eAsyncType = NONE;
222 : // initialize all, in case the AddIn behaves bad
223 0 : cFuncName[0] = 0;
224 0 : cInternalName[0] = 0;
225 0 : nParamCount = 0;
226 0 : for ( sal_uInt16 j=0; j<MAXFUNCPARAM; j++ )
227 : {
228 0 : eParamType[j] = NONE;
229 : }
230 : (*((GetFuncDataPtr)fpGetData))(i, cFuncName, nParamCount,
231 0 : eParamType, cInternalName);
232 0 : if( fpIsAsync )
233 : {
234 0 : (*((IsAsync)fpIsAsync))(i, &eAsyncType);
235 0 : if ( fpAdvice && eAsyncType != NONE )
236 0 : (*((Advice)fpAdvice))( i, pfCallBack );
237 : }
238 0 : String aInternalName( cInternalName, osl_getThreadTextEncoding() );
239 0 : String aFuncName( cFuncName, osl_getThreadTextEncoding() );
240 : pFuncData = new FuncData( pModuleData,
241 : aInternalName,
242 : aFuncName,
243 : i,
244 : nParamCount,
245 : eParamType,
246 0 : eAsyncType );
247 0 : pFuncCol->insert(pFuncData);
248 0 : }
249 0 : bRet = sal_True;
250 : }
251 : else
252 0 : delete pLib;
253 : }
254 : else
255 0 : delete pLib;
256 0 : return bRet;
257 : #endif
258 : }
259 :
260 : //------------------------------------------------------------------------
261 :
262 0 : void ExitExternalFunc()
263 : {
264 0 : aModuleCollection.clear();
265 0 : }
266 :
267 : //------------------------------------------------------------------------
268 :
269 0 : bool FuncData::Call(void** ppParam) const
270 : {
271 : #ifdef DISABLE_DYNLOADING
272 : (void) ppParam;
273 : return false;
274 : #else
275 0 : bool bRet = false;
276 0 : osl::Module* pLib = pModuleData->GetInstance();
277 0 : FARPROC fProc = (FARPROC)pLib->getFunctionSymbol(aFuncName);
278 0 : if (fProc != NULL)
279 : {
280 0 : switch (nParamCount)
281 : {
282 : case 1 :
283 0 : (*((ExFuncPtr1)fProc))(ppParam[0]);
284 0 : bRet = true;
285 0 : break;
286 : case 2 :
287 0 : (*((ExFuncPtr2)fProc))(ppParam[0], ppParam[1]);
288 0 : bRet = true;
289 0 : break;
290 : case 3 :
291 0 : (*((ExFuncPtr3)fProc))(ppParam[0], ppParam[1], ppParam[2]);
292 0 : bRet = true;
293 0 : break;
294 : case 4 :
295 0 : (*((ExFuncPtr4)fProc))(ppParam[0], ppParam[1], ppParam[2], ppParam[3]);
296 0 : bRet = true;
297 0 : break;
298 : case 5 :
299 0 : (*((ExFuncPtr5)fProc))(ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4]);
300 0 : bRet = true;
301 0 : break;
302 : case 6 :
303 0 : (*((ExFuncPtr6)fProc))(ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5]);
304 0 : bRet = true;
305 0 : break;
306 : case 7 :
307 0 : (*((ExFuncPtr7)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
308 0 : ppParam[6]);
309 0 : bRet = true;
310 0 : break;
311 : case 8 :
312 0 : (*((ExFuncPtr8)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
313 0 : ppParam[6], ppParam[7]);
314 0 : bRet = true;
315 0 : break;
316 : case 9 :
317 0 : (*((ExFuncPtr9)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
318 0 : ppParam[6], ppParam[7], ppParam[8]);
319 0 : bRet = true;
320 0 : break;
321 : case 10 :
322 0 : (*((ExFuncPtr10)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
323 0 : ppParam[6], ppParam[7], ppParam[8], ppParam[9]);
324 0 : bRet = true;
325 0 : break;
326 : case 11 :
327 0 : (*((ExFuncPtr11)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
328 0 : ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10]);
329 0 : bRet = true;
330 0 : break;
331 : case 12:
332 0 : (*((ExFuncPtr12)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
333 0 : ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11]);
334 0 : bRet = true;
335 0 : break;
336 : case 13:
337 0 : (*((ExFuncPtr13)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
338 0 : ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11],
339 0 : ppParam[12]);
340 0 : bRet = true;
341 0 : break;
342 : case 14 :
343 0 : (*((ExFuncPtr14)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
344 0 : ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11],
345 0 : ppParam[12], ppParam[13]);
346 0 : bRet = true;
347 0 : break;
348 : case 15 :
349 0 : (*((ExFuncPtr15)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
350 0 : ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11],
351 0 : ppParam[12], ppParam[13], ppParam[14]);
352 0 : bRet = true;
353 0 : break;
354 : case 16 :
355 0 : (*((ExFuncPtr16)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
356 0 : ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11],
357 0 : ppParam[12], ppParam[13], ppParam[14], ppParam[15]);
358 0 : bRet = true;
359 0 : break;
360 0 : default : break;
361 : }
362 : }
363 0 : return bRet;
364 : #endif
365 : }
366 :
367 : //------------------------------------------------------------------------
368 :
369 0 : bool FuncData::Unadvice( double nHandle )
370 : {
371 : #ifdef DISABLE_DYNLOADING
372 : (void) nHandle;
373 : return false;
374 : #else
375 0 : bool bRet = false;
376 0 : osl::Module* pLib = pModuleData->GetInstance();
377 0 : FARPROC fProc = (FARPROC)pLib->getFunctionSymbol(UNADVICE);
378 0 : if (fProc != NULL)
379 : {
380 0 : ((::Unadvice)fProc)(nHandle);
381 0 : bRet = true;
382 : }
383 0 : return bRet;
384 : #endif
385 : }
386 :
387 : //------------------------------------------------------------------------
388 :
389 0 : const rtl::OUString& FuncData::GetModuleName() const
390 : {
391 0 : return pModuleData->GetName();
392 : }
393 :
394 0 : bool FuncData::getParamDesc( ::rtl::OUString& aName, ::rtl::OUString& aDesc, sal_uInt16 nParam ) const
395 : {
396 0 : bool bRet = false;
397 0 : if ( nParam <= nParamCount )
398 : {
399 0 : osl::Module* pLib = pModuleData->GetInstance();
400 0 : FARPROC fProc = (FARPROC) pLib->getFunctionSymbol(GETPARAMDESC);
401 0 : if ( fProc != NULL )
402 : {
403 : sal_Char pcName[256];
404 : sal_Char pcDesc[256];
405 0 : *pcName = *pcDesc = 0;
406 0 : sal_uInt16 nFuncNo = nNumber; // nicht per Reference versauen lassen..
407 0 : ((::GetParamDesc)fProc)( nFuncNo, nParam, pcName, pcDesc );
408 0 : aName = ::rtl::OUString( pcName, 256, osl_getThreadTextEncoding() );
409 0 : aDesc = ::rtl::OUString( pcDesc, 256, osl_getThreadTextEncoding() );
410 0 : bRet = true;
411 : }
412 : }
413 0 : if ( !bRet )
414 : {
415 0 : aName = ::rtl::OUString();
416 0 : aDesc = ::rtl::OUString();
417 : }
418 0 : return bRet;
419 : }
420 :
421 2 : FuncCollection::FuncCollection() {}
422 0 : FuncCollection::FuncCollection(const FuncCollection& r) : maData(r.maData) {}
423 :
424 0 : const FuncData* FuncCollection::findByName(const rtl::OUString& rName) const
425 : {
426 0 : MapType::const_iterator it = maData.find(rName);
427 0 : return it == maData.end() ? NULL : it->second;
428 : }
429 :
430 136 : FuncData* FuncCollection::findByName(const rtl::OUString& rName)
431 : {
432 136 : MapType::iterator it = maData.find(rName);
433 136 : return it == maData.end() ? NULL : it->second;
434 : }
435 :
436 0 : void FuncCollection::insert(FuncData* pNew)
437 : {
438 0 : rtl::OUString aName = pNew->GetInternalName();
439 0 : maData.insert(aName, pNew);
440 0 : }
441 :
442 1 : FuncCollection::const_iterator FuncCollection::begin() const
443 : {
444 1 : return maData.begin();
445 : }
446 :
447 1 : FuncCollection::const_iterator FuncCollection::end() const
448 : {
449 1 : return maData.end();
450 15 : }
451 :
452 :
453 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|