<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="streams_uno_ObjectOutputStream" script:language="StarBasic">


'*************************************************************************
'
'  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
'  
'  Unless required by applicable law or agreed to in writing,
'  software distributed under the License is distributed on an
'  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
'  KIND, either express or implied.  See the License for the
'  specific language governing permissions and limitations
'  under the License.
'
'*************************************************************************





' Be sure that all variables are dimensioned:
option explicit


' REQUIRED VARIABLES for interface/service tests:
Global cFileName As String
Global oFileAcc  As Object
Global oInputStream  As Object
Global oOutputStream As Object
Global oMarkOut As Object, oMarkIn As Object


Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' stm.ObjectOutputStream
'*************************************************************************
On Error Goto ErrHndl
    Dim oPipe As Object

    oObj = createUnoService("com.sun.star.io.ObjectOutputStream")
    oMarkOut = createUnoService("com.sun.star.io.MarkableOutputStream")
    oPipe = createUnoService("com.sun.star.io.Pipe")
    oMarkIn = createUnoService("com.sun.star.io.MarkableInputStream")
    oInputStream = createUnoService("com.sun.star.io.ObjectInputStream")
    oObj.setOutputStream(oMarkOut)
    oMarkOut.setOutputStream(oPipe)
    oMarkIn.setInputStream(oPipe)
    oInputStream.setInputStream(oMarkIn)
    oOutputStream = oObj

Exit Sub
ErrHndl:
    Test.Exception()
End Sub

Function getInStream() As Object
On Error Goto ErrHndl
    Dim oFI As Object

    getInStream() = oInputStream
Exit Function
ErrHndl:
    Test.Exception()
    getInStream() = NULL_OBJECT
End Function

Function getOutStream() As Object
On Error Goto ErrHndl
    getOutStream() = oOutputStream
Exit Function
ErrHndl:
    Test.Exception()
    getOutStream() = NULL_OBJECT
End Function

Sub ResetStreams()
On Error goto ErrHndl
Exit Sub
ErrHndl:
    Test.Exception()
    resume next
End Sub

Sub DisposeObj()
    if NOT isNULL(oObj) then oObj.closeOutput()
End Sub
</script:module>
