1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski /* 25*b1cdbd2cSJim Jagielski * ByteArrayXInputStram.java 26*b1cdbd2cSJim Jagielski * 27*b1cdbd2cSJim Jagielski * Created on 10. April 2003, 15:45 28*b1cdbd2cSJim Jagielski */ 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski package com.sun.star.lib.uno.adapter; 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski /** 33*b1cdbd2cSJim Jagielski * 34*b1cdbd2cSJim Jagielski * @author lo119109 35*b1cdbd2cSJim Jagielski */ 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski import com.sun.star.io.XInputStream; 38*b1cdbd2cSJim Jagielski import com.sun.star.io.XSeekable; 39*b1cdbd2cSJim Jagielski import com.sun.star.lib.uno.helper.ComponentBase; 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski public class ByteArrayToXInputStreamAdapter 42*b1cdbd2cSJim Jagielski extends ComponentBase 43*b1cdbd2cSJim Jagielski implements XInputStream, XSeekable 44*b1cdbd2cSJim Jagielski { 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski byte[] m_bytes; 47*b1cdbd2cSJim Jagielski int m_length; 48*b1cdbd2cSJim Jagielski int m_pos; 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski boolean m_open; 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski /** Creates a new instance of ByteArrayXInputStram */ ByteArrayToXInputStreamAdapter(byte[] bytes)53*b1cdbd2cSJim Jagielski public ByteArrayToXInputStreamAdapter(byte[] bytes) { 54*b1cdbd2cSJim Jagielski init(bytes); 55*b1cdbd2cSJim Jagielski } 56*b1cdbd2cSJim Jagielski init(byte[] bytes)57*b1cdbd2cSJim Jagielski public void init(byte[] bytes) { 58*b1cdbd2cSJim Jagielski // System.err.println("ByteArrayXInputStream"); 59*b1cdbd2cSJim Jagielski m_bytes = bytes; 60*b1cdbd2cSJim Jagielski m_length = bytes.length; 61*b1cdbd2cSJim Jagielski m_pos = 0; 62*b1cdbd2cSJim Jagielski m_open = true; 63*b1cdbd2cSJim Jagielski } 64*b1cdbd2cSJim Jagielski _check()65*b1cdbd2cSJim Jagielski private void _check() throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException { 66*b1cdbd2cSJim Jagielski if (m_bytes == null) { 67*b1cdbd2cSJim Jagielski // System.err.println("check failed no bytes!"); 68*b1cdbd2cSJim Jagielski throw new com.sun.star.io.NotConnectedException("no bytes"); 69*b1cdbd2cSJim Jagielski } 70*b1cdbd2cSJim Jagielski if(!m_open) { 71*b1cdbd2cSJim Jagielski // System.err.println("check failed: closed"); 72*b1cdbd2cSJim Jagielski throw new com.sun.star.io.IOException("input closed"); 73*b1cdbd2cSJim Jagielski } 74*b1cdbd2cSJim Jagielski } 75*b1cdbd2cSJim Jagielski available()76*b1cdbd2cSJim Jagielski public int available() throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException { 77*b1cdbd2cSJim Jagielski _check(); 78*b1cdbd2cSJim Jagielski long a = m_length - m_pos; 79*b1cdbd2cSJim Jagielski if (a != (int)a) 80*b1cdbd2cSJim Jagielski throw new com.sun.star.io.IOException("integer overflow"); 81*b1cdbd2cSJim Jagielski else { 82*b1cdbd2cSJim Jagielski // System.err.println("available() -> "+a); 83*b1cdbd2cSJim Jagielski return (int)a; 84*b1cdbd2cSJim Jagielski } 85*b1cdbd2cSJim Jagielski } 86*b1cdbd2cSJim Jagielski closeInput()87*b1cdbd2cSJim Jagielski public void closeInput() throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException { 88*b1cdbd2cSJim Jagielski // System.err.println("closeInput()"); 89*b1cdbd2cSJim Jagielski _check(); 90*b1cdbd2cSJim Jagielski m_open = false; 91*b1cdbd2cSJim Jagielski } 92*b1cdbd2cSJim Jagielski readBytes(byte[][] values, int param)93*b1cdbd2cSJim Jagielski public int readBytes(byte[][] values, int param) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { 94*b1cdbd2cSJim Jagielski // System.err.println("readbytes(..., "+param+")"); 95*b1cdbd2cSJim Jagielski _check(); 96*b1cdbd2cSJim Jagielski try { 97*b1cdbd2cSJim Jagielski int remain = (int)(m_length - m_pos); 98*b1cdbd2cSJim Jagielski if (param > remain) param = remain; 99*b1cdbd2cSJim Jagielski /* ARGH!!! */ 100*b1cdbd2cSJim Jagielski if (values[0] == null){ 101*b1cdbd2cSJim Jagielski values[0] = new byte[param]; 102*b1cdbd2cSJim Jagielski // System.err.println("allocated new buffer of "+param+" bytes"); 103*b1cdbd2cSJim Jagielski } 104*b1cdbd2cSJim Jagielski System.arraycopy(m_bytes, m_pos, values[0], 0, param); 105*b1cdbd2cSJim Jagielski // System.err.println("readbytes() -> "+param); 106*b1cdbd2cSJim Jagielski m_pos += param; 107*b1cdbd2cSJim Jagielski return param; 108*b1cdbd2cSJim Jagielski } catch (ArrayIndexOutOfBoundsException ae) { 109*b1cdbd2cSJim Jagielski // System.err.println("readbytes() -> ArrayIndexOutOfBounds"); 110*b1cdbd2cSJim Jagielski ae.printStackTrace(); 111*b1cdbd2cSJim Jagielski throw new com.sun.star.io.BufferSizeExceededException("buffer overflow"); 112*b1cdbd2cSJim Jagielski } catch (Exception e) { 113*b1cdbd2cSJim Jagielski // System.err.println("readbytes() -> Exception: "+e.getMessage()); 114*b1cdbd2cSJim Jagielski e.printStackTrace(); 115*b1cdbd2cSJim Jagielski throw new com.sun.star.io.IOException("error accessing buffer"); 116*b1cdbd2cSJim Jagielski } 117*b1cdbd2cSJim Jagielski } 118*b1cdbd2cSJim Jagielski readSomeBytes(byte[][] values, int param)119*b1cdbd2cSJim Jagielski public int readSomeBytes(byte[][] values, int param) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { 120*b1cdbd2cSJim Jagielski // System.err.println("readSomebytes()"); 121*b1cdbd2cSJim Jagielski return readBytes(values, param); 122*b1cdbd2cSJim Jagielski } 123*b1cdbd2cSJim Jagielski skipBytes(int param)124*b1cdbd2cSJim Jagielski public void skipBytes(int param) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { 125*b1cdbd2cSJim Jagielski // System.err.println("skipBytes("+param+")"); 126*b1cdbd2cSJim Jagielski _check(); 127*b1cdbd2cSJim Jagielski if (param > (m_length - m_pos)) 128*b1cdbd2cSJim Jagielski throw new com.sun.star.io.BufferSizeExceededException("buffer overflow"); 129*b1cdbd2cSJim Jagielski m_pos += param; 130*b1cdbd2cSJim Jagielski } 131*b1cdbd2cSJim Jagielski getLength()132*b1cdbd2cSJim Jagielski public long getLength() throws com.sun.star.io.IOException { 133*b1cdbd2cSJim Jagielski // System.err.println("getLength() -> "+m_length); 134*b1cdbd2cSJim Jagielski if (m_bytes != null) return m_length; 135*b1cdbd2cSJim Jagielski else throw new com.sun.star.io.IOException("no bytes"); 136*b1cdbd2cSJim Jagielski } 137*b1cdbd2cSJim Jagielski getPosition()138*b1cdbd2cSJim Jagielski public long getPosition() throws com.sun.star.io.IOException { 139*b1cdbd2cSJim Jagielski // System.err.println("getPosition() -> "+m_pos); 140*b1cdbd2cSJim Jagielski if (m_bytes != null) return m_pos; 141*b1cdbd2cSJim Jagielski else throw new com.sun.star.io.IOException("no bytes"); 142*b1cdbd2cSJim Jagielski } 143*b1cdbd2cSJim Jagielski seek(long param)144*b1cdbd2cSJim Jagielski public void seek(long param) throws com.sun.star.lang.IllegalArgumentException, com.sun.star.io.IOException { 145*b1cdbd2cSJim Jagielski // System.err.println("seek("+param+")"); 146*b1cdbd2cSJim Jagielski if (m_bytes != null){ 147*b1cdbd2cSJim Jagielski if (param < 0 || param > m_length) throw new com.sun.star.lang.IllegalArgumentException("invalid seek position"); 148*b1cdbd2cSJim Jagielski else m_pos = (int)param; 149*b1cdbd2cSJim Jagielski }else throw new com.sun.star.io.IOException("no bytes"); 150*b1cdbd2cSJim Jagielski } 151*b1cdbd2cSJim Jagielski finalize()152*b1cdbd2cSJim Jagielski public void finalize() throws Throwable{ 153*b1cdbd2cSJim Jagielski // System.err.println("finalizer called for ByteArrayXInputStream!"); 154*b1cdbd2cSJim Jagielski super.finalize(); 155*b1cdbd2cSJim Jagielski } 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski } 158