From 5753cf33840f1b040bfa82d43eeb1d21385dcaee Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 19 Apr 2012 02:49:25 +0000 Subject: [PATCH] Monotone-Parent: 2b7803f8e993e96ff4490197722ef0a2a5faad70 Monotone-Revision: 7d9ee580367f7631b0793eae0e55ae9255d331bc Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-19T02:49:25 --- SOPE/NGCards/CardElement.h | 3 ++ SOPE/NGCards/CardElement.m | 10 +++++++ SOPE/NGCards/CardVersitRenderer.m | 8 ++++-- SOPE/NGCards/ChangeLog | 12 ++++++++ SOPE/NGCards/NSDictionary+NGCards.h | 1 + SOPE/NGCards/NSDictionary+NGCards.m | 28 +++++++++++++++++-- .../iCalRepeatableEntityObject+SOGo.m | 1 + 7 files changed, 58 insertions(+), 5 deletions(-) diff --git a/SOPE/NGCards/CardElement.h b/SOPE/NGCards/CardElement.h index af94a5c49..b15b2175d 100644 --- a/SOPE/NGCards/CardElement.h +++ b/SOPE/NGCards/CardElement.h @@ -106,6 +106,9 @@ - (void) addType: (NSString *) aType; +- (NSArray *) orderOfAttributeKeys; +- (NSArray *) orderOfValueKeys; + - (NSString *) versitString; - (CardGroup *) searchParentOfClass: (Class) parentClass; diff --git a/SOPE/NGCards/CardElement.m b/SOPE/NGCards/CardElement.m index 7064c81f9..959c37f12 100644 --- a/SOPE/NGCards/CardElement.m +++ b/SOPE/NGCards/CardElement.m @@ -471,6 +471,16 @@ _orderedValuesAreVoid (NSArray *orderedValues) return result; } +- (NSArray *) orderOfAttributeKeys +{ + return nil; +} + +- (NSArray *) orderOfValueKeys +{ + return nil; +} + - (NSString *) versitString { NSString *string; diff --git a/SOPE/NGCards/CardVersitRenderer.m b/SOPE/NGCards/CardVersitRenderer.m index 35e50d0e7..50894a831 100644 --- a/SOPE/NGCards/CardVersitRenderer.m +++ b/SOPE/NGCards/CardVersitRenderer.m @@ -78,13 +78,17 @@ if ([attributes count]) { [rendering appendString: @";"]; - [attributes versitRenderInString: rendering asAttributes: YES]; + [attributes versitRenderInString: rendering + withKeyOrdering: [anElement orderOfAttributeKeys] + asAttributes: YES]; } /* values */ values = [anElement values]; [rendering appendString: @":"]; - [values versitRenderInString: rendering asAttributes: NO]; + [values versitRenderInString: rendering + withKeyOrdering: [anElement orderOfValueKeys] + asAttributes: NO]; if ([rendering length] > 0) [rendering appendString: @"\r\n"]; diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index 359a14592..545f692da 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,15 @@ +2012-04-18 Wolfgang Sourdeau + + * NSDictionary+NGCards.m + (-versitRenderInString:withKeyOrdering:asAttributes:): now takes + an "ordering" parameter resulting from the methods below and + reorder the dictionary keys as specified. + + * CardElement.m (-orderOfAttributeKeys, -orderOfValueKeys): new + methods that return an ordered array of value keys, used for + rendering data in a way that is acceptable to certain picky + clients. + 2012-04-11 Francis Lachapelle * iCalWeeklyRecurrenceCalculator.m diff --git a/SOPE/NGCards/NSDictionary+NGCards.h b/SOPE/NGCards/NSDictionary+NGCards.h index 8def7d6a1..cac3be8b5 100644 --- a/SOPE/NGCards/NSDictionary+NGCards.h +++ b/SOPE/NGCards/NSDictionary+NGCards.h @@ -30,6 +30,7 @@ - (id) objectForCaseInsensitiveKey: (NSString *) aKey; - (void) versitRenderInString: (NSMutableString *) aString + withKeyOrdering: (NSArray *) ordering asAttributes: (BOOL) asAttribute; /* handling of ":" */ @end diff --git a/SOPE/NGCards/NSDictionary+NGCards.m b/SOPE/NGCards/NSDictionary+NGCards.m index 9360154bd..109db067c 100644 --- a/SOPE/NGCards/NSDictionary+NGCards.m +++ b/SOPE/NGCards/NSDictionary+NGCards.m @@ -123,15 +123,37 @@ } - (void) versitRenderInString: (NSMutableString *) aString + withKeyOrdering: (NSArray *) ordering asAttributes: (BOOL) asAttributes { - NSArray *keys; - NSUInteger count, max, rendered = 0; + NSMutableArray *keys; + NSUInteger count, max, rendered = 0, keyIndex, newKeyIndex; NSArray *orderedValues; NSString *key; NSMutableString *substring; - keys = [self allKeys]; + keys = [[self allKeys] mutableCopy]; + [keys autorelease]; + + /* We reorder the fields based on the "ordering" array, by first placing + those that are specified and then the rest of them. */ + newKeyIndex = 0; + max = [ordering count]; + for (count = 0; count < max; count++) + { + key = [ordering objectAtIndex: count]; + keyIndex = [keys indexOfObject: key]; + if (keyIndex != NSNotFound) + { + if (keyIndex != newKeyIndex) + { + [keys removeObjectAtIndex: keyIndex]; + [keys insertObject: key atIndex: newKeyIndex]; + } + newKeyIndex++; + } + } + max = [keys count]; for (count = 0; count < max; count++) { diff --git a/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m b/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m index e57d02faf..04e6f93b3 100644 --- a/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m +++ b/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m @@ -59,6 +59,7 @@ rule = [rules objectAtIndex:i]; ruleString = [NSMutableString new]; [[rule values] versitRenderInString: ruleString + withKeyOrdering: [rule orderOfValueKeys] asAttributes: NO]; [ma addObject: ruleString]; [ruleString release];