From 6d2bc8aea9c5039413d1674d4c71ce87a6ca0f3f Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 14 Aug 2006 10:29:49 +0000 Subject: [PATCH] Access to Saved By Information - patch from Trejkaz in bug #38647 git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@431320 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/org/apache/poi/hwpf/HWPFDocument.java | 31 +++++ .../poi/hwpf/model/FileInformationBlock.java | 21 +++ .../apache/poi/hwpf/model/SavedByEntry.java | 85 ++++++++++++ .../apache/poi/hwpf/model/SavedByTable.java | 121 ++++++++++++++++++ .../apache/poi/hwpf/data/saved-by-table.doc | Bin 0 -> 65024 bytes .../poi/hwpf/model/TestSavedByTable.java | 91 +++++++++++++ 6 files changed, 349 insertions(+) create mode 100644 src/scratchpad/src/org/apache/poi/hwpf/model/SavedByEntry.java create mode 100644 src/scratchpad/src/org/apache/poi/hwpf/model/SavedByTable.java create mode 100644 src/scratchpad/testcases/org/apache/poi/hwpf/data/saved-by-table.doc create mode 100644 src/scratchpad/testcases/org/apache/poi/hwpf/model/TestSavedByTable.java diff --git a/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java b/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java index c525c57236..7657019e7f 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java @@ -86,6 +86,9 @@ public class HWPFDocument extends POIDocument /** Hold list tables */ protected ListTables _lt; + /** Holds the save history for this document. */ + protected SavedByTable _sbt; + protected HWPFDocument() { @@ -212,6 +215,13 @@ public class HWPFDocument extends POIDocument _lt = new ListTables(_tableStream, _fib.getFcPlcfLst(), _fib.getFcPlfLfo()); } + int sbtOffset = _fib.getFcSttbSavedBy(); + int sbtLength = _fib.getLcbSttbSavedBy(); + if (sbtOffset != 0 && sbtLength != 0) + { + _sbt = new SavedByTable(_tableStream, sbtOffset, sbtLength); + } + PlexOfCps plc = new PlexOfCps(_tableStream, _fib.getFcPlcffldMom(), _fib.getLcbPlcffldMom(), 2); for (int x = 0; x < plc.length(); x++) { @@ -267,6 +277,17 @@ public class HWPFDocument extends POIDocument { return _lt; } + + /** + * Gets a reference to the saved -by table, which holds the save history for the document. + * + * @return the saved-by table. + */ + public SavedByTable getSavedByTable() + { + return _sbt; + } + /** * Writes out the word file that is represented by an instance of this class. * @@ -347,6 +368,16 @@ public class HWPFDocument extends POIDocument tableOffset = tableStream.getOffset(); } + // write out the saved-by table. + if (_sbt != null) + { + _fib.setFcSttbSavedBy(tableOffset); + _sbt.writeTo(tableStream); + _fib.setLcbSttbSavedBy(tableStream.getOffset() - tableOffset); + + tableOffset = tableStream.getOffset(); + } + // write out the FontTable. _fib.setFcSttbfffn(tableOffset); _ft.writeTo(docSys); diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/FileInformationBlock.java b/src/scratchpad/src/org/apache/poi/hwpf/model/FileInformationBlock.java index 773ff080da..16bd3a39ba 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/model/FileInformationBlock.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/FileInformationBlock.java @@ -61,6 +61,7 @@ public class FileInformationBlock extends FIBAbstractType fieldSet.add(new Integer(FIBFieldHandler.PLFLFO)); fieldSet.add(new Integer(FIBFieldHandler.PLCFFLDMOM)); fieldSet.add(new Integer(FIBFieldHandler.STTBFFFN)); + fieldSet.add(new Integer(FIBFieldHandler.STTBSAVEDBY)); fieldSet.add(new Integer(FIBFieldHandler.MODIFIED)); @@ -251,6 +252,26 @@ public class FileInformationBlock extends FIBAbstractType _fieldHandler.setFieldSize(FIBFieldHandler.STTBFFFN, lcbSttbFffn); } + public int getFcSttbSavedBy() + { + return _fieldHandler.getFieldOffset(FIBFieldHandler.STTBSAVEDBY); + } + + public int getLcbSttbSavedBy() + { + return _fieldHandler.getFieldSize(FIBFieldHandler.STTBSAVEDBY); + } + + public void setFcSttbSavedBy(int fcSttbSavedBy) + { + _fieldHandler.setFieldOffset(FIBFieldHandler.STTBSAVEDBY, fcSttbSavedBy); + } + + public void setLcbSttbSavedBy(int fcSttbSavedBy) + { + _fieldHandler.setFieldSize(FIBFieldHandler.STTBSAVEDBY, fcSttbSavedBy); + } + public int getModifiedLow() { return _fieldHandler.getFieldOffset(FIBFieldHandler.PLFLFO); diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/SavedByEntry.java b/src/scratchpad/src/org/apache/poi/hwpf/model/SavedByEntry.java new file mode 100644 index 0000000000..82fbacd6b2 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/SavedByEntry.java @@ -0,0 +1,85 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed 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; + + +/** + * A single entry in the {@link SavedByTable}. + * + * @author Daniel Noll + */ +public class SavedByEntry +{ + private String userName; + private String saveLocation; + + public SavedByEntry(String userName, String saveLocation) + { + this.userName = userName; + this.saveLocation = saveLocation; + } + + public String getUserName() + { + return userName; + } + + public String getSaveLocation() + { + return saveLocation; + } + + /** + * Compares this object with another, for equality. + * + * @param other the object to compare to this one. + * @return true iff the other object is equal to this one. + */ + public boolean equals(Object other) + { + if (other == this) return true; + if (!(other instanceof SavedByEntry)) return false; + SavedByEntry that = (SavedByEntry) other; + return that.userName.equals(userName) && + that.saveLocation.equals(saveLocation); + } + + /** + * Generates a hash code for consistency with {@link #equals(Object)}. + * + * @return the hash code. + */ + public int hashCode() + { + int hash = 29; + hash = hash * 13 + userName.hashCode(); + hash = hash * 13 + saveLocation.hashCode(); + return hash; + } + + /** + * Returns a string for display. + * + * @return the string. + */ + public String toString() + { + return "SavedByEntry[userName=" + getUserName() + + ",saveLocation=" + getSaveLocation() + "]"; + } +} diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/SavedByTable.java b/src/scratchpad/src/org/apache/poi/hwpf/model/SavedByTable.java new file mode 100644 index 0000000000..d24a8ecc83 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/SavedByTable.java @@ -0,0 +1,121 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed 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 history of the last few revisions ("saves") of the document. + * Read-only for the time being. + * + * @author Daniel Noll + */ +public class SavedByTable +{ + /** + * A value that I don't know what it does, but is maintained for accuracy. + */ + private short unknownValue = -1; + + /** + * Array of entries. + */ + private SavedByEntry[] 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 SavedByTable(byte[] tableStream, int offset, int size) + { + // Read the value that I don't know what it does. :-) + unknownValue = LittleEndian.getShort(tableStream, offset); + offset += 2; + + // The stored int is the number of strings, and there are two strings per entry. + int numEntries = LittleEndian.getInt(tableStream, offset) / 2; + offset += 4; + + entries = new SavedByEntry[numEntries]; + for (int i = 0; i < numEntries; i++) + { + int len = LittleEndian.getShort(tableStream, offset); + offset += 2; + String userName = StringUtil.getFromUnicodeLE(tableStream, offset, len); + offset += len * 2; + len = LittleEndian.getShort(tableStream, offset); + offset += 2; + String saveLocation = StringUtil.getFromUnicodeLE(tableStream, offset, len); + offset += len * 2; + + entries[i] = new SavedByEntry(userName, saveLocation); + } + } + + /** + * Gets the entries. The returned list cannot be modified. + * + * @return the list of entries. + */ + public List getEntries() + { + return Collections.unmodifiableList(Arrays.asList(entries)); + } + + /** + * 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, unknownValue); + LittleEndian.putInt(header, 2, entries.length * 2); + tableStream.write(header); + + for (int i = 0; i < entries.length; i++) + { + writeStringValue(tableStream, entries[i].getUserName()); + writeStringValue(tableStream, entries[i].getSaveLocation()); + } + } + + private void writeStringValue(HWPFOutputStream tableStream, String value) + throws IOException + { + byte[] buf = new byte[value.length() * 2 + 2]; + LittleEndian.putShort(buf, 0, (short) value.length()); + StringUtil.putUnicodeLE(value, buf, 2); + tableStream.write(buf); + } +} + diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/data/saved-by-table.doc b/src/scratchpad/testcases/org/apache/poi/hwpf/data/saved-by-table.doc new file mode 100644 index 0000000000000000000000000000000000000000..c3ea6bc8610e0e5dbb74fee1013e783dfec9907e GIT binary patch literal 65024 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 literal 0 HcmV?d00001 diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/model/TestSavedByTable.java b/src/scratchpad/testcases/org/apache/poi/hwpf/model/TestSavedByTable.java new file mode 100644 index 0000000000..bc0a6c0bee --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/model/TestSavedByTable.java @@ -0,0 +1,91 @@ + +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed 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.*; +import java.util.*; +import junit.framework.*; + +import org.apache.poi.hwpf.*; +import org.apache.poi.hwpf.model.*; +import org.apache.poi.util.*; + +/** + * Unit test for {@link SavedByTable} and {@link SavedByEntry}. + * + * @author Daniel Noll + */ +public class TestSavedByTable + extends TestCase +{ + /** Data dir */ + private File testFile = new File(new File(System.getProperty("HWPF.testdata.path")), "saved-by-table.doc"); + + /** The expected entries in the test document. */ + private List expected = Arrays.asList(new Object[] { + new SavedByEntry("cic22", "C:\\DOCUME~1\\phamill\\LOCALS~1\\Temp\\AutoRecovery save of Iraq - security.asd"), + new SavedByEntry("cic22", "C:\\DOCUME~1\\phamill\\LOCALS~1\\Temp\\AutoRecovery save of Iraq - security.asd"), + new SavedByEntry("cic22", "C:\\DOCUME~1\\phamill\\LOCALS~1\\Temp\\AutoRecovery save of Iraq - security.asd"), + new SavedByEntry("JPratt", "C:\\TEMP\\Iraq - security.doc"), + new SavedByEntry("JPratt", "A:\\Iraq - security.doc"), + new SavedByEntry("ablackshaw", "C:\\ABlackshaw\\Iraq - security.doc"), + new SavedByEntry("ablackshaw", "C:\\ABlackshaw\\A;Iraq - security.doc"), + new SavedByEntry("ablackshaw", "A:\\Iraq - security.doc"), + new SavedByEntry("MKhan", "C:\\TEMP\\Iraq - security.doc"), + new SavedByEntry("MKhan", "C:\\WINNT\\Profiles\\mkhan\\Desktop\\Iraq.doc") + }); + + /** + * Tests reading in the entries, comparing them against the expected entries. + * Then tests writing the document out and reading the entries yet again. + * + * @throws Exception if an unexpected error occurs. + */ + public void testReadWrite() + throws Exception + { + // This document is widely available on the internet as "blair.doc". + // I tried stripping the content and saving the document but my version + // of Word (from Office XP) strips this table out. + InputStream stream = new BufferedInputStream(new FileInputStream(testFile)); + HWPFDocument doc; + try + { + doc = new HWPFDocument(stream); + } + finally + { + stream.close(); + } + + // Check what we just read. + assertEquals("List of saved-by entries was not as expected", + expected, doc.getSavedByTable().getEntries()); + + // Now write the entire document out, and read it back in... + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + doc.write(byteStream); + InputStream copyStream = new ByteArrayInputStream(byteStream.toByteArray()); + HWPFDocument copy = new HWPFDocument(copyStream); + + // And check again. + assertEquals("List of saved-by entries was incorrect after writing", + expected, copy.getSavedByTable().getEntries()); + } +} -- 2.39.5