From 57c28fb6461bf4619e8094e18e313d3da2c6d309 Mon Sep 17 00:00:00 2001 From: Sergey Vladimirov Date: Sun, 23 Sep 2012 12:57:39 +0000 Subject: [PATCH] refactor list format override structures (was marked with @Internal annotation) git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1389039 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/org/apache/poi/hwpf/HWPFDocument.java | 30 +++++++++---------- .../hwpf/sprm/ParagraphSprmUncompressor.java | 7 +++-- .../apache/poi/hwpf/sprm/SprmOperation.java | 9 ++++++ .../converter/TestWordToTextConverter.java | 7 +++++ 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java b/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java index 070f0660ee..7012887899 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java @@ -346,12 +346,13 @@ public final class HWPFDocument extends HWPFDocumentCore _ss = new StyleSheet(_tableStream, _fib.getFcStshf()); _ft = new FontTable(_tableStream, _fib.getFcSttbfffn(), _fib.getLcbSttbfffn()); - int listOffset = _fib.getFcPlcfLst(); - int lfoOffset = _fib.getFcPlfLfo(); - if (listOffset != 0 && _fib.getLcbPlcfLst() != 0) - { - _lt = new ListTables(_tableStream, _fib.getFcPlcfLst(), _fib.getFcPlfLfo()); - } + int listOffset = _fib.getFcPlfLst(); + int lfoOffset = _fib.getFcPlfLfo(); + if ( listOffset != 0 && _fib.getLcbPlfLst() != 0 ) + { + _lt = new ListTables( _tableStream, listOffset, _fib.getFcPlfLfo(), + _fib.getLcbPlfLfo() ); + } int sbtOffset = _fib.getFcSttbSavedBy(); int sbtLength = _fib.getLcbSttbSavedBy(); @@ -830,9 +831,7 @@ public final class HWPFDocument extends HWPFDocumentCore * Microsoft Office Word 97-2007 Binary File Format (.doc) * Specification; Page 26 of 210 */ - _fib.setFcPlfLfo( tableStream.getOffset() ); - _lt.writeListOverridesTo( tableStream ); - _fib.setLcbPlfLfo( tableStream.getOffset() - tableOffset ); + _lt.writeListOverridesTo( _fib, tableStream ); tableOffset = tableStream.getOffset(); } @@ -1024,14 +1023,15 @@ public final class HWPFDocument extends HWPFDocumentCore return _tableStream; } - public int registerList(HWPFList list) - { - if (_lt == null) + public int registerList( HWPFList list ) { - _lt = new ListTables(); + if ( _lt == null ) + { + _lt = new ListTables(); + } + return _lt.addList( list.getListData(), list.getLFO(), + list.getLFOData() ); } - return _lt.addList(list.getListData(), list.getOverride()); - } public void delete(int start, int length) { diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java index bc35bd3e45..6634aa4d0b 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java @@ -159,9 +159,10 @@ public final class ParagraphSprmUncompressor case 0xa: newPAP.setIlvl ((byte) sprm.getOperand()); break; - case 0xb: - newPAP.setIlfo (sprm.getOperand()); - break; + case 0xb: + /* sprmPIlfo -- 0x460B */ + newPAP.setIlfo( sprm.getOperandShortSigned() ); + break; case 0xc: newPAP.setFNoLnn (sprm.getOperand() != 0); break; diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmOperation.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmOperation.java index 01262a88f6..d4a2f5868b 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmOperation.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmOperation.java @@ -134,6 +134,15 @@ public final class SprmOperation } } + public short getOperandShortSigned() + { + if ( getSizeCode() != 2 && getSizeCode() != 4 && getSizeCode() != 5 ) + throw new UnsupportedOperationException( + "Current SPRM doesn't have signed short operand: " + this ); + + return LittleEndian.getShort( _grpprl, _gOffset ); + } + public int getOperation() { return BITFIELD_OP.getValue( _value ); diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/converter/TestWordToTextConverter.java b/src/scratchpad/testcases/org/apache/poi/hwpf/converter/TestWordToTextConverter.java index c633797117..11d5976bbe 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/converter/TestWordToTextConverter.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/converter/TestWordToTextConverter.java @@ -35,4 +35,11 @@ public class TestWordToTextConverter extends TestCase assertTrue( foundText .contains( "Soak the rice in water for three to four hours" ) ); } + + public void testBug53380_3() throws Exception + { + HWPFDocument doc = HWPFTestDataSamples + .openSampleFile( "Bug53380_3.doc" ); + WordToTextConverter.getText( doc ); + } } -- 2.39.5