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:
Nick Burch 2013-06-26 15:23:29 +00:00
parent 2a1726144d
commit 141bd7f85f
7 changed files with 161 additions and 164 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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