Remove more deprecated code

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1813092 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
PJ Fanning 2017-10-23 20:39:27 +00:00
parent 6c0ac68e05
commit af2813634b
3 changed files with 384 additions and 481 deletions

View File

@ -1,31 +0,0 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.hwpf.model;
import org.apache.poi.util.Internal;
/**
*
* @author andy
*/
@Internal
@Deprecated
public interface HDFType {
}

View File

@ -34,266 +34,237 @@ import org.apache.poi.util.StringUtil;
* @author Ryan Ackley * @author Ryan Ackley
*/ */
@Internal @Internal
public final class StyleDescription implements HDFType public final class StyleDescription {
{
private static final POILogger logger = POILogFactory.getLogger( StyleDescription.class ); private static final POILogger logger = POILogFactory.getLogger(StyleDescription.class);
//arbitrarily selected; may need to increase //arbitrarily selected; may need to increase
private static final int MAX_RECORD_LENGTH = 100_000; private static final int MAX_RECORD_LENGTH = 100_000;
private final static int PARAGRAPH_STYLE = 1; private final static int PARAGRAPH_STYLE = 1;
private final static int CHARACTER_STYLE = 2; private final static int CHARACTER_STYLE = 2;
// private final static int TABLE_STYLE = 3; // private final static int TABLE_STYLE = 3;
// private final static int NUMBERING_STYLE = 4; // private final static int NUMBERING_STYLE = 4;
private int _baseLength; private int _baseLength;
private StdfBase _stdfBase; private StdfBase _stdfBase;
private StdfPost2000 _stdfPost2000; private StdfPost2000 _stdfPost2000;
UPX[] _upxs; UPX[] _upxs;
String _name; String _name;
@Deprecated @Deprecated
ParagraphProperties _pap; ParagraphProperties _pap;
@Deprecated @Deprecated
CharacterProperties _chp; CharacterProperties _chp;
public StyleDescription() public StyleDescription() {
{
// _pap = new ParagraphProperties(); // _pap = new ParagraphProperties();
// _chp = new CharacterProperties(); // _chp = new CharacterProperties();
} }
public StyleDescription(byte[] std, int baseLength, int offset, boolean word9)
{ public StyleDescription(byte[] std, int baseLength, int offset, boolean word9) {
_baseLength = baseLength; _baseLength = baseLength;
int nameStart = offset + baseLength; int nameStart = offset + baseLength;
boolean readStdfPost2000 = false; boolean readStdfPost2000 = false;
if ( baseLength == 0x0012 ) if (baseLength == 0x0012) {
{
readStdfPost2000 = true; readStdfPost2000 = true;
} } else if (baseLength == 0x000A) {
else if ( baseLength == 0x000A )
{
readStdfPost2000 = false; readStdfPost2000 = false;
} } else {
else logger.log(POILogger.WARN,
{
logger.log( POILogger.WARN,
"Style definition has non-standard size of ", "Style definition has non-standard size of ",
Integer.valueOf( baseLength ) ); Integer.valueOf(baseLength));
} }
_stdfBase = new StdfBase(std, offset); _stdfBase = new StdfBase(std, offset);
offset += StdfBase.getSize(); offset += StdfBase.getSize();
if ( readStdfPost2000 ) if (readStdfPost2000) {
{ _stdfPost2000 = new StdfPost2000(std, offset);
_stdfPost2000 = new StdfPost2000( std, offset );
// offset += StdfPost2000.getSize(); // offset += StdfPost2000.getSize();
} }
//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
//style name and aliases string //style name and aliases string
int nameLength = 0; int nameLength = 0;
int multiplier = 1; int multiplier = 1;
if(word9) if (word9) {
{ nameLength = LittleEndian.getShort(std, nameStart);
nameLength = LittleEndian.getShort(std, nameStart); multiplier = 2;
multiplier = 2; nameStart += LittleEndian.SHORT_SIZE;
nameStart += LittleEndian.SHORT_SIZE; } else {
} nameLength = std[nameStart];
else
{
nameLength = std[nameStart];
}
_name = StringUtil.getFromUnicodeLE(std, nameStart, (nameLength*multiplier)/2);
//length then null terminator.
// the spec only refers to two possible upxs but it mentions
// that more may be added in the future
int varOffset = ((nameLength + 1) * multiplier) + nameStart;
int countOfUPX = _stdfBase.getCupx();
_upxs = new UPX[countOfUPX];
for(int x = 0; x < countOfUPX; x++)
{
int upxSize = LittleEndian.getShort(std, varOffset);
varOffset += LittleEndian.SHORT_SIZE;
byte[] upx = IOUtils.safelyAllocate(upxSize, Short.MAX_VALUE);
System.arraycopy(std, varOffset, upx, 0, upxSize);
_upxs[x] = new UPX(upx);
varOffset += upxSize;
// the upx will always start on a word boundary.
if((upxSize & 1) == 1)
{
++varOffset;
}
}
}
public int getBaseStyle()
{
return _stdfBase.getIstdBase();
}
public byte[] getCHPX()
{
switch (_stdfBase.getStk())
{
case PARAGRAPH_STYLE:
if (_upxs.length > 1)
{
return _upxs[1].getUPX();
} }
return null;
case CHARACTER_STYLE: _name = StringUtil.getFromUnicodeLE(std, nameStart, (nameLength * multiplier) / 2);
return _upxs[0].getUPX();
default: //length then null terminator.
return null;
// the spec only refers to two possible upxs but it mentions
// that more may be added in the future
int varOffset = ((nameLength + 1) * multiplier) + nameStart;
int countOfUPX = _stdfBase.getCupx();
_upxs = new UPX[countOfUPX];
for (int x = 0; x < countOfUPX; x++) {
int upxSize = LittleEndian.getShort(std, varOffset);
varOffset += LittleEndian.SHORT_SIZE;
byte[] upx = IOUtils.safelyAllocate(upxSize, Short.MAX_VALUE);
System.arraycopy(std, varOffset, upx, 0, upxSize);
_upxs[x] = new UPX(upx);
varOffset += upxSize;
// the upx will always start on a word boundary.
if ((upxSize & 1) == 1) {
++varOffset;
}
}
} }
} public int getBaseStyle() {
public byte[] getPAPX() return _stdfBase.getIstdBase();
{
switch (_stdfBase.getStk())
{
case PARAGRAPH_STYLE:
return _upxs[0].getUPX();
default:
return null;
}
}
@Deprecated
public ParagraphProperties getPAP()
{
return _pap;
}
@Deprecated
public CharacterProperties getCHP()
{
return _chp;
}
@Deprecated
void setPAP(ParagraphProperties pap)
{
_pap = pap;
}
@Deprecated
void setCHP(CharacterProperties chp)
{
_chp = chp;
}
public String getName()
{
return _name;
}
public byte[] toByteArray()
{
// size equals _baseLength bytes for known variables plus 2 bytes for name
// length plus name length * 2 plus 2 bytes for null plus upx's preceded by
// length
int size = _baseLength + 2 + ((_name.length() + 1) * 2);
// determine the size needed for the upxs. They always fall on word
// boundaries.
size += _upxs[0].size() + 2;
for (int x = 1; x < _upxs.length; x++)
{
size += _upxs[x-1].size() % 2;
size += _upxs[x].size() + 2;
} }
public byte[] getCHPX() {
switch (_stdfBase.getStk()) {
case PARAGRAPH_STYLE:
if (_upxs.length > 1) {
return _upxs[1].getUPX();
}
return null;
case CHARACTER_STYLE:
return _upxs[0].getUPX();
default:
return null;
}
byte[] buf = new byte[size];
_stdfBase.serialize( buf, 0 );
int offset = _baseLength;
char[] letters = _name.toCharArray();
LittleEndian.putShort(buf, _baseLength, (short)letters.length);
offset += LittleEndian.SHORT_SIZE;
for (int x = 0; x < letters.length; x++)
{
LittleEndian.putShort(buf, offset, (short)letters[x]);
offset += LittleEndian.SHORT_SIZE;
}
// get past the null delimiter for the name.
offset += LittleEndian.SHORT_SIZE;
for (int x = 0; x < _upxs.length; x++)
{
short upxSize = (short)_upxs[x].size();
LittleEndian.putShort(buf, offset, upxSize);
offset += LittleEndian.SHORT_SIZE;
System.arraycopy(_upxs[x].getUPX(), 0, buf, offset, upxSize);
offset += upxSize + (upxSize % 2);
} }
return buf; public byte[] getPAPX() {
} switch (_stdfBase.getStk()) {
case PARAGRAPH_STYLE:
return _upxs[0].getUPX();
default:
return null;
}
}
@Deprecated
public ParagraphProperties getPAP() {
return _pap;
}
@Deprecated
public CharacterProperties getCHP() {
return _chp;
}
@Deprecated
void setPAP(ParagraphProperties pap) {
_pap = pap;
}
@Deprecated
void setCHP(CharacterProperties chp) {
_chp = chp;
}
public String getName() {
return _name;
}
public byte[] toByteArray() {
// size equals _baseLength bytes for known variables plus 2 bytes for name
// length plus name length * 2 plus 2 bytes for null plus upx's preceded by
// length
int size = _baseLength + 2 + ((_name.length() + 1) * 2);
// determine the size needed for the upxs. They always fall on word
// boundaries.
size += _upxs[0].size() + 2;
for (int x = 1; x < _upxs.length; x++) {
size += _upxs[x - 1].size() % 2;
size += _upxs[x].size() + 2;
}
byte[] buf = new byte[size];
_stdfBase.serialize(buf, 0);
int offset = _baseLength;
char[] letters = _name.toCharArray();
LittleEndian.putShort(buf, _baseLength, (short) letters.length);
offset += LittleEndian.SHORT_SIZE;
for (int x = 0; x < letters.length; x++) {
LittleEndian.putShort(buf, offset, (short) letters[x]);
offset += LittleEndian.SHORT_SIZE;
}
// get past the null delimiter for the name.
offset += LittleEndian.SHORT_SIZE;
for (int x = 0; x < _upxs.length; x++) {
short upxSize = (short) _upxs[x].size();
LittleEndian.putShort(buf, offset, upxSize);
offset += LittleEndian.SHORT_SIZE;
System.arraycopy(_upxs[x].getUPX(), 0, buf, offset, upxSize);
offset += upxSize + (upxSize % 2);
}
return buf;
}
@Override @Override
public int hashCode() public int hashCode() {
{
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + ( ( _name == null ) ? 0 : _name.hashCode() ); result = prime * result + ((_name == null) ? 0 : _name.hashCode());
result = prime * result result = prime * result
+ ( ( _stdfBase == null ) ? 0 : _stdfBase.hashCode() ); + ((_stdfBase == null) ? 0 : _stdfBase.hashCode());
result = prime * result + Arrays.hashCode( _upxs ); result = prime * result + Arrays.hashCode(_upxs);
return result; return result;
} }
@Override @Override
public boolean equals( Object obj ) public boolean equals(Object obj) {
{ if (this == obj)
if ( this == obj )
return true; return true;
if ( obj == null ) if (obj == null)
return false; return false;
if ( getClass() != obj.getClass() ) if (getClass() != obj.getClass())
return false; return false;
StyleDescription other = (StyleDescription) obj; StyleDescription other = (StyleDescription) obj;
if ( _name == null ) if (_name == null) {
{ if (other._name != null)
if ( other._name != null )
return false; return false;
} } else if (!_name.equals(other._name))
else if ( !_name.equals( other._name ) )
return false; return false;
if ( _stdfBase == null ) if (_stdfBase == null) {
{ if (other._stdfBase != null)
if ( other._stdfBase != null )
return false; return false;
} } else if (!_stdfBase.equals(other._stdfBase))
else if ( !_stdfBase.equals( other._stdfBase ) )
return false; return false;
if ( !Arrays.equals( _upxs, other._upxs ) ) if (!Arrays.equals(_upxs, other._upxs))
return false; return false;
return true; return true;
} }
@Override @Override
public String toString() public String toString() {
{
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
result.append( "[STD]: '" ); result.append("[STD]: '");
result.append( _name ); result.append(_name);
result.append( "'" ); result.append("'");
result.append( ( "\nStdfBase:\t" + _stdfBase ).replaceAll( "\n", result.append(("\nStdfBase:\t" + _stdfBase).replaceAll("\n",
"\n " ) ); "\n "));
result.append( ( "\nStdfPost2000:\t" + _stdfPost2000 ).replaceAll( result.append(("\nStdfPost2000:\t" + _stdfPost2000).replaceAll(
"\n", "\n " ) ); "\n", "\n "));
for ( UPX upx : _upxs ) for (UPX upx : _upxs) {
{ result.append(("\nUPX:\t" + upx).replaceAll("\n", "\n "));
result.append( ( "\nUPX:\t" + upx ).replaceAll( "\n", "\n " ) );
} }
return result.toString(); return result.toString();
} }

View File

@ -39,9 +39,9 @@ import org.apache.poi.util.LittleEndian;
* @author Ryan Ackley * @author Ryan Ackley
*/ */
@Internal @Internal
public final class StyleSheet implements HDFType { public final class StyleSheet {
public static final int NIL_STYLE = 4095; public static final int NIL_STYLE = 4095;
// private static final int PAP_TYPE = 1; // private static final int PAP_TYPE = 1;
// private static final int CHP_TYPE = 2; // private static final int CHP_TYPE = 2;
// private static final int SEP_TYPE = 4; // private static final int SEP_TYPE = 4;
@ -52,8 +52,8 @@ public final class StyleSheet implements HDFType {
@Deprecated @Deprecated
private final static CharacterProperties NIL_CHP = new CharacterProperties(); private final static CharacterProperties NIL_CHP = new CharacterProperties();
private final static byte[] NIL_CHPX = new byte[] {}; private final static byte[] NIL_CHPX = new byte[]{};
private final static byte[] NIL_PAPX = new byte[] {0, 0}; private final static byte[] NIL_PAPX = new byte[]{0, 0};
/** /**
* Size of the STSHI structure * Size of the STSHI structure
@ -65,19 +65,18 @@ public final class StyleSheet implements HDFType {
*/ */
private Stshif _stshif; private Stshif _stshif;
StyleDescription[] _styleDescriptions; StyleDescription[] _styleDescriptions;
/** /**
* StyleSheet constructor. Loads a document's stylesheet information, * StyleSheet constructor. Loads a document's stylesheet information,
* *
* @param tableStream A byte array containing a document's raw stylesheet * @param tableStream A byte array containing a document's raw stylesheet
* info. Found by using FileInformationBlock.getFcStshf() and * info. Found by using FileInformationBlock.getFcStshf() and
* FileInformationBLock.getLcbStshf() * FileInformationBLock.getLcbStshf()
*/ */
public StyleSheet(byte[] tableStream, int offset) public StyleSheet(byte[] tableStream, int offset) {
{
int startOffset = offset; int startOffset = offset;
_cbStshi = LittleEndian.getShort( tableStream, offset ); _cbStshi = LittleEndian.getShort(tableStream, offset);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
/* /*
@ -88,46 +87,41 @@ public final class StyleSheet implements HDFType {
* be empty, i.e. cbSTD==0. * be empty, i.e. cbSTD==0.
*/ */
_stshif = new Stshif( tableStream, offset ); _stshif = new Stshif(tableStream, offset);
offset += Stshif.getSize(); offset += Stshif.getSize();
// shall we discard cbLSD and mpstilsd? // shall we discard cbLSD and mpstilsd?
offset = startOffset + LittleEndian.SHORT_SIZE + _cbStshi; offset = startOffset + LittleEndian.SHORT_SIZE + _cbStshi;
_styleDescriptions = new StyleDescription[_stshif.getCstd()]; _styleDescriptions = new StyleDescription[_stshif.getCstd()];
for(int x = 0; x < _stshif.getCstd(); x++) for (int x = 0; x < _stshif.getCstd(); x++) {
{ int stdSize = LittleEndian.getShort(tableStream, offset);
int stdSize = LittleEndian.getShort(tableStream, offset); //get past the size
//get past the size offset += 2;
offset += 2; if (stdSize > 0) {
if(stdSize > 0) //byte[] std = new byte[stdSize];
{
//byte[] std = new byte[stdSize];
StyleDescription aStyle = new StyleDescription(tableStream, StyleDescription aStyle = new StyleDescription(tableStream,
_stshif.getCbSTDBaseInFile(), offset, true); _stshif.getCbSTDBaseInFile(), offset, true);
_styleDescriptions[x] = aStyle; _styleDescriptions[x] = aStyle;
} }
offset += stdSize; offset += stdSize;
} }
for(int x = 0; x < _styleDescriptions.length; x++) for (int x = 0; x < _styleDescriptions.length; x++) {
{ if (_styleDescriptions[x] != null) {
if(_styleDescriptions[x] != null) createPap(x);
{ createChp(x);
createPap(x); }
createChp(x); }
} }
}
}
public void writeTo(OutputStream out) public void writeTo(OutputStream out)
throws IOException throws IOException {
{
int offset = 0; int offset = 0;
/* /*
* we don't support 2003 Word extensions in STSHI (but may be we should * we don't support 2003 Word extensions in STSHI (but may be we should
@ -136,270 +130,239 @@ public final class StyleSheet implements HDFType {
*/ */
this._cbStshi = 18; this._cbStshi = 18;
// add two bytes so we can prepend the stylesheet w/ its size // add two bytes so we can prepend the stylesheet w/ its size
byte[] buf = new byte[_cbStshi + 2]; byte[] buf = new byte[_cbStshi + 2];
LittleEndian.putUShort(buf, offset, (short)_cbStshi); LittleEndian.putUShort(buf, offset, (short) _cbStshi);
offset += LittleEndian.SHORT_SIZE; offset += LittleEndian.SHORT_SIZE;
_stshif.setCstd( _styleDescriptions.length ); _stshif.setCstd(_styleDescriptions.length);
_stshif.serialize( buf, offset ); _stshif.serialize(buf, offset);
// offset += Stshif.getSize(); // offset += Stshif.getSize();
out.write(buf); out.write(buf);
byte[] sizeHolder = new byte[2]; byte[] sizeHolder = new byte[2];
for (int x = 0; x < _styleDescriptions.length; x++) for (int x = 0; x < _styleDescriptions.length; x++) {
{ if (_styleDescriptions[x] != null) {
if(_styleDescriptions[x] != null) byte[] std = _styleDescriptions[x].toByteArray();
{
byte[] std = _styleDescriptions[x].toByteArray();
// adjust the size so it is always on a word boundary // adjust the size so it is always on a word boundary
LittleEndian.putShort(sizeHolder, 0, (short)((std.length) + (std.length % 2))); LittleEndian.putShort(sizeHolder, 0, (short) ((std.length) + (std.length % 2)));
out.write(sizeHolder); out.write(sizeHolder);
out.write(std); out.write(std);
// Must always start on a word boundary. // Must always start on a word boundary.
if (std.length % 2 == 1) if (std.length % 2 == 1) {
{ out.write('\0');
out.write('\0'); }
} } else {
} sizeHolder[0] = 0;
else sizeHolder[1] = 0;
{ out.write(sizeHolder);
sizeHolder[0] = 0; }
sizeHolder[1] = 0; }
out.write(sizeHolder);
}
}
}
@Override
public boolean equals(Object o)
{
if (!(o instanceof StyleSheet)) return false;
StyleSheet ss = (StyleSheet)o;
if (!ss._stshif.equals( this._stshif )
|| ss._cbStshi != this._cbStshi
|| ss._styleDescriptions.length != this._styleDescriptions.length
) return false;
for (int i=0; i<_styleDescriptions.length; i++) {
StyleDescription tsd = this._styleDescriptions[i];
StyleDescription osd = ss._styleDescriptions[i];
if (tsd == null && osd == null) continue;
if (tsd == null || osd == null || !osd.equals(tsd)) return false;
} }
return true; @Override
} public boolean equals(Object o) {
if (!(o instanceof StyleSheet)) return false;
StyleSheet ss = (StyleSheet) o;
@Override if (!ss._stshif.equals(this._stshif)
public int hashCode() { || ss._cbStshi != this._cbStshi
assert false : "hashCode not designed"; || ss._styleDescriptions.length != this._styleDescriptions.length
return 42; // any arbitrary constant will do ) return false;
}
/** for (int i = 0; i < _styleDescriptions.length; i++) {
* Creates a PartagraphProperties object from a papx stored in the StyleDescription tsd = this._styleDescriptions[i];
* StyleDescription at the index istd in the StyleDescription array. The PAP StyleDescription osd = ss._styleDescriptions[i];
* is placed in the StyleDescription at istd after its been created. Not if (tsd == null && osd == null) continue;
* every StyleDescription will contain a papx. In these cases this function if (tsd == null || osd == null || !osd.equals(tsd)) return false;
* does nothing }
*
* @param istd The index of the StyleDescription to create the
* ParagraphProperties from (and also place the finished PAP in)
*/
@Deprecated
private void createPap(int istd)
{
StyleDescription sd = _styleDescriptions[istd];
ParagraphProperties pap = sd.getPAP();
byte[] papx = sd.getPAPX();
int baseIndex = sd.getBaseStyle();
if(pap == null && papx != null)
{
ParagraphProperties parentPAP = new ParagraphProperties();
if(baseIndex != NIL_STYLE)
{
parentPAP = _styleDescriptions[baseIndex].getPAP(); return true;
if(parentPAP == null) { }
if(baseIndex == istd) {
// Oh dear, style claims that it is its own parent
throw new IllegalStateException("Pap style " + istd + " claimed to have itself as its parent, which isn't allowed");
}
// Create the parent style
createPap(baseIndex);
parentPAP = _styleDescriptions[baseIndex].getPAP();
}
} @Override
public int hashCode() {
assert false : "hashCode not designed";
return 42; // any arbitrary constant will do
}
if (parentPAP == null) { /**
parentPAP = new ParagraphProperties(); * Creates a PartagraphProperties object from a papx stored in the
} * StyleDescription at the index istd in the StyleDescription array. The PAP
* is placed in the StyleDescription at istd after its been created. Not
* every StyleDescription will contain a papx. In these cases this function
* does nothing
*
* @param istd The index of the StyleDescription to create the
* ParagraphProperties from (and also place the finished PAP in)
*/
@Deprecated
private void createPap(int istd) {
StyleDescription sd = _styleDescriptions[istd];
ParagraphProperties pap = sd.getPAP();
byte[] papx = sd.getPAPX();
int baseIndex = sd.getBaseStyle();
if (pap == null && papx != null) {
ParagraphProperties parentPAP = new ParagraphProperties();
if (baseIndex != NIL_STYLE) {
pap = ParagraphSprmUncompressor.uncompressPAP(parentPAP, papx, 2); parentPAP = _styleDescriptions[baseIndex].getPAP();
sd.setPAP(pap); if (parentPAP == null) {
} if (baseIndex == istd) {
} // Oh dear, style claims that it is its own parent
/** throw new IllegalStateException("Pap style " + istd + " claimed to have itself as its parent, which isn't allowed");
* Creates a CharacterProperties object from a chpx stored in the }
* StyleDescription at the index istd in the StyleDescription array. The // Create the parent style
* CharacterProperties object is placed in the StyleDescription at istd after createPap(baseIndex);
* its been created. Not every StyleDescription will contain a chpx. In these parentPAP = _styleDescriptions[baseIndex].getPAP();
* cases this function does nothing. }
*
* @param istd The index of the StyleDescription to create the
* CharacterProperties object from.
*/
@Deprecated
private void createChp(int istd)
{
StyleDescription sd = _styleDescriptions[istd];
CharacterProperties chp = sd.getCHP();
byte[] chpx = sd.getCHPX();
int baseIndex = sd.getBaseStyle();
if(baseIndex == istd) { }
// Oh dear, this isn't allowed...
// The word file seems to be corrupted
// Switch to using the nil style so that
// there's a chance we can read it
baseIndex = NIL_STYLE;
}
// Build and decompress the Chp if required if (parentPAP == null) {
if(chp == null && chpx != null) parentPAP = new ParagraphProperties();
{ }
CharacterProperties parentCHP = new CharacterProperties();
if(baseIndex != NIL_STYLE)
{
parentCHP = _styleDescriptions[baseIndex].getCHP();
if(parentCHP == null)
{
createChp(baseIndex);
parentCHP = _styleDescriptions[baseIndex].getCHP();
}
if(parentCHP == null) {
parentCHP = new CharacterProperties();
}
}
chp = CharacterSprmUncompressor.uncompressCHP(parentCHP, chpx, 0); pap = ParagraphSprmUncompressor.uncompressPAP(parentPAP, papx, 2);
sd.setCHP(chp); sd.setPAP(pap);
} }
} }
/** /**
* Gets the number of styles in the style sheet. * Creates a CharacterProperties object from a chpx stored in the
* @return The number of styles in the style sheet. * StyleDescription at the index istd in the StyleDescription array. The
*/ * CharacterProperties object is placed in the StyleDescription at istd after
public int numStyles() { * its been created. Not every StyleDescription will contain a chpx. In these
return _styleDescriptions.length; * cases this function does nothing.
} *
* @param istd The index of the StyleDescription to create the
* CharacterProperties object from.
*/
@Deprecated
private void createChp(int istd) {
StyleDescription sd = _styleDescriptions[istd];
CharacterProperties chp = sd.getCHP();
byte[] chpx = sd.getCHPX();
int baseIndex = sd.getBaseStyle();
if (baseIndex == istd) {
// Oh dear, this isn't allowed...
// The word file seems to be corrupted
// Switch to using the nil style so that
// there's a chance we can read it
baseIndex = NIL_STYLE;
}
// Build and decompress the Chp if required
if (chp == null && chpx != null) {
CharacterProperties parentCHP = new CharacterProperties();
if (baseIndex != NIL_STYLE) {
parentCHP = _styleDescriptions[baseIndex].getCHP();
if (parentCHP == null) {
createChp(baseIndex);
parentCHP = _styleDescriptions[baseIndex].getCHP();
}
if (parentCHP == null) {
parentCHP = new CharacterProperties();
}
}
chp = CharacterSprmUncompressor.uncompressCHP(parentCHP, chpx, 0);
sd.setCHP(chp);
}
}
/**
* Gets the number of styles in the style sheet.
*
* @return The number of styles in the style sheet.
*/
public int numStyles() {
return _styleDescriptions.length;
}
/** /**
* Gets the StyleDescription at index x. * Gets the StyleDescription at index x.
* *
* @param styleIndex * @param styleIndex the index of the desired StyleDescription.
* the index of the desired StyleDescription.
*/ */
public StyleDescription getStyleDescription( int styleIndex ) public StyleDescription getStyleDescription(int styleIndex) {
{
return _styleDescriptions[styleIndex]; return _styleDescriptions[styleIndex];
} }
@Deprecated @Deprecated
public CharacterProperties getCharacterStyle( int styleIndex ) public CharacterProperties getCharacterStyle(int styleIndex) {
{ if (styleIndex == NIL_STYLE) {
if ( styleIndex == NIL_STYLE )
{
return NIL_CHP; return NIL_CHP;
} }
if ( styleIndex >= _styleDescriptions.length ) if (styleIndex >= _styleDescriptions.length) {
{
return NIL_CHP; return NIL_CHP;
} }
return ( _styleDescriptions[styleIndex] != null ? _styleDescriptions[styleIndex] return (_styleDescriptions[styleIndex] != null ? _styleDescriptions[styleIndex]
.getCHP() : NIL_CHP ); .getCHP() : NIL_CHP);
} }
@Deprecated @Deprecated
public ParagraphProperties getParagraphStyle( int styleIndex ) public ParagraphProperties getParagraphStyle(int styleIndex) {
{ if (styleIndex == NIL_STYLE) {
if ( styleIndex == NIL_STYLE )
{
return NIL_PAP; return NIL_PAP;
} }
if ( styleIndex >= _styleDescriptions.length ) if (styleIndex >= _styleDescriptions.length) {
{
return NIL_PAP; return NIL_PAP;
} }
if ( _styleDescriptions[styleIndex] == null ) if (_styleDescriptions[styleIndex] == null) {
{
return NIL_PAP; return NIL_PAP;
} }
if ( _styleDescriptions[styleIndex].getPAP() == null ) if (_styleDescriptions[styleIndex].getPAP() == null) {
{
return NIL_PAP; return NIL_PAP;
} }
return _styleDescriptions[styleIndex].getPAP(); return _styleDescriptions[styleIndex].getPAP();
} }
public byte[] getCHPX( int styleIndex ) public byte[] getCHPX(int styleIndex) {
{ if (styleIndex == NIL_STYLE) {
if ( styleIndex == NIL_STYLE )
{
return NIL_CHPX; return NIL_CHPX;
} }
if ( styleIndex >= _styleDescriptions.length ) if (styleIndex >= _styleDescriptions.length) {
{
return NIL_CHPX; return NIL_CHPX;
} }
if ( _styleDescriptions[styleIndex] == null ) if (_styleDescriptions[styleIndex] == null) {
{
return NIL_CHPX; return NIL_CHPX;
} }
if ( _styleDescriptions[styleIndex].getCHPX() == null ) if (_styleDescriptions[styleIndex].getCHPX() == null) {
{
return NIL_CHPX; return NIL_CHPX;
} }
return _styleDescriptions[styleIndex].getCHPX(); return _styleDescriptions[styleIndex].getCHPX();
} }
public byte[] getPAPX( int styleIndex ) public byte[] getPAPX(int styleIndex) {
{ if (styleIndex == NIL_STYLE) {
if ( styleIndex == NIL_STYLE )
{
return NIL_PAPX; return NIL_PAPX;
} }
if ( styleIndex >= _styleDescriptions.length ) if (styleIndex >= _styleDescriptions.length) {
{
return NIL_PAPX; return NIL_PAPX;
} }
if ( _styleDescriptions[styleIndex] == null ) if (_styleDescriptions[styleIndex] == null) {
{
return NIL_PAPX; return NIL_PAPX;
} }
if ( _styleDescriptions[styleIndex].getPAPX() == null ) if (_styleDescriptions[styleIndex].getPAPX() == null) {
{
return NIL_PAPX; return NIL_PAPX;
} }