aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java21
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java13
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java8
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java4
-rw-r--r--src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java12
-rw-r--r--test-data/slideshow/bug58718_008495.pptbin0 -> 1143296 bytes
-rw-r--r--test-data/slideshow/bug58718_008524.pptbin0 -> 129536 bytes
-rw-r--r--test-data/slideshow/bug58718_008558.pptbin0 -> 547840 bytes
-rw-r--r--test-data/slideshow/bug58718_349008.pptbin0 -> 15360 bytes
9 files changed, 47 insertions, 11 deletions
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java
index 3668862170..d1046a1f04 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java
@@ -93,13 +93,13 @@ public class TabStopPropCollection extends TextProp {
*/
public void parseProperty(byte data[], int offset) {
int count = LittleEndian.getUShort(data, offset);
- offset += LittleEndianConsts.SHORT_SIZE;
+ int off = offset + LittleEndianConsts.SHORT_SIZE;
for (int i=0; i<count; i++) {
- int position = LittleEndian.getShort(data, offset);
- offset += LittleEndianConsts.SHORT_SIZE;
- int recVal = LittleEndian.getShort(data, offset);
+ int position = LittleEndian.getShort(data, off);
+ off += LittleEndianConsts.SHORT_SIZE;
+ int recVal = LittleEndian.getShort(data, off);
TabStopType type = TabStopType.fromRecordVal(recVal);
- offset += LittleEndianConsts.SHORT_SIZE;
+ off += LittleEndianConsts.SHORT_SIZE;
tabStops.add(new TabStop(position, type));
}
@@ -109,4 +109,15 @@ public class TabStopPropCollection extends TextProp {
public int getSize() {
return LittleEndianConsts.SHORT_SIZE + tabStops.size()*LittleEndianConsts.INT_SIZE;
}
+
+ @Override
+ public TabStopPropCollection clone() {
+ TabStopPropCollection other = (TabStopPropCollection)super.clone();
+ other.tabStops = new ArrayList<TabStop>();
+ for (TabStop ts : tabStops) {
+ TabStop tso = new TabStop(ts.getPosition(), ts.getType());
+ other.tabStops.add(tso);
+ }
+ return other;
+ }
}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java
index 07d663b4a9..e95cdfd29c 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java
@@ -98,6 +98,7 @@ public class TextProp implements Cloneable {
}
}
+ @Override
public int hashCode() {
final int prime = 31;
int result = 1;
@@ -108,6 +109,7 @@ public class TextProp implements Cloneable {
return result;
}
+ @Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
@@ -121,4 +123,15 @@ public class TextProp implements Cloneable {
if (sizeOfDataBlock != other.sizeOfDataBlock) return false;
return true;
}
+
+ @Override
+ public String toString() {
+ int len;
+ switch (sizeOfDataBlock) {
+ case 1: len = 4; break;
+ case 2: len = 6; break;
+ default: len = 10; break;
+ }
+ return String.format("%s = %d (%0#"+len+"X mask / %d bytes)", propName, dataValue, maskInHeader, sizeOfDataBlock);
+ }
} \ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
index 09415a01c3..cf45cc790f 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
@@ -214,13 +214,11 @@ public class TextPropCollection {
// Bingo, data contains this property
TextProp prop = tp.clone();
int val = 0;
- if (prop instanceof TabStopPropCollection) {
- ((TabStopPropCollection)prop).parseProperty(data, dataOffset+bytesPassed);
- } else if (prop.getSize() == 2) {
+ if (prop.getSize() == 2) {
val = LittleEndian.getShort(data,dataOffset+bytesPassed);
} else if(prop.getSize() == 4) {
val = LittleEndian.getInt(data,dataOffset+bytesPassed);
- } else if (prop.getSize() == 0) {
+ } else if (prop.getSize() == 0 && !(prop instanceof TabStopPropCollection)) {
//remember "special" bits.
maskSpecial |= tp.getMask();
continue;
@@ -228,6 +226,8 @@ public class TextPropCollection {
if (prop instanceof BitMaskTextProp) {
((BitMaskTextProp)prop).setValueWithMask(val, containsField);
+ } else if (prop instanceof TabStopPropCollection) {
+ ((TabStopPropCollection)prop).parseProperty(data, dataOffset+bytesPassed);
} else {
prop.setValue(val);
}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java
index 2d9541e1bd..6d1c4873d7 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java
@@ -144,7 +144,7 @@ public final class TxMasterStyleAtom extends RecordAtom {
charStyles = new ArrayList<TextPropCollection>(levels);
for(short i = 0; i < levels; i++) {
- TextPropCollection prprops = new TextPropCollection(0, TextPropType.paragraph); // getParagraphProps(type, j)
+ TextPropCollection prprops = new TextPropCollection(0, TextPropType.paragraph);
if (type >= TextHeaderAtom.CENTRE_BODY_TYPE) {
// Fetch the 2 byte value, that is safe to ignore for some types of text
short indentLevel = LittleEndian.getShort(_data, pos);
@@ -162,7 +162,7 @@ public final class TxMasterStyleAtom extends RecordAtom {
head = LittleEndian.getInt(_data, pos);
pos += LittleEndian.INT_SIZE;
- TextPropCollection chprops = new TextPropCollection(0, TextPropType.character); // getCharacterProps(type, j)
+ TextPropCollection chprops = new TextPropCollection(0, TextPropType.character);
pos += chprops.buildTextPropList( head, _data, pos);
charStyles.add(chprops);
}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
index 067f6ca916..6e11a41b54 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
@@ -39,6 +39,7 @@ import org.apache.poi.ddf.EscherColorRef;
import org.apache.poi.ddf.EscherProperties;
import org.apache.poi.hslf.HSLFTestDataSamples;
import org.apache.poi.hslf.exceptions.OldPowerPointFormatException;
+import org.apache.poi.hslf.extractor.PowerPointExtractor;
import org.apache.poi.hslf.model.HeadersFooters;
import org.apache.poi.hslf.record.Document;
import org.apache.poi.hslf.record.Record;
@@ -756,6 +757,17 @@ public final class TestBugs {
assertEquals("foobaa", tr.getRawText());
ppt2.close();
}
+
+ @Test
+ public void bug58718() throws IOException {
+ String files[] = { "bug58718_008524.ppt","bug58718_008558.ppt","bug58718_349008.ppt","bug58718_008495.ppt", };
+ for (String f : files) {
+ File sample = HSLFTestDataSamples.getSampleFile(f);
+ PowerPointExtractor ex = new PowerPointExtractor(sample.getAbsolutePath());
+ assertNotNull(ex.getText());
+ ex.close();
+ }
+ }
private static HSLFSlideShow open(String fileName) throws IOException {
File sample = HSLFTestDataSamples.getSampleFile(fileName);
diff --git a/test-data/slideshow/bug58718_008495.ppt b/test-data/slideshow/bug58718_008495.ppt
new file mode 100644
index 0000000000..9d9009a867
--- /dev/null
+++ b/test-data/slideshow/bug58718_008495.ppt
Binary files differ
diff --git a/test-data/slideshow/bug58718_008524.ppt b/test-data/slideshow/bug58718_008524.ppt
new file mode 100644
index 0000000000..96eddb7729
--- /dev/null
+++ b/test-data/slideshow/bug58718_008524.ppt
Binary files differ
diff --git a/test-data/slideshow/bug58718_008558.ppt b/test-data/slideshow/bug58718_008558.ppt
new file mode 100644
index 0000000000..c8a6d52795
--- /dev/null
+++ b/test-data/slideshow/bug58718_008558.ppt
Binary files differ
diff --git a/test-data/slideshow/bug58718_349008.ppt b/test-data/slideshow/bug58718_349008.ppt
new file mode 100644
index 0000000000..41d9759b1d
--- /dev/null
+++ b/test-data/slideshow/bug58718_349008.ppt
Binary files differ