mib19: #163327# Implemented RTL function CallByName
diff --git a/basic/source/inc/runtime.hxx b/basic/source/inc/runtime.hxx
index 6ca6920..8859739 100644
--- a/basic/source/inc/runtime.hxx
+++ b/basic/source/inc/runtime.hxx
@@ -276,6 +276,8 @@ struct RefSaveItem

class SbiRuntime
{
    friend void SbRtl_CallByName( StarBASIC* pBasic, SbxArray& rPar, BOOL bWrite );

    typedef void( SbiRuntime::*pStep0 )();
    typedef void( SbiRuntime::*pStep1 )( UINT32 nOp1 );
    typedef void( SbiRuntime::*pStep2 )( UINT32 nOp1, UINT32 nOp2 );
diff --git a/basic/source/runtime/methods1.cxx b/basic/source/runtime/methods1.cxx
old mode 100644
new mode 100755
index 62e9c38..9785f84
--- a/basic/source/runtime/methods1.cxx
+++ b/basic/source/runtime/methods1.cxx
@@ -120,6 +120,126 @@ static Reference< XCalendar > getLocaleCalendar( void )
    return xCalendar;
}

RTLFUNC(CallByName)
{
    (void)pBasic;
    (void)bWrite;

    const INT16 vbGet       = 2;
    const INT16 vbLet       = 4;
    const INT16 vbMethod    = 1;
    const INT16 vbSet       = 8;

    // At least 3 parameter needed plus function itself -> 4
    USHORT nParCount = rPar.Count();
    if ( nParCount < 4 )
    {
        StarBASIC::Error( SbERR_BAD_ARGUMENT );
        return;
    }

    // 1. parameter is object
    SbxBase* pObjVar = (SbxObject*)rPar.Get(1)->GetObject();
    SbxObject* pObj = NULL;
    if( pObjVar )
        pObj = PTR_CAST(SbxObject,pObjVar);
    if( !pObj && pObjVar && pObjVar->ISA(SbxVariable) )
    {
        SbxBase* pObjVarObj = ((SbxVariable*)pObjVar)->GetObject();
        pObj = PTR_CAST(SbxObject,pObjVarObj);
    }
    if( !pObj )
    {
        StarBASIC::Error( SbERR_BAD_PARAMETER );
        return;
    }

    // 2. parameter is ProcedureName
    String aNameStr = rPar.Get(2)->GetString();

    // 3. parameter is CallType
    INT16 nCallType = rPar.Get(3)->GetInteger();

    //SbxObject* pFindObj = NULL;
    SbxVariable* pFindVar = pObj->Find( aNameStr, SbxCLASS_DONTCARE );
    if( pFindVar == NULL )
    {
        StarBASIC::Error( SbERR_PROC_UNDEFINED );
        return;
    }

    switch( nCallType )
    {
        case vbGet:
            {
                SbxValues aVals;
                aVals.eType = SbxVARIANT;
                pFindVar->Get( aVals );

                SbxVariableRef refVar = rPar.Get(0);
                refVar->Put( aVals );
            }
            break;
        case vbLet:
        case vbSet:
            {
                if ( nParCount != 5 )
                {
                    StarBASIC::Error( SbERR_BAD_ARGUMENT );
                    return;
                }
                SbxVariableRef pValVar = rPar.Get(4);
                if( nCallType == vbLet )
                {
                    SbxValues aVals;
                    aVals.eType = SbxVARIANT;
                    pValVar->Get( aVals );
                    pFindVar->Put( aVals );
                }
                else
                {
                    SbxVariableRef rFindVar = pFindVar;
                    SbiInstance* pInst = pINST;
                    SbiRuntime* pRT = pInst ? pInst->pRun : NULL;
                    if( pRT != NULL )
                        pRT->StepSET_Impl( pValVar, rFindVar, false );
                }
            }
            break;
        case vbMethod:
            {
                SbMethod* pMeth = PTR_CAST(SbMethod,pFindVar);
                if( pMeth == NULL )
                {
                    StarBASIC::Error( SbERR_PROC_UNDEFINED );
                    return;
                }

                // Setup parameters
                SbxArrayRef xArray;
                sal_Int32 nMethParamCount = nParCount - 4;
                if( nMethParamCount > 0 )
                {
                    xArray = new SbxArray;
                    for( sal_Int32 i = 0 ; i < nMethParamCount ; i++ )
                    {
                        SbxVariable* pPar = rPar.Get( i + 4 );
                        xArray->Put( pPar, sal::static_int_cast< USHORT >(i+1) );
                    }
                }

                // Call method
                SbxVariableRef refVar = rPar.Get(0);
                if( xArray.Is() )
                    pMeth->SetParameters( xArray );
                pMeth->Call( refVar );
                pMeth->SetParameters( NULL );
            }
            break;
        default:
            StarBASIC::Error( SbERR_PROC_UNDEFINED );
    }
}

RTLFUNC(CBool) // JSM
{
diff --git a/basic/source/runtime/rtlproto.hxx b/basic/source/runtime/rtlproto.hxx
index 5437654..a05db9d 100644
--- a/basic/source/runtime/rtlproto.hxx
+++ b/basic/source/runtime/rtlproto.hxx
@@ -271,6 +271,7 @@ extern RTLFUNC(AboutStarBasic);
extern RTLFUNC(LoadPicture);
extern RTLFUNC(SavePicture);

extern RTLFUNC(CallByName);
extern RTLFUNC(CBool); // JSM
extern RTLFUNC(CByte); // JSM
extern RTLFUNC(CCur); // JSM
diff --git a/basic/source/runtime/stdobj.cxx b/basic/source/runtime/stdobj.cxx
index 4455901..c7ca576 100644
--- a/basic/source/runtime/stdobj.cxx
+++ b/basic/source/runtime/stdobj.cxx
@@ -94,6 +94,10 @@ static Methods aMethods[] = {
{ "Blue",        SbxINTEGER,   1 | _FUNCTION, RTLNAME(Blue),0               },
  { "RGB-Value",     SbxLONG, 0,NULL,0 },

{ "CallByName",     SbxVARIANT,   3 | _FUNCTION, RTLNAME(CallByName),0 },
  { "Object",       SbxOBJECT,  0,NULL,0 },
  { "ProcedureName",SbxSTRING,  0,NULL,0 },
  { "CallType",     SbxINTEGER, 0,NULL,0 },
{ "CBool",          SbxBOOL,      1 | _FUNCTION, RTLNAME(CBool),0           },
  { "expression",   SbxVARIANT, 0,NULL,0 },
{ "CByte",          SbxBYTE,      1 | _FUNCTION, RTLNAME(CByte),0           },