Fixing the mess that is message flags

This commit is contained in:
local@mronge.local
2007-07-22 01:29:32 -07:00
parent 005b7b5d42
commit cf5a12ddbc
4 changed files with 30 additions and 65 deletions
+3 -3
View File
@@ -5,12 +5,12 @@
//TODO Document me
@interface CTBareMessage : NSObject {
NSString *mUid;
NSUInteger mFlags;
unsigned int mFlags;
}
@property(retain) NSString *uid;
@property NSUInteger flags;
@property unsigned int flags;
- (id)init;
- (NSUInteger)hash;
- (unsigned int)hash;
- (BOOL)isEqual:(id)anObject;
@end
+13 -5
View File
@@ -141,17 +141,25 @@
- (void)unsubscribe;
/*!
@abstract Returns an NSDictionary of message flags, every flag is either marked as CTFlagSet or CTFlagNotSet. Here is a list of message flags: CTFlagNew, CTFlagSeen, CTFlagFlagged, CTFlagDeleted, CTFlagAnswered, CTFlagForwarded. Those are the keys you should use on the dictionary that is returned.
@abstract Returns the message flags. You must AND/OR using the defines constants.
Here is a list of message flags:
CTFlagNew, CTFlagSeen, CTFlagFlagged, CTFlagDeleted,
CTFlagAnswered, CTFlagForwarded.
*/
- (NSDictionary *)flagsForMessage:(CTCoreMessage *)msg;
- (unsigned int)flagsForMessage:(CTCoreMessage *)msg;
/*!
@abstract Sets the message's flags on the server, take a look at the documentation for the flags: for more information.
@abstract Sets the message's flags on the server, take a look at the
documentation for flagsForMessage:
*/
- (void)setFlags:(NSDictionary *)flags forMessage:(CTCoreMessage *)msg;
- (void)setFlags:(unsigned int)flags forMessage:(CTCoreMessage *)msg;
/*!
@astract Deletes all messages contained in the folder that are marked for deletion. Deleting messages in IMAP is a little strange, first you need to set the message flag CTFlagDeleted to CTFlagSet, and then when you call expunge on the folder the message is contained in, it will be deleted.
@astract Deletes all messages contained in the folder that are marked for
deletion. Deleting messages in IMAP is a little strange, first
you need to set the message flag CTFlagDeleted to CTFlagSet, and
then when you call expunge on the folder the message is contained
in, it will be deleted.
*/
- (void)expunge;
+5 -47
View File
@@ -6,7 +6,6 @@
#import "CTBareMessage.h"
@interface CTCoreFolder (Private)
- (NSDictionary *)_createFlagDictionary:(struct mail_flags *)flagStruct;
@end
@implementation CTCoreFolder
@@ -552,7 +551,7 @@
By not including these methods, CTCoreMessage doesn't depend on CTCoreFolder anymore. CTCoreFolder
already depends on CTCoreMessage so we aren't adding any dependencies here. */
- (NSDictionary *)flagsForMessage:(CTCoreMessage *)msg {
- (unsigned int)flagsForMessage:(CTCoreMessage *)msg {
int err;
struct mail_flags *flagStruct;
err = mailmessage_get_flags([msg messageStruct], &flagStruct);
@@ -563,28 +562,14 @@
userInfo:nil];
[exception raise];
}
return [self _createFlagDictionary:flagStruct];
return flagStruct->fl_flags;
}
- (void)setFlags:(NSDictionary *)flags forMessage:(CTCoreMessage *)msg {
- (void)setFlags:(unsigned int)flags forMessage:(CTCoreMessage *)msg {
int err;
uint32_t msgFlags = 0;
if ([[flags objectForKey:CTFlagNew] isEqual:CTFlagSet])
msgFlags = msgFlags | MAIL_FLAG_NEW;
if ([[flags objectForKey:CTFlagSeen] isEqual:CTFlagSet])
msgFlags = msgFlags | MAIL_FLAG_SEEN;
if ([[flags objectForKey:CTFlagFlagged] isEqual:CTFlagSet])
msgFlags = msgFlags | MAIL_FLAG_FLAGGED;
if ([[flags objectForKey:CTFlagDeleted] isEqual:CTFlagSet])
msgFlags = msgFlags | MAIL_FLAG_DELETED;
if ([[flags objectForKey:CTFlagAnswered] isEqual:CTFlagSet])
msgFlags = msgFlags | MAIL_FLAG_ANSWERED;
if ([[flags objectForKey:CTFlagForwarded] isEqual:CTFlagSet])
msgFlags = msgFlags | MAIL_FLAG_FORWARDED;
[msg messageStruct]->msg_flags->fl_flags=msgFlags;
[msg messageStruct]->msg_flags->fl_flags=flags;
err = mailmessage_check([msg messageStruct]);
if (err != MAILIMAP_NO_ERROR) {
NSException *exception = [NSException
@@ -667,33 +652,6 @@
return data->imap_session;
}
- (NSDictionary *)_createFlagDictionary:(struct mail_flags *)flagStruct {
NSMutableDictionary *theFlags = [NSMutableDictionary dictionaryWithObjectsAndKeys:CTFlagNotSet,CTFlagNew,
CTFlagNotSet,CTFlagSeen,CTFlagNotSet,CTFlagFlagged,CTFlagNotSet,CTFlagDeleted,CTFlagNotSet,CTFlagAnswered,
CTFlagNotSet,CTFlagForwarded,CTFlagNotSet,CTFlagCancelled,nil];
if (flagStruct == NULL)
return theFlags;
uint32_t msgFlags = flagStruct->fl_flags;
if (msgFlags & MAIL_FLAG_NEW)
[theFlags setObject:CTFlagSet forKey:CTFlagNew];
if (msgFlags & MAIL_FLAG_SEEN)
[theFlags setObject:CTFlagSet forKey:CTFlagSeen];
if (msgFlags & MAIL_FLAG_FLAGGED)
[theFlags setObject:CTFlagSet forKey:CTFlagFlagged];
if (msgFlags & MAIL_FLAG_DELETED)
[theFlags setObject:CTFlagSet forKey:CTFlagDeleted];
if (msgFlags & MAIL_FLAG_ANSWERED)
[theFlags setObject:CTFlagSet forKey:CTFlagAnswered];
if (msgFlags & MAIL_FLAG_FORWARDED)
[theFlags setObject:CTFlagSet forKey:CTFlagForwarded];
//TODO Implement advanced flags
return theFlags;
}
/* From Libetpan source */
int uid_list_to_env_list(clist * fetch_result, struct mailmessage_list ** result,
mailsession * session, mailmessage_driver * driver) {
+9 -10
View File
@@ -2,17 +2,16 @@
/* = List of Message Flags = */
/* ========================= */
#define CTFlagNew @"NEW"
#define CTFlagSeen @"SEEN"
#define CTFlagFlagged @"FLAGGED"
#define CTFlagDeleted @"DELETED"
#define CTFlagAnswered @"ANSWERED"
#define CTFlagForwarded @"FORWARDED"
#define CTFlagCancelled @"CANCELLED"
#define CTFlagExtensions @"EXTENSIONS"
//TODO Turn these into extern's, not defines
#define CTFlagNew MAIL_FLAG_NEW
#define CTFlagSeen MAIL_FLAG_SEEN
#define CTFlagFlagged MAIL_FLAG_FLAGGED
#define CTFlagDeleted MAIL_FLAG_DELETED
#define CTFlagAnswered MAIL_FLAG_ANSWERED
#define CTFlagForwarded MAIL_FLAG_FORWARDED
#define CTFlagCancelled MAIL_FLAG_CANCELLED
#define CTFlagSet @"SET"
#define CTFlagNotSet @"NOT_SET"
/* =========================== */
/* = List of Exception Types = */