diff --git a/src/java/org/apache/poi/ddf/EscherBSERecord.java b/src/java/org/apache/poi/ddf/EscherBSERecord.java
index 556dcdd7e2..496feb6fca 100644
--- a/src/java/org/apache/poi/ddf/EscherBSERecord.java
+++ b/src/java/org/apache/poi/ddf/EscherBSERecord.java
@@ -61,7 +61,8 @@ public final class EscherBSERecord extends EscherRecord {
int pos = offset + 8;
field_1_blipTypeWin32 = data[pos];
field_2_blipTypeMacOS = data[pos + 1];
- System.arraycopy( data, pos + 2, field_3_uid = new byte[16], 0, 16 );
+ field_3_uid = new byte[16];
+ System.arraycopy( data, pos + 2, field_3_uid, 0, 16 );
field_4_tag = LittleEndian.getShort( data, pos + 18 );
field_5_size = LittleEndian.getInt( data, pos + 20 );
field_6_ref = LittleEndian.getInt( data, pos + 24 );
@@ -90,12 +91,12 @@ public final class EscherBSERecord extends EscherRecord {
public int serialize(int offset, byte[] data, EscherSerializationListener listener) {
listener.beforeRecordSerialize( offset, getRecordId(), this );
- if (_remainingData == null)
+ if (_remainingData == null) {
_remainingData = new byte[0];
+ }
LittleEndian.putShort( data, offset, getOptions() );
LittleEndian.putShort( data, offset + 2, getRecordId() );
- if (_remainingData == null) _remainingData = new byte[0];
int blipSize = field_12_blipRecord == null ? 0 : field_12_blipRecord.getRecordSize();
int remainingBytes = _remainingData.length + 36 + blipSize;
LittleEndian.putInt( data, offset + 4, remainingBytes );
@@ -117,8 +118,6 @@ public final class EscherBSERecord extends EscherRecord {
{
bytesWritten = field_12_blipRecord.serialize( offset + 44, data, new NullEscherSerializationListener() );
}
- if (_remainingData == null)
- _remainingData = new byte[0];
System.arraycopy( _remainingData, 0, data, offset + 44 + bytesWritten, _remainingData.length );
int pos = offset + 8 + 36 + _remainingData.length + bytesWritten;
@@ -184,7 +183,9 @@ public final class EscherBSERecord extends EscherRecord {
* 16 byte MD4 checksum.
*/
public void setUid(byte[] uid) {
- field_3_uid = uid;
+ if (uid != null && uid.length == 16) {
+ System.arraycopy(uid, 0, field_3_uid, 0, field_3_uid.length);
+ };
}
/**
@@ -306,7 +307,11 @@ public final class EscherBSERecord extends EscherRecord {
* Any remaining data in this record.
*/
public void setRemainingData(byte[] remainingData) {
- _remainingData = remainingData;
+ if (remainingData == null) {
+ _remainingData = null;
+ } else {
+ _remainingData = remainingData.clone();
+ }
}
public String toString() {
diff --git a/src/java/org/apache/poi/ddf/EscherBitmapBlip.java b/src/java/org/apache/poi/ddf/EscherBitmapBlip.java
index 096e0c4a87..e6855d1987 100644
--- a/src/java/org/apache/poi/ddf/EscherBitmapBlip.java
+++ b/src/java/org/apache/poi/ddf/EscherBitmapBlip.java
@@ -74,9 +74,10 @@ public class EscherBitmapBlip extends EscherBlipRecord {
return field_1_UID;
}
- public void setUID( byte[] field_1_UID )
- {
- this.field_1_UID = field_1_UID;
+ public void setUID( byte[] field_1_UID ) {
+ if (field_1_UID != null && field_1_UID.length == 16) {
+ System.arraycopy(field_1_UID, 0, this.field_1_UID , 0, 16);
+ }
}
public byte getMarker()
diff --git a/src/java/org/apache/poi/ddf/EscherBlipRecord.java b/src/java/org/apache/poi/ddf/EscherBlipRecord.java
index b6bb8a46b0..43c0661ef6 100644
--- a/src/java/org/apache/poi/ddf/EscherBlipRecord.java
+++ b/src/java/org/apache/poi/ddf/EscherBlipRecord.java
@@ -70,7 +70,11 @@ public class EscherBlipRecord extends EscherRecord { // TODO - instantiable supe
}
public void setPictureData(byte[] pictureData) {
- field_pictureData = pictureData;
+ if (pictureData == null) {
+ field_pictureData = null;
+ } else {
+ field_pictureData = pictureData.clone();
+ }
}
public String toString() {
diff --git a/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java b/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java
index 665a091d7d..4185d63979 100644
--- a/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java
+++ b/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java
@@ -333,8 +333,11 @@ public class EscherClientAnchorRecord
/**
* Any remaining data in the record
*/
- public void setRemainingData( byte[] remainingData )
- {
- this.remainingData = remainingData;
+ public void setRemainingData( byte[] remainingData ) {
+ if (remainingData == null) {
+ this.remainingData = null;
+ } else {
+ this.remainingData = remainingData.clone();
+ }
}
}
diff --git a/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java b/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java
index 82959c7ffa..672a4aa117 100644
--- a/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java
+++ b/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java
@@ -85,14 +85,17 @@ public class DocumentInputStream extends InputStream implements LittleEndianInpu
delegate = new NDocumentInputStream(document);
}
+ @Override
public int available() {
return delegate.available();
}
+ @Override
public void close() {
delegate.close();
}
+ @Override
public void mark(int ignoredReadlimit) {
delegate.mark(ignoredReadlimit);
}
@@ -102,18 +105,22 @@ public class DocumentInputStream extends InputStream implements LittleEndianInpu
*
* @return true always
*/
+ @Override
public boolean markSupported() {
return true;
}
+ @Override
public int read() throws IOException {
return delegate.read();
}
+ @Override
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
return delegate.read(b, off, len);
}
@@ -123,46 +130,57 @@ public class DocumentInputStream extends InputStream implements LittleEndianInpu
* last called on this input stream. If mark() has not been called this
* method repositions the stream to its beginning.
*/
+ @Override
public void reset() {
delegate.reset();
}
+ @Override
public long skip(long n) throws IOException {
return delegate.skip(n);
}
+ @Override
public byte readByte() {
return delegate.readByte();
}
+ @Override
public double readDouble() {
return delegate.readDouble();
}
+ @Override
public short readShort() {
return (short) readUShort();
}
- public void readFully(byte[] buf) {
- readFully(buf, 0, buf.length);
- }
+ @Override
+ public void readFully(byte[] buf) {
+ readFully(buf, 0, buf.length);
+ }
+ @Override
public void readFully(byte[] buf, int off, int len) {
delegate.readFully(buf, off, len);
}
+ @Override
public long readLong() {
return delegate.readLong();
}
+ @Override
public int readInt() {
return delegate.readInt();
}
+ @Override
public int readUShort() {
return delegate.readUShort();
}
+ @Override
public int readUByte() {
return delegate.readUByte();
}
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java
index 1b9e7fe2ca..1e00d93081 100644
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java
+++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java
@@ -54,7 +54,8 @@ public class ZipContentTypeManager extends ContentTypeManager {
super(in, pkg);
}
- @Override
+ @SuppressWarnings("resource")
+ @Override
public boolean saveImpl(Document content, OutputStream out) {
ZipOutputStream zos = null;
if (out instanceof ZipOutputStream)
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalCertificatePart.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalCertificatePart.java
deleted file mode 100644
index fffa768fb6..0000000000
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalCertificatePart.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/* ====================================================================
- 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.openxml4j.opc.internal.signature;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
-import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.internal.ContentType;
-
-/**
- * Digital certificate part.
- *
- * @author Julien Chable
- * @version 0.1
- */
-public final class DigitalCertificatePart extends PackagePart {
-
- public DigitalCertificatePart() throws InvalidFormatException{
- super(null, null, new ContentType(""));
- // TODO: Review constructor
- }
-
- @Override
- public void close() {
- }
-
- @Override
- public void flush() {
- }
-
- @Override
- protected InputStream getInputStreamImpl() throws IOException {
- return null;
- }
-
- @Override
- protected OutputStream getOutputStreamImpl() {
- return null;
- }
-
- @Override
- public boolean load(InputStream ios) throws InvalidFormatException {
- return false;
- }
-
- @Override
- public boolean save(OutputStream zos) throws OpenXML4JException {
- return false;
- }
-}
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalSignatureOriginPart.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalSignatureOriginPart.java
deleted file mode 100644
index b6c1a8ac87..0000000000
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalSignatureOriginPart.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* ====================================================================
- 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.openxml4j.opc.internal.signature;
-
-/**
- * Represents a digital signature origin part.
- *
- * @author Julien Chable
- * @version 0.1
- */
-public final class DigitalSignatureOriginPart {
-
-}
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignature.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignature.java
deleted file mode 100644
index ee9bb64757..0000000000
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignature.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* ====================================================================
- 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.openxml4j.opc.signature;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
-import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.internal.ContentType;
-
-public final class PackageDigitalSignature extends PackagePart {
-
- public PackageDigitalSignature() throws InvalidFormatException {
- super(null, null, new ContentType(""));
- // TODO: Review constructor
- }
-
- @Override
- public void close() {
- }
-
- @Override
- public void flush() {
- }
-
- @Override
- protected InputStream getInputStreamImpl() throws IOException {
- return null;
- }
-
- @Override
- protected OutputStream getOutputStreamImpl() {
- return null;
- }
-
- @Override
- public boolean load(InputStream ios) throws InvalidFormatException {
- return false;
- }
-
- @Override
- public boolean save(OutputStream zos) throws OpenXML4JException {
- return false;
- }
-}
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignatureManager.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignatureManager.java
deleted file mode 100644
index 64007f6f00..0000000000
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignatureManager.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/* ====================================================================
- 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.openxml4j.opc.signature;
-
-public final class PackageDigitalSignatureManager {
-
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/Comment2000.java b/src/scratchpad/src/org/apache/poi/hslf/record/Comment2000.java
index 2714bad290..b64134b0d4 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/Comment2000.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/Comment2000.java
@@ -124,6 +124,7 @@ public final class Comment2000 extends RecordContainer {
case 0: authorRecord = cs; break;
case 1: commentRecord = cs; break;
case 2: authorInitialsRecord = cs; break;
+ default: break;
}
} else if (r instanceof Comment2000Atom){
commentAtom = (Comment2000Atom)r;
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/CurrentUserAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/CurrentUserAtom.java
index e34103a8ce..71820076ed 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/CurrentUserAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/CurrentUserAtom.java
@@ -133,10 +133,17 @@ public class CurrentUserAtom
}
// Grab the contents
- _contents = new byte[docProps.getSize()];
+ int len = docProps.getSize();
+ _contents = new byte[len];
InputStream in = dir.createDocumentInputStream("Current User");
- in.read(_contents);
+ int readLen = in.read(_contents);
+ in.close();
+ if (len != readLen) {
+ throw new IOException("Current User input stream ended prematurely - expected "+len+" bytes - received "+readLen+" bytes");
+ }
+
+
// See how long it is. If it's under 28 bytes long, we can't
// read it
if(_contents.length < 28) {
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/ExEmbed.java b/src/scratchpad/src/org/apache/poi/hslf/record/ExEmbed.java
index 09e95abe4c..7580450cd8 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/ExEmbed.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/ExEmbed.java
@@ -113,6 +113,7 @@ public class ExEmbed extends RecordContainer {
case 0x1: menuName = cs; break;
case 0x2: progId = cs; break;
case 0x3: clipboardName = cs; break;
+ default: break;
}
}
}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java
index 91a590afe8..a25ca605c2 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java
@@ -36,7 +36,6 @@ import java.util.ArrayList;
public abstract class RecordContainer extends Record
{
protected Record[] _children;
- private Boolean changingChildRecordsLock = Boolean.TRUE;
/**
* Return any children
@@ -58,14 +57,12 @@ public abstract class RecordContainer extends Record
* Finds the location of the given child record
*/
private int findChildLocation(Record child) {
- // Synchronized as we don't want things changing
- // as we're doing our search
- synchronized(changingChildRecordsLock) {
- for(int i=0; i<_children.length; i++) {
- if(_children[i].equals(child)) {
- return i;
- }
+ int i=0;
+ for(Record r : _children) {
+ if (r.equals(child)) {
+ return i;
}
+ i++;
}
return -1;
}
@@ -75,14 +72,12 @@ public abstract class RecordContainer extends Record
* @param newChild The child record to add
*/
private void appendChild(Record newChild) {
- synchronized(changingChildRecordsLock) {
- // Copy over, and pop the child in at the end
- Record[] nc = new Record[(_children.length + 1)];
- System.arraycopy(_children, 0, nc, 0, _children.length);
- // Switch the arrays
- nc[_children.length] = newChild;
- _children = nc;
- }
+ // Copy over, and pop the child in at the end
+ Record[] nc = new Record[(_children.length + 1)];
+ System.arraycopy(_children, 0, nc, 0, _children.length);
+ // Switch the arrays
+ nc[_children.length] = newChild;
+ _children = nc;
}
/**
@@ -92,18 +87,15 @@ public abstract class RecordContainer extends Record
* @param position
*/
private void addChildAt(Record newChild, int position) {
- synchronized(changingChildRecordsLock) {
- // Firstly, have the child added in at the end
- appendChild(newChild);
+ // Firstly, have the child added in at the end
+ appendChild(newChild);
- // Now, have them moved to the right place
- moveChildRecords( (_children.length-1), position, 1 );
- }
+ // Now, have them moved to the right place
+ moveChildRecords( (_children.length-1), position, 1 );
}
/**
- * Moves number child records from oldLoc
- * to newLoc. Caller must have the changingChildRecordsLock
+ * Moves {@code number} child records from {@code oldLoc} to {@code newLoc}.
* @param oldLoc the current location of the records to move
* @param newLoc the new location for the records
* @param number the number of records to move
@@ -162,9 +154,7 @@ public abstract class RecordContainer extends Record
* Add a new child record onto a record's list of children.
*/
public void appendChildRecord(Record newChild) {
- synchronized(changingChildRecordsLock) {
- appendChild(newChild);
- }
+ appendChild(newChild);
}
/**
@@ -173,16 +163,14 @@ public abstract class RecordContainer extends Record
* @param after
*/
public void addChildAfter(Record newChild, Record after) {
- synchronized(changingChildRecordsLock) {
- // Decide where we're going to put it
- int loc = findChildLocation(after);
- if(loc == -1) {
- throw new IllegalArgumentException("Asked to add a new child after another record, but that record wasn't one of our children!");
- }
-
- // Add one place after the supplied record
- addChildAt(newChild, loc+1);
+ // Decide where we're going to put it
+ int loc = findChildLocation(after);
+ if(loc == -1) {
+ throw new IllegalArgumentException("Asked to add a new child after another record, but that record wasn't one of our children!");
}
+
+ // Add one place after the supplied record
+ addChildAt(newChild, loc+1);
}
/**
@@ -191,16 +179,14 @@ public abstract class RecordContainer extends Record
* @param before
*/
public void addChildBefore(Record newChild, Record before) {
- synchronized(changingChildRecordsLock) {
- // Decide where we're going to put it
- int loc = findChildLocation(before);
- if(loc == -1) {
- throw new IllegalArgumentException("Asked to add a new child before another record, but that record wasn't one of our children!");
- }
-
- // Add at the place of the supplied record
- addChildAt(newChild, loc);
+ // Decide where we're going to put it
+ int loc = findChildLocation(before);
+ if(loc == -1) {
+ throw new IllegalArgumentException("Asked to add a new child before another record, but that record wasn't one of our children!");
}
+
+ // Add at the place of the supplied record
+ addChildAt(newChild, loc);
}
/**
@@ -216,22 +202,20 @@ public abstract class RecordContainer extends Record
public void moveChildrenBefore(Record firstChild, int number, Record before) {
if(number < 1) { return; }
- synchronized(changingChildRecordsLock) {
- // Decide where we're going to put them
- int newLoc = findChildLocation(before);
- if(newLoc == -1) {
- throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
- }
-
- // Figure out where they are now
- int oldLoc = findChildLocation(firstChild);
- if(oldLoc == -1) {
- throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
- }
-
- // Actually move
- moveChildRecords(oldLoc, newLoc, number);
+ // Decide where we're going to put them
+ int newLoc = findChildLocation(before);
+ if(newLoc == -1) {
+ throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
}
+
+ // Figure out where they are now
+ int oldLoc = findChildLocation(firstChild);
+ if(oldLoc == -1) {
+ throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
+ }
+
+ // Actually move
+ moveChildRecords(oldLoc, newLoc, number);
}
/**
@@ -239,25 +223,22 @@ public abstract class RecordContainer extends Record
*/
public void moveChildrenAfter(Record firstChild, int number, Record after) {
if(number < 1) { return; }
-
- synchronized(changingChildRecordsLock) {
- // Decide where we're going to put them
- int newLoc = findChildLocation(after);
- if(newLoc == -1) {
- throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
- }
- // We actually want after this though
- newLoc++;
-
- // Figure out where they are now
- int oldLoc = findChildLocation(firstChild);
- if(oldLoc == -1) {
- throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
- }
-
- // Actually move
- moveChildRecords(oldLoc, newLoc, number);
+ // Decide where we're going to put them
+ int newLoc = findChildLocation(after);
+ if(newLoc == -1) {
+ throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
}
+ // We actually want after this though
+ newLoc++;
+
+ // Figure out where they are now
+ int oldLoc = findChildLocation(firstChild);
+ if(oldLoc == -1) {
+ throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
+ }
+
+ // Actually move
+ moveChildRecords(oldLoc, newLoc, number);
}
/**
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextRulerAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextRulerAtom.java
index 84f03b4724..f81061dc0a 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/TextRulerAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextRulerAtom.java
@@ -149,6 +149,8 @@ public final class TextRulerAtom extends RecordAtom {
val = LittleEndian.getShort(_data, pos); pos += 2;
textOffsets[bits[i]-8] = val;
break;
+ default:
+ break;
}
}
}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java
index dbfc6ec1fc..0c21c7e8b8 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java
@@ -133,6 +133,9 @@ public final class HSLFFreeformShape extends HSLFAutoShape implements FreeformSh
isClosed = true;
numPoints++;
break;
+ default:
+ logger.log(POILogger.WARN, "Ignoring invalid segment type "+type);
+ break;
}
it.next();
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java
index 419ded3a15..139840c548 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java
@@ -319,7 +319,7 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet();
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java
index 99aa8c645f..6f0e9e4c49 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java
@@ -38,7 +38,6 @@ import org.apache.poi.hslf.record.UserEditAtom;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.poifs.crypt.Decryptor;
import org.apache.poi.poifs.crypt.EncryptionInfo;
-import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.crypt.cryptoapi.CryptoAPIDecryptor;
import org.apache.poi.poifs.crypt.cryptoapi.CryptoAPIEncryptor;
import org.apache.poi.util.BitField;
@@ -95,8 +94,8 @@ public class HSLFSlideShowEncrypted {
}
assert(r instanceof DocumentEncryptionAtom);
this.dea = (DocumentEncryptionAtom)r;
+ decryptInit();
- CryptoAPIDecryptor dec = (CryptoAPIDecryptor)dea.getEncryptionInfo().getDecryptor();
String pass = Biff8EncryptionKey.getCurrentUserPassword();
if(!dec.verifyPassword(pass != null ? pass : Decryptor.DEFAULT_PASSWORD)) {
throw new EncryptedPowerPointFileException("PowerPoint file is encrypted. The correct password needs to be set via Biff8EncryptionKey.setCurrentUserPassword()");
@@ -342,10 +341,11 @@ public class HSLFSlideShowEncrypted {
// create password record
if (dea == null) {
dea = new DocumentEncryptionAtom();
+ enc = null;
}
+ encryptInit();
EncryptionInfo ei = dea.getEncryptionInfo();
byte salt[] = ei.getVerifier().getSalt();
- Encryptor enc = ei.getEncryptor();
if (salt == null) {
enc.confirmPassword(password);
} else {
@@ -396,11 +396,12 @@ public class HSLFSlideShowEncrypted {
recordMap.put(pdr.getLastOnDiskOffset(), r);
}
+
+ assert(uea != null && pph != null && uea.getPersistPointersOffset() == pph.getLastOnDiskOffset());
+
recordMap.put(pph.getLastOnDiskOffset(), pph);
recordMap.put(uea.getLastOnDiskOffset(), uea);
- assert(uea != null && pph != null && uea.getPersistPointersOffset() == pph.getLastOnDiskOffset());
-
if (duplicatedCount == 0 && obsoleteOffsets.isEmpty()) {
return records;
}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
index 80781ee14e..d45b7cb996 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
@@ -221,8 +221,15 @@ public final class HSLFSlideShowImpl extends POIDocument {
(DocumentEntry)directory.getEntry("PowerPoint Document");
// Grab the document stream
- _docstream = new byte[docProps.getSize()];
- directory.createDocumentInputStream("PowerPoint Document").read(_docstream);
+ int len = docProps.getSize();
+ _docstream = new byte[len];
+ InputStream is = directory.createDocumentInputStream("PowerPoint Document");
+ int readLen = is.read(_docstream);
+ is.close();
+
+ if (len != readLen) {
+ throw new IOException("Document input stream ended prematurely - expected "+len+" bytes - received "+readLen+" bytes");
+ }
}
/**
@@ -374,11 +381,16 @@ public final class HSLFSlideShowImpl extends POIDocument {
HSLFSlideShowEncrypted decryptData = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom());
DocumentEntry entry = (DocumentEntry)directory.getEntry("Pictures");
- byte[] pictstream = new byte[entry.getSize()];
+ int len = entry.getSize();
+ byte[] pictstream = new byte[len];
DocumentInputStream is = directory.createDocumentInputStream(entry);
- is.read(pictstream);
+ int readLen = is.read(pictstream);
is.close();
+ if (len != readLen) {
+ throw new IOException("Picture stream ended prematurely - expected "+len+" bytes - received "+readLen+" bytes");
+ }
+
int pos = 0;
// An empty picture record (length 0) will take up 8 bytes
@@ -507,7 +519,9 @@ public final class HSLFSlideShowImpl extends POIDocument {
}
cos.close();
- assert(usr != null && ptr != null);
+ if (usr == null || ptr == null) {
+ throw new HSLFException("UserEditAtom or PersistPtr can't be determined.");
+ }
Map persistIds = new HashMap();
for (Map.Entry entry : ptr.getSlideLocationsLookup().entrySet()) {
@@ -540,7 +554,7 @@ public final class HSLFSlideShowImpl extends POIDocument {
// Update and write out the Current User atom
int oldLastUserEditAtomPos = (int)currentUser.getCurrentEditOffset();
Integer newLastUserEditAtomPos = oldToNewPositions.get(oldLastUserEditAtomPos);
- if(usr == null || newLastUserEditAtomPos == null || usr.getLastOnDiskOffset() != newLastUserEditAtomPos) {
+ if(newLastUserEditAtomPos == null || usr.getLastOnDiskOffset() != newLastUserEditAtomPos) {
throw new HSLFException("Couldn't find the new location of the last UserEditAtom that used to be at " + oldLastUserEditAtomPos);
}
currentUser.setCurrentEditOffset(usr.getLastOnDiskOffset());
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java
index 64308e8086..39fe74c2a9 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java
@@ -21,18 +21,49 @@ import static org.apache.poi.hslf.record.RecordTypes.OutlineTextRefAtom;
import java.awt.Color;
import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
import org.apache.poi.hslf.model.PPFont;
-import org.apache.poi.hslf.model.textproperties.*;
+import org.apache.poi.hslf.model.textproperties.BitMaskTextProp;
+import org.apache.poi.hslf.model.textproperties.FontAlignmentProp;
+import org.apache.poi.hslf.model.textproperties.IndentProp;
+import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp;
+import org.apache.poi.hslf.model.textproperties.TextAlignmentProp;
+import org.apache.poi.hslf.model.textproperties.TextPFException9;
+import org.apache.poi.hslf.model.textproperties.TextProp;
+import org.apache.poi.hslf.model.textproperties.TextPropCollection;
import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType;
-import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.record.ColorSchemeAtom;
+import org.apache.poi.hslf.record.EscherTextboxWrapper;
+import org.apache.poi.hslf.record.FontCollection;
+import org.apache.poi.hslf.record.MasterTextPropAtom;
+import org.apache.poi.hslf.record.OutlineTextRefAtom;
+import org.apache.poi.hslf.record.PPDrawing;
+import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.record.RecordContainer;
+import org.apache.poi.hslf.record.RecordTypes;
+import org.apache.poi.hslf.record.SlideListWithText;
+import org.apache.poi.hslf.record.SlidePersistAtom;
+import org.apache.poi.hslf.record.StyleTextProp9Atom;
+import org.apache.poi.hslf.record.StyleTextPropAtom;
+import org.apache.poi.hslf.record.TextBytesAtom;
+import org.apache.poi.hslf.record.TextCharsAtom;
+import org.apache.poi.hslf.record.TextHeaderAtom;
+import org.apache.poi.hslf.record.TextRulerAtom;
+import org.apache.poi.hslf.record.TextSpecInfoAtom;
import org.apache.poi.sl.draw.DrawPaint;
import org.apache.poi.sl.usermodel.AutoNumberingScheme;
import org.apache.poi.sl.usermodel.PaintStyle;
import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
import org.apache.poi.sl.usermodel.TextParagraph;
-import org.apache.poi.util.*;
+import org.apache.poi.util.LocaleUtil;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+import org.apache.poi.util.StringUtil;
+import org.apache.poi.util.Units;
/**
* This class represents a run of text in a powerpoint document. That
@@ -906,12 +937,16 @@ public final class HSLFTextParagraph implements TextParagraph runIter = htp.getTextRuns().iterator();
- HSLFTextRun htr = runIter.next();
- htr.setText("");
- assert (htr != null);
- while (runIter.hasNext()) {
- runIter.next();
- runIter.remove();
+ if (runIter.hasNext()) {
+ HSLFTextRun htr = runIter.next();
+ htr.setText("");
+ while (runIter.hasNext()) {
+ runIter.next();
+ runIter.remove();
+ }
+ } else {
+ HSLFTextRun trun = new HSLFTextRun(htp);
+ htp.addTextRun(trun);
}
return appendText(paragraphs, text, false);