]> err.no Git - sope/blobdiff - sope-appserver/NGObjWeb/WOElement.m
improved query string handling
[sope] / sope-appserver / NGObjWeb / WOElement.m
index bae906c8de66b8beda3dbea36fba4202e18d9922..2461122de9d8a073df17e989eb090181047fb45e 100644 (file)
@@ -1,24 +1,23 @@
 /*
-  Copyright (C) 2000-2004 SKYRIX Software AG
+  Copyright (C) 2000-2005 SKYRIX Software AG
 
-  This file is part of OpenGroupware.org.
+  This file is part of SOPE.
 
-  OGo is free software; you can redistribute it and/or modify it under
+  SOPE 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
+  SOPE 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
+  License along with SOPE; 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/WOElement.h>
 #include "WOElement+private.h"
@@ -151,9 +150,7 @@ static id numStrings[100];
                      NSStringFromClass([self class]), self];
 }
 
-@end /* WOElement */
-
-@implementation WOElement(QueryString)
+/* QueryString */
 
 - (NSString *)queryStringForQueryDictionary:(NSDictionary *)_queryDict
   andQueryParameters:(NSDictionary *)_paras
@@ -175,11 +172,11 @@ static id numStrings[100];
   
   isFirst = YES;
   paraKeys = [_paras allKeys];
-
+  
   /* ?style parameters */
   
   keys = [_paras keyEnumerator];
-  while ((key = [keys nextObject])) {
+  while ((key = [keys nextObject]) != nil) {
     value = [[_paras objectForKey:key] stringValueInComponent:sComponent];
     value = value ? [value stringByEscapingURL] : @"";
     key   = key   ? [key   stringByEscapingURL] : @"";
@@ -193,30 +190,57 @@ static id numStrings[100];
   }
   
   keys = [_queryDict keyEnumerator];
-  while ((key = [keys nextObject]) && (![paraKeys containsObject:key])) {
-    value = [[_queryDict objectForKey:key] stringValue];
-    value = value ? [value stringByEscapingURL] : @"";
-    key   = key   ? [key   stringByEscapingURL] : @"";
-
-    if (isFirst) isFirst = NO;
-    else [str appendString:@"&"];
-
-    [str appendString:key];
-    [str appendString:@"="];
-    [str appendString:value];
+  while ((key = [keys nextObject]) != nil) {
+    if([paraKeys containsObject:key])
+      /* overridden by a query parameter (?abc=abc) */
+      continue;
+    
+    value = [_queryDict objectForKey:key];
+    if ([value isKindOfClass:[NSArray class]]) {
+      /* if we bind the queryDictionary to request.formValues */
+      NSArray  *values;
+      unsigned i, count;
+
+      values = (NSArray *)value;
+      for (i = 0, count = [values count]; i < count; i++) {
+       value = [values objectAtIndex:i];
+        value = [value stringValue];
+        value = value ? [value stringByEscapingURL] : @"";
+        key   = key   ? [key   stringByEscapingURL] : @"";
+        
+        if (isFirst) isFirst = NO;
+        else [str appendString:@"&"];
+       
+        [str appendString:key];
+        [str appendString:@"="];
+        [str appendString:value];
+      }
+    }
+    else {
+      value = [value stringValue];
+      value = value ? [value stringByEscapingURL] : @"";
+      key   = key   ? [key   stringByEscapingURL] : @"";
+      
+      if (isFirst) isFirst = NO;
+      else [str appendString:@"&"];
+        
+      [str appendString:key];
+      [str appendString:@"="];
+      [str appendString:value];
+    }
   }
   
   return [str length] > 0 ? str : nil;
 }
 
-@end /* WOElement(QueryString) */
+@end /* WOElement */
 
 NGObjWeb_DECLARE id OWGetProperty(NSDictionary *_set, NSString *_name) {
-  id propValue = [_set objectForKey:_name];
-
-  if (propValue) {
-    propValue = RETAIN(propValue);
-    [(id)_set removeObjectForKey:_name];
+  register id propValue;
+  
+  if ((propValue = [_set objectForKey:_name]) != nil) {
+    propValue = [propValue retain];
+    [(NSMutableDictionary *)_set removeObjectForKey:_name];
   }
   return propValue;
 }