]> source.dussan.org Git - poi.git/commitdiff
Start on TNEF RTF attribute decompression, but not quite finished yet
authorNick Burch <nick@apache.org>
Thu, 13 Jan 2011 13:53:02 +0000 (13:53 +0000)
committerNick Burch <nick@apache.org>
Thu, 13 Jan 2011 13:53:02 +0000 (13:53 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1058555 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hmef/CompressedRTF.java
src/scratchpad/src/org/apache/poi/hmef/MAPIAttribute.java
src/scratchpad/src/org/apache/poi/hmef/MAPIRtfAttribute.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hmef/MAPIStringAttribute.java

index c2bb38eefdf77756d7b61375e03d027daea92e95..aa3b41c6502860b023758bd7c5c8961e3bb1cec2 100644 (file)
@@ -31,10 +31,13 @@ import org.apache.poi.util.LittleEndian;
  * Within a {@link HMEFMessage}, the content is often
  *  stored in as RTF, but LZW compressed. This class
  *  handles decompressing it for you.
+ *  
+ * Note - this doesn't quite decompress the data correctly,
+ *  more work and unit testing is required...
  */
 public final class CompressedRTF extends LZWDecompresser {
    public static final byte[] COMPRESSED_SIGNATURE =
-      new byte[] { (byte)'L', (byte)'Z', (byte)'F', (byte)'U' };
+      new byte[] { (byte)'L', (byte)'Z', (byte)'F', (byte)'u' };
    public static final byte[] UNCOMPRESSED_SIGNATURE =
       new byte[] { (byte)'M', (byte)'E', (byte)'L', (byte)'A' };
    public static final int COMPRESSED_SIGNATURE_INT =
index 3014f48d2d0a2a0b10016d8c19ca2bace8dcb429..d8922213b13c2cf5c387e1f3006e2b0fb4234f0a 100644 (file)
@@ -62,7 +62,17 @@ public class MAPIAttribute {
    }
    
    public String toString() {
-      return property.toString() + " " + HexDump.toHex(data);
+      String hex;
+      if(data.length <= 16) {
+         hex = HexDump.toHex(data);
+      } else {
+         byte[] d = new byte[16];
+         System.arraycopy(data, 0, d, 0, 16);
+         hex = HexDump.toHex(d);
+         hex = hex.substring(0, hex.length()-1) + ", ....]";
+      }
+      
+      return property.toString() + " " + hex;
    }
    
    /**
@@ -146,6 +156,8 @@ public class MAPIAttribute {
             MAPIAttribute attr;
             if(type == Types.UNICODE_STRING || type == Types.ASCII_STRING) {
                attr = new MAPIStringAttribute(prop, type, data);
+            } else if(id == MAPIProperty.RTF_COMPRESSED.id) {
+               attr = new MAPIRtfAttribute(prop, type, data);
             } else {
                attr = new MAPIAttribute(prop, type, data);
             }
diff --git a/src/scratchpad/src/org/apache/poi/hmef/MAPIRtfAttribute.java b/src/scratchpad/src/org/apache/poi/hmef/MAPIRtfAttribute.java
new file mode 100644 (file)
index 0000000..567c2b6
--- /dev/null
@@ -0,0 +1,49 @@
+/* ====================================================================
+   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.hmef;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+import org.apache.poi.hsmf.datatypes.MAPIProperty;
+import org.apache.poi.util.StringUtil;
+
+/**
+ * A pure-MAPI attribute holding RTF (compressed or not), which applies 
+ *  to a {@link HMEFMessage} or one of its {@link Attachment}s.
+ */
+public final class MAPIRtfAttribute extends MAPIAttribute {
+   private final String data;
+   
+   public MAPIRtfAttribute(MAPIProperty property, int type, byte[] data) throws IOException {
+      super(property, type, data);
+      
+      CompressedRTF rtf = new CompressedRTF();
+      byte[] decomp = rtf.decompress(new ByteArrayInputStream(data));
+      
+      this.data = StringUtil.getFromCompressedUnicode(decomp, 0, decomp.length);
+   }
+   
+   public String getDataString() {
+      return data;
+   }
+   
+   public String toString() {
+      return getProperty().toString() + " " + data;
+   }
+}
index 570923641e876784c95e0b603aa9bf434ffb85d0..6597cb95eea99c4120739a609305fcdd6b2104a7 100644 (file)
@@ -65,6 +65,10 @@ public final class MAPIStringAttribute extends MAPIAttribute {
       this.data = tmpData;
    }
    
+   public String getDataString() {
+      return data;
+   }
+   
    public String toString() {
       return getProperty().toString() + " " + data;
    }