From c543b9e9a73b3a26d464b10b37235c4cd19d50ea Mon Sep 17 00:00:00 2001 From: C Robert Date: Wed, 9 Sep 2009 13:31:45 +0000 Subject: [PATCH] Fixes for import/export Monotone-Parent: 3e7ac334a4ea19aa4ec2dcbc525628005ca75fb7 Monotone-Revision: d124c012f70febcfcbb9a2b5d4f3a20a7a001d7a Monotone-Author: crobert@inverse.ca Monotone-Date: 2009-09-09T13:31:45 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 14 ++ SOPE/NGCards/ChangeLog | 5 + SOPE/NGCards/NGVCard.m | 84 +++++---- SOPE/NGCards/NGVList.m | 28 ++- SoObjects/SOGo/NSDictionary+Utilities.h | 3 + SoObjects/SOGo/NSDictionary+Utilities.m | 76 ++++++++ SoObjects/SOGo/NSString+Utilities.h | 3 + SoObjects/SOGo/NSString+Utilities.m | 38 ++++ Tools/GNUmakefile | 2 - Tools/NSDictionary+SOGoTool.h | 34 ---- Tools/NSDictionary+SOGoTool.m | 150 --------------- Tools/SOGoToolBackup.m | 2 +- UI/Contacts/GNUmakefile | 3 +- UI/Contacts/UIxContactFolderActions.h | 42 +++++ UI/Contacts/UIxContactFolderActions.m | 231 ++++++++++++++++++++++++ UI/Contacts/UIxContactsListView.h | 4 - UI/Contacts/UIxContactsListView.m | 179 ------------------ UI/Contacts/product.plist | 4 +- UI/Scheduler/GNUmakefile | 1 + UI/Scheduler/UIxCalFolderActions.h | 36 ++++ UI/Scheduler/UIxCalFolderActions.m | 163 +++++++++++++++++ UI/Scheduler/UIxCalView.m | 121 ------------- UI/Scheduler/product.plist | 9 +- UI/WebServerResources/SchedulerUI.js | 2 +- 24 files changed, 687 insertions(+), 547 deletions(-) delete mode 100644 Tools/NSDictionary+SOGoTool.h delete mode 100644 Tools/NSDictionary+SOGoTool.m create mode 100644 UI/Contacts/UIxContactFolderActions.h create mode 100644 UI/Contacts/UIxContactFolderActions.m create mode 100644 UI/Scheduler/UIxCalFolderActions.h create mode 100644 UI/Scheduler/UIxCalFolderActions.m diff --git a/ChangeLog b/ChangeLog index b5003f0ed..d2cd6c3ea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2009-09-09 Cyril Robert + + * Tools/NSDictionary+SOGoTool.m: Removed, all methods were moved to + SoObjects/NSDictionary+Utilities.m, or SoObjects/NSString+Utilities.m + * UI/Contacts/UIxContactFolderActions.m: New class to handle actions on a + single contacts folder. (import/export) + * UI/Scheduler/UIxCalFolderActions.m: New class to handle actions on a + single agenda folder. (import/export) + * SoObjects/SOGo/NSDictionary+Utilities.m: Added userRecordAsLDIFEntry. + * SoObjects/SOGo/NSString+Utilities.m: Added methods useful for + userRecordAsLDIFEntry. + * UI/Contacts/UIxContactsListView.m: Removed import/export actions + * UI/Scheduler/UIxCalView.m: Removed import/export actions + 2009-09-03 Cyril Robert * UI/Contacts/UIxContactsListView.m: Added ldif / vcard import diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index c64415c8f..c4f6b93b0 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,8 @@ +2009-09-09 Cyril Robert + + * NGVCard.m: Made use of NSDictionary+Utilities' userRecordAsLDIFEntry. + * NGVList.m: Made use of NSDictionary+Utilities' userRecordAsLDIFEntry. + 2009-09-02 Cyril Robert * NGVCard.m (ldifString): Added, to support exporting diff --git a/SOPE/NGCards/NGVCard.m b/SOPE/NGCards/NGVCard.m index f2d8214e4..5579c7b3f 100644 --- a/SOPE/NGCards/NGVCard.m +++ b/SOPE/NGCards/NGVCard.m @@ -20,9 +20,12 @@ */ #import +#import #import #import +#import "../../SoObjects/SOGo/NSDictionary+Utilities.h" + #import "NSArray+NGCards.h" #import "NGVCard.h" @@ -513,92 +516,101 @@ { NSMutableString *rc; NSString *buffer; - NSMutableArray *array; + NSArray *array; + NSMutableArray *marray; + NSMutableDictionary *entry; id tmp; - rc = [NSMutableString string]; + entry = [NSMutableDictionary dictionary]; - [rc appendFormat: @"dn: cn=%@,mail=%@\n", [self fn], [self preferredEMail]]; - [rc appendFormat: @"objectclass: top\nobjectclass: person\nobjectclass: " - @"organizationalPerson\nobjectclass: inetOrgPerson\nobjectclass: " - @"mozillaAbPersonObsolete\n"]; - [rc appendFormat: @"givenName: %@\n", [[self n] objectAtIndex: 1]]; - [rc appendFormat: @"sn: %@\n", [[self n] objectAtIndex: 0]]; - [rc appendFormat: @"cn: %@\n", [self fn]]; - [rc appendFormat: @"mail: %@\n", [self preferredEMail]]; - [rc appendFormat: @"modifytimestamp: 0Z\n"]; + [entry setObject: [NSString stringWithFormat: @"cn=%@,mail=%@", + [self fn], [self preferredEMail]] + forKey: @"dn"]; + [entry setObject: [NSArray arrayWithObjects: @"top", @"person", + @"organizationalPerson", @"inetOrgPerson", + @"mozillaAbPersonObsolete", nil] + forKey: @"objectclass"]; + [entry setObject: [[self n] objectAtIndex: 1] forKey: @"givenName"]; + [entry setObject: [[self n] objectAtIndex: 0] forKey: @"sn"]; + [entry setObject: [self fn] forKey: @"cn"]; + [entry setObject: [self preferredEMail] forKey: @"mail"]; + [entry setObject: @"0Z" forKey: @"modifytimestamp"]; buffer = [self nickname]; if (buffer && [buffer length] > 0) - [rc appendFormat: @"mozillaNickname: %@\n", buffer]; + [entry setObject: buffer forKey: @"mozillaNickname"]; - array = [NSMutableArray arrayWithArray: [self childrenWithTag: @"email"]]; - [array removeObjectsInArray: [self childrenWithTag: @"email" + marray = [NSMutableArray arrayWithArray: [self childrenWithTag: @"email"]]; + [marray removeObjectsInArray: [self childrenWithTag: @"email" andAttribute: @"type" havingValue: @"pref"]]; - if ([array count]) + if ([marray count]) { - buffer = [[array objectAtIndex: [array count]-1] value: 0]; + buffer = [[marray objectAtIndex: [marray count]-1] value: 0]; if ([buffer caseInsensitiveCompare: [self preferredEMail]] != NSOrderedSame) - [rc appendFormat: @"mozillaSecondEmail: %@\n", buffer]; + [entry setObject: buffer forKey: @"mozillaSecondEmail"]; } array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"home"]; if ([array count]) - [rc appendFormat: @"homePhone: %@\n", [[array objectAtIndex: 0] value: 0]]; + [entry setObject: [[array objectAtIndex: 0] value: 0] forKey: @"homePhone"]; array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"fax"]; if ([array count]) - [rc appendFormat: @"fax: %@\n", [[array objectAtIndex: 0] value: 0]]; + [entry setObject: [[array objectAtIndex: 0] value: 0] forKey: @"fax"]; array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"cell"]; if ([array count]) - [rc appendFormat: @"mobile: %@\n", [[array objectAtIndex: 0] value: 0]]; + [entry setObject: [[array objectAtIndex: 0] value: 0] forKey: @"mobile"]; array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"pager"]; if ([array count]) - [rc appendFormat: @"pager: %@\n", [[array objectAtIndex: 0] value: 0]]; + [entry setObject: [[array objectAtIndex: 0] value: 0] forKey: @"pager"]; array = [self childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"home"]; if ([array count]) { tmp = [array objectAtIndex: 0]; - [rc appendFormat: @"homeStreet: %@\n", [tmp value: 0]]; - [rc appendFormat: @"mozillaHomeLocalityName: %@\n", [tmp value: 1]]; - [rc appendFormat: @"mozillaHomeState: %@\n", [tmp value: 2]]; - [rc appendFormat: @"mozillaHomePostalCode: %@\n", [tmp value: 3]]; - [rc appendFormat: @"mozillaHomeCountryName: %@\n", [tmp value: 4]]; + [entry setObject: [tmp value: 0] forKey: @"homeStreet"]; + [entry setObject: [tmp value: 1] forKey: @"mozillaHomeLocalityName"]; + [entry setObject: [tmp value: 2] forKey: @"mozillaHomeState"]; + [entry setObject: [tmp value: 3] forKey: @"mozillaHomePostalCode"]; + [entry setObject: [tmp value: 4] forKey: @"mozillaHomeCountryName"]; } array = [self org]; if (array && [array count]) - [rc appendFormat: @"o: %@\n", [array objectAtIndex: 0]]; + [entry setObject: [array objectAtIndex: 0] forKey: @"o"]; array = [self childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"work"]; if ([array count]) { tmp = [array objectAtIndex: 0]; - [rc appendFormat: @"street: %@\n", [tmp value: 0]]; - [rc appendFormat: @"l: %@\n", [tmp value: 1]]; - [rc appendFormat: @"st: %@\n", [tmp value: 2]]; - [rc appendFormat: @"postalCode: %@\n", [tmp value: 3]]; - [rc appendFormat: @"c: %@\n", [tmp value: 4]]; + [entry setObject: [tmp value: 0] forKey: @"street"]; + [entry setObject: [tmp value: 1] forKey: @"l"]; + [entry setObject: [tmp value: 2] forKey: @"st"]; + [entry setObject: [tmp value: 3] forKey: @"postalCode"]; + [entry setObject: [tmp value: 4] forKey: @"c"]; } array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"work"]; if ([array count]) - [rc appendFormat: @"telephoneNumber: %@\n", [[array objectAtIndex: 0] value: 0]]; + [entry setObject: [[array objectAtIndex: 0] value: 0] + forKey: @"telephoneNumber"]; array = [self childrenWithTag: @"url" andAttribute: @"type" havingValue: @"work"]; if ([array count]) - [rc appendFormat: @"workurl: %@\n", [[array objectAtIndex: 0] value: 0]]; + [entry setObject: [[array objectAtIndex: 0] value: 0] + forKey: @"workurl"]; array = [self childrenWithTag: @"url" andAttribute: @"type" havingValue: @"home"]; if ([array count]) - [rc appendFormat: @"homeurl: %@\n", [[array objectAtIndex: 0] value: 0]]; + [entry setObject: [[array objectAtIndex: 0] value: 0] + forKey: @"homeurl"]; tmp = [self note]; if (tmp && [tmp length]) - [rc appendFormat: @"description: %@\n", tmp]; + [entry setObject: tmp forKey: @"description"]; + rc = [NSMutableString stringWithString: [entry userRecordAsLDIFEntry]]; [rc appendFormat: @"\n"]; return rc; diff --git a/SOPE/NGCards/NGVList.m b/SOPE/NGCards/NGVList.m index c3892f8d7..926347ca3 100644 --- a/SOPE/NGCards/NGVList.m +++ b/SOPE/NGCards/NGVList.m @@ -23,6 +23,9 @@ #import #import #import +#import + +#import "../../SoObjects/SOGo/NSDictionary+Utilities.h" #import "NGVCardReference.h" @@ -200,29 +203,36 @@ - (NSString *) ldifString { NSMutableString *rc; - NSMutableArray *array; + NSArray *array; + NSMutableArray *members; NGVCardReference *tmp; + NSMutableDictionary *entry; int i, count; - rc = [NSMutableString string]; + entry = [NSMutableDictionary dictionary]; - [rc appendFormat: @"dn: cn=%@\n", [self fn]]; - [rc appendFormat: @"objectclass: top\nobjectclass: groupOfNames\n"]; - [rc appendFormat: @"cn: %@\n", [self fn]]; + [entry setObject: [NSString stringWithFormat: @"cn=%@", [self fn]] + forKey: @"dn"]; + [entry setObject: [NSArray arrayWithObjects: @"top", @"groupOfNames", nil] + forKey: @"objectclass"]; + [entry setObject: [self fn] forKey: @"cn"]; if ([self nickname]) - [rc appendFormat: @"mozillaNickname: %@\n", [self nickname]]; + [entry setObject: [self nickname] forKey: @"mozillaNickname"]; if ([self description]) - [rc appendFormat: @"description: %@\n", [self description]]; + [entry setObject: [self description] forKey: @"description"]; array = [self cardReferences]; count = [array count]; + members = [NSMutableArray array]; for (i = 0; i < count; i++) { tmp = [array objectAtIndex: i]; - [rc appendFormat: @"member: cn=%@,mail=%@\n", - [tmp fn], [tmp email]]; + [members addObject: [NSString stringWithFormat: + @"cn=%@,mail=%@", [tmp fn], [tmp email]]]; } + [entry setObject: members forKey: @"member"]; + rc = [NSMutableString stringWithString: [entry userRecordAsLDIFEntry]]; [rc appendFormat: @"\n"]; return rc; diff --git a/SoObjects/SOGo/NSDictionary+Utilities.h b/SoObjects/SOGo/NSDictionary+Utilities.h index 882b6b788..15d5940e4 100644 --- a/SoObjects/SOGo/NSDictionary+Utilities.h +++ b/SoObjects/SOGo/NSDictionary+Utilities.h @@ -35,6 +35,9 @@ - (NSString *) jsonRepresentation; - (NSString *) keysWithFormat: (NSString *) keyFormat; +// LDIF methods +- (NSString *) userRecordAsLDIFEntry; + @end @interface NSMutableDictionary (SOGoDictionaryUtilities) diff --git a/SoObjects/SOGo/NSDictionary+Utilities.m b/SoObjects/SOGo/NSDictionary+Utilities.m index c4228826e..b3ac16dfa 100644 --- a/SoObjects/SOGo/NSDictionary+Utilities.m +++ b/SoObjects/SOGo/NSDictionary+Utilities.m @@ -26,6 +26,10 @@ #import #import #import +#import + +#import +#import #import "NSArray+Utilities.h" #import "NSObject+Utilities.h" @@ -108,6 +112,76 @@ return [[self objectForKey: @"cn"] caseInsensitiveCompare: [theDictionary objectForKey: @"cn"]]; } +// LDIF Methods +- (void) _appendLDIFKey: (NSString *) key + value: (NSString *) value + toString: (NSMutableString *) ldifString +{ + if ([value _isLDIFSafe]) + [ldifString appendFormat: @"%@: %@\n", key, value]; + else + [ldifString appendFormat: @"%@:: %@\n", + key, [value stringByEncodingBase64]]; +} + +- (void) _appendLDIFKey: (NSString *) key + toString: (NSMutableString *) ldifString +{ + id value; + int count, max; + + value = [self objectForKey: key]; + if ([value isKindOfClass: [NSArray class]]) + { + max = [value count]; + for (count = 0; count < max; count++) + [self _appendLDIFKey: key value: [value objectAtIndex: count] + toString: ldifString]; + } + else + [self _appendLDIFKey: key value: [self objectForKey: key] + toString: ldifString]; +} + +- (void) _appendObjectClassesToString: (NSMutableString *) ldifString +{ + NSEnumerator *classes; + NSString *currentClass; + + classes = [[self objectForKey: @"objectClasses"] objectEnumerator]; + while ((currentClass = [classes nextObject])) + [self _appendLDIFKey: @"objectClass" value: currentClass + toString: ldifString]; +} + +- (NSString *) userRecordAsLDIFEntry +{ + NSMutableString *ldifString; + NSEnumerator *keys; + NSString *currentKey; + +// {CalendarAccess = YES; MailAccess = YES; c_cn = "Wolfgang Sourdeau"; c_emails = ("wolfgang@test.com"); c_name = "wolfgang@test.com"; c_uid = "wolfgang@test.com"; cn = "wolfgang@test.com"; displayName = "Wolfgang Sourdeau"; dn = "cn=wolfgang@test.com,ou=evariste,o=inverse.ca"; givenName = Wolfgang; mail = "wolfgang@test.com"; objectClass = organizationalPerson; sn = Sourdeau; } + + ldifString = [NSMutableString string]; + [self _appendLDIFKey: @"dn" toString: ldifString]; + [self _appendObjectClassesToString: ldifString]; + + keys = [[self allKeys] objectEnumerator]; + while ((currentKey = [keys nextObject])) + { + if (!([currentKey isEqualToString: @"CalendarAccess"] + || [currentKey isEqualToString: @"MailAccess"] + || [currentKey isEqualToString: @"ContactAccess"] + || [currentKey hasPrefix: @"objectClass"] + || [currentKey hasPrefix: @"c_"] + || [currentKey isEqualToString: @"dn"])) + [self _appendLDIFKey: currentKey toString: ldifString]; + } + + return ldifString; +} + + @end @implementation NSMutableDictionary (SOGoDictionaryUtilities) @@ -128,4 +202,6 @@ @" the number of keys."]; } + @end + diff --git a/SoObjects/SOGo/NSString+Utilities.h b/SoObjects/SOGo/NSString+Utilities.h index c92ee0d73..1b29c1df2 100644 --- a/SoObjects/SOGo/NSString+Utilities.h +++ b/SoObjects/SOGo/NSString+Utilities.h @@ -62,6 +62,9 @@ - (BOOL) boolValue; #endif +// LDIF +- (BOOL) _isLDIFSafe; + @end #endif /* NSSTRING_URL_H */ diff --git a/SoObjects/SOGo/NSString+Utilities.m b/SoObjects/SOGo/NSString+Utilities.m index d3657e201..792ea6a0b 100644 --- a/SoObjects/SOGo/NSString+Utilities.m +++ b/SoObjects/SOGo/NSString+Utilities.m @@ -384,4 +384,42 @@ static NSMutableCharacterSet *urlStartChars = nil; } #endif +static NSMutableCharacterSet *safeLDIFChars = nil; +static NSMutableCharacterSet *safeLDIFStartChars = nil; + +- (void) _initSafeLDIFChars +{ + safeLDIFChars = [NSMutableCharacterSet new]; + [safeLDIFChars addCharactersInRange: NSMakeRange (0x01, 9)]; + [safeLDIFChars addCharactersInRange: NSMakeRange (0x0b, 2)]; + [safeLDIFChars addCharactersInRange: NSMakeRange (0x0e, 114)]; + + safeLDIFStartChars = [safeLDIFChars mutableCopy]; + [safeLDIFStartChars removeCharactersInString: @" :<"]; +} + +- (BOOL) _isLDIFSafe +{ + int count, max; + BOOL rc; + + if (!safeLDIFChars) + [self _initSafeLDIFChars]; + + rc = YES; + + max = [self length]; + if (max > 0) + { + if ([safeLDIFStartChars characterIsMember: [self characterAtIndex: 0]]) + for (count = 1; rc && count < max; count++) + rc = [safeLDIFChars + characterIsMember: [self characterAtIndex: count]]; + else + rc = NO; + } + + return rc; +} + @end diff --git a/Tools/GNUmakefile b/Tools/GNUmakefile index d6ffe8dd1..00063777d 100644 --- a/Tools/GNUmakefile +++ b/Tools/GNUmakefile @@ -14,8 +14,6 @@ $(SOGO_TOOL)_OBJC_FILES += \ SOGoToolRestore.m \ SOGoToolCheckDoubles.m \ SOGoToolRemoveDoubles.m \ - \ - NSDictionary+SOGoTool.m TOOL_NAME = $(SOGO_TOOL) diff --git a/Tools/NSDictionary+SOGoTool.h b/Tools/NSDictionary+SOGoTool.h deleted file mode 100644 index 29edd8ae9..000000000 --- a/Tools/NSDictionary+SOGoTool.h +++ /dev/null @@ -1,34 +0,0 @@ -/* NSDictionary+SOGoTool.h - this file is part of SOGo - * - * Copyright (C) 2009 Inverse inc. - * - * Author: Wolfgang Sourdeau - * - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This file 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef NSDICTIONARY_SOGOTOOL_H -#define NSDICTIONARY_SOGOTOOL_H - -#import - -@interface NSDictionary (SOGoToolsExtension) - -- (NSString *) userRecordAsLDIFEntry; - -@end - -#endif /* NSDICTIONARY_SOGOTOOL_H */ diff --git a/Tools/NSDictionary+SOGoTool.m b/Tools/NSDictionary+SOGoTool.m deleted file mode 100644 index 19cf24514..000000000 --- a/Tools/NSDictionary+SOGoTool.m +++ /dev/null @@ -1,150 +0,0 @@ -/* NSDictionary+SOGoTool.m - this file is part of SOGo - * - * Copyright (C) 2009 Inverse inc. - * - * Author: Wolfgang Sourdeau - * - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This file 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#import -#import -#import -#import - -#import - -#import "NSDictionary+SOGoTool.h" - -@interface NSString (SOGoToolsExtension) - -- (BOOL) _isLDIFSafe; - -@end - -@implementation NSString (SOGoToolsExtension) - -static NSMutableCharacterSet *safeLDIFChars = nil; -static NSMutableCharacterSet *safeLDIFStartChars = nil; - -- (void) _initSafeLDIFChars -{ - safeLDIFChars = [NSMutableCharacterSet new]; - [safeLDIFChars addCharactersInRange: NSMakeRange (0x01, 9)]; - [safeLDIFChars addCharactersInRange: NSMakeRange (0x0b, 2)]; - [safeLDIFChars addCharactersInRange: NSMakeRange (0x0e, 114)]; - - safeLDIFStartChars = [safeLDIFChars mutableCopy]; - [safeLDIFStartChars removeCharactersInString: @" :<"]; -} - -- (BOOL) _isLDIFSafe -{ - int count, max; - BOOL rc; - - if (!safeLDIFChars) - [self _initSafeLDIFChars]; - - rc = YES; - - max = [self length]; - if (max > 0) - { - if ([safeLDIFStartChars characterIsMember: [self characterAtIndex: 0]]) - for (count = 1; rc && count < max; count++) - rc = [safeLDIFChars - characterIsMember: [self characterAtIndex: count]]; - else - rc = NO; - } - - return rc; -} - -@end - -@implementation NSDictionary (SOGoToolsExtension) - -- (void) _appendLDIFKey: (NSString *) key - value: (NSString *) value - toString: (NSMutableString *) ldifString -{ - if ([value _isLDIFSafe]) - [ldifString appendFormat: @"%@: %@\n", key, value]; - else - [ldifString appendFormat: @"%@:: %@\n", - key, [value stringByEncodingBase64]]; -} - -- (void) _appendLDIFKey: (NSString *) key - toString: (NSMutableString *) ldifString -{ - id value; - int count, max; - - value = [self objectForKey: key]; - if ([value isKindOfClass: [NSArray class]]) - { - max = [value count]; - for (count = 0; count < max; count++) - [self _appendLDIFKey: key value: [value objectAtIndex: count] - toString: ldifString]; - } - else - [self _appendLDIFKey: key value: [self objectForKey: key] - toString: ldifString]; -} - -- (void) _appendObjectClassesToString: (NSMutableString *) ldifString -{ - NSEnumerator *classes; - NSString *currentClass; - - classes = [[self objectForKey: @"objectClasses"] objectEnumerator]; - while ((currentClass = [classes nextObject])) - [self _appendLDIFKey: @"objectClass" value: currentClass - toString: ldifString]; -} - -- (NSString *) userRecordAsLDIFEntry -{ - NSMutableString *ldifString; - NSEnumerator *keys; - NSString *currentKey; - -// {CalendarAccess = YES; MailAccess = YES; c_cn = "Wolfgang Sourdeau"; c_emails = ("wolfgang@test.com"); c_name = "wolfgang@test.com"; c_uid = "wolfgang@test.com"; cn = "wolfgang@test.com"; displayName = "Wolfgang Sourdeau"; dn = "cn=wolfgang@test.com,ou=evariste,o=inverse.ca"; givenName = Wolfgang; mail = "wolfgang@test.com"; objectClass = organizationalPerson; sn = Sourdeau; } - - ldifString = [NSMutableString string]; - [self _appendLDIFKey: @"dn" toString: ldifString]; - [self _appendObjectClassesToString: ldifString]; - - keys = [[self allKeys] objectEnumerator]; - while ((currentKey = [keys nextObject])) - { - if (!([currentKey isEqualToString: @"CalendarAccess"] - || [currentKey isEqualToString: @"MailAccess"] - || [currentKey isEqualToString: @"ContactAccess"] - || [currentKey hasPrefix: @"objectClass"] - || [currentKey hasPrefix: @"c_"] - || [currentKey isEqualToString: @"dn"])) - [self _appendLDIFKey: currentKey toString: ldifString]; - } - - return ldifString; -} - -@end diff --git a/Tools/SOGoToolBackup.m b/Tools/SOGoToolBackup.m index 8bc7484e1..a26a06d8d 100644 --- a/Tools/SOGoToolBackup.m +++ b/Tools/SOGoToolBackup.m @@ -35,10 +35,10 @@ #import #import #import +#import #import #import -#import "NSDictionary+SOGoTool.h" #import "SOGoToolBackup.h" /* TODO: diff --git a/UI/Contacts/GNUmakefile b/UI/Contacts/GNUmakefile index 2ec6b239c..97a6d89e4 100644 --- a/UI/Contacts/GNUmakefile +++ b/UI/Contacts/GNUmakefile @@ -20,7 +20,8 @@ ContactsUI_OBJC_FILES = \ UIxListView.m \ UIxListEditor.m \ UIxContactsListView.m \ - UIxContactFoldersView.m + UIxContactFoldersView.m \ + UIxContactFolderActions.m ContactsUI_RESOURCE_FILES += \ Version \ diff --git a/UI/Contacts/UIxContactFolderActions.h b/UI/Contacts/UIxContactFolderActions.h new file mode 100644 index 000000000..c6f80c112 --- /dev/null +++ b/UI/Contacts/UIxContactFolderActions.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 2004-2005 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo 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 + 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 + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#ifndef __UIxContactsListView_H__ +#define __UIxContactsListView_H__ + +#import + +@class NSDictionary; +@class NSString; + +@protocol SOGoContactObject; + +@interface UIxContactFolderActions : UIxComponent +{ +} + +- (int) importLdifData: (NSString *) ldifData; +- (int) importVcardData: (NSString *) vcardData; +- (BOOL) importVcard: (NGVCard *) card; + +@end + +#endif /* __UIxContactsListView_H__ */ diff --git a/UI/Contacts/UIxContactFolderActions.m b/UI/Contacts/UIxContactFolderActions.m new file mode 100644 index 000000000..b55c1f5f0 --- /dev/null +++ b/UI/Contacts/UIxContactFolderActions.m @@ -0,0 +1,231 @@ +/* + Copyright (C) 2004-2005 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo 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 + 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 + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#import +#import +#import +#import + +#import +#import +#import +#import +#import +#import + +#import +#import +#import + +#import +#import +#import +#import +#import +#import +#import + +#import "UIxContactFolderActions.h" + +@implementation UIxContactFolderActions + + +/* actions */ + +- (id ) exportAction +{ + WORequest *request; + id response; + NSArray *contactsId; + NSEnumerator *uids; + NSString *uid; + id currentChild; + SOGoContactGCSFolder *sourceFolder; + NSMutableString *content; + + content = [NSMutableString string]; + request = [context request]; + contactsId = [request formValuesForKey: @"uid"]; + if (contactsId) + { + sourceFolder = [self clientObject]; + uids = [contactsId objectEnumerator]; + while ((uid = [uids nextObject])) + { + currentChild = [sourceFolder lookupName: uid + inContext: [self context] + acquire: NO]; + if ([currentChild respondsToSelector: @selector (vCard)]) + [content appendFormat: [[currentChild vCard] ldifString]]; + else if ([currentChild respondsToSelector: @selector (vList)]) + [content appendFormat: [[currentChild vList] ldifString]]; + } + } + response = [context response]; + [response setHeader: @"text/directory; charset=utf-8" + forKey: @"content-type"]; + [response setHeader: @"attachment;filename=SavedContacts.ldif" + forKey: @"Content-Disposition"]; + [response setContent: [content dataUsingEncoding: NSUTF8StringEncoding]]; + + return response; +} + +- (id ) importAction +{ + WORequest *request; + WOResponse *response; + id data; + NSMutableDictionary *rc; + NSString *fileContent; + int imported = 0; + + + request = [context request]; + rc = [NSMutableDictionary dictionary]; + data = [request formValueForKey: @"contactsFile"]; + if ([data respondsToSelector: @selector(isEqualToString:)]) + fileContent = (NSString *) data; + else + { + fileContent = [[NSString alloc] initWithData: (NSData *) data + encoding: NSUTF8StringEncoding]; + [fileContent autorelease]; + } + + if (fileContent && [fileContent length]) + { + if ([fileContent hasPrefix: @"dn:"]) + imported = [self importLdifData: fileContent]; + else if ([fileContent hasPrefix: @"BEGIN:"]) + imported = [self importVcardData: fileContent]; + else + imported = 0; + } + + [rc setObject: [NSNumber numberWithInt: imported] + forKey: @"imported"]; + + response = [self responseWithStatus: 200]; + [response setHeader: @"text/html" + forKey: @"content-type"]; + [(WOResponse*)response appendContentString: [rc jsonRepresentation]]; + + return response; +} + +- (int) importLdifData: (NSString *) ldifData +{ + SOGoContactGCSFolder *folder; + NSString *key, *value; + NSArray *ldifContacts, *lines, *components; + NSMutableDictionary *entry; + NGVCard *vCard; + NSString *uid; + int i,j,count,linesCount; + int rc = 0; + + folder = [self clientObject]; + ldifContacts = [ldifData componentsSeparatedByString: @"\ndn"]; + count = [ldifContacts count]; + + for (i = 0; i < count; i++) + { + SOGoContactLDIFEntry *ldifEntry; + entry = [NSMutableDictionary dictionary]; + lines = [[ldifContacts objectAtIndex: i] + componentsSeparatedByString: @"\n"]; + + linesCount = [lines count]; + for (j = 0; j < linesCount; j++) + { + components = [[lines objectAtIndex: j] + componentsSeparatedByString: @": "]; + if ([components count] == 2) + { + key = [components objectAtIndex: 0]; + value = [components objectAtIndex: 1]; + + if ([key length] == 0) + key = @"dn"; + + [entry setObject: value forKey: key]; + } + else + { + break; + } + } + uid = [folder globallyUniqueObjectId]; + ldifEntry = [SOGoContactLDIFEntry contactEntryWithName: uid + withLDIFEntry: entry + inContainer: folder]; + if (ldifEntry) + { + vCard = [ldifEntry vCard]; + if ([self importVcard: vCard]) + rc++; + + } + } + return rc; +} + +- (int) importVcardData: (NSString *) vcardData +{ + NGVCard *card; + int rc; + + rc = 0; + card = [NGVCard parseSingleFromSource: vcardData]; + if ([self importVcard: card]) + rc = 1; + + return rc; +} + +- (BOOL) importVcard: (NGVCard *) card +{ + NSString *uid, *name; + SOGoContactGCSFolder *folder; + NSException *ex; + BOOL rc = NO; + + if (card) + { + folder = [self clientObject]; + uid = [folder globallyUniqueObjectId]; + name = [NSString stringWithFormat: @"%@.vcf", uid]; + [card setUid: uid]; + ex = [[folder ocsFolder] writeContent: [card versitString] + toName: name + baseVersion: 0]; + if (ex) + NSLog (@"write failed: %@", ex); + else + rc = YES; + } + + return rc; +} + + +@end /* UIxContactsListView */ diff --git a/UI/Contacts/UIxContactsListView.h b/UI/Contacts/UIxContactsListView.h index e10c10601..2f6e0bf5e 100644 --- a/UI/Contacts/UIxContactsListView.h +++ b/UI/Contacts/UIxContactsListView.h @@ -35,10 +35,6 @@ NSArray *contactInfos; } -- (int) importLdifData: (NSString *) ldifData; -- (int) importVcardData: (NSString *) vcardData; -- (BOOL) importVcard: (NGVCard *) card; - @end #endif /* __UIxContactsListView_H__ */ diff --git a/UI/Contacts/UIxContactsListView.m b/UI/Contacts/UIxContactsListView.m index 102b21d8f..2a5a45ba2 100644 --- a/UI/Contacts/UIxContactsListView.m +++ b/UI/Contacts/UIxContactsListView.m @@ -187,183 +187,4 @@ return YES; } - -- (id ) exportAction -{ - WORequest *request; - id response; - NSArray *contactsId; - NSEnumerator *uids; - NSString *uid; - id currentChild; - SOGoContactGCSFolder *sourceFolder; - NSMutableString *content; - - content = [NSMutableString string]; - request = [context request]; - if ( (contactsId = [request formValuesForKey: @"uid"]) ) - { - sourceFolder = [self clientObject]; - uids = [contactsId objectEnumerator]; - while ((uid = [uids nextObject])) - { - currentChild = [sourceFolder lookupName: uid - inContext: [self context] - acquire: NO]; - if ([currentChild respondsToSelector: @selector (vCard)]) - [content appendFormat: [[currentChild vCard] ldifString]]; - else if ([currentChild respondsToSelector: @selector (vList)]) - [content appendFormat: [[currentChild vList] ldifString]]; - } - } - response = [[WOResponse alloc] init]; - [response autorelease]; - [response setHeader: @"text/directory" - forKey:@"content-type"]; - [response setHeader: @"attachment;filename=SavedContacts.ldif" - forKey: @"Content-Disposition"]; - [response setContent: [content dataUsingEncoding: NSUTF8StringEncoding]]; - - return response; -} - -- (id ) importAction -{ - WORequest *request; - WOResponse *response; - id data; - NSMutableDictionary *rc; - NSString *fileContent; - int imported = 0; - - - request = [context request]; - rc = [NSMutableDictionary dictionary]; - data = [request formValueForKey: @"contactsFile"]; - if ([data respondsToSelector: @selector(isEqualToString:)]) - fileContent = (NSString *) data; - else - { - fileContent = [[NSString alloc] initWithData: (NSData *) data - encoding: NSUTF8StringEncoding]; - [fileContent autorelease]; - } - - if (fileContent && [fileContent length]) - { - if ([fileContent hasPrefix: @"dn:"]) - imported = [self importLdifData: fileContent]; - else if ([fileContent hasPrefix: @"BEGIN:"]) - imported = [self importVcardData: fileContent]; - else - imported = 0; - } - - [rc setObject: [NSNumber numberWithInt: imported] - forKey: @"imported"]; - - response = [self responseWithStatus: 200]; - [response setHeader: @"text/html" - forKey: @"content-type"]; - [(WOResponse*)response appendContentString: [rc jsonRepresentation]]; - - return response; -} - -- (int) importLdifData: (NSString *) ldifData -{ - SOGoContactGCSFolder *folder; - NSString *key, *value; - NSArray *ldifContacts, *lines, *components; - NSMutableDictionary *entry; - NGVCard *vCard; - NSString *uid; - int i,j,count,linesCount; - int rc = 0; - - folder = [self clientObject]; - ldifContacts = [ldifData componentsSeparatedByString: @"\ndn"]; - count = [ldifContacts count]; - - for (i = 0; i < count; i++) - { - SOGoContactLDIFEntry *ldifEntry; - entry = [NSMutableDictionary dictionary]; - lines = [[ldifContacts objectAtIndex: i] - componentsSeparatedByString: @"\n"]; - - linesCount = [lines count]; - for (j = 0; j < linesCount; j++) - { - components = [[lines objectAtIndex: j] - componentsSeparatedByString: @": "]; - if ([components count] == 2) - { - key = [components objectAtIndex: 0]; - value = [components objectAtIndex: 1]; - - if ([key length] == 0) - key = @"dn"; - - [entry setObject: value forKey: key]; - } - else - { - break; - } - } - uid = [folder globallyUniqueObjectId]; - ldifEntry = [SOGoContactLDIFEntry contactEntryWithName: uid - withLDIFEntry: entry - inContainer: folder]; - if (ldifEntry) - { - vCard = [ldifEntry vCard]; - if ([self importVcard: vCard]) - rc++; - - } - } - return rc; -} - -- (int) importVcardData: (NSString *) vcardData -{ - NGVCard *card; - int rc; - - rc = 0; - card = [NGVCard parseSingleFromSource: vcardData]; - if ([self importVcard: card]) - rc = 1; - - return rc; -} - -- (BOOL) importVcard: (NGVCard *) card -{ - NSString *uid, *name; - SOGoContactGCSFolder *folder; - NSException *ex; - BOOL rc = NO; - - if (card) - { - folder = [self clientObject]; - uid = [folder globallyUniqueObjectId]; - name = [NSString stringWithFormat: @"%@.vcf", uid]; - [card setUid: uid]; - ex = [[folder ocsFolder] writeContent: [card versitString] - toName: name - baseVersion: 0]; - if (ex) - NSLog (@"write failed: %@", ex); - else - rc = YES; - } - - return rc; -} - - @end /* UIxContactsListView */ diff --git a/UI/Contacts/product.plist b/UI/Contacts/product.plist index 70dda492a..ea753e383 100644 --- a/UI/Contacts/product.plist +++ b/UI/Contacts/product.plist @@ -100,12 +100,12 @@ }; export = { protectedBy = "View"; - pageName = "UIxContactsListView"; + actionClass = "UIxContactFolderActions"; actionName = "export"; }; import = { protectedBy = "View"; - pageName = "UIxContactsListView"; + actionClass = "UIxContactFolderActions"; actionName = "import"; }; userRights = { diff --git a/UI/Scheduler/GNUmakefile b/UI/Scheduler/GNUmakefile index 9fd5165f5..70fefcb2a 100644 --- a/UI/Scheduler/GNUmakefile +++ b/UI/Scheduler/GNUmakefile @@ -21,6 +21,7 @@ SchedulerUI_OBJC_FILES = \ UIxCalDayTable.m \ UIxCalDateSelector.m \ UIxCalUserRightsEditor.m \ + UIxCalFolderActions.m \ \ UIxCalView.m \ UIxCalDayView.m \ diff --git a/UI/Scheduler/UIxCalFolderActions.h b/UI/Scheduler/UIxCalFolderActions.h new file mode 100644 index 000000000..ff7b3d229 --- /dev/null +++ b/UI/Scheduler/UIxCalFolderActions.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2004-2005 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo 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 + 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 + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#ifndef __UIxContactsListView_H__ +#define __UIxContactsListView_H__ + +#import + +@class NSDictionary; +@class NSString; + +@interface UIxCalFolderActions : UIxComponent +{ +} + +@end + +#endif /* __UIxContactsListView_H__ */ diff --git a/UI/Scheduler/UIxCalFolderActions.m b/UI/Scheduler/UIxCalFolderActions.m new file mode 100644 index 000000000..100c460ae --- /dev/null +++ b/UI/Scheduler/UIxCalFolderActions.m @@ -0,0 +1,163 @@ +/* + Copyright (C) 2004-2005 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo 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 + 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 + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#import +#import +#import +#import + +#import +#import +#import +#import +#import +#import + +#import +#import +#import +#import + +#import "UIxCalFolderActions.h" + +@implementation UIxCalFolderActions + +- (WOResponse *) exportAction +{ + WOResponse *response; + SOGoAppointmentFolder *folder; + SOGoAppointmentObject *appt; + NSArray *array, *values, *fields; + NSMutableString *rc; + iCalCalendar *calendar, *component; + int i, count; + + fields = [NSArray arrayWithObjects: @"c_name", @"c_content", nil]; + rc = [NSMutableString string]; + + response = [context response]; + + folder = [self clientObject]; + calendar = [iCalCalendar groupWithTag: @"vcalendar"]; + + array = [[folder ocsFolder] fetchFields: fields matchingQualifier: nil]; + count = [array count]; + for (i = 0; i < count; i++) + { + appt = [folder lookupName: [[array objectAtIndex: i] objectForKey: @"c_name"] + inContext: [self context] + acquire: NO]; + + component = [appt calendar: NO secure: NO]; + values = [component events]; + if (values && [values count]) + [calendar addChildren: values]; + values = [component todos]; + if (values && [values count]) + [calendar addChildren: values]; + values = [component journals]; + if (values && [values count]) + [calendar addChildren: values]; + values = [component freeBusys]; + if (values && [values count]) + [calendar addChildren: values]; + values = [component childrenWithTag: @"vtimezone"]; + if (values && [values count]) + [calendar addChildren: values]; + } + NSLog ([calendar versitString]); + + [response setHeader: @"text/calendar; charset=utf-8" + forKey:@"content-type"]; + [response setHeader: @"attachment;filename=Calendar.ics" + forKey: @"Content-Disposition"]; + [response setContent: [[calendar versitString] dataUsingEncoding: NSUTF8StringEncoding]]; + + return response; +} + +- (WOResponse *) importAction +{ + SOGoAppointmentFolder *folder; + NSMutableDictionary *rc; + NSArray *components; + WORequest *request; + WOResponse *response; + NSString *fileContent; + id data; + iCalCalendar *additions; + int i, count, imported; + + imported = 0; + rc = [NSMutableDictionary dictionary]; + request = [context request]; + folder = [self clientObject]; + data = [request formValueForKey: @"calendarFile"]; + if ([data respondsToSelector: @selector(isEqualToString:)]) + fileContent = (NSString *) data; + else + { + fileContent = [[NSString alloc] initWithData: (NSData *) data + encoding: NSUTF8StringEncoding]; + [fileContent autorelease]; + } + + if (fileContent && [fileContent length] + && [fileContent hasPrefix: @"BEGIN:"]) + { + additions = [iCalCalendar parseSingleFromSource: fileContent]; + if (additions) + { + components = [additions events]; + count = [components count]; + for (i = 0; i < count; i++) + if ([folder importComponent: [components objectAtIndex: i]]) + imported++; + components = [additions todos]; + count = [components count]; + for (i = 0; i < count; i++) + if ([folder importComponent: [components objectAtIndex: i]]) + imported++; + components = [additions journals]; + count = [components count]; + for (i = 0; i < count; i++) + if ([folder importComponent: [components objectAtIndex: i]]) + imported++; + components = [additions freeBusys]; + count = [components count]; + for (i = 0; i < count; i++) + if ([folder importComponent: [components objectAtIndex: i]]) + imported++; + } + } + + [rc setObject: [NSNumber numberWithInt: imported] + forKey: @"imported"]; + + response = [self responseWithStatus: 200]; + [response setHeader: @"text/html" + forKey: @"content-type"]; + [(WOResponse*)response appendContentString: [rc jsonRepresentation]]; + return response; +} + + +@end /* UIxCalFolderActions */ diff --git a/UI/Scheduler/UIxCalView.m b/UI/Scheduler/UIxCalView.m index b3ade064a..c43641cf1 100644 --- a/UI/Scheduler/UIxCalView.m +++ b/UI/Scheduler/UIxCalView.m @@ -643,125 +643,4 @@ static BOOL shouldDisplayWeekend = NO; return r; } - -- (WOResponse *) exportAction -{ - WOResponse *response; - SOGoAppointmentFolder *folder; - SOGoAppointmentObject *appt; - NSArray *array, *values, *fields; - NSMutableString *rc; - iCalCalendar *calendar, *component; - int i, count; - - fields = [NSArray arrayWithObjects: @"c_name", @"c_content", nil]; - rc = [NSMutableString string]; - - response = [[WOResponse alloc] init]; - [response autorelease]; - - folder = [self clientObject]; - calendar = [iCalCalendar groupWithTag: @"vcalendar"]; - - array = [[folder ocsFolder] fetchFields: fields matchingQualifier: nil]; - count = [array count]; - for (i = 0; i < count; i++) - { - appt = [folder lookupName: [[array objectAtIndex: i] objectForKey: @"c_name"] - inContext: [self context] - acquire: NO]; - - component = [appt calendar: NO secure: NO]; - values = [component events]; - if (values && [values count]) - [calendar addChildren: values]; - values = [component todos]; - if (values && [values count]) - [calendar addChildren: values]; - values = [component journals]; - if (values && [values count]) - [calendar addChildren: values]; - values = [component freeBusys]; - if (values && [values count]) - [calendar addChildren: values]; - values = [component childrenWithTag: @"vtimezone"]; - if (values && [values count]) - [calendar addChildren: values]; - } - NSLog ([calendar versitString]); - - [response setHeader: @"text/calendar" - forKey:@"content-type"]; - [response setHeader: @"attachment;filename=Calendar.ics" - forKey: @"Content-Disposition"]; - [response setContent: [[calendar versitString] dataUsingEncoding: NSUTF8StringEncoding]]; - - return response; -} - -- (WOResponse *) importAction -{ - SOGoAppointmentFolder *folder; - NSMutableDictionary *rc; - NSArray *components; - WORequest *request; - WOResponse *response; - NSString *fileContent; - id data; - iCalCalendar *additions; - int i, count, imported; - - imported = 0; - rc = [NSMutableDictionary dictionary]; - request = [context request]; - folder = [self clientObject]; - data = [request formValueForKey: @"calendarFile"]; - if ([data respondsToSelector: @selector(isEqualToString:)]) - fileContent = (NSString *) data; - else - { - fileContent = [[NSString alloc] initWithData: (NSData *) data - encoding: NSUTF8StringEncoding]; - [fileContent autorelease]; - } - - if (fileContent && [fileContent length] - && [fileContent hasPrefix: @"BEGIN:"]) - { - additions = [iCalCalendar parseSingleFromSource: fileContent]; - if (additions) - { - components = [additions events]; - count = [components count]; - for (i = 0; i < count; i++) - if ([folder importComponent: [components objectAtIndex: i]]) - imported++; - components = [additions todos]; - count = [components count]; - for (i = 0; i < count; i++) - if ([folder importComponent: [components objectAtIndex: i]]) - imported++; - components = [additions journals]; - count = [components count]; - for (i = 0; i < count; i++) - if ([folder importComponent: [components objectAtIndex: i]]) - imported++; - components = [additions freeBusys]; - count = [components count]; - for (i = 0; i < count; i++) - if ([folder importComponent: [components objectAtIndex: i]]) - imported++; - } - } - - [rc setObject: [NSNumber numberWithInt: imported] - forKey: @"imported"]; - - response = [self responseWithStatus: 200]; - [response setHeader: @"text/html" - forKey: @"content-type"]; - [(WOResponse*)response appendContentString: [rc jsonRepresentation]]; - return response; -} - @end /* UIxCalView */ diff --git a/UI/Scheduler/product.plist b/UI/Scheduler/product.plist index bc4239256..36c6e5664 100644 --- a/UI/Scheduler/product.plist +++ b/UI/Scheduler/product.plist @@ -79,11 +79,6 @@ actionClass = "UIxCalListingActions"; actionName = "findPossibleSlot"; }; - export = { - protectedBy = "View"; - actionClass = "UIxCalListingActions"; - actionName = "export"; - }; dayview = { protectedBy = "View"; pageName = "UIxCalDayView"; @@ -151,12 +146,12 @@ }; export = { protectedBy = "View"; - pageName = "UIxCalView"; + actionClass = "UIxCalFolderActions"; actionName = "export"; }; import = { protectedBy = "View"; - pageName = "UIxCalView"; + actionClass = "UIxCalFolderActions"; actionName = "import"; }; userRights = { diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index e46ed476d..02913ac5e 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -1932,7 +1932,7 @@ function uploadCompleted (response) { $("uploadResultsContent").update (labels["An error occured while importing calendar."]); else { $("uploadResultsContent").update (labels["Imported events:"] + " " + data.imported); - refreshCurrentFolder (); + refreshEventsAndDisplay (); } hideCalendarImport ();