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