123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ==================================================================== */
-
- package org.apache.poi.hsmf.datatypes;
-
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import org.apache.poi.util.POILogFactory;
- import org.apache.poi.util.POILogger;
-
- /**
- * Collection of convenience chunks for standard parts of the MSG file.
- *
- * Not all of these will be present in any given file.
- *
- * A partial list is available at:
- * http://msdn.microsoft.com/en-us/library/ms526356%28v=exchg.10%29.aspx
- *
- * TODO Deprecate the public Chunks in favour of Property Lookups
- */
- public final class Chunks implements ChunkGroupWithProperties {
- private static final POILogger LOG = POILogFactory.getLogger(Chunks.class);
-
- /**
- * Holds all the chunks that were found, indexed by their MAPIProperty.
- * Normally a property will have zero chunks (fixed sized) or one chunk
- * (variable size), but in some cases (eg Unknown) you may get more.
- */
- private Map<MAPIProperty, List<Chunk>> allChunks = new HashMap<>();
-
- /** Type of message that the MSG represents (ie. IPM.Note) */
- private StringChunk messageClass;
- /** BODY Chunk, for plain/text messages */
- private StringChunk textBodyChunk;
- /** BODY Html Chunk, for html messages */
- private StringChunk htmlBodyChunkString;
- private ByteChunk htmlBodyChunkBinary;
- /** BODY Rtf Chunk, for Rtf (Rich) messages */
- private ByteChunk rtfBodyChunk;
- /** Subject link chunk, in plain/text */
- private StringChunk subjectChunk;
- /**
- * Value that is in the TO field (not actually the addresses as they are
- * stored in recip directory nodes
- */
- private StringChunk displayToChunk;
- /** Value that is in the FROM field */
- private StringChunk displayFromChunk;
- /** value that shows in the CC field */
- private StringChunk displayCCChunk;
- /** Value that shows in the BCC field */
- private StringChunk displayBCCChunk;
- /** Sort of like the subject line, but without the RE: and FWD: parts. */
- private StringChunk conversationTopic;
- /** Type of server that the message originated from (SMTP, etc). */
- private StringChunk sentByServerType;
- /** The email headers */
- private StringChunk messageHeaders;
- /** TODO */
- private MessageSubmissionChunk submissionChunk;
- /** TODO */
- private StringChunk emailFromChunk;
- /** The message ID */
- private StringChunk messageId;
- /** The message properties */
- private MessagePropertiesChunk messageProperties;
-
- @Override
- public Map<MAPIProperty, List<PropertyValue>> getProperties() {
- if (messageProperties != null) {
- return messageProperties.getProperties();
- } else {
- return Collections.emptyMap();
- }
- }
-
- public Map<MAPIProperty, PropertyValue> getRawProperties() {
- if (messageProperties != null) {
- return messageProperties.getRawProperties();
- } else {
- return Collections.emptyMap();
- }
- }
-
- public Map<MAPIProperty, List<Chunk>> getAll() {
- return allChunks;
- }
-
- @Override
- public Chunk[] getChunks() {
- ArrayList<Chunk> chunks = new ArrayList<>(allChunks.size());
- for (List<Chunk> c : allChunks.values()) {
- chunks.addAll(c);
- }
- return chunks.toArray(new Chunk[chunks.size()]);
- }
-
- public StringChunk getMessageClass() {
- return messageClass;
- }
-
- public StringChunk getTextBodyChunk() {
- return textBodyChunk;
- }
-
- public StringChunk getHtmlBodyChunkString() {
- return htmlBodyChunkString;
- }
-
- public ByteChunk getHtmlBodyChunkBinary() {
- return htmlBodyChunkBinary;
- }
-
- public ByteChunk getRtfBodyChunk() {
- return rtfBodyChunk;
- }
-
- public StringChunk getSubjectChunk() {
- return subjectChunk;
- }
-
- public StringChunk getDisplayToChunk() {
- return displayToChunk;
- }
-
- public StringChunk getDisplayFromChunk() {
- return displayFromChunk;
- }
-
- public StringChunk getDisplayCCChunk() {
- return displayCCChunk;
- }
-
- public StringChunk getDisplayBCCChunk() {
- return displayBCCChunk;
- }
-
- public StringChunk getConversationTopic() {
- return conversationTopic;
- }
-
- public StringChunk getSentByServerType() {
- return sentByServerType;
- }
-
- public StringChunk getMessageHeaders() {
- return messageHeaders;
- }
-
- public MessageSubmissionChunk getSubmissionChunk() {
- return submissionChunk;
- }
-
- public StringChunk getEmailFromChunk() {
- return emailFromChunk;
- }
-
- public StringChunk getMessageId() {
- return messageId;
- }
-
- public MessagePropertiesChunk getMessageProperties() {
- return messageProperties;
- }
-
- /**
- * Called by the parser whenever a chunk is found.
- */
- @Override
- public void record(Chunk chunk) {
- // Work out what MAPIProperty this corresponds to
- MAPIProperty prop = MAPIProperty.get(chunk.getChunkId());
-
- // Assign it for easy lookup, as best we can
- if (prop == MAPIProperty.MESSAGE_CLASS) {
- messageClass = (StringChunk) chunk;
- } else if (prop == MAPIProperty.INTERNET_MESSAGE_ID) {
- messageId = (StringChunk) chunk;
- } else if (prop == MAPIProperty.MESSAGE_SUBMISSION_ID) {
- // TODO - parse
- submissionChunk = (MessageSubmissionChunk) chunk;
- } else if (prop == MAPIProperty.RECEIVED_BY_ADDRTYPE) {
- sentByServerType = (StringChunk) chunk;
- } else if (prop == MAPIProperty.TRANSPORT_MESSAGE_HEADERS) {
- messageHeaders = (StringChunk) chunk;
- }
-
- else if (prop == MAPIProperty.CONVERSATION_TOPIC) {
- conversationTopic = (StringChunk) chunk;
- } else if (prop == MAPIProperty.SUBJECT) {
- subjectChunk = (StringChunk) chunk;
- } /*else if (prop == MAPIProperty.ORIGINAL_SUBJECT) {
- // TODO
- }*/
-
- else if (prop == MAPIProperty.DISPLAY_TO) {
- displayToChunk = (StringChunk) chunk;
- } else if (prop == MAPIProperty.DISPLAY_CC) {
- displayCCChunk = (StringChunk) chunk;
- } else if (prop == MAPIProperty.DISPLAY_BCC) {
- displayBCCChunk = (StringChunk) chunk;
- }
-
- else if (prop == MAPIProperty.SENDER_EMAIL_ADDRESS) {
- emailFromChunk = (StringChunk) chunk;
- } else if (prop == MAPIProperty.SENDER_NAME) {
- displayFromChunk = (StringChunk) chunk;
- } else if (prop == MAPIProperty.BODY) {
- textBodyChunk = (StringChunk) chunk;
- } else if (prop == MAPIProperty.BODY_HTML) {
- if (chunk instanceof StringChunk) {
- htmlBodyChunkString = (StringChunk) chunk;
- }
- if (chunk instanceof ByteChunk) {
- htmlBodyChunkBinary = (ByteChunk) chunk;
- }
- } else if (prop == MAPIProperty.RTF_COMPRESSED) {
- rtfBodyChunk = (ByteChunk) chunk;
- } else if (chunk instanceof MessagePropertiesChunk) {
- messageProperties = (MessagePropertiesChunk) chunk;
- }
-
- // And add to the main list
- if (allChunks.get(prop) == null) {
- allChunks.put(prop, new ArrayList<>());
- }
- allChunks.get(prop).add(chunk);
- }
-
- @Override
- public void chunksComplete() {
- if (messageProperties != null) {
- messageProperties.matchVariableSizedPropertiesToChunks();
- } else {
- LOG.log(POILogger.WARN,
- "Message didn't contain a root list of properties!");
- }
- }
- }
|