]> source.dussan.org Git - poi.git/commitdiff
Apply patch from bug #48926 - Initial support for the HWPF revision marks authors...
authorNick Burch <nick@apache.org>
Wed, 26 May 2010 14:17:15 +0000 (14:17 +0000)
committerNick Burch <nick@apache.org>
Wed, 26 May 2010 14:17:15 +0000 (14:17 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@948435 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java
src/scratchpad/src/org/apache/poi/hwpf/model/FileInformationBlock.java
src/scratchpad/src/org/apache/poi/hwpf/model/RevisionMarkAuthorTable.java [new file with mode: 0644]

index acbd7e78b8dcb185ed79bbd4e6296293da8e12ce..d1f3899f13ee03e7aa49f2570ef4f8c2bdd85d9f 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-SNAPSHOT" date="2010-??-??">
+           <action dev="POI-DEVELOPERS" type="add">48926 - Initial support for the HWPF revision marks authors list</action>
            <action dev="POI-DEVELOPERS" type="fix">49160 - Ensure that CTDigSigBlob is included in poi-ooxml jar</action>
            <action dev="POI-DEVELOPERS" type="fix">49189 - Detect w:tab and w:cr entries in XWPF paragraphs, even when the XSD is silly and maps them to CTEmpty</action>
            <action dev="POI-DEVELOPERS" type="fix">49273 - Correct handling for Font Character Sets with indicies greater than 127</action>
index 289044474af69705cda63d198c531bafea19576a..f0d8b1d8eebb5ae7b095568271ef20013c061e24 100644 (file)
@@ -92,6 +92,9 @@ public final class HWPFDocument extends POIDocument
 
   /** Holds the save history for this document. */
   protected SavedByTable _sbt;
+  
+  /** Holds the revision mark authors for this document. */
+  protected RevisionMarkAuthorTable _rmat;
 
   /** Holds pictures table */
   protected PicturesTable _pictures;
@@ -274,6 +277,13 @@ public final class HWPFDocument extends POIDocument
       _sbt = new SavedByTable(_tableStream, sbtOffset, sbtLength);
     }
 
+    int rmarkOffset = _fib.getFcSttbfRMark();
+    int rmarkLength = _fib.getLcbSttbfRMark();
+    if (rmarkOffset != 0 && rmarkLength != 0)
+    {
+      _rmat = new RevisionMarkAuthorTable(_tableStream, rmarkOffset, rmarkLength);
+    }
+    
     PlexOfCps plc = new PlexOfCps(_tableStream, _fib.getFcPlcffldMom(), _fib.getLcbPlcffldMom(), 2);
     for (int x = 0; x < plc.length(); x++)
     {
@@ -411,6 +421,16 @@ public final class HWPFDocument extends POIDocument
     return _sbt;
   }
 
+  /**
+   * Gets a reference to the revision mark author table, which holds the revision mark authors for the document.
+   *
+   * @return the saved-by table.
+   */
+  public RevisionMarkAuthorTable getRevisionMarkAuthorTable()
+  {
+    return _rmat;
+  }
+  
   /**
    * @return PicturesTable object, that is able to extract images from this document
    */
@@ -514,6 +534,16 @@ public final class HWPFDocument extends POIDocument
 
       tableOffset = tableStream.getOffset();
     }
+    
+    // write out the revision mark authors table.
+    if (_rmat != null)
+    {
+      _fib.setFcSttbfRMark(tableOffset);
+      _rmat.writeTo(tableStream);
+      _fib.setLcbSttbfRMark(tableStream.getOffset() - tableOffset);
+
+      tableOffset = tableStream.getOffset();
+    }
 
     // write out the FontTable.
     _fib.setFcSttbfffn(tableOffset);
index 6c09b49aca580109d29c0e340d78ec7273170178..01ccec19b5e229e3deaa9a90b918bba715c56615 100644 (file)
@@ -68,6 +68,7 @@ public final class FileInformationBlock extends FIBAbstractType
       fieldSet.add(Integer.valueOf(FIBFieldHandler.PLFLFO));
       fieldSet.add(Integer.valueOf(FIBFieldHandler.PLCFFLDMOM));
       fieldSet.add(Integer.valueOf(FIBFieldHandler.STTBFFFN));
+      fieldSet.add(Integer.valueOf(FIBFieldHandler.STTBFRMARK));
       fieldSet.add(Integer.valueOf(FIBFieldHandler.STTBSAVEDBY));
       fieldSet.add(Integer.valueOf(FIBFieldHandler.MODIFIED));
 
@@ -258,6 +259,26 @@ public final class FileInformationBlock extends FIBAbstractType
     {
       _fieldHandler.setFieldSize(FIBFieldHandler.STTBFFFN, lcbSttbFffn);
     }
+    
+    public int getFcSttbfRMark()
+    {
+      return _fieldHandler.getFieldOffset(FIBFieldHandler.STTBFRMARK);
+    }
+
+    public int getLcbSttbfRMark()
+    {
+      return _fieldHandler.getFieldSize(FIBFieldHandler.STTBFRMARK);
+    }
+    
+    public void setFcSttbfRMark(int fcSttbfRMark)
+    {
+      _fieldHandler.setFieldOffset(FIBFieldHandler.STTBFRMARK, fcSttbfRMark);
+    }
+
+    public void setLcbSttbfRMark(int lcbSttbfRMark)
+    {
+      _fieldHandler.setFieldSize(FIBFieldHandler.STTBFRMARK, lcbSttbfRMark);
+    }
 
     /**
      * Return the offset to the PlcfHdd, in the table stream,
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/RevisionMarkAuthorTable.java b/src/scratchpad/src/org/apache/poi/hwpf/model/RevisionMarkAuthorTable.java
new file mode 100644 (file)
index 0000000..c8b9873
--- /dev/null
@@ -0,0 +1,147 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hwpf.model;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.StringUtil;
+
+import org.apache.poi.hwpf.model.io.HWPFOutputStream;
+
+/**
+ * String table containing the names of authors of revision marks, e-mails and
+ * comments in this document.
+ * 
+ * @author Ryan Lauck
+ */
+public final class RevisionMarkAuthorTable {
+       /**
+        * must be 0xFFFF
+        */
+       private short fExtend = (short) 0xFFFF;
+       
+       /**
+        * the number of entries in the table
+        */
+       private short cData = 0;
+       
+       /**
+        * must be 0
+        */
+       private short cbExtra = 0;
+
+       /**
+        * Array of entries.
+        */
+       private String[] entries;
+
+       /**
+        * Constructor to read the table from the table stream.
+        * 
+        * @param tableStream the table stream.
+        * @param offset the offset into the byte array.
+        * @param size the size of the table in the byte array.
+        */
+       public RevisionMarkAuthorTable(byte[] tableStream, int offset, int size) throws IOException {
+               // Read fExtend - it isn't used
+               fExtend = LittleEndian.getShort(tableStream, offset);
+               if(fExtend != 0xFFFF) {
+                       //TODO: throw an exception here?
+               }
+               offset += 2;
+
+               // Read the number of entries
+               cData = LittleEndian.getShort(tableStream, offset);
+               offset += 2;
+
+               // Read cbExtra - it isn't used
+               cbExtra = LittleEndian.getShort(tableStream, offset);
+               if(cbExtra != 0) {
+                       //TODO: throw an exception here?
+               }
+               offset += 2;
+               
+               entries = new String[cData];
+               for (int i = 0; i < cData; i++) {
+                       int len = LittleEndian.getShort(tableStream, offset);
+                       offset += 2;
+                       
+                       String name = StringUtil.getFromUnicodeLE(tableStream, offset, len);
+                       offset += len * 2;
+
+                       entries[i] = name;
+               }
+       }
+
+       /**
+        * Gets the entries. The returned list cannot be modified.
+        * 
+        * @return the list of entries.
+        */
+       public List<String> getEntries() {
+               return Collections.unmodifiableList(Arrays.asList(entries));
+       }
+       
+       /**
+        * Get an author by its index.  Returns null if it does not exist.
+        * 
+        * @return the revision mark author
+        */
+       public String getAuthor(int index) {
+               String auth = null;
+               if(index >= 0 && index < entries.length) {
+                       auth = entries[index];
+               }
+               return auth;
+       }
+       
+       /**
+        * Gets the number of entries.
+        * 
+        * @return the number of entries.
+        */
+       public int getSize() {
+               return cData;
+       }
+
+       /**
+        * Writes this table to the table stream.
+        * 
+        * @param tableStream  the table stream to write to.
+        * @throws IOException  if an error occurs while writing.
+        */
+       public void writeTo(HWPFOutputStream tableStream) throws IOException {
+               byte[] header = new byte[6];
+               LittleEndian.putShort(header, 0, fExtend);
+               LittleEndian.putShort(header, 2, cData);
+               LittleEndian.putShort(header, 4, cbExtra);
+               tableStream.write(header);
+
+               for (String name : entries) {
+                       byte[] buf = new byte[name.length() * 2 + 2];
+                       LittleEndian.putShort(buf, 0, (short) name.length());
+                       StringUtil.putUnicodeLE(name, buf, 2);
+                       tableStream.write(buf);
+               }
+       }
+
+}