1/* NSDictionary+URL.m - this file is part of SOGo 2 * 3 * Copyright (C) 2006-2010 Inverse inc. 4 * 5 * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca> 6 * 7 * This file is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2, or (at your option) 10 * any later version. 11 * 12 * This file is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; see the file COPYING. If not, write to 19 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 20 * Boston, MA 02111-1307, USA. 21 */ 22 23#import <Foundation/NSArray.h> 24#import <Foundation/NSEnumerator.h> 25#import <Foundation/NSString.h> 26 27#import <NGExtensions/NSString+misc.h> 28 29#import "NSDictionary+URL.h" 30 31@implementation NSDictionary (SOGoURLExtension) 32 33- (NSString *) asURLParameters 34{ 35 NSMutableString *urlParameters; 36 NSArray *keys; 37 NSMutableArray *values; 38 NSEnumerator *keysEnum; 39 NSString *currentKey, *separator ,*value; 40 id currentValue; 41 BOOL isFirst; 42 unsigned int i; 43 44 urlParameters = [NSMutableString new]; 45 [urlParameters autorelease]; 46 47 keys = [self allKeys]; 48 if ([keys count] > 0) 49 { 50 isFirst = YES; 51 keysEnum = [keys objectEnumerator]; 52 currentKey = [keysEnum nextObject]; 53 while (currentKey) 54 { 55 currentValue = [self objectForKey: currentKey]; 56 if ([currentValue isKindOfClass: [NSArray class]]) 57 { 58 values = [NSMutableArray array]; 59 separator = [NSString stringWithFormat: @"&%@=", currentKey]; 60 for (i = 0; i < [currentValue count]; i++) 61 { 62 value = [currentValue objectAtIndex: i]; 63 value = [value stringByEscapingURL]; 64 [values addObject: value]; 65 } 66 currentValue 67 = [values componentsJoinedByString: separator]; 68 } 69 else 70 currentValue = [currentValue stringByEscapingURL]; 71 [urlParameters appendFormat: @"%@%@=%@", 72 ((isFirst) ? @"?" : @"&"), 73 [currentKey stringByEscapingURL], currentValue]; 74 isFirst = NO; 75 currentKey = [keysEnum nextObject]; 76 } 77 } 78 79 return urlParameters; 80} 81 82@end 83