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.hssf.record; 57 58 import org.apache.poi.util.LittleEndian; 59 60 /** 61 * Title: Unknown Record (for debugging)<P> 62 * Description: Unknown record just tells you the sid so you can figure out 63 * what records you are missing. Also helps us read/modify sheets we 64 * don't know all the records to. (HSSF leaves these alone!) <P> 65 * Company: SuperLink Software, Inc.<P> 66 * @author Andrew C. Oliver (acoliver at apache dot org) 67 * @author Jason Height (jheight at chariot dot net dot au) 68 * @version 2.0-pre 69 */ 70 71 public class UnknownRecord 72 extends Record 73 { 74 private short sid = 0; 75 private short size = 0; 76 private byte[] thedata = null; 77 int offset = 0; 78 79 public UnknownRecord() 80 { 81 } 82 83 /** 84 * construct an unknown record. No fields are interperated and the record will 85 * be serialized in its original form more or less 86 * @param id id of the record -not validated, just stored for serialization 87 * @param size size of the data 88 * @param data the data 89 */ 90 91 public UnknownRecord(short id, short size, byte [] data) 92 { 93 sid = id; 94 size = size; 95 thedata = data; 96 } 97 98 /** 99 * spit the record out AS IS. no interperatation or identification 100 */ 101 102 public int serialize(int offset, byte [] data) 103 { 104 if (thedata == null) 105 { 106 thedata = new byte[ 0 ]; 107 } 108 LittleEndian.putShort(data, 0 + offset, sid); 109 LittleEndian.putShort(data, 2 + offset, ( short ) (thedata.length)); 110 if (thedata.length > 0) 111 { 112 System.arraycopy(thedata, 0, data, 4 + offset, thedata.length); 113 } 114 return getRecordSize(); 115 } 116 117 public int getRecordSize() 118 { 119 int retval = 4; 120 121 if (thedata != null) 122 { 123 retval += thedata.length; 124 } 125 return retval; 126 } 127 128 protected void fillFields(byte [] data, short sid) 129 { 130 sid = sid; 131 thedata = data; 132 } 133 134 /** 135 * NO OP! 136 */ 137 138 protected void validateSid(short id) 139 { 140 141 // if we had a valid sid we wouldn't be using the "Unknown Record" record now would we? 142 } 143 144 /** 145 * print a sort of string representation ([UNKNOWN RECORD] id = x [/UNKNOWN RECORD]) 146 */ 147 148 public String toString() 149 { 150 StringBuffer buffer = new StringBuffer(); 151 152 buffer.append("[UNKNOWN RECORD:" + Integer.toHexString(sid) + "]\n"); 153 buffer.append(" .id = ").append(Integer.toHexString(sid)) 154 .append("\n"); 155 buffer.append("[/UNKNWON RECORD]\n"); 156 return buffer.toString(); 157 } 158 159 public short getSid() 160 { 161 return this.sid; 162 } 163 164 /** 165 * called by the constructor, should set class level fields. Should throw 166 * runtime exception for bad/icomplete data. 167 * 168 * @param data raw data 169 * @param size size of data 170 * @param offset of the records data (provided a big array of the file) 171 */ 172 173 protected void fillFields(byte [] data, short size, int offset) 174 { 175 throw new RecordFormatException( 176 "Unknown record cannot be constructed via offset -- we need a copy of the data"); 177 } 178 179 /** Unlike the other Record.clone methods this is a shallow clone*/ 180 public Object clone() { 181 UnknownRecord rec = new UnknownRecord(); 182 rec.offset = offset; 183 rec.sid = sid; 184 rec.size = size; 185 rec.thedata = thedata; 186 return rec; 187 } 188 } 189