mirror of https://github.com/apache/poi.git
Fix inconsistent whitespace in HSMF files
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1496962 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
2a1726144d
commit
141bd7f85f
|
@ -92,7 +92,7 @@ public class MAPIMessage extends POIDocument {
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public MAPIMessage(InputStream in) throws IOException {
|
public MAPIMessage(InputStream in) throws IOException {
|
||||||
this(new POIFSFileSystem(in));
|
this(new NPOIFSFileSystem(in));
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Constructor for reading MSG Files from a POIFS filesystem
|
* Constructor for reading MSG Files from a POIFS filesystem
|
||||||
|
|
|
@ -24,29 +24,28 @@ import org.apache.poi.hsmf.datatypes.Types.MAPIType;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Chunk that holds binary data, normally
|
* A Chunk that holds binary data, normally unparsed.
|
||||||
* unparsed.
|
|
||||||
* Generally as we know how to make sense of the
|
* Generally as we know how to make sense of the
|
||||||
* contents, we create a new Chunk class and add
|
* contents, we create a new Chunk class and add
|
||||||
* a special case in the parser for them.
|
* a special case in the parser for them.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ByteChunk extends Chunk {
|
public class ByteChunk extends Chunk {
|
||||||
private byte[] value;
|
private byte[] value;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Byte Chunk.
|
* Creates a Byte Chunk.
|
||||||
*/
|
*/
|
||||||
public ByteChunk(String namePrefix, int chunkId, MAPIType type) {
|
public ByteChunk(String namePrefix, int chunkId, MAPIType type) {
|
||||||
super(namePrefix, chunkId, type);
|
super(namePrefix, chunkId, type);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Create a Byte Chunk, with the specified
|
* Create a Byte Chunk, with the specified
|
||||||
* type.
|
* type.
|
||||||
*/
|
*/
|
||||||
public ByteChunk(int chunkId, MAPIType type) {
|
public ByteChunk(int chunkId, MAPIType type) {
|
||||||
super(chunkId, type);
|
super(chunkId, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void readValue(InputStream value) throws IOException {
|
public void readValue(InputStream value) throws IOException {
|
||||||
this.value = IOUtils.toByteArray(value);
|
this.value = IOUtils.toByteArray(value);
|
||||||
|
|
|
@ -23,55 +23,55 @@ import java.io.OutputStream;
|
||||||
|
|
||||||
import org.apache.poi.hsmf.datatypes.Types.MAPIType;
|
import org.apache.poi.hsmf.datatypes.Types.MAPIType;
|
||||||
|
|
||||||
abstract public class Chunk {
|
public abstract class Chunk {
|
||||||
public static final String DEFAULT_NAME_PREFIX = "__substg1.0_";
|
public static final String DEFAULT_NAME_PREFIX = "__substg1.0_";
|
||||||
|
|
||||||
protected int chunkId;
|
protected int chunkId;
|
||||||
protected MAPIType type;
|
protected MAPIType type;
|
||||||
protected String namePrefix;
|
protected String namePrefix;
|
||||||
|
|
||||||
protected Chunk(String namePrefix, int chunkId, MAPIType type) {
|
protected Chunk(String namePrefix, int chunkId, MAPIType type) {
|
||||||
this.namePrefix = namePrefix;
|
this.namePrefix = namePrefix;
|
||||||
this.chunkId = chunkId;
|
this.chunkId = chunkId;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
protected Chunk(int chunkId, MAPIType type) {
|
protected Chunk(int chunkId, MAPIType type) {
|
||||||
this(DEFAULT_NAME_PREFIX, chunkId, type);
|
this(DEFAULT_NAME_PREFIX, chunkId, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the id of this chunk
|
* Gets the id of this chunk
|
||||||
*/
|
*/
|
||||||
public int getChunkId() {
|
public int getChunkId() {
|
||||||
return this.chunkId;
|
return this.chunkId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the numeric type of this chunk.
|
* Gets the numeric type of this chunk.
|
||||||
*/
|
*/
|
||||||
public MAPIType getType() {
|
public MAPIType getType() {
|
||||||
return this.type;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a string to use to identify this chunk in the POI file system object.
|
* Creates a string to use to identify this chunk in the POI file system object.
|
||||||
*/
|
*/
|
||||||
public String getEntryName() {
|
public String getEntryName() {
|
||||||
String type = this.type.asFileEnding();
|
String type = this.type.asFileEnding();
|
||||||
|
|
||||||
String chunkId = Integer.toHexString(this.chunkId);
|
String chunkId = Integer.toHexString(this.chunkId);
|
||||||
while(chunkId.length() < 4) chunkId = "0" + chunkId;
|
while(chunkId.length() < 4) chunkId = "0" + chunkId;
|
||||||
|
|
||||||
return this.namePrefix + chunkId.toUpperCase() + type.toUpperCase();
|
return this.namePrefix + chunkId.toUpperCase() + type.toUpperCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes the value of this chunk back out again.
|
* Writes the value of this chunk back out again.
|
||||||
*/
|
*/
|
||||||
public abstract void writeValue(OutputStream out) throws IOException;
|
public abstract void writeValue(OutputStream out) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads the value of this chunk using an InputStream
|
* Reads the value of this chunk using an InputStream
|
||||||
*/
|
*/
|
||||||
public abstract void readValue(InputStream value) throws IOException;
|
public abstract void readValue(InputStream value) throws IOException;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,15 +27,15 @@ public interface ChunkGroup {
|
||||||
* Should certainly contain all the interesting Chunks,
|
* Should certainly contain all the interesting Chunks,
|
||||||
* but needn't always contain all of the Chunks.
|
* but needn't always contain all of the Chunks.
|
||||||
*/
|
*/
|
||||||
public Chunk[] getChunks();
|
public Chunk[] getChunks();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the parser whenever a chunk is found.
|
* Called by the parser whenever a chunk is found.
|
||||||
*/
|
*/
|
||||||
public void record(Chunk chunk);
|
public void record(Chunk chunk);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the parser when all chunks have been found.
|
* Called by the parser when all chunks have been found.
|
||||||
*/
|
*/
|
||||||
public void chunksComplete();
|
public void chunksComplete();
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,29 +36,28 @@ import org.apache.poi.util.POILogger;
|
||||||
* server, and an ID that's used if you want to cancel
|
* server, and an ID that's used if you want to cancel
|
||||||
* a message or similar
|
* a message or similar
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class MessageSubmissionChunk extends Chunk {
|
public class MessageSubmissionChunk extends Chunk {
|
||||||
private static POILogger logger = POILogFactory.getLogger(MessageSubmissionChunk.class);
|
private static POILogger logger = POILogFactory.getLogger(MessageSubmissionChunk.class);
|
||||||
private String rawId;
|
private String rawId;
|
||||||
private Calendar date;
|
private Calendar date;
|
||||||
|
|
||||||
private static final Pattern datePatern =
|
private static final Pattern datePatern =
|
||||||
Pattern.compile("(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)Z?");
|
Pattern.compile("(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)Z?");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Byte Chunk.
|
* Creates a Byte Chunk.
|
||||||
*/
|
*/
|
||||||
public MessageSubmissionChunk(String namePrefix, int chunkId, MAPIType type) {
|
public MessageSubmissionChunk(String namePrefix, int chunkId, MAPIType type) {
|
||||||
super(namePrefix, chunkId, type);
|
super(namePrefix, chunkId, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a Byte Chunk, with the specified
|
* Create a Byte Chunk, with the specified
|
||||||
* type.
|
* type.
|
||||||
*/
|
*/
|
||||||
public MessageSubmissionChunk(int chunkId, MAPIType type) {
|
public MessageSubmissionChunk(int chunkId, MAPIType type) {
|
||||||
super(chunkId, type);
|
super(chunkId, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void readValue(InputStream value) throws IOException {
|
public void readValue(InputStream value) throws IOException {
|
||||||
// Stored in the file as us-ascii
|
// Stored in the file as us-ascii
|
||||||
|
|
|
@ -28,7 +28,6 @@ import java.util.Map;
|
||||||
import org.apache.poi.hsmf.datatypes.PropertyValue.LongLongPropertyValue;
|
import org.apache.poi.hsmf.datatypes.PropertyValue.LongLongPropertyValue;
|
||||||
import org.apache.poi.hsmf.datatypes.PropertyValue.TimePropertyValue;
|
import org.apache.poi.hsmf.datatypes.PropertyValue.TimePropertyValue;
|
||||||
import org.apache.poi.hsmf.datatypes.Types.MAPIType;
|
import org.apache.poi.hsmf.datatypes.Types.MAPIType;
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.LittleEndian.BufferUnderrunException;
|
import org.apache.poi.util.LittleEndian.BufferUnderrunException;
|
||||||
|
@ -60,17 +59,17 @@ public abstract class PropertiesChunk extends Chunk {
|
||||||
*/
|
*/
|
||||||
private ChunkGroup parentGroup;
|
private ChunkGroup parentGroup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Properties Chunk.
|
* Creates a Properties Chunk.
|
||||||
*/
|
*/
|
||||||
protected PropertiesChunk(ChunkGroup parentGroup) {
|
protected PropertiesChunk(ChunkGroup parentGroup) {
|
||||||
super(NAME, -1, Types.UNKNOWN);
|
super(NAME, -1, Types.UNKNOWN);
|
||||||
this.parentGroup = parentGroup;
|
this.parentGroup = parentGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getEntryName() {
|
public String getEntryName() {
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -198,9 +197,9 @@ public abstract class PropertiesChunk extends Chunk {
|
||||||
going = false;
|
going = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void writeProperties(OutputStream out) throws IOException {
|
protected void writeProperties(OutputStream out) throws IOException {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,68 +35,68 @@ public class StringChunk extends Chunk {
|
||||||
private byte[] rawValue;
|
private byte[] rawValue;
|
||||||
private String value;
|
private String value;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a String Chunk.
|
* Creates a String Chunk.
|
||||||
*/
|
*/
|
||||||
public StringChunk(String namePrefix, int chunkId, MAPIType type) {
|
public StringChunk(String namePrefix, int chunkId, MAPIType type) {
|
||||||
super(namePrefix, chunkId, type);
|
super(namePrefix, chunkId, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a String Chunk, with the specified
|
|
||||||
* type.
|
|
||||||
*/
|
|
||||||
public StringChunk(int chunkId, MAPIType type) {
|
|
||||||
super(chunkId, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the Encoding that will be used to
|
|
||||||
* decode any "7 bit" (non unicode) data.
|
|
||||||
* Most files default to CP1252
|
|
||||||
*/
|
|
||||||
public String get7BitEncoding() {
|
|
||||||
return encoding7Bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Encoding that will be used to
|
* Create a String Chunk, with the specified
|
||||||
* decode any "7 bit" (non unicode) data.
|
* type.
|
||||||
* This doesn't appear to be stored anywhere
|
*/
|
||||||
* specific in the file, so you may need
|
public StringChunk(int chunkId, MAPIType type) {
|
||||||
* to guess by looking at headers etc
|
super(chunkId, type);
|
||||||
*/
|
}
|
||||||
public void set7BitEncoding(String encoding) {
|
|
||||||
this.encoding7Bit = encoding;
|
|
||||||
|
|
||||||
// Re-read the String if we're a 7 bit one
|
/**
|
||||||
if(type == Types.ASCII_STRING) {
|
* Returns the Encoding that will be used to
|
||||||
parseString();
|
* decode any "7 bit" (non unicode) data.
|
||||||
}
|
* Most files default to CP1252
|
||||||
}
|
*/
|
||||||
|
public String get7BitEncoding() {
|
||||||
|
return encoding7Bit;
|
||||||
|
}
|
||||||
|
|
||||||
public void readValue(InputStream value) throws IOException {
|
/**
|
||||||
rawValue = IOUtils.toByteArray(value);
|
* Sets the Encoding that will be used to
|
||||||
parseString();
|
* decode any "7 bit" (non unicode) data.
|
||||||
}
|
* This doesn't appear to be stored anywhere
|
||||||
private void parseString() {
|
* specific in the file, so you may need
|
||||||
String tmpValue;
|
* to guess by looking at headers etc
|
||||||
if (type == Types.ASCII_STRING) {
|
*/
|
||||||
tmpValue = parseAs7BitData(rawValue, encoding7Bit);
|
public void set7BitEncoding(String encoding) {
|
||||||
} else if (type == Types.UNICODE_STRING) {
|
this.encoding7Bit = encoding;
|
||||||
tmpValue = StringUtil.getFromUnicodeLE(rawValue);
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("Invalid type " + type + " for String Chunk");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean up
|
// Re-read the String if we're a 7 bit one
|
||||||
this.value = tmpValue.replace("\0", "");
|
if(type == Types.ASCII_STRING) {
|
||||||
}
|
parseString();
|
||||||
|
}
|
||||||
public void writeValue(OutputStream out) throws IOException {
|
}
|
||||||
out.write(rawValue);
|
|
||||||
}
|
public void readValue(InputStream value) throws IOException {
|
||||||
private void storeString() {
|
rawValue = IOUtils.toByteArray(value);
|
||||||
|
parseString();
|
||||||
|
}
|
||||||
|
private void parseString() {
|
||||||
|
String tmpValue;
|
||||||
|
if (type == Types.ASCII_STRING) {
|
||||||
|
tmpValue = parseAs7BitData(rawValue, encoding7Bit);
|
||||||
|
} else if (type == Types.UNICODE_STRING) {
|
||||||
|
tmpValue = StringUtil.getFromUnicodeLE(rawValue);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Invalid type " + type + " for String Chunk");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up
|
||||||
|
this.value = tmpValue.replace("\0", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeValue(OutputStream out) throws IOException {
|
||||||
|
out.write(rawValue);
|
||||||
|
}
|
||||||
|
private void storeString() {
|
||||||
if (type == Types.ASCII_STRING) {
|
if (type == Types.ASCII_STRING) {
|
||||||
try {
|
try {
|
||||||
rawValue = value.getBytes(encoding7Bit);
|
rawValue = value.getBytes(encoding7Bit);
|
||||||
|
@ -109,15 +109,15 @@ public class StringChunk extends Chunk {
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Invalid type " + type + " for String Chunk");
|
throw new IllegalArgumentException("Invalid type " + type + " for String Chunk");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Text value of the chunk
|
* Returns the Text value of the chunk
|
||||||
*/
|
*/
|
||||||
public String getValue() {
|
public String getValue() {
|
||||||
return this.value;
|
return this.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getRawValue() {
|
public byte[] getRawValue() {
|
||||||
return this.rawValue;
|
return this.rawValue;
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,7 @@ public class StringChunk extends Chunk {
|
||||||
this.value = str;
|
this.value = str;
|
||||||
storeString();
|
storeString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return this.value;
|
return this.value;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue