1 2 /* ==================================================================== 3 * The Apache Software License, Version 1.1 4 * 5 * Copyright (c) 2002 The Apache Software Foundation. All rights 6 * reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in 17 * the documentation and/or other materials provided with the 18 * distribution. 19 * 20 * 3. The end-user documentation included with the redistribution, 21 * if any, must include the following acknowledgment: 22 * "This product includes software developed by the 23 * Apache Software Foundation (http://www.apache.org/)." 24 * Alternately, this acknowledgment may appear in the software itself, 25 * if and wherever such third-party acknowledgments normally appear. 26 * 27 * 4. The names "Apache" and "Apache Software Foundation" and 28 * "Apache POI" must not be used to endorse or promote products 29 * derived from this software without prior written permission. For 30 * written permission, please contact apache@apache.org. 31 * 32 * 5. Products derived from this software may not be called "Apache", 33 * "Apache POI", nor may "Apache" appear in their name, without 34 * prior written permission of the Apache Software Foundation. 35 * 36 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 37 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 38 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 39 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 42 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 43 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 44 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 45 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 46 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 47 * SUCH DAMAGE. 48 * ==================================================================== 49 * 50 * This software consists of voluntary contributions made by many 51 * individuals on behalf of the Apache Software Foundation. For more 52 * information on the Apache Software Foundation, please see 53 * <http://www.apache.org/>. 54 */ 55 56 package org.apache.poi.util; 57 58 import org.apache.poi.util.LittleEndian.BufferUnderrunException; 59 60 import java.io.*; 61 62 /** 63 * representation of a short (16-bit) field at a fixed location within 64 * a byte array 65 * 66 * @author Marc Johnson (mjohnson at apache dot org 67 */ 68 69 public class ShortField 70 implements FixedField 71 { 72 private short _value; 73 private final int _offset; 74 75 /** 76 * construct the ShortField with its offset into its containing 77 * byte array 78 * 79 * @param offset of the field within its byte array 80 * 81 * @exception ArrayIndexOutOfBoundsException if offset is negative 82 */ 83 84 public ShortField(final int offset) 85 throws ArrayIndexOutOfBoundsException 86 { 87 if (offset < 0) 88 { 89 throw new ArrayIndexOutOfBoundsException("Illegal offset: " 90 + offset); 91 } 92 _offset = offset; 93 } 94 95 /** 96 * construct the ShortField with its offset into its containing 97 * byte array and initialize its value 98 * 99 * @param offset of the field within its byte array 100 * @param value the initial value 101 * 102 * @exception ArrayIndexOutOfBoundsException if offset is negative 103 */ 104 105 public ShortField(final int offset, final short value) 106 throws ArrayIndexOutOfBoundsException 107 { 108 this(offset); 109 set(value); 110 } 111 112 /** 113 * Construct the ShortField with its offset into its containing 114 * byte array and initialize its value from its byte array 115 * 116 * @param offset of the field within its byte array 117 * @param data the byte array to read the value from 118 * 119 * @exception ArrayIndexOutOfBoundsException if the offset is not 120 * within the range of 0..(data.length - 1) 121 */ 122 123 public ShortField(final int offset, final byte [] data) 124 throws ArrayIndexOutOfBoundsException 125 { 126 this(offset); 127 readFromBytes(data); 128 } 129 130 /** 131 * construct the ShortField with its offset into its containing 132 * byte array, initialize its value, and write its value to its 133 * byte array 134 * 135 * @param offset of the field within its byte array 136 * @param value the initial value 137 * @param data the byte array to write the value to 138 * 139 * @exception ArrayIndexOutOfBoundsException if offset is negative 140 */ 141 142 public ShortField(final int offset, final short value, final byte [] data) 143 throws ArrayIndexOutOfBoundsException 144 { 145 this(offset); 146 set(value, data); 147 } 148 149 /** 150 * get the ShortField's current value 151 * 152 * @return current value 153 */ 154 155 public short get() 156 { 157 return _value; 158 } 159 160 /** 161 * set the ShortField's current value 162 * 163 * @param value to be set 164 */ 165 166 public void set(final short value) 167 { 168 _value = value; 169 } 170 171 /** 172 * set the ShortField's current value and write it to a byte array 173 * 174 * @param value to be set 175 * @param data the byte array to write the value to 176 * 177 * @exception ArrayIndexOutOfBoundsException if the offset is out 178 * of range 179 */ 180 181 public void set(final short value, final byte [] data) 182 throws ArrayIndexOutOfBoundsException 183 { 184 _value = value; 185 writeToBytes(data); 186 } 187 188 /* ********** START implementation of FixedField ********** */ 189 190 /** 191 * set the value from its offset into an array of bytes 192 * 193 * @param data the byte array from which the value is to be read 194 * 195 * @exception ArrayIndexOutOfBoundsException if the offset is out 196 * of range 197 */ 198 199 public void readFromBytes(final byte [] data) 200 throws ArrayIndexOutOfBoundsException 201 { 202 _value = LittleEndian.getShort(data, _offset); 203 } 204 205 /** 206 * set the value from an InputStream 207 * 208 * @param stream the InputStream from which the value is to be 209 * read 210 * 211 * @exception BufferUnderrunException if there is not enough data 212 * available from the InputStream 213 * @exception IOException if an IOException is thrown from reading 214 * the InputStream 215 */ 216 217 public void readFromStream(final InputStream stream) 218 throws IOException, BufferUnderrunException 219 { 220 _value = LittleEndian.readShort(stream); 221 } 222 223 /** 224 * write the value out to an array of bytes at the appropriate 225 * offset 226 * 227 * @param data the array of bytes to which the value is to be 228 * written 229 * 230 * @exception ArrayIndexOutOfBoundsException if the offset is out 231 * of range 232 */ 233 234 public void writeToBytes(final byte [] data) 235 throws ArrayIndexOutOfBoundsException 236 { 237 LittleEndian.putShort(data, _offset, _value); 238 } 239 240 /** 241 * return the value as a String 242 * 243 * @return the value as a String 244 */ 245 246 public String toString() 247 { 248 return String.valueOf(_value); 249 } 250 251 /* ********** END implementation of FixedField ********** */ 252 } // end public class ShortField 253 254