diff options
author | Nick Burch <nick@apache.org> | 2016-10-25 09:15:02 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2016-10-25 09:15:02 +0000 |
commit | b067cf15d8ba4171600f3e7023198b410d2f0712 (patch) | |
tree | bd61183bd46ea4cf2980ca5e8ea3a1e7e31cfefe /src | |
parent | 811f40b133519bfa7b37986c5e7aad2e941e3858 (diff) | |
download | poi-b067cf15d8ba4171600f3e7023198b410d2f0712.tar.gz poi-b067cf15d8ba4171600f3e7023198b410d2f0712.zip |
Work in progress - v5 pointer containers
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1766487 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r-- | src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java | 38 | ||||
-rw-r--r-- | src/scratchpad/src/org/apache/poi/hdgf/streams/PointerContainingStream.java | 23 |
2 files changed, 53 insertions, 8 deletions
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java b/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java index ddb519cef7..640396cf57 100644 --- a/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java +++ b/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java @@ -17,6 +17,7 @@ package org.apache.poi.hdgf.pointers; +import org.apache.poi.hdgf.streams.PointerContainingStream; import org.apache.poi.util.LittleEndian; /** @@ -54,4 +55,41 @@ public final class PointerFactory { throw new IllegalArgumentException("Visio files with versions below 5 are not supported, yours was " + version); } } + + /** + * In a {@link PointerContainingStream}, where would the + * number of child pointers be stored for this kind of Pointer? + */ + public int identifyNumPointersOffset(Pointer pointer, byte[] data) { + if (pointer instanceof PointerV6) { + // V6 stores it as the first value in the stream + return (int)LittleEndian.getUInt(data, 0); + } else if (pointer instanceof PointerV5) { + // V5 uses fixed offsets + switch (pointer.type) { + case 0x1d: + case 0x4e: + return 0x24-6; + case 0x1e: + return 0x3c-6; + case 0x14: + return 0x88-6; + } + return 10; + } else { + throw new IllegalArgumentException("Unsupported Pointer type " + pointer); + } + } + + public int identifyNumPointers(Pointer pointer, int offset, byte[] data) { + if (pointer instanceof PointerV6) { + // V6 stores it a 32 bit number at the offset + return (int)LittleEndian.getUInt(data, offset); + } else if (pointer instanceof PointerV5) { + // V5 stores it as a 16 bit number at the offset + return LittleEndian.getShort(data, offset); + } else { + throw new IllegalArgumentException("Unsupported Pointer type " + pointer); + } + } } diff --git a/src/scratchpad/src/org/apache/poi/hdgf/streams/PointerContainingStream.java b/src/scratchpad/src/org/apache/poi/hdgf/streams/PointerContainingStream.java index ff8da5e983..d07aa04500 100644 --- a/src/scratchpad/src/org/apache/poi/hdgf/streams/PointerContainingStream.java +++ b/src/scratchpad/src/org/apache/poi/hdgf/streams/PointerContainingStream.java @@ -20,6 +20,7 @@ package org.apache.poi.hdgf.streams; import org.apache.poi.hdgf.chunks.ChunkFactory; import org.apache.poi.hdgf.pointers.Pointer; import org.apache.poi.hdgf.pointers.PointerFactory; +import org.apache.poi.hdgf.pointers.PointerV6; import org.apache.poi.util.LittleEndian; /** @@ -40,20 +41,26 @@ public class PointerContainingStream extends Stream { // TODO - instantiable sup this.pointerFactory = pointerFactory; // Find the offset to the number of child pointers we have - // This ought to be the first thing stored in us - numPointersLocalOffset = (int)LittleEndian.getUInt( - store.getContents(), 0 + numPointersLocalOffset = pointerFactory.identifyNumPointersOffset( + pointer, store.getContents() ); // Generate the objects for the pointers we contain - int numPointers = (int)LittleEndian.getUInt( - store.getContents(), numPointersLocalOffset + int numPointers = pointerFactory.identifyNumPointers( + pointer, numPointersLocalOffset, store.getContents() ); childPointers = new Pointer[numPointers]; + + // Prepare to read the children + int pos = numPointersLocalOffset; - // After the number of pointers is another (unknown) - // 4 byte value - int pos = numPointersLocalOffset + 4 + 4; + // v5 only has another (unknown) 4 byte value + // TODO Should this logic go into PointerFactory? + if (pointer instanceof PointerV6) { + pos += 4 + 4; + } else { + pos += 2; + } // Now create the pointer objects for(int i=0; i<numPointers; i++) { |