]> err.no Git - scalable-opengroupware.org/commitdiff
drafts can fake being IMAP4 messages, mail editor got delete action
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 27 Oct 2004 15:38:53 +0000 (15:38 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 27 Oct 2004 15:38:53 +0000 (15:38 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@431 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/SoObjects/Mailer/ChangeLog
SOGo/SoObjects/Mailer/SOGoDraftObject.h
SOGo/SoObjects/Mailer/SOGoDraftObject.m
SOGo/SoObjects/Mailer/SOGoDraftsFolder.m
SOGo/SoObjects/Mailer/Version
SOGo/UI/Mailer/ChangeLog
SOGo/UI/Mailer/UIxMailEditor.m
SOGo/UI/Mailer/mailer.js
SOGo/UI/Mailer/product.plist

index 50ad743864a5feccb54318c705b428f51706ab17..36fb78e8a99f794f1ad1d589557b4f6e1be1837a 100644 (file)
@@ -1,5 +1,11 @@
 2004-10-27  Helge Hess  <helge.hess@opengroupware.org>
 
+       * v0.9.42
+
+       * SOGoDraftObject.m: implements some SOGoMailObject methods
+
+       * SOGoDraftsFolder.m: implemented some draft folder listing
+
        * SOGoDraftObject.m: added mail send functionality (v0.9.41)
 
        * SOGoDraftObject.m: added ability to create NGMime objects from draft
index 4ad007541585ccebfd12a1ed7b0142bab5b8ad0b..7f0393edf937e163ec462a9b9b1f90172d9e6bd7 100644 (file)
 */
 
 @class NSString, NSArray, NSDictionary, NSData, NSException;
-@class NGMimeMessage;
+@class NGMimeMessage, NGImap4Envelope;
 
 @interface SOGoDraftObject : SOGoMailBaseObject
 {
-  NSString     *path;
-  NSDictionary *info; /* stores the envelope information */
+  NSString        *path;
+  NSDictionary    *info; /* stores the envelope information */
+  NGImap4Envelope *envelope;
 }
 
 /* contents */
 
 - (NSException *)delete;
 
+/* fake being a SOGoMailObject */
+
+- (id)fetchParts:(NSArray *)_parts;
+
 @end
 
 #endif /* __Mailer_SOGoDraftObject_H__ */
index c66123287f7f9439eaed149dea86d8ad63febe87..47f7f016aa9afc12d3acd651ea6cd4fddc70ee33 100644 (file)
@@ -27,6 +27,8 @@
 #include <NGMime/NGMimeFileData.h>
 #include <NGMime/NGMimeMultipartBody.h>
 #include <NGMime/NGMimeType.h>
+#include <NGImap4/NGImap4Envelope.h>
+#include <NGImap4/NGImap4EnvelopeAddress.h>
 #include <NGExtensions/NSFileManager+Extensions.h>
 #include "common.h"
 
@@ -43,6 +45,7 @@ static BOOL       debugOn = NO;
 }
 
 - (void)dealloc {
+  [self->envelope release];
   [self->info release];
   [self->path release];
   [super dealloc];
@@ -647,6 +650,77 @@ static BOOL       debugOn = NO;
   return [NSNumber numberWithBool:YES]; /* delete worked out ... */
 }
 
+/* fake being a SOGoMailObject */
+
+- (id)fetchParts:(NSArray *)_parts {
+  return [NSDictionary dictionaryWithObject:self forKey:@"fetch"];
+}
+
+- (NSString *)uid {
+  return [self nameInContainer];
+}
+- (NSArray *)flags {
+  static NSArray *seenFlags = nil;
+  seenFlags = [[NSArray alloc] initWithObjects:@"seen", nil];
+  return seenFlags;
+}
+- (unsigned)size {
+  return 0;
+}
+
+- (NSArray *)imap4EnvelopeAddressesForStrings:(NSArray *)_emails {
+  NSMutableArray *ma;
+  unsigned i, count;
+  
+  if (_emails == nil)
+    return nil;
+  if ((count = [_emails count]) == 0)
+    return [NSArray array];
+
+  ma = [NSMutableArray arrayWithCapacity:count];
+  for (i = 0; i < count; i++) {
+    NGImap4EnvelopeAddress *envaddr;
+
+    envaddr = [[NGImap4EnvelopeAddress alloc] 
+               initWithString:[_emails objectAtIndex:i]];
+    if ([envaddr isNotNull])
+      [ma addObject:envaddr];
+    [envaddr release];
+  }
+  return ma;
+}
+
+- (NGImap4Envelope *)envelope {
+  NSDictionary *lInfo;
+  NSString     *tmp;
+  
+  if (self->envelope != nil)
+    return self->envelope;
+  if ((lInfo = [self fetchInfo]) == nil)
+    return nil;
+  
+  self->envelope = [[NGImap4Envelope alloc] init];
+  
+  self->envelope->msgId   = [[self nameInContainer] copy];
+  self->envelope->subject = [[lInfo objectForKey:@"subject"] copy];
+  
+  self->envelope->from = 
+    [[NGImap4EnvelopeAddress alloc] initWithString:[self sender]];
+  
+  if ([(tmp = [lInfo objectForKey:@"replyTo"]) length] > 0) {
+    self->envelope->replyTo = 
+      [[NGImap4EnvelopeAddress alloc] initWithString:tmp];
+  }
+  
+  self->envelope->to = [[self imap4EnvelopeAddressesForStrings:
+                               [lInfo objectForKey:@"to"]] copy];
+  self->envelope->cc = [[self imap4EnvelopeAddressesForStrings:
+                               [lInfo objectForKey:@"cc"]] copy];
+  self->envelope->bcc = [[self imap4EnvelopeAddressesForStrings:
+                               [lInfo objectForKey:@"bcc"]] copy];
+  return self->envelope;
+}
+
 /* debugging */
 
 - (BOOL)isDebuggingEnabled {
index 80cf46d70ed95175160595f66017a2c59d2f5e97..f15c312a8e34d9573d8b6065eb3e2d813532dc09 100644 (file)
@@ -120,8 +120,30 @@ static NSString *spoolFolder = nil;
   return allUids;
 }
 - (NSArray *)fetchUIDs:(NSArray *)_uids parts:(NSArray *)_parts {
-  [self logWithFormat:@"TODO: fetch uids (parts=%@): %@", _parts, _uids];
-  return [NSArray array];
+  /* FLAGS, ENVELOPE, RFC822.SIZE */
+  NSMutableArray  *drafts;
+  unsigned i, count;
+  
+  if (_uids == nil)
+    return nil;
+  if ((count = [_uids count]) == 0)
+    return [NSArray array];
+  
+  drafts = [NSMutableArray arrayWithCapacity:count];
+  for (i = 0; i < count; i++) {
+    SOGoDraftObject *draft;
+    id parts;
+    
+    draft = [self lookupName:[_uids objectAtIndex:i] inContext:nil acquire:NO];
+    if (![draft isNotNull] || [draft isKindOfClass:[NSException class]])
+      continue;
+    
+    parts = [draft fetchParts:_parts];
+    if ([parts isNotNull])
+      [drafts addObject:parts];
+  }
+  
+  return drafts;
 }
 
 /* name lookup */
index 56ded08c4bf9e552f4ff83d548c98a6efc18ffcf..8638a8c5ed40343b8d354eb991bac8b09033ceb0 100644 (file)
@@ -1,6 +1,6 @@
 # Version file
 
-SUBMINOR_VERSION:=41
+SUBMINOR_VERSION:=42
 
 # v0.9.51 requires NGMime    v4.3.190
 # v0.9.35 requires SOGoLogic v0.9.24
index 04c476f4473eadf760f7ffa8bc5ebbbde33173e1..a3d0c808a3ad3f77f9053902d4dd3a76b5c5993f 100644 (file)
@@ -1,6 +1,9 @@
 2004-10-27  Helge Hess  <helge.hess@opengroupware.org>
 
-       * v0.9.49
+       * UIxMailEditor.m: default method returns a redirect to 'edit', added
+         'delete' action and button (v0.9.51)
+
+       * v0.9.50
 
        * UIxMailEditor.m: send mail using draft object
 
index 8ad6a2eaa5b26298c301c4731def22469afb8608..6bae44aa1a3f7c45484c636a8fac800f058a5fc0 100644 (file)
@@ -169,6 +169,10 @@ static NSArray *infoKeys = nil;
                      reason:@"failed to store draft object on server!"];
 }
 
+- (id)defaultAction {
+  return [self redirectToLocation:@"edit"];
+}
+
 - (id)editAction {
   [self logWithFormat:@"edit action, load content from: %@",
          [self clientObject]];
@@ -183,16 +187,22 @@ static NSArray *infoKeys = nil;
 
 - (id)sendAction {
   NSException *error;
+  NSString *mailPath;
   
   /* first, save form data */
   
   if (![self _saveFormInfo])
     return [self failedToSaveFormResponse];
   
+  /* save mail to file (so that we can upload the mail to Cyrus */
+  
+  mailPath = [[self clientObject] saveMimeMessageToTemporaryFile];
+  
   /* then, send mail */
   
-  if ((error = [[self clientObject] sendMail]) != nil) {
+  if ((error = [[self clientObject] sendMimeMessageAtPath:mailPath]) != nil) {
     // TODO: improve error handling
+    [[NSFileManager defaultManager] removeFileAtPath:mailPath handler:nil];
     return error;
   }
   
@@ -202,7 +212,11 @@ static NSArray *infoKeys = nil;
   
   /* finally store in Sent */
   
-  [self logWithFormat:@"TODO: store mail in Sent folder ..."];
+  [self logWithFormat:@"TODO: store mail in Sent folder: %@", mailPath];
+#if 0
+  [[NSFileManager defaultManager] removeFileAtPath:mailPath handler:nil];
+#endif
+  mailPath = nil;
   
   /* delete draft */
   
@@ -213,4 +227,13 @@ static NSArray *infoKeys = nil;
   return self;
 }
 
+- (id)deleteAction {
+  NSException *error;
+  
+  if ((error = [[self clientObject] delete]) != nil)
+    return error;
+  
+  return nil;
+}
+
 @end /* UIxMailEditor */
index c88ffa33a1ea3b19a236ef01819ae201fb2a1308..8c6f1166cb60e3e98c385593f13dccc2e2c9517c 100644 (file)
@@ -87,6 +87,13 @@ function clickedEditorSave(sender) {
   return true;
 }
 
+function clickedEditorDelete(sender) {
+  document.pageform.action="delete";
+  document.pageform.submit();
+  window.close();
+  return true;
+}
+
 /* addressbook helpers */
 
 function openAnais(sender) {
index a9f84089b8c8fe379ae3479bc6c9e9ec1c935af3..c4d605f0fb48f18d945b06614e4adc2e95f26db5 100644 (file)
               { link  = "#"; 
                 onclick  = "clickedEditorSave(this);return false;";
                 cssClass = "tbicon_save"; label = "Save"; },
+              { link = "#"; 
+                onclick  = "clickedEditorDelete(this);return false;";
+                cssClass = "tbicon_delete"; label = "Delete"; },
             )
           );
         };
           pageName    = "UIxMailEditor"; 
           actionName  = "save";
         };
+        delete = {
+          protectedBy = "View";
+          pageName    = "UIxMailEditor"; 
+          actionName  = "delete";
+        };
 
         viewAttachments = {
           protectedBy = "View";