You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by se...@apache.org on 2011/08/11 18:37:32 UTC

svn commit: r1156662 [1/3] - in /poi/trunk/src/scratchpad: src/org/apache/poi/hwpf/ src/org/apache/poi/hwpf/dev/ src/org/apache/poi/hwpf/model/ src/org/apache/poi/hwpf/model/types/ testcases/org/apache/poi/hwpf/model/ testcases/org/apache/poi/hwpf/user...

Author: sergey
Date: Thu Aug 11 16:37:31 2011
New Revision: 1156662

URL: http://svn.apache.org/viewvc?rev=1156662&view=rev
Log:
fix issues related to document properties loading and saving

Modified:
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/dev/HWPFLister.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/DocumentProperties.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FIBFieldHandler.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FieldsTables.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/NotesTables.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/types/DOPAbstractType.java
    poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/model/TestDocumentProperties.java
    poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java?rev=1156662&r1=1156661&r2=1156662&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java Thu Aug 11 16:37:31 2011
@@ -264,7 +264,7 @@ public final class HWPFDocument extends 
     //fcMin = _fib.getFcMin()
 
     // Start to load up our standard structures.
-    _dop = new DocumentProperties(_tableStream, _fib.getFcDop());
+    _dop = new DocumentProperties(_tableStream, _fib.getFcDop(), _fib.getLcbDop() );
     _cft = new ComplexFileTable(_mainStream, _tableStream, _fib.getFcClx(), fcMin);
     TextPieceTable _tpt = _cft.getTextPieceTable();
 
@@ -683,6 +683,21 @@ public final class HWPFDocument extends 
     int fcMac = mainStream.getOffset();
 
         /*
+         * dop (document properties record) Written immediately after the end of
+         * the previously recorded structure. This is recorded in all Word
+         * documents
+         * 
+         * Microsoft Office Word 97-2007 Binary File Format (.doc)
+         * Specification; Page 23 of 210
+         */
+
+    // write out the DocumentProperties.
+    _fib.setFcDop(tableOffset);
+    _dop.writeTo(tableStream);
+    _fib.setLcbDop(tableStream.getOffset() - tableOffset);
+    tableOffset = tableStream.getOffset();
+
+        /*
          * plcfBkmkf (table recording beginning CPs of bookmarks) Written
          * immediately after the sttbfBkmk, if the document contains bookmarks.
          * 
@@ -881,13 +896,6 @@ public final class HWPFDocument extends 
     _fib.setLcbSttbfffn(tableStream.getOffset() - tableOffset);
     tableOffset = tableStream.getOffset();
 
-    // write out the DocumentProperties.
-    _fib.setFcDop(tableOffset);
-    byte[] buf = new byte[_dop.getSize()];
-    _fib.setLcbDop(_dop.getSize());
-    _dop.serialize(buf, 0);
-    tableStream.write(buf);
-
     // set some variables in the FileInformationBlock.
     _fib.setFcMin(fcMin);
     _fib.setFcMac(fcMac);

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/dev/HWPFLister.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/dev/HWPFLister.java?rev=1156662&r1=1156661&r2=1156662&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/dev/HWPFLister.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/dev/HWPFLister.java Thu Aug 11 16:37:31 2011
@@ -101,7 +101,7 @@ public final class HWPFLister
         if ( args.length == 0 )
         {
             System.err.println( "Use:" );
-            System.err.println( "\tHWPFLister <filename>\n"
+            System.err.println( "\tHWPFLister <filename>\n" + "\t\t[--dop]\n"
                     + "\t\t[--textPieces] [--textPiecesText]\n"
                     + "\t\t[--chpx] [--chpxProperties] [--chpxSprms]\n"
                     + "\t\t[--papx] [--papxProperties] [--papxSprms]\n"
@@ -112,6 +112,8 @@ public final class HWPFLister
             System.exit( 1 );
         }
 
+        boolean outputDop = false;
+
         boolean outputTextPieces = false;
         boolean outputTextPiecesText = false;
 
@@ -136,6 +138,9 @@ public final class HWPFLister
 
         for ( String arg : Arrays.asList( args ).subList( 1, args.length ) )
         {
+            if ( "--dop".equals( arg ) )
+                outputDop = true;
+
             if ( "--textPieces".equals( arg ) )
                 outputTextPieces = true;
             if ( "--textPiecesText".equals( arg ) )
@@ -197,6 +202,12 @@ public final class HWPFLister
         System.out.println( "== FIB (original) ==" );
         listerOriginal.dumpFIB();
 
+        if ( outputDop )
+        {
+            System.out.println( "== Document properties ==" );
+            listerOriginal.dumpDop();
+        }
+
         if ( outputTextPieces )
         {
             System.out.println( "== Text pieces (original) ==" );
@@ -371,6 +382,17 @@ public final class HWPFLister
         }
     }
 
+    private void dumpDop()
+    {
+        if ( !( _doc instanceof HWPFDocument ) )
+        {
+            System.out.println( "Word 95 not supported so far" );
+            return;
+        }
+
+        System.out.println( ( (HWPFDocument) _doc ).getDocProperties() );
+    }
+
     private void dumpEscher()
     {
         if ( _doc instanceof HWPFOldDocument )

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/DocumentProperties.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/DocumentProperties.java?rev=1156662&r1=1156661&r2=1156662&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/DocumentProperties.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/DocumentProperties.java Thu Aug 11 16:37:31 2011
@@ -17,19 +17,60 @@
 
 package org.apache.poi.hwpf.model;
 
+import java.io.IOException;
+
+import org.apache.poi.hwpf.model.io.HWPFOutputStream;
 import org.apache.poi.hwpf.model.types.DOPAbstractType;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.LittleEndian;
 
 /**
  * Comment me
- *
+ * 
  * @author Ryan Ackley
  */
 @Internal
-public final class DocumentProperties extends DOPAbstractType {
+public final class DocumentProperties extends DOPAbstractType
+{
+
+    private byte[] _preserved;
+
+    /**
+     * @deprecated Use {@link #DocumentProperties(byte[],int,int)} instead
+     */
+    public DocumentProperties( byte[] tableStream, int offset )
+    {
+        this( tableStream, offset, DOPAbstractType.getSize() );
+    }
+
+    public DocumentProperties( byte[] tableStream, int offset, int length )
+    {
+        super.fillFields( tableStream, offset );
+
+        final int supportedSize = DOPAbstractType.getSize();
+        if ( length != supportedSize )
+        {
+            this._preserved = LittleEndian.getByteArray( tableStream, offset
+                    + supportedSize, length - supportedSize );
+        }
+        else
+        {
+            _preserved = new byte[0];
+        }
+    }
+
+    @Override
+    public void serialize( byte[] data, int offset )
+    {
+        super.serialize( data, offset );
+    }
 
+    public void writeTo( HWPFOutputStream tableStream ) throws IOException
+    {
+        byte[] supported = new byte[getSize()];
+        serialize( supported, 0 );
 
-	public DocumentProperties(byte[] tableStream, int offset) {
-		super.fillFields(tableStream, offset);
-	}
+        tableStream.write( supported );
+        tableStream.write( _preserved );
+    }
 }

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FIBFieldHandler.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FIBFieldHandler.java?rev=1156662&r1=1156661&r2=1156662&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FIBFieldHandler.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FIBFieldHandler.java Thu Aug 11 16:37:31 2011
@@ -71,6 +71,7 @@ public final class FIBFieldHandler
   public static final int PRENVPORT = 28;
   public static final int PRENVLAND = 29;
   public static final int WSS = 30;
+  // 402 == 0x0192; 406 == 0x0196
   public static final int DOP = 31;
   public static final int STTBFASSOC = 32;
   public static final int CLX = 33;

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FieldsTables.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FieldsTables.java?rev=1156662&r1=1156661&r2=1156662&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FieldsTables.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/FieldsTables.java Thu Aug 11 16:37:31 2011
@@ -135,7 +135,11 @@ public class FieldsTables
             throws IOException
     {
         if ( plexOfCps == null || plexOfCps.length() == 0 )
+        {
+            fib.setFieldsPlcfOffset( part, outputStream.getOffset() );
+            fib.setFieldsPlcfLength( part, 0 );
             return 0;
+        }
 
         byte[] data = plexOfCps.toByteArray();
 

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/NotesTables.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/NotesTables.java?rev=1156662&r1=1156661&r2=1156662&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/NotesTables.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/NotesTables.java Thu Aug 11 16:37:31 2011
@@ -87,7 +87,7 @@ public class NotesTables
     {
         if ( descriptors == null || descriptors.length() == 0 )
         {
-            fib.setNotesDescriptorsOffset( noteType, 0 );
+            fib.setNotesDescriptorsOffset( noteType, tableStream.getOffset() );
             fib.setNotesDescriptorsSize( noteType, 0 );
             return;
         }
@@ -105,7 +105,7 @@ public class NotesTables
     {
         if ( textPositions == null || textPositions.length() == 0 )
         {
-            fib.setNotesTextPositionsOffset( noteType, 0 );
+            fib.setNotesTextPositionsOffset( noteType, tableStream.getOffset() );
             fib.setNotesTextPositionsSize( noteType, 0 );
             return;
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org