]> err.no Git - scalable-opengroupware.org/commitdiff
show text parts
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Mon, 4 Oct 2004 02:35:16 +0000 (02:35 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Mon, 4 Oct 2004 02:35:16 +0000 (02:35 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@354 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/UI/Mailer/ChangeLog
SOGo/UI/Mailer/UIxMailPartTextViewer.m
SOGo/UI/Mailer/UIxMailPartTextViewer.wox
SOGo/UI/Mailer/UIxMailPartViewer.h
SOGo/UI/Mailer/UIxMailPartViewer.m
SOGo/UI/Mailer/UIxMailRenderingContext.h
SOGo/UI/Mailer/UIxMailRenderingContext.m
SOGo/UI/Mailer/UIxMailView.m
SOGo/UI/Mailer/Version

index e1f8592541437b7d391f541db8a4b10e1426ed8c..ed269b20b02f6b001088b0cc5f4b892087de5aef 100644 (file)
@@ -1,5 +1,7 @@
 2004-10-04  Helge Hess  <helge.hess@opengroupware.org>
 
+       * added flat body fetches, used in text viewer (v0.9.16)
+
        * added MIME content viewer infrastructure (v0.9.15)
 
        * UIxMailView.m: added 'currentAddress' accessors (v0.9.14)
index 43c2706bbbfdf3fe4c4423e801d00053a2e1303b..78da7133759da6f0fd4d7b3bb519647e6acca67f 100644 (file)
   [super dealloc];
 }
 
+/* accessors */
+
+- (NSString *)flatContentAsString {
+  /* Note: we even have the line count in the body-info! */
+  NSString *charset, *enc;
+  NSString *s;
+  NSData   *content;
+  
+  if ((content = [self flatContent]) == nil)
+    return nil;
+
+  charset =
+    [[[self bodyInfo] objectForKey:@"parameterList"] objectForKey:@"charset"];
+  enc = [[self bodyInfo] objectForKey:@"encoding"];
+
+  // TODO: properly decode charset, might need to handle encoding?
+  
+  s = [[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding];
+  return [s autorelease];
+}
+
 @end /* UIxMailPartTextViewer */
index 21be728d542da4108a56b0155b579c770c497990..4ce6474adf725518706958d90f37bc3fa0c21199 100644 (file)
@@ -7,5 +7,5 @@
   xmlns:label="OGo:label"
   class="mailer_plaincontent"
 >
-  text
+  <var:string value="flatContentAsString" />
 </pre>
index e386278a2cfbf9b8c066bc5a0a85b78a6654c2f8..9e1f6f554e7a185318192cb261a25e8109d53070 100644 (file)
   This class is the superclass for MIME content viewers.
 */
 
-@class NSArray;
+@class NSData, NSArray;
 
 @interface UIxMailPartViewer : UIxComponent
 {
   NSArray *partPath;
   id      bodyInfo;
+  NSData  *flatContent;
 }
 
 /* accessors */
@@ -46,6 +47,8 @@
 - (void)setBodyInfo:(id)_info;
 - (id)bodyInfo;
 
+- (NSData *)flatContent;
+
 @end
 
 #endif /* __Mailer_UIxMailPartViewer_H__ */
index b1b08d9288528559a44e73a23d69af95ac504cf2..a043481c8677ffe4ba3078b9378b81bb468a5e6a 100644 (file)
 */
 
 #include "UIxMailPartViewer.h"
+#include "UIxMailRenderingContext.h"
+#include "WOContext+UIxMailer.h"
 #include "common.h"
 
 @implementation UIxMailPartViewer
 
 - (void)dealloc {
+  [self->flatContent release];
   [self->bodyInfo release];
   [self->partPath release];
   [super dealloc];
   return self->bodyInfo;
 }
 
+- (NSData *)flatContent {
+  if (self->flatContent != nil)
+    return [self->flatContent isNotNull] ? self->flatContent : nil;
+  
+  self->flatContent = 
+    [[[[self context] mailRenderingContext] flatContentForPartPath:
+                                             [self partPath]] retain];
+  return self->flatContent;
+}
+
 @end /* UIxMailPartViewer */
index dab1e371a07907464c7e34433e79b53ded2d189a..4f47116167f270277951633f1eea8766a3a0f9fd 100644 (file)
   The rendering context is used to track nesting of mail part viewers.
 */
 
+@class NSData, NSArray, NSDictionary;
 @class WOContext, WOComponent;
 
 @interface UIxMailRenderingContext : NSObject
 {
-  WOComponent *viewer;  /* non-retained! */
-  WOContext   *context; /* non-retained! */
+  WOComponent  *viewer;       /* non-retained! */
+  WOContext    *context;      /* non-retained! */
+  NSDictionary *flatContents; /* IMAP4 name to NSData */
   
   WOComponent *mixedViewer;
   WOComponent *textViewer;
 
 - (void)reset;
 
+/* fetching */
+
+- (NSDictionary *)flatContents;
+- (NSData *)flatContentForPartPath:(NSArray *)_partPath;
+
 /* viewer components */
 
 - (WOComponent *)viewerForBodyInfo:(id)_info;
index 80e650a766506630528d8b64a02ac6ab94ab77a3..914dd2e31863dab1de98b87cd9112eb5edca8979 100644 (file)
 #include "UIxMailRenderingContext.h"
 #include "common.h"
 
+@interface WOComponent(Viewer)
+- (NSDictionary *)fetchFlatContents;
+@end
+
 @implementation UIxMailRenderingContext
 
 - (id)initWithViewer:(WOComponent *)_viewer context:(WOContext *)_ctx {
 /* resetting state */
 
 - (void)reset {
-  [self->mixedViewer release]; self->mixedViewer = nil;
-  [self->textViewer  release]; self->textViewer  = nil;
-  [self->imageViewer release]; self->imageViewer = nil;
+  [self->flatContents release]; self->flatContents = nil;
+  [self->mixedViewer  release]; self->mixedViewer  = nil;
+  [self->textViewer   release]; self->textViewer   = nil;
+  [self->imageViewer  release]; self->imageViewer  = nil;
+}
+
+/* fetching */
+
+- (NSDictionary *)flatContents {
+  if (self->flatContents != nil)
+    return [self->flatContents isNotNull] ? self->flatContents : nil;
+  
+  self->flatContents = [[self->viewer fetchFlatContents] retain];
+  return self->flatContents;
+}
+
+- (NSData *)flatContentForPartPath:(NSArray *)_partPath {
+  return [[self flatContents] objectForKey:
+                               [_partPath componentsJoinedByString:@"."]];
 }
 
 /* viewer components */
index 4db963f353a9181630e0e3d45643ce460a54fb55..8abb8a2689a37ce3e51fbc1b3ec8617688a7d8c0 100644 (file)
   return ma;
 }
 
+- (NSDictionary *)fetchFlatContents {
+  NSMutableDictionary *flatContents;
+  unsigned i, count;
+  NSArray  *keys;
+  id result;
+  
+  keys   = [self contentFetchKeys];
+  result = [[self clientObject] fetchParts:keys];
+  result = [result valueForKey:@"RawResponse"]; // hackish
+  result = [result objectForKey:@"fetch"]; // Note: -valueForKey: doesn't work!
+  
+  count        = [keys count];
+  flatContents = [NSMutableDictionary dictionaryWithCapacity:count];
+  for (i = 0; i < count; i++) {
+    NSString *key;
+    NSData   *data;
+    
+    key  = [keys objectAtIndex:i];
+    data = [[result objectForKey:key] objectForKey:@"data"];
+    
+    if (![data isNotNull]) continue;
+    
+    if ([key hasPrefix:@"body["]) {
+      NSRange r;
+      
+      key = [key substringFromIndex:5];
+      r   = [key rangeOfString:@"]"];
+      if (r.length > 0)
+       key = [key substringToIndex:r.location];
+    }
+    [flatContents setObject:data forKey:key];
+  }
+  return flatContents;
+}
+
 /* viewers */
 
 - (id)contentViewerComponent {
     return [NSException exceptionWithHTTPStatus:404 /* Not Found */
                        reason:@"did not find specified message!"];
   }
+#if 0
   [self logWithFormat:@"FETCH BODY PARTS: %@", [self contentFetchKeys]];
+  [self logWithFormat:@"CORE: %@", [self fetchFlatContents]];
+#endif
   return self;
 }
 
index cf9e5c1262bbe256db9dcbe38538f8ad07693b99..27f42dca521c102631a68b11d5a0fab575d2dd28 100644 (file)
@@ -1,3 +1,3 @@
 # $Id$
 
-SUBMINOR_VERSION:=15
+SUBMINOR_VERSION:=16