Hi there,

still wanting to make sure that this is an error/issue with OOo, hence
trying to get at an example that uses only genuine OOo Basic and plain
Java.

The following two little programs demonstrate, that invoking an OOo
Basic function via the "XDispatchHelper.executeDispatch(...)" method
unexplainably adds a Boolean value (true) to the list of arguments meant
for the script function.

-------------- cut here --------------

import com.sun.star.beans.PropertyValue;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XDispatchHelper;
import com.sun.star.frame.XDispatchProvider;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.frame.DispatchResultEvent;

class TestBasic {
    public static void main (String args[]) {
        // excerpted from "HardFormatting.java" from the OOo development package
        XDesktop              xDesktop = null;
        XMultiComponentFactory xMCF     = null;
        XMultiServiceFactory   xMSF     = null;

        try {
            XComponentContext xContext = null;

            // bootstrap the UNO runtime environment
            xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();

            // get the service manager
            xMCF = xContext.getServiceManager();
            xMSF = (XMultiServiceFactory) 
UnoRuntime.queryInterface(XMultiServiceFactory.class, xMCF);

            if (xMSF!=null)
            {
                System.out.println("Connected to a running office ...");

                // get XDispatchProvider from XDesktop
                Object oDesktop = 
xMSF.createInstance("com.sun.star.frame.Desktop");
                xDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class, 
oDesktop);
                XDispatchProvider xDispatchProvider=(XDispatchProvider)
                        UnoRuntime.queryInterface(XDispatchProvider.class, 
xDesktop);


                Object sDispatchHelper= 
xMSF.createInstance("com.sun.star.frame.DispatchHelper");
                XDispatchHelper xDispatchHelper=(XDispatchHelper)
                        UnoRuntime.queryInterface(XDispatchHelper.class, 
sDispatchHelper);


                // define arguments
                PropertyValue propValue=new PropertyValue();
                propValue.Name="arg1";              // not used, but what the 
heck
                propValue.Value=sDispatchHelper;    // an UNO object (could be 
an UNO IDL string instead

                *PropertyValue parameters[]={propValue}; // ONE argument only 
for the Basic function!*

                // invoke the ooRexx script to document the UNO object/IDL
                // Bug in OOo? Location should be "user", however one must use 
"application" instead
                String location="application"; // "user" or "share" or 
"application"
                String 
macroUrl="vnd.sun.star.script:Standard.Module1.RgfFuncTest?language=Basic&location="
                    +location;

                // dispatch, supplying arguments
                DispatchResultEvent dre=(DispatchResultEvent)
                      xDispatchHelper.executeDispatch(
                            xDispatchProvider,  // XDispatchProvider
                            macroUrl,           // URL
                            "",                 // TargetFrameName
                            0,                  // SearchFlags
                            parameters);        // Arguments

                System.out.println("Returned from executing dispatch, 
Result=["+dre.Result+"], State=["+dre.State+"]");
            }
        }
        catch( Exception e) {
            e.printStackTrace(System.err);
            System.exit(1);
        }

        System.err.println("Successful run.");
        System.exit(0);
    }
}

-------------- cut here --------------

Just add the following Basic code to the user area ("My Macros") to the
library "Standard" and there in the module named "Module1":

-------------- cut here --------------

    function RgfFuncTest (arg1 as variant, optional arg2, optional arg3)
        dim str as string
        vblf=chr$(10)
        str="(some Basic datatypes: 0=Empty, 2=Integer, 8=String, 9=Object, 
11=Boolean)" & vblf

        str=str & vblf & "isMissing(arg1)=" & isMissing(arg1)
        if not isMissing(arg1) then
           str=str & ", value="
           if isObject(arg1) then
              str=str & "some" & typeName(arg1)
           else
              str=str & arg1
           end if
           str=str & ", datatype=" & varType(arg1)
        end if

        str=str & vblf & "isMissing(arg2)=" & isMissing(arg2)
        if not isMissing(arg2) then
           str=str & ", value=" & arg2 & ", datatype=" & varType(arg2)
        end if

        str=str & vblf & "isMissing(arg3)=" & isMissing(arg3)
        if not isMissing(arg3) then
           str=str & ", value=" & arg3 & ", datatype=" & varType(arg3)
        end if

        MsgBox str, 0, "RgfFuncTest()"

        RgfFuncTest=str
    end function


-------------- cut here --------------

[BTW, please note that there seems to be an error in this area, as from
outside of Basic one must denote "application" rather than the correct
"user" as the location.]

Compiling and running the Java program above will cause a message box to
popup (needs to be closed by the user, or just comment the
MsgBox-instruction), and at the end of the run will display the result's
value (the result of the Basic function):

-------------- cut here --------------

F:\test\ooo\studenten\diplarbeit\scholz\20090108>java TestBasic
Connected to a running office ...
Returned from executing dispatch, Result=[(some Basic datatypes: 0=Empty, 
2=Integer, 8=String, 9=Object, 11=Boolean)

isMissing(arg1)=False, value=someObject, datatype=9
isMissing(arg2)=False, value=True, datatype=11
isMissing(arg3)=True], State=[1]
Successful run.

-------------- cut here --------------

As you can see, the Basic function gets TWO arguments, instead of only
one. The last argument is of type Boolean and has a value of "True".

Any comments/hints/explanations now that only "genuine" OOo
functionality is used? Does this qualify as a bug?

Regards,

---rony





Rony G. Flatscher (Apache) wrote:
> Hi there,
>
> not sure whether "dev@openoffice.org" would be the "better" list for
> this question, hence cc:'ing it, but reply-to is set to point to
> "d...@api.openoffice.org". Please advise, if another e-mail-list would be
> better.
>
> rony wrote:
>   
>> Hi there,
>>
>> it seems that if using XDispatchHelper.executeDisptatch(...) from Java
>> the argument list (fifth argument being an array of type PropertyValue)
>> gets a Boolean entry appended (that is always set to true). Is that
>> truly the case? (If so, where would that be documented?)
>>
>> Using OOo 3.0.0 (O300m9, build:9358) and the Java interface to OOo to
>> invoke "executeDispatch()". Online documentation
>> <http://api.openoffice.org/docs/common/ref/com/sun/star/frame/XDispatchHelper.html#executeDispatch>,
>> looking up Parameter "Arguments".
>>
>> TIA,
>>
>> ---rony
>>
>>   
>>     
> Maybe this was not enough information, so:
>
>     * Using XDispatchHelpter.executeDispatch(...), allows one to supply
>       five arguments, the last argument being an array of PropertyValues,
>     * Using the OOo scripting framework, the method "invoke(Object[]
>       aParams, short[][] aOutParamIndex, Object[][] aOutParams)" of the
>       "com.sun.star.script.framework.provider.XXX.ScriptProviderForXXX" 
>       class is invoked (where "XXX" stands for the scripting language
>       this class will serve).
>           o "aParams" will have always one argument more than supplied
>             by "XDispatchHelpter.executeDispatch(...)", and that
>             argument is of type Boolean (in my case always set to "true".
>
> Here's an example Java code that employs
> "XDispatchHelper.executeDispatch(...)":
>
> ----------------- cut here ----------------
>
> // ---rgf, 2009-02-11, Java program to invoke "createApiInfo.rex" from Java
>
> import com.sun.star.beans.PropertyValue;
> import com.sun.star.frame.XComponentLoader;
> import com.sun.star.frame.XDesktop;
> import com.sun.star.frame.XDispatchHelper;
> import com.sun.star.frame.XDispatchProvider;
> import com.sun.star.lang.XMultiComponentFactory;
> import com.sun.star.lang.XMultiServiceFactory;
> import com.sun.star.uno.UnoRuntime;
> import com.sun.star.uno.XComponentContext;
> import com.sun.star.frame.DispatchResultEvent;
>
> class TestCreateApiInfo {
>     public static void main (String args[]) {
>         // excerpted from "HardFormatting.java" from the OOo development 
> package
>         XDesktop              xDesktop = null;
>         XMultiComponentFactory xMCF     = null;
>         XMultiServiceFactory   xMSF     = null;
>
>         try {
>             XComponentContext xContext = null;
>
>             // bootstrap the UNO runtime environment
>             xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
>
>             // get the service manager
>             xMCF = xContext.getServiceManager();
>             xMSF = (XMultiServiceFactory) 
> UnoRuntime.queryInterface(XMultiServiceFactory.class, xMCF);
>
>             if (xMSF!=null)
>             {
>                 System.out.println("Connected to a running office ...");
>
>                 // get XDispatchProvider from XDesktop
>                 Object oDesktop = 
> xMSF.createInstance("com.sun.star.frame.Desktop");
>                 xDesktop = (XDesktop) 
> UnoRuntime.queryInterface(XDesktop.class, oDesktop);
>                 XDispatchProvider xDispatchProvider=(XDispatchProvider)
>                         UnoRuntime.queryInterface(XDispatchProvider.class, 
> xDesktop);
>
>
>                 Object sDispatchHelper= 
> xMSF.createInstance("com.sun.star.frame.DispatchHelper");
>                 XDispatchHelper xDispatchHelper=(XDispatchHelper)
>                         UnoRuntime.queryInterface(XDispatchHelper.class, 
> sDispatchHelper);
>
>
>                 // define arguments
>                 PropertyValue propValue=new PropertyValue();
>                 propValue.Name="arg1";              // not used, but what the 
> heck
>                 propValue.Value=sDispatchHelper;    // an UNO object (could 
> be an UNO IDL string instead)
>
>                 PropertyValue parameters[]={propValue};
>
>                 // invoke the ooRexx script to document the UNO object/IDL
>                 String location="user"; // "user" or "share" or "application"
>                 String 
> macroUrl="vnd.sun.star.script:wu_tools.createApiInfo.rex?language=ooRexx&location="
>                     +location;
>
>                 // dispatch, supplying arguments
>                 DispatchResultEvent dre=(DispatchResultEvent)
>                       xDispatchHelper.executeDispatch(
>                             xDispatchProvider,  // XDispatchProvider
>                             macroUrl,           // URL
>                             "",                 // TargetFrameName
>                             0,                  // SearchFlags
>                             parameters);        // Arguments
>
>                 System.out.println("Returned from executing dispatch, 
> Result=["+dre.Result+"], State=["+dre.State+"]");
>             }
>         }
>         catch( Exception e) {
>             e.printStackTrace(System.err);
>             System.exit(1);
>         }
>
>         System.err.println("Successful run.");
>         System.exit(0);
>     }
> }
>
>
> ----------------- cut here ----------------
>
> In this case an ooRexx macro/script is invoked. ooRexx can handle
> variable numbers of arguments and in this case there may be up to eight
> arguments supplied, but one can omit all but the very first argument.
> Now, if OOo supplies one argument too many, this interferes quite
> heavily as from the perspective of the receiving (ooRexx) side one
> cannot determine whether OOo injected an argument of its own or not.
>
> Looking through the sources of the OOo scripting framework there seems
> to be no statement there that appends that argument, so I assume it
> happens either in executeDispatch(...) or somewhere on the way to the
> scripting framework invocation.
>
> I would really appreciate if anyone could shed some light on this!
>
> ---rony
>
>
>
>
>
>   

Reply via email to