/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#ifndef _TEST_LANGUAGE_BINDING_IDL_
#define _TEST_LANGUAGE_BINDING_IDL_

#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/lang/IllegalArgumentException.idl>

module test
{

enum TestEnum
{
    TEST,
    ONE,
    TWO,
    CHECK,
    LOLA,
    PALOO,
    ZA
};

/**
 * simple c++ types
 */
struct TestSimple
{
    boolean                    Bool;
    char                       Char;
    byte                       Byte;
    short                      Short;
    unsigned short             UShort;
    long                       Long;
    unsigned long              ULong;
    hyper                      Hyper;
    unsigned hyper             UHyper;
    float                      Float;
    double                     Double;
    test::TestEnum             Enum;
};
/**
 * complex c++ types
 */
struct TestElement : test::TestSimple
{
    string                     String;
    com::sun::star::uno::XInterface   Interface;
    any                        Any;
};
struct TestDataElements : test::TestElement
{
    sequence<test::TestElement > Sequence;
};

typedef TestDataElements TestData;

/**
 * Monster test interface to test language binding calls.
 *
 * @author Daniel Boelzle
 */
interface XLBTestBase : com::sun::star::uno::XInterface
{
    /**
     * in parameter test, tests by calls reference also (complex types)
     */
    void setValues( [in] boolean bBool, [in] char cChar, [in] byte nByte,
                             [in] short nShort, [in] unsigned short nUShort,
                             [in] long nLong, [in] unsigned long nULong,
                             [in] hyper nHyper, [in] unsigned hyper nUHyper,
                             [in] float fFloat, [in] double fDouble,
                             [in] test::TestEnum eEnum, [in] string aString,
                             [in] com::sun::star::uno::XInterface xInterface, [in] any aAny,
                             [in] sequence<test::TestElement > aSequence,
                             [in] test::TestData aStruct );
    /**
     * inout parameter test
     */
    test::TestData setValues2( [inout] boolean bBool, [inout] char cChar, [inout] byte nByte,
                               [inout] short nShort, [inout] unsigned short nUShort,
                               [inout] long nLong, [inout] unsigned long nULong,
                               [inout] hyper nHyper, [inout] unsigned hyper nUHyper,
                               [inout] float fFloat, [inout] double fDouble,
                               [inout] test::TestEnum eEnum, [inout] string aString,
                               [inout] com::sun::star::uno::XInterface xInterface, [inout] any aAny,
                               [inout] sequence<test::TestElement > aSequence,
                               [inout] test::TestData aStruct );

    /**
     * out parameter test
     */
    test::TestData getValues( [out] boolean bBool, [out] char cChar, [out] byte nByte,
                              [out] short nShort, [out] unsigned short nUShort,
                              [out] long nLong, [out] unsigned long nULong,
                              [out] hyper nHyper, [out] unsigned hyper nUHyper,
                              [out] float fFloat, [out] double fDouble,
                              [out] test::TestEnum eEnum, [out] string aString,
                              [out] com::sun::star::uno::XInterface xInterface, [out] any aAny,
                              [out] sequence<test::TestElement > aSequence,
                              [out] test::TestData aStruct );

    [attribute] boolean                  Bool;
    [attribute] byte                     Byte;
    [attribute] char                     Char;
    [attribute] short                    Short;
    [attribute] unsigned short           UShort;
    [attribute] long                     Long;
    [attribute] unsigned long            ULong;
    [attribute] hyper                    Hyper;
    [attribute] unsigned hyper           UHyper;
    [attribute] float                    Float;
    [attribute] double                   Double;
    [attribute] test::TestEnum           Enum;
    [attribute] string                   String;
    [attribute] com::sun::star::uno::XInterface Interface;
    [attribute] any                      Any;
    [attribute] sequence<test::TestElement > Sequence;
    [attribute] test::TestData           Struct;
};


/**
 * Inherting from monster; adds raiseException().
 *
 * @author Daniel Boelzle
 */
interface XLanguageBindingTest : test::XLBTestBase
{
    /**
     * params are there only for dummy, to test if all temp out params will be released.
     */
    test::TestData raiseException( [out] boolean bBool, [out] char cChar, [out] byte nByte,
                                   [out] short nShort, [out] unsigned short nUShort,
                                   [out] long nLong, [out] unsigned long nULong,
                                   [out] hyper nHyper, [out] unsigned hyper nUHyper,
                                   [out] float fFloat, [out] double fDouble,
                                   [out] test::TestEnum eEnum, [out] string aString,
                                   [out] com::sun::star::uno::XInterface xInterface, [out] any aAny,
                                   [out] sequence<test::TestElement > aSequence,
                                   [out] test::TestData aStruct )
        raises( com::sun::star::lang::IllegalArgumentException );

    /**
     * raises runtime exception
     */
    [attribute] long                     RuntimeException;
};

}; // test


#endif
