]> err.no Git - scalable-opengroupware.org/blobdiff - SOGo/UI/SOGoUI/UIxComponent.m
minor cleanups
[scalable-opengroupware.org] / SOGo / UI / SOGoUI / UIxComponent.m
index e581e5a577c7394e613d6d19e0aa1f4e694834e0..246ccc22fe978449b12b7317246e3c8ff00388ca 100644 (file)
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
-
 
 #include "UIxComponent.h"
-#include <Foundation/Foundation.h>
-#include <NGObjWeb/NGObjWeb.h>
-#include <NGExtensions/NGExtensions.h>
-
+#include "SOGoJSStringFormatter.h"
+#include "common.h"
+#include <NGObjWeb/SoHTTPAuthenticator.h>
 
 @interface UIxComponent (PrivateAPI)
 - (void)_parseQueryString:(NSString *)_s;
+- (NSMutableDictionary *)_queryParameters;
 @end
 
-
 @implementation UIxComponent
 
 static NSTimeZone *MET = nil;
 static NSTimeZone *GMT = nil;
 
-static NSMutableArray *dayLabelKeys = nil;
-static NSMutableArray *abbrDayLabelKeys = nil;
-static NSMutableArray *monthLabelKeys = nil;
+static NSMutableArray *dayLabelKeys       = nil;
+static NSMutableArray *abbrDayLabelKeys   = nil;
+static NSMutableArray *monthLabelKeys     = nil;
 static NSMutableArray *abbrMonthLabelKeys = nil;
 
 static BOOL uixDebugEnabled = NO;
 
 + (void)initialize {
-    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
+  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
     
-    uixDebugEnabled = [ud boolForKey:@"SOGoUIxDebugEnabled"];
+  uixDebugEnabled = [ud boolForKey:@"SOGoUIxDebugEnabled"];
 
-    if (MET == nil) {
-        MET = [[NSTimeZone timeZoneWithAbbreviation:@"MET"] retain];
-        GMT = [[NSTimeZone timeZoneWithAbbreviation:@"GMT"] retain];
-    }
-    if (dayLabelKeys == nil) {
-        dayLabelKeys = [[NSMutableArray alloc] initWithCapacity:7];
-        [dayLabelKeys addObject:@"Sunday"];
-        [dayLabelKeys addObject:@"Monday"];
-        [dayLabelKeys addObject:@"Tuesday"];
-        [dayLabelKeys addObject:@"Wednesday"];
-        [dayLabelKeys addObject:@"Thursday"];
-        [dayLabelKeys addObject:@"Friday"];
-        [dayLabelKeys addObject:@"Saturday"];
-
-        abbrDayLabelKeys = [[NSMutableArray alloc] initWithCapacity:7];
-        [abbrDayLabelKeys addObject:@"a2_Sunday"];
-        [abbrDayLabelKeys addObject:@"a2_Monday"];
-        [abbrDayLabelKeys addObject:@"a2_Tuesday"];
-        [abbrDayLabelKeys addObject:@"a2_Wednesday"];
-        [abbrDayLabelKeys addObject:@"a2_Thursday"];
-        [abbrDayLabelKeys addObject:@"a2_Friday"];
-        [abbrDayLabelKeys addObject:@"a2_Saturday"];
-
-        monthLabelKeys = [[NSMutableArray alloc] initWithCapacity:12];
-        [monthLabelKeys addObject:@"January"];
-        [monthLabelKeys addObject:@"February"];
-        [monthLabelKeys addObject:@"March"];
-        [monthLabelKeys addObject:@"April"];
-        [monthLabelKeys addObject:@"May"];
-        [monthLabelKeys addObject:@"June"];
-        [monthLabelKeys addObject:@"July"];
-        [monthLabelKeys addObject:@"August"];
-        [monthLabelKeys addObject:@"September"];
-        [monthLabelKeys addObject:@"October"];
-        [monthLabelKeys addObject:@"November"];
-        [monthLabelKeys addObject:@"December"];
-
-        abbrMonthLabelKeys = [[NSMutableArray alloc] initWithCapacity:12];
-        [abbrMonthLabelKeys addObject:@"a3_January"];
-        [abbrMonthLabelKeys addObject:@"a3_February"];
-        [abbrMonthLabelKeys addObject:@"a3_March"];
-        [abbrMonthLabelKeys addObject:@"a3_April"];
-        [abbrMonthLabelKeys addObject:@"a3_May"];
-        [abbrMonthLabelKeys addObject:@"a3_June"];
-        [abbrMonthLabelKeys addObject:@"a3_July"];
-        [abbrMonthLabelKeys addObject:@"a3_August"];
-        [abbrMonthLabelKeys addObject:@"a3_September"];
-        [abbrMonthLabelKeys addObject:@"a3_October"];
-        [abbrMonthLabelKeys addObject:@"a3_November"];
-        [abbrMonthLabelKeys addObject:@"a3_December"];
-    }
-}
-
-- (id)init {
-  if ((self = [super init])) {
-    self->queryParameters = [[NSMutableDictionary alloc] init];
+  if (MET == nil) {
+    MET = [[NSTimeZone timeZoneWithAbbreviation:@"MET"] retain];
+    GMT = [[NSTimeZone timeZoneWithAbbreviation:@"GMT"] retain];
+  }
+  if (dayLabelKeys == nil) {
+    dayLabelKeys = [[NSMutableArray alloc] initWithCapacity:7];
+    [dayLabelKeys addObject:@"Sunday"];
+    [dayLabelKeys addObject:@"Monday"];
+    [dayLabelKeys addObject:@"Tuesday"];
+    [dayLabelKeys addObject:@"Wednesday"];
+    [dayLabelKeys addObject:@"Thursday"];
+    [dayLabelKeys addObject:@"Friday"];
+    [dayLabelKeys addObject:@"Saturday"];
+
+    abbrDayLabelKeys = [[NSMutableArray alloc] initWithCapacity:7];
+    [abbrDayLabelKeys addObject:@"a2_Sunday"];
+    [abbrDayLabelKeys addObject:@"a2_Monday"];
+    [abbrDayLabelKeys addObject:@"a2_Tuesday"];
+    [abbrDayLabelKeys addObject:@"a2_Wednesday"];
+    [abbrDayLabelKeys addObject:@"a2_Thursday"];
+    [abbrDayLabelKeys addObject:@"a2_Friday"];
+    [abbrDayLabelKeys addObject:@"a2_Saturday"];
+
+    monthLabelKeys = [[NSMutableArray alloc] initWithCapacity:12];
+    [monthLabelKeys addObject:@"January"];
+    [monthLabelKeys addObject:@"February"];
+    [monthLabelKeys addObject:@"March"];
+    [monthLabelKeys addObject:@"April"];
+    [monthLabelKeys addObject:@"May"];
+    [monthLabelKeys addObject:@"June"];
+    [monthLabelKeys addObject:@"July"];
+    [monthLabelKeys addObject:@"August"];
+    [monthLabelKeys addObject:@"September"];
+    [monthLabelKeys addObject:@"October"];
+    [monthLabelKeys addObject:@"November"];
+    [monthLabelKeys addObject:@"December"];
+
+    abbrMonthLabelKeys = [[NSMutableArray alloc] initWithCapacity:12];
+    [abbrMonthLabelKeys addObject:@"a3_January"];
+    [abbrMonthLabelKeys addObject:@"a3_February"];
+    [abbrMonthLabelKeys addObject:@"a3_March"];
+    [abbrMonthLabelKeys addObject:@"a3_April"];
+    [abbrMonthLabelKeys addObject:@"a3_May"];
+    [abbrMonthLabelKeys addObject:@"a3_June"];
+    [abbrMonthLabelKeys addObject:@"a3_July"];
+    [abbrMonthLabelKeys addObject:@"a3_August"];
+    [abbrMonthLabelKeys addObject:@"a3_September"];
+    [abbrMonthLabelKeys addObject:@"a3_October"];
+    [abbrMonthLabelKeys addObject:@"a3_November"];
+    [abbrMonthLabelKeys addObject:@"a3_December"];
   }
-  return self;
 }
 
 - (void)dealloc {
@@ -114,25 +104,7 @@ static BOOL uixDebugEnabled = NO;
   [super dealloc];
 }
 
-
-- (void)awake {
-  WORequest *req;
-  NSString  *uri;
-  NSRange   r;
-
-  [super awake];
-
-  req = [[self context] request];
-  uri = [req uri];
-  r   = [uri rangeOfString:@"?"];
-  if (r.length > 0) {
-    NSString *qs;
-    
-    qs = [uri substringFromIndex:(r.location + r.length)];
-    [self->queryParameters removeAllObjects];
-    [self _parseQueryString:qs];
-  }    
-}
+/* query parameters */
 
 - (void)_parseQueryString:(NSString *)_s {
   NSEnumerator *e;
@@ -159,7 +131,7 @@ static BOOL uixDebugEnabled = NO;
 }
 
 - (NSString *)queryParameterForKey:(NSString *)_key {
-  return [self->queryParameters objectForKey:_key];
+  return [[self _queryParameters] objectForKey:_key];
 }
 
 - (void)setQueryParameter:(NSString *)_param forKey:(NSString *)_key {
@@ -167,24 +139,69 @@ static BOOL uixDebugEnabled = NO;
     return;
 
   if(_param != nil)
-    [self->queryParameters setObject:_param forKey:_key];
+    [[self _queryParameters] setObject:_param forKey:_key];
   else
-    [self->queryParameters removeObjectForKey:_key];
+    [[self _queryParameters] removeObjectForKey:_key];
 }
 
-- (NSDictionary *)queryParameters {
+- (NSMutableDictionary *)_queryParameters {
+  // TODO: this code is weird, should use WORequest methods for parsing
+  WORequest *req;
+  NSString  *uri;
+  NSRange   r;
+  
+  if (self->queryParameters)
+    return self->queryParameters;
+
+  self->queryParameters = [[NSMutableDictionary alloc] initWithCapacity:8];
+    
+  req = [[self context] request];
+  uri = [req uri];
+  r   = [uri rangeOfString:@"?" options:NSBackwardsSearch];
+  if (r.length > 0) {
+    NSString *qs;
+    
+    qs = [uri substringFromIndex:NSMaxRange(r)];
+    [self _parseQueryString:qs];
+  }    
   return self->queryParameters;
 }
 
+- (NSDictionary *)queryParameters {
+  return [self _queryParameters];
+}
+
+- (NSDictionary *)queryParametersBySettingSelectedDate:(NSCalendarDate *)_date{
+  NSMutableDictionary *qp;
+    
+  qp = [[self queryParameters] mutableCopy];
+  [self setSelectedDateQueryParameter:_date inDictionary:qp];
+  return [qp autorelease];
+}
+
+- (void)setSelectedDateQueryParameter:(NSCalendarDate *)_newDate
+  inDictionary:(NSMutableDictionary *)_qp;
+{
+  if(_newDate != nil)
+    [_qp setObject:[self dateStringForDate:_newDate] forKey:@"day"];
+  else
+    [_qp removeObjectForKey:@"day"];
+}
+
 - (NSString *)completeHrefForMethod:(NSString *)_method {
+  WOContext    *ctx;
   NSDictionary *qp;
-  NSString *qs;
-    
+  NSString     *qs, *qps;
+
   qp = [self queryParameters];
   if([qp count] == 0)
     return _method;
-    
-  qs = [[self context] queryStringFromDictionary:qp];
+
+  ctx = [self context];
+  qps = [ctx queryPathSeparator];
+  [ctx setQueryPathSeparator:@"&"];
+  qs = [ctx queryStringFromDictionary:qp];
+  [ctx setQueryPathSeparator:qps];
   return [_method stringByAppendingFormat:@"?%@", qs];
 }
 
@@ -213,6 +230,40 @@ static BOOL uixDebugEnabled = NO;
   return [uri substringFromIndex:(r.location + 1)];
 }
 
+- (NSString *)userFolderPath {
+  WOContext *ctx;
+  NSArray   *traversalObjects;
+  NSString  *url;
+  
+  ctx = [self context];
+  traversalObjects = [ctx objectTraversalStack];
+  url = [[traversalObjects objectAtIndex:1]
+                           baseURLInContext:ctx];
+  return [[NSURL URLWithString:url] path];
+}
+
+- (NSString *)ownPath {
+  NSString *uri;
+  NSRange  r;
+  
+  uri = [[[self context] request] uri];
+  
+  /* first: cut off query parameters */
+  
+  r = [uri rangeOfString:@"?" options:NSBackwardsSearch];
+  if (r.length > 0)
+    uri = [uri substringToIndex:r.location];
+  return uri;
+}
+
+- (NSString *)relativePathToUserFolderSubPath:(NSString *)_sub {
+  NSString *dst, *rel;
+
+  dst = [[self userFolderPath] stringByAppendingPathComponent:_sub];
+  rel = [dst urlPathRelativeToPath:[self ownPath]];
+  return rel;
+}
+  
 /* date */
 
 - (NSTimeZone *)viewTimeZone {
@@ -235,14 +286,14 @@ static BOOL uixDebugEnabled = NO;
   [cdate setTimeZone:[self viewTimeZone]];
   s = [self queryParameterForKey:@"hm"];
   if([s length] == 4) {
-      unsigned hour, minute;
+    unsigned hour, minute;
       
-      hour = [[s substringToIndex:2] unsignedIntValue];
-      minute = [[s substringFromIndex:2] unsignedIntValue];
-      cdate = [cdate hour:hour minute:minute];
+    hour = [[s substringToIndex:2] unsignedIntValue];
+    minute = [[s substringFromIndex:2] unsignedIntValue];
+    cdate = [cdate hour:hour minute:minute];
   }
   else {
-      cdate = [cdate hour:12 minute:0];
+    cdate = [cdate hour:12 minute:0];
   }
   return cdate;
 }
@@ -261,123 +312,135 @@ static BOOL uixDebugEnabled = NO;
 /* SoUser */
 
 - (SoUser *)user {
-    WOContext *ctx;
-    
-    ctx = [self context];
-    return [[[self clientObject] authenticatorInContext:ctx]
-                               userInContext:ctx];
+  WOContext *ctx;
+  
+  ctx = [self context];
+  return [[[self clientObject] authenticatorInContext:ctx] userInContext:ctx];
 }
 
 - (NSString *)shortUserNameForDisplay {
-    // TODO: better use a SoUser formatter?
-    NSString *s;
-    NSRange  r;
-
-#warning !! USE USER MANAGER INSTEAD!
-
-    s = [[self user] login];
-    if ([s length] < 10)
-        return s;
+  // TODO: better use a SoUser formatter?
+  // TODO: who calls that?
+  NSString *s;
+  NSRange  r;
+  
+  // TODO: USE USER MANAGER INSTEAD!
+  
+  s = [[self user] login];
+  if ([s length] < 10)
+    return s;
     
-    // TODO: algorithm might be inappropriate, depends on the actual UID
+  // TODO: algorithm might be inappropriate, depends on the actual UID
     
-    r = [s rangeOfString:@"."];
-    if (r.length == 0)
-        return s;
+  r = [s rangeOfString:@"."];
+  if (r.length == 0)
+    return s;
     
-    return [s substringToIndex:r.location];
+  return [s substringToIndex:r.location];
 }
 
 /* labels */
 
 - (NSString *)labelForKey:(NSString *)_str {
-    WOResourceManager *rm;
-    NSArray           *languages;
-    WOContext         *ctx;
-    NSString          *label;
-    NSString          *lKey, *lTable, *lVal;
-    NSRange r;
-
-    if ([_str length] == 0) {
-        return nil;
-    }
-    
-    /* lookup languages */
+  WOResourceManager *rm;
+  NSArray           *languages;
+  WOContext         *ctx;
+  NSString          *label;
+  NSString          *lKey, *lTable, *lVal;
+  NSRange r;
+
+  if ([_str length] == 0)
+    return nil;
+  
+  /* lookup languages */
     
-    ctx = [self context];
-    languages = [ctx hasSession]
-        ? [[ctx session] languages]
-        : [[ctx request] browserLanguages];
+  ctx = [self context];
+  languages = [ctx hasSession]
+    ? [[ctx session] languages]
+    : [[ctx request] browserLanguages];
     
-    /* find resource manager */
+  /* find resource manager */
     
-    if ((rm = [self resourceManager]) == nil)
-        rm = [[WOApplication application] resourceManager];
-    if (rm == nil)
-        [self debugWithFormat:@"WARNING: missing resource manager!"];
+  if ((rm = [self resourceManager]) == nil)
+    rm = [[WOApplication application] resourceManager];
+  if (rm == nil)
+    [self warnWithFormat:@"missing resource manager!"];
     
-    /* get parameters */
+  /* get parameters */
     
-    r = [_str rangeOfString:@"/"];
-    if (r.length > 0) {
-        lTable = [_str substringToIndex:r.location];
-        lKey   = [_str substringFromIndex:(r.location + r.length)];
-    }
-    else {
-        lTable = nil;
-        lKey   = _str;
-    }
-    lVal = lKey;
-
-    if([lKey hasPrefix:@"$"]) {
-        lKey = [self valueForKeyPath:[lKey substringFromIndex:1]];
-    }
-    if([lTable hasPrefix:@"$"]) {
-        lTable = [self valueForKeyPath:[lTable substringFromIndex:1]];
-    }
+  r = [_str rangeOfString:@"/"];
+  if (r.length > 0) {
+    lTable = [_str substringToIndex:r.location];
+    lKey   = [_str substringFromIndex:(r.location + r.length)];
+  }
+  else {
+    lTable = nil;
+    lKey   = _str;
+  }
+  lVal = lKey;
+
+  if ([lKey hasPrefix:@"$"])
+    lKey = [self valueForKeyPath:[lKey substringFromIndex:1]];
+  
+  if ([lTable hasPrefix:@"$"])
+    lTable = [self valueForKeyPath:[lTable substringFromIndex:1]];
+  
 #if 0
-    if([lVal hasPrefix:@"$"]) {
-        lVal = [self valueForKeyPath:[lVal substringFromIndex:1]];
-    }
+  if ([lVal hasPrefix:@"$"])
+    lVal = [self valueForKeyPath:[lVal substringFromIndex:1]];
+  
 #endif
-    /* lookup string */
-    
-    label = [rm stringForKey:lKey inTableNamed:lTable withDefaultValue:lVal
-                languages:languages];
-    return label;
+  
+  /* lookup string */
+  
+  label = [rm stringForKey:lKey inTableNamed:lTable withDefaultValue:lVal
+             languages:languages];
+  return label;
 }
 
 - (NSString *)localizedNameForDayOfWeek:(unsigned)_dayOfWeek {
-    NSString *key =  [dayLabelKeys objectAtIndex:_dayOfWeek % 7];
-    return [self labelForKey:key];
+  NSString *key =  [dayLabelKeys objectAtIndex:_dayOfWeek % 7];
+  return [self labelForKey:key];
 }
 
 - (NSString *)localizedAbbreviatedNameForDayOfWeek:(unsigned)_dayOfWeek {
-    NSString *key =  [abbrDayLabelKeys objectAtIndex:_dayOfWeek % 7];
-    return [self labelForKey:key];
+  NSString *key =  [abbrDayLabelKeys objectAtIndex:_dayOfWeek % 7];
+  return [self labelForKey:key];
 }
 
 - (NSString *)localizedNameForMonthOfYear:(unsigned)_monthOfYear {
-    NSString *key =  [monthLabelKeys objectAtIndex:(_monthOfYear - 1) % 12];
-    return [self labelForKey:key];
+  NSString *key =  [monthLabelKeys objectAtIndex:(_monthOfYear - 1) % 12];
+  return [self labelForKey:key];
 }
 
 - (NSString *)localizedAbbreviatedNameForMonthOfYear:(unsigned)_monthOfYear {
-    NSString *key =  [abbrMonthLabelKeys objectAtIndex:(_monthOfYear - 1) % 12];
-    return [self labelForKey:key];
+  NSString *key =  [abbrMonthLabelKeys objectAtIndex:(_monthOfYear - 1) % 12];
+  return [self labelForKey:key];
+}
+
+/* HTTP method safety */
+
+- (BOOL)isInvokedBySafeMethod {
+  // TODO: move to WORequest?
+  NSString *m;
+  
+  m = [[[self context] request] method];
+  if ([m isEqualToString:@"GET"])  return YES;
+  if ([m isEqualToString:@"HEAD"]) return YES;
+  return NO;
 }
 
 /* locale */
 
 - (NSDictionary *)locale {
-    /* we need no fallback here, as locale is guaranteed to be set by sogod */
-    return [[self context] valueForKey:@"locale"];
+  /* we need no fallback here, as locale is guaranteed to be set by sogod */
+  return [[self context] valueForKey:@"locale"];
 }
 
-/* Debugging */
+/* debugging */
 
 - (BOOL)isUIxDebugEnabled {
-    return uixDebugEnabled;
+  return uixDebugEnabled;
 }
 
 @end /* UIxComponent */