]> err.no Git - scalable-opengroupware.org/commitdiff
implemented trashing
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 6 Jul 2005 22:28:50 +0000 (22:28 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 6 Jul 2005 22:28:50 +0000 (22:28 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@679 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/SoObjects/Mailer/ChangeLog
SOGo/SoObjects/Mailer/SOGoMailObject.h
SOGo/SoObjects/Mailer/SOGoMailObject.m
SOGo/SoObjects/Mailer/Version
SOGo/UI/MailerUI/ChangeLog
SOGo/UI/MailerUI/UIxMailView.m
SOGo/UI/MailerUI/Version
SOGo/UI/MailerUI/product.plist

index d3112e2176e7fea9cf92dee4a6917ebdf5a9092e..76ea86f1027b49a0257ad596a1f3bdc7600c7aaa 100644 (file)
@@ -1,3 +1,7 @@
+2005-07-07  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SOGoMailObject.m: implemented -trashInContext: method (v0.9.88)
+
 2005-07-06  Helge Hess  <helge.hess@opengroupware.org>
 
        * SOGoMailObject.m: prefetch pgp-signature parts (v0.9.87)
index 3b5a054985dd4f04703bccc6ecaae1ef3e22e1dd..fc888cc143b85b1f701ca25a7d95c8969ebd4c5c 100644 (file)
 - (NSException *)addFlags:(id)_f;
 - (NSException *)removeFlags:(id)_f;
 
+/* deletion */
+
+- (BOOL)isDeletionAllowed;
+- (NSException *)trashInContext:(id)_ctx;
+
 @end
 
 #endif /* __Mailer_SOGoMailObject_H__ */
index be2ad752a42578537d0e44a0d329dfe8b5fd9e4a..44ee5592e099ca2da2a08d930fdf40d0e598f23b 100644 (file)
@@ -587,7 +587,8 @@ static BOOL debugBodyStructure = NO;
 
      Also: we cannot really take a target resource, the ID will be assigned by
            the IMAP4 server.
-          TODO: return a 'location' header instead?
+          We even cannot return a 'location' header instead because IMAP4
+          doesn't tell us the new ID.
   */
   NSURL *destImap4URL;
   
@@ -622,7 +623,16 @@ static BOOL debugBodyStructure = NO;
 
 /* operations */
 
-- (NSException *)trashAction:(id)_ctx {
+- (NSException *)trashInContext:(id)_ctx {
+  /*
+    Trashing is three actions:
+    a) copy to trash folder
+    b) mark mail as deleted
+    c) expunge folder
+    
+    In case b) or c) fails, we can't do anything because IMAP4 doesn't tell us
+    the ID used in the trash folder.
+  */
   SOGoMailFolder *trashFolder;
   NSException    *error;
 
@@ -635,10 +645,28 @@ static BOOL debugBodyStructure = NO;
     return [NSException exceptionWithHTTPStatus:500 /* Server Error */
                        reason:@"Did not find Trash folder!"];
   }
+  [trashFolder flushMailCaches];
+
+  /* a) copy */
+  
+  error = [self davCopyToTargetObject:trashFolder
+               newName:@"fakeNewUnusedByIMAP4" /* autoassigned */
+               inContext:_ctx];
+  if (error != nil) return error;
+
+  /* b) mark deleted */
   
-  error = [self davCopyToTargetObject:trashFolder newName:nil inContext:_ctx];
+  error = [[self mailManager] markURLDeleted:[self imap4URL] 
+                             password:[self imap4Password]];
   if (error != nil) return error;
+  
+  /* c) expunge */
 
+  error = [[self mailManager] expungeAtURL:[[self container] imap4URL]
+                             password:[self imap4Password]];
+  if (error != nil) return error; // TODO: unflag as deleted?
+  [self flushMailCaches];
+  
   return nil;
 }
 
index cb57afef8a43683d292345b2e604e6b70e86c295..9bc595749469e8f6b4edc690c3e5cc21990031b3 100644 (file)
@@ -1,6 +1,6 @@
 # Version file
 
-SUBMINOR_VERSION:=87
+SUBMINOR_VERSION:=88
 
 # v0.9.69 requires libNGMime       v4.5.210
 # v0.9.55 requires libNGExtensions v4.5.136
index c83076fe5f2e9245a606287da0107c6a49579bed..9fb669f6957681f1f481458c3050d08ffc7d1f5a 100644 (file)
@@ -1,3 +1,8 @@
+2005-07-07  Helge Hess  <helge.hess@opengroupware.org>
+
+       * UIxMailView.m, product.plist: added -trash button and action
+         (v0.9.127)
+
 2005-07-06  Helge Hess  <helge.hess@opengroupware.org>
 
        * product.plist: hide expunge button on mail folder when deleting is
index ffe89b1101fde8bbeefeddf2116c3320dbcd9ea0..59b40bfe3ed93280efa6544b24150b26b34342cc 100644 (file)
   return s;
 }
 
+/* expunge / delete setup and permissions */
+
+- (BOOL)showMarkDeletedButton {
+  if (![[self clientObject] isDeletionAllowed])
+    return NO;
+  
+  return NO; // TODO: make configurable in profile
+}
+
+- (BOOL)showTrashButton {
+  if (![[self clientObject] isDeletionAllowed])
+    return NO;
+  // TODO: should also check for Trash write access (or add -isTrashingAllowed)
+  
+  return YES; // TODO: make configurable in profile
+}
+
 /* links (DUP to UIxMailPartViewer!) */
 
 - (NSString *)linkToEnvelopeAddress:(NGImap4EnvelopeAddress *)_address {
 
 - (id)deleteAction {
   NSException *ex;
-
+  
   if (![self isDeletableClientObject]) {
     return [NSException exceptionWithHTTPStatus:400 /* Bad Request */
                         reason:@"method cannot be invoked on "
   }
   
   if ((ex = [[self clientObject] delete]) != nil) {
-    // TODO: improve error handling
     id url;
     
-    [self debugWithFormat:@"failed to delete: %@", ex];
-    
     url = [[ex reason] stringByEscapingURL];
     url = [@"view?error=" stringByAppendingString:url];
     return [self redirectToLocation:url];
   return [self redirectToParentFolder];
 }
 
+- (id)trashAction {
+  NSException *ex;
+  
+  if ([self isInvokedBySafeMethod]) {
+    // TODO: fix UI to use POST for unsafe actions
+    [self logWithFormat:@"WARNING: method is invoked using safe HTTP method!"];
+  }
+  
+  if ((ex = [[self clientObject] trashInContext:[self context]]) != nil) {
+    id url;
+    
+    url = [[ex reason] stringByEscapingURL];
+    url = [@"view?error=" stringByAppendingString:url];
+    return [self redirectToLocation:url];
+  }
+  
+  if (![self isInlineViewer]) {
+    // if everything is ok, close the window (send a JS closing the Window)
+    id page;
+    
+    page = [self pageWithName:@"UIxMailWindowCloser"];
+    [page takeValue:@"YES" forKey:@"refreshOpener"];
+    return page;
+  }
+  
+  return [self redirectToParentFolder];
+}
+
 - (id)getMailAction {
   // TODO: we might want to flush the caches?
   return [self redirectToLocation:@"view"];
index ed1862db2b6afc8282a8a06bd5177c76411b452a..179f28d65d51930ef370c9dd62c98ddd8c1f46d5 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=126
+SUBMINOR_VERSION:=127
 
 # v0.9.100 requires libNGMime        v4.5.213
 # v0.9.99  requires libNGMime        v4.5.212
index e4f0b930455df89921e59fa32246cd3f806479cb..d8ed9bf73de62fd68110d9f1c7b6cc2894a9dcef 100644 (file)
                 cssClass = "tbicon_forward";  label = "Forward";   },
             ),
             ( // third group
-              { link     = "delete"; 
-                isSafe   = NO;
-                enabled  = clientObject.isDeletionAllowed;
+              { link     = "delete"; isSafe = NO;
+                enabled  = showMarkDeletedButton;
+                cssClass = "tbicon_delete"; label = "Delete"; },
+              { link     = "trash"; isSafe = NO;
+                enabled  = showTrashButton;
                 cssClass = "tbicon_delete"; label = "Delete"; },
 /* TODO: enable when we know how to mark junk (#971)
               { link = "#"; 
           pageName    = "UIxMailView"; 
           actionName  = "delete";
         };
+        trash = { 
+          protectedBy = "View";
+          pageName    = "UIxMailView"; 
+          actionName  = "trash";
+        };
         junk = { 
           protectedBy = "View";
           pageName    = "UIxMailView";