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.sun.media.imageioimpl.plugins.jpeg2000; 046 047import java.io.IOException; 048import java.nio.ByteOrder; 049import javax.imageio.stream.ImageInputStream; 050import jj2000.j2k.io.EndianType; 051import 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 */ 057public 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 : (int)len; 109 } 110 111 // If the length is negative, read until the stream ends. 112 iis.mark(); 113 int bufLen = 1024; 114 byte[] buf = new byte[bufLen]; 115 long pos = iis.getStreamPosition(); 116 while(pos < Integer.MAX_VALUE) { 117 int numRead = iis.read(buf, 0, bufLen); 118 if(numRead == -1) break; // EOF 119 pos += numRead; 120 } 121 iis.reset(); 122 123 // Return the last position. 124 return pos > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)pos; 125 } 126 127 public int read() throws IOException { 128 return iis.read(); 129 } 130 131 public void readFully(byte b[], int off, int n) throws IOException { 132 iis.readFully(b, off, n); 133 } 134 135 public int getByteOrdering() { 136 return iis.getByteOrder() == ByteOrder.BIG_ENDIAN ? 137 EndianType.BIG_ENDIAN : EndianType.LITTLE_ENDIAN; 138 } 139 140 public byte readByte() throws IOException { 141 return iis.readByte(); 142 } 143 144 public int readUnsignedByte() throws IOException { 145 return iis.readUnsignedByte(); 146 } 147 148 public short readShort() throws IOException { 149 return iis.readShort(); 150 } 151 152 public int readUnsignedShort() throws IOException { 153 return iis.readUnsignedShort(); 154 } 155 156 public int readInt() throws IOException { 157 return iis.readInt(); 158 } 159 160 public long readUnsignedInt() throws IOException { 161 return iis.readUnsignedInt(); 162 } 163 164 public long readLong() throws IOException { 165 return iis.readLong(); 166 } 167 168 public float readFloat() throws IOException { 169 return iis.readFloat(); 170 } 171 172 public double readDouble() throws IOException { 173 return iis.readDouble(); 174 } 175 176 public int skipBytes(int n) throws IOException { 177 return iis.skipBytes(n); 178 } 179 180 /** 181 * A null operation as writing is not supported. 182 */ 183 public void flush() { 184 // Intentionally empty. 185 } 186 187 /** 188 * Throws an <code>IOException</code> as writing is not supported. 189 */ 190 public void write(int b) throws IOException { 191 throw new IOException("Writing is not supported!"); 192 } 193 194 /** 195 * Throws an <code>IOException</code> as writing is not supported. 196 */ 197 public void writeByte(int v) throws IOException { 198 throw new IOException("Writing is not supported!"); 199 } 200 201 /** 202 * Throws an <code>IOException</code> as writing is not supported. 203 */ 204 public void writeShort(int v) throws IOException { 205 throw new IOException("Writing is not supported!"); 206 } 207 208 /** 209 * Throws an <code>IOException</code> as writing is not supported. 210 */ 211 public void writeInt(int v) throws IOException { 212 throw new IOException("Writing is not supported!"); 213 } 214 215 /** 216 * Throws an <code>IOException</code> as writing is not supported. 217 */ 218 public void writeLong(long v) throws IOException { 219 throw new IOException("Writing is not supported!"); 220 } 221 222 /** 223 * Throws an <code>IOException</code> as writing is not supported. 224 */ 225 public void writeFloat(float v) throws IOException { 226 throw new IOException("Writing is not supported!"); 227 } 228 229 /** 230 * Throws an <code>IOException</code> as writing is not supported. 231 */ 232 public void writeDouble(double v) throws IOException { 233 throw new IOException("Writing is not supported!"); 234 } 235}