blob: 7cb68c9ba790a06348d72b26649ee0124d6fe0ba [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
/*
* ByteArrayXOutputStream.java
*
* Created on 11. April 2003, 14:20
*/
package com.sun.star.lib.uno.adapter;
/**
*
* @author lo119109
*/
import com.sun.star.io.*;
import com.sun.star.lib.uno.helper.ComponentBase;
public class XOutputStreamToByteArrayAdapter
extends ComponentBase
implements XOutputStream
{
private int initialSize = 100240; // 10 kb
private int size = 0;
private int position = 0;
private boolean externalBuffer = false;
private boolean closed = false;
private byte[] buffer;
/** Creates a new instance of ByteArrayXOutputStream */
public XOutputStreamToByteArrayAdapter() {
this(null);
}
public XOutputStreamToByteArrayAdapter(byte[] aBuffer) {
if (aBuffer != null) {
externalBuffer = true;
buffer = aBuffer;
size = buffer.length;
// System.err.println("new outputbuffer with external storage");
} else {
size = initialSize;
buffer = new byte[size];
// System.err.println("new outputbuffer with internal storage");
}
}
public byte[] getBuffer() {
return buffer;
}
public void closeOutput()
throws com.sun.star.io.NotConnectedException,
com.sun.star.io.BufferSizeExceededException,
com.sun.star.io.IOException
{
// trim buffer
if ( buffer.length > position && !externalBuffer )
{
byte[] newBuffer = new byte[position];
System.arraycopy(buffer, 0, newBuffer, 0, position);
buffer = newBuffer;
}
closed = true;
}
public void flush()
throws com.sun.star.io.NotConnectedException,
com.sun.star.io.BufferSizeExceededException,
com.sun.star.io.IOException
{
}
public void writeBytes(byte[] values)
throws com.sun.star.io.NotConnectedException,
com.sun.star.io.BufferSizeExceededException,
com.sun.star.io.IOException
{
// System.err.println("writeBytes("+values.length+")");
if ( values.length > size-position )
{
if ( externalBuffer )
throw new BufferSizeExceededException("out of buffer space, cannot grow external buffer");
byte[] newBuffer = null;
while ( values.length > size-position )
size *= 2;
// System.err.println("new buffer size is "+size+" bytes.");
newBuffer = new byte[size];
System.arraycopy(buffer, 0, newBuffer, 0, position);
buffer = newBuffer;
}
System.arraycopy(values, 0, buffer, position, values.length);
position += values.length;
}
}