<?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_Pump" 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 oPipe As Object
Global PumpOUTFileName As String


Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' stm.Pump
'*************************************************************************
On Error Goto ErrHndl
    Dim oFileAcc As Object
    Dim oDataInput As Object
    Dim oDataOutput As Object
    Dim oSFA As Object
    Dim oOS As Object

    oFileAcc = createUnoService("com.sun.star.ucb.SimpleFileAccess")
    PumpOUTFileName = utils.getTempFileURL("PumpOUT.dat")
    if (FileExists(PumpOUTFileName)) then
        oFileAcc.Kill(PumpOUTFileName)
    end if

    oObj = createUnoService("com.sun.star.io.Pump")
    oPipe = createUnoService("com.sun.star.io.Pipe")

    oDataInput = createUnoService("com.sun.star.io.DataInputStream")
    oDataInput.setInputStream(oPipe)

    oDataOutput = createUnoService("com.sun.star.io.DataOutputStream")
    oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
    oOS = oSFA.openFileWrite(PumpOUTFileName)
    oDataOutput.setOutputStream(oOS)

    oObj.setInputStream(oDataInput)
    oObj.setOutputStream(oDataOutput)
Exit Sub
ErrHndl:
    Test.Exception()
End Sub

Sub DisposeObj()
On Error goto ErrHndl
    oObj.terminate()
Exit Sub
ErrHndl:
    Test.Exception()
End Sub

Sub ResetStreams()
End Sub
</script:module>
