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