'
' 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 .
'

Option Explicit On
Option Strict On

imports System
imports uno
imports uno.util
imports unoidl.com.sun.star.lang
imports unoidl.com.sun.star.uno
imports unoidl.com.sun.star.test.bridge
imports System.Windows.Forms
imports System.Diagnostics
imports System.Reflection


Namespace vb_testobj
Public Class VBBridgeTestObject 
    Inherits WeakBase
    Implements XRecursiveCall, XBridgeTest2

    Private m_xContext As XComponentContext 
    
    Public Sub New (xContext As XComponentContext)
        MyBase.New
        m_xContext = xContext
    End Sub

    Private m_bool As Boolean
    Private m_char As Char
    Private m_byte As Byte
    Private m_short  As Short
    Private m_ushort As UInt16
    Private m_long As Integer
    Private m_ulong As UInt32
    Private m_hyper As Long
    Private m_uhyper As UInt64 
    Private m_float As Single
    Private m_double As Double
    Private m_string As String
    Private m_xInterface As Object
    Private m_any As Any
    Private m_testEnum As TestEnum = TestEnum.TEST
    Private m_testElements() As TestElement = New TestElement(){}
    Private m_testDataElements As TestDataElements = New TestDataElements
    Private m_nLastCallId As Integer = 0
    Private m_bFirstCall As Boolean = True
    Private m_bSequenceOfCallTestPassed As Boolean = True

    Private m_arBool() As Boolean
    Private m_arChar() As Char
    Private m_arByte() As Byte
    Private m_arShort() As Short
    Private m_arLong() As Integer
    Private m_arHyper() As Long
    Private m_arUShort() As UInt16
    Private m_arULong() As UInt32
    Private m_arUHyper() As UInt64
    Private m_arString() As String
    Private m_arFloat() As Single
    Private m_arDouble() As Double
    Private m_arEnum() As TestEnum
    Private m_arObject() As Object
    Private m_arLong2()() As Integer
    Private m_arLong3()()() As Integer
    Private m_arAny() As Any
    
    Public Overridable Sub setValues( _
        bBool As Boolean, aChar As Char, nByte As Byte, nShort As Short, _
        nUShort As UInt16, nLong As Integer, nULong As UInt32, _
        nHyper As Long, nUHyper As UInt64, fFloat As Single, _
        fDouble As Double, testEnum As TestEnum, str As String, _
        xInterface As Object, any As Any, testElements() As TestElement, _
        testDataElements As TestDataElements) _
        Implements XBridgeTest2.setValues
#if DEBUG
      '  Console.WriteLine( "##### " + GetType().FullName + ".setValues:" + any )
#endif
        m_bool             = bBool
        m_char             = aChar
        m_byte             = nByte
        m_short            = nShort
        m_ushort           = nUShort
        m_long             = nLong
        m_ulong            = nULong
        m_hyper            = nHyper
        m_uhyper           = nUHyper
        m_float            = fFloat
        m_double           = fDouble
        m_testEnum         = testEnum
        m_string           = str
        m_xInterface       = xInterface
        m_any              = any
        m_testElements     = testElements
        m_testDataElements = testDataElements
    End Sub
    
    Public Overridable Function setValues2( _
        ByRef io_bool As Boolean, ByRef io_char As Char, _
        ByRef io_byte As Byte, ByRef io_short As Short, _
        ByRef io_ushort As UInt16, ByRef io_long As Integer, _
        ByRef io_ulong As UInt32, ByRef io_hyper As Long, _
        ByRef io_uhyper As UInt64, ByRef io_float As Single, _
        ByRef io_double As Double, ByRef io_testEnum As TestEnum, _
        ByRef io_string As String, ByRef io_xInterface As Object, _
        ByRef io_any As Any, ByRef io_testElements() As TestElement, _
        ByRef io_testDataElements As TestDataElements) As TestDataElements _
        Implements XBridgeTest2.setValues2
    
#if DEBUG
        'Console.WriteLine( "##### " + GetType().FullName + ".setValues2:" + io_any )
#endif
        
        m_bool             = io_bool
        m_char             = io_char
        m_byte             = io_byte
        m_short            = io_short
        m_ushort           = io_ushort
        m_long             = io_long
        m_ulong            = io_ulong
        m_hyper            = io_hyper
        m_uhyper           = io_uhyper
        m_float            = io_float
        m_double           = io_double
        m_testEnum         = io_testEnum
        m_string           = io_string
        m_xInterface       = io_xInterface
        m_any              = io_any
        m_testElements     = DirectCast(io_testElements.Clone(), TestElement()) 
        m_testDataElements = io_testDataElements
        
        Dim temp As TestElement = io_testElements(0)
        io_testElements(0) = io_testElements(1)
        io_testElements(1) = temp
        
        Return m_testDataElements
    End Function
    
    Public Overridable Function  getValues( _
        ByRef o_bool As Boolean, ByRef o_char As Char, _
        ByRef o_byte As Byte, ByRef o_short As Short, _
        ByRef o_ushort As UInt16, ByRef o_long As Integer, _
        ByRef o_ulong As UInt32, ByRef o_hyper As Long, _
        ByRef o_uhyper As UInt64, ByRef o_float As Single, _
        ByRef o_double As Double, ByRef o_testEnum As TestEnum, _
        ByRef o_string As String, ByRef o_xInterface As Object, _
        ByRef o_any As Any, ByRef o_testElements() As TestElement, _
        ByRef o_testDataElements As TestDataElements) As TestDataElements _
        Implements XBridgeTest2.getValues
#if DEBUG
        'Console.WriteLine( "##### " + GetType().FullName + ".getValues" )
#endif
        
        o_bool             = m_bool
        o_char             = m_char
        o_byte             = m_byte
        o_short            = m_short
        o_ushort           = m_ushort
        o_long             = m_long
        o_ulong            = m_ulong
        o_hyper            = m_hyper
        o_uhyper           = m_uhyper
        o_float            = m_float
        o_double           = m_double
        o_testEnum         = m_testEnum
        o_string           = m_string
        o_xInterface       = m_xInterface
        o_any              = m_any
        o_testElements     = m_testElements
        o_testDataElements = m_testDataElements
        
        Return m_testDataElements
    End Function

    ' Attributes ---------------------------------------------------------
    Public Overridable Property Bool As Boolean _
        Implements XBridgeTest2.Bool
        Get 
            Return m_bool
        End Get
        Set (Value As Boolean)
            m_bool = value
        End Set
    End Property

    Public Overridable Property [Byte] As Byte _
        Implements XBridgeTest2.Byte
        Get  
            Return m_byte 
        End Get
        Set (Value As Byte)
            m_byte = value
        End Set
    End Property

    Public Overridable Property [Char] As Char _
        Implements XBridgeTest2.Char
        Get
            Return m_char
        End Get
        Set (Value As Char)
            m_char = value 
        End Set
    End Property

    Public Overridable Property [Short] As Short _
        Implements XBridgeTest2.Short
        Get 
            Return m_short 
        End Get
        Set (Value As Short)
            m_short = value 
        End Set
    End Property

    Public Overridable Property [UShort] As UInt16 _
        Implements XBridgeTest2.UShort
        Get
            Return m_ushort
        End Get
        Set (Value As UInt16)
            m_ushort = value
        End Set
    End Property

    Public Overridable Property [Long] As Integer _
        Implements XBridgeTest2.Long
        Get
            Return m_long 
        End Get
        Set (Value As Integer)
            m_long = value 
        End Set
    End Property

    Public Overridable Property [ULong]() As UInt32 _
        Implements XBridgeTest2.ULong
        Get
            Return m_ulong 
        End Get
        Set (Value As UInt32)
            m_ulong = value 
        End Set
    End Property

    Public Overridable Property Hyper As Long _
        Implements XBridgeTest2.Hyper
        Get
            Return m_hyper
        End Get
        Set (Value As Long)
            m_hyper = value
        End Set
    End Property

    Public Overridable Property UHyper As UInt64 _
        Implements XBridgeTest2.UHyper
        Get 
            Return m_uhyper
        End Get
        Set (Value As UInt64)
            m_uhyper = value 
        End Set
    End Property

    Public Overridable Property Float As Single _
        Implements XBridgeTest2.Float
        Get
            Return m_float 
        End Get
        Set (Value As Single)
            m_float = value 
        End Set
    End Property

    Public Overridable Property [Double] As Double _
        Implements XBridgeTest2.Double
        Get
            Return m_double 
        End Get
        Set (Value As Double) 
            m_double = value
        End Set
    End Property

    Public Overridable Property [Enum] As TestEnum _
        Implements XBridgeTest2.Enum
        Get 
            Return m_testEnum
        End Get
        Set (Value As TestEnum)
            m_testEnum = value 
        End Set
    End Property

    Public Overridable Property [String] As String _
        Implements XBridgeTest2.String
        Get
            Return m_string
        End Get
        Set (Value As String)
            m_string = value
        End Set
    End Property

    Public Overridable Property [Interface] As Object _
        Implements XBridgeTest2.Interface
        Get 
            Return m_xInterface
        End Get
        Set (Value As Object)
            m_xInterface = value
        End Set
    End Property

    Public Overridable Property  Any As uno.Any _
        Implements XBridgeTest2.Any
        Get
#if DEBUG
'            Console.WriteLine( "##### " + GetType().FullName + ".Any" )
#endif
            Return m_any
        End Get
        Set (Value As Any)
#if DEBUG
            'Console.WriteLine( "##### " + GetType().FullName + ".Any:" + value )
#endif
            m_any = value
        End Set
    End Property

    Public Overridable Property Sequence As TestElement() _
        Implements XBridgeTest2.Sequence
        Get
            Return m_testElements 
        End Get
        Set (Value() As TestElement)
            m_testElements = value
        End Set
    End Property

    Public Overridable Property Struct As TestDataElements _
        Implements XBridgeTest2.Struct
        Get
            Return m_testDataElements 
        End Get
        Set (Value As TestDataElements)
            m_testDataElements = value
        End Set
    End Property
    
    Public Overridable Function transportAny(value As Any) As Any _
        Implements XBridgeTest2.transportAny
        Return value
    End Function

    Public Overridable Sub [call](nCallId As Integer, nWaitMUSEC As Integer) _
        Implements XBridgeTest2.call

        Threading.Thread.Sleep(CType(nWaitMUSEC / 10000, Integer))     
        If m_bFirstCall = True
            m_bFirstCall = False
        Else 
            m_bSequenceOfCallTestPassed = m_bSequenceOfCallTestPassed And (nCallId > m_nLastCallId)
        End If
        m_nLastCallId = nCallId
    End Sub

    Public Overridable Sub callOneway(nCallId As Integer, nWaitMUSEC As Integer) _
        Implements XBridgeTest2.callOneway

        Threading.Thread.Sleep(CType(nWaitMUSEC / 10000, Integer)) 
        m_bSequenceOfCallTestPassed = m_bSequenceOfCallTestPassed And (nCallId > m_nLastCallId)
        m_nLastCallId = nCallId
    End Sub

    Public Overridable Function sequenceOfCallTestPassed() As Boolean _
        Implements XBridgeTest2.sequenceOfCallTestPassed
        Return m_bSequenceOfCallTestPassed
    End Function

    Public Overridable Sub callRecursivly(xCall As  XRecursiveCall, nToCall As Integer) _
        Implements XRecursiveCall.callRecursivly
        SyncLock (Me)
            If nToCall <> 0
                nToCall = nToCall - 1
                xCall.callRecursivly(Me , nToCall)
            End If
        End SyncLock
    End Sub

    Public Overridable Sub startRecursiveCall(xCall As  XRecursiveCall, nToCall As Integer) _
        Implements XBridgeTest2.startRecursiveCall
        SyncLock (Me)
            If nToCall <> 0
                nToCall = nToCall - 1
                xCall.callRecursivly(Me , nToCall )
            End If
        End SyncLock
    End Sub
    
    ' XBridgeTest
    Public Overridable Function raiseException( _
        nArgumentPos As Short, rMsg As String, xContext As Object) As TestDataElements _
        Implements XBridgeTest2.raiseException
        Throw New IllegalArgumentException(rMsg, xContext, nArgumentPos)
    End Function

    Public Overridable Sub raiseRuntimeExceptionOneway(rMsg As  String , xContext As Object) _
        Implements XBridgeTest2.raiseRuntimeExceptionOneway
        Throw New RuntimeException(rMsg, xContext)
    End Sub

    Public Overridable Property RuntimeException As Integer _
        Implements XBridgeTest2.RuntimeException
        Get
            Throw New RuntimeException(m_string, m_xInterface) 
        End Get
        Set (Value As Integer)
            Throw New RuntimeException(m_string, m_xInterface) 
        End Set
    End Property
    
    ' XBridgeTest2
    Public Overridable Function setDim2(val()() As Integer) As Integer()() _
        Implements XBridgeTest2.setDim2
        m_arLong2 = val
        Return val
    End Function

    Public Overridable Function setDim3(val()()() As Integer) As Integer()()() _
        Implements XBridgeTest2.setDim3
        m_arLong3 = val
        Return val
    End Function

    Public Overridable Function setSequenceAny(val() As Any) As Any() _
        Implements XBridgeTest2.setSequenceAny
        m_arAny = val
        Return val
    End Function

    Public Overridable Function setSequenceBool(val() As Boolean) As Boolean() _
        Implements XBridgeTest2.setSequenceBool
        m_arBool = val
        Return val
    End Function

    Public Overridable Function setSequenceByte(val() As Byte) As Byte() _
        Implements XBridgeTest2.setSequenceByte
        m_arByte = val
        Return val
    End Function

    Public Overridable Function setSequenceChar(val() As Char) As Char() _
        Implements XBridgeTest2.setSequenceChar
        m_arChar = val
        Return val
    End Function

    Public Overridable Function setSequenceShort(val() As Short) As Short() _
        Implements XBridgeTest2.setSequenceShort
        m_arShort = val
        Return val
    End Function

    Public Overridable Function setSequenceLong(val() As Integer) As Integer() _
        Implements XBridgeTest2.setSequenceLong

        m_arLong = val
        Return val
    End Function

    Public Overridable Function setSequenceHyper(val() As Long) As Long() _
        Implements XBridgeTest2.setSequenceHyper
        m_arHyper = val
        Return val
    End Function

    Public Overridable Function setSequenceFloat(val() As Single) As Single() _
        Implements XBridgeTest2.setSequenceFloat
        m_arFloat = val
        Return val
    End Function

    Public Overridable Function setSequenceDouble(val() As Double) As Double() _
        Implements XBridgeTest2.setSequenceDouble
        m_arDouble = val
        Return val
    End Function

    Public Overridable Function setSequenceEnum(val() As TestEnum) As TestEnum() _
        Implements XBridgeTest2.setSequenceEnum
        m_arEnum = val
        Return val
    End Function

    Public Overridable Function setSequenceUShort(val() As UInt16) As UInt16() _
        Implements XBridgeTest2.setSequenceUShort
        m_arUShort = val
        Return val
    End Function

    Public Overridable Function setSequenceULong(val() As  UInt32) As  UInt32() _
        Implements XBridgeTest2.setSequenceULong
        m_arULong = val
        Return  val
    End Function

    Public Overridable Function setSequenceUHyper(val() As UInt64) As UInt64() _
        Implements XBridgeTest2.setSequenceUHyper
        m_arUHyper = val
        Return val
    End Function

    Public Overridable Function setSequenceXInterface(val() As Object ) As Object() _
        Implements XBridgeTest2.setSequenceXInterface
        m_arObject = val
        Return val
    End Function

    Public Overridable Function setSequenceString(val() As String) As String() _
        Implements XBridgeTest2.setSequenceString
        m_arString = val
        Return val
    End Function

    Public Overridable Function setSequenceStruct(val() As TestElement) As TestElement() _
        Implements XBridgeTest2.setSequenceStruct
        m_testElements = val
        Return val
    End Function
    
    Public Overridable Sub setSequencesInOut( _
        ByRef aSeqBoolean() As Boolean, ByRef aSeqChar() As Char, _
        ByRef aSeqByte() As Byte, ByRef aSeqShort() As Short, _
        ByRef aSeqUShort() As UInt16, ByRef aSeqLong() As Integer, _
        ByRef aSeqULong() As  UInt32, ByRef aSeqHyper() As Long, _
        ByRef aSeqUHyper() As UInt64, ByRef aSeqFloat() As Single, _
        ByRef aSeqDouble() As Double, ByRef aSeqTestEnum() As TestEnum, _
        ByRef aSeqString() As String, ByRef aSeqXInterface() As Object, _
        ByRef aSeqAny() As Any, ByRef aSeqDim2()() As Integer, _
        ByRef aSeqDim3()()() As Integer) _
        Implements XBridgeTest2.setSequencesInOut

        m_arBool = aSeqBoolean
        m_arChar = aSeqChar
        m_arByte = aSeqByte
        m_arShort = aSeqShort
        m_arUShort = aSeqUShort
        m_arLong = aSeqLong
        m_arULong = aSeqULong
        m_arHyper  = aSeqHyper
        m_arUHyper = aSeqUHyper
        m_arFloat = aSeqFloat
        m_arDouble = aSeqDouble
        m_arEnum = aSeqTestEnum
        m_arString = aSeqString
        m_arObject = aSeqXInterface
        m_arAny = aSeqAny
        m_arLong2 = aSeqDim2
        m_arLong3 = aSeqDim3
    End Sub

    Public Overridable Sub setSequencesOut( _
        ByRef aSeqBoolean() As Boolean, ByRef aSeqChar() As Char, _
        ByRef aSeqByte() As Byte, ByRef aSeqShort() As Short, _
        ByRef aSeqUShort() As UInt16, ByRef aSeqLong() As Integer, _
        ByRef aSeqULong() As  UInt32, ByRef aSeqHyper() As Long, _
        ByRef aSeqUHyper() As UInt64, ByRef  aSeqFloat() As Single, _
        ByRef aSeqDouble() As Double, ByRef aSeqTestEnum() As TestEnum, _
        ByRef aSeqString() As String, ByRef aSeqXInterface() As Object, _
        ByRef aSeqAny() As Any, ByRef aSeqDim2()() As Integer, _
        ByRef aSeqDim3()()() As Integer) _
        Implements XBridgeTest2.setSequencesOut

        aSeqBoolean = m_arBool
        aSeqChar = m_arChar
        aSeqByte = m_arByte
        aSeqShort = m_arShort
        aSeqUShort = m_arUShort
        aSeqLong = m_arLong
        aSeqULong = m_arULong
        aSeqHyper = m_arHyper
        aSeqUHyper = m_arUHyper
        aSeqFloat = m_arFloat
        aSeqDouble = m_arDouble
        aSeqTestEnum = m_arEnum
        aSeqString = m_arString
        aSeqXInterface = m_arObject
        aSeqAny = m_arAny
        aSeqDim2 = m_arLong2
        aSeqDim3 = m_arLong3
            
    End Sub

End Class

End Namespace