object.
*/
-#define messagesPerPage 50
-
-#include "common.h"
-#include <SoObjects/Mailer/SOGoMailFolder.h>
-#include <SoObjects/Mailer/SOGoMailObject.h>
-#include <NGObjWeb/SoObject+SoDAV.h>
+#import <Foundation/NSCalendarDate.h>
+#import <Foundation/NSDictionary.h>
+#import <Foundation/NSValue.h>
+#import <NGObjWeb/WOResponse.h>
+#import <NGObjWeb/WORequest.h>
+#import <NGObjWeb/SoObject+SoDAV.h>
+#import <NGObjWeb/NSException+HTTP.h>
+#import <NGExtensions/NSNull+misc.h>
+#import <NGExtensions/NSString+misc.h>
+
+#import <EOControl/EOQualifier.h>
+
+#import <SoObjects/Mailer/SOGoMailFolder.h>
+#import <SoObjects/Mailer/SOGoMailObject.h>
+#import <SoObjects/SOGo/SOGoDateFormatter.h>
+#import <SoObjects/SOGo/SOGoUser.h>
#import "UIxMailListView.h"
+#define messagesPerPage 50
static int attachmentFlagSize = 8096;
@implementation UIxMailListView
-- (void) dealloc
+- (id) init
{
- [self->qualifier release];
- [self->sortedUIDs release];
- [self->messages release];
- [self->message release];
- [super dealloc];
-}
+ SOGoUser *user;
-/* notifications */
+ if ((self = [super init]))
+ {
+ qualifier = nil;
+ user = [context activeUser];
+ ASSIGN (dateFormatter, [user dateFormatterInContext: context]);
+ ASSIGN (userTimeZone, [user timeZone]);
+ }
+
+ return self;
+}
-- (void) sleep
+- (void) dealloc
{
- [self->qualifier release]; self->qualifier = nil;
- [self->sortedUIDs release]; self->sortedUIDs = nil;
- [self->messages release]; self->messages = nil;
- [self->message release]; self->message = nil;
- [super sleep];
+ [qualifier release];
+ [sortedUIDs release];
+ [messages release];
+ [message release];
+ [dateFormatter release];
+ [userTimeZone release];
+ [super dealloc];
}
/* accessors */
-- (void)setMessage:(id)_msg
+- (void) setMessage: (id) _msg
{
- ASSIGN(self->message, _msg);
+ ASSIGN(message, _msg);
}
- (id) message
{
- return self->message;
+ return message;
}
-- (void) setQualifier: (EOQualifier *) _msg
+- (NSString *) messageDate
{
- ASSIGN(self->qualifier, _msg);
-}
+ NSCalendarDate *messageDate;
-- (EOQualifier *) qualifier
-{
- return self->qualifier;
+ messageDate = [[message valueForKey: @"envelope"] date];
+ [messageDate setTimeZone: userTimeZone];
+
+ return [dateFormatter formattedDateAndTime: messageDate];
}
- (BOOL) showToAddress
return [[[self message] valueForKey:@"uid"] stringValue];
}
-- (NSString *) messageCellStyleClass
+- (NSString *) messageRowStyleClass
{
return [self isMessageDeleted]
? @"mailer_listcell_deleted"
- (NSString *) messageSubjectCellStyleClass
{
- return [NSString stringWithFormat: @"%@ %@",
- [self messageCellStyleClass],
- ([self isMessageRead]
- ? @"mailer_readmailsubject"
- : @"mailer_unreadmailsubject")];
+ return ([self isMessageRead]
+ ? @"mailer_readmailsubject"
+ : @"mailer_unreadmailsubject");
}
- (BOOL) hasMessageAttachment
/* Note: see SOGoMailManager.m for allowed IMAP4 keys */
static NSArray *keys = nil;
if (keys == nil) {
- keys = [[NSArray alloc] initWithObjects:
+ keys = [[NSArray alloc] initWithObjects: @"UID",
@"FLAGS", @"ENVELOPE", @"RFC822.SIZE", nil];
}
return keys;
- (NSString *) defaultSortKey
{
- return @"DATE";
+ return @"ARRIVAL";
}
- (NSString *) imap4SortKey
{
NSString *sort;
- sort = [[[self context] request] formValueForKey:@"sort"];
+ sort = [[context request] formValueForKey: @"sort"];
- if ([sort length] == 0)
+ if (![sort length])
sort = [self defaultSortKey];
return [sort uppercaseString];
}
-- (BOOL) isSortedDescending
-{
- NSString *desc;
-
- desc = [[[self context] request] formValueForKey:@"desc"];
-
- return ((desc)
- ? [desc boolValue]
- : YES);
-}
-
- (NSString *) imap4SortOrdering
{
- NSString *sort;
+ NSString *sort, *ascending;
sort = [self imap4SortKey];
- if ([self isSortedDescending])
+ ascending = [[context request] formValueForKey: @"asc"];
+ if (![ascending boolValue])
sort = [@"REVERSE " stringByAppendingString: sort];
return sort;
- (NSRange) fetchRange
{
- if (self->firstMessageNumber == 0)
+ if (firstMessageNumber == 0)
return NSMakeRange(0, messagesPerPage);
- return NSMakeRange(self->firstMessageNumber - 1, messagesPerPage);
+ return NSMakeRange(firstMessageNumber - 1, messagesPerPage);
}
- (NSArray *) sortedUIDs
{
if (!sortedUIDs)
{
- sortedUIDs
- = [[self clientObject] fetchUIDsMatchingQualifier: [self qualifier]
- sortOrdering: [self imap4SortOrdering]];
+ sortedUIDs
+ = [[self clientObject] fetchUIDsMatchingQualifier: qualifier
+ sortOrdering: [self imap4SortOrdering]];
[sortedUIDs retain];
}
- return self->sortedUIDs;
+ return sortedUIDs;
}
- (unsigned int) totalMessageCount
{
- return [self->sortedUIDs count];
+ return [sortedUIDs count];
}
- (BOOL) showsAllMessages
NSRange r;
unsigned len;
- if (self->messages != nil)
- return self->messages;
-
+ 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];
- msgs = [[self clientObject] fetchUIDs:uids parts:[self fetchKeys]];
- self->messages = [[msgs valueForKey:@"fetch"] retain];
- return self->messages;
+ msgs = [[self clientObject] fetchUIDs: uids parts: [self fetchKeys]];
+ messages = [[msgs valueForKey: @"fetch"] retain];
+
+ return messages;
}
/* URL processing */
{
NSString *uid;
- if ((uid = [[[self context] request] formValueForKey:@"uid"]) == nil)
+ if ((uid = [[context request] formValueForKey: @"uid"]) == nil)
return nil;
- return [[self clientObject] lookupName:uid inContext:[self context]
- acquire:NO];
+ return [[self clientObject] lookupName: uid
+ inContext: context
+ acquire: NO];
}
/* actions */
- (BOOL) isJavaScriptRequest
{
- return [[[[self context] request] formValueForKey:@"jsonly"] boolValue];
+ return [[[context request] formValueForKey:@"jsonly"] boolValue];
}
- (id) javaScriptOK
{
WOResponse *r;
- r = [[self context] response];
+ r = [context response];
[r setStatus:200 /* OK */];
return r;
}
return firstMessage;
}
+- (void) _setQualifierForCriteria: (NSString *) criteria
+ andValue: (NSString *) value
+{
+ [qualifier release];
+
+ if ([criteria isEqualToString: @"subject"])
+ qualifier = [EOQualifier qualifierWithQualifierFormat:
+ @"(subject doesContain: %@)",
+ value];
+ else if ([criteria isEqualToString: @"sender"])
+ qualifier = [EOQualifier qualifierWithQualifierFormat:
+ @"(from doesContain: %@)",
+ value];
+ else if ([criteria isEqualToString: @"subject_or_sender"])
+ qualifier = [EOQualifier qualifierWithQualifierFormat:
+ @"(subject doesContain: %@) OR "
+ @"(from doesContain: %@)",
+ value, value];
+ else if ([criteria isEqualToString: @"to_or_cc"])
+ qualifier = [EOQualifier qualifierWithQualifierFormat:
+ @"(to doesContain: %@) OR "
+ @"(cc doesContain: %@)",
+ value, value];
+ else if ([criteria isEqualToString: @"entire_message"])
+ qualifier = [EOQualifier qualifierWithQualifierFormat:
+ @"(message doesContain: %@)",
+ value];
+ else
+ qualifier = nil;
+
+ [qualifier retain];
+}
+
- (id) defaultAction
{
WORequest *request;
- NSString *specificMessage;
+ NSString *specificMessage, *searchCriteria, *searchValue;
- request = [[self context] request];
+ request = [context request];
[[self clientObject] flushMailCaches];
specificMessage = [request formValueForKey: @"pageforuid"];
- self->firstMessageNumber
+ searchCriteria = [request formValueForKey: @"search"];
+ searchValue = [request formValueForKey: @"value"];
+ if ([searchCriteria length] > 0
+ && [searchValue length] > 0)
+ [self _setQualifierForCriteria: searchCriteria
+ andValue: searchValue];
+
+ firstMessageNumber
= ((specificMessage)
? [self firstMessageOfPageFor: [specificMessage intValue]]
: [[request formValueForKey:@"idx"] intValue]);
{
// TODO: we might want to flush the caches?
NSException *error;
- id client;
-
- if ((client = [self clientObject]) == nil) {
- return [NSException exceptionWithHTTPStatus:404 /* Not Found */
- reason:@"did not find mail folder"];
- }
-
- if ((error = [[self clientObject] expunge]) != nil)
- return error;
+ id clientObject;
+
+ clientObject = [self clientObject];
+ if (clientObject)
+ {
+ error = [clientObject expunge];
+ if (!error)
+ {
+ if ([clientObject respondsToSelector: @selector(flushMailCaches)])
+ [clientObject flushMailCaches];
+ return [self redirectToLocation:@"view"];
+ }
+ }
+ else
+ error = [NSException exceptionWithHTTPStatus:404 /* Not Found */
+ reason: @"did not find mail folder"];
- if ([client respondsToSelector:@selector(flushMailCaches)])
- [client flushMailCaches];
- return [self redirectToLocation:@"view"];
+ return error;
}
@end