]> source.dussan.org Git - poi.git/commitdiff
fix test case for 45473: calculate PAPX boundaries basing on char positions, not...
authorSergey Vladimirov <sergey@apache.org>
Thu, 7 Jul 2011 10:39:27 +0000 (10:39 +0000)
committerSergey Vladimirov <sergey@apache.org>
Thu, 7 Jul 2011 10:39:27 +0000 (10:39 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1143753 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwpf/model/CharIndexTranslator.java
src/scratchpad/src/org/apache/poi/hwpf/model/OldSectionTable.java
src/scratchpad/src/org/apache/poi/hwpf/model/PAPBinTable.java
src/scratchpad/src/org/apache/poi/hwpf/model/PAPFormattedDiskPage.java
src/scratchpad/src/org/apache/poi/hwpf/model/PAPX.java
src/scratchpad/src/org/apache/poi/hwpf/model/SectionTable.java
src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java

index 211686414307ef7948695b719ec33898b772ec84..2ef8b55b0e9fbfead584e79f8e1e266480278a8b 100644 (file)
 package org.apache.poi.hwpf.model;\r
 \r
 public interface CharIndexTranslator {\r
+    /**\r
+     * Calculates the byte index of the given char index.\r
+     * \r
+     * @param charPos\r
+     *            The char position\r
+     * @return The byte index\r
+     */\r
+    int getByteIndex( int charPos );\r
+\r
     /**\r
      * Calculates the char index of the given byte index.\r
      * Look forward if index is not in table\r
@@ -36,7 +45,7 @@ public interface CharIndexTranslator {
      * @return the char index\r
      */\r
     int getCharIndex(int bytePos, int startCP);\r
-\r
+    \r
     /**\r
      * Check if index is in table\r
      *\r
index 87218b35e5473cb3a89c238ffe3a565b7ac442de..8cc0c5b3032bf51b23dc63e0374a467838ae86c2 100644 (file)
@@ -74,6 +74,11 @@ public final class OldSectionTable extends SectionTable
         this.tpt = tpt;
      }
 
+        public int getByteIndex( int charPos )
+        {
+            return charPos;
+        }
+
      public int getCharIndex(int bytePos, int startCP) {
         return bytePos;
      }
index 9d0226e7599041eb123cd835d4b14a80b404873e..4ca1087cca2566c336ce3c1ae7125f2d13aa623d 100644 (file)
 
 package org.apache.poi.hwpf.model;
 
-import java.util.ArrayList;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.ArrayList;
 
-import org.apache.poi.hwpf.model.io.*;
+import org.apache.poi.hwpf.model.io.HWPFFileSystem;
+import org.apache.poi.hwpf.model.io.HWPFOutputStream;
 import org.apache.poi.hwpf.sprm.SprmBuffer;
-
 import org.apache.poi.poifs.common.POIFSConstants;
 import org.apache.poi.util.LittleEndian;
 
@@ -223,7 +223,7 @@ public class PAPBinTable
       PAPFormattedDiskPage pfkp = new PAPFormattedDiskPage(_dataStream);
       pfkp.fill(overflow);
 
-      byte[] bufFkp = pfkp.toByteArray(fcMin);
+      byte[] bufFkp = pfkp.toByteArray(tpt, fcMin);
       docStream.write(bufFkp);
       overflow = pfkp.getOverflow();
 
index 965e3280518f1d70537fb400b824efd8eb7f3512..14c677db401cfa06d10830764b686655d9b72aae 100644 (file)
 
 package org.apache.poi.hwpf.model;
 
-import org.apache.poi.util.LittleEndian;
-
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Arrays;
+import java.util.List;
+
+import org.apache.poi.util.LittleEndian;
 
 /**
  * Represents a PAP FKP. The style properties for paragraph and character runs
@@ -137,7 +137,7 @@ public final class PAPFormattedDiskPage extends FormattedDiskPage {
      * @param fcMin The file offset in the main stream where text begins.
      * @return A byte array representing this data structure.
      */
-    protected byte[] toByteArray(int fcMin)
+    protected byte[] toByteArray(CharIndexTranslator translator, int fcMin)
     {
       byte[] buf = new byte[512];
       int size = _papxList.size();
@@ -152,7 +152,7 @@ public final class PAPFormattedDiskPage extends FormattedDiskPage {
       int index = 0;
       for (; index < size; index++)
       {
-        byte[] grpprl = ((PAPX)_papxList.get(index)).getGrpprl();
+        byte[] grpprl = _papxList.get(index).getGrpprl();
         int grpprlLength = grpprl.length;
 
         // is grpprl huge?
@@ -255,7 +255,10 @@ public final class PAPFormattedDiskPage extends FormattedDiskPage {
           grpprlOffset -= (grpprl.length + (2 - grpprl.length % 2));
           grpprlOffset -= (grpprlOffset % 2);
         }
-        LittleEndian.putInt(buf, fcOffset, papx.getStartBytes() + fcMin);
+            // LittleEndian.putInt( buf, fcOffset,
+            // papx.getStartBytes() );
+            LittleEndian.putInt( buf, fcOffset,
+                    translator.getByteIndex( papx.getStart() ) );
         buf[bxOffset] = (byte)(grpprlOffset/2);
         System.arraycopy(phe, 0, buf, bxOffset + 1, phe.length);
 
@@ -283,7 +286,9 @@ public final class PAPFormattedDiskPage extends FormattedDiskPage {
 
       }
 
-      LittleEndian.putInt(buf, fcOffset, papx.getEndBytes() + fcMin);
+        // LittleEndian.putInt(buf, fcOffset, papx.getEndBytes() + fcMin);
+        LittleEndian.putInt( buf, fcOffset,
+                translator.getByteIndex( papx.getEnd() ) );
       return buf;
     }
 
index 1707ccd71a63a8b4b9775b4d8f61cc78d34f2132..4d9a315982ab3d93c92097fe8fc38c15ef2fa4f0 100644 (file)
@@ -123,6 +123,31 @@ public final class PAPX extends BytePropertyNode<PAPX> {
     return (SprmBuffer)_buf;
   }
 
+    /**
+     * @deprecated Though bytes are actually stored in file, it is advised to
+     *             use char positions for all operations. Including save
+     *             operations, because only char positions are preserved.
+     */
+    @Deprecated
+    @Override
+    public int getEndBytes()
+    {
+        return super.getEndBytes();
+    }
+
+    /**
+     * @deprecated Though bytes are actually stored in file, it is advised to
+     *             use char positions for all operations. Including save
+     *             operations, because only char positions are preserved.
+     */
+    @Deprecated
+    @Override
+    public int getStartBytes()
+    {
+        // TODO Auto-generated method stub
+        return super.getStartBytes();
+    }
+
   public ParagraphProperties getParagraphProperties(StyleSheet ss)
   {
     if(ss == null) {
index 8607b2109f28154c277fb0fc29ec63b4f966e9cd..c6f9cb24579b98ff3c6c66566aed4cbffbc8bc55 100644 (file)
@@ -179,14 +179,22 @@ public class SectionTable
 
       // add the section descriptor bytes to the PlexOfCps.
 
-
-      // original line -
-      //GenericPropertyNode property = new GenericPropertyNode(sepx.getStart(), sepx.getEnd(), sed.toByteArray());
-
-      // Line using Ryan's FCtoCP() conversion method -
-      // unable to observe any effect on our testcases when using this code - piers
-      GenericPropertyNode property = new GenericPropertyNode(tpt.getCharIndex(sepx.getStartBytes()), tpt.getCharIndex(sepx.getEndBytes()), sed.toByteArray());
-
+            /* original line */
+            // GenericPropertyNode property = new
+            // GenericPropertyNode(sepx.getStart(), sepx.getEnd(),
+            // sed.toByteArray());
+            /*
+             * Line using Ryan's FCtoCP() conversion method - unable to observe
+             * any effect on our testcases when using this code - piers
+             */
+            /*
+             * there is an effect on Bug45743.doc actually. writeoutreadback
+             * changes byte offset of chars (but preserve string offsets) -
+             * sergey
+             */
+            GenericPropertyNode property = new GenericPropertyNode(
+                    tpt.getCharIndex( sepx.getStartBytes() ),
+                    tpt.getCharIndex( sepx.getEndBytes() ), sed.toByteArray() );
 
       plex.addProperty(property);
 
index b4b02b5024395b493abd89c83df8b666488db973..c8e3db2f83ac216c1523b4c32b377c65834dc4e7 100644 (file)
 
 package org.apache.poi.hwpf.model;
 
-import org.apache.poi.hwpf.model.io.HWPFOutputStream;
-import org.apache.poi.poifs.common.POIFSConstants;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
+import org.apache.poi.hwpf.model.io.HWPFOutputStream;
+import org.apache.poi.poifs.common.POIFSConstants;
+
 /**
  * The piece table for matching up character positions to bits of text. This
  * mostly works in bytes, but the TextPieces themselves work in characters. This
@@ -197,6 +197,33 @@ public class TextPieceTable implements CharIndexTranslator {
                return false;
        }
 
+    public int getByteIndex( int charPos )
+    {
+        int byteCount = 0;
+        for ( TextPiece tp : _textPieces )
+        {
+            if ( charPos >= tp.getEnd() )
+            {
+                byteCount = tp.getPieceDescriptor().getFilePosition()
+                        + ( tp.getEnd() - tp.getStart() )
+                        * ( tp.isUnicode() ? 2 : 1 );
+
+                if ( charPos == tp.getEnd() )
+                    break;
+
+                continue;
+            }
+            if ( charPos < tp.getEnd() )
+            {
+                int left = charPos - tp.getStart();
+                byteCount = tp.getPieceDescriptor().getFilePosition() + left
+                        * ( tp.isUnicode() ? 2 : 1 );
+                break;
+            }
+        }
+        return byteCount;
+    }
+
     public int getCharIndex(int bytePos) {
         return getCharIndex(bytePos, 0);
     }
@@ -297,7 +324,7 @@ public class TextPieceTable implements CharIndexTranslator {
         for(TextPiece tp : _textPiecesFCOrder) {
             int pieceStart = tp.getPieceDescriptor().getFilePosition();
 
-            if (startBytePos > pieceStart + tp.bytesLength()) {
+            if (startBytePos >= pieceStart + tp.bytesLength()) {
                 continue;
             }