[github-103] take latest changes

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1828142 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
PJ Fanning 2018-04-01 15:37:14 +00:00
parent 637d53cae2
commit fa0b3d59b3
2 changed files with 30 additions and 38 deletions

View File

@ -383,12 +383,7 @@ public abstract class PropertiesChunk extends Chunk {
byte[] bytes = value.getRawValue();
int length = bytes != null ? bytes.length : 0;
if (bytes != null) {
// Little endian.
byte[] reversed = new byte[bytes.length];
for (int i = 0; i < bytes.length; ++i) {
reversed[bytes.length - i - 1] = bytes[i];
}
out.write(reversed);
out.write(bytes);
}
out.write(new byte[8 - length]);
}

View File

@ -23,7 +23,6 @@ import static org.junit.Assert.assertNotNull;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Calendar;
import java.util.Map;
import java.util.TimeZone;
@ -79,19 +78,21 @@ public class TestExtractEmbeddedMSG {
public void testEmbeddedMSGProperties() throws IOException, ChunkNotFoundException {
AttachmentChunks[] attachments = pdfMsgAttachments.getAttachmentFiles();
assertEquals(2, attachments.length);
MAPIMessage attachedMsg = attachments[0].getEmbeddedMessage();
assertNotNull(attachedMsg);
// test properties of embedded message
testFixedAndVariableLengthPropertiesOfAttachedMSG(attachedMsg);
// rebuild top level message from embedded message
try (POIFSFileSystem extractedAttachedMsg = rebuildFromAttached(attachedMsg)) {
try (ByteArrayOutputStream extractedAttachedMsgOut = new ByteArrayOutputStream()) {
extractedAttachedMsg.writeFilesystem(extractedAttachedMsgOut);
byte[] extratedAttachedMsgRaw = extractedAttachedMsgOut.toByteArray();
MAPIMessage extractedMsgTopLevel = new MAPIMessage(
new ByteArrayInputStream(extratedAttachedMsgRaw));
// test properties of rebuilt embedded message
testFixedAndVariableLengthPropertiesOfAttachedMSG(extractedMsgTopLevel);
if (attachments.length == 2) {
MAPIMessage attachedMsg = attachments[0].getEmbeddedMessage();
assertNotNull(attachedMsg);
// test properties of embedded message
testFixedAndVariableLengthPropertiesOfAttachedMSG(attachedMsg);
// rebuild top level message from embedded message
try (POIFSFileSystem extractedAttachedMsg = rebuildFromAttached(attachedMsg)) {
try (ByteArrayOutputStream extractedAttachedMsgOut = new ByteArrayOutputStream()) {
extractedAttachedMsg.writeFilesystem(extractedAttachedMsgOut);
byte[] extratedAttachedMsgRaw = extractedAttachedMsgOut.toByteArray();
MAPIMessage extractedMsgTopLevel = new MAPIMessage(
new ByteArrayInputStream(extratedAttachedMsgRaw));
// test properties of rebuilt embedded message
testFixedAndVariableLengthPropertiesOfAttachedMSG(extractedMsgTopLevel);
}
}
}
}
@ -115,17 +116,17 @@ public class TestExtractEmbeddedMSG {
POIFSFileSystem newDoc = new POIFSFileSystem();
MessagePropertiesChunk topLevelChunk = new MessagePropertiesChunk(null);
// Copy attachments and recipients.
int recipientsCount = 0;
int attachmentsCount = 0;
int recipientscount = 0;
int attachmentscount = 0;
for (Entry entry : attachedMsg.getDirectory()) {
if (entry.getName().startsWith(RecipientChunks.PREFIX)) {
recipientsCount++;
recipientscount++;
DirectoryEntry newDir = newDoc.createDirectory(entry.getName());
for (Entry e : ((DirectoryEntry) entry)) {
EntryUtils.copyNodeRecursively(e, newDir);
}
} else if (entry.getName().startsWith(AttachmentChunks.PREFIX)) {
attachmentsCount++;
attachmentscount++;
DirectoryEntry newDir = newDoc.createDirectory(entry.getName());
for (Entry e : ((DirectoryEntry) entry)) {
EntryUtils.copyNodeRecursively(e, newDir);
@ -137,13 +138,6 @@ public class TestExtractEmbeddedMSG {
for (Map.Entry<MAPIProperty, PropertyValue> p : mpc.getRawProperties().entrySet()) {
PropertyValue val = p.getValue();
if (!(val instanceof ChunkBasedPropertyValue)) {
// Reverse data.
byte[] bytes = val.getRawValue();
for (int idx = 0; idx < bytes.length / 2; idx++) {
byte xchg = bytes[bytes.length - 1 - idx];
bytes[bytes.length - 1 - idx] = bytes[idx];
bytes[idx] = xchg;
}
MAPIType type = val.getActualType();
if (type != null && type != Types.UNKNOWN) {
topLevelChunk.setProperty(val);
@ -160,17 +154,20 @@ public class TestExtractEmbeddedMSG {
nameid.createDocument(PropertiesChunk.DEFAULT_NAME_PREFIX + "00040102", new ByteArrayInputStream(new byte[0]));
// Base properties.
// Attachment/Recipient counter.
topLevelChunk.setAttachmentCount(attachmentsCount);
topLevelChunk.setRecipientCount(recipientsCount);
topLevelChunk.setNextAttachmentId(attachmentsCount);
topLevelChunk.setNextRecipientId(recipientsCount);
topLevelChunk.setAttachmentCount(attachmentscount);
topLevelChunk.setRecipientCount(recipientscount);
topLevelChunk.setNextAttachmentId(attachmentscount);
topLevelChunk.setNextRecipientId(recipientscount);
// Unicode string format.
topLevelChunk.setProperty(new PropertyValue(MAPIProperty.STORE_SUPPORT_MASK,
byte[] storeSupportMaskData = new byte[4];
PropertyValue.LongPropertyValue storeSupportPropertyValue = new PropertyValue.LongPropertyValue(MAPIProperty.STORE_SUPPORT_MASK,
MessagePropertiesChunk.PROPERTIES_FLAG_READABLE | MessagePropertiesChunk.PROPERTIES_FLAG_WRITEABLE,
ByteBuffer.allocate(4).putInt(0x00040000).array()));
storeSupportMaskData);
storeSupportPropertyValue.setValue(0x00040000);
topLevelChunk.setProperty(storeSupportPropertyValue);
topLevelChunk.setProperty(new PropertyValue(MAPIProperty.HASATTACH,
MessagePropertiesChunk.PROPERTIES_FLAG_READABLE | MessagePropertiesChunk.PROPERTIES_FLAG_WRITEABLE,
attachmentsCount == 0 ? new byte[] { 0 } : new byte[] { 1 }));
attachmentscount == 0 ? new byte[] { 0 } : new byte[] { 1 }));
// Copy properties from MSG file system.
for (Chunk chunk : attachedMsg.getMainChunks().getChunks()) {
if (!(chunk instanceof MessagePropertiesChunk)) {