001: /*
002: * $RCSfile: IISRandomAccessIO.java,v $
003: *
004: *
005: * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * - Redistribution of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * - Redistribution in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * Neither the name of Sun Microsystems, Inc. or the names of
020: * contributors may be used to endorse or promote products derived
021: * from this software without specific prior written permission.
022: *
023: * This software is provided "AS IS," without a warranty of any
024: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
025: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
026: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
027: * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
028: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
029: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
030: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
031: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
032: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
033: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
034: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
035: * POSSIBILITY OF SUCH DAMAGES.
036: *
037: * You acknowledge that this software is not designed or intended for
038: * use in the design, construction, operation or maintenance of any
039: * nuclear facility.
040: *
041: * $Revision: 1.1 $
042: * $Date: 2006/08/08 00:31:47 $
043: * $State: Exp $
044: */
045: package com.sun.media.imageioimpl.plugins.jpeg2000;
046:
047: import java.io.IOException;
048: import java.nio.ByteOrder;
049: import javax.imageio.stream.ImageInputStream;
050: import jj2000.j2k.io.EndianType;
051: import jj2000.j2k.io.RandomAccessIO;
052:
053: /**
054: * A wrapper for converting an <code>ImageInputStream</code> into a
055: * <code>RandomAccessIO</code>. The resulting class is read-only.
056: */
057: public class IISRandomAccessIO implements RandomAccessIO {
058:
059: /** The <code>ImageInputStream</code> that is wrapped */
060: private ImageInputStream iis;
061:
062: /**
063: * Creates a <code>RandomAccessIO</code> instance from the supplied
064: * <code>ImageInputStream</code>.
065: *
066: * @param iis The source <code>ImageInputStream</code>.
067: */
068: public IISRandomAccessIO(ImageInputStream iis) {
069: if (iis == null) {
070: throw new IllegalArgumentException("iis == null!");
071: }
072: this .iis = iis;
073: }
074:
075: public void close() throws IOException {
076: iis.close();
077: }
078:
079: /**
080: * Returns the stream position clamped to a maximum of
081: * <code>Integer.MAX_VALUE</code>.
082: */
083: public int getPos() throws IOException {
084: long pos = iis.getStreamPosition();
085: return pos > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) pos;
086: }
087:
088: public void seek(int off) throws IOException {
089: iis.seek(off);
090: }
091:
092: /**
093: * Returns the length of the data stream.
094: *
095: * <p>If the length of the <code>ImageInputStream</code> is not
096: * <code>-1</code>, then it is returned after being clamped to
097: * a maximum value of <code>Integer.MAX_VALUE</code>. If the
098: * <code>ImageInputStream</code> is <code>-1</code>, the stream
099: * is read to a maximum position of <code>Integer.MAX_VALUE</code>
100: * and its final position is returned. The position of the stream
101: * is unchanged from the value it had prior to the call.</p>
102: */
103: public int length() throws IOException {
104: long len = iis.length();
105:
106: // If the length is non-negative, use it.
107: if (len != -1L) {
108: return len > Integer.MAX_VALUE ? Integer.MAX_VALUE
109: : (int) len;
110: }
111:
112: // If the length is negative, read until the stream ends.
113: iis.mark();
114: int bufLen = 1024;
115: byte[] buf = new byte[bufLen];
116: long pos = iis.getStreamPosition();
117: while (pos < Integer.MAX_VALUE) {
118: int numRead = iis.read(buf, 0, bufLen);
119: if (numRead == -1)
120: break; // EOF
121: pos += numRead;
122: }
123: iis.reset();
124:
125: // Return the last position.
126: return pos > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) pos;
127: }
128:
129: public int read() throws IOException {
130: return iis.read();
131: }
132:
133: public void readFully(byte b[], int off, int n) throws IOException {
134: iis.readFully(b, off, n);
135: }
136:
137: public int getByteOrdering() {
138: return iis.getByteOrder() == ByteOrder.BIG_ENDIAN ? EndianType.BIG_ENDIAN
139: : EndianType.LITTLE_ENDIAN;
140: }
141:
142: public byte readByte() throws IOException {
143: return iis.readByte();
144: }
145:
146: public int readUnsignedByte() throws IOException {
147: return iis.readUnsignedByte();
148: }
149:
150: public short readShort() throws IOException {
151: return iis.readShort();
152: }
153:
154: public int readUnsignedShort() throws IOException {
155: return iis.readUnsignedShort();
156: }
157:
158: public int readInt() throws IOException {
159: return iis.readInt();
160: }
161:
162: public long readUnsignedInt() throws IOException {
163: return iis.readUnsignedInt();
164: }
165:
166: public long readLong() throws IOException {
167: return iis.readLong();
168: }
169:
170: public float readFloat() throws IOException {
171: return iis.readFloat();
172: }
173:
174: public double readDouble() throws IOException {
175: return iis.readDouble();
176: }
177:
178: public int skipBytes(int n) throws IOException {
179: return iis.skipBytes(n);
180: }
181:
182: /**
183: * A null operation as writing is not supported.
184: */
185: public void flush() {
186: // Intentionally empty.
187: }
188:
189: /**
190: * Throws an <code>IOException</code> as writing is not supported.
191: */
192: public void write(int b) throws IOException {
193: throw new IOException("Writing is not supported!");
194: }
195:
196: /**
197: * Throws an <code>IOException</code> as writing is not supported.
198: */
199: public void writeByte(int v) throws IOException {
200: throw new IOException("Writing is not supported!");
201: }
202:
203: /**
204: * Throws an <code>IOException</code> as writing is not supported.
205: */
206: public void writeShort(int v) throws IOException {
207: throw new IOException("Writing is not supported!");
208: }
209:
210: /**
211: * Throws an <code>IOException</code> as writing is not supported.
212: */
213: public void writeInt(int v) throws IOException {
214: throw new IOException("Writing is not supported!");
215: }
216:
217: /**
218: * Throws an <code>IOException</code> as writing is not supported.
219: */
220: public void writeLong(long v) throws IOException {
221: throw new IOException("Writing is not supported!");
222: }
223:
224: /**
225: * Throws an <code>IOException</code> as writing is not supported.
226: */
227: public void writeFloat(float v) throws IOException {
228: throw new IOException("Writing is not supported!");
229: }
230:
231: /**
232: * Throws an <code>IOException</code> as writing is not supported.
233: */
234: public void writeDouble(double v) throws IOException {
235: throw new IOException("Writing is not supported!");
236: }
237: }
|