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
|
||||
*/
|
||||
public MAPIMessage(InputStream in) throws IOException {
|
||||
this(new POIFSFileSystem(in));
|
||||
this(new NPOIFSFileSystem(in));
|
||||
}
|
||||
/**
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* A Chunk that holds binary data, normally
|
||||
* unparsed.
|
||||
* A Chunk that holds binary data, normally unparsed.
|
||||
* Generally as we know how to make sense of the
|
||||
* contents, we create a new Chunk class and add
|
||||
* a special case in the parser for them.
|
||||
*/
|
||||
|
||||
public class ByteChunk extends Chunk {
|
||||
private byte[] value;
|
||||
|
||||
/**
|
||||
* Creates a Byte Chunk.
|
||||
*/
|
||||
private byte[] value;
|
||||
|
||||
/**
|
||||
* Creates a Byte Chunk.
|
||||
*/
|
||||
public ByteChunk(String namePrefix, int chunkId, MAPIType type) {
|
||||
super(namePrefix, chunkId, type);
|
||||
}
|
||||
/**
|
||||
* Create a Byte Chunk, with the specified
|
||||
* type.
|
||||
*/
|
||||
public ByteChunk(int chunkId, MAPIType type) {
|
||||
super(chunkId, type);
|
||||
}
|
||||
/**
|
||||
* Create a Byte Chunk, with the specified
|
||||
* type.
|
||||
*/
|
||||
public ByteChunk(int chunkId, MAPIType type) {
|
||||
super(chunkId, type);
|
||||
}
|
||||
|
||||
public void readValue(InputStream value) throws IOException {
|
||||
this.value = IOUtils.toByteArray(value);
|
||||
|
|
|
@ -23,55 +23,55 @@ import java.io.OutputStream;
|
|||
|
||||
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_";
|
||||
|
||||
protected int chunkId;
|
||||
protected MAPIType type;
|
||||
protected String namePrefix;
|
||||
protected int chunkId;
|
||||
protected MAPIType type;
|
||||
protected String namePrefix;
|
||||
|
||||
protected Chunk(String namePrefix, int chunkId, MAPIType type) {
|
||||
this.namePrefix = namePrefix;
|
||||
this.chunkId = chunkId;
|
||||
this.type = type;
|
||||
}
|
||||
protected Chunk(int chunkId, MAPIType type) {
|
||||
this(DEFAULT_NAME_PREFIX, chunkId, type);
|
||||
}
|
||||
protected Chunk(int chunkId, MAPIType type) {
|
||||
this(DEFAULT_NAME_PREFIX, chunkId, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the id of this chunk
|
||||
*/
|
||||
public int getChunkId() {
|
||||
return this.chunkId;
|
||||
}
|
||||
/**
|
||||
* Gets the id of this chunk
|
||||
*/
|
||||
public int getChunkId() {
|
||||
return this.chunkId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the numeric type of this chunk.
|
||||
*/
|
||||
public MAPIType getType() {
|
||||
return this.type;
|
||||
}
|
||||
/**
|
||||
* Gets the numeric type of this chunk.
|
||||
*/
|
||||
public MAPIType getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a string to use to identify this chunk in the POI file system object.
|
||||
*/
|
||||
public String getEntryName() {
|
||||
String type = this.type.asFileEnding();
|
||||
/**
|
||||
* Creates a string to use to identify this chunk in the POI file system object.
|
||||
*/
|
||||
public String getEntryName() {
|
||||
String type = this.type.asFileEnding();
|
||||
|
||||
String chunkId = Integer.toHexString(this.chunkId);
|
||||
while(chunkId.length() < 4) chunkId = "0" + chunkId;
|
||||
String chunkId = Integer.toHexString(this.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.
|
||||
*/
|
||||
public abstract void writeValue(OutputStream out) throws IOException;
|
||||
/**
|
||||
* Writes the value of this chunk back out again.
|
||||
*/
|
||||
public abstract void writeValue(OutputStream out) throws IOException;
|
||||
|
||||
/**
|
||||
* Reads the value of this chunk using an InputStream
|
||||
*/
|
||||
public abstract void readValue(InputStream value) throws IOException;
|
||||
/**
|
||||
* Reads the value of this chunk using an InputStream
|
||||
*/
|
||||
public abstract void readValue(InputStream value) throws IOException;
|
||||
}
|
||||
|
|
|
@ -27,15 +27,15 @@ public interface ChunkGroup {
|
|||
* Should certainly contain all the interesting Chunks,
|
||||
* but needn't always contain all of the Chunks.
|
||||
*/
|
||||
public Chunk[] getChunks();
|
||||
|
||||
/**
|
||||
* Called by the parser whenever a chunk is found.
|
||||
*/
|
||||
public void record(Chunk chunk);
|
||||
|
||||
/**
|
||||
* Called by the parser when all chunks have been found.
|
||||
*/
|
||||
public void chunksComplete();
|
||||
public Chunk[] getChunks();
|
||||
|
||||
/**
|
||||
* Called by the parser whenever a chunk is found.
|
||||
*/
|
||||
public void record(Chunk chunk);
|
||||
|
||||
/**
|
||||
* Called by the parser when all chunks have been found.
|
||||
*/
|
||||
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
|
||||
* a message or similar
|
||||
*/
|
||||
|
||||
public class MessageSubmissionChunk extends Chunk {
|
||||
private static POILogger logger = POILogFactory.getLogger(MessageSubmissionChunk.class);
|
||||
private String rawId;
|
||||
private Calendar date;
|
||||
|
||||
private static final Pattern datePatern =
|
||||
Pattern.compile("(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)Z?");
|
||||
|
||||
/**
|
||||
* Creates a Byte Chunk.
|
||||
*/
|
||||
public MessageSubmissionChunk(String namePrefix, int chunkId, MAPIType type) {
|
||||
super(namePrefix, chunkId, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Byte Chunk, with the specified
|
||||
* type.
|
||||
*/
|
||||
public MessageSubmissionChunk(int chunkId, MAPIType type) {
|
||||
super(chunkId, type);
|
||||
}
|
||||
private static POILogger logger = POILogFactory.getLogger(MessageSubmissionChunk.class);
|
||||
private String rawId;
|
||||
private Calendar date;
|
||||
|
||||
private static final Pattern datePatern =
|
||||
Pattern.compile("(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)Z?");
|
||||
|
||||
/**
|
||||
* Creates a Byte Chunk.
|
||||
*/
|
||||
public MessageSubmissionChunk(String namePrefix, int chunkId, MAPIType type) {
|
||||
super(namePrefix, chunkId, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Byte Chunk, with the specified
|
||||
* type.
|
||||
*/
|
||||
public MessageSubmissionChunk(int chunkId, MAPIType type) {
|
||||
super(chunkId, type);
|
||||
}
|
||||
|
||||
public void readValue(InputStream value) throws IOException {
|
||||
// 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.TimePropertyValue;
|
||||
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.LittleEndian;
|
||||
import org.apache.poi.util.LittleEndian.BufferUnderrunException;
|
||||
|
@ -60,17 +59,17 @@ public abstract class PropertiesChunk extends Chunk {
|
|||
*/
|
||||
private ChunkGroup parentGroup;
|
||||
|
||||
/**
|
||||
* Creates a Properties Chunk.
|
||||
*/
|
||||
protected PropertiesChunk(ChunkGroup parentGroup) {
|
||||
super(NAME, -1, Types.UNKNOWN);
|
||||
this.parentGroup = parentGroup;
|
||||
}
|
||||
/**
|
||||
* Creates a Properties Chunk.
|
||||
*/
|
||||
protected PropertiesChunk(ChunkGroup parentGroup) {
|
||||
super(NAME, -1, Types.UNKNOWN);
|
||||
this.parentGroup = parentGroup;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Override
|
||||
public String getEntryName() {
|
||||
return NAME;
|
||||
return NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -198,9 +197,9 @@ public abstract class PropertiesChunk extends Chunk {
|
|||
going = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void writeProperties(OutputStream out) throws IOException {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
||||
protected void writeProperties(OutputStream out) throws IOException {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,68 +35,68 @@ public class StringChunk extends Chunk {
|
|||
private byte[] rawValue;
|
||||
private String value;
|
||||
|
||||
/**
|
||||
* Creates a String Chunk.
|
||||
*/
|
||||
public StringChunk(String namePrefix, int chunkId, MAPIType 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;
|
||||
}
|
||||
/**
|
||||
* Creates a String Chunk.
|
||||
*/
|
||||
public StringChunk(String namePrefix, int chunkId, MAPIType type) {
|
||||
super(namePrefix, chunkId, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the Encoding that will be used to
|
||||
* decode any "7 bit" (non unicode) data.
|
||||
* This doesn't appear to be stored anywhere
|
||||
* specific in the file, so you may need
|
||||
* to guess by looking at headers etc
|
||||
*/
|
||||
public void set7BitEncoding(String encoding) {
|
||||
this.encoding7Bit = encoding;
|
||||
/**
|
||||
* Create a String Chunk, with the specified
|
||||
* type.
|
||||
*/
|
||||
public StringChunk(int chunkId, MAPIType type) {
|
||||
super(chunkId, type);
|
||||
}
|
||||
|
||||
// Re-read the String if we're a 7 bit one
|
||||
if(type == Types.ASCII_STRING) {
|
||||
parseString();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
public void readValue(InputStream value) throws IOException {
|
||||
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");
|
||||
}
|
||||
/**
|
||||
* Sets the Encoding that will be used to
|
||||
* decode any "7 bit" (non unicode) data.
|
||||
* This doesn't appear to be stored anywhere
|
||||
* specific in the file, so you may need
|
||||
* to guess by looking at headers etc
|
||||
*/
|
||||
public void set7BitEncoding(String encoding) {
|
||||
this.encoding7Bit = encoding;
|
||||
|
||||
// Clean up
|
||||
this.value = tmpValue.replace("\0", "");
|
||||
}
|
||||
|
||||
public void writeValue(OutputStream out) throws IOException {
|
||||
out.write(rawValue);
|
||||
}
|
||||
private void storeString() {
|
||||
// Re-read the String if we're a 7 bit one
|
||||
if(type == Types.ASCII_STRING) {
|
||||
parseString();
|
||||
}
|
||||
}
|
||||
|
||||
public void readValue(InputStream value) throws IOException {
|
||||
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) {
|
||||
try {
|
||||
rawValue = value.getBytes(encoding7Bit);
|
||||
|
@ -109,15 +109,15 @@ public class StringChunk extends Chunk {
|
|||
} else {
|
||||
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() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
|
||||
public byte[] getRawValue() {
|
||||
return this.rawValue;
|
||||
}
|
||||
|
@ -126,7 +126,7 @@ public class StringChunk extends Chunk {
|
|||
this.value = str;
|
||||
storeString();
|
||||
}
|
||||
|
||||
|
||||
public String toString() {
|
||||
return this.value;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue