]> err.no Git - scalable-opengroupware.org/commitdiff
implemented bug #1074 (attachment download)
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 28 Jan 2005 14:50:35 +0000 (14:50 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 28 Jan 2005 14:50:35 +0000 (14:50 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@503 d1b88da0-ebda-0310-925b-ed51d893ca5b

24 files changed:
SOGo/SoObjects/Mailer/ChangeLog
SOGo/SoObjects/Mailer/SOGoMailAccount.m
SOGo/SoObjects/Mailer/SOGoMailBaseObject.h
SOGo/SoObjects/Mailer/SOGoMailBaseObject.m
SOGo/SoObjects/Mailer/SOGoMailBodyPart.h
SOGo/SoObjects/Mailer/SOGoMailBodyPart.m
SOGo/SoObjects/Mailer/SOGoMailObject.h
SOGo/SoObjects/Mailer/SOGoMailObject.m
SOGo/SoObjects/Mailer/Version
SOGo/UI/Mailer/ChangeLog
SOGo/UI/Mailer/GNUmakefile
SOGo/UI/Mailer/UIxMailEditor.m
SOGo/UI/Mailer/UIxMailMainFrame.m
SOGo/UI/Mailer/UIxMailPartImageViewer.m
SOGo/UI/Mailer/UIxMailPartLinkViewer.m
SOGo/UI/Mailer/UIxMailPartLinkViewer.wox
SOGo/UI/Mailer/UIxMailPartTextViewer.m
SOGo/UI/Mailer/UIxMailPartViewer.h
SOGo/UI/Mailer/UIxMailPartViewer.m
SOGo/UI/Mailer/UIxMailSizeFormatter.h [new file with mode: 0644]
SOGo/UI/Mailer/UIxMailSizeFormatter.m [new file with mode: 0644]
SOGo/UI/Mailer/UIxMailSortableTableHeader.m
SOGo/UI/Mailer/Version
SOGo/UI/Mailer/mailer.css

index fed1b2afca6d97d30b6b7aff2da634bd53d8b1fe..6e87c5bb90e3d42dda11c5a520864f68959ee95b 100644 (file)
@@ -1,3 +1,16 @@
+2005-01-28  Helge Hess  <helge.hess@skyrix.com>
+       
+       * v0.9.57
+       
+       * SOGoMailBodyPart.m: enhanced lookup to allow for arbitary filenames
+         being attached to a body-part name. Improves download behaviour.
+
+       * SOGoMailBaseObject.m, SOGoMailObject.m: moved
+         -isBodyPartKey:inContext: method to base object for reuse in
+         SOGoMailBodyPart
+
+       * SOGoMailBodyPart.m: minor code cleanup
+
 2005-01-26  Helge Hess  <helge.hess@skyrix.com>
        
        * v0.9.56
index ae5e3353c2a1e2ab07c70694721d6ed30dbaceb5..bc3c00317261064f64de49774a44f683fd710db8 100644 (file)
@@ -77,7 +77,11 @@ static NSString *sieveFolderName  = @"Filters";
     [self errorWithFormat:@"missing login in account folder name: %@", s];
     return nil;
   }
-
+  if ([s hasSuffix:@":80"]) { // HACK
+    [self logWithFormat:@"WARNING: incorrect value for IMAP4 URL: '%@'", s];
+    s = [s substringToIndex:([s length] - 3)];
+  }
+  
   s = [([self useSSL] ? @"imaps://" : @"imap://") stringByAppendingString:s];
   s = [s stringByAppendingString:@"/"];
   
index 8aca72f6affaf5d47e25eac9a09824cd5a3bf26e..ee8455e92cf6e678178d0cb0bc2af67b196487ff 100644 (file)
   SOGoMailBaseObject
   
   Common base class for mailer SoObjects.
+
+  Subclasses:
+    SOGoDraftObject
+    SOGoDraftsFolder
+    SOGoMailAccount
+    SOGoMailBodyPart
+    SOGoMailFolder
+    SOGoMailObject
 */
 
 @class NSString, NSArray, NSURL;
 
 - (void)flushMailCaches;
 
+/* IMAP4 names */
+
+- (BOOL)isBodyPartKey:(NSString *)_key inContext:(id)_ctx;
+
 @end
 
 #endif /* __Mailer_SOGoMailBaseObject_H__ */
index 1e72e8343355aacb25e4c6003f2ec786b63090ca..344ec6b740882d5160f6ad7413e76bc2bb3dfaa2 100644 (file)
@@ -144,6 +144,22 @@ static BOOL debugOn = YES;
   [[self mailManager] flushCachesForURL:[self imap4URL]];
 }
 
+/* IMAP4 names */
+
+- (BOOL)isBodyPartKey:(NSString *)_key inContext:(id)_ctx {
+  /*
+    Every key starting with a digit is consider an IMAP4 mime part key, used in
+    SOGoMailObject and SOGoMailBodyPart.
+  */
+  if ([_key length] == 0)
+    return NO;
+  
+  if (isdigit([_key characterAtIndex:0]))
+    return YES;
+  
+  return NO;
+}
+
 /* debugging */
 
 - (NSString *)loggingPrefix {
index 606f144222cf36bc3bd44a76b50413ed940a0665..815d78f5288248739af77f4a97e34d765218a197 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -28,7 +28,7 @@
   SOGoMailBodyPart
     Parent object: SOGoMailObject or SOGoMailBodyPart
     Child objects: SOGoMailBodyPart's
-    
+  
   Represents a MIME part of a mail as retrieved using IMAP4 body structure
   commands in NGImap4.
 */
index 366bd4436f4109ae4a5f0336e131cbfc8d56df8c..bc68c63739f07b008971a4fba59f6e067061eba7 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
   
   /* lookup body part */
   
-  if ((obj = [self lookupImap4BodyPartKey:_key inContext:_ctx]) != nil)
-    return obj;
+  if ([self isBodyPartKey:_key inContext:_ctx]) {
+    if ((obj = [self lookupImap4BodyPartKey:_key inContext:_ctx]) != nil)
+      return obj;
+  }
+  
+  /* 
+     Treat other keys which have a path-extension as 'virtual' noops to allow
+     addition of path names to the attachment path, eg:
+       http://.../login@server/INBOX/1/2/3/MyDocument.pdf
+  */
+  if ([[_key pathExtension] length] > 0)
+    return self;
   
   /* return 404 to stop acquisition */
   return [NSException exceptionWithHTTPStatus:404 /* Not Found */];
   
   mt = [_info valueForKey:@"type"];    if (![mt isNotNull]) return nil;
   st = [_info valueForKey:@"subtype"]; if (![st isNotNull]) return nil;
-
+  
   type = [NSMutableString stringWithCapacity:16];
-  [type appendString:mt];
+  [type appendString:[mt lowercaseString]];
   [type appendString:@"/"];
-  [type appendString:st];
+  [type appendString:[st lowercaseString]];
   
   parameters = [_info valueForKey:@"parameterList"];
   ke = [parameters keyEnumerator];
-  while ((pn = [ke nextObject])) {
+  while ((pn = [ke nextObject]) != nil) {
     [type appendString:@"; "];
     [type appendString:pn];
     [type appendString:@"=\""];
   return type;
 }
 
+- (NSString *)contentTypeForPathExtension:(NSString *)pe {
+  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";
+}
+
 - (NSString *)davContentType {
   // TODO: what about the content-type and other headers?
   //       => we could pass them in as the extension? (eg generate 1.gif!)
   /* construct type */
   
   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";
+  return [self contentTypeForPathExtension:pe];
 }
 
 /* actions */
index 58f8d759e362ca10055efb53f47e0e8421c52120..e35ad5d1d7ad3bf10be810c75ee57990104728e3 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __Mailer_SOGoMailObject_H__
 #define __Mailer_SOGoMailObject_H__
index f79ead811bf60e1e5fe13fc90ada6d3d2fc3d69b..4194cda3d8a5928a618194e90f24dc0608be8972 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "SOGoMailObject.h"
 #include "SOGoMailManager.h"
@@ -273,19 +272,6 @@ static BOOL heavyDebug = NO;
 
 /* name lookup */
 
-- (BOOL)isBodyPartKey:(NSString *)_key inContext:(id)_ctx {
-  /*
-    Every key starting with a digit is consider an IMAP4 mime part key.
-  */
-  if ([_key length] == 0)
-    return NO;
-  
-  if (isdigit([_key characterAtIndex:0]))
-    return YES;
-  
-  return NO;
-}
-
 - (id)lookupImap4BodyPartKey:(NSString *)_key inContext:(id)_ctx {
   // TODO: we might want to check for existence prior controller creation
   return [[[SOGoMailBodyPart alloc] initWithName:_key 
index 73743e4374acb02acf349d1c792db1d6f4cecc84..20b1dd206e45bdf89ca7a0c954817c1d103f2c2c 100644 (file)
@@ -1,6 +1,6 @@
 # Version file
 
-SUBMINOR_VERSION:=56
+SUBMINOR_VERSION:=57
 
 # v0.9.55 requires NGExtensions v4.5.136
 # v0.9.44 requires libNGMime    v4.3.194
index 4f979b4c082218f88ae18118c58702c84259966d..e76c3e97bfc48397d38d7f0b0edaf718ff3a1f98 100644 (file)
@@ -1,3 +1,15 @@
+2005-01-28  Helge Hess  <helge.hess@skyrix.com>
+
+       * v0.9.77
+
+       * added UIxMailSizeFormatter to render big file size numbers with some
+         M or K suffix
+
+       * UIxMailPartViewer.m: added methods to retrieve filename, file
+         extension and file size formatter
+
+       * UIxMailSortableTableHeader.m: minor code cleanups
+
 2005-01-27  Helge Hess  <helge.hess@skyrix.com>
 
        * started attachment (download) viewer (#1074) (v0.9.76)
index 39658678d053b36a7d8ee98e5835dfdd2c78290c..c9154123a7a346d7a889f23a3f0f0ecf1fc6c3c0 100644 (file)
@@ -45,6 +45,8 @@ MailerUI_OBJC_FILES += \
        \
        UIxFilterList.m                 \
        UIxSieveEditor.m                \
+       \
+       UIxMailSizeFormatter.m          \
 
 MailerUI_RESOURCE_FILES += \
        Version                 \
index 449d0aaa753cc05b373e3f159ad2db2372624c66..57a04567b1e451327d2fb353cc5add60e97a645f 100644 (file)
@@ -159,13 +159,17 @@ static NSArray *infoKeys = nil;
 }
 
 - (id)lookupSentFolder {
-  /* lookup INBOX/Sent folder */
+  /* 
+     Lookup INBOX/Sent folder. This must be in the UI layer, because the Sent
+     folder could be a user defined folder (so we cannot have a simple
+     -saveToSent action on the SOGoDraftObject).
+  */
   SOGoMailAccount *account;
   SOGoMailFolder  *folder;
-
+  
   if (self->sentFolder != nil)
     return self;
-
+  
   account = [[self clientObject] mailAccountFolder];
   if ([account isKindOfClass:[NSException class]]) return account;
   
index d545c4fba25c280015b1fc752ce83317fad91967..01f7b44d89c18e079e7d8a221f2ad2db67992ccf 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id: UIxMailMainFrame.m 278 2004-08-26 23:29:09Z helge $
 
 #include <SOGoUI/UIxComponent.h>
 
index d77f3e04057f0517cac64fc89dcab3974ef87cbb..1dc4b7d38bba78d1f0b27b49b496281381062c45 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
index 6b27fb39a2e317d26affc5c1cd345e44b6ab8883..b43395f0f35cfec871fd3dbd8667378f19de38a7 100644 (file)
 
 - (NSString *)pathToAttachment {
   NSString *url, *n;
+
+  /* path to mail controller object */
   
   url = [[self clientObject] baseURLInContext:[self context]];
   if (![url hasSuffix:@"/"]) url = [url stringByAppendingString:@"/"];
   
+  /* mail relative path to body-part */
+  
   n = [[self partPath] componentsJoinedByString:@"/"];
-  return [url stringByAppendingString:n];
+  url = [url stringByAppendingString:n];
+  
+  /* 
+     If we have an attachment name, we attach it, this is properly handled by
+     SOGoMailBodyPart.
+  */
+  
+  n = [[[self bodyInfo] valueForKey:@"parameterList"] valueForKey:@"name"];
+  if ([n isNotNull] && [n length] > 0) {
+    url = [url stringByAppendingString:@"/"];
+    url = [url stringByAppendingString:n];
+  }
+  else if ([(n = [[self bodyInfo] valueForKey:@"type"]) isNotNull]) {
+    /* attach extension */
+    url = [url stringByAppendingString:@"."];
+    url = [url stringByAppendingString:[self preferredPathExtension]];
+  }
+  
+  return url;
 }
 
 @end /* UIxMailPartLinkViewer */
index a516ec716da82b933fab3112f6783f013af7f818..6d1b89cd28bd489cfbe1a985a89c0000c823b6f0 100644 (file)
@@ -1,9 +1,36 @@
 <?xml version="1.0" standalone="yes"?>
 <div xmlns="http://www.w3.org/1999/xhtml"
      xmlns:var="http://www.skyrix.com/od/binding"
+     class="linked_attachment_frame"
 >
-  <a var:href="pathToAttachment"
-     var:title="bodyInfo"
-     class="mailer_imagecontent"
-     >[abc <var:string value="bodyInfo" />]</a>
+  <div class="linked_attachment_body">
+    <a var:href="pathToAttachment"
+       var:title="filenameForDisplay"
+       ><var:string value="filenameForDisplay" /></a>
+    <div class="linked_attachment_meta">
+      <var:string label:value="Type" />:
+      <var:string value="bodyInfo.type" /> / 
+      <var:string value="bodyInfo.subtype" />,
+
+      <var:string label:value="Size" />:
+      <var:string value="bodyInfo.size" formatter="sizeFormatter" />
+    </div>
+  
+<!-- debug
+    <a var:href="pathToAttachment"
+       var:title="bodyInfo"
+       class="mailer_imagecontent"
+       >[<var:string value="pathToAttachment" />]</a>
+    <br />
+    Id:      <var:string value="bodyInfo.bodyId" /><br />
+    Desc:    <var:string value="bodyInfo.description" /><br />
+    Enc:     <var:string value="bodyInfo.encoding" /><br />
+    Par:     <var:string value="bodyInfo.parameterList" /><br />
+    Size:    <var:string value="bodyInfo.size" /><br />
+    Type:    <var:string value="bodyInfo.type" /><br />
+    Subtype: <var:string value="bodyInfo.subtype" /><br />
+    Path:    <var:string value="pathToAttachment" /><br />
+    PartPath: <var:string value="partPath" /><br />
+-->
+  </div>
 </div>
index 990a40601249742c0d00a04eeb99047ee9424dfe..40370e4913d99a34afea3595d062f19fd32cfb41 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
 
 #include "UIxMailPartViewer.h"
 
+/*
+  UIxMailPartTextViewer
+
+  Show plain/text mail parts in a <pre> section.
+  
+  TODO: add server side wrapping.
+  TODO: add contained link detection.
+*/
+
 @interface UIxMailPartTextViewer : UIxMailPartViewer
 {
 }
 
 @implementation UIxMailPartTextViewer
 
-- (void)dealloc {
-  [super dealloc];
-}
-
-/* accessors */
-
 @end /* UIxMailPartTextViewer */
index 551085e722adf145fbb67fb76494c46f1f0491f9..bd0723df7c8635a64410d53c57297056355d903a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -30,7 +30,7 @@
   This class is the superclass for MIME content viewers.
 */
 
-@class NSData, NSArray;
+@class NSData, NSArray, NSFormatter;
 
 @interface UIxMailPartViewer : UIxComponent
 {
 - (NSData *)decodedFlatContent;
 - (NSString *)flatContentAsString;
 
+- (NSString *)preferredPathExtension;
+- (NSString *)filename;
+- (NSString *)filenameForDisplay;
+- (NSFormatter *)sizeFormatter;
+
 /* caches */
 
 - (void)resetPathCaches;
index c0889777704cc5ff09e53d21a329b29815bb6462..6a174ee0fa112b1fe1d0205a15c10c4ad24cbf2d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -21,6 +21,7 @@
 
 #include "UIxMailPartViewer.h"
 #include "UIxMailRenderingContext.h"
+#include "UIxMailSizeFormatter.h"
 #include "WOContext+UIxMailer.h"
 #include <NGExtensions/NSString+Encoding.h>
 #include "common.h"
@@ -29,8 +30,8 @@
 
 - (void)dealloc {
   [self->flatContent release];
-  [self->bodyInfo release];
-  [self->partPath release];
+  [self->bodyInfo    release];
+  [self->partPath    release];
   [super dealloc];
 }
 
   return s;
 }
 
+/* path extension */
+
+- (NSString *)pathExtensionForType:(NSString *)_mt subtype:(NSString *)_st {
+  // TODO: support /etc/mime.types
+  
+  if (![_mt isNotNull] || ![_st isNotNull])
+    return nil;
+  if ([_mt length] == 0) return nil;
+  if ([_st length] == 0) return nil;
+  _mt = [_mt lowercaseString];
+  _st = [_st lowercaseString];
+  
+  if ([_mt isEqualToString:@"image"]) {
+    if ([_st isEqualToString:@"gif"])  return @"gif";
+    if ([_st isEqualToString:@"jpeg"]) return @"jpg";
+    if ([_st isEqualToString:@"png"])  return @"png";
+  }
+  else if ([_mt isEqualToString:@"text"]) {
+    if ([_st isEqualToString:@"plain"]) return @"txt";
+    if ([_st isEqualToString:@"xml"])   return @"xml";
+  }
+  else if ([_mt isEqualToString:@"application"]) {
+    if ([_st isEqualToString:@"pdf"]) return @"pdf";
+  }
+  return nil;
+}
+
+- (NSString *)preferredPathExtension {
+  return [self pathExtensionForType:[[self bodyInfo] valueForKey:@"type"]
+              subtype:[[self bodyInfo] valueForKey:@"subtype"]];
+}
+
+- (NSString *)filename {
+  id tmp;
+  
+  tmp = [[self bodyInfo] valueForKey:@"parameterList"];
+  if (![tmp isNotNull])
+    return nil;
+  
+  tmp = [tmp valueForKey:@"name"];
+  if (![tmp isNotNull])
+    return nil;
+  
+  return [tmp length] > 0 ? tmp : nil;
+}
+
+- (NSString *)filenameForDisplay {
+  NSString *s;
+  
+  if ((s = [self filename]) != nil)
+    return s;
+
+  s = [[self partPath] componentsJoinedByString:@"-"];
+  return [@"untitled-" stringByAppendingString:s];
+}
+
+- (NSFormatter *)sizeFormatter {
+  return [UIxMailSizeFormatter sharedMailSizeFormatter];
+}
+
 @end /* UIxMailPartViewer */
diff --git a/SOGo/UI/Mailer/UIxMailSizeFormatter.h b/SOGo/UI/Mailer/UIxMailSizeFormatter.h
new file mode 100644 (file)
index 0000000..267fec0
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+  Copyright (C) 2005 SKYRIX Software AG
+
+  This file is part of OpenGroupware.org.
+
+  OGo is free software; you can redistribute it and/or modify it under
+  the terms of the GNU Lesser General Public License as published by the
+  Free Software Foundation; either version 2, or (at your option) any
+  later version.
+
+  OGo is distributed in the hope that it will be useful, but WITHOUT ANY
+  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+  License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with OGo; see the file COPYING.  If not, write to the
+  Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+  02111-1307, USA.
+*/
+
+#ifndef __Mailer_UIxMailSizeFormatter_H__
+#define __Mailer_UIxMailSizeFormatter_H__
+
+#include <Foundation/NSFormatter.h>
+
+/*
+  UIxMailSizeFormatter
+  
+  This class formats the size values for display.
+*/
+
+@interface UIxMailSizeFormatter : NSFormatter
+{
+}
+
++ (id)sharedMailSizeFormatter;
+
+@end
+
+#endif /* __Mailer_UIxMailSizeFormatter_H__ */
diff --git a/SOGo/UI/Mailer/UIxMailSizeFormatter.m b/SOGo/UI/Mailer/UIxMailSizeFormatter.m
new file mode 100644 (file)
index 0000000..34b3579
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+  Copyright (C) 2005 SKYRIX Software AG
+
+  This file is part of OpenGroupware.org.
+
+  OGo is free software; you can redistribute it and/or modify it under
+  the terms of the GNU Lesser General Public License as published by the
+  Free Software Foundation; either version 2, or (at your option) any
+  later version.
+
+  OGo is distributed in the hope that it will be useful, but WITHOUT ANY
+  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+  License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with OGo; see the file COPYING.  If not, write to the
+  Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+  02111-1307, USA.
+*/
+
+#include "UIxMailSizeFormatter.h"
+#include "common.h"
+
+@implementation UIxMailSizeFormatter
+
++ (id)sharedMailSizeFormatter {
+  static UIxMailSizeFormatter *fmt = nil; // THREAD
+  if (fmt == nil) fmt = [[self alloc] init];
+  return fmt;
+}
+
+/* formatting */
+
+- (NSString *)stringForSize:(unsigned int)size {
+  unsigned char buf[128];
+  
+  if (size < 1024)
+    sprintf(buf, "%d", size);
+  else if (size < 1024 * 1024)
+    sprintf(buf, "%.1fK", ((double)size / 1024));
+  else
+    sprintf(buf, "%.1fM", ((double)size / 1024 / 1024));
+  
+  return [NSString stringWithCString:buf];
+}
+
+- (NSString *)stringForObjectValue:(id)_object {
+  return [self stringForSize:[_object unsignedIntValue]];
+}
+
+@end /* UIxMailSizeFormatter */
index 00781f7aae83c801c041bcdf78364dd6976a797f..5e004cfd961c28da464c48661a4be6005b46c10f 100644 (file)
@@ -1,7 +1,7 @@
 /*
- Copyright (C) 2000-2004 SKYRIX Software AG
+ Copyright (C) 2004-2005 SKYRIX Software AG
  
- This file is part of OGo
+ This file is part of OpenGroupware.org.
  
  OGo is free software; you can redistribute it and/or modify it under
  the terms of the GNU Lesser General Public License as published by the
  License along with OGo; see the file COPYING.  If not, write to the
  Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  02111-1307, USA.
- */
-// $Id$
-
+*/
 
 #include <NGObjWeb/NGObjWeb.h>
 
+/*
+  UIxMailSortableTableHeader
+
+  TODO: document.
+*/
+
 @interface UIxMailSortableTableHeader : WOComponent
 {
   NSString     *label;
 /* Accessors */
 
 - (void)setLabel:(NSString *)_label {
-  ASSIGN(self->label, _label);
+  ASSIGNCOPY(self->label, _label);
 }
 - (NSString *)label {
   return self->label;
 }
 
 - (void)setSortKey:(NSString *)_sortKey {
-  ASSIGN(self->sortKey, _sortKey);
+  ASSIGNCOPY(self->sortKey, _sortKey);
 }
 - (NSString *)sortKey {
   return self->sortKey;
 }
 
 - (void)setHref:(NSString *)_href {
-  ASSIGN(self->href, _href);
+  ASSIGNCOPY(self->href, _href);
 }
 - (NSString *)href {
   return self->href;
 
 - (BOOL)isSelected {
   NSString *so;
+  
   so = [self->queryDictionary objectForKey:@"sort"];
-  if(!so) {
+  if (![so isNotNull])
     return self->isDefault;
-  }
+  
   return [so isEqualToString:self->sortKey];
 }
 
   NSString *desc;
   
   desc = [self->queryDictionary objectForKey:@"desc"];
-  if(!desc)
+  if (desc == nil)
     return NO;
-  return [desc boolValue] ? YES : NO;
+  return [desc boolValue];
 }
 
-@end
+@end /* UIxMailSortableTableHeader */
index b4ba3132d5e2585ffa1f4f0f88e99c73b83f3e95..733f93ecec63d68432a562f0d37febcbdc8e33fa 100644 (file)
@@ -1,7 +1,8 @@
 # version file
 
-SUBMINOR_VERSION:=76
+SUBMINOR_VERSION:=77
 
+# v0.9.77 requires SoObjects/Mailer v0.9.57
 # v0.9.74 requires SoObjects/Mailer v0.9.56
 # v0.9.70 requires NGExtensions     v4.5.136
 # v0.9.69 requires libNGMime        v4.5.203
index fd9142a70b5d5d203ea8be8594a3a989b062e84d..bc6bb1f75a2530d88ab10cda3cf1d95e8b6c791b 100644 (file)
@@ -395,3 +395,30 @@ td.attachment_uplabel {
   font-size:  11px;
   text-align: left;
 }
+
+/* attachment link viewer */
+
+div.linked_attachment_frame {
+  background-color: #D4D0C8;
+  padding:          4px;
+}
+
+div.linked_attachment_body {
+  font-family:  Arial, Helvetica, Verdana, Geneva, Tahoma, sans-serif;
+  font-size:    10pt;
+  padding:             4px;
+
+  border-width:        1;
+  border-style:        solid;
+  border-top-color:    white;
+  border-left-color:   white;
+  border-bottom-color: #808080;
+  border-right-color:  #808080;
+}
+
+div.linked_attachment_meta {
+  color:        #444444;
+  font-style:   italic;
+  border-width: 0;
+  padding:      2px;
+}