diff --git a/ChangeLog b/ChangeLog index dd9b836fe..4f1007f3f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-09-02 Cyril Robert + + * UI/Contacts/UIxContactsListView.m (exportAction): Added + * UI/Scheduler/UIxCalView.m (exportAction): Added + 2009-08-27 Wolfgang Sourdeau * SoObjects/Appointments/SOGoCalendarProxy.[hm]: new class module diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index b63455a39..c64415c8f 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,8 @@ +2009-09-02 Cyril Robert + + * NGVCard.m (ldifString): Added, to support exporting + * NGVList.m (ldifString): Added, to support exporting + 2009-08-27 Wolfgang Sourdeau * iCalPerson.m (-setDelegatedTo:, -setDelegatedFrom:) diff --git a/SOPE/NGCards/NGVCard.h b/SOPE/NGCards/NGVCard.h index a687e2a01..9ede021b0 100644 --- a/SOPE/NGCards/NGVCard.h +++ b/SOPE/NGCards/NGVCard.h @@ -157,6 +157,7 @@ typedef enum - (NSString *) preferredEMail; - (NSString *) preferredTel; - (CardElement *) preferredAdr; +- (NSString *) ldifString; @end diff --git a/SOPE/NGCards/NGVCard.m b/SOPE/NGCards/NGVCard.m index cf457c4ed..f2d8214e4 100644 --- a/SOPE/NGCards/NGVCard.m +++ b/SOPE/NGCards/NGVCard.m @@ -508,4 +508,100 @@ return str; } + +- (NSString *) ldifString +{ + NSMutableString *rc; + NSString *buffer; + NSMutableArray *array; + id tmp; + + rc = [NSMutableString string]; + + [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"]; + + buffer = [self nickname]; + if (buffer && [buffer length] > 0) + [rc appendFormat: @"mozillaNickname: %@\n", buffer]; + + array = [NSMutableArray arrayWithArray: [self childrenWithTag: @"email"]]; + [array removeObjectsInArray: [self childrenWithTag: @"email" + andAttribute: @"type" + havingValue: @"pref"]]; + if ([array count]) + { + buffer = [[array objectAtIndex: [array count]-1] value: 0]; + + if ([buffer caseInsensitiveCompare: [self preferredEMail]] != NSOrderedSame) + [rc appendFormat: @"mozillaSecondEmail: %@\n", buffer]; + } + + array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"home"]; + if ([array count]) + [rc appendFormat: @"homePhone: %@\n", [[array objectAtIndex: 0] value: 0]]; + array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"fax"]; + if ([array count]) + [rc appendFormat: @"fax: %@\n", [[array objectAtIndex: 0] value: 0]]; + array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"cell"]; + if ([array count]) + [rc appendFormat: @"mobile: %@\n", [[array objectAtIndex: 0] value: 0]]; + array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"pager"]; + if ([array count]) + [rc appendFormat: @"pager: %@\n", [[array objectAtIndex: 0] value: 0]]; + + 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]]; + } + + array = [self org]; + if (array && [array count]) + [rc appendFormat: @"o: %@\n", [array objectAtIndex: 0]]; + + 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]]; + } + + array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"work"]; + if ([array count]) + [rc appendFormat: @"telephoneNumber: %@\n", [[array objectAtIndex: 0] value: 0]]; + + array = [self childrenWithTag: @"url" andAttribute: @"type" havingValue: @"work"]; + if ([array count]) + [rc appendFormat: @"workurl: %@\n", [[array objectAtIndex: 0] value: 0]]; + + array = [self childrenWithTag: @"url" andAttribute: @"type" havingValue: @"home"]; + if ([array count]) + [rc appendFormat: @"homeurl: %@\n", [[array objectAtIndex: 0] value: 0]]; + + tmp = [self note]; + if (tmp && [tmp length]) + [rc appendFormat: @"description: %@\n", tmp]; + + [rc appendFormat: @"\n"]; + + return rc; +} + @end /* NGVCard */ diff --git a/SOPE/NGCards/NGVList.h b/SOPE/NGCards/NGVList.h index 9c11b7d57..3d05aa36b 100644 --- a/SOPE/NGCards/NGVList.h +++ b/SOPE/NGCards/NGVList.h @@ -64,6 +64,8 @@ - (void) deleteCardReference: (NGVCardReference *) cardRef; - (NSArray *) cardReferences; +- (NSString *) ldifString; + @end #endif /* NGVLIST_H */ diff --git a/SOPE/NGCards/NGVList.m b/SOPE/NGCards/NGVList.m index 1961cc584..c3892f8d7 100644 --- a/SOPE/NGCards/NGVList.m +++ b/SOPE/NGCards/NGVList.m @@ -197,4 +197,36 @@ return [self childrenWithTag: @"card"]; } +- (NSString *) ldifString +{ + NSMutableString *rc; + NSMutableArray *array; + NGVCardReference *tmp; + int i, count; + + rc = [NSMutableString string]; + + [rc appendFormat: @"dn: cn=%@\n", [self fn]]; + [rc appendFormat: @"objectclass: top\nobjectclass: groupOfNames\n"]; + [rc appendFormat: @"cn: %@\n", [self fn]]; + if ([self nickname]) + [rc appendFormat: @"mozillaNickname: %@\n", [self nickname]]; + if ([self description]) + [rc appendFormat: @"description: %@\n", [self description]]; + + array = [self cardReferences]; + count = [array count]; + for (i = 0; i < count; i++) + { + tmp = [array objectAtIndex: i]; + [rc appendFormat: @"member: cn=%@,mail=%@\n", + [tmp fn], [tmp email]]; + } + + [rc appendFormat: @"\n"]; + + return rc; +} + + @end diff --git a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings index 9ce46f887..75a5089ac 100644 --- a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings @@ -178,3 +178,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/Czech.lproj/Localizable.strings b/UI/Contacts/Czech.lproj/Localizable.strings index fda9adcb8..90f3fc06d 100644 --- a/UI/Contacts/Czech.lproj/Localizable.strings +++ b/UI/Contacts/Czech.lproj/Localizable.strings @@ -178,3 +178,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/Dutch.lproj/Localizable.strings b/UI/Contacts/Dutch.lproj/Localizable.strings index ba776a83c..5f2fb5eca 100644 --- a/UI/Contacts/Dutch.lproj/Localizable.strings +++ b/UI/Contacts/Dutch.lproj/Localizable.strings @@ -178,3 +178,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/English.lproj/Localizable.strings b/UI/Contacts/English.lproj/Localizable.strings index c36ba3caa..0236bf267 100644 --- a/UI/Contacts/English.lproj/Localizable.strings +++ b/UI/Contacts/English.lproj/Localizable.strings @@ -178,3 +178,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/French.lproj/Localizable.strings b/UI/Contacts/French.lproj/Localizable.strings index 454b118e2..564bf1dd4 100644 --- a/UI/Contacts/French.lproj/Localizable.strings +++ b/UI/Contacts/French.lproj/Localizable.strings @@ -178,3 +178,5 @@ "Contacts" = "Contacts"; "Add" = "Ajouter"; "Lists can't be moved or copied." = "Les listes ne peuvent pas être déplacées ou copiées."; + +"Export" = "Exporter"; diff --git a/UI/Contacts/German.lproj/Localizable.strings b/UI/Contacts/German.lproj/Localizable.strings index 9f2fb4c10..dff732128 100644 --- a/UI/Contacts/German.lproj/Localizable.strings +++ b/UI/Contacts/German.lproj/Localizable.strings @@ -178,3 +178,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/Hungarian.lproj/Localizable.strings b/UI/Contacts/Hungarian.lproj/Localizable.strings index dc2bec8f1..2ae8c4ba0 100644 --- a/UI/Contacts/Hungarian.lproj/Localizable.strings +++ b/UI/Contacts/Hungarian.lproj/Localizable.strings @@ -178,3 +178,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/Italian.lproj/Localizable.strings b/UI/Contacts/Italian.lproj/Localizable.strings index 4f05d37ae..d4e1fcdee 100644 --- a/UI/Contacts/Italian.lproj/Localizable.strings +++ b/UI/Contacts/Italian.lproj/Localizable.strings @@ -178,3 +178,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/Russian.lproj/Localizable.strings b/UI/Contacts/Russian.lproj/Localizable.strings index de17f0da2..33b0838df 100644 --- a/UI/Contacts/Russian.lproj/Localizable.strings +++ b/UI/Contacts/Russian.lproj/Localizable.strings @@ -163,3 +163,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/Spanish.lproj/Localizable.strings b/UI/Contacts/Spanish.lproj/Localizable.strings index 3c42c092e..330aa201c 100644 --- a/UI/Contacts/Spanish.lproj/Localizable.strings +++ b/UI/Contacts/Spanish.lproj/Localizable.strings @@ -178,3 +178,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/UIxContactsListView.m b/UI/Contacts/UIxContactsListView.m index faa011cc2..beb3ffc31 100644 --- a/UI/Contacts/UIxContactsListView.m +++ b/UI/Contacts/UIxContactsListView.m @@ -34,6 +34,11 @@ #import #import +#import +#import +#import +#import + #import "UIxContactsListView.h" @implementation UIxContactsListView @@ -178,4 +183,45 @@ return YES; } + +- (id ) exportAction +{ + WORequest *request; + id response; + NSArray *contactsId; + NSEnumerator *uids; + NSString *uid; + id currentChild; + id 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; +} + + @end /* UIxContactsListView */ diff --git a/UI/Contacts/Welsh.lproj/Localizable.strings b/UI/Contacts/Welsh.lproj/Localizable.strings index 49b92aeb4..eeb7c0fdf 100644 --- a/UI/Contacts/Welsh.lproj/Localizable.strings +++ b/UI/Contacts/Welsh.lproj/Localizable.strings @@ -162,3 +162,5 @@ "Contacts" = "Contacts"; "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; + +"Export" = "Export"; diff --git a/UI/Contacts/product.plist b/UI/Contacts/product.plist index 496f7252e..2114a72ed 100644 --- a/UI/Contacts/product.plist +++ b/UI/Contacts/product.plist @@ -98,6 +98,11 @@ pageName = "UIxContactsListView"; actionName = "mailerContacts"; }; + export = { + protectedBy = "View"; + pageName = "UIxContactsListView"; + actionName = "export"; + }; userRights = { protectedBy = "ReadAcls"; pageName = "UIxContactsUserRightsEditor"; diff --git a/UI/Scheduler/UIxCalView.m b/UI/Scheduler/UIxCalView.m index f03419bc4..ad51a23f6 100644 --- a/UI/Scheduler/UIxCalView.m +++ b/UI/Scheduler/UIxCalView.m @@ -31,12 +31,17 @@ #import #import +#import #import #import #import #import +#import +#import +#import + #import "UIxCalView.h" @interface UIxCalView (PrivateAPI) @@ -632,4 +637,61 @@ 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; +} + + @end /* UIxCalView */ diff --git a/UI/Scheduler/product.plist b/UI/Scheduler/product.plist index 046199e5d..db6634a6d 100644 --- a/UI/Scheduler/product.plist +++ b/UI/Scheduler/product.plist @@ -79,6 +79,11 @@ actionClass = "UIxCalListingActions"; actionName = "findPossibleSlot"; }; + export = { + protectedBy = "View"; + actionClass = "UIxCalListingActions"; + actionName = "export"; + }; dayview = { protectedBy = "View"; pageName = "UIxCalDayView"; @@ -144,6 +149,11 @@ pageName = "UIxCalView"; actionName = "redirectForUIDs"; }; + export = { + protectedBy = "View"; + pageName = "UIxCalView"; + actionName = "export"; + }; userRights = { protectedBy = "ReadAcls"; pageName = "UIxCalUserRightsEditor"; diff --git a/UI/Templates/ContactsUI/UIxContactFoldersView.wox b/UI/Templates/ContactsUI/UIxContactFoldersView.wox index bbb826413..a6a985fe1 100644 --- a/UI/Templates/ContactsUI/UIxContactFoldersView.wox +++ b/UI/Templates/ContactsUI/UIxContactFoldersView.wox @@ -49,6 +49,7 @@
  • +
  • diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index 2e38d7c9b..34acb043b 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -214,7 +214,9 @@ function onFolderMenuHide(event) { function _onContactMenuAction(folderItem, action, refresh) { var selectedFolders = $("contactFolders").getSelectedNodes(); - var folderId = $(folderItem).readAttribute("folderId").substring(1); + var folderId = $(folderItem).readAttribute("folderId"); + if (folderId) + folderId = folderId.substring (1); if (Object.isArray(document.menuTarget) && selectedFolders.length > 0) { var selectedFolderId = $(selectedFolders[0]).readAttribute("id"); var contactIds = $(document.menuTarget).collect(function(row) { @@ -227,7 +229,6 @@ function _onContactMenuAction(folderItem, action, refresh) { return false; } } - var url = ApplicationBaseURL + selectedFolderId + "/" + action + "?folder=" + folderId + "&uid=" @@ -248,6 +249,19 @@ function onContactMenuMove(event) { _onContactMenuAction(this, "move", true); } +function onMenuExportContact (event) { + var selectedFolders = $("contactFolders").getSelectedNodes(); + var selectedFolderId = $(selectedFolders[0]).readAttribute("id"); + if (selectedFolderId != "/shared") { + var contactIds = $(document.menuTarget).collect(function(row) { + return row.getAttribute("id"); + }); + var url = ApplicationBaseURL + selectedFolderId + "/export" + + "?uid=" + contactIds.join("&uid="); + window.location.href = url; + } +} + function actionContactCallback(http) { if (http.readyState == 4) if (isHttpStatus204(http.status)) { @@ -977,7 +991,8 @@ function getMenus() { menus["contactMenu"] = new Array(onMenuEditContact, "-", onMenuWriteToContact, onMenuAIMContact, "-", onMenuDeleteContact, "-", - "moveContactMenu", "copyContactMenu"); + "moveContactMenu", "copyContactMenu", + onMenuExportContact); menus["searchMenu"] = new Array(setSearchCriteria); var contactFoldersMenu = $("contactFoldersMenu"); diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index fc47b6cce..c7f507f8c 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -1738,7 +1738,7 @@ function getMenus() { menus["calendarsMenu"] = new Array(onCalendarModify, "-", onCalendarNew, onCalendarRemove, - "-", null, null, "-", + "-", onCalendarExport, null, "-", null, "-", onMenuSharing); menus["searchMenu"] = new Array(setSearchCriteria); @@ -1877,6 +1877,17 @@ function onCalendarAdd(event) { openUserFolderSelector(onFolderSubscribeCB, "calendar"); preventDefault(event); } +function onCalendarExport(event) { + var node = $("calendarList").getSelectedNodes().first(); + var owner = node.getAttribute("owner"); + var folderId = node.getAttribute("id"); + if (owner == UserLogin) { + var folderIdElements = folderId.split(":"); + var id = folderIdElements[0].replace (/^\/+/g, ''); + var url = ApplicationBaseURL + "/" + id + "/export"; + window.location.href = url; + } +} function setEventsOnCalendar(checkBox, li) { li.observe("mousedown", listRowMouseDownHandler);