diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/InteractiveInfo.java b/src/scratchpad/src/org/apache/poi/hslf/record/InteractiveInfo.java new file mode 100644 index 000000000..69ea76d30 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/InteractiveInfo.java @@ -0,0 +1,97 @@ +/* +* 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.hslf.record; + +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.poi.util.LittleEndian; + +/** + * This class represents the metadata of a link in a slide/notes/etc. + * It normally just holds a InteractiveInfoAtom, with the metadata + * in it. + * @author Nick Burch + */ +public class InteractiveInfo extends RecordContainer { + private byte[] _header; + private static long _type = RecordTypes.InteractiveInfo.typeID; + + // Links to our more interesting children + private InteractiveInfoAtom infoAtom; + + /** + * Returns the InteractiveInfoAtom of this InteractiveInfo + */ + public InteractiveInfoAtom getInteractiveInfoAtom() { return infoAtom; } + + /** + * Set things up, and find our more interesting children + */ + protected InteractiveInfo(byte[] source, int start, int len) { + // Grab the header + _header = new byte[8]; + System.arraycopy(source,start,_header,0,8); + + // Find our children + _children = Record.findChildRecords(source,start+8,len-8); + findInterestingChildren(); + } + + /** + * Go through our child records, picking out the ones that are + * interesting, and saving those for use by the easy helper + * methods. + */ + private void findInterestingChildren() { + // First child should be the InteractiveInfoAtom + if(_children[0] instanceof InteractiveInfoAtom) { + infoAtom = (InteractiveInfoAtom)_children[0]; + } else { + throw new IllegalStateException("First child record wasn't a InteractiveInfoAtom, was of type " + _children[0].getRecordType()); + } + } + + /** + * Create a new InteractiveInfo, with blank fields + */ + public InteractiveInfo() { + _header = new byte[8]; + _children = new Record[1]; + + // Setup our header block + _header[0] = 0x0f; // We are a container record + LittleEndian.putShort(_header, 2, (short)_type); + + // Setup our child records + infoAtom = new InteractiveInfoAtom(); + _children[0] = infoAtom; + } + + /** + * We are of type 4802 + */ + public long getRecordType() { return _type; } + + /** + * Write the contents of the record back, so it can be written + * to disk + */ + public void writeOut(OutputStream out) throws IOException { + writeOut(_header[0],_header[1],_type,_children,out); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java index c48336370..499f7bf0d 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java @@ -120,7 +120,7 @@ public class RecordTypes { public static final Type ExQuickTimeMovieData = new Type(4075,null); public static final Type ExControl = new Type(4078,null); public static final Type SlideListWithText = new Type(4080,SlideListWithText.class); - public static final Type InteractiveInfo = new Type(4082,null); + public static final Type InteractiveInfo = new Type(4082,InteractiveInfo.class); public static final Type InteractiveInfoAtom = new Type(4083,InteractiveInfoAtom.class); public static final Type UserEditAtom = new Type(4085,UserEditAtom.class); public static final Type CurrentUserAtom = new Type(4086,null); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestInteractiveInfo.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestInteractiveInfo.java new file mode 100644 index 000000000..d3d61fbb9 --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestInteractiveInfo.java @@ -0,0 +1,87 @@ + +/* ==================================================================== + 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.hslf.record; + + +import java.io.ByteArrayOutputStream; + +import junit.framework.TestCase; + +/** + * Tests that InteractiveInfoAtom works properly. + * + * @author Nick Burch (nick at torchbox dot com) + */ +public class TestInteractiveInfo extends TestCase { + // From a real file + private byte[] data_a = new byte[] { + 0x0F, 00, 0xF2-256, 0x0F, 0x18, 00, 00, 00, + 00, 00, 0xF3-256, 0x0F, 0x10, 00, 00, 00, + 00, 00, 00, 00, 01, 00, 00, 00, + 04, 00, 00, 00, 8, 00, 00, 00 + }; + + public void testRecordType() throws Exception { + InteractiveInfo ii = new InteractiveInfo(data_a, 0, data_a.length); + assertEquals(4082, ii.getRecordType()); + } + + public void testGetChildDetails() throws Exception { + InteractiveInfo ii = new InteractiveInfo(data_a, 0, data_a.length); + InteractiveInfoAtom ia = ii.getInteractiveInfoAtom(); + + assertEquals(1, ia.getNumber()); + } + + public void testWrite() throws Exception { + InteractiveInfo ii = new InteractiveInfo(data_a, 0, data_a.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ii.writeOut(baos); + byte[] b = baos.toByteArray(); + + assertEquals(data_a.length, b.length); + for(int i=0; i