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 */ 045package com.github.jaiimageio.jpeg2000.impl; 046 047import java.io.IOException; 048import java.nio.ByteOrder; 049 050import javax.imageio.stream.ImageInputStream; 051 052import jj2000.j2k.io.EndianType; 053import jj2000.j2k.io.RandomAccessIO; 054 055/** 056 * A wrapper for converting an <code>ImageInputStream</code> into a 057 * <code>RandomAccessIO</code>. The resulting class is read-only. 058 */ 059public class IISRandomAccessIO implements RandomAccessIO { 060 061 /** The <code>ImageInputStream</code> that is wrapped */ 062 private ImageInputStream iis; 063 064 /** 065 * Creates a <code>RandomAccessIO</code> instance from the supplied 066 * <code>ImageInputStream</code>. 067 * 068 * @param iis The source <code>ImageInputStream</code>. 069 */ 070 public IISRandomAccessIO(ImageInputStream iis) { 071 if (iis == null) { 072 throw new IllegalArgumentException("iis == null!"); 073 } 074 this.iis = iis; 075 } 076 077 public void close() throws IOException { 078 iis.close(); 079 } 080 081 /** 082 * Returns the stream position clamped to a maximum of 083 * <code>Integer.MAX_VALUE</code>. 084 */ 085 public int getPos() throws IOException { 086 long pos = iis.getStreamPosition(); 087 return pos > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)pos; 088 } 089 090 public void seek(int off) throws IOException { 091 iis.seek(off); 092 } 093 094 /** 095 * Returns the length of the data stream. 096 * 097 * <p>If the length of the <code>ImageInputStream</code> is not 098 * <code>-1</code>, then it is returned after being clamped to 099 * a maximum value of <code>Integer.MAX_VALUE</code>. If the 100 * <code>ImageInputStream</code> is <code>-1</code>, the stream 101 * is read to a maximum position of <code>Integer.MAX_VALUE</code> 102 * and its final position is returned. The position of the stream 103 * is unchanged from the value it had prior to the call.</p> 104 */ 105 public int length() throws IOException { 106 long len = iis.length(); 107 108 // If the length is non-negative, use it. 109 if(len != -1L) { 110 return len > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)len; 111 } 112 113 // If the length is negative, read until the stream ends. 114 iis.mark(); 115 int bufLen = 1024; 116 byte[] buf = new byte[bufLen]; 117 long pos = iis.getStreamPosition(); 118 while(pos < Integer.MAX_VALUE) { 119 int numRead = iis.read(buf, 0, bufLen); 120 if(numRead == -1) 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 ? 139 EndianType.BIG_ENDIAN : 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}