mirror of https://github.com/apache/poi.git
change some tabs to spaces
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1870049 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
96bf53f3fc
commit
cd3f373c44
|
@ -32,7 +32,7 @@ public final class NumberRecord extends CellRecord implements Cloneable {
|
||||||
|
|
||||||
/** Creates new NumberRecord */
|
/** Creates new NumberRecord */
|
||||||
public NumberRecord() {
|
public NumberRecord() {
|
||||||
// fields uninitialised
|
// fields uninitialised
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -63,12 +63,12 @@ public final class NumberRecord extends CellRecord implements Cloneable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getRecordName() {
|
protected String getRecordName() {
|
||||||
return "NUMBER";
|
return "NUMBER";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void appendValueText(StringBuilder sb) {
|
protected void appendValueText(StringBuilder sb) {
|
||||||
sb.append(" .value= ").append(NumberToTextConverter.toText(field_4_value));
|
sb.append(" .value= ").append(NumberToTextConverter.toText(field_4_value));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -78,7 +78,7 @@ public final class NumberRecord extends CellRecord implements Cloneable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getValueDataSize() {
|
protected int getValueDataSize() {
|
||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -33,140 +33,140 @@ import org.apache.poi.util.RecordFormatException;
|
||||||
* The obj record is used to hold various graphic objects and controls.
|
* The obj record is used to hold various graphic objects and controls.
|
||||||
*/
|
*/
|
||||||
public final class ObjRecord extends Record implements Cloneable {
|
public final class ObjRecord extends Record implements Cloneable {
|
||||||
public final static short sid = 0x005D;
|
public final static short sid = 0x005D;
|
||||||
|
|
||||||
private static final int NORMAL_PAD_ALIGNMENT = 2;
|
private static final int NORMAL_PAD_ALIGNMENT = 2;
|
||||||
private static int MAX_PAD_ALIGNMENT = 4;
|
private static int MAX_PAD_ALIGNMENT = 4;
|
||||||
|
|
||||||
private List<SubRecord> subrecords;
|
private List<SubRecord> subrecords;
|
||||||
/** used when POI has no idea what is going on */
|
/** used when POI has no idea what is going on */
|
||||||
private final byte[] _uninterpretedData;
|
private final byte[] _uninterpretedData;
|
||||||
/**
|
/**
|
||||||
* Excel seems to tolerate padding to quad or double byte length
|
* Excel seems to tolerate padding to quad or double byte length
|
||||||
*/
|
*/
|
||||||
private boolean _isPaddedToQuadByteMultiple;
|
private boolean _isPaddedToQuadByteMultiple;
|
||||||
|
|
||||||
//00000000 15 00 12 00 01 00 01 00 11 60 00 00 00 00 00 0D .........`......
|
//00000000 15 00 12 00 01 00 01 00 11 60 00 00 00 00 00 0D .........`......
|
||||||
//00000010 26 01 00 00 00 00 00 00 00 00 &.........
|
//00000010 26 01 00 00 00 00 00 00 00 00 &.........
|
||||||
|
|
||||||
|
|
||||||
public ObjRecord() {
|
public ObjRecord() {
|
||||||
subrecords = new ArrayList<>(2);
|
subrecords = new ArrayList<>(2);
|
||||||
// TODO - ensure 2 sub-records (ftCmo 15h, and ftEnd 00h) are always created
|
// TODO - ensure 2 sub-records (ftCmo 15h, and ftEnd 00h) are always created
|
||||||
_uninterpretedData = null;
|
_uninterpretedData = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ObjRecord(RecordInputStream in) {
|
public ObjRecord(RecordInputStream in) {
|
||||||
// TODO - problems with OBJ sub-records stream
|
// TODO - problems with OBJ sub-records stream
|
||||||
// MS spec says first sub-record is always CommonObjectDataSubRecord,
|
// MS spec says first sub-record is always CommonObjectDataSubRecord,
|
||||||
// and last is always EndSubRecord. OOO spec does not mention ObjRecord(0x005D).
|
// and last is always EndSubRecord. OOO spec does not mention ObjRecord(0x005D).
|
||||||
// Existing POI test data seems to violate that rule. Some test data
|
// Existing POI test data seems to violate that rule. Some test data
|
||||||
// seems to contain garbage, and a crash is only averted by stopping at
|
// seems to contain garbage, and a crash is only averted by stopping at
|
||||||
// what looks like the 'EndSubRecord'
|
// what looks like the 'EndSubRecord'
|
||||||
|
|
||||||
// Check if this can be continued, if so then the
|
// Check if this can be continued, if so then the
|
||||||
// following wont work properly
|
// following wont work properly
|
||||||
byte[] subRecordData = in.readRemainder();
|
byte[] subRecordData = in.readRemainder();
|
||||||
if (LittleEndian.getUShort(subRecordData, 0) != CommonObjectDataSubRecord.sid) {
|
if (LittleEndian.getUShort(subRecordData, 0) != CommonObjectDataSubRecord.sid) {
|
||||||
// seems to occur in just one junit on "OddStyleRecord.xls" (file created by CrystalReports)
|
// seems to occur in just one junit on "OddStyleRecord.xls" (file created by CrystalReports)
|
||||||
// Excel tolerates the funny ObjRecord, and replaces it with a corrected version
|
// Excel tolerates the funny ObjRecord, and replaces it with a corrected version
|
||||||
// The exact logic/reasoning is not yet understood
|
// The exact logic/reasoning is not yet understood
|
||||||
_uninterpretedData = subRecordData;
|
_uninterpretedData = subRecordData;
|
||||||
subrecords = null;
|
subrecords = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//YK: files produced by OO violate the condition below
|
//YK: files produced by OO violate the condition below
|
||||||
/*
|
/*
|
||||||
if (subRecordData.length % 2 != 0) {
|
if (subRecordData.length % 2 != 0) {
|
||||||
String msg = "Unexpected length of subRecordData : " + HexDump.toHex(subRecordData);
|
String msg = "Unexpected length of subRecordData : " + HexDump.toHex(subRecordData);
|
||||||
throw new RecordFormatException(msg);
|
throw new RecordFormatException(msg);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
subrecords = new ArrayList<>();
|
subrecords = new ArrayList<>();
|
||||||
LittleEndianByteArrayInputStream subRecStream = new LittleEndianByteArrayInputStream(subRecordData);
|
LittleEndianByteArrayInputStream subRecStream = new LittleEndianByteArrayInputStream(subRecordData);
|
||||||
CommonObjectDataSubRecord cmo = (CommonObjectDataSubRecord)SubRecord.createSubRecord(subRecStream, 0);
|
CommonObjectDataSubRecord cmo = (CommonObjectDataSubRecord)SubRecord.createSubRecord(subRecStream, 0);
|
||||||
subrecords.add(cmo);
|
subrecords.add(cmo);
|
||||||
while (true) {
|
while (true) {
|
||||||
SubRecord subRecord = SubRecord.createSubRecord(subRecStream, cmo.getObjectType());
|
SubRecord subRecord = SubRecord.createSubRecord(subRecStream, cmo.getObjectType());
|
||||||
subrecords.add(subRecord);
|
subrecords.add(subRecord);
|
||||||
if (subRecord.isTerminating()) {
|
if (subRecord.isTerminating()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final int nRemainingBytes = subRecordData.length-subRecStream.getReadIndex();
|
final int nRemainingBytes = subRecordData.length-subRecStream.getReadIndex();
|
||||||
if (nRemainingBytes > 0) {
|
if (nRemainingBytes > 0) {
|
||||||
// At present (Oct-2008), most unit test samples have (subRecordData.length % 2 == 0)
|
// At present (Oct-2008), most unit test samples have (subRecordData.length % 2 == 0)
|
||||||
_isPaddedToQuadByteMultiple = subRecordData.length % MAX_PAD_ALIGNMENT == 0;
|
_isPaddedToQuadByteMultiple = subRecordData.length % MAX_PAD_ALIGNMENT == 0;
|
||||||
if (nRemainingBytes >= (_isPaddedToQuadByteMultiple ? MAX_PAD_ALIGNMENT : NORMAL_PAD_ALIGNMENT)) {
|
if (nRemainingBytes >= (_isPaddedToQuadByteMultiple ? MAX_PAD_ALIGNMENT : NORMAL_PAD_ALIGNMENT)) {
|
||||||
if (!canPaddingBeDiscarded(subRecordData, nRemainingBytes)) {
|
if (!canPaddingBeDiscarded(subRecordData, nRemainingBytes)) {
|
||||||
String msg = "Leftover " + nRemainingBytes
|
String msg = "Leftover " + nRemainingBytes
|
||||||
+ " bytes in subrecord data " + HexDump.toHex(subRecordData);
|
+ " bytes in subrecord data " + HexDump.toHex(subRecordData);
|
||||||
throw new RecordFormatException(msg);
|
throw new RecordFormatException(msg);
|
||||||
}
|
}
|
||||||
_isPaddedToQuadByteMultiple = false;
|
_isPaddedToQuadByteMultiple = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
_isPaddedToQuadByteMultiple = false;
|
_isPaddedToQuadByteMultiple = false;
|
||||||
}
|
}
|
||||||
_uninterpretedData = null;
|
_uninterpretedData = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Some XLS files have ObjRecords with nearly 8Kb of excessive padding. These were probably
|
* Some XLS files have ObjRecords with nearly 8Kb of excessive padding. These were probably
|
||||||
* written by a version of POI (around 3.1) which incorrectly interpreted the second short of
|
* written by a version of POI (around 3.1) which incorrectly interpreted the second short of
|
||||||
* the ftLbs subrecord (0x1FEE) as a length, and read that many bytes as padding (other bugs
|
* the ftLbs subrecord (0x1FEE) as a length, and read that many bytes as padding (other bugs
|
||||||
* helped allow this to occur).
|
* helped allow this to occur).
|
||||||
*
|
*
|
||||||
* Excel reads files with this excessive padding OK, truncating the over-sized ObjRecord back
|
* Excel reads files with this excessive padding OK, truncating the over-sized ObjRecord back
|
||||||
* to the its proper size. POI does the same.
|
* to the its proper size. POI does the same.
|
||||||
*/
|
*/
|
||||||
private static boolean canPaddingBeDiscarded(byte[] data, int nRemainingBytes) {
|
private static boolean canPaddingBeDiscarded(byte[] data, int nRemainingBytes) {
|
||||||
// make sure none of the padding looks important
|
// make sure none of the padding looks important
|
||||||
for(int i=data.length-nRemainingBytes; i<data.length; i++) {
|
for(int i=data.length-nRemainingBytes; i<data.length; i++) {
|
||||||
if (data[i] != 0x00) {
|
if (data[i] != 0x00) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
sb.append("[OBJ]\n");
|
sb.append("[OBJ]\n");
|
||||||
if(subrecords != null) { // there are special cases where this can be, see comments in constructor above
|
if(subrecords != null) { // there are special cases where this can be, see comments in constructor above
|
||||||
for (final SubRecord record : subrecords) {
|
for (final SubRecord record : subrecords) {
|
||||||
sb.append("SUBRECORD: ").append(record);
|
sb.append("SUBRECORD: ").append(record);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb.append("[/OBJ]\n");
|
sb.append("[/OBJ]\n");
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getRecordSize() {
|
public int getRecordSize() {
|
||||||
if (_uninterpretedData != null) {
|
if (_uninterpretedData != null) {
|
||||||
return _uninterpretedData.length + 4;
|
return _uninterpretedData.length + 4;
|
||||||
}
|
}
|
||||||
int size = 0;
|
int size = 0;
|
||||||
for (SubRecord record : subrecords) {
|
for (SubRecord record : subrecords) {
|
||||||
size += record.getDataSize()+4;
|
size += record.getDataSize()+4;
|
||||||
}
|
}
|
||||||
if (_isPaddedToQuadByteMultiple) {
|
if (_isPaddedToQuadByteMultiple) {
|
||||||
while (size % MAX_PAD_ALIGNMENT != 0) {
|
while (size % MAX_PAD_ALIGNMENT != 0) {
|
||||||
size++;
|
size++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
while (size % NORMAL_PAD_ALIGNMENT != 0) {
|
while (size % NORMAL_PAD_ALIGNMENT != 0) {
|
||||||
size++;
|
size++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return size + 4;
|
return size + 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int serialize(int offset, byte[] data) {
|
public int serialize(int offset, byte[] data) {
|
||||||
|
@ -198,35 +198,35 @@ public final class ObjRecord extends Record implements Cloneable {
|
||||||
return recSize;
|
return recSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public short getSid() {
|
public short getSid() {
|
||||||
return sid;
|
return sid;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: return Collections.unmodifiableList?
|
// FIXME: return Collections.unmodifiableList?
|
||||||
public List<SubRecord> getSubRecords() {
|
public List<SubRecord> getSubRecords() {
|
||||||
return subrecords;
|
return subrecords;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearSubRecords() {
|
public void clearSubRecords() {
|
||||||
subrecords.clear();
|
subrecords.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSubRecord(int index, SubRecord element) {
|
public void addSubRecord(int index, SubRecord element) {
|
||||||
subrecords.add(index, element);
|
subrecords.add(index, element);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addSubRecord(SubRecord o) {
|
public boolean addSubRecord(SubRecord o) {
|
||||||
return subrecords.add(o);
|
return subrecords.add(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ObjRecord clone() {
|
public ObjRecord clone() {
|
||||||
ObjRecord rec = new ObjRecord();
|
ObjRecord rec = new ObjRecord();
|
||||||
|
|
||||||
for (SubRecord record : subrecords) {
|
for (SubRecord record : subrecords) {
|
||||||
rec.addSubRecord(record.clone());
|
rec.addSubRecord(record.clone());
|
||||||
}
|
}
|
||||||
return rec;
|
return rec;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ public final class ObjectProtectRecord extends StandardRecord implements Cloneab
|
||||||
StringBuilder buffer = new StringBuilder();
|
StringBuilder buffer = new StringBuilder();
|
||||||
|
|
||||||
buffer.append("[SCENARIOPROTECT]\n");
|
buffer.append("[SCENARIOPROTECT]\n");
|
||||||
buffer.append(" .protect = ").append(getProtect())
|
buffer.append(" .protect = ").append(getProtect())
|
||||||
.append("\n");
|
.append("\n");
|
||||||
buffer.append("[/SCENARIOPROTECT]\n");
|
buffer.append("[/SCENARIOPROTECT]\n");
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
|
|
Loading…
Reference in New Issue