latest changes

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353192 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Said Ryan Ackley 2003-07-07 00:45:06 +00:00
parent b2a59f04f8
commit c911661f33
2 changed files with 120 additions and 38 deletions

View File

@ -72,6 +72,8 @@ public class StyleDescription implements HDFType
private static int PARAGRAPH_STYLE = 1; private static int PARAGRAPH_STYLE = 1;
private static int CHARACTER_STYLE = 2; private static int CHARACTER_STYLE = 2;
private int _istd;
private int _baseLength;
private short _infoShort; private short _infoShort;
private static BitField _sti = new BitField(0xfff); private static BitField _sti = new BitField(0xfff);
private static BitField _fScratch = new BitField(0x1000); private static BitField _fScratch = new BitField(0x1000);
@ -81,10 +83,11 @@ public class StyleDescription implements HDFType
private short _infoShort2; private short _infoShort2;
private static BitField _styleTypeCode = new BitField(0xf); private static BitField _styleTypeCode = new BitField(0xf);
private static BitField _baseStyle = new BitField(0xfff0); private static BitField _baseStyle = new BitField(0xfff0);
private short _infoShort3;
private static BitField _numUPX = new BitField(0xf); private static BitField _numUPX = new BitField(0xf);
private static BitField _nextStyle = new BitField(0xfff0); private static BitField _nextStyle = new BitField(0xfff0);
private short _bchUpe; private short _bchUpe;
private short _infoShort3; private short _infoShort4;
private static BitField _fAutoRedef = new BitField(0x1); private static BitField _fAutoRedef = new BitField(0x1);
private static BitField _fHidden = new BitField(0x2); private static BitField _fHidden = new BitField(0x2);
@ -101,14 +104,17 @@ public class StyleDescription implements HDFType
} }
public StyleDescription(byte[] std, int baseLength, int offset, boolean word9) public StyleDescription(byte[] std, int baseLength, int offset, boolean word9)
{ {
int nameStart = offset + baseLength; _baseLength = baseLength;
int nameStart = offset + baseLength;
_infoShort = LittleEndian.getShort(std, offset); _infoShort = LittleEndian.getShort(std, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_infoShort2 = LittleEndian.getShort(std, offset); _infoShort2 = LittleEndian.getShort(std, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_infoShort3 = LittleEndian.getShort(std, offset);
offset += LittleEndian.SHORT_SIZE;
_bchUpe = LittleEndian.getShort(std, offset); _bchUpe = LittleEndian.getShort(std, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_infoShort3 = LittleEndian.getShort(std, offset); _infoShort4 = LittleEndian.getShort(std, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
//first byte(s) of variable length section of std is the length of the //first byte(s) of variable length section of std is the length of the
@ -135,13 +141,13 @@ public class StyleDescription implements HDFType
// ignore // ignore
} }
//2 bytes for length, length then null terminator. //length then null terminator.
int grupxStart = multiplier + ((nameLength + 1) * multiplier) + nameStart; int grupxStart = ((nameLength + 1) * multiplier) + nameStart;
// the spec only refers to two possible upxs but it mentions // the spec only refers to two possible upxs but it mentions
// that more may be added in the future // that more may be added in the future
int add = 0; int add = 0;
int numUPX = _numUPX.getValue(_infoShort2); int numUPX = _numUPX.getValue(_infoShort3);
for(int x = 0; x < numUPX; x++) for(int x = 0; x < numUPX; x++)
{ {
int upxSize = LittleEndian.getShort(std, grupxStart + add); int upxSize = LittleEndian.getShort(std, grupxStart + add);
@ -149,8 +155,10 @@ public class StyleDescription implements HDFType
{ {
if(x == 0) if(x == 0)
{ {
_istd = LittleEndian.getShort(std, grupxStart + add + 2);
int grrprlSize = upxSize - 2;
_papx = new byte[upxSize]; _papx = new byte[upxSize];
System.arraycopy(std, grupxStart + add + 2, _papx, 0, upxSize); System.arraycopy(std, grupxStart + add + 4, _papx, 0, grrprlSize);
} }
else if(x == 1) else if(x == 1)
{ {
@ -204,15 +212,19 @@ public class StyleDescription implements HDFType
// } // }
public byte[] toByteArray() public byte[] toByteArray()
{ {
// size equals 8 bytes for known variables plus 2 bytes for name length plus // size equals _baseLength bytes for known variables plus 2 bytes for name
// name length * 2 plus 2 bytes for null plus upx's preceded by length // length plus name length * 2 plus 2 bytes for null plus upx's preceded by
int size = 8 + 2 + ((_name.length() + 1) * 2); // length
int size = _baseLength + 2 + ((_name.length() + 1) * 2);
//only worry about papx and chpx for upxs //only worry about papx and chpx for upxs
if(_styleTypeCode.getValue(_infoShort2) == PARAGRAPH_STYLE) if(_styleTypeCode.getValue(_infoShort2) == PARAGRAPH_STYLE)
{ {
size += _papx.length + 2 + (_papx.length % 2); size += _papx.length + 4 + (_papx.length % 2);
size += _chpx.length + 2; if (_chpx != null)
{
size += _chpx.length + 2;
}
} }
else if (_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE) else if (_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE)
{ {
@ -226,9 +238,11 @@ public class StyleDescription implements HDFType
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
LittleEndian.putShort(buf, offset, _infoShort2); LittleEndian.putShort(buf, offset, _infoShort2);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
LittleEndian.putShort(buf, offset, _infoShort3);
offset += LittleEndian.SHORT_SIZE;
LittleEndian.putShort(buf, offset, _bchUpe); LittleEndian.putShort(buf, offset, _bchUpe);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
LittleEndian.putShort(buf, offset, _infoShort3); LittleEndian.putShort(buf, offset, _infoShort4);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
char[] letters = _name.toCharArray(); char[] letters = _name.toCharArray();
@ -247,13 +261,18 @@ public class StyleDescription implements HDFType
{ {
LittleEndian.putShort(buf, offset, (short)_papx.length); LittleEndian.putShort(buf, offset, (short)_papx.length);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
LittleEndian.putShort(buf, offset, (short)_istd);
offset += LittleEndian.SHORT_SIZE;
System.arraycopy(_papx, 0, buf, offset, _papx.length); System.arraycopy(_papx, 0, buf, offset, _papx.length);
offset += _papx.length + (_papx.length % 2); offset += _papx.length + (_papx.length % 2);
LittleEndian.putShort(buf, offset, (short)_chpx.length); if (_chpx != null)
offset += LittleEndian.SHORT_SIZE; {
System.arraycopy(_chpx, 0, buf, offset, _chpx.length); LittleEndian.putShort(buf, offset, (short) _chpx.length);
offset += _chpx.length; offset += LittleEndian.SHORT_SIZE;
System.arraycopy(_chpx, 0, buf, offset, _chpx.length);
offset += _chpx.length;
}
} }
else if (_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE) else if (_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE)
{ {
@ -265,4 +284,38 @@ public class StyleDescription implements HDFType
return buf; return buf;
} }
public boolean equals(Object o)
{
StyleDescription sd = (StyleDescription)o;
if (sd._infoShort == _infoShort && sd._infoShort2 == _infoShort2 &&
sd._infoShort3 == _infoShort3 && sd._bchUpe == _bchUpe &&
sd._infoShort4 == _infoShort4 &&
_name.equals(sd._name))
{
if (_chpx != null && _chpx.length == sd._chpx.length)
{
for (int x = 0; x < _chpx.length; x++)
{
if (_chpx[x] != sd._chpx[x])
{
return false;
}
}
return true;
}
if (_papx != null && _papx.length == sd._papx.length)
{
for (int x = 0; x < _papx.length; x++)
{
if (_papx[x] != sd._papx[x])
{
return false;
}
}
return true;
}
}
return false;
}
} }

View File

@ -101,44 +101,44 @@ public class StyleSheet implements HDFType
* info. Found by using FileInformationBlock.getFcStshf() and * info. Found by using FileInformationBlock.getFcStshf() and
* FileInformationBLock.getLcbStshf() * FileInformationBLock.getLcbStshf()
*/ */
public StyleSheet(byte[] styleSheet, int offset) public StyleSheet(byte[] tableStream, int offset)
{ {
_stshiLength = LittleEndian.getShort(styleSheet, offset); _stshiLength = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
int stdCount = LittleEndian.getShort(styleSheet, offset); int stdCount = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_baseLength = LittleEndian.getShort(styleSheet, offset); _baseLength = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_flags = LittleEndian.getShort(styleSheet, offset); _flags = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_maxIndex = LittleEndian.getShort(styleSheet, offset); _maxIndex = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_maxFixedIndex = LittleEndian.getShort(styleSheet, offset); _maxFixedIndex = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_stylenameVersion = LittleEndian.getShort(styleSheet, offset); _stylenameVersion = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_rgftc = new int[3]; _rgftc = new int[3];
_rgftc[0] = LittleEndian.getShort(styleSheet, offset); _rgftc[0] = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_rgftc[1] = LittleEndian.getShort(styleSheet, offset); _rgftc[1] = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE;
_rgftc[2] = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_rgftc[2] = LittleEndian.getShort(styleSheet, offset);
offset = (2 + _stshiLength); //offset = (2 + _stshiLength);
_styleDescriptions = new StyleDescription[stdCount]; _styleDescriptions = new StyleDescription[stdCount];
for(int x = 0; x < stdCount; x++) for(int x = 0; x < stdCount; x++)
{ {
int stdSize = LittleEndian.getShort(styleSheet, offset); int stdSize = LittleEndian.getShort(tableStream, offset);
//get past the size
offset += 2;
if(stdSize > 0) if(stdSize > 0)
{ {
byte[] std = new byte[stdSize]; //byte[] std = new byte[stdSize];
//get past the size StyleDescription aStyle = new StyleDescription(tableStream,
offset += 2;
StyleDescription aStyle = new StyleDescription(styleSheet,
_baseLength, offset, true); _baseLength, offset, true);
_styleDescriptions[x] = aStyle; _styleDescriptions[x] = aStyle;
@ -157,11 +157,12 @@ public class StyleSheet implements HDFType
} }
} }
public void write(HWPFOutputStream out) public void writeTo(HWPFOutputStream out)
throws IOException throws IOException
{ {
int offset = 0; int offset = 0;
byte[] buf = new byte[_stshiLength]; // add two bytes so we can prepend the styelsheet w/ its size
byte[] buf = new byte[_stshiLength + 2];
LittleEndian.putShort(buf, offset, (short)_stshiLength); LittleEndian.putShort(buf, offset, (short)_stshiLength);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
LittleEndian.putShort(buf, offset, (short)_styleDescriptions.length); LittleEndian.putShort(buf, offset, (short)_styleDescriptions.length);
@ -192,7 +193,7 @@ public class StyleSheet implements HDFType
{ {
byte[] std = _styleDescriptions[x].toByteArray(); byte[] std = _styleDescriptions[x].toByteArray();
LittleEndian.putShort(sizeHolder, (short)std.length); LittleEndian.putShort(sizeHolder, (short)(std.length));
out.write(sizeHolder); out.write(sizeHolder);
out.write(std); out.write(std);
} }
@ -203,7 +204,35 @@ public class StyleSheet implements HDFType
out.write(sizeHolder); out.write(sizeHolder);
} }
} }
}
public boolean equals(Object o)
{
StyleSheet ss = (StyleSheet)o;
if (ss._baseLength == _baseLength && ss._flags == _flags &&
ss._maxFixedIndex ==_maxFixedIndex && ss._maxIndex == _maxIndex &&
ss._rgftc[0] == _rgftc[0] && ss._rgftc[1] == _rgftc[1] &&
ss._rgftc[2] == _rgftc[2] && ss._stshiLength == _stshiLength &&
ss._stylenameVersion == _stylenameVersion)
{
if (ss._styleDescriptions.length == _styleDescriptions.length)
{
for (int x = 0; x < _styleDescriptions.length; x++)
{
// check for null
if (ss._styleDescriptions[x] != _styleDescriptions[x])
{
// check for equality
if (!ss._styleDescriptions[x].equals(_styleDescriptions[x]))
{
return false;
}
}
}
return true;
}
}
return false;
} }
/** /**
* Creates a PartagraphProperties object from a papx stored in the * Creates a PartagraphProperties object from a papx stored in the