/** 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;
_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++)
{
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
*/
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);
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));
{
_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,
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+ }
+
+}