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 4c4d512d4a
commit 73aa6c507e
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 * Create a String Chunk, with the specified
* type. * type.
*/ */
public StringChunk(int chunkId, MAPIType type) { public StringChunk(int chunkId, MAPIType type) {
super(chunkId, type); super(chunkId, type);
} }
/** /**
* Returns the Encoding that will be used to * Returns the Encoding that will be used to
* decode any "7 bit" (non unicode) data. * decode any "7 bit" (non unicode) data.
* Most files default to CP1252 * Most files default to CP1252
*/ */
public String get7BitEncoding() { public String get7BitEncoding() {
return encoding7Bit; return encoding7Bit;
} }
/** /**
* Sets the Encoding that will be used to * Sets the Encoding that will be used to
* decode any "7 bit" (non unicode) data. * decode any "7 bit" (non unicode) data.
* This doesn't appear to be stored anywhere * This doesn't appear to be stored anywhere
* specific in the file, so you may need * specific in the file, so you may need
* to guess by looking at headers etc * to guess by looking at headers etc
*/ */
public void set7BitEncoding(String encoding) { public void set7BitEncoding(String encoding) {
this.encoding7Bit = encoding; this.encoding7Bit = encoding;
// Re-read the String if we're a 7 bit one // Re-read the String if we're a 7 bit one
if(type == Types.ASCII_STRING) { if(type == Types.ASCII_STRING) {
parseString(); parseString();
} }
} }
public void readValue(InputStream value) throws IOException { public void readValue(InputStream value) throws IOException {
rawValue = IOUtils.toByteArray(value); rawValue = IOUtils.toByteArray(value);
parseString(); parseString();
} }
private void parseString() { private void parseString() {
String tmpValue; String tmpValue;
if (type == Types.ASCII_STRING) { if (type == Types.ASCII_STRING) {
tmpValue = parseAs7BitData(rawValue, encoding7Bit); tmpValue = parseAs7BitData(rawValue, encoding7Bit);
} else if (type == Types.UNICODE_STRING) { } else if (type == Types.UNICODE_STRING) {
tmpValue = StringUtil.getFromUnicodeLE(rawValue); tmpValue = StringUtil.getFromUnicodeLE(rawValue);
} else { } else {
throw new IllegalArgumentException("Invalid type " + type + " for String Chunk"); throw new IllegalArgumentException("Invalid type " + type + " for String Chunk");
} }
// Clean up // Clean up
this.value = tmpValue.replace("\0", ""); this.value = tmpValue.replace("\0", "");
} }
public void writeValue(OutputStream out) throws IOException { public void writeValue(OutputStream out) throws IOException {
out.write(rawValue); out.write(rawValue);
} }
private void storeString() { private void storeString() {
if (type == Types.ASCII_STRING) { if (type == Types.ASCII_STRING) {
try { try {
rawValue = value.getBytes(encoding7Bit); rawValue = value.getBytes(encoding7Bit);
@ -109,11 +109,11 @@ 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;
} }