diff --git a/ChangeLog b/ChangeLog index 1b5c432fd..aed9e2663 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-08-02 Wolfgang Sourdeau + + * SoObjects/Contacts/NSDictionary+Contact.m + ([NSDictionary -vcardContentFromSOGoContactRecord]): extension + method to convert the dictionary returned with the user submission + to a record in VCARD format to be stored in the database. + 2006-08-01 Wolfgang Sourdeau * UI/WebServerResources/MailerUI.js: when opening the context menu diff --git a/SoObjects/Contacts/GNUmakefile b/SoObjects/Contacts/GNUmakefile index a88e5c37a..f85981cb5 100644 --- a/SoObjects/Contacts/GNUmakefile +++ b/SoObjects/Contacts/GNUmakefile @@ -11,6 +11,8 @@ Contacts_OBJC_FILES = \ \ SOGoContactObject.m \ SOGoContactFolder.m \ + \ + NSDictionary+Contact.m Contacts_RESOURCE_FILES += \ Version \ diff --git a/SoObjects/Contacts/NSDictionary+Contact.h b/SoObjects/Contacts/NSDictionary+Contact.h new file mode 100644 index 000000000..3894a44f9 --- /dev/null +++ b/SoObjects/Contacts/NSDictionary+Contact.h @@ -0,0 +1,36 @@ +/* NSDictionary+Contact.h - this file is part of $PROJECT_NAME_HERE$ + * + * Copyright (C) 2006 Inverse groupe conseil + * + * 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_CONTACT_H +#define NSDICTIONARY_CONTACT_H + +#import + +@class NSString; + +@interface NSDictionary (SOGoContact) + +- (NSString *) vcardContentFromSOGoContactRecord; + +@end + +#endif /* NSDICTIONARY_CONTACT_H */ diff --git a/SoObjects/Contacts/NSDictionary+Contact.m b/SoObjects/Contacts/NSDictionary+Contact.m new file mode 100644 index 000000000..ff86e88fd --- /dev/null +++ b/SoObjects/Contacts/NSDictionary+Contact.m @@ -0,0 +1,111 @@ +/* NSDictionary+Contact.m - this file is part of SOGo + * + * Copyright (C) 2006 Inverse groupe conseil + * + * 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 "NSDictionary+Contact.h" + +@implementation NSDictionary (SOGoContact) + +- (void) _appendSingleVCardValue: (NSString *) value + withFormat: (NSString *) format + toVCard: (NSMutableString *) vCard +{ + NSString *info; + + info = [self objectForKey: value]; + if (info && [info length] > 0) + [vCard appendFormat: format, info]; +} + +- (NSString *) vcardContentFromSOGoContactRecord +{ + NSMutableString *newVCard; + NSString *info, *info2; + + newVCard = [NSMutableString new]; + [newVCard autorelease]; + + [newVCard appendString: @"BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "PRODID:-//OpenGroupware.org//LSAddress v5.3.85\r\n" + "PROFILE:vCard\r\n"]; + + [self _appendSingleVCardValue: @"cn" + withFormat: @"FN:%@" + toVCard: newVCard]; + + info = [self objectForKey: @"givenName"]; + if (!info || [info length] < 1) + info = @""; + info2 = [self objectForKey: @"sn"]; + if (!info2 || [info2 length] < 1) + info2 = @""; + [newVCard appendFormat: @"N:%@;%@;;;\r\n", + info2, info]; + + [self _appendSingleVCardValue: @"telephoneNumber" + withFormat: @"TEL;TYPE=work,voice,pref:%@" + toVCard: newVCard]; + [self _appendSingleVCardValue: @"facsimileTelephoneNumber" + withFormat: @"TEL;TYPE=work,fax:%@" + toVCard: newVCard]; + [self _appendSingleVCardValue: @"homeTelephoneNumber" + withFormat: @"TEL;TYPE=home,voice:%@" + toVCard: newVCard]; + [self _appendSingleVCardValue: @"mobile" + withFormat: @"TEL;TYPE=cell,voice:%@" + toVCard: newVCard]; + + info = [self objectForKey: @"l"]; + if (!info || [info length] < 1) + info = @""; + info2 = [self objectForKey: @"departmentNumber"]; + if (!info2 || [info2 length] < 1) + info2 = @""; + [newVCard appendFormat: @"ORG:%@;%@\r\n", + info, info2]; + + [newVCard appendString: @"END:VCARD\r\n"]; + + info = [[self objectForKey: @"postalAddress"] + stringByReplacingString: @"\r\n" + withString: @";"]; + if (info && [info length] > 0) + [newVCard appendFormat: @"ADR:TYPE=work,postal:%@", info]; + info = [[self objectForKey: @"homePostalAddress"] + stringByReplacingString: @"\r\n" + withString: @";"]; + if (info && [info length] > 0) + [newVCard appendFormat: @"ADR:TYPE=home,postal:%@", info]; + + [self _appendSingleVCardValue: @"mail" + withFormat: @"EMAIL;TYPE=internet,pref:%@" + toVCard: newVCard]; + [self _appendSingleVCardValue: @"labelledURI" + withFormat: @"URL:%@" + toVCard: newVCard]; + + return newVCard; +} + +@end diff --git a/SoObjects/Contacts/SOGoContactObject.m b/SoObjects/Contacts/SOGoContactObject.m index 05f05fb68..7abe4a250 100644 --- a/SoObjects/Contacts/SOGoContactObject.m +++ b/SoObjects/Contacts/SOGoContactObject.m @@ -19,9 +19,11 @@ 02111-1307, USA. */ -#include "SOGoContactObject.h" -#include -#include "common.h" +#import + +#import "common.h" +#import "SOGoContactObject.h" +#import "NSDictionary+Contact.h" @implementation SOGoContactObject @@ -92,14 +94,17 @@ /* specialized actions */ -- (NSException *)saveRecord:(id)_record { +- (NSException *) saveRecord: (id) _record +{ if ([_record isKindOfClass:[NGVCard class]]) { // TODO: implement a vCard generator return [NSException exceptionWithHTTPStatus:501 /* Not Implemented */ reason:@"Saving vCards is not supported yet."]; } - - return [self saveContentString:[_record description]]; + +// return [self saveContentString: [_record description]]; + return + [self saveContentString: [_record vcardContentFromSOGoContactRecord]]; } - (NSException *)patchField:(NSString *)_fname value:(NSString *)_value