From 489112cf828c97550c0e6e0c617de8c4d3a5b735 Mon Sep 17 00:00:00 2001
From: Yegor Kozlov
Date: Sat, 19 Apr 2008 11:09:59 +0000
Subject: [PATCH] Support for getting embedded sounds from slide show
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@649796 13f79535-47bb-0310-9956-ffa450edef68
---
.../apache/poi/hslf/record/RecordTypes.java | 5 +-
.../src/org/apache/poi/hslf/record/Sound.java | 136 ++++++++++++++++++
.../poi/hslf/record/SoundCollection.java | 73 ++++++++++
.../org/apache/poi/hslf/record/SoundData.java | 103 +++++++++++++
.../apache/poi/hslf/usermodel/SlideShow.java | 8 ++
.../apache/poi/hslf/usermodel/SoundData.java | 93 ++++++++++++
.../org/apache/poi/hslf/data/ringin.wav | Bin 0 -> 10026 bytes
.../org/apache/poi/hslf/data/sound.ppt | Bin 0 -> 43520 bytes
.../org/apache/poi/hslf/record/TestSound.java | 86 +++++++++++
.../poi/hslf/usermodel/TestSoundData.java | 63 ++++++++
10 files changed, 565 insertions(+), 2 deletions(-)
create mode 100755 src/scratchpad/src/org/apache/poi/hslf/record/Sound.java
create mode 100755 src/scratchpad/src/org/apache/poi/hslf/record/SoundCollection.java
create mode 100755 src/scratchpad/src/org/apache/poi/hslf/record/SoundData.java
create mode 100755 src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java
create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/data/ringin.wav
create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/data/sound.ppt
create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/record/TestSound.java
create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSoundData.java
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 a1bc499453..45038f7a28 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java
@@ -70,9 +70,10 @@ public class RecordTypes {
public static final Type List = new Type(2000,null);
public static final Type FontCollection = new Type(2005,FontCollection.class);
public static final Type BookmarkCollection = new Type(2019,null);
+ public static final Type SoundCollection = new Type(2020,SoundCollection.class);
public static final Type SoundCollAtom = new Type(2021,null);
- public static final Type Sound = new Type(2022,null);
- public static final Type SoundData = new Type(2023,null);
+ public static final Type Sound = new Type(2022,Sound.class);
+ public static final Type SoundData = new Type(2023,SoundData.class);
public static final Type BookmarkSeedAtom = new Type(2025,null);
public static final Type ColorSchemeAtom = new Type(2032,ColorSchemeAtom.class);
public static final Type ExObjRefAtom = new Type(3009,null);
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/Sound.java b/src/scratchpad/src/org/apache/poi/hslf/record/Sound.java
new file mode 100755
index 0000000000..211a9b0ee4
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/Sound.java
@@ -0,0 +1,136 @@
+/* ====================================================================
+ 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 org.apache.poi.util.POILogger;
+
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * A container holding information about a sound. It contains:
+ *
+ *
1. CString (4026), Instance 0: Name of sound (e.g. "crash")
+ * 2. CString (4026), Instance 1: Type of sound (e.g. ".wav")
+ * 3. CString (4026), Instance 2: Reference id of sound in sound collection
+ * 4. CString (4026), Instance 3, optional: Built-in id of sound, for sounds we ship. This is the id that?s in the reg file.
+ * 5. SoundData (2023), optional
+ *
+ *
+ * @author Yegor Kozlov
+ */
+public class Sound extends RecordContainer {
+ /**
+ * Record header data.
+ */
+ private byte[] _header;
+
+ // Links to our more interesting children
+ private CString _name;
+ private CString _type;
+ private SoundData _data;
+
+
+ /**
+ * Set things up, and find our more interesting children
+ *
+ * @param source the source data as a byte array.
+ * @param start the start offset into the byte array.
+ * @param len the length of the slice in the byte array.
+ */
+ protected Sound(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();
+ }
+
+ private void findInterestingChildren() {
+ // First child should be the ExHyperlinkAtom
+ if(_children[0] instanceof CString) {
+ _name = (CString)_children[0];
+ } else {
+ logger.log(POILogger.ERROR, "First child record wasn't a CString, was of type " + _children[0].getRecordType());
+ }
+
+ // Second child should be the ExOleObjAtom
+ if (_children[1] instanceof CString) {
+ _type = (CString)_children[1];
+ } else {
+ logger.log(POILogger.ERROR, "Second child record wasn't a CString, was of type " + _children[1].getRecordType());
+ }
+
+ for (int i = 2; i < _children.length; i++) {
+ if(_children[i] instanceof SoundData){
+ _data = (SoundData)_children[i];
+ break;
+ }
+ }
+
+ }
+
+ /**
+ * Returns the type (held as a little endian in bytes 3 and 4)
+ * that this class handles.
+ *
+ * @return the record type.
+ */
+ public long getRecordType() {
+ return RecordTypes.Sound.typeID;
+ }
+
+ /**
+ * Have the contents printer out into an OutputStream, used when
+ * writing a file back out to disk.
+ *
+ * @param out the output stream.
+ * @throws java.io.IOException if there was an error writing to the stream.
+ */
+ public void writeOut(OutputStream out) throws IOException {
+ writeOut(_header[0],_header[1],getRecordType(),_children,out);
+ }
+
+ /**
+ * Name of the sound (e.g. "crash")
+ *
+ * @return name of the sound
+ */
+ public String getSoundName(){
+ return _name.getText();
+ }
+
+ /**
+ * Type of the sound (e.g. ".wav")
+ *
+ * @return type of the sound
+ */
+ public String getSoundType(){
+ return _type.getText();
+ }
+
+ /**
+ * The sound data
+ *
+ * @return the sound data.
+ */
+ public byte[] getSoundData(){
+ return _data == null ? null : _data.getData();
+ }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/SoundCollection.java b/src/scratchpad/src/org/apache/poi/hslf/record/SoundCollection.java
new file mode 100755
index 0000000000..c244859ea0
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/SoundCollection.java
@@ -0,0 +1,73 @@
+/* ====================================================================
+ 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 org.apache.poi.util.POILogger;
+
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * Is a container for all sound related atoms and containers. It contains:
+ *1. SoundCollAtom (2021)
+ *2. Sound (2022), for each sound, if any
+ *
+ * @author Yegor Kozlov
+ */
+public class SoundCollection extends RecordContainer {
+ /**
+ * Record header data.
+ */
+ private byte[] _header;
+
+ /**
+ * Set things up, and find our more interesting children
+ *
+ * @param source the source data as a byte array.
+ * @param start the start offset into the byte array.
+ * @param len the length of the slice in the byte array.
+ */
+ protected SoundCollection(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);
+ }
+
+ /**
+ * Returns the type (held as a little endian in bytes 3 and 4)
+ * that this class handles.
+ *
+ * @return the record type.
+ */
+ public long getRecordType() {
+ return RecordTypes.SoundCollection.typeID;
+ }
+
+ /**
+ * Have the contents printer out into an OutputStream, used when
+ * writing a file back out to disk.
+ *
+ * @param out the output stream.
+ * @throws java.io.IOException if there was an error writing to the stream.
+ */
+ public void writeOut(OutputStream out) throws IOException {
+ writeOut(_header[0],_header[1],getRecordType(),_children,out);
+ }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/SoundData.java b/src/scratchpad/src/org/apache/poi/hslf/record/SoundData.java
new file mode 100755
index 0000000000..42be48f2ac
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/SoundData.java
@@ -0,0 +1,103 @@
+/* ====================================================================
+ 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.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.zip.InflaterInputStream;
+
+import org.apache.poi.util.LittleEndian;
+
+/**
+ * Storage for embedded sounds.
+ *
+ * @author Yegor Kozlov
+ */
+public class SoundData extends RecordAtom {
+
+ /**
+ * Record header.
+ */
+ private byte[] _header;
+
+ /**
+ * Record data.
+ */
+ private byte[] _data;
+
+ /**
+ * Constructs a new empty sound container.
+ */
+ protected SoundData() {
+ _header = new byte[8];
+ _data = new byte[0];
+
+ LittleEndian.putShort(_header, 2, (short)getRecordType());
+ LittleEndian.putInt(_header, 4, _data.length);
+ }
+
+ /**
+ * Constructs the link related atom record from its
+ * source data.
+ *
+ * @param source the source data as a byte array.
+ * @param start the start offset into the byte array.
+ * @param len the length of the slice in the byte array.
+ */
+ protected SoundData(byte[] source, int start, int len) {
+ // Get the header.
+ _header = new byte[8];
+ System.arraycopy(source,start,_header,0,8);
+
+ // Get the record data.
+ _data = new byte[len-8];
+ System.arraycopy(source,start+8,_data,0,len-8);
+ }
+
+ /**
+ * Returns the sound data.
+ *
+ * @return the sound data
+ */
+ public byte[] getData() {
+ return _data;
+ }
+
+ /**
+ * Gets the record type.
+ *
+ * @return the record type.
+ */
+ public long getRecordType() {
+ return RecordTypes.SoundData.typeID;
+ }
+
+ /**
+ * Write the contents of the record back, so it can be written
+ * to disk.
+ *
+ * @param out the output stream to write to.
+ * @throws java.io.IOException if an error occurs.
+ */
+ public void writeOut(OutputStream out) throws IOException {
+ out.write(_header);
+ out.write(_data);
+ }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
index 418dc3d2f0..828255087b 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
@@ -494,6 +494,14 @@ public class SlideShow
public ObjectData[] getEmbeddedObjects() {
return _hslfSlideShow.getEmbeddedObjects();
}
+
+ /**
+ * Returns the data of all the embedded sounds in the SlideShow
+ */
+ public SoundData[] getSoundData() {
+ return SoundData.find(_documentRecord);
+ }
+
/**
* Return the current page size
*/
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java
new file mode 100755
index 0000000000..ad7922ef61
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java
@@ -0,0 +1,93 @@
+/* ====================================================================
+ 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.usermodel;
+
+import org.apache.poi.hslf.record.*;
+
+import java.util.ArrayList;
+
+/**
+ * A class that represents sound data embedded in a slide show.
+ *
+ * @author Yegor Kozlov
+ */
+public class SoundData {
+ /**
+ * The record that contains the object data.
+ */
+ private Sound _container;
+
+ /**
+ * Creates the object data wrapping the record that contains the sound data.
+ *
+ * @param container the record that contains the sound data.
+ */
+ public SoundData(Sound container) {
+ this._container = container;
+ }
+
+ /**
+ * Name of the sound (e.g. "crash")
+ *
+ * @return name of the sound
+ */
+ public String getSoundName(){
+ return _container.getSoundName();
+ }
+
+ /**
+ * Type of the sound (e.g. ".wav")
+ *
+ * @return type of the sound
+ */
+ public String getSoundType(){
+ return _container.getSoundType();
+ }
+
+ /**
+ * Gets an input stream which returns the binary of the sound data.
+ *
+ * @return the input stream which will contain the binary of the sound data.
+ */
+ public byte[] getData() {
+ return _container.getSoundData();
+ }
+
+ /**
+ * Find all sound records in the supplied Document records
+ *
+ * @param document the document to find in
+ * @return the array with the sound data
+ */
+ public static SoundData[] find(Document document){
+ ArrayList lst = new ArrayList();
+ Record[] ch = document.getChildRecords();
+ for (int i = 0; i < ch.length; i++) {
+ if(ch[i].getRecordType() == RecordTypes.SoundCollection.typeID){
+ RecordContainer col = (RecordContainer)ch[i];
+ Record[] sr = col.getChildRecords();
+ for (int j = 0; j < sr.length; j++) {
+ if(sr[j] instanceof Sound){
+ lst.add(new SoundData((Sound)sr[j]));
+ }
+ }
+ }
+
+ }
+ return (SoundData[])lst.toArray(new SoundData[lst.size()]);
+ }
+}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/ringin.wav b/src/scratchpad/testcases/org/apache/poi/hslf/data/ringin.wav
new file mode 100755
index 0000000000000000000000000000000000000000..f8d4292d0fb411872b8676e3ed8fd1938e03d40e
GIT binary patch
literal 10026
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
L|42+7neY4`JMe+U
literal 0
HcmV?d00001
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/sound.ppt b/src/scratchpad/testcases/org/apache/poi/hslf/data/sound.ppt
new file mode 100755
index 0000000000000000000000000000000000000000..2d1316acf38e23b0d278271084f8fb5df5e2e445
GIT binary patch
literal 43520
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