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:
parent
6c0ac68e05
commit
af2813634b
@ -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 {
|
||||
|
||||
}
|
||||
|
@ -34,266 +34,237 @@ import org.apache.poi.util.StringUtil;
|
||||
* @author Ryan Ackley
|
||||
*/
|
||||
@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
|
||||
private static final int MAX_RECORD_LENGTH = 100_000;
|
||||
|
||||
private final static int PARAGRAPH_STYLE = 1;
|
||||
private final static int CHARACTER_STYLE = 2;
|
||||
// private final static int TABLE_STYLE = 3;
|
||||
// private final static int NUMBERING_STYLE = 4;
|
||||
private final static int PARAGRAPH_STYLE = 1;
|
||||
private final static int CHARACTER_STYLE = 2;
|
||||
// private final static int TABLE_STYLE = 3;
|
||||
// private final static int NUMBERING_STYLE = 4;
|
||||
|
||||
private int _baseLength;
|
||||
private StdfBase _stdfBase;
|
||||
private StdfPost2000 _stdfPost2000;
|
||||
private int _baseLength;
|
||||
private StdfBase _stdfBase;
|
||||
private StdfPost2000 _stdfPost2000;
|
||||
|
||||
UPX[] _upxs;
|
||||
String _name;
|
||||
@Deprecated
|
||||
ParagraphProperties _pap;
|
||||
@Deprecated
|
||||
CharacterProperties _chp;
|
||||
UPX[] _upxs;
|
||||
String _name;
|
||||
@Deprecated
|
||||
ParagraphProperties _pap;
|
||||
@Deprecated
|
||||
CharacterProperties _chp;
|
||||
|
||||
public StyleDescription()
|
||||
{
|
||||
public StyleDescription() {
|
||||
// _pap = new ParagraphProperties();
|
||||
// _chp = new CharacterProperties();
|
||||
}
|
||||
public StyleDescription(byte[] std, int baseLength, int offset, boolean word9)
|
||||
{
|
||||
_baseLength = baseLength;
|
||||
int nameStart = offset + baseLength;
|
||||
}
|
||||
|
||||
public StyleDescription(byte[] std, int baseLength, int offset, boolean word9) {
|
||||
_baseLength = baseLength;
|
||||
int nameStart = offset + baseLength;
|
||||
|
||||
boolean readStdfPost2000 = false;
|
||||
if ( baseLength == 0x0012 )
|
||||
{
|
||||
if (baseLength == 0x0012) {
|
||||
readStdfPost2000 = true;
|
||||
}
|
||||
else if ( baseLength == 0x000A )
|
||||
{
|
||||
} else if (baseLength == 0x000A) {
|
||||
readStdfPost2000 = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.log( POILogger.WARN,
|
||||
} else {
|
||||
logger.log(POILogger.WARN,
|
||||
"Style definition has non-standard size of ",
|
||||
Integer.valueOf( baseLength ) );
|
||||
Integer.valueOf(baseLength));
|
||||
}
|
||||
|
||||
_stdfBase = new StdfBase(std, offset);
|
||||
offset += StdfBase.getSize();
|
||||
_stdfBase = new StdfBase(std, offset);
|
||||
offset += StdfBase.getSize();
|
||||
|
||||
if ( readStdfPost2000 )
|
||||
{
|
||||
_stdfPost2000 = new StdfPost2000( std, offset );
|
||||
if (readStdfPost2000) {
|
||||
_stdfPost2000 = new StdfPost2000(std, offset);
|
||||
// offset += StdfPost2000.getSize();
|
||||
}
|
||||
|
||||
//first byte(s) of variable length section of std is the length of the
|
||||
//style name and aliases string
|
||||
int nameLength = 0;
|
||||
int multiplier = 1;
|
||||
if(word9)
|
||||
{
|
||||
nameLength = LittleEndian.getShort(std, nameStart);
|
||||
multiplier = 2;
|
||||
nameStart += LittleEndian.SHORT_SIZE;
|
||||
}
|
||||
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();
|
||||
//first byte(s) of variable length section of std is the length of the
|
||||
//style name and aliases string
|
||||
int nameLength = 0;
|
||||
int multiplier = 1;
|
||||
if (word9) {
|
||||
nameLength = LittleEndian.getShort(std, nameStart);
|
||||
multiplier = 2;
|
||||
nameStart += LittleEndian.SHORT_SIZE;
|
||||
} else {
|
||||
nameLength = std[nameStart];
|
||||
}
|
||||
return null;
|
||||
case CHARACTER_STYLE:
|
||||
return _upxs[0].getUPX();
|
||||
default:
|
||||
return null;
|
||||
|
||||
_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 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;
|
||||
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:
|
||||
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
|
||||
public int hashCode()
|
||||
{
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ( ( _name == null ) ? 0 : _name.hashCode() );
|
||||
result = prime * result + ((_name == null) ? 0 : _name.hashCode());
|
||||
result = prime * result
|
||||
+ ( ( _stdfBase == null ) ? 0 : _stdfBase.hashCode() );
|
||||
result = prime * result + Arrays.hashCode( _upxs );
|
||||
+ ((_stdfBase == null) ? 0 : _stdfBase.hashCode());
|
||||
result = prime * result + Arrays.hashCode(_upxs);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals( Object obj )
|
||||
{
|
||||
if ( this == obj )
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if ( obj == null )
|
||||
if (obj == null)
|
||||
return false;
|
||||
if ( getClass() != obj.getClass() )
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
StyleDescription other = (StyleDescription) obj;
|
||||
if ( _name == null )
|
||||
{
|
||||
if ( other._name != null )
|
||||
if (_name == null) {
|
||||
if (other._name != null)
|
||||
return false;
|
||||
}
|
||||
else if ( !_name.equals( other._name ) )
|
||||
} else if (!_name.equals(other._name))
|
||||
return false;
|
||||
if ( _stdfBase == null )
|
||||
{
|
||||
if ( other._stdfBase != null )
|
||||
if (_stdfBase == null) {
|
||||
if (other._stdfBase != null)
|
||||
return false;
|
||||
}
|
||||
else if ( !_stdfBase.equals( other._stdfBase ) )
|
||||
} else if (!_stdfBase.equals(other._stdfBase))
|
||||
return false;
|
||||
if ( !Arrays.equals( _upxs, other._upxs ) )
|
||||
if (!Arrays.equals(_upxs, other._upxs))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
public String toString() {
|
||||
StringBuilder result = new StringBuilder();
|
||||
result.append( "[STD]: '" );
|
||||
result.append( _name );
|
||||
result.append( "'" );
|
||||
result.append( ( "\nStdfBase:\t" + _stdfBase ).replaceAll( "\n",
|
||||
"\n " ) );
|
||||
result.append( ( "\nStdfPost2000:\t" + _stdfPost2000 ).replaceAll(
|
||||
"\n", "\n " ) );
|
||||
for ( UPX upx : _upxs )
|
||||
{
|
||||
result.append( ( "\nUPX:\t" + upx ).replaceAll( "\n", "\n " ) );
|
||||
result.append("[STD]: '");
|
||||
result.append(_name);
|
||||
result.append("'");
|
||||
result.append(("\nStdfBase:\t" + _stdfBase).replaceAll("\n",
|
||||
"\n "));
|
||||
result.append(("\nStdfPost2000:\t" + _stdfPost2000).replaceAll(
|
||||
"\n", "\n "));
|
||||
for (UPX upx : _upxs) {
|
||||
result.append(("\nUPX:\t" + upx).replaceAll("\n", "\n "));
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
|
@ -35,13 +35,13 @@ import org.apache.poi.util.LittleEndian;
|
||||
* <p>
|
||||
* Fields documentation is quotes from Microsoft Office Word 97-2007 Binary File
|
||||
* Format (.doc) Specification, page 36 of 210
|
||||
*
|
||||
*
|
||||
* @author Ryan Ackley
|
||||
*/
|
||||
@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 CHP_TYPE = 2;
|
||||
// private static final int SEP_TYPE = 4;
|
||||
@ -52,8 +52,8 @@ public final class StyleSheet implements HDFType {
|
||||
@Deprecated
|
||||
private final static CharacterProperties NIL_CHP = new CharacterProperties();
|
||||
|
||||
private final static byte[] NIL_CHPX = new byte[] {};
|
||||
private final static byte[] NIL_PAPX = new byte[] {0, 0};
|
||||
private final static byte[] NIL_CHPX = new byte[]{};
|
||||
private final static byte[] NIL_PAPX = new byte[]{0, 0};
|
||||
|
||||
/**
|
||||
* Size of the STSHI structure
|
||||
@ -64,20 +64,19 @@ public final class StyleSheet implements HDFType {
|
||||
* General information about a stylesheet
|
||||
*/
|
||||
private Stshif _stshif;
|
||||
|
||||
StyleDescription[] _styleDescriptions;
|
||||
|
||||
/**
|
||||
* StyleSheet constructor. Loads a document's stylesheet information,
|
||||
*
|
||||
* @param tableStream A byte array containing a document's raw stylesheet
|
||||
* info. Found by using FileInformationBlock.getFcStshf() and
|
||||
* FileInformationBLock.getLcbStshf()
|
||||
*/
|
||||
public StyleSheet(byte[] tableStream, int offset)
|
||||
{
|
||||
StyleDescription[] _styleDescriptions;
|
||||
|
||||
/**
|
||||
* StyleSheet constructor. Loads a document's stylesheet information,
|
||||
*
|
||||
* @param tableStream A byte array containing a document's raw stylesheet
|
||||
* info. Found by using FileInformationBlock.getFcStshf() and
|
||||
* FileInformationBLock.getLcbStshf()
|
||||
*/
|
||||
public StyleSheet(byte[] tableStream, int offset) {
|
||||
int startOffset = offset;
|
||||
_cbStshi = LittleEndian.getShort( tableStream, offset );
|
||||
_cbStshi = LittleEndian.getShort(tableStream, offset);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
|
||||
/*
|
||||
@ -87,47 +86,42 @@ public final class StyleSheet implements HDFType {
|
||||
* (cbSTD, STD) pairs in the file following the STSHI. Note: styles can
|
||||
* be empty, i.e. cbSTD==0.
|
||||
*/
|
||||
|
||||
_stshif = new Stshif( tableStream, offset );
|
||||
|
||||
_stshif = new Stshif(tableStream, offset);
|
||||
offset += Stshif.getSize();
|
||||
|
||||
// shall we discard cbLSD and mpstilsd?
|
||||
|
||||
offset = startOffset + LittleEndian.SHORT_SIZE + _cbStshi;
|
||||
_styleDescriptions = new StyleDescription[_stshif.getCstd()];
|
||||
for(int x = 0; x < _stshif.getCstd(); x++)
|
||||
{
|
||||
int stdSize = LittleEndian.getShort(tableStream, offset);
|
||||
//get past the size
|
||||
offset += 2;
|
||||
if(stdSize > 0)
|
||||
{
|
||||
//byte[] std = new byte[stdSize];
|
||||
|
||||
StyleDescription aStyle = new StyleDescription(tableStream,
|
||||
_stshif.getCbSTDBaseInFile(), offset, true);
|
||||
offset = startOffset + LittleEndian.SHORT_SIZE + _cbStshi;
|
||||
_styleDescriptions = new StyleDescription[_stshif.getCstd()];
|
||||
for (int x = 0; x < _stshif.getCstd(); x++) {
|
||||
int stdSize = LittleEndian.getShort(tableStream, offset);
|
||||
//get past the size
|
||||
offset += 2;
|
||||
if (stdSize > 0) {
|
||||
//byte[] std = new byte[stdSize];
|
||||
|
||||
_styleDescriptions[x] = aStyle;
|
||||
}
|
||||
StyleDescription aStyle = new StyleDescription(tableStream,
|
||||
_stshif.getCbSTDBaseInFile(), offset, true);
|
||||
|
||||
offset += stdSize;
|
||||
_styleDescriptions[x] = aStyle;
|
||||
}
|
||||
|
||||
}
|
||||
for(int x = 0; x < _styleDescriptions.length; x++)
|
||||
{
|
||||
if(_styleDescriptions[x] != null)
|
||||
{
|
||||
createPap(x);
|
||||
createChp(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
offset += stdSize;
|
||||
|
||||
public void writeTo(OutputStream out)
|
||||
throws IOException
|
||||
{
|
||||
}
|
||||
for (int x = 0; x < _styleDescriptions.length; x++) {
|
||||
if (_styleDescriptions[x] != null) {
|
||||
createPap(x);
|
||||
createChp(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int offset = 0;
|
||||
public void writeTo(OutputStream out)
|
||||
throws IOException {
|
||||
|
||||
int offset = 0;
|
||||
|
||||
/*
|
||||
* 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;
|
||||
|
||||
// add two bytes so we can prepend the stylesheet w/ its size
|
||||
byte[] buf = new byte[_cbStshi + 2];
|
||||
// add two bytes so we can prepend the stylesheet w/ its size
|
||||
byte[] buf = new byte[_cbStshi + 2];
|
||||
|
||||
LittleEndian.putUShort(buf, offset, (short)_cbStshi);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
LittleEndian.putUShort(buf, offset, (short) _cbStshi);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
|
||||
_stshif.setCstd( _styleDescriptions.length );
|
||||
_stshif.serialize( buf, offset );
|
||||
// offset += Stshif.getSize();
|
||||
_stshif.setCstd(_styleDescriptions.length);
|
||||
_stshif.serialize(buf, offset);
|
||||
// offset += Stshif.getSize();
|
||||
|
||||
out.write(buf);
|
||||
out.write(buf);
|
||||
|
||||
byte[] sizeHolder = new byte[2];
|
||||
for (int x = 0; x < _styleDescriptions.length; x++)
|
||||
{
|
||||
if(_styleDescriptions[x] != null)
|
||||
{
|
||||
byte[] std = _styleDescriptions[x].toByteArray();
|
||||
byte[] sizeHolder = new byte[2];
|
||||
for (int x = 0; x < _styleDescriptions.length; x++) {
|
||||
if (_styleDescriptions[x] != null) {
|
||||
byte[] std = _styleDescriptions[x].toByteArray();
|
||||
|
||||
// adjust the size so it is always on a word boundary
|
||||
LittleEndian.putShort(sizeHolder, 0, (short)((std.length) + (std.length % 2)));
|
||||
out.write(sizeHolder);
|
||||
out.write(std);
|
||||
// adjust the size so it is always on a word boundary
|
||||
LittleEndian.putShort(sizeHolder, 0, (short) ((std.length) + (std.length % 2)));
|
||||
out.write(sizeHolder);
|
||||
out.write(std);
|
||||
|
||||
// Must always start on a word boundary.
|
||||
if (std.length % 2 == 1)
|
||||
{
|
||||
out.write('\0');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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;
|
||||
// Must always start on a word boundary.
|
||||
if (std.length % 2 == 1) {
|
||||
out.write('\0');
|
||||
}
|
||||
} else {
|
||||
sizeHolder[0] = 0;
|
||||
sizeHolder[1] = 0;
|
||||
out.write(sizeHolder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof StyleSheet)) return false;
|
||||
StyleSheet ss = (StyleSheet) o;
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
assert false : "hashCode not designed";
|
||||
return 42; // any arbitrary constant will do
|
||||
}
|
||||
if (!ss._stshif.equals(this._stshif)
|
||||
|| ss._cbStshi != this._cbStshi
|
||||
|| ss._styleDescriptions.length != this._styleDescriptions.length
|
||||
) return false;
|
||||
|
||||
/**
|
||||
* 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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
parentPAP = _styleDescriptions[baseIndex].getPAP();
|
||||
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();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@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);
|
||||
sd.setPAP(pap);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Creates a CharacterProperties object from a chpx stored in the
|
||||
* StyleDescription at the index istd in the StyleDescription array. The
|
||||
* CharacterProperties object is placed in the StyleDescription at istd after
|
||||
* its been created. Not every StyleDescription will contain a chpx. In these
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
parentPAP = _styleDescriptions[baseIndex].getPAP();
|
||||
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();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
if (parentPAP == null) {
|
||||
parentPAP = new ParagraphProperties();
|
||||
}
|
||||
|
||||
pap = ParagraphSprmUncompressor.uncompressPAP(parentPAP, papx, 2);
|
||||
sd.setPAP(pap);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a CharacterProperties object from a chpx stored in the
|
||||
* StyleDescription at the index istd in the StyleDescription array. The
|
||||
* CharacterProperties object is placed in the StyleDescription at istd after
|
||||
* its been created. Not every StyleDescription will contain a chpx. In these
|
||||
* 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.
|
||||
*
|
||||
* @param styleIndex
|
||||
* the index of the desired StyleDescription.
|
||||
*
|
||||
* @param styleIndex the index of the desired StyleDescription.
|
||||
*/
|
||||
public StyleDescription getStyleDescription( int styleIndex )
|
||||
{
|
||||
public StyleDescription getStyleDescription(int styleIndex) {
|
||||
return _styleDescriptions[styleIndex];
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public CharacterProperties getCharacterStyle( int styleIndex )
|
||||
{
|
||||
if ( styleIndex == NIL_STYLE )
|
||||
{
|
||||
public CharacterProperties getCharacterStyle(int styleIndex) {
|
||||
if (styleIndex == NIL_STYLE) {
|
||||
return NIL_CHP;
|
||||
}
|
||||
|
||||
if ( styleIndex >= _styleDescriptions.length )
|
||||
{
|
||||
if (styleIndex >= _styleDescriptions.length) {
|
||||
return NIL_CHP;
|
||||
}
|
||||
|
||||
return ( _styleDescriptions[styleIndex] != null ? _styleDescriptions[styleIndex]
|
||||
.getCHP() : NIL_CHP );
|
||||
return (_styleDescriptions[styleIndex] != null ? _styleDescriptions[styleIndex]
|
||||
.getCHP() : NIL_CHP);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public ParagraphProperties getParagraphStyle( int styleIndex )
|
||||
{
|
||||
if ( styleIndex == NIL_STYLE )
|
||||
{
|
||||
public ParagraphProperties getParagraphStyle(int styleIndex) {
|
||||
if (styleIndex == NIL_STYLE) {
|
||||
return NIL_PAP;
|
||||
}
|
||||
|
||||
if ( styleIndex >= _styleDescriptions.length )
|
||||
{
|
||||
if (styleIndex >= _styleDescriptions.length) {
|
||||
return NIL_PAP;
|
||||
}
|
||||
|
||||
if ( _styleDescriptions[styleIndex] == null )
|
||||
{
|
||||
if (_styleDescriptions[styleIndex] == null) {
|
||||
return NIL_PAP;
|
||||
}
|
||||
|
||||
if ( _styleDescriptions[styleIndex].getPAP() == null )
|
||||
{
|
||||
if (_styleDescriptions[styleIndex].getPAP() == null) {
|
||||
return NIL_PAP;
|
||||
}
|
||||
|
||||
return _styleDescriptions[styleIndex].getPAP();
|
||||
}
|
||||
|
||||
public byte[] getCHPX( int styleIndex )
|
||||
{
|
||||
if ( styleIndex == NIL_STYLE )
|
||||
{
|
||||
public byte[] getCHPX(int styleIndex) {
|
||||
if (styleIndex == NIL_STYLE) {
|
||||
return NIL_CHPX;
|
||||
}
|
||||
|
||||
if ( styleIndex >= _styleDescriptions.length )
|
||||
{
|
||||
if (styleIndex >= _styleDescriptions.length) {
|
||||
return NIL_CHPX;
|
||||
}
|
||||
|
||||
if ( _styleDescriptions[styleIndex] == null )
|
||||
{
|
||||
if (_styleDescriptions[styleIndex] == null) {
|
||||
return NIL_CHPX;
|
||||
}
|
||||
|
||||
if ( _styleDescriptions[styleIndex].getCHPX() == null )
|
||||
{
|
||||
if (_styleDescriptions[styleIndex].getCHPX() == null) {
|
||||
return NIL_CHPX;
|
||||
}
|
||||
|
||||
return _styleDescriptions[styleIndex].getCHPX();
|
||||
}
|
||||
|
||||
public byte[] getPAPX( int styleIndex )
|
||||
{
|
||||
if ( styleIndex == NIL_STYLE )
|
||||
{
|
||||
public byte[] getPAPX(int styleIndex) {
|
||||
if (styleIndex == NIL_STYLE) {
|
||||
return NIL_PAPX;
|
||||
}
|
||||
|
||||
if ( styleIndex >= _styleDescriptions.length )
|
||||
{
|
||||
if (styleIndex >= _styleDescriptions.length) {
|
||||
return NIL_PAPX;
|
||||
}
|
||||
|
||||
if ( _styleDescriptions[styleIndex] == null )
|
||||
{
|
||||
if (_styleDescriptions[styleIndex] == null) {
|
||||
return NIL_PAPX;
|
||||
}
|
||||
|
||||
if ( _styleDescriptions[styleIndex].getPAPX() == null )
|
||||
{
|
||||
if (_styleDescriptions[styleIndex].getPAPX() == null) {
|
||||
return NIL_PAPX;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user