LCOV - code coverage report
Current view: top level - scaddins/source/pricing - pricing.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 167 302 55.3 %
Date: 2015-06-13 12:38:46 Functions: 38 56 67.9 %
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             : // pricing functions add in
      21             : 
      22             : // all of the UNO add-in technical details have been copied from
      23             : // ../datefunc/datefunc.cxx
      24             : 
      25             : #include "pricing.hxx"
      26             : #include "black_scholes.hxx"
      27             : #include "pricing.hrc"
      28             : 
      29             : #include <cppuhelper/factory.hxx>
      30             : #include <cppuhelper/supportsservice.hxx>
      31             : #include <iostream>
      32             : #include <osl/diagnose.h>
      33             : #include <rtl/math.hxx>
      34             : #include <rtl/ustrbuf.hxx>
      35             : #include <tools/rcid.h>
      36             : #include <tools/resmgr.hxx>
      37             : 
      38             : using namespace ::com::sun::star;
      39             : using namespace sca::pricing;
      40             : 
      41             : 
      42             : #define ADDIN_SERVICE           "com.sun.star.sheet.AddIn"
      43             : #define MY_SERVICE              "com.sun.star.sheet.addin.PricingFunctions"
      44             : #define MY_IMPLNAME             "com.sun.star.sheet.addin.PricingFunctionsImpl"
      45             : 
      46             : #define STR_FROM_ANSI( s )      OUString( s, strlen( s ), RTL_TEXTENCODING_MS_1252 )
      47             : 
      48             : const sal_uInt32 ScaList::nStartSize = 16;
      49             : const sal_uInt32 ScaList::nIncrSize = 16;
      50             : 
      51          60 : ScaList::ScaList() :
      52          60 :     pData( new void*[ nStartSize ] ),
      53             :     nSize( nStartSize ),
      54             :     nCount( 0 ),
      55         120 :     nCurr( 0 )
      56             : {
      57          60 : }
      58             : 
      59          50 : ScaList::~ScaList()
      60             : {
      61          50 :     delete[] pData;
      62          50 : }
      63             : 
      64           0 : void ScaList::_Grow()
      65             : {
      66           0 :     nSize += nIncrSize;
      67             : 
      68           0 :     void** pNewData = new void*[ nSize ];
      69           0 :     memcpy( pNewData, pData, nCount * sizeof( void* ) );
      70             : 
      71           0 :     delete[] pData;
      72           0 :     pData = pNewData;
      73           0 : }
      74             : 
      75          80 : ScaStringList::~ScaStringList()
      76             : {
      77          80 :     for( OUString* pStr = First(); pStr; pStr = Next() )
      78          40 :         delete pStr;
      79          40 : }
      80             : 
      81        3072 : ScaResId::ScaResId( sal_uInt16 nId, ResMgr& rResMgr ) :
      82        3072 :     ResId( nId, rResMgr )
      83             : {
      84        3072 : }
      85             : 
      86             : #define UNIQUE              false   // function name does not exist in Calc
      87             : 
      88             : #define STDPAR              false   // all parameters are described
      89             : 
      90             : #define FUNCDATA( FuncName, ParamCount, Category, Double, IntPar )  \
      91             :     { "get" #FuncName, PRICING_FUNCNAME_##FuncName, PRICING_FUNCDESC_##FuncName, PRICING_DEFFUNCNAME_##FuncName, ParamCount, Category, Double, IntPar }
      92             : 
      93             : const ScaFuncDataBase pFuncDataArr[] =
      94             : {
      95             :    FUNCDATA( OptBarrier,       13, ScaCat_Finance,    UNIQUE,  STDPAR),
      96             :    FUNCDATA( OptTouch,         11, ScaCat_Finance,    UNIQUE,  STDPAR),
      97             :    FUNCDATA( OptProbHit,        6, ScaCat_Finance,    UNIQUE,  STDPAR),
      98             :    FUNCDATA( OptProbInMoney,    8, ScaCat_Finance,    UNIQUE,  STDPAR)
      99             : };
     100             : 
     101             : #undef FUNCDATA
     102             : 
     103          48 : ScaFuncData::ScaFuncData( const ScaFuncDataBase& rBaseData, ResMgr& rResMgr ) :
     104             :     aIntName( OUString::createFromAscii( rBaseData.pIntName ) ),
     105             :     nUINameID( rBaseData.nUINameID ),
     106             :     nDescrID( rBaseData.nDescrID ),
     107             :     nCompListID( rBaseData.nCompListID ),
     108             :     nParamCount( rBaseData.nParamCount ),
     109             :     eCat( rBaseData.eCat ),
     110             :     bDouble( rBaseData.bDouble ),
     111          48 :     bWithOpt( rBaseData.bWithOpt )
     112             : {
     113          48 :     ScaResStringArrLoader aArrLoader( RID_PRICING_DEFFUNCTION_NAMES, nCompListID, rResMgr );
     114          48 :     const ResStringArray& rArr = aArrLoader.GetStringArray();
     115             : 
     116          96 :     for( sal_uInt32 nIndex = 0; nIndex < rArr.Count(); nIndex++ )
     117          96 :         aCompList.Append( rArr.GetString( nIndex ) );
     118          48 : }
     119             : 
     120          80 : ScaFuncData::~ScaFuncData()
     121             : {
     122          80 : }
     123             : 
     124         912 : sal_uInt16 ScaFuncData::GetStrIndex( sal_uInt16 nParam ) const
     125             : {
     126         912 :     if( !bWithOpt )
     127         912 :         nParam++;
     128         912 :     return (nParam > nParamCount) ? (nParamCount * 2) : (nParam * 2);
     129             : }
     130             : 
     131          12 : ScaFuncDataList::ScaFuncDataList( ResMgr& rResMgr ) :
     132          12 :     nLast( 0xFFFFFFFF )
     133             : {
     134          60 :     for( sal_uInt16 nIndex = 0; nIndex < SAL_N_ELEMENTS(pFuncDataArr); nIndex++ )
     135          48 :         Append( new ScaFuncData( pFuncDataArr[ nIndex ], rResMgr ) );
     136          12 : }
     137             : 
     138          30 : ScaFuncDataList::~ScaFuncDataList()
     139             : {
     140          50 :     for( ScaFuncData* pFData = First(); pFData; pFData = Next() )
     141          40 :         delete pFData;
     142          20 : }
     143             : 
     144        1060 : const ScaFuncData* ScaFuncDataList::Get( const OUString& rProgrammaticName ) const
     145             : {
     146        1060 :     if( aLastName == rProgrammaticName ){
     147        1008 :         return Get( nLast );
     148             :     }
     149             : 
     150         130 :     for( sal_uInt32 nIndex = 0; nIndex < Count(); nIndex++ )
     151             :     {
     152         130 :         const ScaFuncData* pCurr = Get( nIndex );
     153         130 :         if( pCurr->Is( rProgrammaticName ) )
     154             :         {
     155          52 :             const_cast< ScaFuncDataList* >( this )->aLastName = rProgrammaticName;
     156          52 :             const_cast< ScaFuncDataList* >( this )->nLast = nIndex;
     157          52 :             return pCurr;
     158             :         }
     159             :     }
     160           0 :     return NULL;
     161             : }
     162             : 
     163         960 : ScaFuncRes::ScaFuncRes( ResId& rResId, ResMgr& rResMgr, sal_uInt16 nIndex, OUString& rRet ) :
     164         960 :     Resource( rResId )
     165             : {
     166         960 :     rRet = ScaResId(nIndex, rResMgr).toString();
     167         960 :     FreeResource();
     168         960 : }
     169             : 
     170             : // entry points for service registration / instantiation
     171          13 : uno::Reference< uno::XInterface > SAL_CALL ScaPricingAddIn_CreateInstance(
     172             :         const uno::Reference< lang::XMultiServiceFactory >& )
     173             : {
     174          13 :     return static_cast<cppu::OWeakObject*>(new ScaPricingAddIn());
     175             : }
     176             : 
     177             : extern "C" {
     178             : 
     179          13 : SAL_DLLPUBLIC_EXPORT void * SAL_CALL pricing_component_getFactory(
     180             :     const sal_Char * pImplName, void * pServiceManager, void * /*pRegistryKey*/ )
     181             : {
     182          13 :     void* pRet = 0;
     183             : 
     184          65 :     if ( pServiceManager &&
     185          65 :             OUString::createFromAscii( pImplName ) == ScaPricingAddIn::getImplementationName_Static() )
     186             :     {
     187             :         uno::Reference< lang::XSingleServiceFactory > xFactory( cppu::createOneInstanceFactory(
     188             :                 static_cast< lang::XMultiServiceFactory* >( pServiceManager ),
     189             :                 ScaPricingAddIn::getImplementationName_Static(),
     190             :                 ScaPricingAddIn_CreateInstance,
     191          13 :                 ScaPricingAddIn::getSupportedServiceNames_Static() ) );
     192             : 
     193          13 :         if (xFactory.is())
     194             :         {
     195          13 :             xFactory->acquire();
     196          13 :             pRet = xFactory.get();
     197          13 :         }
     198             :     }
     199             : 
     200          13 :     return pRet;
     201             : }
     202             : 
     203             : }   // extern C
     204             : 
     205             : //  "normal" service implementation
     206          13 : ScaPricingAddIn::ScaPricingAddIn() :
     207             :     pDefLocales( NULL ),
     208             :     pResMgr( NULL ),
     209          13 :     pFuncDataList( NULL )
     210             : {
     211          13 : }
     212             : 
     213          33 : ScaPricingAddIn::~ScaPricingAddIn()
     214             : {
     215          11 :     delete pFuncDataList;
     216          11 :     delete pResMgr;
     217          11 :     delete[] pDefLocales;
     218          22 : }
     219             : 
     220             : static const sal_Char*  pLang[] = { "de", "en" };
     221             : static const sal_Char*  pCoun[] = { "DE", "US" };
     222             : static const sal_uInt32 nNumOfLoc = SAL_N_ELEMENTS( pLang );
     223             : 
     224           1 : void ScaPricingAddIn::InitDefLocales()
     225             : {
     226           1 :     pDefLocales = new lang::Locale[ nNumOfLoc ];
     227             : 
     228           3 :     for( sal_uInt32 nIndex = 0; nIndex < nNumOfLoc; nIndex++ )
     229             :     {
     230           2 :         pDefLocales[ nIndex ].Language = OUString::createFromAscii( pLang[ nIndex ] );
     231           2 :         pDefLocales[ nIndex ].Country = OUString::createFromAscii( pCoun[ nIndex ] );
     232             :     }
     233           1 : }
     234             : 
     235           4 : const lang::Locale& ScaPricingAddIn::GetLocale( sal_uInt32 nIndex )
     236             : {
     237           4 :     if( !pDefLocales )
     238           1 :         InitDefLocales();
     239             : 
     240           4 :     return (nIndex < sizeof( pLang )) ? pDefLocales[ nIndex ] : aFuncLoc;
     241             : }
     242             : 
     243        2928 : ResMgr& ScaPricingAddIn::GetResMgr() throw( uno::RuntimeException )
     244             : {
     245        2928 :     if( !pResMgr )
     246             :     {
     247           0 :         InitData();     // try to get resource manager
     248           0 :         if( !pResMgr )
     249           0 :             throw uno::RuntimeException();
     250             :     }
     251        2928 :     return *pResMgr;
     252             : }
     253             : 
     254          12 : void ScaPricingAddIn::InitData()
     255             : {
     256          12 :     delete pResMgr;
     257          12 :     pResMgr = ResMgr::CreateResMgr("pricing", LanguageTag( aFuncLoc) );
     258          12 :     delete pFuncDataList;
     259             : 
     260          12 :     pFuncDataList = pResMgr ? new ScaFuncDataList( *pResMgr ) : NULL;
     261             : 
     262          12 :     if( pDefLocales )
     263             :     {
     264           0 :         delete pDefLocales;
     265           0 :         pDefLocales = NULL;
     266             :     }
     267          12 : }
     268             : 
     269          48 : OUString ScaPricingAddIn::GetDisplFuncStr( sal_uInt16 nResId ) throw( uno::RuntimeException )
     270             : {
     271          48 :     return ScaResStringLoader( RID_PRICING_FUNCTION_NAMES, nResId, GetResMgr() ).GetString();
     272             : }
     273             : 
     274         960 : OUString ScaPricingAddIn::GetFuncDescrStr( sal_uInt16 nResId, sal_uInt16 nStrIndex ) throw( uno::RuntimeException )
     275             : {
     276         960 :     OUString aRet;
     277             : 
     278        1920 :     ScaResPublisher aResPubl( ScaResId( RID_PRICING_FUNCTION_DESCRIPTIONS, GetResMgr() ) );
     279         960 :     ScaResId aResId( nResId, GetResMgr() );
     280         960 :     aResId.SetRT( RSC_RESOURCE );
     281             : 
     282         960 :     if( aResPubl.IsAvailableRes( aResId ) )
     283         960 :         ScaFuncRes aSubRes( aResId, GetResMgr(), nStrIndex, aRet );
     284             : 
     285         960 :     aResPubl.FreeResource();
     286        1920 :     return aRet;
     287             : }
     288             : 
     289          27 : OUString ScaPricingAddIn::getImplementationName_Static()
     290             : {
     291          27 :     return OUString( MY_IMPLNAME );
     292             : }
     293             : 
     294          14 : uno::Sequence< OUString > ScaPricingAddIn::getSupportedServiceNames_Static()
     295             : {
     296          14 :     uno::Sequence< OUString > aRet( 2 );
     297          14 :     OUString* pArray = aRet.getArray();
     298          14 :     pArray[0] = ADDIN_SERVICE;
     299          14 :     pArray[1] = MY_SERVICE;
     300          14 :     return aRet;
     301             : }
     302             : 
     303             : // XServiceName
     304          12 : OUString SAL_CALL ScaPricingAddIn::getServiceName() throw( uno::RuntimeException, std::exception )
     305             : {
     306             :     // name of specific AddIn service
     307          12 :     return OUString( MY_SERVICE );
     308             : }
     309             : 
     310             : // XServiceInfo
     311           1 : OUString SAL_CALL ScaPricingAddIn::getImplementationName() throw( uno::RuntimeException, std::exception )
     312             : {
     313           1 :     return getImplementationName_Static();
     314             : }
     315             : 
     316           0 : sal_Bool SAL_CALL ScaPricingAddIn::supportsService( const OUString& aServiceName ) throw( uno::RuntimeException, std::exception )
     317             : {
     318           0 :     return cppu::supportsService(this, aServiceName);
     319             : }
     320             : 
     321           1 : uno::Sequence< OUString > SAL_CALL ScaPricingAddIn::getSupportedServiceNames() throw( uno::RuntimeException, std::exception )
     322             : {
     323           1 :     return getSupportedServiceNames_Static();
     324             : }
     325             : 
     326             : // XLocalizable
     327          12 : void SAL_CALL ScaPricingAddIn::setLocale( const lang::Locale& eLocale ) throw( uno::RuntimeException, std::exception )
     328             : {
     329          12 :     aFuncLoc = eLocale;
     330          12 :     InitData();     // change of locale invalidates resources!
     331          12 : }
     332             : 
     333           0 : lang::Locale SAL_CALL ScaPricingAddIn::getLocale() throw( uno::RuntimeException, std::exception )
     334             : {
     335           0 :     return aFuncLoc;
     336             : }
     337             : 
     338             : // function descriptions start here
     339             : // XAddIn
     340           0 : OUString SAL_CALL ScaPricingAddIn::getProgrammaticFuntionName( const OUString& ) throw( uno::RuntimeException, std::exception )
     341             : {
     342             :     //  not used by calc
     343             :     //  (but should be implemented for other uses of the AddIn service)
     344           0 :     return OUString();
     345             : }
     346             : 
     347          48 : OUString SAL_CALL ScaPricingAddIn::getDisplayFunctionName( const OUString& aProgrammaticName ) throw( uno::RuntimeException, std::exception )
     348             : {
     349          48 :     OUString aRet;
     350             : 
     351          48 :     const ScaFuncData* pFData = pFuncDataList->Get( aProgrammaticName );
     352          48 :     if( pFData )
     353             :     {
     354          48 :         aRet = GetDisplFuncStr( pFData->GetUINameID() );
     355          48 :         if( pFData->IsDouble() )
     356           0 :             aRet += STR_FROM_ANSI( "_ADD" );
     357             :     }
     358             :     else
     359             :     {
     360           0 :         aRet = STR_FROM_ANSI( "UNKNOWNFUNC_" );
     361           0 :         aRet += aProgrammaticName;
     362             :     }
     363             : 
     364          48 :     return aRet;
     365             : }
     366             : 
     367          48 : OUString SAL_CALL ScaPricingAddIn::getFunctionDescription( const OUString& aProgrammaticName ) throw( uno::RuntimeException, std::exception )
     368             : {
     369          48 :     OUString aRet;
     370             : 
     371          48 :     const ScaFuncData* pFData = pFuncDataList->Get( aProgrammaticName );
     372          48 :     if( pFData )
     373          48 :         aRet = GetFuncDescrStr( pFData->GetDescrID(), 1 );
     374             : 
     375          48 :     return aRet;
     376             : }
     377             : 
     378         456 : OUString SAL_CALL ScaPricingAddIn::getDisplayArgumentName(
     379             :         const OUString& aProgrammaticName, sal_Int32 nArgument ) throw( uno::RuntimeException, std::exception )
     380             : {
     381         456 :     OUString aRet;
     382             : 
     383         456 :     const ScaFuncData* pFData = pFuncDataList->Get( aProgrammaticName );
     384         456 :     if( pFData && (nArgument <= 0xFFFF) )
     385             :     {
     386         456 :         sal_uInt16 nStr = pFData->GetStrIndex( static_cast< sal_uInt16 >( nArgument ) );
     387         456 :         if( nStr )
     388         456 :             aRet = GetFuncDescrStr( pFData->GetDescrID(), nStr );
     389             :         else
     390           0 :             aRet = STR_FROM_ANSI( "internal" );
     391             :     }
     392             : 
     393         456 :     return aRet;
     394             : }
     395             : 
     396         456 : OUString SAL_CALL ScaPricingAddIn::getArgumentDescription(
     397             :         const OUString& aProgrammaticName, sal_Int32 nArgument ) throw( uno::RuntimeException, std::exception )
     398             : {
     399         456 :     OUString aRet;
     400             : 
     401         456 :     const ScaFuncData* pFData = pFuncDataList->Get( aProgrammaticName );
     402         456 :     if( pFData && (nArgument <= 0xFFFF) )
     403             :     {
     404         456 :         sal_uInt16 nStr = pFData->GetStrIndex( static_cast< sal_uInt16 >( nArgument ) );
     405         456 :         if( nStr )
     406         456 :             aRet = GetFuncDescrStr( pFData->GetDescrID(), nStr + 1 );
     407             :         else
     408           0 :             aRet = STR_FROM_ANSI( "for internal use only" );
     409             :     }
     410             : 
     411         456 :     return aRet;
     412             : }
     413             : 
     414          48 : OUString SAL_CALL ScaPricingAddIn::getProgrammaticCategoryName(
     415             :         const OUString& aProgrammaticName ) throw( uno::RuntimeException, std::exception )
     416             : {
     417          48 :     OUString aRet;
     418             : 
     419          48 :     const ScaFuncData* pFData = pFuncDataList->Get( aProgrammaticName );
     420          48 :     if( pFData )
     421             :     {
     422          48 :         switch( pFData->GetCategory() )
     423             :         {
     424           0 :             case ScaCat_DateTime:   aRet = STR_FROM_ANSI( "Date&Time" );    break;
     425           0 :             case ScaCat_Text:       aRet = STR_FROM_ANSI( "Text" );         break;
     426          48 :             case ScaCat_Finance:    aRet = STR_FROM_ANSI( "Financial" );    break;
     427           0 :             case ScaCat_Inf:        aRet = STR_FROM_ANSI( "Information" );  break;
     428           0 :             case ScaCat_Math:       aRet = STR_FROM_ANSI( "Mathematical" ); break;
     429           0 :             case ScaCat_Tech:       aRet = STR_FROM_ANSI( "Technical" );    break;
     430             :             // coverity[dead_error_begin] - following conditions exist to avoid compiler warning
     431             :             default:
     432           0 :                 break;
     433             :         }
     434             :     }
     435             : 
     436          48 :     if( aRet.isEmpty() )
     437           0 :         aRet = STR_FROM_ANSI( "Add-In" );
     438          48 :     return aRet;
     439             : }
     440             : 
     441           0 : OUString SAL_CALL ScaPricingAddIn::getDisplayCategoryName(
     442             :         const OUString& aProgrammaticName ) throw( uno::RuntimeException, std::exception )
     443             : {
     444           0 :     return getProgrammaticCategoryName( aProgrammaticName );
     445             : }
     446             : 
     447             : // XCompatibilityNames
     448           4 : uno::Sequence< sheet::LocalizedName > SAL_CALL ScaPricingAddIn::getCompatibilityNames(
     449             :         const OUString& aProgrammaticName ) throw( uno::RuntimeException, std::exception )
     450             : {
     451           4 :     const ScaFuncData* pFData = pFuncDataList->Get( aProgrammaticName );
     452           4 :     if( !pFData )
     453           0 :         return uno::Sequence< sheet::LocalizedName >( 0 );
     454             : 
     455           4 :     const ScaStringList& rStrList = pFData->GetCompNameList();
     456           4 :     sal_uInt32 nCount = rStrList.Count();
     457             : 
     458           4 :     uno::Sequence< sheet::LocalizedName > aRet( nCount );
     459           4 :     sheet::LocalizedName* pArray = aRet.getArray();
     460             : 
     461           8 :     for( sal_uInt32 nIndex = 0; nIndex < nCount; nIndex++ )
     462           4 :         pArray[ nIndex ] = sheet::LocalizedName( GetLocale( nIndex ), *rStrList.Get( nIndex ) );
     463             : 
     464           4 :     return aRet;
     465             : }
     466             : 
     467             : // actual function implementation starts here
     468             : // auxiliary input handling functions
     469             : namespace {
     470             : 
     471           0 : bool getinput_putcall(bs::types::PutCall& pc, const OUString& str) {
     472           0 :     if(str.startsWith("c")) {
     473           0 :         pc=bs::types::Call;
     474           0 :     } else if(str.startsWith("p")) {
     475           0 :         pc=bs::types::Put;
     476             :     } else {
     477           0 :         return false;
     478             :     }
     479           0 :     return true;
     480             : }
     481             : 
     482           0 : bool getinput_putcall(bs::types::PutCall& pc, const uno::Any& anyval) {
     483           0 :     OUString str;
     484           0 :     if(anyval.getValueTypeClass() == uno::TypeClass_STRING) {
     485           0 :         anyval >>= str;
     486           0 :     } else if(anyval.getValueTypeClass() == uno::TypeClass_VOID) {
     487           0 :         str="c";        // call as default
     488             :     } else {
     489           0 :         return false;
     490             :     }
     491           0 :     return getinput_putcall(pc, str);
     492             : }
     493             : 
     494           0 : bool getinput_strike(double& strike, const uno::Any& anyval) {
     495           0 :     if(anyval.getValueTypeClass() == uno::TypeClass_DOUBLE) {
     496           0 :         anyval >>= strike;
     497           0 :     } else if(anyval.getValueTypeClass() == uno::TypeClass_VOID) {
     498           0 :         strike=-1.0;        // -1 as default (means not set)
     499             :     } else {
     500           0 :         return false;
     501             :     }
     502           0 :     return true;
     503             : }
     504             : 
     505           0 : bool getinput_inout(bs::types::BarrierKIO& kio, const OUString& str) {
     506           0 :     if(str.startsWith("i")) {
     507           0 :         kio=bs::types::KnockIn;
     508           0 :     } else if(str.startsWith("o")) {
     509           0 :         kio=bs::types::KnockOut;
     510             :     } else {
     511           0 :         return false;
     512             :     }
     513           0 :     return true;
     514             : }
     515             : 
     516           0 : bool getinput_barrier(bs::types::BarrierActive& cont, const OUString& str) {
     517           0 :     if(str.startsWith("c")) {
     518           0 :         cont=bs::types::Continuous;
     519           0 :     } else if(str.startsWith("e")) {
     520           0 :         cont=bs::types::Maturity;
     521             :     } else {
     522           0 :         return false;
     523             :     }
     524           0 :     return true;
     525             : }
     526             : 
     527           0 : bool getinput_fordom(bs::types::ForDom& fd, const OUString& str) {
     528           0 :     if(str.startsWith("f")) {
     529           0 :         fd=bs::types::Foreign;
     530           0 :     } else if(str.startsWith("d")) {
     531           0 :         fd=bs::types::Domestic;
     532             :     } else {
     533           0 :         return false;
     534             :     }
     535           0 :     return true;
     536             : }
     537             : 
     538           0 : bool getinput_greek(bs::types::Greeks& greek, const uno::Any& anyval) {
     539           0 :     OUString str;
     540           0 :     if(anyval.getValueTypeClass() == uno::TypeClass_STRING) {
     541           0 :         anyval >>= str;
     542           0 :     } else if(anyval.getValueTypeClass() == uno::TypeClass_VOID) {
     543           0 :         str="value";
     544             :     } else {
     545           0 :         return false;
     546             :     }
     547             : 
     548           0 :     if(str == "value" || str == "price" || str == "v" || str == "p") {
     549           0 :         greek=bs::types::Value;
     550           0 :     } else if(str == "delta" || str == "d") {
     551           0 :         greek=bs::types::Delta;
     552           0 :     } else if(str == "gamma" || str == "g") {
     553           0 :         greek=bs::types::Gamma;
     554           0 :     } else if(str == "theta" || str == "t") {
     555           0 :         greek=bs::types::Theta;
     556           0 :     } else if(str == "vega" || str == "e") {
     557           0 :         greek=bs::types::Vega;
     558           0 :     } else if(str == "volga" || str == "o") {
     559           0 :         greek=bs::types::Volga;
     560           0 :     } else if(str == "vanna" || str == "a") {
     561           0 :         greek=bs::types::Vanna;
     562           0 :     } else if(str == "rho" || str == "r") {
     563           0 :         greek=bs::types::Rho_d;
     564           0 :     } else if(str == "rhof" || str == "f") {
     565           0 :         greek=bs::types::Rho_f;
     566             :     } else {
     567           0 :         return false;
     568             :     }
     569           0 :     return true;
     570             : }
     571             : 
     572             : } // namespace for auxiliary functions
     573             : 
     574             : // OPT_BARRIER(...)
     575           0 : double SAL_CALL ScaPricingAddIn::getOptBarrier( double spot, double vol,
     576             :             double r, double rf, double T, double strike,
     577             :             double barrier_low, double barrier_up, double rebate,
     578             :             const OUString& put_call, const OUString& in_out,
     579             :             const OUString& barriercont, const uno::Any& greekstr ) throw( uno::RuntimeException, lang::IllegalArgumentException, std::exception )
     580             : {
     581             :     bs::types::PutCall pc;
     582             :     bs::types::BarrierKIO kio;
     583             :     bs::types::BarrierActive bcont;
     584             :     bs::types::Greeks greek;
     585             :     // read and check input values
     586           0 :     if( spot<=0.0 || vol<=0.0 || T<0.0 || strike<0.0 ||
     587           0 :                 !getinput_putcall(pc,put_call) ||
     588           0 :                 !getinput_inout(kio,in_out) ||
     589           0 :                 !getinput_barrier(bcont,barriercont) ||
     590           0 :                 !getinput_greek(greek,greekstr) ){
     591           0 :         throw lang::IllegalArgumentException();
     592             :     }
     593             : 
     594             :     double fRet=bs::barrier(spot,vol,r,rf,T,strike, barrier_low,barrier_up,
     595           0 :                             rebate,pc,kio,bcont,greek);
     596             : 
     597           0 :     RETURN_FINITE( fRet );
     598             : }
     599             : 
     600             : // OPT_TOUCH(...)
     601           0 : double SAL_CALL ScaPricingAddIn::getOptTouch( double spot, double vol,
     602             :             double r, double rf, double T,
     603             :             double barrier_low, double barrier_up,
     604             :             const OUString& for_dom, const OUString& in_out,
     605             :             const OUString& barriercont, const uno::Any& greekstr ) throw( uno::RuntimeException, lang::IllegalArgumentException, std::exception )
     606             : {
     607             :     bs::types::ForDom fd;
     608             :     bs::types::BarrierKIO kio;
     609             :     bs::types::BarrierActive bcont;
     610             :     bs::types::Greeks greek;
     611             :     // read and check input values
     612           0 :     if( spot<=0.0 || vol<=0.0 || T<0.0 ||
     613           0 :                 !getinput_fordom(fd,for_dom) ||
     614           0 :                 !getinput_inout(kio,in_out) ||
     615           0 :                 !getinput_barrier(bcont,barriercont) ||
     616           0 :                 !getinput_greek(greek,greekstr) ){
     617           0 :         throw lang::IllegalArgumentException();
     618             :     }
     619             : 
     620             :     double fRet=bs::touch(spot,vol,r,rf,T,barrier_low,barrier_up,
     621           0 :                             fd,kio,bcont,greek);
     622             : 
     623           0 :     RETURN_FINITE( fRet );
     624             : }
     625             : 
     626             : // OPT_PRB_HIT(...)
     627           0 : double SAL_CALL ScaPricingAddIn::getOptProbHit( double spot, double vol,
     628             :             double mu, double T,
     629             :             double barrier_low, double barrier_up ) throw( uno::RuntimeException, lang::IllegalArgumentException, std::exception )
     630             : {
     631             :     // read and check input values
     632           0 :     if( spot<=0.0 || vol<=0.0 || T<0.0 ) {
     633           0 :         throw lang::IllegalArgumentException();
     634             :     }
     635             : 
     636           0 :     double fRet=bs::prob_hit(spot,vol,mu,T,barrier_low,barrier_up);
     637             : 
     638           0 :     RETURN_FINITE( fRet );
     639             : }
     640             : 
     641             : // OPT_PROB_INMONEY(...)
     642           0 : double SAL_CALL ScaPricingAddIn::getOptProbInMoney( double spot, double vol,
     643             :             double mu, double T,
     644             :             double barrier_low, double barrier_up,
     645             :             const uno::Any& strikeval, const uno::Any& put_call ) throw( uno::RuntimeException, lang::IllegalArgumentException, std::exception )
     646             : {
     647           0 :     bs::types::PutCall pc=bs::types::Call;
     648             :     double  K;
     649             : 
     650             :     // read and check input values
     651           0 :     if( spot<=0.0 || vol<=0.0 || T<0.0 ||
     652           0 :             !getinput_putcall(pc,put_call) ||
     653           0 :             !getinput_strike(K,strikeval) ) {
     654           0 :         throw lang::IllegalArgumentException();
     655             :     }
     656             : 
     657           0 :     double fRet=bs::prob_in_money(spot,vol,mu,T,K,barrier_low,barrier_up,pc);
     658             : 
     659           0 :     RETURN_FINITE( fRet );
     660          39 : }
     661             : 
     662             : 
     663             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11