Patch from Michael to fix bug 28203

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/branches/REL_2_BRANCH@353565 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Glen Stampoultzis 2004-06-27 11:21:13 +00:00
parent 8a2f845479
commit 6ab34bac0b
1 changed files with 58 additions and 20 deletions

View File

@ -32,6 +32,7 @@ import java.util.List;
* must be subclassed for maximum benefit. * must be subclassed for maximum benefit.
* *
* @author Glen Stampoultzis (glens at apache.org) * @author Glen Stampoultzis (glens at apache.org)
* @author Michael Zalewski (zalewski at optonline.net)
*/ */
public abstract class AbstractEscherHolderRecord public abstract class AbstractEscherHolderRecord
extends Record extends Record
@ -118,13 +119,13 @@ public abstract class AbstractEscherHolderRecord
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
final String nl = System.getProperty("line.separator"); final String nl = System.getProperty("line.separator");
buffer.append("[" + getRecordName() + "]" + nl); buffer.append('[' + getRecordName() + ']' + nl);
for ( Iterator iterator = escherRecords.iterator(); iterator.hasNext(); ) for ( Iterator iterator = escherRecords.iterator(); iterator.hasNext(); )
{ {
EscherRecord r = (EscherRecord) iterator.next(); EscherRecord r = (EscherRecord) iterator.next();
buffer.append(r.toString()); buffer.append(r.toString());
} }
buffer.append("[/" + getRecordName() + "]" + nl); buffer.append("[/" + getRecordName() + ']' + nl);
return buffer.toString(); return buffer.toString();
} }
@ -133,29 +134,49 @@ public abstract class AbstractEscherHolderRecord
public int serialize(int offset, byte[] data) public int serialize(int offset, byte[] data)
{ {
if (escherRecords.size() == 0 && rawData != null) LittleEndian.putShort( data, 0 + offset, getSid() );
LittleEndian.putShort( data, 2 + offset, (short) ( getRecordSize() - 4 ) );
if ( escherRecords.size() == 0 && rawData != null )
{ {
System.arraycopy( rawData, 0, data, offset, rawData.length); System.arraycopy( rawData, 0, data, offset + 4, rawData.length );
return rawData.length;
} }
else else
{ {
collapseShapeInformation();
LittleEndian.putShort(data, 0 + offset, getSid());
LittleEndian.putShort(data, 2 + offset, (short)(getRecordSize() - 4));
int pos = offset + 4; int pos = offset + 4;
for ( Iterator iterator = escherRecords.iterator(); iterator.hasNext(); ) for ( Iterator iterator = escherRecords.iterator(); iterator.hasNext(); )
{ {
EscherRecord r = (EscherRecord) iterator.next(); EscherRecord r = (EscherRecord) iterator.next();
pos += r.serialize(pos, data, new NullEscherSerializationListener() ); pos += r.serialize( pos, data, new NullEscherSerializationListener() );
} }
return getRecordSize();
} }
return getRecordSize();
} }
// public int serialize(int offset, byte[] data)
// {
// if (escherRecords.size() == 0 && rawData != null)
// {
// System.arraycopy( rawData, 0, data, offset, rawData.length);
// return rawData.length;
// }
// else
// {
// collapseShapeInformation();
//
// LittleEndian.putShort(data, 0 + offset, getSid());
// LittleEndian.putShort(data, 2 + offset, (short)(getRecordSize() - 4));
//
// int pos = offset + 4;
// for ( Iterator iterator = escherRecords.iterator(); iterator.hasNext(); )
// {
// EscherRecord r = (EscherRecord) iterator.next();
// pos += r.serialize(pos, data, new NullEscherSerializationListener() );
// }
//
// return getRecordSize();
// }
// }
/** /**
* Size of record (including 4 byte header) * Size of record (including 4 byte header)
*/ */
@ -163,12 +184,10 @@ public abstract class AbstractEscherHolderRecord
{ {
if (escherRecords.size() == 0 && rawData != null) if (escherRecords.size() == 0 && rawData != null)
{ {
return rawData.length; return rawData.length + 4;
} }
else else
{ {
collapseShapeInformation();
int size = 4; int size = 4;
for ( Iterator iterator = escherRecords.iterator(); iterator.hasNext(); ) for ( Iterator iterator = escherRecords.iterator(); iterator.hasNext(); )
{ {
@ -179,10 +198,29 @@ public abstract class AbstractEscherHolderRecord
} }
} }
private void collapseShapeInformation() //
{ // /**
// * Size of record (including 4 byte header)
} // */
// public int getRecordSize()
// {
// if (escherRecords.size() == 0 && rawData != null)
// {
// return rawData.length;
// }
// else
// {
// collapseShapeInformation();
//
// int size = 4;
// for ( Iterator iterator = escherRecords.iterator(); iterator.hasNext(); )
// {
// EscherRecord r = (EscherRecord) iterator.next();
// size += r.getRecordSize();
// }
// return size;
// }
// }
public abstract short getSid(); public abstract short getSid();