jxl.biff.BaseCompoundFile Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jxl Show documentation
Show all versions of jxl Show documentation
JExcelApi is a java library which provides the ability to read, write, and modify Microsoft Excel spreadsheets.
The newest version!
/*********************************************************************
*
* Copyright (C) 2002 Andrew Khan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/
package jxl.biff;
import jxl.common.Assert;
import jxl.common.Logger;
/**
* Contains the common data for a compound file
*/
public abstract class BaseCompoundFile
{
/**
* The logger
*/
private static Logger logger = Logger.getLogger(BaseCompoundFile.class);
/**
* The identifier at the beginning of every OLE file
*/
protected static final byte[] IDENTIFIER = new byte[]
{(byte) 0xd0,
(byte) 0xcf,
(byte) 0x11,
(byte) 0xe0,
(byte) 0xa1,
(byte) 0xb1,
(byte) 0x1a,
(byte) 0xe1};
/**
*/
protected static final int NUM_BIG_BLOCK_DEPOT_BLOCKS_POS = 0x2c;
/**
*/
protected static final int SMALL_BLOCK_DEPOT_BLOCK_POS = 0x3c;
/**
*/
protected static final int NUM_SMALL_BLOCK_DEPOT_BLOCKS_POS = 0x40;
/**
*/
protected static final int ROOT_START_BLOCK_POS = 0x30;
/**
*/
protected static final int BIG_BLOCK_SIZE = 0x200;
/**
*/
protected static final int SMALL_BLOCK_SIZE = 0x40;
/**
*/
protected static final int EXTENSION_BLOCK_POS = 0x44;
/**
*/
protected static final int NUM_EXTENSION_BLOCK_POS = 0x48;
/**
*/
protected static final int PROPERTY_STORAGE_BLOCK_SIZE = 0x80;
/**
*/
protected static final int BIG_BLOCK_DEPOT_BLOCKS_POS = 0x4c;
/**
*/
protected static final int SMALL_BLOCK_THRESHOLD = 0x1000;
// property storage offsets
/**
*/
private static final int SIZE_OF_NAME_POS = 0x40;
/**
*/
private static final int TYPE_POS = 0x42;
/**
*/
private static final int COLOUR_POS = 0x43;
/**
*/
private static final int PREVIOUS_POS = 0x44;
/**
*/
private static final int NEXT_POS = 0x48;
/**
*/
private static final int CHILD_POS = 0x4c;
/**
*/
private static final int START_BLOCK_POS = 0x74;
/**
*/
private static final int SIZE_POS = 0x78;
/**
* The standard property sets
*/
public final static String ROOT_ENTRY_NAME = "Root Entry";
public final static String WORKBOOK_NAME = "Workbook";
public final static String SUMMARY_INFORMATION_NAME =
"\u0005SummaryInformation";
public final static String DOCUMENT_SUMMARY_INFORMATION_NAME =
"\u0005DocumentSummaryInformation";
public final static String COMP_OBJ_NAME =
"\u0001CompObj";
public final static String[] STANDARD_PROPERTY_SETS =
new String[] {ROOT_ENTRY_NAME, WORKBOOK_NAME,
SUMMARY_INFORMATION_NAME,
DOCUMENT_SUMMARY_INFORMATION_NAME};
/**
* Property storage types
*/
public final static int NONE_PS_TYPE = 0;
public final static int DIRECTORY_PS_TYPE = 1;
public final static int FILE_PS_TYPE = 2;
public final static int ROOT_ENTRY_PS_TYPE = 5;
/**
* Inner class to represent the property storage sets. Access is public
* to allow access from the PropertySetsReader demo utility
*/
public class PropertyStorage
{
/**
* The name of this property set
*/
public String name;
/**
* The type of the property set
*/
public int type;
/**
* The colour of the property set
*/
public int colour;
/**
* The block number in the stream which this property sets starts at
*/
public int startBlock;
/**
* The size, in bytes, of this property set
*/
public int size;
/**
* The previous property set
*/
public int previous;
/**
* The next property set
*/
public int next;
/**
* The child for this property set
*/
public int child;
/**
* The data that created this set
*/
public byte[] data;
/**
* Constructs a property set
*
* @param d the bytes
*/
public PropertyStorage(byte[] d)
{
data = d;
int nameSize = IntegerHelper.getInt(data[SIZE_OF_NAME_POS],
data[SIZE_OF_NAME_POS + 1]);
if (nameSize > SIZE_OF_NAME_POS)
{
logger.warn("property set name exceeds max length - truncating");
nameSize = SIZE_OF_NAME_POS;
}
type = data[TYPE_POS];
colour = data[COLOUR_POS];
startBlock = IntegerHelper.getInt
(data[START_BLOCK_POS],
data[START_BLOCK_POS + 1],
data[START_BLOCK_POS + 2],
data[START_BLOCK_POS + 3]);
size = IntegerHelper.getInt
(data[SIZE_POS],
data[SIZE_POS + 1],
data[SIZE_POS + 2],
data[SIZE_POS + 3]);
previous = IntegerHelper.getInt
(data[PREVIOUS_POS],
data[PREVIOUS_POS+1],
data[PREVIOUS_POS+2],
data[PREVIOUS_POS+3]);
next = IntegerHelper.getInt
(data[NEXT_POS],
data[NEXT_POS+1],
data[NEXT_POS+2],
data[NEXT_POS+3]);
child = IntegerHelper.getInt
(data[CHILD_POS],
data[CHILD_POS+1],
data[CHILD_POS+2],
data[CHILD_POS+3]);
int chars = 0;
if (nameSize > 2)
{
chars = (nameSize - 1) / 2;
}
StringBuffer n = new StringBuffer("");
for (int i = 0; i < chars ; i++)
{
n.append( (char) data[i * 2]);
}
name = n.toString();
}
/**
* Constructs an empty property set. Used when writing the file
*
* @param name the property storage name
*/
public PropertyStorage(String name)
{
data = new byte[PROPERTY_STORAGE_BLOCK_SIZE];
Assert.verify(name.length() < 32);
IntegerHelper.getTwoBytes((name.length() + 1) * 2,
data,
SIZE_OF_NAME_POS);
// add one to the name length to allow for the null character at
// the end
for (int i = 0; i < name.length(); i++)
{
data[i * 2] = (byte) name.charAt(i);
}
}
/**
* Sets the type
*
* @param t the type
*/
public void setType(int t)
{
type = t;
data[TYPE_POS] = (byte) t;
}
/**
* Sets the number of the start block
*
* @param sb the number of the start block
*/
public void setStartBlock(int sb)
{
startBlock = sb;
IntegerHelper.getFourBytes(sb, data, START_BLOCK_POS);
}
/**
* Sets the size of the file
*
* @param s the size
*/
public void setSize(int s)
{
size = s;
IntegerHelper.getFourBytes(s, data, SIZE_POS);
}
/**
* Sets the previous block
*
* @param prev the previous block
*/
public void setPrevious(int prev)
{
previous = prev;
IntegerHelper.getFourBytes(prev, data, PREVIOUS_POS);
}
/**
* Sets the next block
*
* @param nxt the next block
*/
public void setNext(int nxt)
{
next = nxt;
IntegerHelper.getFourBytes(next, data, NEXT_POS);
}
/**
* Sets the child
*
* @param dir the child
*/
public void setChild(int dir)
{
child = dir;
IntegerHelper.getFourBytes(child, data, CHILD_POS);
}
/**
* Sets the colour
*
* @param col colour
*/
public void setColour(int col)
{
colour = col == 0 ? 0 : 1;
data[COLOUR_POS] = (byte) colour;
}
}
/**
* Constructor
*/
protected BaseCompoundFile()
{
}
}