xref: /trunk/main/sc/source/core/tool/callform.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*b3f79822SAndrew Rist  * distributed with this work for additional information
6*b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17*b3f79822SAndrew Rist  * specific language governing permissions and limitations
18*b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*b3f79822SAndrew Rist  *************************************************************/
21*b3f79822SAndrew Rist 
22*b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir 
29cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
30cdf0e10cSrcweir #include <vcl/svapp.hxx>
31cdf0e10cSrcweir #include <osl/module.hxx>
32cdf0e10cSrcweir #include <osl/file.hxx>
33cdf0e10cSrcweir #include <unotools/transliterationwrapper.hxx>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include "callform.hxx"
36cdf0e10cSrcweir #include "global.hxx"
37cdf0e10cSrcweir #include "adiasync.hxx"
38cdf0e10cSrcweir 
39cdf0e10cSrcweir //------------------------------------------------------------------------
40cdf0e10cSrcweir 
41cdf0e10cSrcweir extern "C" {
42cdf0e10cSrcweir 
43cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr1)(void*);
44cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr2)(void*, void*);
45cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr3)(void*, void*, void*);
46cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr4)(void*, void*, void*, void*);
47cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr5)(void*, void*, void*, void*, void*);
48cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr6)(void*, void*, void*, void*, void*, void*);
49cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr7)(void*, void*, void*, void*, void*, void*, void*);
50cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr8)(void*, void*, void*, void*, void*, void*, void*, void*);
51cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr9)(void*, void*, void*, void*, void*, void*, void*, void*, void*);
52cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr10)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
53cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr11)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
54cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr12)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
55cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr13)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
56cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr14)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
57cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr15)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
58cdf0e10cSrcweir typedef void (CALLTYPE* ExFuncPtr16)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
59cdf0e10cSrcweir 
60cdf0e10cSrcweir typedef void (CALLTYPE* GetFuncCountPtr)(sal_uInt16& nCount);
61cdf0e10cSrcweir typedef void (CALLTYPE* GetFuncDataPtr)
62cdf0e10cSrcweir     (sal_uInt16& nNo, sal_Char* pFuncName, sal_uInt16& nParamCount, ParamType* peType, sal_Char* pInternalName);
63cdf0e10cSrcweir 
64cdf0e10cSrcweir typedef void (CALLTYPE* SetLanguagePtr)( sal_uInt16& nLanguage );
65cdf0e10cSrcweir typedef void (CALLTYPE* GetParamDesc)
66cdf0e10cSrcweir     (sal_uInt16& nNo, sal_uInt16& nParam, sal_Char* pName, sal_Char* pDesc );
67cdf0e10cSrcweir 
68cdf0e10cSrcweir typedef void (CALLTYPE* IsAsync) ( sal_uInt16&      nNo,
69cdf0e10cSrcweir                                    ParamType*   peType );
70cdf0e10cSrcweir typedef void (CALLTYPE* Advice)  ( sal_uInt16&      nNo,
71cdf0e10cSrcweir                                    AdvData&     pfCallback );
72cdf0e10cSrcweir typedef void (CALLTYPE* Unadvice)( double&      nHandle );
73cdf0e10cSrcweir 
74cdf0e10cSrcweir typedef void (CALLTYPE* FARPROC) ( void );
75cdf0e10cSrcweir 
76cdf0e10cSrcweir }
77cdf0e10cSrcweir 
78cdf0e10cSrcweir #if defined(OS2) && defined(BLC)
79cdf0e10cSrcweir #define GETFUNCTIONCOUNT        "_GetFunctionCount"
80cdf0e10cSrcweir #define GETFUNCTIONDATA         "_GetFunctionData"
81cdf0e10cSrcweir #define SETLANGUAGE             "_SetLanguage"
82cdf0e10cSrcweir #define GETPARAMDESC            "_GetParameterDescription"
83cdf0e10cSrcweir #define ISASYNC                 "_IsAsync"
84cdf0e10cSrcweir #define ADVICE                  "_Advice"
85cdf0e10cSrcweir #define UNADVICE                "_Unadvice"
86cdf0e10cSrcweir #else // Pascal oder extern "C"
87cdf0e10cSrcweir #define GETFUNCTIONCOUNT        "GetFunctionCount"
88cdf0e10cSrcweir #define GETFUNCTIONDATA         "GetFunctionData"
89cdf0e10cSrcweir #define SETLANGUAGE             "SetLanguage"
90cdf0e10cSrcweir #define GETPARAMDESC            "GetParameterDescription"
91cdf0e10cSrcweir #define ISASYNC                 "IsAsync"
92cdf0e10cSrcweir #define ADVICE                  "Advice"
93cdf0e10cSrcweir #define UNADVICE                "Unadvice"
94cdf0e10cSrcweir #endif
95cdf0e10cSrcweir 
96cdf0e10cSrcweir #define LIBFUNCNAME( name ) \
97cdf0e10cSrcweir     (String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( name ) ))
98cdf0e10cSrcweir 
99cdf0e10cSrcweir //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
100cdf0e10cSrcweir 
FuncData(const String & rIName)101cdf0e10cSrcweir FuncData::FuncData(const String& rIName) :
102cdf0e10cSrcweir     pModuleData     (NULL),
103cdf0e10cSrcweir     aInternalName   (rIName),
104cdf0e10cSrcweir //  aFuncName       (""),
105cdf0e10cSrcweir     nNumber         (0),
106cdf0e10cSrcweir     nParamCount     (0),
107cdf0e10cSrcweir     eAsyncType      (NONE)
108cdf0e10cSrcweir {
109cdf0e10cSrcweir     for (sal_uInt16 i = 0; i < MAXFUNCPARAM; i++)
110cdf0e10cSrcweir         eParamType[i] = PTR_DOUBLE;
111cdf0e10cSrcweir }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir //------------------------------------------------------------------------
114cdf0e10cSrcweir 
FuncData(const ModuleData * pModule,const String & rIName,const String & rFName,sal_uInt16 nNo,sal_uInt16 nCount,const ParamType * peType,ParamType eType)115cdf0e10cSrcweir FuncData::FuncData(const ModuleData*pModule,
116cdf0e10cSrcweir                    const String&    rIName,
117cdf0e10cSrcweir                    const String&    rFName,
118cdf0e10cSrcweir                          sal_uInt16 nNo,
119cdf0e10cSrcweir                     sal_uInt16  nCount,
120cdf0e10cSrcweir                    const ParamType* peType,
121cdf0e10cSrcweir                     ParamType  eType) :
122cdf0e10cSrcweir     pModuleData     (pModule),
123cdf0e10cSrcweir     aInternalName   (rIName),
124cdf0e10cSrcweir     aFuncName       (rFName),
125cdf0e10cSrcweir     nNumber         (nNo),
126cdf0e10cSrcweir     nParamCount     (nCount),
127cdf0e10cSrcweir     eAsyncType      (eType)
128cdf0e10cSrcweir {
129cdf0e10cSrcweir     for (sal_uInt16 i = 0; i < MAXFUNCPARAM; i++)
130cdf0e10cSrcweir         eParamType[i] = peType[i];
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
133cdf0e10cSrcweir //------------------------------------------------------------------------
134cdf0e10cSrcweir 
FuncData(const FuncData & rData)135cdf0e10cSrcweir FuncData::FuncData(const FuncData& rData) :
136cdf0e10cSrcweir     ScDataObject(),
137cdf0e10cSrcweir     pModuleData     (rData.pModuleData),
138cdf0e10cSrcweir     aInternalName   (rData.aInternalName),
139cdf0e10cSrcweir     aFuncName       (rData.aFuncName),
140cdf0e10cSrcweir     nNumber         (rData.nNumber),
141cdf0e10cSrcweir     nParamCount     (rData.nParamCount),
142cdf0e10cSrcweir     eAsyncType      (rData.eAsyncType)
143cdf0e10cSrcweir {
144cdf0e10cSrcweir     for (sal_uInt16 i = 0; i < MAXFUNCPARAM; i++)
145cdf0e10cSrcweir         eParamType[i] = rData.eParamType[i];
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
148cdf0e10cSrcweir //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
149cdf0e10cSrcweir 
Compare(ScDataObject * pKey1,ScDataObject * pKey2) const150cdf0e10cSrcweir short FuncCollection::Compare(ScDataObject* pKey1, ScDataObject* pKey2) const
151cdf0e10cSrcweir {
152cdf0e10cSrcweir     return (short) ScGlobal::GetpTransliteration()->compareString(
153cdf0e10cSrcweir         ((FuncData*)pKey1)->aInternalName, ((FuncData*)pKey2)->aInternalName );
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
156cdf0e10cSrcweir //------------------------------------------------------------------------
157cdf0e10cSrcweir 
SearchFunc(const String & rName,sal_uInt16 & rIndex) const158cdf0e10cSrcweir sal_Bool FuncCollection::SearchFunc( const String& rName, sal_uInt16& rIndex ) const
159cdf0e10cSrcweir {
160cdf0e10cSrcweir     FuncData aDataObj(rName);
161cdf0e10cSrcweir     return Search( &aDataObj, rIndex );
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
165cdf0e10cSrcweir class ModuleData : public ScDataObject
166cdf0e10cSrcweir {
167cdf0e10cSrcweir friend class ModuleCollection;
168cdf0e10cSrcweir     String      aName;
169cdf0e10cSrcweir     osl::Module* pInstance;
170cdf0e10cSrcweir public:
ModuleData(const String & rStr,osl::Module * pInst)171cdf0e10cSrcweir     ModuleData(const String& rStr, osl::Module* pInst) : aName (rStr), pInstance (pInst) {}
ModuleData(const ModuleData & rData)172cdf0e10cSrcweir     ModuleData(const ModuleData& rData) : ScDataObject(), aName (rData.aName) {pInstance = new osl::Module(aName);}
~ModuleData()173cdf0e10cSrcweir     ~ModuleData() { delete pInstance; }
Clone() const174cdf0e10cSrcweir     virtual ScDataObject*   Clone() const { return new ModuleData(*this); }
175cdf0e10cSrcweir 
GetName() const176cdf0e10cSrcweir     const   String&         GetName() const { return aName; }
GetInstance() const177cdf0e10cSrcweir             osl::Module*    GetInstance() const { return pInstance; }
FreeInstance()178cdf0e10cSrcweir             void            FreeInstance() { delete pInstance; pInstance = 0; }
179cdf0e10cSrcweir };
180cdf0e10cSrcweir 
181cdf0e10cSrcweir //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
182cdf0e10cSrcweir class ModuleCollection : public ScSortedCollection
183cdf0e10cSrcweir {
184cdf0e10cSrcweir public:
ModuleCollection(sal_uInt16 nLim=4,sal_uInt16 nDel=4,sal_Bool bDup=sal_False)185cdf0e10cSrcweir     ModuleCollection(sal_uInt16 nLim = 4, sal_uInt16 nDel = 4, sal_Bool bDup = sal_False) : ScSortedCollection ( nLim, nDel, bDup ) {}
ModuleCollection(const ModuleCollection & rModuleCollection)186cdf0e10cSrcweir     ModuleCollection(const ModuleCollection& rModuleCollection) : ScSortedCollection ( rModuleCollection ) {}
187cdf0e10cSrcweir 
Clone() const188cdf0e10cSrcweir     virtual ScDataObject*       Clone() const { return new ModuleCollection(*this); }
operator [](const sal_uInt16 nIndex) const189cdf0e10cSrcweir             ModuleData*     operator[]( const sal_uInt16 nIndex) const {return (ModuleData*)At(nIndex);}
190cdf0e10cSrcweir     virtual short           Compare(ScDataObject* pKey1, ScDataObject* pKey2) const;
191cdf0e10cSrcweir             sal_Bool            SearchModule( const String& rName,
192cdf0e10cSrcweir                                           const ModuleData*& rpModule ) const;
193cdf0e10cSrcweir };
194cdf0e10cSrcweir 
195cdf0e10cSrcweir static ModuleCollection aModuleCollection;
196cdf0e10cSrcweir 
197cdf0e10cSrcweir //------------------------------------------------------------------------
198cdf0e10cSrcweir 
Compare(ScDataObject * pKey1,ScDataObject * pKey2) const199cdf0e10cSrcweir short ModuleCollection::Compare(ScDataObject* pKey1, ScDataObject* pKey2) const
200cdf0e10cSrcweir {
201cdf0e10cSrcweir     return (short) ScGlobal::GetpTransliteration()->compareString(
202cdf0e10cSrcweir         ((ModuleData*)pKey1)->aName, ((ModuleData*)pKey2)->aName );
203cdf0e10cSrcweir }
204cdf0e10cSrcweir 
205cdf0e10cSrcweir //------------------------------------------------------------------------
206cdf0e10cSrcweir 
SearchModule(const String & rName,const ModuleData * & rpModule) const207cdf0e10cSrcweir sal_Bool ModuleCollection::SearchModule( const String& rName,
208cdf0e10cSrcweir                                      const ModuleData*& rpModule ) const
209cdf0e10cSrcweir {
210cdf0e10cSrcweir     sal_uInt16 nIndex;
211cdf0e10cSrcweir     ModuleData aSearchModule(rName, 0);
212cdf0e10cSrcweir     sal_Bool bFound = Search( &aSearchModule, nIndex );
213cdf0e10cSrcweir     if (bFound)
214cdf0e10cSrcweir         rpModule = (ModuleData*)At(nIndex);
215cdf0e10cSrcweir     else
216cdf0e10cSrcweir         rpModule = 0;
217cdf0e10cSrcweir     return bFound;
218cdf0e10cSrcweir }
219cdf0e10cSrcweir 
220cdf0e10cSrcweir //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
221cdf0e10cSrcweir 
InitExternalFunc(const rtl::OUString & rModuleName)222cdf0e10cSrcweir sal_Bool InitExternalFunc(const rtl::OUString& rModuleName)
223cdf0e10cSrcweir {
224cdf0e10cSrcweir     String aModuleName( rModuleName );
225cdf0e10cSrcweir 
226cdf0e10cSrcweir     // Module schon geladen?
227cdf0e10cSrcweir     const ModuleData* pTemp;
228cdf0e10cSrcweir     if (aModuleCollection.SearchModule(aModuleName, pTemp))
229cdf0e10cSrcweir         return sal_False;
230cdf0e10cSrcweir 
231cdf0e10cSrcweir     rtl::OUString aNP;
232cdf0e10cSrcweir     aNP = rModuleName;
233cdf0e10cSrcweir 
234cdf0e10cSrcweir     sal_Bool bRet = sal_False;
235cdf0e10cSrcweir     osl::Module* pLib = new osl::Module( aNP );
236cdf0e10cSrcweir     if (pLib->is())
237cdf0e10cSrcweir     {
238cdf0e10cSrcweir         FARPROC fpGetCount = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(GETFUNCTIONCOUNT));
239cdf0e10cSrcweir         FARPROC fpGetData = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(GETFUNCTIONDATA));
240cdf0e10cSrcweir         if ((fpGetCount != NULL) && (fpGetData != NULL))
241cdf0e10cSrcweir         {
242cdf0e10cSrcweir             FARPROC fpIsAsync = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(ISASYNC));
243cdf0e10cSrcweir             FARPROC fpAdvice = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(ADVICE));
244cdf0e10cSrcweir             FARPROC fpSetLanguage = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(SETLANGUAGE));
245cdf0e10cSrcweir             if ( fpSetLanguage )
246cdf0e10cSrcweir             {
247cdf0e10cSrcweir                 LanguageType eLanguage = Application::GetSettings().GetUILanguage();
248cdf0e10cSrcweir                 sal_uInt16 nLanguage = (sal_uInt16) eLanguage;
249cdf0e10cSrcweir                 (*((SetLanguagePtr)fpSetLanguage))( nLanguage );
250cdf0e10cSrcweir             }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir             // Module in die Collection aufnehmen
253cdf0e10cSrcweir             ModuleData* pModuleData = new ModuleData(aModuleName, pLib);
254cdf0e10cSrcweir             aModuleCollection.Insert(pModuleData);
255cdf0e10cSrcweir 
256cdf0e10cSrcweir             // Schnittstelle initialisieren
257cdf0e10cSrcweir             AdvData pfCallBack = &ScAddInAsyncCallBack;
258cdf0e10cSrcweir             FuncData* pFuncData;
259cdf0e10cSrcweir             FuncCollection* pFuncCol = ScGlobal::GetFuncCollection();
260cdf0e10cSrcweir             sal_uInt16 nCount;
261cdf0e10cSrcweir             (*((GetFuncCountPtr)fpGetCount))(nCount);
262cdf0e10cSrcweir             for (sal_uInt16 i=0; i < nCount; i++)
263cdf0e10cSrcweir             {
264cdf0e10cSrcweir                 sal_Char cFuncName[256];
265cdf0e10cSrcweir                 sal_Char cInternalName[256];
266cdf0e10cSrcweir                 sal_uInt16 nParamCount;
267cdf0e10cSrcweir                 ParamType eParamType[MAXFUNCPARAM];
268cdf0e10cSrcweir                 ParamType eAsyncType = NONE;
269cdf0e10cSrcweir                 // #62113# alles initialisieren, falls das AddIn sich schlecht verhaelt
270cdf0e10cSrcweir                 cFuncName[0] = 0;
271cdf0e10cSrcweir                 cInternalName[0] = 0;
272cdf0e10cSrcweir                 nParamCount = 0;
273cdf0e10cSrcweir                 for ( sal_uInt16 j=0; j<MAXFUNCPARAM; j++ )
274cdf0e10cSrcweir                 {
275cdf0e10cSrcweir                     eParamType[j] = NONE;
276cdf0e10cSrcweir                 }
277cdf0e10cSrcweir                 (*((GetFuncDataPtr)fpGetData))(i, cFuncName, nParamCount,
278cdf0e10cSrcweir                                                eParamType, cInternalName);
279cdf0e10cSrcweir                 if( fpIsAsync )
280cdf0e10cSrcweir                 {
281cdf0e10cSrcweir                     (*((IsAsync)fpIsAsync))(i, &eAsyncType);
282cdf0e10cSrcweir                     if ( fpAdvice && eAsyncType != NONE )
283cdf0e10cSrcweir                         (*((Advice)fpAdvice))( i, pfCallBack );
284cdf0e10cSrcweir                 }
285cdf0e10cSrcweir                 String aInternalName( cInternalName, osl_getThreadTextEncoding() );
286cdf0e10cSrcweir                 String aFuncName( cFuncName, osl_getThreadTextEncoding() );
287cdf0e10cSrcweir                 pFuncData = new FuncData( pModuleData,
288cdf0e10cSrcweir                                           aInternalName,
289cdf0e10cSrcweir                                           aFuncName,
290cdf0e10cSrcweir                                           i,
291cdf0e10cSrcweir                                           nParamCount,
292cdf0e10cSrcweir                                           eParamType,
293cdf0e10cSrcweir                                           eAsyncType );
294cdf0e10cSrcweir                 pFuncCol->Insert(pFuncData);
295cdf0e10cSrcweir             }
296cdf0e10cSrcweir             bRet = sal_True;
297cdf0e10cSrcweir         }
298cdf0e10cSrcweir         else
299cdf0e10cSrcweir             delete pLib;
300cdf0e10cSrcweir     }
301cdf0e10cSrcweir     else
302cdf0e10cSrcweir         delete pLib;
303cdf0e10cSrcweir     return bRet;
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir //------------------------------------------------------------------------
307cdf0e10cSrcweir 
ExitExternalFunc()308cdf0e10cSrcweir void ExitExternalFunc()
309cdf0e10cSrcweir {
310cdf0e10cSrcweir     sal_uInt16 nCount = aModuleCollection.GetCount();
311cdf0e10cSrcweir     for (sal_uInt16 i=0; i<nCount; i++)
312cdf0e10cSrcweir     {
313cdf0e10cSrcweir         ModuleData* pData = aModuleCollection[i];
314cdf0e10cSrcweir         pData->FreeInstance();
315cdf0e10cSrcweir     }
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir //------------------------------------------------------------------------
319cdf0e10cSrcweir 
Call(void ** ppParam)320cdf0e10cSrcweir sal_Bool FuncData::Call(void** ppParam)
321cdf0e10cSrcweir {
322cdf0e10cSrcweir     sal_Bool bRet = sal_False;
323cdf0e10cSrcweir     osl::Module* pLib = pModuleData->GetInstance();
324cdf0e10cSrcweir     FARPROC fProc = (FARPROC)pLib->getFunctionSymbol(aFuncName);
325cdf0e10cSrcweir     if (fProc != NULL)
326cdf0e10cSrcweir     {
327cdf0e10cSrcweir         switch (nParamCount)
328cdf0e10cSrcweir         {
329cdf0e10cSrcweir             case 1 :
330cdf0e10cSrcweir                 (*((ExFuncPtr1)fProc))(ppParam[0]);
331cdf0e10cSrcweir                 bRet = sal_True;
332cdf0e10cSrcweir                 break;
333cdf0e10cSrcweir             case 2 :
334cdf0e10cSrcweir                 (*((ExFuncPtr2)fProc))(ppParam[0], ppParam[1]);
335cdf0e10cSrcweir                 bRet = sal_True;
336cdf0e10cSrcweir                 break;
337cdf0e10cSrcweir             case 3 :
338cdf0e10cSrcweir                 (*((ExFuncPtr3)fProc))(ppParam[0], ppParam[1], ppParam[2]);
339cdf0e10cSrcweir                 bRet = sal_True;
340cdf0e10cSrcweir                 break;
341cdf0e10cSrcweir             case 4 :
342cdf0e10cSrcweir                 (*((ExFuncPtr4)fProc))(ppParam[0], ppParam[1], ppParam[2], ppParam[3]);
343cdf0e10cSrcweir                 bRet = sal_True;
344cdf0e10cSrcweir                 break;
345cdf0e10cSrcweir             case 5 :
346cdf0e10cSrcweir                 (*((ExFuncPtr5)fProc))(ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4]);
347cdf0e10cSrcweir                 bRet = sal_True;
348cdf0e10cSrcweir                 break;
349cdf0e10cSrcweir             case 6 :
350cdf0e10cSrcweir                 (*((ExFuncPtr6)fProc))(ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5]);
351cdf0e10cSrcweir                 bRet = sal_True;
352cdf0e10cSrcweir                 break;
353cdf0e10cSrcweir             case 7 :
354cdf0e10cSrcweir                 (*((ExFuncPtr7)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
355cdf0e10cSrcweir                                         ppParam[6]);
356cdf0e10cSrcweir                 bRet = sal_True;
357cdf0e10cSrcweir                 break;
358cdf0e10cSrcweir             case 8 :
359cdf0e10cSrcweir                 (*((ExFuncPtr8)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
360cdf0e10cSrcweir                                         ppParam[6], ppParam[7]);
361cdf0e10cSrcweir                 bRet = sal_True;
362cdf0e10cSrcweir                 break;
363cdf0e10cSrcweir             case 9 :
364cdf0e10cSrcweir                 (*((ExFuncPtr9)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
365cdf0e10cSrcweir                                         ppParam[6], ppParam[7], ppParam[8]);
366cdf0e10cSrcweir                 bRet = sal_True;
367cdf0e10cSrcweir                 break;
368cdf0e10cSrcweir             case 10 :
369cdf0e10cSrcweir                 (*((ExFuncPtr10)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
370cdf0e10cSrcweir                                         ppParam[6], ppParam[7], ppParam[8], ppParam[9]);
371cdf0e10cSrcweir                 bRet = sal_True;
372cdf0e10cSrcweir                 break;
373cdf0e10cSrcweir             case 11 :
374cdf0e10cSrcweir                 (*((ExFuncPtr11)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
375cdf0e10cSrcweir                                         ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10]);
376cdf0e10cSrcweir                 bRet = sal_True;
377cdf0e10cSrcweir                 break;
378cdf0e10cSrcweir             case 12:
379cdf0e10cSrcweir                 (*((ExFuncPtr12)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
380cdf0e10cSrcweir                                         ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11]);
381cdf0e10cSrcweir                 bRet = sal_True;
382cdf0e10cSrcweir                 break;
383cdf0e10cSrcweir             case 13:
384cdf0e10cSrcweir                 (*((ExFuncPtr13)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
385cdf0e10cSrcweir                                         ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11],
386cdf0e10cSrcweir                                         ppParam[12]);
387cdf0e10cSrcweir                 bRet = sal_True;
388cdf0e10cSrcweir                 break;
389cdf0e10cSrcweir             case 14 :
390cdf0e10cSrcweir                 (*((ExFuncPtr14)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
391cdf0e10cSrcweir                                         ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11],
392cdf0e10cSrcweir                                         ppParam[12], ppParam[13]);
393cdf0e10cSrcweir                 bRet = sal_True;
394cdf0e10cSrcweir                 break;
395cdf0e10cSrcweir             case 15 :
396cdf0e10cSrcweir                 (*((ExFuncPtr15)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
397cdf0e10cSrcweir                                         ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11],
398cdf0e10cSrcweir                                         ppParam[12], ppParam[13], ppParam[14]);
399cdf0e10cSrcweir                 bRet = sal_True;
400cdf0e10cSrcweir                 break;
401cdf0e10cSrcweir             case 16 :
402cdf0e10cSrcweir                 (*((ExFuncPtr16)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5],
403cdf0e10cSrcweir                                         ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11],
404cdf0e10cSrcweir                                         ppParam[12], ppParam[13], ppParam[14], ppParam[15]);
405cdf0e10cSrcweir                 bRet = sal_True;
406cdf0e10cSrcweir                 break;
407cdf0e10cSrcweir             default : break;
408cdf0e10cSrcweir         }
409cdf0e10cSrcweir     }
410cdf0e10cSrcweir     return bRet;
411cdf0e10cSrcweir }
412cdf0e10cSrcweir 
413cdf0e10cSrcweir //------------------------------------------------------------------------
414cdf0e10cSrcweir 
Unadvice(double nHandle)415cdf0e10cSrcweir sal_Bool FuncData::Unadvice( double nHandle )
416cdf0e10cSrcweir {
417cdf0e10cSrcweir     sal_Bool bRet = sal_False;
418cdf0e10cSrcweir     osl::Module* pLib = pModuleData->GetInstance();
419cdf0e10cSrcweir     FARPROC fProc = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(UNADVICE));
420cdf0e10cSrcweir     if (fProc != NULL)
421cdf0e10cSrcweir     {
422cdf0e10cSrcweir         ((::Unadvice)fProc)(nHandle);
423cdf0e10cSrcweir         bRet = sal_True;
424cdf0e10cSrcweir     }
425cdf0e10cSrcweir     return bRet;
426cdf0e10cSrcweir }
427cdf0e10cSrcweir 
428cdf0e10cSrcweir //------------------------------------------------------------------------
429cdf0e10cSrcweir 
GetModuleName() const430cdf0e10cSrcweir const String& FuncData::GetModuleName() const
431cdf0e10cSrcweir {
432cdf0e10cSrcweir     // DBG_ASSERT( pModuleData, "Keine Arme, keine Kekse" ):
433cdf0e10cSrcweir     return pModuleData->GetName();
434cdf0e10cSrcweir }
435cdf0e10cSrcweir 
436cdf0e10cSrcweir //------------------------------------------------------------------------
437cdf0e10cSrcweir 
GetParamDesc(String & aName,String & aDesc,sal_uInt16 nParam)438cdf0e10cSrcweir sal_Bool FuncData::GetParamDesc( String& aName, String& aDesc, sal_uInt16 nParam )
439cdf0e10cSrcweir {
440cdf0e10cSrcweir     sal_Bool bRet = sal_False;
441cdf0e10cSrcweir     if ( nParam <= nParamCount )
442cdf0e10cSrcweir     {
443cdf0e10cSrcweir         osl::Module* pLib = pModuleData->GetInstance();
444cdf0e10cSrcweir         FARPROC fProc = (FARPROC) pLib->getFunctionSymbol( LIBFUNCNAME(GETPARAMDESC) );
445cdf0e10cSrcweir         if ( fProc != NULL )
446cdf0e10cSrcweir         {
447cdf0e10cSrcweir             sal_Char pcName[256];
448cdf0e10cSrcweir             sal_Char pcDesc[256];
449cdf0e10cSrcweir             *pcName = *pcDesc = 0;
450cdf0e10cSrcweir             sal_uInt16 nFuncNo = nNumber;   // nicht per Reference versauen lassen..
451cdf0e10cSrcweir             ((::GetParamDesc)fProc)( nFuncNo, nParam, pcName, pcDesc );
452cdf0e10cSrcweir             aName = String( pcName, osl_getThreadTextEncoding() );
453cdf0e10cSrcweir             aDesc = String( pcDesc, osl_getThreadTextEncoding() );
454cdf0e10cSrcweir             bRet = sal_True;
455cdf0e10cSrcweir         }
456cdf0e10cSrcweir     }
457cdf0e10cSrcweir     if ( !bRet )
458cdf0e10cSrcweir     {
459cdf0e10cSrcweir         aName.Erase();
460cdf0e10cSrcweir         aDesc.Erase();
461cdf0e10cSrcweir     }
462cdf0e10cSrcweir     return bRet;
463cdf0e10cSrcweir }
464