diff --git a/build.xml b/build.xml index 7405039592..cb5c6d6494 100644 --- a/build.xml +++ b/build.xml @@ -495,6 +495,7 @@ under the License. + @@ -526,7 +527,8 @@ under the License. - + + diff --git a/src/scratchpad/src/org/apache/poi/hdgf/streams/CompressedStreamStore.java b/src/scratchpad/src/org/apache/poi/hdgf/streams/CompressedStreamStore.java index 7edb389025..df93d9d5e5 100644 --- a/src/scratchpad/src/org/apache/poi/hdgf/streams/CompressedStreamStore.java +++ b/src/scratchpad/src/org/apache/poi/hdgf/streams/CompressedStreamStore.java @@ -1,6 +1,19 @@ -/** - * - */ +/* ==================================================================== + 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.hdgf.streams; import java.io.ByteArrayInputStream; @@ -8,6 +21,10 @@ import java.io.IOException; import org.apache.poi.hdgf.LZW4HDGF; +/** + * A StreamStore where the data on-disk is compressed, + * using the crazy Visio LZW + */ class CompressedStreamStore extends StreamStore { /** The raw, compressed contents */ private byte[] compressedContents; diff --git a/src/scratchpad/src/org/apache/poi/hdgf/streams/PointerContainingStream.java b/src/scratchpad/src/org/apache/poi/hdgf/streams/PointerContainingStream.java new file mode 100644 index 0000000000..fc1442a571 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hdgf/streams/PointerContainingStream.java @@ -0,0 +1,94 @@ +/* ==================================================================== + 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.hdgf.streams; + +import org.apache.poi.hdgf.pointers.Pointer; +import org.apache.poi.hdgf.pointers.PointerFactory; +import org.apache.poi.util.LittleEndian; + +/** + * A stream that holds pointers, possibly in addition to some + * other data too. + */ +public class PointerContainingStream extends Stream { + private Pointer[] childPointers; + private Stream[] childStreams; + + private PointerFactory pointerFactory; + private int numPointersLocalOffset; + + protected PointerContainingStream(Pointer pointer, StreamStore store, PointerFactory pointerFactory) { + super(pointer, store); + 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 + ); + + // Generate the objects for the pointers we contain + int numPointers = (int)LittleEndian.getUInt( + store.getContents(), numPointersLocalOffset + ); + childPointers = new Pointer[numPointers]; + + // After the number of pointers is another (unknown) + // 4 byte value + int pos = numPointersLocalOffset + 4 + 4; + + // Now create the pointer objects + for(int i=0; i 4 -> 5 -> 1 -> 0 == String + assertNotNull(ts.getPointedToStreams()[8]); + assertTrue(ts.getPointedToStreams()[8] instanceof PointerContainingStream); + + PointerContainingStream s8 = + (PointerContainingStream)ts.getPointedToStreams()[8]; + assertNotNull(s8.getPointedToStreams()); + + assertNotNull(s8.getPointedToStreams()[4]); + assertTrue(s8.getPointedToStreams()[4] instanceof PointerContainingStream); + + PointerContainingStream s84 = + (PointerContainingStream)s8.getPointedToStreams()[4]; + assertNotNull(s84.getPointedToStreams()); + + assertNotNull(s84.getPointedToStreams()[5]); + assertTrue(s84.getPointedToStreams()[5] instanceof PointerContainingStream); + + PointerContainingStream s845 = + (PointerContainingStream)s84.getPointedToStreams()[5]; + assertNotNull(s845.getPointedToStreams()); + + assertNotNull(s845.getPointedToStreams()[1]); + assertTrue(s845.getPointedToStreams()[1] instanceof PointerContainingStream); + + PointerContainingStream s8451 = + (PointerContainingStream)s845.getPointedToStreams()[1]; + assertNotNull(s8451.getPointedToStreams()); + + assertNotNull(s8451.getPointedToStreams()[0]); + assertTrue(s8451.getPointedToStreams()[0] instanceof StringsStream); + assertTrue(s8451.getPointedToStreams()[1] instanceof StringsStream); + } +}