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

Generated by: LCOV version 1.10