diff options
Diffstat (limited to 'sc/source/core/tool/callform.cxx')
-rw-r--r-- | sc/source/core/tool/callform.cxx | 469 |
1 files changed, 469 insertions, 0 deletions
diff --git a/sc/source/core/tool/callform.cxx b/sc/source/core/tool/callform.cxx new file mode 100644 index 000000000000..e8e2b28f3f8e --- /dev/null +++ b/sc/source/core/tool/callform.cxx @@ -0,0 +1,469 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +// INCLUDE --------------------------------------------------------------- +#include <vcl/svapp.hxx> +#include <osl/module.hxx> +#include <osl/file.hxx> +#include <unotools/transliterationwrapper.hxx> + +#include "callform.hxx" +#include "global.hxx" +#include "adiasync.hxx" + +//------------------------------------------------------------------------ + +extern "C" { + +typedef void (CALLTYPE* ExFuncPtr1)(void*); +typedef void (CALLTYPE* ExFuncPtr2)(void*, void*); +typedef void (CALLTYPE* ExFuncPtr3)(void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr4)(void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr5)(void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr6)(void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr7)(void*, void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr8)(void*, void*, void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr9)(void*, void*, void*, void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr10)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr11)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr12)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr13)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr14)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr15)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); +typedef void (CALLTYPE* ExFuncPtr16)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); + +typedef void (CALLTYPE* GetFuncCountPtr)(USHORT& nCount); +typedef void (CALLTYPE* GetFuncDataPtr) + (USHORT& nNo, sal_Char* pFuncName, USHORT& nParamCount, ParamType* peType, sal_Char* pInternalName); + +typedef void (CALLTYPE* SetLanguagePtr)( USHORT& nLanguage ); +typedef void (CALLTYPE* GetParamDesc) + (USHORT& nNo, USHORT& nParam, sal_Char* pName, sal_Char* pDesc ); + +typedef void (CALLTYPE* IsAsync) ( USHORT& nNo, + ParamType* peType ); +typedef void (CALLTYPE* Advice) ( USHORT& nNo, + AdvData& pfCallback ); +typedef void (CALLTYPE* Unadvice)( double& nHandle ); + +typedef void (CALLTYPE* FARPROC) ( void ); + +} + +#if defined(OS2) && defined(BLC) +#define GETFUNCTIONCOUNT "_GetFunctionCount" +#define GETFUNCTIONDATA "_GetFunctionData" +#define SETLANGUAGE "_SetLanguage" +#define GETPARAMDESC "_GetParameterDescription" +#define ISASYNC "_IsAsync" +#define ADVICE "_Advice" +#define UNADVICE "_Unadvice" +#else // Pascal oder extern "C" +#define GETFUNCTIONCOUNT "GetFunctionCount" +#define GETFUNCTIONDATA "GetFunctionData" +#define SETLANGUAGE "SetLanguage" +#define GETPARAMDESC "GetParameterDescription" +#define ISASYNC "IsAsync" +#define ADVICE "Advice" +#define UNADVICE "Unadvice" +#endif + +#define LIBFUNCNAME( name ) \ + (String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( name ) )) + +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +FuncData::FuncData(const String& rIName) : + pModuleData (NULL), + aInternalName (rIName), +// aFuncName (""), + nNumber (0), + nParamCount (0), + eAsyncType (NONE) +{ + for (USHORT i = 0; i < MAXFUNCPARAM; i++) + eParamType[i] = PTR_DOUBLE; +} + +//------------------------------------------------------------------------ + +FuncData::FuncData(const ModuleData*pModule, + const String& rIName, + const String& rFName, + USHORT nNo, + USHORT nCount, + const ParamType* peType, + ParamType eType) : + pModuleData (pModule), + aInternalName (rIName), + aFuncName (rFName), + nNumber (nNo), + nParamCount (nCount), + eAsyncType (eType) +{ + for (USHORT i = 0; i < MAXFUNCPARAM; i++) + eParamType[i] = peType[i]; +} + +//------------------------------------------------------------------------ + +FuncData::FuncData(const FuncData& rData) : + ScDataObject(), + pModuleData (rData.pModuleData), + aInternalName (rData.aInternalName), + aFuncName (rData.aFuncName), + nNumber (rData.nNumber), + nParamCount (rData.nParamCount), + eAsyncType (rData.eAsyncType) +{ + for (USHORT i = 0; i < MAXFUNCPARAM; i++) + eParamType[i] = rData.eParamType[i]; +} + +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +short FuncCollection::Compare(ScDataObject* pKey1, ScDataObject* pKey2) const +{ + return (short) ScGlobal::GetpTransliteration()->compareString( + ((FuncData*)pKey1)->aInternalName, ((FuncData*)pKey2)->aInternalName ); +} + +//------------------------------------------------------------------------ + +BOOL FuncCollection::SearchFunc( const String& rName, USHORT& rIndex ) const +{ + FuncData aDataObj(rName); + return Search( &aDataObj, rIndex ); +} + +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +class ModuleData : public ScDataObject +{ +friend class ModuleCollection; + String aName; + osl::Module* pInstance; +public: + ModuleData(const String& rStr, osl::Module* pInst) : aName (rStr), pInstance (pInst) {} + ModuleData(const ModuleData& rData) : ScDataObject(), aName (rData.aName) {pInstance = new osl::Module(aName);} + ~ModuleData() { delete pInstance; } + virtual ScDataObject* Clone() const { return new ModuleData(*this); } + + const String& GetName() const { return aName; } + osl::Module* GetInstance() const { return pInstance; } + void FreeInstance() { delete pInstance; pInstance = 0; } +}; + +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +class ModuleCollection : public ScSortedCollection +{ +public: + ModuleCollection(USHORT nLim = 4, USHORT nDel = 4, BOOL bDup = FALSE) : ScSortedCollection ( nLim, nDel, bDup ) {} + ModuleCollection(const ModuleCollection& rModuleCollection) : ScSortedCollection ( rModuleCollection ) {} + + virtual ScDataObject* Clone() const { return new ModuleCollection(*this); } + ModuleData* operator[]( const USHORT nIndex) const {return (ModuleData*)At(nIndex);} + virtual short Compare(ScDataObject* pKey1, ScDataObject* pKey2) const; + BOOL SearchModule( const String& rName, + const ModuleData*& rpModule ) const; +}; + +static ModuleCollection aModuleCollection; + +//------------------------------------------------------------------------ + +short ModuleCollection::Compare(ScDataObject* pKey1, ScDataObject* pKey2) const +{ + return (short) ScGlobal::GetpTransliteration()->compareString( + ((ModuleData*)pKey1)->aName, ((ModuleData*)pKey2)->aName ); +} + +//------------------------------------------------------------------------ + +BOOL ModuleCollection::SearchModule( const String& rName, + const ModuleData*& rpModule ) const +{ + USHORT nIndex; + ModuleData aSearchModule(rName, 0); + BOOL bFound = Search( &aSearchModule, nIndex ); + if (bFound) + rpModule = (ModuleData*)At(nIndex); + else + rpModule = 0; + return bFound; +} + +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +BOOL InitExternalFunc(const rtl::OUString& rModuleName) +{ + String aModuleName( rModuleName ); + + // Module schon geladen? + const ModuleData* pTemp; + if (aModuleCollection.SearchModule(aModuleName, pTemp)) + return FALSE; + + rtl::OUString aNP; + aNP = rModuleName; + + BOOL bRet = FALSE; + osl::Module* pLib = new osl::Module( aNP ); + if (pLib->is()) + { + FARPROC fpGetCount = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(GETFUNCTIONCOUNT)); + FARPROC fpGetData = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(GETFUNCTIONDATA)); + if ((fpGetCount != NULL) && (fpGetData != NULL)) + { + FARPROC fpIsAsync = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(ISASYNC)); + FARPROC fpAdvice = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(ADVICE)); + FARPROC fpSetLanguage = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(SETLANGUAGE)); + if ( fpSetLanguage ) + { + LanguageType eLanguage = Application::GetSettings().GetUILanguage(); + USHORT nLanguage = (USHORT) eLanguage; + (*((SetLanguagePtr)fpSetLanguage))( nLanguage ); + } + + // Module in die Collection aufnehmen + ModuleData* pModuleData = new ModuleData(aModuleName, pLib); + aModuleCollection.Insert(pModuleData); + + // Schnittstelle initialisieren + AdvData pfCallBack = &ScAddInAsyncCallBack; + FuncData* pFuncData; + FuncCollection* pFuncCol = ScGlobal::GetFuncCollection(); + USHORT nCount; + (*((GetFuncCountPtr)fpGetCount))(nCount); + for (USHORT i=0; i < nCount; i++) + { + sal_Char cFuncName[256]; + sal_Char cInternalName[256]; + USHORT nParamCount; + ParamType eParamType[MAXFUNCPARAM]; + ParamType eAsyncType = NONE; + // #62113# alles initialisieren, falls das AddIn sich schlecht verhaelt + cFuncName[0] = 0; + cInternalName[0] = 0; + nParamCount = 0; + for ( USHORT j=0; j<MAXFUNCPARAM; j++ ) + { + eParamType[j] = NONE; + } + (*((GetFuncDataPtr)fpGetData))(i, cFuncName, nParamCount, + eParamType, cInternalName); + if( fpIsAsync ) + { + (*((IsAsync)fpIsAsync))(i, &eAsyncType); + if ( fpAdvice && eAsyncType != NONE ) + (*((Advice)fpAdvice))( i, pfCallBack ); + } + String aInternalName( cInternalName, osl_getThreadTextEncoding() ); + String aFuncName( cFuncName, osl_getThreadTextEncoding() ); + pFuncData = new FuncData( pModuleData, + aInternalName, + aFuncName, + i, + nParamCount, + eParamType, + eAsyncType ); + pFuncCol->Insert(pFuncData); + } + bRet = TRUE; + } + else + delete pLib; + } + else + delete pLib; + return bRet; +} + +//------------------------------------------------------------------------ + +void ExitExternalFunc() +{ + USHORT nCount = aModuleCollection.GetCount(); + for (USHORT i=0; i<nCount; i++) + { + ModuleData* pData = aModuleCollection[i]; + pData->FreeInstance(); + } +} + +//------------------------------------------------------------------------ + +BOOL FuncData::Call(void** ppParam) +{ + BOOL bRet = FALSE; + osl::Module* pLib = pModuleData->GetInstance(); + FARPROC fProc = (FARPROC)pLib->getFunctionSymbol(aFuncName); + if (fProc != NULL) + { + switch (nParamCount) + { + case 1 : + (*((ExFuncPtr1)fProc))(ppParam[0]); + bRet = TRUE; + break; + case 2 : + (*((ExFuncPtr2)fProc))(ppParam[0], ppParam[1]); + bRet = TRUE; + break; + case 3 : + (*((ExFuncPtr3)fProc))(ppParam[0], ppParam[1], ppParam[2]); + bRet = TRUE; + break; + case 4 : + (*((ExFuncPtr4)fProc))(ppParam[0], ppParam[1], ppParam[2], ppParam[3]); + bRet = TRUE; + break; + case 5 : + (*((ExFuncPtr5)fProc))(ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4]); + bRet = TRUE; + break; + case 6 : + (*((ExFuncPtr6)fProc))(ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5]); + bRet = TRUE; + break; + case 7 : + (*((ExFuncPtr7)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6]); + bRet = TRUE; + break; + case 8 : + (*((ExFuncPtr8)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6], ppParam[7]); + bRet = TRUE; + break; + case 9 : + (*((ExFuncPtr9)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6], ppParam[7], ppParam[8]); + bRet = TRUE; + break; + case 10 : + (*((ExFuncPtr10)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6], ppParam[7], ppParam[8], ppParam[9]); + bRet = TRUE; + break; + case 11 : + (*((ExFuncPtr11)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10]); + bRet = TRUE; + break; + case 12: + (*((ExFuncPtr12)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11]); + bRet = TRUE; + break; + case 13: + (*((ExFuncPtr13)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11], + ppParam[12]); + bRet = TRUE; + break; + case 14 : + (*((ExFuncPtr14)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11], + ppParam[12], ppParam[13]); + bRet = TRUE; + break; + case 15 : + (*((ExFuncPtr15)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11], + ppParam[12], ppParam[13], ppParam[14]); + bRet = TRUE; + break; + case 16 : + (*((ExFuncPtr16)fProc))( ppParam[0], ppParam[1], ppParam[2], ppParam[3], ppParam[4], ppParam[5], + ppParam[6], ppParam[7], ppParam[8], ppParam[9], ppParam[10], ppParam[11], + ppParam[12], ppParam[13], ppParam[14], ppParam[15]); + bRet = TRUE; + break; + default : break; + } + } + return bRet; +} + +//------------------------------------------------------------------------ + +BOOL FuncData::Unadvice( double nHandle ) +{ + BOOL bRet = FALSE; + osl::Module* pLib = pModuleData->GetInstance(); + FARPROC fProc = (FARPROC)pLib->getFunctionSymbol(LIBFUNCNAME(UNADVICE)); + if (fProc != NULL) + { + ((::Unadvice)fProc)(nHandle); + bRet = TRUE; + } + return bRet; +} + +//------------------------------------------------------------------------ + +const String& FuncData::GetModuleName() const +{ + // DBG_ASSERT( pModuleData, "Keine Arme, keine Kekse" ): + return pModuleData->GetName(); +} + +//------------------------------------------------------------------------ + +BOOL FuncData::GetParamDesc( String& aName, String& aDesc, USHORT nParam ) +{ + BOOL bRet = FALSE; + if ( nParam <= nParamCount ) + { + osl::Module* pLib = pModuleData->GetInstance(); + FARPROC fProc = (FARPROC) pLib->getFunctionSymbol( LIBFUNCNAME(GETPARAMDESC) ); + if ( fProc != NULL ) + { + sal_Char pcName[256]; + sal_Char pcDesc[256]; + *pcName = *pcDesc = 0; + USHORT nFuncNo = nNumber; // nicht per Reference versauen lassen.. + ((::GetParamDesc)fProc)( nFuncNo, nParam, pcName, pcDesc ); + aName = String( pcName, osl_getThreadTextEncoding() ); + aDesc = String( pcDesc, osl_getThreadTextEncoding() ); + bRet = TRUE; + } + } + if ( !bRet ) + { + aName.Erase(); + aDesc.Erase(); + } + return bRet; +} + + |