]> err.no Git - scalable-opengroupware.org/commitdiff
moved core info fetch to SoObject
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Sun, 3 Oct 2004 22:33:46 +0000 (22:33 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Sun, 3 Oct 2004 22:33:46 +0000 (22:33 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@350 d1b88da0-ebda-0310-925b-ed51d893ca5b

12 files changed:
SOGo/SoObjects/Mailer/ChangeLog
SOGo/SoObjects/Mailer/SOGoMailBodyPart.h
SOGo/SoObjects/Mailer/SOGoMailBodyPart.m
SOGo/SoObjects/Mailer/SOGoMailManager.h
SOGo/SoObjects/Mailer/SOGoMailManager.m
SOGo/SoObjects/Mailer/SOGoMailObject.h
SOGo/SoObjects/Mailer/SOGoMailObject.m
SOGo/SoObjects/Mailer/Version
SOGo/UI/Mailer/ChangeLog
SOGo/UI/Mailer/UIxMailView.m
SOGo/UI/Mailer/UIxMailView.wox
SOGo/UI/Mailer/Version

index 9be6b5f4a1cfdd66155fb9e4ab9628388648d928..07a7a049a91d361f3755a7539ca8fa8ec50c69e3 100644 (file)
@@ -1,3 +1,9 @@
+2004-10-04  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SOGoMailObject.m: added method to fetch core infos of a mail, added
+         various methods to retrieve core info data (like subject or date)
+         (v0.9.22)
+
 2004-10-03  Helge Hess  <helge.hess@opengroupware.org>
 
        * v0.9.21
index cd2eb9963bf53f0595630593e3484d094d01f201..39e130384713c241bd127557017cc7a138c814ff 100644 (file)
   commands in NGImap4.
 */
 
+@class SOGoMailObject;
+
 @interface SOGoMailBodyPart : SOGoMailBaseObject
 {
 }
 
+/* hierarchy */
+
+- (SOGoMailObject *)mailObject;
+
+/* IMAP4 */
+
+- (NSString *)bodyPartIdentifier;
+
 @end
 
 #endif /* __Mailer_SOGoMailBodyPart_H__ */
index 8a66834aacb57771669d6b3ab0593de1b0182c7b..b326af03dc3a15561118c0ed7a6c2f5a3d4c2e62 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "SOGoMailBodyPart.h"
 #include "SOGoMailObject.h"
+#include "SOGoMailManager.h"
 #include "common.h"
 
 @implementation SOGoMailBodyPart
   return [[self container] mailObject];
 }
 
+/* IMAP4 */
+
+- (NSString *)bodyPartIdentifier {
+  NSMutableString *ms;
+  id obj;
+  
+  ms = [NSMutableString stringWithCapacity:16];
+  for (obj = self; [obj isKindOfClass:[SOGoMailBodyPart class]]; 
+       obj = [obj container]) {
+    NSString *s;
+    NSRange  r;
+
+    s = [self nameInContainer];
+    r = [s rangeOfString:@"."]; /* strip extensions */
+    if (r.length > 0)
+      s = [s substringToIndex:r.location];
+    
+    if ([ms length] > 0) {
+      [ms insertString:@"." atIndex:0];
+      [ms insertString:s atIndex:0];
+    }
+    else
+      [ms appendString:s];
+  }
+  return ms;
+}
+
+- (NSURL *)imap4URL {
+  /* reuse URL of message */
+  return [[self mailObject] imap4URL];
+}
+
 /* name lookup */
 
 - (id)lookupImap4BodyPartKey:(NSString *)_key inContext:(id)_ctx {
   return [NSException exceptionWithHTTPStatus:404 /* Not Found */];
 }
 
+/* fetch */
+
+- (NSData *)fetchBLOB {
+  // HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, TEXT
+  return [[self mailManager] fetchContentOfBodyPart:[self bodyPartIdentifier]
+                            atURL:[self imap4URL]
+                            password:[self imap4Password]];
+}
+
+/* WebDAV */
+
+- (NSString *)davContentType {
+  // TODO: what about the content-type and other headers?
+  //       => we could pass them in as the extension? (eg generate 1.gif!)
+  NSString *pe;
+  
+  pe = [[self nameInContainer] pathExtension];
+  if ([pe length] == 0)
+    return @"application/octet-stream";
+  
+  /* TODO: add some map */
+  if ([pe isEqualToString:@"gif"]) return @"image/gif";
+  if ([pe isEqualToString:@"png"]) return @"image/png";
+  if ([pe isEqualToString:@"jpg"]) return @"image/jpeg";
+  if ([pe isEqualToString:@"txt"]) return @"text/plain";
+  
+  return @"application/octet-stream";
+}
+
+/* actions */
+
+- (id)GETAction:(WOContext *)_ctx {
+  WOResponse *r;
+  NSData     *data;
+  
+  [self debugWithFormat:@"should fetch body part: %@", 
+         [self bodyPartIdentifier]];
+  
+  if ((data = [self fetchBLOB]) == nil) {
+    return [NSException exceptionWithHTTPStatus:404 /* not found */
+                       reason:@"did not find body part"];
+  }
+
+  [self debugWithFormat:@"  fetched %d bytes.", [data length]];
+  
+  r = [_ctx response];
+  [r setHeader:[self davContentType] forKey:@"content-type"];
+  [r setHeader:[NSString stringWithFormat:@"%d", [data length]]
+     forKey:@"content-length"];
+  [r setContent:data];
+  return r;
+}
+
 @end /* SOGoMailBodyPart */
index d6f468fd9da9d8edc0ab8005715ae6e1dfacf759..36a4099492834bfb3948e9d14428b90b05aaba14 100644 (file)
@@ -31,7 +31,7 @@
   Coordinates access to IMAP4 mailboxes, caches folder hierarchies, etc.
 */
 
-@class NSString, NSURL, NSArray, NSMutableDictionary, NSTimer;
+@class NSString, NSData, NSURL, NSArray, NSMutableDictionary, NSTimer;
 @class NGImap4Client;
 
 @interface SOGoMailManager : NSObject
@@ -63,6 +63,9 @@
 
 - (id)fetchURL:(NSURL *)_url parts:(NSArray *)_parts password:(NSString *)_pwd;
 
+- (NSData *)fetchContentOfBodyPart:(NSString *)_partId
+  atURL:(NSURL *)_url password:(NSString *)_pwd;
+
 @end
 
 #endif /* __Mailer_SOGoMailManager_H__ */
index 1a66f0aaf3af093ff1972a6fc12ec79e071e39aa..7f46fce67fd55482bc58a5db55bdb84e9a62fc85 100644 (file)
@@ -465,6 +465,44 @@ static NSTimeInterval PoolScanInterval = 5 * 60;
   return (id)result;
 }
 
+- (NSData *)fetchContentOfBodyPart:(NSString *)_partId
+  atURL:(NSURL *)_url password:(NSString *)_pwd
+{
+  NSString *key;
+  NSArray  *parts;
+  id result, fetch, body;
+  
+  if (_partId == nil) return nil;
+  
+  key   = [@"body[" stringByAppendingString:_partId];
+  key   = [key stringByAppendingString:@"]"];
+  parts = [NSArray arrayWithObjects:&key count:1];
+  
+  /* fetch */
+  
+  result = [self fetchURL:_url parts:parts password:_pwd];
+  
+  /* process results */
+  
+  result = [result objectForKey:@"fetch"];
+  if ([result count] == 0) { /* did not find part */
+    [self logWithFormat:@"ERROR: did not find part: %@", _partId];
+    return nil;
+  }
+  
+  fetch = [result objectAtIndex:0];
+  if ((body = [fetch objectForKey:@"body"]) == nil) {
+    [self logWithFormat:@"ERROR: did not find body in response: %@", result];
+    return nil;
+  }
+  
+  if ((result = [body objectForKey:@"data"]) == nil) {
+    [self logWithFormat:@"ERROR: did not find data in body: %@", fetch];
+    return nil;
+  }
+  return result;
+}
+
 /* debugging */
 
 - (BOOL)isDebuggingEnabled {
index ae45d58fa3e2c22f8af25d0d00669490d080ba8e..09c01a7569b6c050746dab63cdf1ab7f27920245 100644 (file)
   would address the MIME part 1.2.3 of the mail 12345 in the folder INBOX.
 */
 
+@class NSString, NSArray, NSCalendarDate;
+@class NGImap4Envelope, NGImap4EnvelopeAddress;
+
 @interface SOGoMailObject : SOGoMailBaseObject
 {
+  id coreInfos;
 }
 
 /* message */
 
 - (id)fetchParts:(NSArray *)_parts; /* Note: 'parts' are fetch keys here */
 
+/* core infos */
+
+- (id)fetchCoreInfos;
+
+- (NGImap4Envelope *)envelope;
+- (NSString *)subject;
+- (NSCalendarDate *)date;
+- (NGImap4EnvelopeAddress *)fromEnvelopeAddress;
+- (NSArray *)toEnvelopeAddresses;
+- (NSArray *)ccEnvelopeAddresses;
+
 @end
 
 #endif /* __Mailer_SOGoMailObject_H__ */
index 072fdb62472bfbb7398aaf2f893fedc05a1963a9..fb29a6a9363e34a4229bedcf67e0ab022dba4bd9 100644 (file)
 #include "SOGoMailObject.h"
 #include "SOGoMailManager.h"
 #include "SOGoMailBodyPart.h"
+#include <NGImap4/NGImap4Envelope.h>
+#include <NGImap4/NGImap4EnvelopeAddress.h>
 #include "common.h"
 
 @implementation SOGoMailObject
 
+static NSArray *coreInfoKeys = nil;
+
++ (void)initialize {
+  /* Note: see SOGoMailManager.m for allowed IMAP4 keys */
+  /* Note: "BODY" actually returns the structure! */
+  coreInfoKeys = [[NSArray alloc] initWithObjects:
+                                   @"FLAGS", @"ENVELOPE", @"BODY", nil];
+}
+
+- (void)dealloc {
+  [self->coreInfos release];
+  [super dealloc];
+}
+
 /* IMAP4 */
 
 - (NSString *)relativeImap4Name {
                             password:[self imap4Password]];
 }
 
+/* core infos */
+
+- (id)fetchCoreInfos {
+  id msgs;
+  
+  if (self->coreInfos != nil)
+    return [self->coreInfos isNotNull] ? self->coreInfos : nil;
+
+  msgs = [[self clientObject] fetchParts:coreInfoKeys]; // returns dict
+  // [self logWithFormat:@"M: %@", msgs];
+  msgs = [msgs valueForKey:@"fetch"];
+  if ([msgs count] == 0)
+    return nil;
+  
+  self->coreInfos = [[msgs objectAtIndex:0] retain];
+  return self->coreInfos;
+}
+
+- (NGImap4Envelope *)envelope {
+  return [[self fetchCoreInfos] valueForKey:@"envelope"];
+}
+- (NSString *)subject {
+  return [[self envelope] subject];
+}
+- (NSCalendarDate *)date {
+  return [[self envelope] date];
+}
+- (NGImap4EnvelopeAddress *)fromEnvelopeAddress {
+  return [[self envelope] from];
+}
+- (NSArray *)toEnvelopeAddresses {
+  return [[self envelope] to];
+}
+- (NSArray *)ccEnvelopeAddresses {
+  return [[self envelope] cc];
+}
+
 /* name lookup */
 
 - (BOOL)isBodyPartKey:(NSString *)_key inContext:(id)_ctx {
index 49f242e531df55a4ec8619c8424bdc414d69e19a..78237daff645932d2dc39c82a83a2f6fffffed9c 100644 (file)
@@ -1,3 +1,3 @@
 # $Id$
 
-SUBMINOR_VERSION:=21
+SUBMINOR_VERSION:=22
index 0c54098628470b00f2fef9634ecd53ba21e5713e..01c54cd53061a47f9b365f6ab77c0f92509948ad 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-04  Helge Hess  <helge.hess@opengroupware.org>
+
+       * UIxMailView.m: use core infos stored in message SoObject for display
+         (v0.9.13)
+
 2004-10-03  Helge Hess  <helge.hess@opengroupware.org>
 
        * v0.9.12
index 49cd19be93ce59f2f7708ca74b903e721b012fe8..68e09945a6d432f7c5f80695f0fd5afc3617c995 100644 (file)
@@ -24,7 +24,6 @@
 
 @interface UIxMailView : UIxComponent
 {
-  id message;
   id currentAddress;
 }
 
@@ -40,7 +39,6 @@
 
 - (void)dealloc {
   [self->currentAddress release];
-  [self->message        release];
   [super dealloc];
 }
 
 
 - (void)sleep {
   [self->currentAddress release]; self->currentAddress = nil;
-  [self->message        release]; self->message        = nil;
   [super sleep];
 }
 
 /* fetching */
 
-- (NSArray *)fetchKeys {
-  /* Note: see SOGoMailManager.m for allowed IMAP4 keys */
-  static NSArray *keys = nil;
-  if (keys == nil) {
-    /* Note: "BODY" actually returns the structure! */
-    keys = [[NSArray alloc] initWithObjects:
-                             @"FLAGS", @"ENVELOPE", @"BODY", nil];
-  }
-  return keys;
-}
-
 - (id)message {
-  id msgs;
-  
-  if (self->message != nil)
-    return [self->message isNotNull] ? self->message : nil;
-  
-  msgs = [[self clientObject] fetchParts:[self fetchKeys]]; // returns dict
-  // [self logWithFormat:@"M: %@", msgs];
-  msgs = [msgs valueForKey:@"fetch"];
-  if ([msgs count] == 0)
-    return nil;
-  
-  self->message = [[msgs objectAtIndex:0] retain];
-  return self->message;
+  return [[self clientObject] fetchCoreInfos];
 }
 
 /* derived accessors */
 
 - (BOOL)hasCC {
-  return [[self valueForKeyPath:@"message.envelope.cc"] count] > 0 ? YES : NO;
+  return [[[self clientObject] ccEnvelopeAddresses] count] > 0 ? YES : NO;
 }
 
 /* actions */
index 6e0e2f779fc6de58d4a191a83cdb762db4aaeb7a..3d6a63e2f724a1df2312d6ce3e35f6967097be9a 100644 (file)
@@ -17,7 +17,7 @@
     <tr class="mailer_fieldrow">
       <td class="mailer_fieldname" ><var:string label:value="Subject"/>:</td>
       <td class="mailer_subjectfieldvalue">
-        <var:string value="message.envelope.subject"
+        <var:string value="clientObject.subject"
                     formatter="context.mailSubjectFormatter"/>
       </td>
     </tr>
       <td class="mailer_fieldvalue">
         <!-- compose link? -->
         <a href="#">
-          <var:string value="message.envelope.from"
+          <var:string value="clientObject.fromEnvelopeAddress"
                formatter="context.mailEnvelopeFullAddressFormatter" /></a>
       </td>
     </tr>
     <tr class="mailer_fieldrow">
       <td class="mailer_fieldname" ><var:string label:value="Date"/>:</td>
       <td class="mailer_fieldvalue">
-        <var:string value="message.envelope.date" 
+        <var:string value="clientObject.date" 
                     formatter="context.mailDateFormatter"/>
       </td>
     </tr>
@@ -42,7 +42,8 @@
       <td class="mailer_fieldname" ><var:string label:value="To"/>:</td>
       <td class="mailer_fieldvalue">
         <!-- compose link? -->
-        <var:foreach list="message.envelope.to" item="currentAddress">
+        <var:foreach list="clientObject.toEnvelopeAddresses"
+                     item="currentAddress">
           <a href="#">
             <var:string value="currentAddress"
                  formatter="context.mailEnvelopeFullAddressFormatter" /></a>
@@ -54,7 +55,8 @@
         <td class="mailer_fieldname" ><var:string label:value="CC"/>:</td>
         <td class="mailer_fieldvalue">
           <!-- compose link? -->
-          <var:foreach list="message.envelope.cc" item="currentAddress">
+          <var:foreach list="clientObject.ccEnvelopeAddresses" 
+                       item="currentAddress">
             <a href="#">
               <var:string value="currentAddress"
                    formatter="context.mailEnvelopeFullAddressFormatter" /></a>
index 9cef79939ea704d51f0e6725b9964991d0cafe31..92c8fa08c38f073a34665a077f87e34ece0ab9e3 100644 (file)
@@ -1,3 +1,3 @@
 # $Id$
 
-SUBMINOR_VERSION:=12
+SUBMINOR_VERSION:=13