LCOV - code coverage report
Current view: top level - libreoffice/sc/source/core/tool - callform.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 12 189 6.3 %
Date: 2012-12-27 Functions: 8 26 30.8 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10