- a few findbugs/sonar fixes

- removed obsolete openxml4j signature classes

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1704964 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2015-09-23 23:22:46 +00:00
parent 11f1887784
commit 84857ab688
23 changed files with 204 additions and 304 deletions

View File

@ -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() {

View File

@ -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()

View File

@ -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() {

View File

@ -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();
}
}
}

View File

@ -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 <code>true</code> 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();
}

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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 {
}

View File

@ -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;
}
}

View File

@ -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 {
}

View File

@ -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;

View File

@ -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) {

View File

@ -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;
}
}
}

View File

@ -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 <i>number</i> child records from <i>oldLoc</i>
* to <i>newLoc</i>. 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);
}
/**

View File

@ -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;
}
}
}

View File

@ -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();

View File

@ -319,7 +319,7 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet<HSLFShape,H
for (HSLFShape shape : getShapes()) {
if(shape instanceof HSLFTextShape){
HSLFTextShape tx = (HSLFTextShape)shape;
if (tx != null && tx.getRunType() == type) {
if (tx.getRunType() == type) {
return tx;
}
}

View File

@ -129,7 +129,7 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape<H
} else {
int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
setEscherProperty(opt, EscherProperties.LINESTYLE__COLOR, rgb);
setEscherProperty(opt, EscherProperties.LINESTYLE__NOLINEDRAWDASH, color == null ? 0x180010 : 0x180018);
setEscherProperty(opt, EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x180018);
}
}
@ -332,6 +332,9 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape<H
infoAtom.setJump(InteractiveInfoAtom.JUMP_NONE);
infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_SlideNumber);
break;
default:
logger.log(POILogger.WARN, "Ignore unknown hyperlink type : "+link.getTitle());
break;
}
infoAtom.setHyperlinkID(link.getId());

View File

@ -180,6 +180,8 @@ public final class HSLFSlide extends HSLFSheet implements Slide<HSLFShape,HSLFTe
case EscherContainerRecord.SP_CONTAINER:
spr = c.getChildById(EscherSpRecord.RECORD_ID);
break;
default:
break;
}
if(spr != null) spr.setShapeId(allocateShapeId());
}

View File

@ -659,7 +659,7 @@ public final class HSLFSlideShow implements SlideShow<HSLFShape,HSLFTextParagrap
// if the removed slide had notes - remove references to them too
int notesId = (removedSlide != null) ? removedSlide.getSlideRecord().getSlideAtom().getNotesID() : 0;
int notesId = removedSlide.getSlideRecord().getSlideAtom().getNotesID();
if (notesId != 0) {
SlideListWithText nslwt = _documentRecord.getNotesSlideListWithText();
records = new ArrayList<Record>();

View File

@ -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;
}

View File

@ -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<Integer,Integer> persistIds = new HashMap<Integer,Integer>();
for (Map.Entry<Integer,Integer> 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());

View File

@ -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<HSLFShape,HSLFText
}
Iterator<HSLFTextRun> 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);