From 828d3b2818c5cd63bee362b9bb77e2647a5365e5 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 11 Apr 2007 19:07:54 +0000 Subject: [PATCH] Monotone-Parent: 1b89ce2fe004930400d04b4bed9edb04d4d4fa82 Monotone-Revision: c33c456b52c6e6d4ee1f29bfd9ca57096b8d13be Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2007-04-11T19:07:54 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 + SoObjects/SOGo/SOGoUser.h | 27 ++++--- SoObjects/SOGo/SOGoUser.m | 145 ++++++++++++++++++++++++++++---------- 3 files changed, 129 insertions(+), 46 deletions(-) diff --git a/ChangeLog b/ChangeLog index b25a4d9e2..c1e8800e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2007-04-11 Wolfgang Sourdeau + * SoObjects/SOGo/SOGoUser.m ([SOGoUser -timeZone]): method moved + from SOGoObject.m. + * SoObjects/SOGo/SOGoObject.m: new ivar "context" that permits every subclass to access [WOApplication context] without having to invoke it more than once. diff --git a/SoObjects/SOGo/SOGoUser.h b/SoObjects/SOGo/SOGoUser.h index 62dc2ed9c..7089cb61a 100644 --- a/SoObjects/SOGo/SOGoUser.h +++ b/SoObjects/SOGo/SOGoUser.h @@ -43,31 +43,38 @@ NSString *email; NSUserDefaults *userDefaults; NSUserDefaults *userSettings; + NSTimeZone *userTimeZone; } ++ (SOGoUser *) userWithLogin: (NSString *) login + andRoles: (NSArray *) roles; + /* properties */ -- (NSString *)email; -- (NSString *)cn; -- (NSURL *)freeBusyURL; +- (NSString *) email; +- (NSString *) cn; +- (NSURL *) freeBusyURL; /* shares and identities */ -- (NSString *)primaryIMAP4AccountString; -- (NSString *)primaryMailServer; -- (NSArray *)additionalIMAP4AccountStrings; -- (NSArray *)additionalEMailAddresses; -- (NSDictionary *)additionalIMAP4AccountsAndEMails; +- (NSString *) primaryIMAP4AccountString; +- (NSString *) primaryMailServer; +- (NSArray *) additionalIMAP4AccountStrings; +- (NSArray *) additionalEMailAddresses; +- (NSDictionary *) additionalIMAP4AccountsAndEMails; /* defaults */ - (NSUserDefaults *) userDefaults; - (NSUserDefaults *) userSettings; +- (NSTimeZone *) timeZone; +- (NSTimeZone *) serverTimeZone; + /* folders */ -- (id)homeFolderInContext:(id)_ctx; -- (id)schedulingCalendarInContext:(id)_ctx; +- (id) homeFolderInContext: (id) _ctx; +- (id) schedulingCalendarInContext: (id) _ctx; - (NSArray *) rolesForObject: (NSObject *) object inContext: (WOContext *) context; diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index 6d863d530..e10b9931c 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -26,17 +26,43 @@ #import "SOGoUser.h" +static NSTimeZone *serverTimeZone = nil; + @interface NSObject (SOGoRoles) -- (NSString *) roleOfUser: (NSString *) uid - inContext: (WOContext *) context; -- (NSArray *) rolesOfUser: (NSString *) uid - inContext: (WOContext *) context; +- (NSString *) roleOfUser: (NSString *) uid; +- (NSArray *) rolesOfUser: (NSString *) uid; @end @implementation SOGoUser ++ (void) initialize +{ + NSString *tzName; + + if (!serverTimeZone) + { + tzName = [[NSUserDefaults standardUserDefaults] + stringForKey: @"SOGoServerTimeZone"]; + if (!tzName) + tzName = @"Canada/Eastern"; + serverTimeZone = [NSTimeZone timeZoneWithName: tzName]; + [serverTimeZone retain]; + } +} + ++ (SOGoUser *) userWithLogin: (NSString *) login + andRoles: (NSArray *) roles +{ + SOGoUser *user; + + user = [[self alloc] initWithLogin: login roles: roles]; + [user autorelease]; + + return user; +} + - (id) init { if ((self = [super init])) @@ -48,56 +74,77 @@ return self; } -- (void)dealloc { - [self->userDefaults release]; - [self->userSettings release]; - [self->cn release]; - [self->email release]; +- (void) dealloc +{ + [userDefaults release]; + [userSettings release]; + [cn release]; + [email release]; [super dealloc]; } /* internals */ -- (AgenorUserManager *)userManager { +- (AgenorUserManager *) userManager +{ static AgenorUserManager *um = nil; if (um == nil) um = [[AgenorUserManager sharedUserManager] retain]; + return um; } /* properties */ -- (NSString *)email { - if (self->email == nil) - self->email = [[[self userManager] getEmailForUID:[self login]] copy]; - return self->email; +- (NSString *) email +{ + if (email == nil) + { + email = [[self userManager] getEmailForUID: [self login]]; + [email retain]; + } + + return email; } -- (NSString *)cn { - if (self->cn == nil) - self->cn = [[[self userManager] getCNForUID:[self login]] copy]; - return self->cn; +- (NSString *) cn +{ + if (cn == nil) + { + cn = [[self userManager] getCNForUID: [self login]]; + [cn retain]; + } + + return cn; } -- (NSString *)primaryIMAP4AccountString { - return [[self userManager] getIMAPAccountStringForUID:[self login]]; -} -- (NSString *)primaryMailServer { - return [[self userManager] getServerForUID:[self login]]; +- (NSString *) primaryIMAP4AccountString +{ + return [[self userManager] getIMAPAccountStringForUID: [self login]]; } -- (NSArray *)additionalIMAP4AccountStrings { - return [[self userManager]getSharedMailboxAccountStringsForUID:[self login]]; -} -- (NSArray *)additionalEMailAddresses { - return [[self userManager] getSharedMailboxEMailsForUID:[self login]]; +- (NSString *) primaryMailServer +{ + return [[self userManager] getServerForUID: [self login]]; } -- (NSDictionary *)additionalIMAP4AccountsAndEMails { - return [[self userManager] getSharedMailboxesAndEMailsForUID:[self login]]; +- (NSArray *) additionalIMAP4AccountStrings +{ + return [[self userManager]getSharedMailboxAccountStringsForUID: [self login]]; } -- (NSURL *)freeBusyURL { - return [[self userManager] getFreeBusyURLForUID:[self login]]; +- (NSArray *) additionalEMailAddresses +{ + return [[self userManager] getSharedMailboxEMailsForUID: [self login]]; +} + +- (NSDictionary *) additionalIMAP4AccountsAndEMails +{ + return [[self userManager] getSharedMailboxesAndEMailsForUID: [self login]]; +} + +- (NSURL *) freeBusyURL +{ + return [[self userManager] getFreeBusyURLForUID: [self login]]; } /* defaults */ @@ -124,12 +171,37 @@ return userSettings; } +- (NSTimeZone *) timeZone +{ + NSString *timeZoneName; + + if (!userTimeZone) + { + timeZoneName = [[self userDefaults] stringForKey: @"TimeZone"]; + if ([timeZoneName length] > 0) + userTimeZone = [NSTimeZone timeZoneWithName: timeZoneName]; + else + userTimeZone = nil; + if (!userTimeZone) + userTimeZone = [self serverTimeZone]; + [userTimeZone retain]; + } + + return userTimeZone; +} + +- (NSTimeZone *) serverTimeZone +{ + return serverTimeZone; +} + /* folders */ // TODO: those methods should check whether the traversal stack in the context // already contains proper folders to improve caching behaviour -- (id)homeFolderInContext:(id)_ctx { +- (id) homeFolderInContext: (id) _ctx +{ /* Note: watch out for cyclic references */ // TODO: maybe we should add an [activeUser reset] method to SOPE id folder; @@ -148,7 +220,8 @@ return folder; } -- (id)schedulingCalendarInContext:(id)_ctx { +- (id) schedulingCalendarInContext: (id) _ctx +{ /* Note: watch out for cyclic references */ id folder; @@ -196,13 +269,13 @@ } if ([object respondsToSelector: @selector (rolesOfUser:inContext:)]) { - sogoRoles = [object rolesOfUser: login inContext: context]; + sogoRoles = [object rolesOfUser: login]; if (sogoRoles) [rolesForObject addObjectsFromArray: sogoRoles]; } if ([object respondsToSelector: @selector (roleOfUser:inContext:)]) { - role = [object roleOfUser: login inContext: context]; + role = [object roleOfUser: login]; if (role) [rolesForObject addObject: role]; }