]> err.no Git - scalable-opengroupware.org/commitdiff
added identity based Sent-folder functionality
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 22 Jul 2005 12:06:48 +0000 (12:06 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 22 Jul 2005 12:06:48 +0000 (12:06 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@893 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/UI/MailerUI/ChangeLog
SOGo/UI/MailerUI/README
SOGo/UI/MailerUI/UIxMailEditor.m
SOGo/UI/MailerUI/Version
SOGo/UI/Templates/MailerUI/UIxMailView.wox

index 61cd65ff07caf89c010e07e757ac7d8bfe26d762..5e834faf3361476bb630ca458bd96055dd0d909f 100644 (file)
@@ -1,3 +1,9 @@
+2005-07-22  Helge Hess  <helge.hess@opengroupware.org>
+
+       * UIxMailEditor.m: implemented identity based Sent folders (tied to
+         'from' email address). The old url-attached Sent folder can be
+         enabled using 'SOGoUseLocationBasedSentFolder') (v0.9.168)
+
 2005-07-21  Helge Hess  <helge.hess@opengroupware.org>
 
        * UIxMailMainFrame.m: fixed banner positioning for 24x24 (v0.9.167)
index b35646b6688d2bb72304205c7e33c840ebd88c59..0bc4b41bd1947002d2dba5e9ab4215fc0b9cfe34 100644 (file)
@@ -94,6 +94,11 @@ SOGoDontUseETagsForMailViewer - YES|NO
     IDs in the IMAP4 server and messages cannot be edited in IMAP4
   - use the default for debugging (otherwise you won't see changes ...)
 
+SOGoUseLocationBasedSentFolder - YES | NO
+- when enable SOGo looks up the Sent folder by traversing the lookup-path
+  until it finds a SOGoMailAccount object and then asks the account for the
+  Sent folder.
+
 Notes
 =====
 
index fc513515d589830eca461463ca8494670e6823b6..35d557690ef9f741e9b77ef0e36a274e9fc86cbf 100644 (file)
 #include <SoObjects/Mailer/SOGoDraftObject.h>
 #include <SoObjects/Mailer/SOGoMailFolder.h>
 #include <SoObjects/Mailer/SOGoMailAccount.h>
+#include <SoObjects/Mailer/SOGoMailAccounts.h>
+#include <SoObjects/Mailer/SOGoMailIdentity.h>
 #include <SoObjects/SOGo/WOContext+Agenor.h>
 #include <SoObjects/SOGo/SOGoUser.h>
 #include <NGMail/NGMimeMessage.h>
 #include <NGMail/NGMimeMessageGenerator.h>
+#include <NGObjWeb/SoSubContext.h>
 #include "common.h"
 
 @implementation UIxMailEditor
 
 static BOOL         keepMailTmpFile      = NO;
 static BOOL         showInternetMarker   = NO;
+static BOOL         useLocationBasedSentFolder = NO;
 static NSDictionary *internetMailHeaders = nil;
 static NSArray      *infoKeys            = nil;
 
@@ -75,7 +79,10 @@ static NSArray      *infoKeys            = nil;
   keepMailTmpFile = [ud boolForKey:@"SOGoMailEditorKeepTmpFile"];
   if (keepMailTmpFile)
     NSLog(@"WARNING: keeping mail files.");
-
+  
+  useLocationBasedSentFolder =
+    [ud boolForKey:@"SOGoUseLocationBasedSentFolder"];
+  
   /* Internet mail settings */
   
   showInternetMarker = [ud boolForKey:@"SOGoShowInternetMarker"];
@@ -252,12 +259,12 @@ static NSArray      *infoKeys            = nil;
   return nil;
 }
 
-- (id)lookupSentFolder {
+- (id)lookupSentFolderUsingAccount {
   SOGoMailAccount *account;
   SOGoMailFolder  *folder;
   
   if (self->sentFolder != nil)
-    return self;
+    return [self->sentFolder isNotNull] ? self->sentFolder : nil;;
   
   account = [[self clientObject] mailAccountFolder];
   if ([account isKindOfClass:[NSException class]]) return account;
@@ -267,17 +274,93 @@ static NSArray      *infoKeys            = nil;
   return ((self->sentFolder = [folder retain]));
 }
 
+- (SOGoMailIdentity *)selectedMailIdentity {
+  SOGoMailAccounts *accounts;
+  NSEnumerator     *e;
+  SOGoMailIdentity *identity;
+  
+  accounts = [[self clientObject] mailAccountsFolder];
+  if ([accounts isKindOfClass:[NSException class]]) return (id)accounts;
+  
+  // TODO: This is still a hack because we detect the identity based on the
+  //       from. In Agenor all of the identities have unique emails, but this
+  //       is not required for SOGo.
+  
+  if ([[self from] length] == 0)
+    return nil;
+  
+  e = [[accounts fetchIdentitiesWithEmitterPermissions] objectEnumerator];
+  while ((identity = [e nextObject]) != nil) {
+    if ([[identity email] isEqualToString:[self from]])
+      return identity;
+  }
+  return nil;
+}
+
+- (id)lookupSentFolderUsingFrom {
+  // TODO: if we have the identity we could also support BCC
+  SOGoMailAccounts *accounts;
+  SOGoMailIdentity *identity;
+  SoSubContext *ctx;
+  NSString     *sentFolderName;
+  NSArray      *sentFolderPath;
+  NSException  *error = nil;
+  
+  if (self->sentFolder != nil)
+    return [self->sentFolder isNotNull] ? self->sentFolder : nil;;
+  
+  identity = [self selectedMailIdentity];
+  if ([identity isKindOfClass:[NSException class]]) return identity;
+  
+  if (![(sentFolderName = [identity sentFolderName]) isNotEmpty]) {
+    [self warnWithFormat:@"Identity has no sent folder name: %@", identity];
+    return nil;
+  }
+  
+  // TODO: fixme, we treat the foldername as a hardcoded path from SOGoAccounts
+  // TODO: escaping of foldernames with slashes
+  // TODO: maybe the SOGoMailIdentity should have an 'account-identifier'
+  //       which is used to lookup the account and _then_ perform an account
+  //       local folder lookup? => would not be possible to have identities
+  //       saving to different accounts.
+  sentFolderPath = [sentFolderName componentsSeparatedByString:@"/"];
+  
+  accounts = [[self clientObject] mailAccountsFolder];
+  if ([accounts isKindOfClass:[NSException class]]) return (id)accounts;
+  
+  ctx = [[SoSubContext alloc] initWithParentContext:[self context]];
+  
+  self->sentFolder = [[accounts traversePathArray:sentFolderPath
+                               inContext:ctx error:&error
+                               acquire:NO] retain];
+  [ctx release]; ctx = nil;
+  if (error != nil) {
+    [self errorWithFormat:@"Sent-Folder lookup for identity %@ failed: %@",
+           identity, sentFolderPath];
+    return error;
+  }
+  
+#if 0
+  [self logWithFormat:@"Sent-Folder: %@", sentFolderName];
+  [self logWithFormat:@"  object:    %@", self->sentFolder];
+#endif
+  return self->sentFolder;
+}
+
 - (NSException *)storeMailInSentFolder:(NSString *)_path {
   SOGoMailFolder *folder;
   NSData *data;
   id result;
   
-  folder = [self lookupSentFolder];
+  folder = useLocationBasedSentFolder 
+    ? [self lookupSentFolderUsingAccount]
+    : [self lookupSentFolderUsingFrom];
   if ([folder isKindOfClass:[NSException class]]) return (id)folder;
+  if (folder == nil) return nil;
   
   if ((data = [[NSData alloc] initWithContentsOfMappedFile:_path]) == nil) {
     return [NSException exceptionWithHTTPStatus:500 /* server error */
-                       reason:@"could not temporary draft file!"];
+                       reason:@"could not find temporary draft file!"];
   }
   
   result = [folder postData:data flags:@"seen"];
@@ -401,7 +484,7 @@ static NSArray      *infoKeys            = nil;
   // TODO: all this could be handled by the SOGoDraftObject?
   
   mailPath = [[self clientObject] saveMimeMessageToTemporaryFileWithHeaders:h];
-  
+
   /* then, send mail */
   
   if ((error = [[self clientObject] sendMimeMessageAtPath:mailPath]) != nil) {
@@ -416,7 +499,7 @@ static NSArray      *infoKeys            = nil;
      return error;
   
   /* finally store in Sent */
-
+  
   if ((error = [self storeMailInSentFolder:mailPath]) != nil)
     return error;
   
index 33309d94f31b00e487fb110d75c1b251149352d6..a5e610b378082d01b5019178cf4e96a6a4d50327 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=167
+SUBMINOR_VERSION:=168
 
 # v0.9.140 requires SoObjects/Mailer v0.9.100
 # v0.9.134 requires libSOGo          v0.9.41
index 410a4b1e9c3ce478a25ee344d541e43c2f364f3c..94c9a839076de566e5b25ce6617d3c0a381bf77b 100644 (file)
     </var:if>
   </table>
 
-  
   <div class="mailer_mailcontent">
     <var:component value="contentViewerComponent"
                    bodyInfo="clientObject.bodyStructure" />