]> err.no Git - scalable-opengroupware.org/commitdiff
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1205 d1b88da0-ebda-0310...
authorwolfgang <wolfgang@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Mon, 29 Oct 2007 21:38:54 +0000 (21:38 +0000)
committerwolfgang <wolfgang@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Mon, 29 Oct 2007 21:38:54 +0000 (21:38 +0000)
ChangeLog
SOPE/GDLContentStore/ChangeLog
SOPE/GDLContentStore/GCSFolder.m
SoObjects/Mailer/SOGoMailBodyPart.m
UI/MailerUI/English.lproj/Localizable.strings
UI/MailerUI/French.lproj/Localizable.strings
UI/MailerUI/German.lproj/Localizable.strings
UI/MailerUI/UIxMailListView.m
UI/Templates/MailerUI/UIxMailListView.wox
UI/WebServerResources/MailerUI.js

index e91bb16d2f029eaf15d08a8e751c2bbf8e241b6d..3d8206ef92b5c6cb900bf29a809bf7df9a9f9549 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2007-10-29  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
+
+       * SoObjects/Mailer/SOGoMailBodyPart.m ([SOGoMailBodyPart
+       -davContentType]): ignore any possible parameter taken from the
+       mime-info of the body part.
+
+       * UI/MailerUI/UIxMailListView.m ([UIxMailListView
+       -lastFirstMessageNumber]): new accessor that returns the first
+       message number of the last series of messages.
+       ([UIxMailListView -fetchKeys]): request the bodystructure for each
+       listed message.
+       ([UIxMailListView -hasMessageAttachment]): extract the attachment
+       information from the message bodystructure.
+
 2007-10-26  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
 
        * SoObjects/Mailer/SOGoMailBodyPart.m ([SOGoMailBodyPart
index dae4f0dc59d2afe657e2bff92f73c4e8227f36c5..a1072b1a9f8b8e0e45ba1bf43d3c271140cf0181 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-29  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
+
+       * GCSFolder.m ([GCSFolder -writeContent:toName:baseVersion:]):
+       purge the record if previously marked as deleted.
+
 2007-10-24  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
 
        * GCSFolderManager.m ([GCSFolderManager -baseTableNameWithUID:]):
index be7f22c5cba1b645692444dd5dc663fc70e62fa5..c423d5f4896709189647c40b3d7d9535acfa9055 100644 (file)
@@ -303,6 +303,10 @@ static GCSStringFormatter *stringFormatter = nil;
   return [self _fetchValueOfColumn:@"c_version" inContentWithName:_name];
 }
 
+- (NSNumber *)deletionOfContentWithName:(NSString *)_name {
+  return [self _fetchValueOfColumn:@"c_deleted" inContentWithName:_name];
+}
+
 - (NSString *)fetchContentWithName:(NSString *)_name {
   return [self _fetchValueOfColumn:@"c_content" inContentWithName:_name];
 }
@@ -525,6 +529,21 @@ static GCSStringFormatter *stringFormatter = nil;
   return AUTORELEASE(qualifier);
 }
 
+- (void) _purgeRecordWithName: (NSString *) recordName
+{
+  NSString *delSql, *table;
+  EOAdaptorChannel *channel;
+
+  channel = [self acquireStoreChannel];
+
+  table = [self storeTableName];
+  delSql = [NSString stringWithFormat: @"DELETE FROM %@"
+                    @" WHERE c_name = %@", table,
+                    [self _formatRowValue: recordName]];
+  [channel evaluateExpressionX: delSql];
+  [self releaseChannel: channel];
+}
+
 - (NSException *)writeContent:(NSString *)_content toName:(NSString *)_name
   baseVersion:(unsigned int)_baseVersion
 {
@@ -561,6 +580,14 @@ static GCSStringFormatter *stringFormatter = nil;
   if (doLogStore)
     [self logWithFormat:@"  version: %@", storedVersion];
   isNewRecord = [storedVersion isNotNull] ? NO : YES;
+  if (!isNewRecord)
+    {
+      if ([[self deletionOfContentWithName:_name] isNotNull])
+       {
+         [self _purgeRecordWithName: _name];
+         isNewRecord = YES;
+       }
+    }
   
   /* check whether sequence matches */  
   if (_baseVersion != 0 /* use 0 to override check */) {
index d1a1f42fe5ab63544b8948a19bceef0c6972af1c..550fc04a547ac1b0f442fefaeb33e32961283c79 100644 (file)
@@ -236,20 +236,24 @@ static BOOL debugOn = NO;
   return @"application/octet-stream";
 }
 
-- (NSString *)davContentType {
+- (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;
+  NSString *parts, *contentType, *extension;
   
   /* try type from body structure info */
   
-  if ((pe = [self contentTypeForBodyPartInfo:[self partInfo]]) != nil)
-    return pe;
-  
-  /* construct type */
-  
-  pe = [[self nameInContainer] pathExtension];
-  return [self contentTypeForPathExtension:pe];
+  parts = [self contentTypeForBodyPartInfo: [self partInfo]];
+  contentType = [[parts componentsSeparatedByString: @";"] objectAtIndex: 0];
+
+  if (![contentType length])
+    {
+      extension = [[self nameInContainer] pathExtension];
+      contentType = [self contentTypeForPathExtension: extension];
+    }
+
+  return contentType;
 }
 
 /* actions */
index 2574e487734ecb2e76d994e229730f01e49e5fda..5bf7ababf97069fea3d0b282ce959939edafb292 100644 (file)
 "Unread"        = "Unread";
 "messages"      = "messages";
 
-"first"         = "first";
-"previous"      = "prev";
-"next"          = "next";
+"first"         = "First";
+"previous"      = "Previous";
+"next"          = "Next";
+"last"          = "Last";
 
 "msgnumber_to"  = "to";
 "msgnumber_of"  = "of";
index 6c805eaa18c29670914f7a1c3300c6cb9fcbeebf..6f9acb86b7ec50c9690cc8787e53779e2113e4f2 100644 (file)
 "messages"      = "message(s)";
 
 "first"         = "Premier";
-"previous"      = "précédent";
-"next"          = "suivant";
+"previous"      = "Précédent";
+"next"          = "Suivant";
+"last"          = "Dernier";
 
 "Mark Unread" = "Marquer comme non lu"; 
 "Mark Read"   = "Marquer comme lu";
index 40d826d2f2f1b483631a8390f8404f80533ba2be..4f5f989005ad12e7e043fe08c0d479f54f945af7 100644 (file)
 "first"         = "Erste";
 "previous"      = "Vorherige";
 "next"          = "Nächste";
+"last"          = "Letzter";
 
 "Mark Unread" = "Als ungelesen markieren"; 
 "Mark Read"   = "Als gelesen markieren";
index 1625142119d485148c6e1cf3bde029e8f708480f..6f7767d4cee13f863fe6c353ccc5b08e3d497df6 100644 (file)
 
 #import <SoObjects/Mailer/SOGoMailFolder.h>
 #import <SoObjects/Mailer/SOGoMailObject.h>
+#import <SoObjects/SOGo/NSArray+Utilities.h>
 #import <SoObjects/SOGo/SOGoDateFormatter.h>
 #import <SoObjects/SOGo/SOGoUser.h>
 
 #import "UIxMailListView.h"
 
 #define messagesPerPage 50
-static int attachmentFlagSize = 8096;
 
 @implementation UIxMailListView
 
@@ -80,7 +80,7 @@ static int attachmentFlagSize = 8096;
 
 - (void) setMessage: (id) _msg
 {
-  ASSIGN(message, _msg);
+  ASSIGN (message, _msg);
 }
 
 - (id) message 
@@ -203,11 +203,25 @@ static int attachmentFlagSize = 8096;
 
 - (BOOL) hasMessageAttachment 
 {
-  /* we detect attachments by size ... */
-  unsigned size;
-  
-  size = [[[self message] valueForKey:@"size"] intValue];
-  return size > attachmentFlagSize;
+  NSArray *parts;
+  NSEnumerator *dispositions;
+  NSDictionary *currentDisp;
+  BOOL hasAttachment;
+
+  parts = [[message objectForKey: @"body"] objectForKey: @"parts"];
+  if ([parts count] > 1)
+    {
+      dispositions
+       = [[parts objectsForKey: @"disposition"] objectEnumerator];
+      while (!hasAttachment
+            && (currentDisp = [dispositions nextObject]))
+       hasAttachment = ([[currentDisp objectForKey: @"type"]
+                          isEqualToString: @"ATTACHMENT"]);
+    }
+  else
+    hasAttachment = NO;
+
+  return hasAttachment;
 }
 
 /* fetching messages */
@@ -216,10 +230,12 @@ static int attachmentFlagSize = 8096;
 {
   /* Note: see SOGoMailManager.m for allowed IMAP4 keys */
   static NSArray *keys = nil;
-  if (keys == nil) {
+
+  if (!keys)
     keys = [[NSArray alloc] initWithObjects: @"UID",
-                             @"FLAGS", @"ENVELOPE", @"RFC822.SIZE", nil];
-  }
+                           @"FLAGS", @"ENVELOPE", @"RFC822.SIZE",
+                           @"BODYSTRUCTURE", nil];
+
   return keys;
 }
 
@@ -263,6 +279,7 @@ static int attachmentFlagSize = 8096;
 - (NSArray *) sortedUIDs 
 {
   EOQualifier *fetchQualifier, *notDeleted;
+
   if (!sortedUIDs)
     {
       notDeleted = [EOQualifier qualifierWithQualifierFormat:
@@ -354,6 +371,21 @@ static int attachmentFlagSize = 8096;
   return [self firstMessageNumber] + [self fetchRange].length;
 }
 
+- (unsigned int) lastFirstMessageNumber 
+{
+  unsigned int max, modulo;
+
+  if (!sortedUIDs)
+    [self sortedUIDs];
+
+  max = [sortedUIDs count];
+  modulo = (max % messagesPerPage);
+  if (modulo == 0)
+    modulo = messagesPerPage;
+
+  return (max + 1 - modulo);
+}
+
 - (unsigned int) prevFirstMessageNumber 
 {
   NSRange  r;
@@ -368,22 +400,23 @@ static int attachmentFlagSize = 8096;
 
 - (NSArray *) messages 
 {
-  NSArray  *uids;
-  NSArray  *msgs;
-  NSRange  r;
+  NSArray *uids;
+  NSDictionary *msgs;
+  NSRange r;
   unsigned len;
   
-  if (messages != nil)
-    return messages;
-
-  r    = [self fetchBlock];
-  uids = [self sortedUIDs];
-  if ((len = [uids count]) > r.length)
-    /* only need to restrict if we have a lot */
-    uids = [uids subarrayWithRange:r];
+  if (!messages)
+    {
+      r    = [self fetchBlock];
+      uids = [self sortedUIDs];
+      len = [uids count];
+      if (len > r.length)
+       /* only need to restrict if we have a lot */
+       uids = [uids subarrayWithRange: r];
   
-  msgs = [[self clientObject] fetchUIDs: uids parts: [self fetchKeys]];
-  messages = [[msgs valueForKey: @"fetch"] retain];
+      msgs = [[self clientObject] fetchUIDs: uids parts: [self fetchKeys]];
+      messages = [[msgs objectForKey: @"fetch"] retain];
+    }
 
   return messages;
 }
index cae21ceb320639d5d26e3b13790b09efea6ea321..31d5ed63f3765bca7a131e5e8a4c1e84718b28ce 100644 (file)
@@ -48,6 +48,9 @@
            >| <a href="#"
              var:idx="nextFirstMessageNumber"
              ><var:string label:value="next" /></a>
+           | <a href="#"
+             var:idx="lastFirstMessageNumber"
+             ><var:string label:value="last" /></a>
          </var:if>
         </var:if
          ></td
index f9a708dd0c3ae9114c36bd3eb7bccf794ad19370..57d718f6fa7deeaf561ac5f014410fc5da438230 100644 (file)
@@ -944,16 +944,16 @@ var mailboxSpanDrop = function(data) {
   }
   else
     success = false;
-  
+
   return success;
 }
-    
+
 var plusSignEnter = function() {
   var nodeNr = parseInt(this.id.substr(2));
   if (!mailboxTree.aNodes[nodeNr]._io)
     this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000);
 }
-      
+
 var plusSignExit = function() {
   if (this.plusSignTimer) {
     clearTimeout(this.plusSignTimer);