1*a5b190bfSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*a5b190bfSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*a5b190bfSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*a5b190bfSAndrew Rist * distributed with this work for additional information 6*a5b190bfSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*a5b190bfSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*a5b190bfSAndrew Rist * "License"); you may not use this file except in compliance 9*a5b190bfSAndrew Rist * with the License. You may obtain a copy of the License at 10*a5b190bfSAndrew Rist * 11*a5b190bfSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*a5b190bfSAndrew Rist * 13*a5b190bfSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*a5b190bfSAndrew Rist * software distributed under the License is distributed on an 15*a5b190bfSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*a5b190bfSAndrew Rist * KIND, either express or implied. See the License for the 17*a5b190bfSAndrew Rist * specific language governing permissions and limitations 18*a5b190bfSAndrew Rist * under the License. 19*a5b190bfSAndrew Rist * 20*a5b190bfSAndrew Rist *************************************************************/ 21*a5b190bfSAndrew Rist 22*a5b190bfSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir /* 25cdf0e10cSrcweir * ByteArrayXOutputStream.java 26cdf0e10cSrcweir * 27cdf0e10cSrcweir * Created on 11. April 2003, 14:20 28cdf0e10cSrcweir */ 29cdf0e10cSrcweir 30cdf0e10cSrcweir package com.sun.star.lib.uno.adapter; 31cdf0e10cSrcweir 32cdf0e10cSrcweir /** 33cdf0e10cSrcweir * 34cdf0e10cSrcweir * @author lo119109 35cdf0e10cSrcweir */ 36cdf0e10cSrcweir 37cdf0e10cSrcweir import com.sun.star.io.*; 38cdf0e10cSrcweir import com.sun.star.lib.uno.helper.ComponentBase; 39cdf0e10cSrcweir 40cdf0e10cSrcweir public class XOutputStreamToByteArrayAdapter 41cdf0e10cSrcweir extends ComponentBase 42cdf0e10cSrcweir implements XOutputStream 43cdf0e10cSrcweir { 44cdf0e10cSrcweir private int initialSize = 100240; // 10 kb 45cdf0e10cSrcweir private int size = 0; 46cdf0e10cSrcweir private int position = 0; 47cdf0e10cSrcweir private boolean externalBuffer = false; 48cdf0e10cSrcweir private boolean closed = false; 49cdf0e10cSrcweir private byte[] buffer; 50cdf0e10cSrcweir 51cdf0e10cSrcweir /** Creates a new instance of ByteArrayXOutputStream */ XOutputStreamToByteArrayAdapter()52cdf0e10cSrcweir public XOutputStreamToByteArrayAdapter() { 53cdf0e10cSrcweir this(null); 54cdf0e10cSrcweir } 55cdf0e10cSrcweir XOutputStreamToByteArrayAdapter(byte[] aBuffer)56cdf0e10cSrcweir public XOutputStreamToByteArrayAdapter(byte[] aBuffer) { 57cdf0e10cSrcweir if (aBuffer != null) { 58cdf0e10cSrcweir externalBuffer = true; 59cdf0e10cSrcweir buffer = aBuffer; 60cdf0e10cSrcweir size = buffer.length; 61cdf0e10cSrcweir // System.err.println("new outputbuffer with external storage"); 62cdf0e10cSrcweir } else { 63cdf0e10cSrcweir size = initialSize; 64cdf0e10cSrcweir buffer = new byte[size]; 65cdf0e10cSrcweir // System.err.println("new outputbuffer with internal storage"); 66cdf0e10cSrcweir } 67cdf0e10cSrcweir } 68cdf0e10cSrcweir getBuffer()69cdf0e10cSrcweir public byte[] getBuffer() { 70cdf0e10cSrcweir return buffer; 71cdf0e10cSrcweir } 72cdf0e10cSrcweir closeOutput()73cdf0e10cSrcweir public void closeOutput() 74cdf0e10cSrcweir throws com.sun.star.io.NotConnectedException, 75cdf0e10cSrcweir com.sun.star.io.BufferSizeExceededException, 76cdf0e10cSrcweir com.sun.star.io.IOException 77cdf0e10cSrcweir { 78cdf0e10cSrcweir // trim buffer 79cdf0e10cSrcweir if ( buffer.length > position && !externalBuffer ) 80cdf0e10cSrcweir { 81cdf0e10cSrcweir byte[] newBuffer = new byte[position]; 82cdf0e10cSrcweir System.arraycopy(buffer, 0, newBuffer, 0, position); 83cdf0e10cSrcweir buffer = newBuffer; 84cdf0e10cSrcweir } 85cdf0e10cSrcweir closed = true; 86cdf0e10cSrcweir } 87cdf0e10cSrcweir flush()88cdf0e10cSrcweir public void flush() 89cdf0e10cSrcweir throws com.sun.star.io.NotConnectedException, 90cdf0e10cSrcweir com.sun.star.io.BufferSizeExceededException, 91cdf0e10cSrcweir com.sun.star.io.IOException 92cdf0e10cSrcweir { 93cdf0e10cSrcweir } 94cdf0e10cSrcweir writeBytes(byte[] values)95cdf0e10cSrcweir public void writeBytes(byte[] values) 96cdf0e10cSrcweir throws com.sun.star.io.NotConnectedException, 97cdf0e10cSrcweir com.sun.star.io.BufferSizeExceededException, 98cdf0e10cSrcweir com.sun.star.io.IOException 99cdf0e10cSrcweir { 100cdf0e10cSrcweir // System.err.println("writeBytes("+values.length+")"); 101cdf0e10cSrcweir if ( values.length > size-position ) 102cdf0e10cSrcweir { 103cdf0e10cSrcweir if ( externalBuffer ) 104cdf0e10cSrcweir throw new BufferSizeExceededException("out of buffer space, cannot grow external buffer"); 105cdf0e10cSrcweir byte[] newBuffer = null; 106cdf0e10cSrcweir while ( values.length > size-position ) 107cdf0e10cSrcweir size *= 2; 108cdf0e10cSrcweir // System.err.println("new buffer size is "+size+" bytes."); 109cdf0e10cSrcweir newBuffer = new byte[size]; 110cdf0e10cSrcweir System.arraycopy(buffer, 0, newBuffer, 0, position); 111cdf0e10cSrcweir buffer = newBuffer; 112cdf0e10cSrcweir } 113cdf0e10cSrcweir System.arraycopy(values, 0, buffer, position, values.length); 114cdf0e10cSrcweir position += values.length; 115cdf0e10cSrcweir } 116cdf0e10cSrcweir 117cdf0e10cSrcweir } 118