From 6a5af3ba35d85f3883b993826984e0cf6a6bb16c Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 11 Aug 2009 01:49:08 +0000 Subject: [PATCH 01/21] Update NEWS file Monotone-Parent: d085b8d79d3eca94ece4f311bf3d652d7f20bb00 Monotone-Revision: 04ba7fac2627906e1d9fb91e79b12769e1957a41 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-08-11T01:49:08 Monotone-Branch: ca.inverse.sogo --- NEWS | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 2301ca185..d8ca4320d 100644 --- a/NEWS +++ b/NEWS @@ -1,14 +1,18 @@ 1.0-2009mmdd (1.0.4) -------------------- - added contextual menu in web calendar views -- added "Reload" button to refresh the current view in the calendar +- added "Reload" button to refresh the current view in the calendar module - fixed freebusy support for Apple iCal - added support for the calendar application of the iPhone OS v3 - added the possibility to disable alarms or tasks from Web calendars - added support for printing cards +- added a default title when creating a new task or event +- the completion checkbox of read-only tasks is now disabled - the event/task summary dialog is now similar to Lightning +- added the current time as a line in the calendar module - replaced GNUstep's DO subsystem with memcached - added functional tests for DAV operations +- added Hungarian translation, thanks to Sándor Kuti 1.0-20090714 (1.0.3) -------------------- From ed79ed79fda442ea4a197e303fc93b4ece4b2b6e Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 11 Aug 2009 02:06:27 +0000 Subject: [PATCH 02/21] See ChangeLog Monotone-Parent: 04ba7fac2627906e1d9fb91e79b12769e1957a41 Monotone-Revision: 00ac31b5372de5deb01c919e39d6eacc4a512125 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-08-11T02:06:27 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 13 ++++ .../Appointments/SOGoAppointmentObject.m | 69 ++++++++++--------- UI/Scheduler/UIxComponentEditor.m | 21 ++++-- 3 files changed, 64 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index fbb7b7bf0..795b0ab57 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2009-08-11 Francis Lachapelle + + * UI/Scheduler/UIxComponentEditor.m ([UIxComponentEditor + -_handleOrganizer]): remove organizer when the event has no attendee. + ([UIxComponentEditor -_toolbarForOwner:andClientObject:]): return + the proper toolbar when editing the occurrence of a repeating event. + + * SoObjects/Appointments/SOGoAppointmentObject.m + ([SOGoAppointmentObject -saveComponent:]): when removing a single + attendee from an event, the organizer is no longer defined; + therefore, we must check if the owner is the organizer of the + previous version of the event, not the new event. + 2009-08-10 Ludovic Marcotte * SoObjects/SOGo/LDAPUserManager.m diff --git a/SoObjects/Appointments/SOGoAppointmentObject.m b/SoObjects/Appointments/SOGoAppointmentObject.m index 0f6ac3bfa..d92a7b9f6 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.m +++ b/SoObjects/Appointments/SOGoAppointmentObject.m @@ -274,6 +274,13 @@ } else { + // TODO : if [theEvent recurrenceId], only update this occurrence + // in attendee's calendar + + // TODO : when updating the master event, handle exception dates + // in attendee's calendar (add exception dates and remove matching + // occurrences) -- see _updateRecurrenceIDsWithEvent: + iCalString = [[theEvent parent] versitString]; } @@ -508,46 +515,44 @@ // as the event's UID might get modified in SOGoCalendarComponent: -saveComponent: [super saveComponent: newEvent]; - if ([newEvent userIsOrganizer: ownerUser]) + if ([self isNew]) { - if ([self isNew]) + // New event -- send invitation to all attendees + attendees = [newEvent attendeesWithoutUser: ownerUser]; + if ([attendees count]) { - // New event -- send invitation to all attendees - attendees = [newEvent attendeesWithoutUser: ownerUser]; - if ([attendees count]) - { - [self _handleAddedUsers: attendees fromEvent: newEvent]; - [self sendEMailUsingTemplateNamed: @"Invitation" - forObject: [newEvent itipEntryWithMethod: @"request"] - previousObject: nil - toAttendees: attendees]; - } - - if (![[newEvent attendees] count]) - [[newEvent uniqueChildWithTag: @"organizer"] setValue: 0 - to: @""]; + [self _handleAddedUsers: attendees fromEvent: newEvent]; + [self sendEMailUsingTemplateNamed: @"Invitation" + forObject: [newEvent itipEntryWithMethod: @"request"] + previousObject: nil + toAttendees: attendees]; } + } + else + { + // Event is modified -- sent update status to all attendees + // and modify their calendars. + recurrenceId = [newEvent recurrenceId]; + if (recurrenceId == nil) + oldEvent = [self component: NO secure: NO]; else { - // Event is modified -- sent update status to all attendees - // and modify their calendars. - recurrenceId = [newEvent recurrenceId]; - if (recurrenceId == nil) - oldEvent = [self component: NO secure: NO]; - else - { - // If recurrenceId is defined, find the specified occurence - // within the repeating vEvent. - recurrenceTime = [NSString stringWithFormat: @"%f", [recurrenceId timeIntervalSince1970]]; - oldEvent = (iCalEvent*)[self lookupOccurence: recurrenceTime]; - if (oldEvent == nil) - // If no occurence found, create one - oldEvent = (iCalEvent*)[self newOccurenceWithID: recurrenceTime]; - } + // If recurrenceId is defined, find the specified occurence + // within the repeating vEvent. + recurrenceTime = [NSString stringWithFormat: @"%f", [recurrenceId timeIntervalSince1970]]; + oldEvent = (iCalEvent*)[self lookupOccurence: recurrenceTime]; + if (oldEvent == nil) + // If no occurence found, create one + oldEvent = (iCalEvent*)[self newOccurenceWithID: recurrenceTime]; + } + + if ([[[oldEvent parent] firstChildWithTag: @"vevent"] userIsOrganizer: ownerUser]) + { + // The owner is the organizer of the event; handle the modifications + [self _handleUpdatedEvent: newEvent fromOldEvent: oldEvent]; // The sequence has possibly been increased -- resave the event. - // This will also take care of a decomposed group. [super saveComponent: newEvent]; } } diff --git a/UI/Scheduler/UIxComponentEditor.m b/UI/Scheduler/UIxComponentEditor.m index 3e6fa16b5..a26545287 100644 --- a/UI/Scheduler/UIxComponentEditor.m +++ b/UI/Scheduler/UIxComponentEditor.m @@ -1535,25 +1535,23 @@ RANGE(2); { NSString *organizerEmail; NSString *owner, *login; - BOOL isOwner, hasOrganizer, hasAttendees; + BOOL isOwner; //owner = [[self clientObject] ownerInContext: context]; owner = [componentCalendar ownerInContext: context]; login = [[context activeUser] login]; isOwner = [owner isEqualToString: login]; hasAttendees = [self hasAttendees]; - organizerEmail = [[component organizer] email]; - hasOrganizer = ([organizerEmail length] > 0); #if 1 - ASSIGN (organizer, [iCalPerson elementWithTag: @"organizer"]); - [component setOrganizer: organizer]; - if (hasAttendees) { SOGoUser *user; id identity; + ASSIGN (organizer, [iCalPerson elementWithTag: @"organizer"]); + [component setOrganizer: organizer]; + user = [SOGoUser userWithLogin: owner roles: nil]; identity = [user defaultIdentity]; [organizer setCn: [identity objectForKey: @"fullName"]]; @@ -1568,7 +1566,15 @@ RANGE(2); value: [NSString stringWithFormat: @"\"MAILTO:%@\"", currentEmail]]; } } + else + { + organizer = nil; + } + [component setOrganizer: organizer]; #else + BOOL hasOrganizer, hasAttendees; + organizerEmail = [[component organizer] email]; + hasOrganizer = ([organizerEmail length] > 0); if (hasOrganizer) { if (isOwner && !hasAttendees) @@ -1924,7 +1930,8 @@ RANGE(2); toolbarFilename = @"SOGoEmpty.toolbar"; else { - if ([clientObject isKindOfClass: [SOGoAppointmentObject class]]) + if ([clientObject isKindOfClass: [SOGoAppointmentObject class]] + || [clientObject isKindOfClass: [SOGoAppointmentOccurence class]]) toolbarFilename = @"SOGoAppointmentObject.toolbar"; else toolbarFilename = @"SOGoTaskObject.toolbar"; From 4d17df904c29c0f9433ce83df2bd7f0ebd06e71b Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 11 Aug 2009 02:32:19 +0000 Subject: [PATCH 03/21] Minor typo in French translation Monotone-Parent: 00ac31b5372de5deb01c919e39d6eacc4a512125 Monotone-Revision: aef2cae9c38aac963666dabf27439b30d4af4d23 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-08-11T02:32:19 Monotone-Branch: ca.inverse.sogo --- UI/Contacts/French.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/Contacts/French.lproj/Localizable.strings b/UI/Contacts/French.lproj/Localizable.strings index ed73ce1a9..90e1c01e0 100644 --- a/UI/Contacts/French.lproj/Localizable.strings +++ b/UI/Contacts/French.lproj/Localizable.strings @@ -160,7 +160,7 @@ "The selected contact has no email address." = "Cette personne n'a pas d'adresse courriel."; -"Please select a contact." = "Veuillez sélectionner un contact.."; +"Please select a contact." = "Veuillez sélectionner un contact."; /* Error messages for move and copy */ From 72f16aee96c125419929b17b39ab6e863d583edd Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 11 Aug 2009 03:19:05 +0000 Subject: [PATCH 04/21] Added scrollbar for address books list Monotone-Parent: aef2cae9c38aac963666dabf27439b30d4af4d23 Monotone-Revision: 49622a78cc682f73b0d14c2e5e0ba8cc5ddbdc89 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-08-11T03:19:05 Monotone-Branch: ca.inverse.sogo --- UI/WebServerResources/ContactsUI.css | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/UI/WebServerResources/ContactsUI.css b/UI/WebServerResources/ContactsUI.css index b5436a408..dfcf58262 100644 --- a/UI/WebServerResources/ContactsUI.css +++ b/UI/WebServerResources/ContactsUI.css @@ -126,7 +126,8 @@ A.toolbarButton { text-decoration: none; } UL#contactFolders -{ list-style-type: none; +{ display: block; + list-style-type: none; list-style-image: none; clear: both; cursor: default; @@ -135,13 +136,16 @@ UL#contactFolders position: absolute; /* required for Safari & IE */ top: 62px; /* leave space for the mini addressbook */ bottom: 0px; - width: 100%; - height: 100%; + left: 0; + right: 0; + width: auto; margin: 0px; padding: 0px; + overflow: auto; + overflow-x: hidden; border-top: 2px solid #222; border-left: 2px solid #222; - border-right: 1px solid #fff; + border-right: 0px; border-bottom: 1px solid #fff; -moz-border-top-colors: #9c9a94 #000; -moz-border-left-colors: #9c9a94 #000; From ee3f45e0df2af0bd154ebae9f1bbf780b0c65220 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 11 Aug 2009 16:52:10 +0000 Subject: [PATCH 05/21] Monotone-Parent: 00ac31b5372de5deb01c919e39d6eacc4a512125 Monotone-Revision: 6dba4565cf1a4808254012e5e6299fe143f884f5 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-11T16:52:10 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 10 +++++++++ .../Appointments/SOGoAppointmentObject.m | 21 ++++++++++++------- UI/Scheduler/UIxComponentEditor.m | 8 ++++--- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 795b0ab57..f8ef5503a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2009-08-11 Wolfgang Sourdeau + + * UI/Scheduler/UIxComponentEditor.m + (-takeValuesFromRequest:inContext:): same as below, for the organizer. + + * SoObjects/Appointments/SOGoAppointmentObject.m + (-changeParticipationStatus:forRecurrenceId): when setting the + "SENT-BY" attribute value, we need to use "setValue:0.." instead + "addValue:" to avoid invalid accumulation of values. + 2009-08-11 Francis Lachapelle * UI/Scheduler/UIxComponentEditor.m ([UIxComponentEditor diff --git a/SoObjects/Appointments/SOGoAppointmentObject.m b/SoObjects/Appointments/SOGoAppointmentObject.m index d92a7b9f6..0ad2d1f57 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.m +++ b/SoObjects/Appointments/SOGoAppointmentObject.m @@ -620,10 +620,12 @@ // the attendee, we add the user to the SENT-BY attribute. if (b && ![[currentUser login] isEqualToString: [theOwnerUser login]]) { - NSString *currentEmail; + NSString *currentEmail, *quotedEmail; currentEmail = [[currentUser allEmails] objectAtIndex: 0]; - [otherAttendee addAttribute: @"SENT-BY" - value: [NSString stringWithFormat: @"\"MAILTO:%@\"", currentEmail]]; + quotedEmail = [NSString stringWithFormat: @"\"MAILTO:%@\"", + currentEmail]; + [otherAttendee setValue: 0 ofAttribute: @"SENT-BY" + to: quotedEmail]; } else { @@ -672,10 +674,12 @@ currentUser = [context activeUser]; if (![[currentUser login] isEqualToString: [theOwnerUser login]]) { - NSString *currentEmail; - currentEmail = [[currentUser allEmails] objectAtIndex: 0]; - [attendee addAttribute: @"SENT-BY" - value: [NSString stringWithFormat: @"\"MAILTO:%@\"", currentEmail]]; + NSString *currentEmail, *quotedEmail; + currentEmail = [[currentUser allEmails] objectAtIndex: 0]; + quotedEmail = [NSString stringWithFormat: @"\"MAILTO:%@\"", + currentEmail]; + [attendee setValue: 0 ofAttribute: @"SENT-BY" + to: quotedEmail]; } else { @@ -1130,7 +1134,8 @@ return [self changeParticipationStatus: _status forRecurrenceId: nil]; } -- (NSException *) changeParticipationStatus: (NSString *) _status forRecurrenceId: (NSCalendarDate *) _recurrenceId +- (NSException *) changeParticipationStatus: (NSString *) _status + forRecurrenceId: (NSCalendarDate *) _recurrenceId { iCalCalendar *calendar; iCalEvent *event; diff --git a/UI/Scheduler/UIxComponentEditor.m b/UI/Scheduler/UIxComponentEditor.m index a26545287..94352e2b2 100644 --- a/UI/Scheduler/UIxComponentEditor.m +++ b/UI/Scheduler/UIxComponentEditor.m @@ -1559,11 +1559,13 @@ RANGE(2); if (!isOwner) { - NSString *currentEmail; + NSString *currentEmail, *quotedEmail; currentEmail = [[[context activeUser] allEmails] objectAtIndex: 0]; - [organizer addAttribute: @"SENT-BY" - value: [NSString stringWithFormat: @"\"MAILTO:%@\"", currentEmail]]; + quotedEmail = [NSString stringWithFormat: @"\"MAILTO:%@\"", + currentEmail]; + [organizer setValue: 0 ofAttribute: @"SENT-BY" + to: quotedEmail]; } } else From 69163c2e777925c18fd9b0e6b38fb54d7c379736 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 11 Aug 2009 17:31:05 +0000 Subject: [PATCH 06/21] Monotone-Parent: 7a113f7bea732d33ac70591602ece2a138aee9b3 Monotone-Revision: 2be1c953056e07d438f6e4e9c671154d6b76aa73 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-11T17:31:05 Monotone-Branch: ca.inverse.sogo --- NEWS | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index d8ca4320d..ef09fb722 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -1.0-2009mmdd (1.0.4) +1.0-20090811 (1.0.4) -------------------- - added contextual menu in web calendar views - added "Reload" button to refresh the current view in the calendar module @@ -11,7 +11,8 @@ - the event/task summary dialog is now similar to Lightning - added the current time as a line in the calendar module - replaced GNUstep's DO subsystem with memcached -- added functional tests for DAV operations +- added functional tests for DAV operations and fixed some issues related to + permissions - added Hungarian translation, thanks to Sándor Kuti 1.0-20090714 (1.0.3) From 84b02ae0e6f44e748b7e230681eccf7bc9d31ca6 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 11 Aug 2009 22:06:50 +0000 Subject: [PATCH 07/21] Monotone-Parent: 2be1c953056e07d438f6e4e9c671154d6b76aa73 Monotone-Revision: e40570621847a36134ad669eff2767443a9b9162 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-11T22:06:50 Monotone-Branch: ca.inverse.sogo --- NEWS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index ef09fb722..978571883 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,6 @@ -1.0-20090811 (1.0.4) +1.0-20090812 (1.0.4) -------------------- +- added ability to create and modify event categories in the preferences - added contextual menu in web calendar views - added "Reload" button to refresh the current view in the calendar module - fixed freebusy support for Apple iCal From 0d558abe536ee10161ee7b8688087619fe4e3093 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 11 Aug 2009 22:14:10 +0000 Subject: [PATCH 08/21] Monotone-Parent: e40570621847a36134ad669eff2767443a9b9162 Monotone-Revision: a4d2cb42139fa5aa987046a157ba109c95d5f3f3 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-11T22:14:10 Monotone-Branch: ca.inverse.sogo --- .../Appointments/BrazilianPortuguese.lproj/Localizable.strings | 0 SoObjects/Appointments/Czech.lproj/Localizable.strings | 0 SoObjects/Contacts/Czech.lproj/Localizable.strings | 0 UI/Common/BrazilianPortuguese.lproj/Localizable.strings | 0 UI/Common/Czech.lproj/Localizable.strings | 0 UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings | 0 UI/Contacts/Czech.lproj/Localizable.strings | 0 UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings | 0 UI/MailPartViewers/Czech.lproj/Localizable.strings | 0 UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings | 0 UI/MailerUI/Czech.lproj/Localizable.strings | 0 UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings | 0 UI/MainUI/Czech.lproj/Localizable.strings | 0 UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings | 0 UI/PreferencesUI/Czech.lproj/Localizable.strings | 0 UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings | 0 UI/Scheduler/Czech.lproj/Localizable.strings | 0 17 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings mode change 100755 => 100644 SoObjects/Appointments/Czech.lproj/Localizable.strings mode change 100755 => 100644 SoObjects/Contacts/Czech.lproj/Localizable.strings mode change 100755 => 100644 UI/Common/BrazilianPortuguese.lproj/Localizable.strings mode change 100755 => 100644 UI/Common/Czech.lproj/Localizable.strings mode change 100755 => 100644 UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings mode change 100755 => 100644 UI/Contacts/Czech.lproj/Localizable.strings mode change 100755 => 100644 UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings mode change 100755 => 100644 UI/MailPartViewers/Czech.lproj/Localizable.strings mode change 100755 => 100644 UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings mode change 100755 => 100644 UI/MailerUI/Czech.lproj/Localizable.strings mode change 100755 => 100644 UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings mode change 100755 => 100644 UI/MainUI/Czech.lproj/Localizable.strings mode change 100755 => 100644 UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings mode change 100755 => 100644 UI/PreferencesUI/Czech.lproj/Localizable.strings mode change 100755 => 100644 UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings mode change 100755 => 100644 UI/Scheduler/Czech.lproj/Localizable.strings diff --git a/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings b/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/Czech.lproj/Localizable.strings b/SoObjects/Appointments/Czech.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/SoObjects/Contacts/Czech.lproj/Localizable.strings b/SoObjects/Contacts/Czech.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/Common/BrazilianPortuguese.lproj/Localizable.strings b/UI/Common/BrazilianPortuguese.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/Common/Czech.lproj/Localizable.strings b/UI/Common/Czech.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/Contacts/Czech.lproj/Localizable.strings b/UI/Contacts/Czech.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/MailPartViewers/Czech.lproj/Localizable.strings b/UI/MailPartViewers/Czech.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/MailerUI/Czech.lproj/Localizable.strings b/UI/MailerUI/Czech.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/MainUI/Czech.lproj/Localizable.strings b/UI/MainUI/Czech.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/PreferencesUI/Czech.lproj/Localizable.strings b/UI/PreferencesUI/Czech.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings old mode 100755 new mode 100644 diff --git a/UI/Scheduler/Czech.lproj/Localizable.strings b/UI/Scheduler/Czech.lproj/Localizable.strings old mode 100755 new mode 100644 From a12ecf7fb18b4847283d3d31870bd9ec98b415ac Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Wed, 12 Aug 2009 13:56:55 +0000 Subject: [PATCH 09/21] Reindent Monotone-Parent: 2be1c953056e07d438f6e4e9c671154d6b76aa73 Monotone-Revision: bc37fb0ad700c92e022f76f3a58e82c8664df9f2 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-08-12T13:56:55 Monotone-Branch: ca.inverse.sogo --- UI/WebServerResources/UIxComponentEditor.js | 222 ++++++++++---------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/UI/WebServerResources/UIxComponentEditor.js b/UI/WebServerResources/UIxComponentEditor.js index d4cdb1849..f4e300a1f 100644 --- a/UI/WebServerResources/UIxComponentEditor.js +++ b/UI/WebServerResources/UIxComponentEditor.js @@ -1,124 +1,124 @@ /* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ function onPopupAttendeesWindow(event) { - if (event) - preventDefault(event); - window.open(ApplicationBaseURL + "/editAttendees", null, - "width=803,height=573"); + if (event) + preventDefault(event); + window.open(ApplicationBaseURL + "/editAttendees", null, + "width=803,height=573"); - return false; + return false; } function onSelectPrivacy(event) { - if (event.button == 0 || (isSafari() && event.button == 1)) { - var node = getTarget(event); - if (node.tagName != 'BUTTON') - node = $(node).up("button"); - popupToolbarMenu(node, "privacy-menu"); - Event.stop(event); - // preventDefault(event); - } + if (event.button == 0 || (isSafari() && event.button == 1)) { + var node = getTarget(event); + if (node.tagName != 'BUTTON') + node = $(node).up("button"); + popupToolbarMenu(node, "privacy-menu"); + Event.stop(event); + // preventDefault(event); + } } function onPopupAttachWindow(event) { - if (event) - preventDefault(event); + if (event) + preventDefault(event); - var attachInput = document.getElementById("attach"); - var newAttach = window.prompt(labels["Target:"], attachInput.value || "http://"); - if (newAttach != null) { - var documentHref = $("documentHref"); - var documentLabel = $("documentLabel"); - if (documentHref.childNodes.length > 0) { - documentHref.childNodes[0].nodeValue = newAttach; - if (newAttach.length > 0) - documentLabel.setStyle({ display: "block" }); - else - documentLabel.setStyle({ display: "none" }); + var attachInput = document.getElementById("attach"); + var newAttach = window.prompt(labels["Target:"], attachInput.value || "http://"); + if (newAttach != null) { + var documentHref = $("documentHref"); + var documentLabel = $("documentLabel"); + if (documentHref.childNodes.length > 0) { + documentHref.childNodes[0].nodeValue = newAttach; + if (newAttach.length > 0) + documentLabel.setStyle({ display: "block" }); + else + documentLabel.setStyle({ display: "none" }); + } + else { + documentHref.appendChild(document.createTextNode(newAttach)); + if (newAttach.length > 0) + documentLabel.setStyle({ display: "block" }); + } + attachInput.value = newAttach; } - else { - documentHref.appendChild(document.createTextNode(newAttach)); - if (newAttach.length > 0) - documentLabel.setStyle({ display: "block" }); - } - attachInput.value = newAttach; - } - onWindowResize(event); + onWindowResize(event); - return false; + return false; } function onPopupDocumentWindow(event) { - var documentUrl = $("attach"); + var documentUrl = $("attach"); - preventDefault(event); - window.open(documentUrl.value, "SOGo_Document"); + preventDefault(event); + window.open(documentUrl.value, "SOGo_Document"); - return false; + return false; } function onMenuSetClassification(event) { - event.cancelBubble = true; + event.cancelBubble = true; - var classification = this.getAttribute("classification"); - if (this.parentNode.chosenNode) - this.parentNode.chosenNode.removeClassName("_chosen"); - this.addClassName("_chosen"); - this.parentNode.chosenNode = this; + var classification = this.getAttribute("classification"); + if (this.parentNode.chosenNode) + this.parentNode.chosenNode.removeClassName("_chosen"); + this.addClassName("_chosen"); + this.parentNode.chosenNode = this; - var privacyInput = $("privacy"); - privacyInput.value = classification; + var privacyInput = $("privacy"); + privacyInput.value = classification; } function onChangeCalendar(event) { - var calendars = $("calendarFoldersList").value.split(","); - var form = document.forms["editform"]; - var urlElems = form.getAttribute("action").split("?"); - var choice = calendars[this.value]; - var urlParam = "moveToCalendar=" + choice; - if (urlElems.length == 1) - urlElems.push(urlParam); - else - urlElems[2] = urlParam; + var calendars = $("calendarFoldersList").value.split(","); + var form = document.forms["editform"]; + var urlElems = form.getAttribute("action").split("?"); + var choice = calendars[this.value]; + var urlParam = "moveToCalendar=" + choice; + if (urlElems.length == 1) + urlElems.push(urlParam); + else + urlElems[2] = urlParam; - while (urlElems.length > 2) - urlElems.pop(); + while (urlElems.length > 2) + urlElems.pop(); - form.setAttribute("action", urlElems.join("?")); + form.setAttribute("action", urlElems.join("?")); } function initializeDocumentHref() { - var documentHref = $("documentHref"); - var documentLabel = $("documentLabel"); - var documentUrl = $("attach"); + var documentHref = $("documentHref"); + var documentLabel = $("documentLabel"); + var documentUrl = $("attach"); - documentHref.observe("click", onPopupDocumentWindow, false); - documentHref.setStyle({ textDecoration: "underline", color: "#00f" }); - if (documentUrl.value.length > 0) { - documentHref.appendChild(document.createTextNode(documentUrl.value)); - documentLabel.setStyle({ display: "block" }); - } + documentHref.observe("click", onPopupDocumentWindow, false); + documentHref.setStyle({ textDecoration: "underline", color: "#00f" }); + if (documentUrl.value.length > 0) { + documentHref.appendChild(document.createTextNode(documentUrl.value)); + documentLabel.setStyle({ display: "block" }); + } - var changeUrlButton = $("changeAttachButton"); - if (changeUrlButton) - changeUrlButton.observe("click", onPopupAttachWindow, false); + var changeUrlButton = $("changeAttachButton"); + if (changeUrlButton) + changeUrlButton.observe("click", onPopupAttachWindow, false); } function initializePrivacyMenu() { - if ($("privacy-menu")) { - var privacy = $("privacy").value.toUpperCase(); - var privacyMenu = $("privacy-menu").childNodesWithTag("ul")[0]; - var menuEntries = $(privacyMenu).childNodesWithTag("li"); - var chosenNode; - if (privacy == "CONFIDENTIAL") - chosenNode = menuEntries[1]; - else if (privacy == "PRIVATE") - chosenNode = menuEntries[2]; - else - chosenNode = menuEntries[0]; - privacyMenu.chosenNode = chosenNode; - $(chosenNode).addClassName("_chosen"); - } + if ($("privacy-menu")) { + var privacy = $("privacy").value.toUpperCase(); + var privacyMenu = $("privacy-menu").childNodesWithTag("ul")[0]; + var menuEntries = $(privacyMenu).childNodesWithTag("li"); + var chosenNode; + if (privacy == "CONFIDENTIAL") + chosenNode = menuEntries[1]; + else if (privacy == "PRIVATE") + chosenNode = menuEntries[2]; + else + chosenNode = menuEntries[0]; + privacyMenu.chosenNode = chosenNode; + $(chosenNode).addClassName("_chosen"); + } } function onComponentEditorLoad(event) { @@ -178,8 +178,8 @@ function onComponentEditorLoad(event) { } function onSummaryChange (e) { - if ($("summary")) - document.title = $("summary").value; + if ($("summary")) + document.title = $("summary").value; } function onWindowResize(event) { @@ -247,40 +247,40 @@ function onPopupRecurrenceWindow(event) { } function onPopupReminderWindow(event) { - if (event) - preventDefault(event); - - var reminderHref = $("reminderHref"); - - var reminderList = $("reminderList"); - if (reminderList && reminderList.value == 15) { - reminderHref.show(); if (event) - window.open(ApplicationBaseURL + "editReminder", null, - "width=250,height=150"); - } - else if (reminderHref) - reminderHref.hide(); + preventDefault(event); - return false; + var reminderHref = $("reminderHref"); + + var reminderList = $("reminderList"); + if (reminderList && reminderList.value == 15) { + reminderHref.show(); + if (event) + window.open(ApplicationBaseURL + "editReminder", null, + "width=250,height=150"); + } + else if (reminderHref) + reminderHref.hide(); + + return false; } function onOkButtonClick (e) { - var item = $("replyList"); - var value = parseInt(item.options[item.selectedIndex].value); - var action = ""; + var item = $("replyList"); + var value = parseInt(item.options[item.selectedIndex].value); + var action = ""; - if (value == 0) - action = 'accept'; - else if (value == 1) - action = 'decline'; + if (value == 0) + action = 'accept'; + else if (value == 1) + action = 'decline'; - if (action != "") - modifyEvent (item, action); + if (action != "") + modifyEvent (item, action); } function onCancelButtonClick (e) { - window.close (); + window.close (); } document.observe("dom:loaded", onComponentEditorLoad); From aab012ec5be2d89a2e7ef21655d36797fbc92605 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 12 Aug 2009 14:13:46 +0000 Subject: [PATCH 10/21] Monotone-Parent: a4d2cb42139fa5aa987046a157ba109c95d5f3f3 Monotone-Revision: 64564dd4ca1852af3441d98e355837a9511444c6 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-12T14:13:46 Monotone-Branch: ca.inverse.sogo --- .../SOGoAptMailBrazilianPortugueseDeletion.html | 0 .../SOGoAptMailBrazilianPortugueseDeletion.wod | 0 .../SOGoAptMailBrazilianPortugueseICalReply.html | 0 .../SOGoAptMailBrazilianPortugueseICalReply.wod | 0 .../SOGoAptMailBrazilianPortugueseInvitation.html | 0 .../SOGoAptMailBrazilianPortugueseInvitation.wod | 0 .../SOGoAptMailBrazilianPortugueseUpdate.html | 0 .../SOGoAptMailBrazilianPortugueseUpdate.wod | 0 .../SOGoAptMailCzechDeletion.wo/SOGoAptMailCzechDeletion.html | 0 .../SOGoAptMailCzechICalReply.wo/SOGoAptMailCzechICalReply.html | 0 .../SOGoAptMailCzechInvitation.wo/SOGoAptMailCzechInvitation.html | 0 .../SOGoAptMailCzechUpdate.wo/SOGoAptMailCzechUpdate.html | 0 .../SOGoMailBrazilianPortugueseForward.html | 0 .../SOGoMailBrazilianPortugueseForward.wod | 0 .../SOGoMailBrazilianPortugueseReply.html | 0 .../SOGoMailBrazilianPortugueseReply.wod | 0 .../Mailer/SOGoMailCzechForward.wo/SOGoMailCzechForward.html | 0 SoObjects/Mailer/SOGoMailCzechReply.wo/SOGoMailCzechReply.html | 0 UI/MainUI/Czech.lproj/Locale | 0 19 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailBrazilianPortugueseDeletion.wo/SOGoAptMailBrazilianPortugueseDeletion.html mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailBrazilianPortugueseDeletion.wo/SOGoAptMailBrazilianPortugueseDeletion.wod mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailBrazilianPortugueseICalReply.wo/SOGoAptMailBrazilianPortugueseICalReply.html mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailBrazilianPortugueseICalReply.wo/SOGoAptMailBrazilianPortugueseICalReply.wod mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailBrazilianPortugueseInvitation.wo/SOGoAptMailBrazilianPortugueseInvitation.html mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailBrazilianPortugueseInvitation.wo/SOGoAptMailBrazilianPortugueseInvitation.wod mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailBrazilianPortugueseUpdate.wo/SOGoAptMailBrazilianPortugueseUpdate.html mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailBrazilianPortugueseUpdate.wo/SOGoAptMailBrazilianPortugueseUpdate.wod mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailCzechDeletion.wo/SOGoAptMailCzechDeletion.html mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailCzechICalReply.wo/SOGoAptMailCzechICalReply.html mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailCzechInvitation.wo/SOGoAptMailCzechInvitation.html mode change 100755 => 100644 SoObjects/Appointments/SOGoAptMailCzechUpdate.wo/SOGoAptMailCzechUpdate.html mode change 100755 => 100644 SoObjects/Mailer/SOGoMailBrazilianPortugueseForward.wo/SOGoMailBrazilianPortugueseForward.html mode change 100755 => 100644 SoObjects/Mailer/SOGoMailBrazilianPortugueseForward.wo/SOGoMailBrazilianPortugueseForward.wod mode change 100755 => 100644 SoObjects/Mailer/SOGoMailBrazilianPortugueseReply.wo/SOGoMailBrazilianPortugueseReply.html mode change 100755 => 100644 SoObjects/Mailer/SOGoMailBrazilianPortugueseReply.wo/SOGoMailBrazilianPortugueseReply.wod mode change 100755 => 100644 SoObjects/Mailer/SOGoMailCzechForward.wo/SOGoMailCzechForward.html mode change 100755 => 100644 SoObjects/Mailer/SOGoMailCzechReply.wo/SOGoMailCzechReply.html mode change 100755 => 100644 UI/MainUI/Czech.lproj/Locale diff --git a/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseDeletion.wo/SOGoAptMailBrazilianPortugueseDeletion.html b/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseDeletion.wo/SOGoAptMailBrazilianPortugueseDeletion.html old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseDeletion.wo/SOGoAptMailBrazilianPortugueseDeletion.wod b/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseDeletion.wo/SOGoAptMailBrazilianPortugueseDeletion.wod old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseICalReply.wo/SOGoAptMailBrazilianPortugueseICalReply.html b/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseICalReply.wo/SOGoAptMailBrazilianPortugueseICalReply.html old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseICalReply.wo/SOGoAptMailBrazilianPortugueseICalReply.wod b/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseICalReply.wo/SOGoAptMailBrazilianPortugueseICalReply.wod old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseInvitation.wo/SOGoAptMailBrazilianPortugueseInvitation.html b/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseInvitation.wo/SOGoAptMailBrazilianPortugueseInvitation.html old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseInvitation.wo/SOGoAptMailBrazilianPortugueseInvitation.wod b/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseInvitation.wo/SOGoAptMailBrazilianPortugueseInvitation.wod old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseUpdate.wo/SOGoAptMailBrazilianPortugueseUpdate.html b/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseUpdate.wo/SOGoAptMailBrazilianPortugueseUpdate.html old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseUpdate.wo/SOGoAptMailBrazilianPortugueseUpdate.wod b/SoObjects/Appointments/SOGoAptMailBrazilianPortugueseUpdate.wo/SOGoAptMailBrazilianPortugueseUpdate.wod old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailCzechDeletion.wo/SOGoAptMailCzechDeletion.html b/SoObjects/Appointments/SOGoAptMailCzechDeletion.wo/SOGoAptMailCzechDeletion.html old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailCzechICalReply.wo/SOGoAptMailCzechICalReply.html b/SoObjects/Appointments/SOGoAptMailCzechICalReply.wo/SOGoAptMailCzechICalReply.html old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailCzechInvitation.wo/SOGoAptMailCzechInvitation.html b/SoObjects/Appointments/SOGoAptMailCzechInvitation.wo/SOGoAptMailCzechInvitation.html old mode 100755 new mode 100644 diff --git a/SoObjects/Appointments/SOGoAptMailCzechUpdate.wo/SOGoAptMailCzechUpdate.html b/SoObjects/Appointments/SOGoAptMailCzechUpdate.wo/SOGoAptMailCzechUpdate.html old mode 100755 new mode 100644 diff --git a/SoObjects/Mailer/SOGoMailBrazilianPortugueseForward.wo/SOGoMailBrazilianPortugueseForward.html b/SoObjects/Mailer/SOGoMailBrazilianPortugueseForward.wo/SOGoMailBrazilianPortugueseForward.html old mode 100755 new mode 100644 diff --git a/SoObjects/Mailer/SOGoMailBrazilianPortugueseForward.wo/SOGoMailBrazilianPortugueseForward.wod b/SoObjects/Mailer/SOGoMailBrazilianPortugueseForward.wo/SOGoMailBrazilianPortugueseForward.wod old mode 100755 new mode 100644 diff --git a/SoObjects/Mailer/SOGoMailBrazilianPortugueseReply.wo/SOGoMailBrazilianPortugueseReply.html b/SoObjects/Mailer/SOGoMailBrazilianPortugueseReply.wo/SOGoMailBrazilianPortugueseReply.html old mode 100755 new mode 100644 diff --git a/SoObjects/Mailer/SOGoMailBrazilianPortugueseReply.wo/SOGoMailBrazilianPortugueseReply.wod b/SoObjects/Mailer/SOGoMailBrazilianPortugueseReply.wo/SOGoMailBrazilianPortugueseReply.wod old mode 100755 new mode 100644 diff --git a/SoObjects/Mailer/SOGoMailCzechForward.wo/SOGoMailCzechForward.html b/SoObjects/Mailer/SOGoMailCzechForward.wo/SOGoMailCzechForward.html old mode 100755 new mode 100644 diff --git a/SoObjects/Mailer/SOGoMailCzechReply.wo/SOGoMailCzechReply.html b/SoObjects/Mailer/SOGoMailCzechReply.wo/SOGoMailCzechReply.html old mode 100755 new mode 100644 diff --git a/UI/MainUI/Czech.lproj/Locale b/UI/MainUI/Czech.lproj/Locale old mode 100755 new mode 100644 From e4999b857b5321e8f3a270e5c068eea90b682b56 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Wed, 12 Aug 2009 14:13:54 +0000 Subject: [PATCH 11/21] Monotone-Parent: bc37fb0ad700c92e022f76f3a58e82c8664df9f2 Monotone-Revision: 0e58e513a89ec890f9064334253d81189c9b4b77 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-08-12T14:13:54 Monotone-Branch: ca.inverse.sogo --- UI/Scheduler/UIxComponentEditor.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UI/Scheduler/UIxComponentEditor.m b/UI/Scheduler/UIxComponentEditor.m index 94352e2b2..73ed2fdc5 100644 --- a/UI/Scheduler/UIxComponentEditor.m +++ b/UI/Scheduler/UIxComponentEditor.m @@ -1533,9 +1533,8 @@ RANGE(2); - (void) _handleOrganizer { - NSString *organizerEmail; NSString *owner, *login; - BOOL isOwner; + BOOL isOwner, hasAttendees; //owner = [[self clientObject] ownerInContext: context]; owner = [componentCalendar ownerInContext: context]; @@ -1574,7 +1573,8 @@ RANGE(2); } [component setOrganizer: organizer]; #else - BOOL hasOrganizer, hasAttendees; + NSString *organizerEmail; + BOOL hasOrganizer; organizerEmail = [[component organizer] email]; hasOrganizer = ([organizerEmail length] > 0); if (hasOrganizer) From ccdf1fb60d4bf7d9c0c91789e53707dec2fbdd93 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Wed, 12 Aug 2009 15:18:07 +0000 Subject: [PATCH 12/21] Updated release number to 1.0.4 Monotone-Parent: b73c9a8e960042141668dfb6cc60ef8926fd189a Monotone-Revision: b3e9a0e81aa41a6be8c77273ff406daa098503f6 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-08-12T15:18:07 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 4 ++++ UI/MainUI/Version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index f8ef5503a..301a15ef8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2009-08-12 Francis Lachapelle + + * UI/MainUI/Version (SUBMINOR_VERSION): 1.0.4 release. + 2009-08-11 Wolfgang Sourdeau * UI/Scheduler/UIxComponentEditor.m diff --git a/UI/MainUI/Version b/UI/MainUI/Version index afdd0b107..a27aed793 100644 --- a/UI/MainUI/Version +++ b/UI/MainUI/Version @@ -1,5 +1,5 @@ # Version file -SUBMINOR_VERSION:=3 +SUBMINOR_VERSION:=4 # v0.9.1 requires Main v0.9.59 From 8b9042d24d7012f830259947fa239835ccb89efb Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 12 Aug 2009 15:25:33 +0000 Subject: [PATCH 13/21] Monotone-Parent: b3e9a0e81aa41a6be8c77273ff406daa098503f6 Monotone-Revision: e36cbb9da53308642513123a9831ab22030eca9f Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-12T15:25:33 Monotone-Branch: ca.inverse.sogo --- SOPE/sope-deb.diff | 265 -- SOPE/sope-debian.diff | 8197 +++++++++++++++++++++++++++++++++++++++++ debian/changelog | 9 + debian/control | 25 +- debian/copyright | 31 +- debian/rules | 69 +- debian/sogo.docs | 1 - debian/sogo.install | 9 +- debian/sogo.postinst | 41 +- debian/sogo.postrm | 34 +- debian/sogo.prerm | 23 +- 11 files changed, 8355 insertions(+), 349 deletions(-) delete mode 100644 SOPE/sope-deb.diff create mode 100644 SOPE/sope-debian.diff mode change 100755 => 100644 debian/sogo.postinst mode change 100755 => 100644 debian/sogo.postrm mode change 100755 => 100644 debian/sogo.prerm diff --git a/SOPE/sope-deb.diff b/SOPE/sope-deb.diff deleted file mode 100644 index 2ff157e83..000000000 --- a/SOPE/sope-deb.diff +++ /dev/null @@ -1,265 +0,0 @@ -Index: debian/sope_SOPEVER_-versitsaxdriver.install -=================================================================== ---- debian/sope_SOPEVER_-versitsaxdriver.install (revision 1660) -+++ debian/sope_SOPEVER_-versitsaxdriver.install (working copy) -@@ -1 +1,2 @@ - usr/lib/sope-*/saxdrivers/versitSaxDriver.sax -+usr/lib/GNUstep/SaxDrivers-4.9/versitSaxDriver.sax -Index: debian/control -=================================================================== ---- debian/control (revision 1660) -+++ debian/control (working copy) -@@ -1,7 +1,7 @@ - Source: sope - Priority: extra - Maintainer: Sebastian Ley --Build-Depends: debhelper (>= 4.0.0), dpatch, gnustep-make-ogo, gobjc | objc-compiler, libfoundation1.1-dev, libobjc1, libxml2-dev, libldap2-dev | libldap-dev, libssl-dev, zlib1g-dev, libpq-dev | postgresql-dev, libecpg-dev, apache-dev, apache2-threaded-dev | apache2-prefork-dev | apache2-dev, autotools-dev -+Build-Depends: debhelper (>= 4.0.0), dpatch, gnustep-make, gobjc | objc-compiler, libxml2-dev, libldap2-dev | libldap-dev, libssl-dev, zlib1g-dev, libpq-dev | postgresql-dev, apache2-threaded-dev | apache2-prefork-dev | apache2-dev, autotools-dev - Standards-Version: 3.6.1 - - Package: libsope4.9-dev -@@ -265,18 +265,3 @@ - . - This parser enables SOPE's SAX engine to parse iCal and vCard files. - --Package: libapache-mod-ngobjweb --Section: web --Architecture: any --Depends: ${shlibs:Depends}, ${misc:Depends}, ucf (>= 0.8), apache-common (>= 1.3.29) --Description: Apache module for the SOPE application server -- This package contains an apache module which enables the apache -- webserver to deliver pages generated by the SOPE application server. -- --Package: libapache2-mod-ngobjweb --Section: web --Architecture: any --Depends: ${shlibs:Depends}, ${misc:Depends}, apache2-common | apache2.2-common --Description: Apache2 module for the SOPE application server -- This package contains an apache module which enables the apache2 -- webserver to deliver pages generated by the SOPE application server. -Index: debian/libsope-gdl1-_SOPEVER_-dev.install -=================================================================== ---- debian/libsope-gdl1-_SOPEVER_-dev.install (revision 1660) -+++ debian/libsope-gdl1-_SOPEVER_-dev.install (working copy) -@@ -1,2 +1,2 @@ --usr/include/GDLAccess -+usr/include/GNUstep/GDLAccess - usr/lib/libGDLAccess.so -Index: debian/sope_SOPEVER_-appserver.install -=================================================================== ---- debian/sope_SOPEVER_-appserver.install (revision 1660) -+++ debian/sope_SOPEVER_-appserver.install (working copy) -@@ -1 +1,2 @@ --usr/sbin/sope-* -+usr/lib/GNUstep/SoProducts-4.9 -+usr/lib/GNUstep/WOxElemBuilders-4.9 -Index: debian/control.in -=================================================================== ---- debian/control.in (revision 1660) -+++ debian/control.in (working copy) -@@ -264,19 +264,3 @@ - name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. - . - This parser enables SOPE's SAX engine to parse iCal and vCard files. -- --Package: libapache-mod-ngobjweb --Section: web --Architecture: any --Depends: ${shlibs:Depends}, ${misc:Depends}, ucf (>= 0.8), apache-common (>= 1.3.29) --Description: Apache module for the SOPE application server -- This package contains an apache module which enables the apache -- webserver to deliver pages generated by the SOPE application server. -- --Package: libapache2-mod-ngobjweb --Section: web --Architecture: any --Depends: ${shlibs:Depends}, ${misc:Depends}, apache2-common | apache2.2-common --Description: Apache2 module for the SOPE application server -- This package contains an apache module which enables the apache2 -- webserver to deliver pages generated by the SOPE application server. -Index: debian/libsope-appserver_SOPEVER_-dev.install -=================================================================== ---- debian/libsope-appserver_SOPEVER_-dev.install (revision 1660) -+++ debian/libsope-appserver_SOPEVER_-dev.install (working copy) -@@ -1,11 +1,10 @@ --usr/include/NGHttp --usr/include/NGObjWeb --usr/include/WOXML --usr/include/WOExtensions --usr/include/WEExtensions --usr/include/NGXmlRpc --usr/include/SoOFS --usr/lib/opengroupware.org/System/Library/Makefiles -+usr/include/GNUstep/NGHttp -+usr/include/GNUstep/NGObjWeb -+usr/include/GNUstep/WOXML -+usr/include/GNUstep/WOExtensions -+usr/include/GNUstep/WEExtensions -+usr/include/GNUstep/NGXmlRpc -+usr/include/GNUstep/SoOFS - usr/lib/libNGObjWeb.so - usr/lib/libWOXML.so - usr/lib/libWOExtensions.so -Index: debian/libsope-ical_SOPEVER_-dev.install -=================================================================== ---- debian/libsope-ical_SOPEVER_-dev.install (revision 1660) -+++ debian/libsope-ical_SOPEVER_-dev.install (working copy) -@@ -1,2 +1,2 @@ --usr/include/NGiCal -+usr/include/GNUstep/NGiCal - usr/lib/libNGiCal.so -Index: debian/sope_SOPEVER_-libxmlsaxdriver.install -=================================================================== ---- debian/sope_SOPEVER_-libxmlsaxdriver.install (revision 1660) -+++ debian/sope_SOPEVER_-libxmlsaxdriver.install (working copy) -@@ -1 +1,2 @@ - usr/lib/sope-*/saxdrivers/libxmlSAXDriver.sax -+usr/lib/GNUstep/SaxDrivers-4.9/libxmlSAXDriver.sax -Index: debian/libsope-appserver_SOPEVER_.install -=================================================================== ---- debian/libsope-appserver_SOPEVER_.install (revision 1660) -+++ debian/libsope-appserver_SOPEVER_.install (working copy) -@@ -6,5 +6,6 @@ - usr/lib/libSoOFS.so.* - usr/lib/libWEPrototype.so.* - usr/share/sope-*/ngobjweb -+usr/lib/GNUstep/Libraries/Resources/NGObjWeb - usr/lib/sope-*/products - usr/lib/sope-*/wox-builders -Index: debian/sope_SOPEVER_-stxsaxdriver.install -=================================================================== ---- debian/sope_SOPEVER_-stxsaxdriver.install (revision 1660) -+++ debian/sope_SOPEVER_-stxsaxdriver.install (working copy) -@@ -1 +1,2 @@ - usr/lib/sope-*/saxdrivers/STXSaxDriver.sax -+usr/lib/GNUstep/SaxDrivers-4.9/STXSaxDriver.sax -Index: debian/rules -=================================================================== ---- debian/rules (revision 1660) -+++ debian/rules (working copy) -@@ -13,7 +13,7 @@ - #WARN: doesn't compile/package if HAS_LIBRARY_* options not present (since we use configure now) - MAKE_FLAGS = messages=yes OPTFLAG=-O0 HAS_LIBRARY_ldap=yes HAS_LIBRARY_pq=yes HAS_LIBRARY_xml2=yes - --GNUSTEP_SETUP=/usr/lib/opengroupware.org/System/Library/Makefiles/GNUstep.sh -+GNUSTEP_SETUP=/usr/share/GNUstep/Makefiles/GNUstep.sh - - include Version - SOPEVER=$(MAJOR_VERSION).$(MINOR_VERSION) -@@ -57,9 +57,9 @@ - config.status: configure - dh_testdir - CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ -- ./configure -- --build: build-stamp controlfiles -+ ./configure --with-gnustep -+ -+build: configure build-stamp controlfiles - build-stamp: patch-stamp - dh_testdir - -@@ -69,16 +69,10 @@ - ln -s /usr/share/misc/config.sub sope-core/NGStreams/config.sub - - CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ -- $(MAKE) $(MAKE_FLAGS) all -+ ./configure --with-gnustep - -- cp -R sope-appserver/mod_ngobjweb sope-appserver/mod_ngobjweb-apache2 -- - CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ -- $(MAKE) $(MAKE_FLAGS) APXS=/usr/bin/apxs -C sope-appserver/mod_ngobjweb all -- -- CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ -- $(MAKE) $(MAKE_FLAGS) APXS="/usr/bin/apxs2" APXS_INCLUDE_DIRS="$(shell apxs2 -q EXTRA_INCLUDES)"\ -- -C sope-appserver/mod_ngobjweb-apache2 all -+ $(MAKE) $(MAKE_FLAGS) all - - touch build-stamp - -@@ -119,21 +113,21 @@ - # Add here commands to install the package into debian/tmp - CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ - $(MAKE) $(MAKE_FLAGS) install \ -- GNUSTEP_INSTALLATION_DIR=$(CURDIR)/debian/tmp/$$GNUSTEP_SYSTEM_ROOT\ -- INSTALL_ROOT_DIR=$(CURDIR)/debian/tmp\ -+ DESTDIR=$(CURDIR)/debian/tmp GNUSTEP_INSTALLATION_DOMAIN=SYSTEM -+# INSTALL_ROOT_DIR=$(CURDIR)/debian/tmp\ - FHS_INSTALL_ROOT=$(CURDIR)/debian/tmp/usr \ - FHS_LIB_DIR=$(CURDIR)/debian/tmp/usr/lib/ #WARN: <- trailing slash unbroke build/packages?! - -- CFLAGS="$(CFLGAS)" . $(GNUSTEP_SETUP); \ -+# CFLAGS="$(CFLGAS)" . $(GNUSTEP_SETUP); \ - $(MAKE) $(MAKE_FLAGS) -C sope-appserver/mod_ngobjweb install \ -- GNUSTEP_INSTALLATION_DIR=$(CURDIR)/debian/tmp/usr/lib/apache/1.3 -+ GNUSTEP_INSTALLATION_DOMAIN=$(CURDIR)/debian/tmp/usr/lib/apache/1.3 - -- CFLAGS="$(CFLGAS)" . $(GNUSTEP_SETUP); \ -+# CFLAGS="$(CFLGAS)" . $(GNUSTEP_SETUP); \ - $(MAKE) $(MAKE_FLAGS) -C sope-appserver/mod_ngobjweb-apache2 install \ -- GNUSTEP_INSTALLATION_DIR=$(CURDIR)/debian/tmp/usr/lib/apache2/modules -+ GNUSTEP_INSTALLATION_DOMAIN=$(CURDIR)/debian/tmp/usr/lib/apache2/modules - -- install -m 644 debian/500mod_ngobjweb.info $(CURDIR)/debian/libapache-mod-ngobjweb/usr/lib/apache/1.3 -- install -m 644 debian/ngobjweb.load $(CURDIR)/debian/libapache2-mod-ngobjweb/etc/apache2/mods-available -+ #install -m 644 debian/500mod_ngobjweb.info $(CURDIR)/debian/libapache-mod-ngobjweb/usr/lib/apache/1.3 -+ #install -m 644 debian/ngobjweb.load $(CURDIR)/debian/libapache2-mod-ngobjweb/etc/apache2/mods-available - - # Build architecture-independent files here. - binary-indep: build install -Index: debian/libsope-ldap_SOPEVER_-dev.install -=================================================================== ---- debian/libsope-ldap_SOPEVER_-dev.install (revision 1660) -+++ debian/libsope-ldap_SOPEVER_-dev.install (working copy) -@@ -1,2 +1,2 @@ --usr/include/NGLdap -+usr/include/GNUstep/NGLdap - usr/lib/libNGLdap.so -Index: debian/sope_SOPEVER_-gdl1-postgresql.install -=================================================================== ---- debian/sope_SOPEVER_-gdl1-postgresql.install (revision 1660) -+++ debian/sope_SOPEVER_-gdl1-postgresql.install (working copy) -@@ -1 +1 @@ --usr/lib/sope-*/dbadaptors/PostgreSQL.gdladaptor -+usr/lib/GNUstep/GDLAdaptors-4.9/PostgreSQL.gdladaptor -Index: debian/libsope-mime_SOPEVER_-dev.install -=================================================================== ---- debian/libsope-mime_SOPEVER_-dev.install (revision 1660) -+++ debian/libsope-mime_SOPEVER_-dev.install (working copy) -@@ -1,4 +1,4 @@ --usr/include/NGMime --usr/include/NGImap4 --usr/include/NGMail -+usr/include/GNUstep/NGMime -+usr/include/GNUstep/NGImap4 -+usr/include/GNUstep/NGMail - usr/lib/libNGMime.so -Index: debian/libsope-core_SOPEVER_-dev.install -=================================================================== ---- debian/libsope-core_SOPEVER_-dev.install (revision 1660) -+++ debian/libsope-core_SOPEVER_-dev.install (working copy) -@@ -1,6 +1,6 @@ --usr/include/NGExtensions --usr/include/EOControl --usr/include/NGStreams -+usr/include/GNUstep/NGExtensions -+usr/include/GNUstep/EOControl -+usr/include/GNUstep/NGStreams - usr/lib/libNGExtensions.so - usr/lib/libEOControl.so - usr/lib/libNGStreams.so -Index: debian/libsope-xml_SOPEVER_-dev.install -=================================================================== ---- debian/libsope-xml_SOPEVER_-dev.install (revision 1660) -+++ debian/libsope-xml_SOPEVER_-dev.install (working copy) -@@ -1,6 +1,6 @@ --usr/include/DOM --usr/include/SaxObjC --usr/include/XmlRpc -+usr/include/GNUstep/DOM -+usr/include/GNUstep/SaxObjC -+usr/include/GNUstep/XmlRpc - usr/lib/libDOM.so - usr/lib/libSaxObjC.so - usr/lib/libXmlRpc.so diff --git a/SOPE/sope-debian.diff b/SOPE/sope-debian.diff new file mode 100644 index 000000000..b9b020418 --- /dev/null +++ b/SOPE/sope-debian.diff @@ -0,0 +1,8197 @@ +--- sope-4.9.r1660.orig/debian/sope_SOPEVER_-gdl1-postgresql.install ++++ sope-4.9.r1660/debian/sope_SOPEVER_-gdl1-postgresql.install +@@ -1 +1 @@ +-usr/lib/sope-*/dbadaptors/PostgreSQL.gdladaptor ++usr/lib/GNUstep/GDLAdaptors-*/PostgreSQL.gdladaptor +--- sope-4.9.r1660.orig/debian/libsope-ical_SOPEVER_-dev.install ++++ sope-4.9.r1660/debian/libsope-ical_SOPEVER_-dev.install +@@ -1,2 +1,2 @@ +-usr/include/NGiCal ++usr/include/GNUstep/NGiCal + usr/lib/libNGiCal.so +--- sope-4.9.r1660.orig/debian/changelog ++++ sope-4.9.r1660/debian/changelog +@@ -1,3 +1,13 @@ ++sope (4.9.r1660-1) unstable; urgency=low ++ ++ * debian/control: ++ - updated dependencies ++ - changed {Source-Version} with {binary:Version} ++ - bumbed standard to 3.8.2 ++ - updated debian/copyright with recent LGPL-2 ++ ++ -- Inverse Support Wed, 12 Aug 2009 10:34:00 -0400 ++ + sope (4.7.0-0) UNRELEASED; urgency=low + + * New upstream release. +--- sope-4.9.r1660.orig/debian/rules ++++ sope-4.9.r1660/debian/rules +@@ -7,13 +7,15 @@ + #export DH_VERBOSE=1 + + # Include dpatch stuff. +-include /usr/share/dpatch/dpatch.make ++# include /usr/share/dpatch/dpatch.make ++ ++PATCHES = sope-gsmake2.diff sope-patchset-r1660.diff + + CFLAGS = -Wall -g + #WARN: doesn't compile/package if HAS_LIBRARY_* options not present (since we use configure now) + MAKE_FLAGS = messages=yes OPTFLAG=-O0 HAS_LIBRARY_ldap=yes HAS_LIBRARY_pq=yes HAS_LIBRARY_xml2=yes + +-GNUSTEP_SETUP=/usr/lib/opengroupware.org/System/Library/Makefiles/GNUstep.sh ++GNUSTEP_SETUP=/usr/share/GNUstep/Makefiles/GNUstep.sh + + include Version + SOPEVER=$(MAJOR_VERSION).$(MINOR_VERSION) +@@ -50,17 +52,17 @@ + done; \ + rm controlfiles.tmp; \ + fi +- ++ + debian/control: debian/control.in debian/rules + sed -e s/_SOPEVER_/$(SOPEVER)/g < debian/control.in > debian/control + +-config.status: configure ++config.make: patch-stamp + dh_testdir + CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ +- ./configure +- +-build: build-stamp controlfiles +-build-stamp: patch-stamp ++ ./configure --with-gnustep --enable-debug --disable-strip ++ ++build: config.make build-stamp controlfiles ++build-stamp: + dh_testdir + + -mv sope-core/NGStreams/config.guess sope-core/NGStreams/config.guess.upstream +@@ -71,14 +73,14 @@ + CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ + $(MAKE) $(MAKE_FLAGS) all + +- cp -R sope-appserver/mod_ngobjweb sope-appserver/mod_ngobjweb-apache2 ++# cp -R sope-appserver/mod_ngobjweb sope-appserver/mod_ngobjweb-apache2 + +- CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ +- $(MAKE) $(MAKE_FLAGS) APXS=/usr/bin/apxs -C sope-appserver/mod_ngobjweb all +- +- CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ +- $(MAKE) $(MAKE_FLAGS) APXS="/usr/bin/apxs2" APXS_INCLUDE_DIRS="$(shell apxs2 -q EXTRA_INCLUDES)"\ +- -C sope-appserver/mod_ngobjweb-apache2 all ++# CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ ++# $(MAKE) $(MAKE_FLAGS) APXS=/usr/bin/apxs -C sope-appserver/mod_ngobjweb all ++ ++# CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ ++# $(MAKE) $(MAKE_FLAGS) APXS="/usr/bin/apxs2" APXS_INCLUDE_DIRS="$(shell apxs2 -q EXTRA_INCLUDES)"\ ++# -C sope-appserver/mod_ngobjweb-apache2 all + + touch build-stamp + +@@ -87,12 +89,14 @@ + dh_testroot + rm -f configure-stamp + rm -f build-stamp ++ rm -f config-NSStreams.log + rm -rf sope-appserver/mod_ngobjweb-apache2 ++ rm -rf sope-core/NGStreams/x86_64 + +- if [ -l sope-core/NGStreams/config.guess ]; then \ ++ if [ -L sope-core/NGStreams/config.guess ]; then \ + rm sope-core/NGStreams/config.guess; \ + fi +- if [ -l sope-core/NGStreams/config.sub ]; then \ ++ if [ -L sope-core/NGStreams/config.sub ]; then \ + rm sope-core/NGStreams/config.sub; \ + fi + if [ -f sope-core/NGStreams/config.guess.upstream ]; then \ +@@ -102,8 +106,8 @@ + mv sope-core/NGStreams/config.sub.upstream sope-core/NGStreams/config.sub; \ + fi + +- -. $(GNUSTEP_SETUP); $(MAKE) -C sope-appserver/mod_ngobjweb clean +- -. $(GNUSTEP_SETUP); $(MAKE) -C sope-appserver/mod_ngobjweb distclean ++# -. $(GNUSTEP_SETUP); $(MAKE) -C sope-appserver/mod_ngobjweb clean ++# -. $(GNUSTEP_SETUP); $(MAKE) -C sope-appserver/mod_ngobjweb distclean + + -. $(GNUSTEP_SETUP); $(MAKE) clean + -. $(GNUSTEP_SETUP); $(MAKE) distclean +@@ -116,24 +120,24 @@ + dh_clean -k + dh_installdirs + +- # Add here commands to install the package into debian/tmp ++# Add here commands to install the package into debian/tmp + CFLAGS="$(CFLAGS)" . $(GNUSTEP_SETUP); \ + $(MAKE) $(MAKE_FLAGS) install \ +- GNUSTEP_INSTALLATION_DIR=$(CURDIR)/debian/tmp/$$GNUSTEP_SYSTEM_ROOT\ +- INSTALL_ROOT_DIR=$(CURDIR)/debian/tmp\ ++ DESTDIR=$(CURDIR)/debian/tmp GNUSTEP_INSTALLATION_DOMAIN=SYSTEM ++# INSTALL_ROOT_DIR=$(CURDIR)/debian/tmp\ + FHS_INSTALL_ROOT=$(CURDIR)/debian/tmp/usr \ + FHS_LIB_DIR=$(CURDIR)/debian/tmp/usr/lib/ #WARN: <- trailing slash unbroke build/packages?! + +- CFLAGS="$(CFLGAS)" . $(GNUSTEP_SETUP); \ ++# CFLAGS="$(CFLGAS)" . $(GNUSTEP_SETUP); \ + $(MAKE) $(MAKE_FLAGS) -C sope-appserver/mod_ngobjweb install \ +- GNUSTEP_INSTALLATION_DIR=$(CURDIR)/debian/tmp/usr/lib/apache/1.3 ++ GNUSTEP_INSTALLATION_DOMAIN=$(CURDIR)/debian/tmp/usr/lib/apache/1.3 + +- CFLAGS="$(CFLGAS)" . $(GNUSTEP_SETUP); \ ++# CFLAGS="$(CFLGAS)" . $(GNUSTEP_SETUP); \ + $(MAKE) $(MAKE_FLAGS) -C sope-appserver/mod_ngobjweb-apache2 install \ +- GNUSTEP_INSTALLATION_DIR=$(CURDIR)/debian/tmp/usr/lib/apache2/modules ++ GNUSTEP_INSTALLATION_DOMAIN=$(CURDIR)/debian/tmp/usr/lib/apache2/modules + +- install -m 644 debian/500mod_ngobjweb.info $(CURDIR)/debian/libapache-mod-ngobjweb/usr/lib/apache/1.3 +- install -m 644 debian/ngobjweb.load $(CURDIR)/debian/libapache2-mod-ngobjweb/etc/apache2/mods-available ++# install -m 644 debian/500mod_ngobjweb.info $(CURDIR)/debian/libapache-mod-ngobjweb/usr/lib/apache/1.3 ++# install -m 644 debian/ngobjweb.load $(CURDIR)/debian/libapache2-mod-ngobjweb/etc/apache2/mods-available + + # Build architecture-independent files here. + binary-indep: build install +@@ -172,5 +176,28 @@ + dh_md5sums + dh_builddeb + ++patch-stamp: patch ++patch: ++ for patch in $(PATCHES); \ ++ do \ ++ if ! test -f debian/patches/$$patch.stamp; \ ++ then \ ++ patch -p0 < debian/patches/$$patch; \ ++ touch debian/patches/$$patch.stamp; \ ++ fi; \ ++ done; \ ++ fi ++ touch patch-stamp ++ ++unpatch: ++ if test -f patch-stamp; \ ++ then for patch in $(PATCHES); \ ++ do \ ++ patch -p0 -R < debian/patches/$$patch; \ ++ rm -f debian/patches/$$patch.stamp; \ ++ done; \ ++ fi ++ rm -f patch-stamp ++ + binary: binary-indep binary-arch + .PHONY: build clean binary-indep binary-arch binary install configure +--- sope-4.9.r1660.orig/debian/sope_SOPEVER_-libxmlsaxdriver.install ++++ sope-4.9.r1660/debian/sope_SOPEVER_-libxmlsaxdriver.install +@@ -1 +1 @@ +-usr/lib/sope-*/saxdrivers/libxmlSAXDriver.sax ++usr/lib/GNUstep/SaxDrivers-*/libxmlSAXDriver.sax +--- sope-4.9.r1660.orig/debian/control.in ++++ sope-4.9.r1660/debian/control.in +@@ -1,8 +1,9 @@ + Source: sope ++Section: web + Priority: extra +-Maintainer: Sebastian Ley +-Build-Depends: debhelper (>= 4.0.0), dpatch, gnustep-make-ogo, gobjc | objc-compiler, libfoundation1.1-dev, libobjc1, libxml2-dev, libldap2-dev | libldap-dev, libssl-dev, zlib1g-dev, libpq-dev | postgresql-dev, libecpg-dev, apache-dev, apache2-threaded-dev | apache2-prefork-dev | apache2-dev, autotools-dev +-Standards-Version: 3.6.1 ++Maintainer: Inverse Support ++Build-Depends: debhelper (>= 4.0.0), gnustep-make, libgnustep-base-dev, gobjc | objc-compiler, libxml2-dev, libldap2-dev | libldap-dev, libssl-dev, zlib1g-dev, libpq-dev | postgresql-dev, autotools-dev ++Standards-Version: 3.8.2 + + Package: libsope_SOPEVER_-dev + Section: libdevel +@@ -22,7 +23,7 @@ + Architecture: any + Provides: libsope-appserver-dev + Conflicts: libsope-appserver-dev +-Depends: libsope-appserver_SOPEVER_ (= ${Source-Version}) ++Depends: libsope-appserver_SOPEVER_ (= ${binary:Version}) + Description: Development files for the SOPE libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -75,7 +76,7 @@ + Architecture: any + Provides: libsope-core-dev + Conflicts: libsope-core-dev +-Depends: libsope-core_SOPEVER_ (= ${Source-Version}) ++Depends: libsope-core_SOPEVER_ (= ${binary:Version}) + Description: Development files for the SOPE core libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -98,7 +99,7 @@ + Architecture: any + Provides: libsope-xml-dev + Conflicts: libsope-xml-dev +-Depends: libsope-xml_SOPEVER_ (= ${Source-Version}) ++Depends: libsope-xml_SOPEVER_ (= ${binary:Version}) + Description: Development files for the SOPE XML libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -125,7 +126,7 @@ + Architecture: any + Provides: libsope-ldap-dev + Conflicts: libsope-ldap-dev +-Depends: libsope-ldap_SOPEVER_ (= ${Source-Version}) ++Depends: libsope-ldap_SOPEVER_ (= ${binary:Version}) + Description: Development files for the SOPE LDAP libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -149,7 +150,7 @@ + Architecture: any + Provides: libsope-mime-dev + Conflicts: libsope-mime-dev +-Depends: libsope-mime_SOPEVER_ (= ${Source-Version}) ++Depends: libsope-mime_SOPEVER_ (= ${binary:Version}) + Description: Development files for the SOPE MIME libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -176,7 +177,7 @@ + Architecture: any + Provides: libsope-ical-dev + Conflicts: libsope-ical-dev +-Depends: libsope-ical_SOPEVER_ (= ${Source-Version}) ++Depends: libsope-ical_SOPEVER_ (= ${binary:Version}) + Description: Development files for the SOPE iCal libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -200,7 +201,7 @@ + Architecture: any + Provides: libsope-gdl1-dev + Conflicts: libsope-gdl1-dev +-Depends: libsope-gdl1-_SOPEVER_ (= ${Source-Version}) ++Depends: libsope-gdl1-_SOPEVER_ (= ${binary:Version}) + Description: Development files for the GNUstep database libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -264,19 +265,3 @@ + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. + . + This parser enables SOPE's SAX engine to parse iCal and vCard files. +- +-Package: libapache-mod-ngobjweb +-Section: web +-Architecture: any +-Depends: ${shlibs:Depends}, ${misc:Depends}, ucf (>= 0.8), apache-common (>= 1.3.29) +-Description: Apache module for the SOPE application server +- This package contains an apache module which enables the apache +- webserver to deliver pages generated by the SOPE application server. +- +-Package: libapache2-mod-ngobjweb +-Section: web +-Architecture: any +-Depends: ${shlibs:Depends}, ${misc:Depends}, apache2-common | apache2.2-common +-Description: Apache2 module for the SOPE application server +- This package contains an apache module which enables the apache2 +- webserver to deliver pages generated by the SOPE application server. +--- sope-4.9.r1660.orig/debian/libsope-ical_SOPEVER_.install ++++ sope-4.9.r1660/debian/libsope-ical_SOPEVER_.install +@@ -1,2 +1,2 @@ + usr/lib/libNGiCal.so.* +-usr/share/sope-*/saxmappings ++usr/lib/GNUstep/SaxMappings/* +--- sope-4.9.r1660.orig/debian/libsope-core_SOPEVER_-dev.install ++++ sope-4.9.r1660/debian/libsope-core_SOPEVER_-dev.install +@@ -1,6 +1,6 @@ +-usr/include/NGExtensions +-usr/include/EOControl +-usr/include/NGStreams ++usr/include/GNUstep/NGExtensions ++usr/include/GNUstep/EOControl ++usr/include/GNUstep/NGStreams + usr/lib/libNGExtensions.so + usr/lib/libEOControl.so + usr/lib/libNGStreams.so +--- sope-4.9.r1660.orig/debian/sope_SOPEVER_-stxsaxdriver.install ++++ sope-4.9.r1660/debian/sope_SOPEVER_-stxsaxdriver.install +@@ -1 +1 @@ +-usr/lib/sope-*/saxdrivers/STXSaxDriver.sax ++usr/lib/GNUstep/SaxDrivers-*/STXSaxDriver.sax +--- sope-4.9.r1660.orig/debian/compat ++++ sope-4.9.r1660/debian/compat +@@ -1 +1 @@ +-4 ++5 +--- sope-4.9.r1660.orig/debian/libsope-mime_SOPEVER_-dev.install ++++ sope-4.9.r1660/debian/libsope-mime_SOPEVER_-dev.install +@@ -1,4 +1,4 @@ +-usr/include/NGMime +-usr/include/NGImap4 +-usr/include/NGMail ++usr/include/GNUstep/NGMime ++usr/include/GNUstep/NGImap4 ++usr/include/GNUstep/NGMail + usr/lib/libNGMime.so +--- sope-4.9.r1660.orig/debian/copyright ++++ sope-4.9.r1660/debian/copyright +@@ -8,19 +8,19 @@ + + License: + +- This package is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + +- This package is distributed in the hope that it will be useful, ++ This library 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. ++ Library General Public License for more details. + +- You should have received a copy of the GNU Lesser General Public +- License along with this package; if not, write to the Free Software +- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ You should have received a copy of the GNU Library General Public ++ License along with this library; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA + + On Debian systems, the complete text of the GNU Lesser General + Public License can be found in `/usr/share/common-licenses/LGPL'. +--- sope-4.9.r1660.orig/debian/sope_SOPEVER_-appserver.install ++++ sope-4.9.r1660/debian/sope_SOPEVER_-appserver.install +@@ -1 +1,2 @@ +-usr/sbin/sope-* ++usr/lib/GNUstep/SoProducts-*/* ++usr/lib/GNUstep/WOxElemBuilders-*/* +--- sope-4.9.r1660.orig/debian/libsope-appserver_SOPEVER_-dev.install ++++ sope-4.9.r1660/debian/libsope-appserver_SOPEVER_-dev.install +@@ -1,11 +1,10 @@ +-usr/include/NGHttp +-usr/include/NGObjWeb +-usr/include/WOXML +-usr/include/WOExtensions +-usr/include/WEExtensions +-usr/include/NGXmlRpc +-usr/include/SoOFS +-usr/lib/opengroupware.org/System/Library/Makefiles ++usr/include/GNUstep/NGHttp ++usr/include/GNUstep/NGObjWeb ++usr/include/GNUstep/WOXML ++usr/include/GNUstep/WOExtensions ++usr/include/GNUstep/WEExtensions ++usr/include/GNUstep/NGXmlRpc ++usr/include/GNUstep/SoOFS + usr/lib/libNGObjWeb.so + usr/lib/libWOXML.so + usr/lib/libWOExtensions.so +--- sope-4.9.r1660.orig/debian/control ++++ sope-4.9.r1660/debian/control +@@ -1,8 +1,9 @@ + Source: sope ++Section: web + Priority: extra +-Maintainer: Sebastian Ley +-Build-Depends: debhelper (>= 4.0.0), dpatch, gnustep-make-ogo, gobjc | objc-compiler, libfoundation1.1-dev, libobjc1, libxml2-dev, libldap2-dev | libldap-dev, libssl-dev, zlib1g-dev, libpq-dev | postgresql-dev, libecpg-dev, apache-dev, apache2-threaded-dev | apache2-prefork-dev | apache2-dev, autotools-dev +-Standards-Version: 3.6.1 ++Maintainer: Inverse Support ++Build-Depends: debhelper (>= 4.0.0), gnustep-make, libgnustep-base-dev, gobjc | objc-compiler, libxml2-dev, libldap2-dev | libldap-dev, libssl-dev, zlib1g-dev, libpq-dev | postgresql-dev, autotools-dev ++Standards-Version: 3.8.2 + + Package: libsope4.9-dev + Section: libdevel +@@ -22,7 +23,7 @@ + Architecture: any + Provides: libsope-appserver-dev + Conflicts: libsope-appserver-dev +-Depends: libsope-appserver4.9 (= ${Source-Version}) ++Depends: libsope-appserver4.9 (= ${binary:Version}) + Description: Development files for the SOPE libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -75,7 +76,7 @@ + Architecture: any + Provides: libsope-core-dev + Conflicts: libsope-core-dev +-Depends: libsope-core4.9 (= ${Source-Version}) ++Depends: libsope-core4.9 (= ${binary:Version}) + Description: Development files for the SOPE core libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -98,7 +99,7 @@ + Architecture: any + Provides: libsope-xml-dev + Conflicts: libsope-xml-dev +-Depends: libsope-xml4.9 (= ${Source-Version}) ++Depends: libsope-xml4.9 (= ${binary:Version}) + Description: Development files for the SOPE XML libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -125,7 +126,7 @@ + Architecture: any + Provides: libsope-ldap-dev + Conflicts: libsope-ldap-dev +-Depends: libsope-ldap4.9 (= ${Source-Version}) ++Depends: libsope-ldap4.9 (= ${binary:Version}) + Description: Development files for the SOPE LDAP libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -149,7 +150,7 @@ + Architecture: any + Provides: libsope-mime-dev + Conflicts: libsope-mime-dev +-Depends: libsope-mime4.9 (= ${Source-Version}) ++Depends: libsope-mime4.9 (= ${binary:Version}) + Description: Development files for the SOPE MIME libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -176,7 +177,7 @@ + Architecture: any + Provides: libsope-ical-dev + Conflicts: libsope-ical-dev +-Depends: libsope-ical4.9 (= ${Source-Version}) ++Depends: libsope-ical4.9 (= ${binary:Version}) + Description: Development files for the SOPE iCal libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -200,7 +201,7 @@ + Architecture: any + Provides: libsope-gdl1-dev + Conflicts: libsope-gdl1-dev +-Depends: libsope-gdl1-4.9 (= ${Source-Version}) ++Depends: libsope-gdl1-4.9 (= ${binary:Version}) + Description: Development files for the GNUstep database libraries + SOPE is a framework for developing web applications and services. The + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. +@@ -264,19 +265,3 @@ + name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. + . + This parser enables SOPE's SAX engine to parse iCal and vCard files. +- +-Package: libapache-mod-ngobjweb +-Section: web +-Architecture: any +-Depends: ${shlibs:Depends}, ${misc:Depends}, ucf (>= 0.8), apache-common (>= 1.3.29) +-Description: Apache module for the SOPE application server +- This package contains an apache module which enables the apache +- webserver to deliver pages generated by the SOPE application server. +- +-Package: libapache2-mod-ngobjweb +-Section: web +-Architecture: any +-Depends: ${shlibs:Depends}, ${misc:Depends}, apache2-common | apache2.2-common +-Description: Apache2 module for the SOPE application server +- This package contains an apache module which enables the apache2 +- webserver to deliver pages generated by the SOPE application server. +--- sope-4.9.r1660.orig/debian/libsope-xml_SOPEVER_-dev.install ++++ sope-4.9.r1660/debian/libsope-xml_SOPEVER_-dev.install +@@ -1,6 +1,6 @@ +-usr/include/DOM +-usr/include/SaxObjC +-usr/include/XmlRpc ++usr/include/GNUstep/DOM ++usr/include/GNUstep/SaxObjC ++usr/include/GNUstep/XmlRpc + usr/lib/libDOM.so + usr/lib/libSaxObjC.so + usr/lib/libXmlRpc.so +--- sope-4.9.r1660.orig/debian/sope_SOPEVER_-versitsaxdriver.install ++++ sope-4.9.r1660/debian/sope_SOPEVER_-versitsaxdriver.install +@@ -1 +1 @@ +-usr/lib/sope-*/saxdrivers/versitSaxDriver.sax ++usr/lib/GNUstep/SaxDrivers-*/versitSaxDriver.sax +--- sope-4.9.r1660.orig/debian/libsope-gdl1-_SOPEVER_-dev.install ++++ sope-4.9.r1660/debian/libsope-gdl1-_SOPEVER_-dev.install +@@ -1,2 +1,2 @@ +-usr/include/GDLAccess ++usr/include/GNUstep/GDLAccess + usr/lib/libGDLAccess.so +--- sope-4.9.r1660.orig/debian/libsope-ldap_SOPEVER_-dev.install ++++ sope-4.9.r1660/debian/libsope-ldap_SOPEVER_-dev.install +@@ -1,2 +1,2 @@ +-usr/include/NGLdap ++usr/include/GNUstep/NGLdap + usr/lib/libNGLdap.so +--- sope-4.9.r1660.orig/debian/libsope-appserver_SOPEVER_.install ++++ sope-4.9.r1660/debian/libsope-appserver_SOPEVER_.install +@@ -5,6 +5,6 @@ + usr/lib/libNGXmlRpc.so.* + usr/lib/libSoOFS.so.* + usr/lib/libWEPrototype.so.* +-usr/share/sope-*/ngobjweb +-usr/lib/sope-*/products +-usr/lib/sope-*/wox-builders ++usr/lib/GNUstep/Libraries/Resources/NGObjWeb/* ++usr/lib/GNUstep/SoProducts-*/* ++usr/lib/GNUstep/WOxElemBuilders-*/* +--- sope-4.9.r1660.orig/debian/patches/sope-gsmake2.diff ++++ sope-4.9.r1660/debian/patches/sope-gsmake2.diff +@@ -0,0 +1,3150 @@ ++Index: configure ++=================================================================== ++--- configure (révision 1632) +++++ configure (copie de travail) ++@@ -1,4 +1,4 @@ ++-#!/bin/bash +++#!/bin/sh ++ ++ # ++ # Note: When adding make options to this script, ensure that the source still ++@@ -15,8 +15,9 @@ ++ ARG_NOCREATE=0 ++ ARG_PREFIX="" ++ ARG_FRAMEWORK_DIR="" ++-ARG_GSMAKE="$GNUSTEP_MAKEFILES" +++ARG_GSMAKE=`gnustep-config --variable=GNUSTEP_MAKEFILES` ++ ARG_CFGMAKE="$PWD/config.make" +++ARG_FHSMAKE="$PWD/fhs-postinstall.make" ++ ARG_WITH_GNUSTEP=0 ++ ARG_WITH_DEBUG=1 ++ ARG_WITH_STRIP=1 ++@@ -30,12 +31,20 @@ ++ INTERNAL_MAKEDIR="${SOPE_SRCDIR}/.gsmake" ++ USES_INTERNAL_MAKE=no ++ +++# detect GNU make, needed at least on *BSD +++make -v 2>/dev/null | grep GNU >/dev/null 2>/dev/null +++if [ $? -eq 0 ];then +++ MAKE=make +++else +++ MAKE=gmake +++fi +++ ++ # TODO: add pg_config, mysql_config etc! ++ LINK_SYSLIBDIRS="-L/usr/local/pgsql/lib -L/usr/local/lib -L/usr/lib" ++ ++ # ******************** usage ******************** ++ ++-function usage() { +++usage() { ++ cat <<_ACEOF ++ \`configure' configures a GNUstep-make based sourcetree for installation. ++ ++@@ -66,7 +75,7 @@ ++ ++ # ******************** running ******************** ++ ++-function printParas() { +++printParas() { ++ echo "Configuration:" ++ if test $ARG_BEQUIET = 1; then echo " will be quite."; fi ++ if test $ARG_NOCREATE = 1; then echo " won't create files"; fi ++@@ -97,7 +106,7 @@ ++ echo "" ++ } ++ ++-function warnOnFHSPrefix() { +++warnOnFHSPrefix() { ++ cat <<_ACEOFWARN ++ Warning: you are configuring for a non standard FHS style prefix. ++ prefix: $ARG_PREFIX ++@@ -114,7 +123,7 @@ ++ _ACEOFWARN ++ } ++ ++-function setupInternalGSMake() { +++setupInternalGSMake() { ++ if test -f ${INTERNAL_MAKEDIR}/Library/Makefiles/GNUstep.sh; then ++ ARG_GSMAKE="${INTERNAL_MAKEDIR}/Library/Makefiles/" ++ ARG_IS_FHS=1 ++@@ -149,7 +158,7 @@ ++ --with-library-combo="${SETUP_COMBO}" ++ ++ echo -n ".. install .." ++- make install >>${pregsmdir}/${SETUP_LOGNAME} +++ $MAKE install >>${pregsmdir}/${SETUP_LOGNAME} ++ ++ ARG_GSMAKE="${INTERNAL_MAKEDIR}/Library/Makefiles/" ++ ARG_IS_FHS=1 ++@@ -174,7 +183,7 @@ ++ fi ++ } ++ ++-function validateGNUstepArgs() { +++validateGNUstepArgs() { ++ # GNUstep make ++ if test "x$ARG_GSMAKE" = "x"; then ++ if test -f $HOME/OGoRoot/Library/Makefiles/GNUstep.sh; then ++@@ -203,7 +212,7 @@ ++ fi ++ } ++ ++-function setupAppleArgs() { +++setupAppleArgs() { ++ ARG_WITH_STRIP=0 ++ if test "x${USES_INTERNAL_MAKE}" = "no"; then ++ ARG_WITH_GNUSTEP=1 ++@@ -218,7 +227,7 @@ ++ #fi ++ } ++ ++-function validateArgs() { +++validateArgs() { ++ # validate prefix (could be better?) ++ case "x$ARG_PREFIX" in ++ "x/usr/local"|"x/usr/local/") ++@@ -273,7 +282,7 @@ ++ fi ++ } ++ ++-function printGNUstepSetup() { +++printGNUstepSetup() { ++ echo "GNUstep environment:" ++ echo " system: ${GNUSTEP_SYSTEM_ROOT}" ++ echo " local: ${GNUSTEP_LOCAL_ROOT}" ++@@ -285,11 +294,11 @@ ++ echo "" ++ } ++ ++-function cfgwrite() { +++cfgwrite() { ++ echo "$1" >> $ARG_CFGMAKE ++ } ++ ++-function genConfigMake() { +++genConfigMake() { ++ # we ignore the following vars also patches by gstep-make: ++ # PATH ++ # DYLD_LIBRARY_PATH ++@@ -303,6 +312,8 @@ ++ echo "# GNUstep environment configuration" > $ARG_CFGMAKE ++ cfgwrite "# created by: '$CFG_ARGS'" ++ cfgwrite "" +++ cfgwrite "SOPE_ROOT=`pwd`" +++ cfgwrite "include \${SOPE_ROOT}/Version" ++ ++ cfgwrite "# Note: you can override any option as a 'make' parameter, eg:" ++ cfgwrite "# make debug=yes" ++@@ -313,7 +324,27 @@ ++ #cfgwrite " @echo Local GNUstep config.make is active" ++ #cfgwrite "" ++ ++- # TODO: should be also write a GNUSTEP_INSTALLATION_DIR / BUNDLE_INSTALL_DIR? +++ # Note: GNUSTEP_TARGET_CPU is not yet available (set by common.make), so we +++ # only have environment variables +++ # Note: we can't set SYSTEM_LIB_DIR in this location, it gets overridden by +++ # common.make +++ UNAME=`uname` +++ if [ "X${UNAME}" = "XLinux" ];then +++ UNAME=`uname -p` +++ if [ ${UNAME} = x86_64 -o ${UNAME} = sparc64 -o ${UNAME} = ppc64 ];then +++ cfgwrite "CGS_LIBDIR_NAME:=lib64" +++ else +++ cfgwrite "CGS_LIBDIR_NAME:=lib" +++ fi +++ else +++ cfgwrite "CGS_LIBDIR_NAME:=lib" +++ fi +++ cfgwrite "ifneq (\$(FHS_INSTALL_ROOT),)" +++ cfgwrite "CONFIGURE_FHS_INSTALL_LIBDIR:=\$(FHS_INSTALL_ROOT)/\$(CGS_LIBDIR_NAME)/" +++ cfgwrite "CONFIGURE_SYSTEM_LIB_DIR += -L\$(CONFIGURE_FHS_INSTALL_LIBDIR)" +++ cfgwrite "endif" +++ cfgwrite "GNUSTEP_INSTALLATION_DOMAIN:=LOCAL" +++ cfgwrite "CONFIGURE_SYSTEM_LIB_DIR += -L/usr/\$(CGS_LIBDIR_NAME)/" ++ ++ ++ if test "x$ARG_FRAMEWORK_DIR" != "x"; then ++@@ -325,13 +356,38 @@ ++ cfgwrite "# configured for FHS install" ++ cfgwrite "FHS_INSTALL_ROOT:=$ARG_PREFIX" ++ cfgwrite "" +++ cfgwrite "SOPE_SYSLIBDIR=\${DESTDIR}\${FHS_INSTALL_ROOT}/\$(CGS_LIBDIR_NAME)" +++ cfgwrite "SOPE_LIBDIR=\${SOPE_SYSLIBDIR}/sope-\${MAJOR_VERSION}.\${MINOR_VERSION}" +++ cfgwrite "SOPE_SYSSHAREDIR=\${DESTDIR}\${FHS_INSTALL_ROOT}/share" +++ cfgwrite "SOPE_SHAREDIR=\${SOPE_SYSSHAREDIR}/sope-\${MAJOR_VERSION}.\${MINOR_VERSION}" +++ cfgwrite "SOPE_DBADAPTORS=\${SOPE_LIBDIR}/dbadaptors" +++ cfgwrite "SOPE_PRODUCTS=\${SOPE_LIBDIR}/products" +++ cfgwrite "SOPE_SAXDRIVERS=\${SOPE_LIBDIR}/saxdrivers" +++ cfgwrite "SOPE_WOXBUILDERS=\${SOPE_LIBDIR}/wox-builders" +++ cfgwrite "SOPE_NGOBJWEB=\${SOPE_SHAREDIR}/ngobjweb" +++ cfgwrite "SOPE_SAXMAPPINGS=\${SOPE_SHAREDIR}/saxmappings" +++ cfgwrite "SOPE_TOOLS=\${DESTDIR}\${FHS_INSTALL_ROOT}/bin" +++ cfgwrite "SOPE_ADMIN_TOOLS=\${DESTDIR}\${FHS_INSTALL_ROOT}/sbin" +++ cfgwrite "" ++ else ++ cfgwrite "# configured for GNUstep install" +++ cfgwrite "" +++ cfgwrite "SOPE_SYSLIBDIR=\${GNUSTEP_LIBRARIES}" +++ cfgwrite "SOPE_LIBDIR=\${GNUSTEP_LIBRARY}" +++ cfgwrite "SOPE_DBADAPTORS=\${SOPE_LIBDIR}/GDLAdaptors-\${MAJOR_VERSION}.\${MINOR_VERSION}" +++ cfgwrite "SOPE_PRODUCTS=\${SOPE_LIBDIR}/SoProducts-\${MAJOR_VERSION}.\${MINOR_VERSION}" +++ cfgwrite "SOPE_SAXDRIVERS=\${SOPE_LIBDIR}/SaxDrivers-\${MAJOR_VERSION}.\${MINOR_VERSION}" +++ cfgwrite "SOPE_NGOBJWEB=\${GNUSTEP_RESOURCES}/NGObjWeb" +++ cfgwrite "SOPE_WOXBUILDERS=\${GNUSTEP_LIBRARY}/WOxElemBuilders-\${MAJOR_VERSION}.\${MINOR_VERSION}" +++ cfgwrite "SOPE_SAXMAPPINGS=\${GNUSTEP_LIBRARY}/SaxMappings" +++ cfgwrite "SOPE_TOOLS=\${GNUSTEP_TOOLS}" +++ cfgwrite "SOPE_ADMIN_TOOLS=\${GNUSTEP_ADMIN_TOOLS}" ++ fi ++ ++ if test $ARG_WITH_DEBUG = 1; then ++ cfgwrite "# configured to produce debugging code"; ++ cfgwrite "debug:=yes" +++ ++ else ++ cfgwrite "# configured to produce non-debugging code"; ++ cfgwrite "debug:=no" ++@@ -358,29 +414,9 @@ ++ done ++ cfgwrite "LIBRARY_COMBO=$LIBRARY_COMBO" ++ cfgwrite "" ++- ++- # Note: GNUSTEP_TARGET_CPU is not yet available (set by common.make), so we ++- # only have environment variables ++- # Note: we can't set SYSTEM_LIB_DIR in this location, it gets overridden by ++- # common.make ++- cfgwrite "ifeq (\$(findstring _64, \$(GNUSTEP_HOST_CPU)), _64)" ++- cfgwrite "CONFIGURE_64BIT:=yes" ++- cfgwrite "CGS_LIBDIR_NAME:=lib64" ++- cfgwrite "else" ++- cfgwrite "CGS_LIBDIR_NAME:=lib" ++- cfgwrite "endif" ++- ++- cfgwrite "ifneq (\$(FHS_INSTALL_ROOT),)" ++- cfgwrite "CONFIGURE_FHS_INSTALL_LIBDIR:=\$(FHS_INSTALL_ROOT)/\$(CGS_LIBDIR_NAME)/" ++- cfgwrite "CONFIGURE_SYSTEM_LIB_DIR += -L\$(CONFIGURE_FHS_INSTALL_LIBDIR)" ++- cfgwrite "endif" ++- cfgwrite "CONFIGURE_SYSTEM_LIB_DIR += -L/usr/\$(CGS_LIBDIR_NAME)/" ++- ++- cfgwrite "# avoid a gstep-make warning" ++- cfgwrite "PATH:=\$(GNUSTEP_SYSTEM_ROOT)/Tools:\$(PATH)" ++ } ++ ++-function checkLinking() { +++checkLinking() { ++ # library-name => $1, type => $2 ++ local oldpwd=$PWD ++ local tmpdir=".configure-test-$$" ++@@ -388,18 +424,26 @@ ++ mkdir $tmpdir ++ cd $tmpdir ++ cp ../maintenance/dummytool.c . +++ +++ for LIB in $1;do +++ LIBS="$LIBS -l${LIB}" +++ done ++ ++ tmpmake="GNUmakefile" ++- echo >$tmpmake "include ../config.make" +++ echo >$tmpmake "-include ../config.make" ++ echo >>$tmpmake "include \$(GNUSTEP_MAKEFILES)/common.make" ++ echo >>$tmpmake "CTOOL_NAME := linktest" ++ echo >>$tmpmake "linktest_C_FILES := dummytool.c" ++- echo >>$tmpmake "linktest_TOOL_LIBS += -l$1" +++ echo >>$tmpmake "ifeq (\$(findstring openbsd, \$(GNUSTEP_HOST_OS)), openbsd)" +++ echo >>$tmpmake "linktest_TOOL_LIBS += $LIBS -liconv" +++ echo >>$tmpmake "else" +++ echo >>$tmpmake "linktest_TOOL_LIBS += $LIBS" +++ echo >>$tmpmake "endif" ++ echo >>$tmpmake "SYSTEM_LIB_DIR += \$(CONFIGURE_SYSTEM_LIB_DIR)" ++ echo >>$tmpmake "SYSTEM_LIB_DIR += ${LINK_SYSLIBDIRS}" ++ echo >>$tmpmake "include \$(GNUSTEP_MAKEFILES)/ctool.make" ++ ++- make -s messages=yes -f $tmpmake linktest >out.log 2>err.log +++ $MAKE -s messages=yes -f $tmpmake linktest >out.log 2>err.log ++ LINK_RESULT=$? ++ ++ if test $LINK_RESULT = 0; then ++@@ -420,18 +464,22 @@ ++ rm -rf $tmpdir ++ } ++ ++-function checkDependencies() { +++checkDependencies() { ++ cfgwrite "" ++ cfgwrite "# library dependencies" ++ checkLinking "xml2" optional; ++ checkLinking "ldap" optional; ++- checkLinking "ssl" required; # TODO: make optional +++ if [ `uname` = "OpenBSD" ];then +++ checkLinking "ssl crypto" required; # TODO: make optional +++ else +++ checkLinking "ssl" required; # TODO: make optional +++ fi ++ checkLinking "pq" optional; ++ checkLinking "sqlite3" optional; ++ checkLinking "mysqlclient" optional; ++ } ++ ++-function runIt() { +++runIt() { ++ if test $ARG_BEQUIET != 1; then ++ printParas; ++ fi ++@@ -459,11 +507,11 @@ ++ ++ # ******************** options ******************** ++ ++-function extractFuncValue() { +++extractFuncValue() { ++ VALUE="`echo "$1" | sed "s/[^=]*=//g"`" ++ } ++ ++-function processOption() { +++processOption() { ++ case "x$1" in ++ "x--help"|"x-h") ++ usage; ++@@ -518,7 +566,7 @@ ++ # load GNUstep environment ++ validateGNUstepArgs ++ # first we load the GNUstep.sh environment ++-source $DARG_GNUSTEP_SH +++. $DARG_GNUSTEP_SH ++ if test $ARG_BEQUIET != 1; then ++ printGNUstepSetup; ++ fi ++Index: sope-ldap/samples/GNUmakefile ++=================================================================== ++--- sope-ldap/samples/GNUmakefile (révision 1632) +++++ sope-ldap/samples/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ TOOL_NAME = \ ++@@ -9,8 +9,11 @@ ++ ldapchkpwd \ ++ ++ ldapls_OBJC_FILES = ldapls.m +++ldapls_INSTALL_DIR = $(SOPE_TOOLS)/ ++ ldap2dsml_OBJC_FILES = ldap2dsml.m +++ldap2dsml_INSTALL_DIR = $(SOPE_TOOLS)/ ++ ldapchkpwd_OBJC_FILES = ldapchkpwd.m +++ldapchkpwd_INSTALL_DIR = $(SOPE_TOOLS)/ ++ ++ #TOOL_NAME = #pwd-check ++ #pwd-check_OBJC_FILES = pwd-check.m ++@@ -19,4 +22,3 @@ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-ldap/NGLdap/GNUmakefile ++=================================================================== ++--- sope-ldap/NGLdap/GNUmakefile (révision 1632) +++++ sope-ldap/NGLdap/GNUmakefile (copie de travail) ++@@ -1,11 +1,9 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ./Version ++ ++-GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT) ++- ++ ifneq ($(frameworks),yes) ++ LIBRARY_NAME = libNGLdap ++ else ++@@ -15,7 +13,8 @@ ++ libNGLdap_PCH_FILE = common.h ++ libNGLdap_HEADER_FILES_DIR = . ++ libNGLdap_HEADER_FILES_INSTALL_DIR = /NGLdap ++-libNGLdap_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGLdap_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGLdap_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libNGLdap_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libNGLdap_HEADER_FILES = \ ++@@ -61,10 +60,12 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-ldap/GNUmakefile ++=================================================================== ++--- sope-ldap/GNUmakefile (révision 1632) +++++ sope-ldap/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../config.make +++include ../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ PACKAGE_NAME=sope-ldap ++Index: GNUmakefile ++=================================================================== ++--- GNUmakefile (révision 1632) +++++ GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ./config.make +++include ./config.make ++ ++ ifeq ($(GNUSTEP_MAKEFILES),) ++ ++@@ -35,8 +35,6 @@ ++ include $(GNUSTEP_MAKEFILES)/aggregate.make ++ -include $(GNUSTEP_MAKEFILES)/GNUmakefile.postamble ++ ++-include ./Version ++- ++ endif ++ ++ distclean :: ++Index: sope-gdl1/PostgreSQL/GNUmakefile.preamble ++=================================================================== ++--- sope-gdl1/PostgreSQL/GNUmakefile.preamble (révision 1632) +++++ sope-gdl1/PostgreSQL/GNUmakefile.preamble (copie de travail) ++@@ -27,7 +27,7 @@ ++ ifeq ($(frameworks),yes) ++ BUNDLE_INSTALL_DIR := $(FRAMEWORK_INSTALL_DIR)/GDLAccess.framework/Resources/GDLAdaptors/ ++ else ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/GDLAdaptors-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_DBADAPTORS)/ ++ endif ++ ++ ++Index: sope-gdl1/PostgreSQL/GNUmakefile ++=================================================================== ++--- sope-gdl1/PostgreSQL/GNUmakefile (révision 1632) +++++ sope-gdl1/PostgreSQL/GNUmakefile (copie de travail) ++@@ -22,7 +22,7 @@ ++ # If not, write to the Free Software Foundation, ++ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++@@ -70,4 +70,3 @@ ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++ #include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++-include fhs.make ++Index: sope-gdl1/SQLite3/GNUmakefile.preamble ++=================================================================== ++--- sope-gdl1/SQLite3/GNUmakefile.preamble (révision 1632) +++++ sope-gdl1/SQLite3/GNUmakefile.preamble (copie de travail) ++@@ -27,7 +27,7 @@ ++ ifeq ($(frameworks),yes) ++ BUNDLE_INSTALL_DIR := $(FRAMEWORK_INSTALL_DIR)/GDLAccess.framework/Resources/GDLAdaptors/ ++ else ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/GDLAdaptors-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_DBADAPTORS)/ ++ endif ++ ++ ++Index: sope-gdl1/SQLite3/GNUmakefile ++=================================================================== ++--- sope-gdl1/SQLite3/GNUmakefile (révision 1632) +++++ sope-gdl1/SQLite3/GNUmakefile (copie de travail) ++@@ -22,7 +22,7 @@ ++ # If not, write to the Free Software Foundation, ++ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++@@ -67,4 +67,3 @@ ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ endif ++ -include GNUmakefile.postamble ++-include fhs.make ++Index: sope-gdl1/FrontBase2/GNUmakefile ++=================================================================== ++--- sope-gdl1/FrontBase2/GNUmakefile (révision 1632) +++++ sope-gdl1/FrontBase2/GNUmakefile (copie de travail) ++@@ -22,7 +22,7 @@ ++ # If not, write to the Free Software Foundation, ++ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ CAN_COMPILE_FB = \ ++@@ -30,8 +30,6 @@ ++ ++ ifeq ($(CAN_COMPILE_FB),yes) ++ ++-GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT) ++- ++ BUNDLE_NAME = FrontBase2 ++ ++ FrontBase2_OBJC_FILES = \ ++@@ -51,7 +49,7 @@ ++ FrontBase2_RESOURCE_FILES = Info.plist Version ++ ++ BUNDLE_INSTALL = FrontBase2 ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_SYSTEM_ROOT)/Libraries/Adaptors +++BUNDLE_INSTALL_DIR = $(SOPE_DBADAPTORS)/ ++ ++ # Use .gdladaptor as the bundle extension ++ BUNDLE_EXTENSION = .gdladaptor ++Index: sope-gdl1/MySQL/GNUmakefile.preamble ++=================================================================== ++--- sope-gdl1/MySQL/GNUmakefile.preamble (révision 1632) +++++ sope-gdl1/MySQL/GNUmakefile.preamble (copie de travail) ++@@ -27,7 +27,7 @@ ++ ifeq ($(frameworks),yes) ++ BUNDLE_INSTALL_DIR := $(FRAMEWORK_INSTALL_DIR)/GDLAccess.framework/Resources/GDLAdaptors/ ++ else ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/GDLAdaptors-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_DBADAPTORS)/ ++ endif ++ ++ ++Index: sope-gdl1/MySQL/GNUmakefile ++=================================================================== ++--- sope-gdl1/MySQL/GNUmakefile (révision 1632) +++++ sope-gdl1/MySQL/GNUmakefile (copie de travail) ++@@ -22,7 +22,7 @@ ++ # If not, write to the Free Software Foundation, ++ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++@@ -67,4 +67,3 @@ ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ endif ++ -include GNUmakefile.postamble ++-include fhs.make ++Index: sope-gdl1/GNUmakefile ++=================================================================== ++--- sope-gdl1/GNUmakefile (révision 1632) +++++ sope-gdl1/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../config.make +++include ../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ PACKAGE_NAME=sope-gdl1 ++Index: sope-gdl1/GDLAccess/GNUmakefile.preamble ++=================================================================== ++--- sope-gdl1/GDLAccess/GNUmakefile.preamble (révision 1632) +++++ sope-gdl1/GDLAccess/GNUmakefile.preamble (copie de travail) ++@@ -21,17 +21,12 @@ ++ -I$(SOPE_ROOT)/sope-core/NGExtensions/ ++ ++ ++-# Parameters for EOAdaptor lookup ++ ++-ifneq ($(FHS_INSTALL_ROOT),) ++-ADDITIONAL_CPPFLAGS += -DFHS_INSTALL_ROOT=\@\"$(FHS_INSTALL_ROOT)\" +++ifneq ($(CGS_LIBDIR_NAME),) +++ADDITIONAL_CPPFLAGS += -DCGS_LIBDIR_NAME=\@\"$(CGS_LIBDIR_NAME)\" ++ endif ++ ++-ifeq ($(CONFIGURE_64BIT),yes) ++-ADDITIONAL_CPPFLAGS += -DCONFIGURE_64BIT=1 ++-endif ++ ++- ++ # dependencies ++ ++ libGDLAccess_LIBRARIES_DEPEND_UPON += -lEOControl ++Index: sope-gdl1/GDLAccess/GNUmakefile ++=================================================================== ++--- sope-gdl1/GDLAccess/GNUmakefile (révision 1632) +++++ sope-gdl1/GDLAccess/GNUmakefile (copie de travail) ++@@ -1,12 +1,10 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ -include ../Version ++ -include ./Version ++ ++-GNUSTEP_INSTALLATION_DIR = ${GNUSTEP_LOCAL_ROOT} ++- ++ ifneq ($(frameworks),yes) ++ LIBRARY_NAME = libGDLAccess ++ else ++@@ -14,7 +12,8 @@ ++ endif ++ ++ libGDLAccess_PCH_FILE = common.h ++-libGDLAccess_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libGDLAccess_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libGDLAccess_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libGDLAccess_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libGDLAccess_DLL_DEF = libGDLAccess.def ++@@ -123,6 +122,8 @@ ++ connect-EOAdaptor_OBJC_FILES = connect-EOAdaptor.m ++ load-EOAdaptor_PCH_FILE = common.h ++ connect-EOAdaptor_PCH_FILE = common.h +++load-EOAdaptor_INSTALL_DIR = $(SOPE_TOOLS)/ +++connect-EOAdaptor_INSTALL_DIR = $(SOPE_TOOLS)/ ++ ++ ++ # framework support ++@@ -136,6 +137,9 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++@@ -143,4 +147,3 @@ ++ endif ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++-include fhs.make ++Index: sope-gdl1/GDLAccess/EOAdaptor.h ++=================================================================== ++--- sope-gdl1/GDLAccess/EOAdaptor.h (révision 1632) +++++ sope-gdl1/GDLAccess/EOAdaptor.h (copie de travail) ++@@ -62,11 +62,14 @@ ++ + (id)adaptorWithModel:(EOModel *)aModel; ++ + (id)adaptorWithName:(NSString *)aName; ++ + (id)adaptorForURL:(id)_url; ++++ (NSString *)libraryDriversSubDir; ++ - (id)initWithName:(NSString *)aName; ++ ++ /* Getting an adaptor's name */ ++ - (NSString*)name; ++ +++/* Get the library subdir name */ +++ ++ /* Setting connection information */ ++ - (void)setConnectionDictionary:(NSDictionary*)aDictionary; ++ - (NSDictionary*)connectionDictionary; ++Index: sope-gdl1/GDLAccess/EOAdaptor.m ++=================================================================== ++--- sope-gdl1/GDLAccess/EOAdaptor.m (révision 1632) +++++ sope-gdl1/GDLAccess/EOAdaptor.m (copie de travail) ++@@ -53,14 +53,23 @@ ++ + (NSArray *)adaptorSearchPathes { ++ // TODO: add support for Cocoa ++ static NSArray *searchPathes = nil; ++- NSDictionary *env; ++ NSMutableArray *ma; ++ id tmp; ++ ++ if (searchPathes != nil) return searchPathes; ++ +++ ma = [NSMutableArray arrayWithCapacity:8]; +++ +++#if GNUSTEP_BASE_LIBRARY +++ NSEnumerator *libraryPaths; +++ NSString *directory, *suffix; +++ suffix = [self libraryDriversSubDir]; +++ libraryPaths = [NSStandardLibraryPaths() objectEnumerator]; +++ while ((directory = [libraryPaths nextObject])) +++ [ma addObject: [directory stringByAppendingPathComponent: suffix]]; +++#else +++ NSDictionary *env; ++ env = [[NSProcessInfo processInfo] environment]; ++- ma = [NSMutableArray arrayWithCapacity:8]; ++ ++ if ((tmp = [env objectForKey:@"GNUSTEP_PATHPREFIX_LIST"]) == nil) ++ tmp = [env objectForKey:@"GNUSTEP_PATHLIST"]; ++@@ -79,10 +88,11 @@ ++ [ma addObject:tmp]; ++ } ++ } +++#endif ++ ++ tmp = [NSString stringWithFormat: ++-#if CONFIGURE_64BIT ++- @"/lib64/sope-%i.%i/dbadaptors", +++#ifdef CGS_LIBDIR_NAME +++ [CGS_LIBDIR_NAME stringByAppendingString:@"/sope-%i.%i/dbadaptors"], ++ #else ++ @"/lib/sope-%i.%i/dbadaptors", ++ #endif ++@@ -92,9 +102,8 @@ ++ [ma addObject:[FHS_INSTALL_ROOT stringByAppendingPathComponent:tmp]]; ++ #endif ++ ++- [ma addObject:[@"/usr/local" stringByAppendingString:tmp]]; ++- [ma addObject:[@"/usr" stringByAppendingString:tmp]]; ++- +++ [ma addObject:[@"/usr/local/" stringByAppendingString:tmp]]; +++ [ma addObject:[@"/usr/" stringByAppendingString:tmp]]; ++ searchPathes = [ma copy]; ++ if ([searchPathes count] == 0) ++ NSLog(@"%s: empty library search path !", __PRETTY_FUNCTION__); ++@@ -213,6 +222,11 @@ ++ return _scheme; ++ } ++ ++++ (NSString *)libraryDriversSubDir { +++ return [NSString stringWithFormat:@"GDLAdaptors-%i.%i", +++ GDL_MAJOR_VERSION, GDL_MINOR_VERSION]; +++} +++ ++ - (NSDictionary *)connectionDictionaryForNSURL:(NSURL *)_url { ++ /* ++ "Database URLs" ++Index: sope-gdl1/GDLAccess/FoundationExt/GNUmakefile ++=================================================================== ++--- sope-gdl1/GDLAccess/FoundationExt/GNUmakefile (révision 1632) +++++ sope-gdl1/GDLAccess/FoundationExt/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../../Version ++ include ../Version ++Index: sope-gdl1/GDLAccess/common.h ++=================================================================== ++--- sope-gdl1/GDLAccess/common.h (révision 1632) +++++ sope-gdl1/GDLAccess/common.h (copie de travail) ++@@ -42,7 +42,7 @@ ++ #import ++ #import ++ ++-#if !(COCOA_Foundation_LIBRARY || NeXT_Foundation_LIBRARY) +++#if !(COCOA_Foundation_LIBRARY || NeXT_Foundation_LIBRARY || GNUSTEP_BASE_LIBRARY) ++ # import ++ #endif ++ ++Index: sope-gdl1/Oracle8/GNUmakefile ++=================================================================== ++--- sope-gdl1/Oracle8/GNUmakefile (révision 1632) +++++ sope-gdl1/Oracle8/GNUmakefile (copie de travail) ++@@ -19,7 +19,7 @@ ++ # License along with this library; if not, write to the Free Software ++ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ # ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++@@ -51,7 +51,7 @@ ++ ifeq ($(frameworks),yes) ++ BUNDLE_INSTALL_DIR := $(FRAMEWORK_INSTALL_DIR)/GDLAccess.framework/Resources/GDLAdaptors/ ++ else ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/GDLAdaptors-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_DBADAPTORS)/ ++ endif ++ ++ Oracle8_OBJC_FILES = \ ++Index: sope-mime/NGImap4/GNUmakefile ++=================================================================== ++--- sope-mime/NGImap4/GNUmakefile (révision 1632) +++++ sope-mime/NGImap4/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ ++@@ -63,7 +63,10 @@ ++ NGImap4MailboxInfo.m \ ++ NGImap4ConnectionManager.m \ ++ ++--include GNUmakefile.preamble +++include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/subproject.make ++ else ++Index: sope-mime/samples/GNUmakefile ++=================================================================== ++--- sope-mime/samples/GNUmakefile (révision 1632) +++++ sope-mime/samples/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ TOOL_NAME = \ ++@@ -14,16 +14,24 @@ ++ imapcontest \ ++ ++ imapquota_OBJC_FILES = ImapQuotaTool.m ImapTool.m imapquota.m +++imapquota_INSTALL_DIR = $(SOPE_TOOLS) ++ imapacl_OBJC_FILES = ImapQuotaTool.m ImapTool.m imapacl.m +++imapctl_INSTALL_DIR = $(SOPE_TOOLS) ++ imapget_OBJC_FILES = ImapTool.m imapget.m +++imapget_INSTALL_DIR = $(SOPE_TOOLS) ++ imap_tool_OBJC_FILES = imap_tool.m +++imap_tool_INSTALL_DIR = $(SOPE_TOOLS) ++ mime2xml_OBJC_FILES = Mime2XmlTool.m mime2xml.m +++mime2xml_INSTALL_DIR = $(SOPE_TOOLS) ++ imapls_OBJC_FILES = ImapTool.m ImapListTool.m imapls.m +++imapls_INSTALL_DIR = $(SOPE_TOOLS) ++ test_qpdecode_OBJC_FILES = test_qpdecode.m +++test_qpdecode_INSTALL_DIR= $(SOPE_TOOLS) ++ sievetool_OBJC_FILES = sievetool.m +++sievetool_INSTALL_DIR = $(SOPE_TOOLS) ++ imapcontest_OBJC_FILES = imapcontest.m +++imapcontest_INSTALL_DIR = $(SOPE_TOOLS) ++ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-mime/NGMail/GNUmakefile ++=================================================================== ++--- sope-mime/NGMail/GNUmakefile (révision 1632) +++++ sope-mime/NGMail/GNUmakefile (copie de travail) ++@@ -1,10 +1,8 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++-GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT) ++- ++ ifneq ($(frameworks),yes) ++ SUBPROJECT_NAME = NGMail ++ else ++@@ -55,6 +53,9 @@ ++ NSData+MimeQP.m \ ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/subproject.make ++ else ++Index: sope-mime/GNUmakefile ++=================================================================== ++--- sope-mime/GNUmakefile (révision 1632) +++++ sope-mime/GNUmakefile (copie de travail) ++@@ -1,11 +1,9 @@ ++ # GNUstep makefile ++ ++--include ../config.make +++include ../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ./Version ++ ++-GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT) ++- ++ ifneq ($(frameworks),yes) ++ LIBRARY_NAME = libNGMime ++ else ++@@ -14,7 +12,8 @@ ++ ++ libNGMime_HEADER_FILES_DIR = . ++ libNGMime_HEADER_FILES_INSTALL_DIR = /NGMime ++-libNGMime_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGMime_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGMime_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libNGMime_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ ifneq ($(frameworks),yes) ++@@ -35,6 +34,9 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++@@ -42,7 +44,6 @@ ++ include $(GNUSTEP_MAKEFILES)/aggregate.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++ ++ ++ # package ++Index: sope-mime/NGMime/GNUmakefile.preamble ++=================================================================== ++--- sope-mime/NGMime/GNUmakefile.preamble (révision 1632) +++++ sope-mime/NGMime/GNUmakefile.preamble (copie de travail) ++@@ -5,6 +5,15 @@ ++ -DLIBRARY_MINOR_VERSION=${MINOR_VERSION} \ ++ -DLIBRARY_SUBMINOR_VERSION=${SUBMINOR_VERSION} \ ++ +++ifeq ($(patsubstr GNU/%,glibc,$(shell uname -o)),glibc) +++ADDITIONAL_CPPFLAGS += \ +++ -DHAVE_STRNDUP +++endif +++ +++ifneq ($(findstring openbsd, $(GNUSTEP_TARGET_OS)), openbsd) +++ ADDITIONAL_CPPFLAGS += -DHAVE_STRNDUP +++endif +++ ++ NGMime_INCLUDE_DIRS += \ ++ -I.. -I../.. \ ++ -I../../sope-core/NGStreams/ \ ++Index: sope-mime/NGMime/GNUmakefile ++=================================================================== ++--- sope-mime/NGMime/GNUmakefile (révision 1632) +++++ sope-mime/NGMime/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ ++@@ -76,5 +76,8 @@ ++ NGMimeRfc822BodyGenerator.m \ ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ include $(GNUSTEP_MAKEFILES)/subproject.make ++ -include GNUmakefile.postamble ++Index: sope-core/NGExtensions/NGExtensions/NGResourceLocator.h ++=================================================================== ++--- sope-core/NGExtensions/NGExtensions/NGResourceLocator.h (révision 1632) +++++ sope-core/NGExtensions/NGExtensions/NGResourceLocator.h (copie de travail) ++@@ -52,23 +52,54 @@ ++ int reserved:29; ++ } flags; ++ } ++- +++/* The 'GNUstepPath' is a string describing the required path. This +++ * is the relative location of the path in a standard GNUstep +++ * hierarchy when a standard GNUstep hierarchy is being used; but if +++ * gnustep-base (which supports arbitrary filesystem layouts) is being +++ * used, the path is heuristically mapped to the standard paths +++ * accepted by NSSearchPathForDirectoriesInDomains using the following +++ * logic: +++ * +++ * "Library/WebApplications" --> GSWebApplicationsDirectory +++ * "Library/Libraries" --> GSLibrariesDirectory +++ * "Tools" --> GSToolsDirectory +++ * "Tools/Admin" --> GSAdminToolsDirectory +++ * "Applications" --> GSApplicationsDirectory +++ * "Applications/Admin" --> GSAdminApplicationsDirectory +++ * "Library/xxx" --> NSLibraryDirectory/xxx +++ * "yyy" --> NSLibraryDirectory/yyy +++ * +++ * In the last two cases 'xxx' and 'yyy' are arbitrary strings/paths +++ * that don't match anything else. Eg, if you create an +++ * NGResourceLocators to look up files in "Library/Resources" you will +++ * get one that looks them up in NSLibraryDirectory/Resources (which +++ * means a list of directories containing +++ * GNUSTEP_USER_LIBRARY/Resources, GNUSTEP_LOCAL_LIBRARY/Resources, +++ * GNUSTEP_NETWORK_LIBRARY/Resources, +++ * GNUSTEP_SYSTEM_LIBRARY/Resources). +++ */ ++ + (id)resourceLocatorForGNUstepPath:(NSString *)_path fhsPath:(NSString *)_fhs; ++ - (id)initWithGNUstepPath:(NSString *)_path fhsPath:(NSString *)_fhs; ++ ++ /* resource pathes */ ++ +++/* It's not a good idea to access these directly if you want portable +++ * code. More logical to use directly the 'operations' lookup methods +++ * below which encapsulate all the internal filesystem details. +++ */ ++ - (NSArray *)gsRootPathes; /* GNUSTEP_PATHPREFIX_LIST or MacOSX */ ++ - (NSArray *)fhsRootPathes; ++ - (NSArray *)searchPathes; ++ ++ /* operations */ ++ +++/* These are public and work across all types of filesystems, it's how you find resources. */ ++ - (NSString *)lookupFileWithName:(NSString *)_name; ++ - (NSString *)lookupFileWithName:(NSString *)_name extension:(NSString *)_ext; ++ ++ - (NSArray *)lookupAllFilesWithExtension:(NSString *)_ext ++ doReturnFullPath:(BOOL)_withPath; +++/* End public */ ++ ++ @end ++ ++Index: sope-core/NGExtensions/NGBundleManager.m ++=================================================================== ++--- sope-core/NGExtensions/NGBundleManager.m (révision 1632) +++++ sope-core/NGExtensions/NGBundleManager.m (copie de travail) ++@@ -332,10 +332,7 @@ ++ } ++ ++ - (void)_addGNUstepPathsToPathArray:(NSMutableArray *)_paths { ++-#if !GNUSTEP ++-#else ++- // TODO: whats that supposed to do? ++- // TODO: replace with proper path locator function! +++ /* Old code for old gstep-make and gstep-base. */ ++ NSDictionary *env; ++ NSString *p; ++ unsigned i, count; ++@@ -355,7 +352,19 @@ ++ ++ if (p) [self->bundleSearchPaths addObject:p]; ++ } ++-#endif +++ +++ /* New code for new gstep-make and gstep-base. */ +++ tmp = NSStandardLibraryPaths(); +++ { +++ NSEnumerator *e = [tmp objectEnumerator]; +++ while ((tmp = [e nextObject]) != nil) { +++ tmp = [tmp stringByAppendingPathComponent:@"Bundles"]; +++ if ([self->bundleSearchPaths containsObject:tmp]) +++ continue; +++ +++ [self->bundleSearchPaths addObject:tmp]; +++ } +++ } ++ } ++ ++ - (void)_setupBundleSearchPathes { ++Index: sope-core/NGExtensions/FdExt.subproj/GNUmakefile ++=================================================================== ++--- sope-core/NGExtensions/FdExt.subproj/GNUmakefile (révision 1632) +++++ sope-core/NGExtensions/FdExt.subproj/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include ../../common.make ++ ++ SUBPROJECT_NAME = FdExt ++Index: sope-core/NGExtensions/XmlExt.subproj/GNUmakefile ++=================================================================== ++--- sope-core/NGExtensions/XmlExt.subproj/GNUmakefile (révision 1632) +++++ sope-core/NGExtensions/XmlExt.subproj/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include ../../common.make ++ ++ SUBPROJECT_NAME = XmlExt ++Index: sope-core/NGExtensions/EOExt.subproj/GNUmakefile ++=================================================================== ++--- sope-core/NGExtensions/EOExt.subproj/GNUmakefile (révision 1632) +++++ sope-core/NGExtensions/EOExt.subproj/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include ../../common.make ++ ++ SUBPROJECT_NAME = EOExt ++Index: sope-core/NGExtensions/GNUmakefile ++=================================================================== ++--- sope-core/NGExtensions/GNUmakefile (révision 1632) +++++ sope-core/NGExtensions/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ ++ ifneq ($(frameworks),yes) ++@@ -11,7 +11,8 @@ ++ ++ libNGExtensions_PCH_FILE = common.h ++ libNGExtensions_DLL_DEF = libNGExtensions.def ++-libNGExtensions_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGExtensions_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGExtensions_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libNGExtensions_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libNGExtensions_HEADER_FILES_DIR = ./NGExtensions ++@@ -157,10 +158,12 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-core/NGExtensions/NGResourceLocator.m ++=================================================================== ++--- sope-core/NGExtensions/NGResourceLocator.m (révision 1632) +++++ sope-core/NGExtensions/NGResourceLocator.m (copie de travail) ++@@ -43,7 +43,11 @@ ++ return self; ++ } ++ - (id)init { +++#if GNUSTEP_BASE_LIBRARY +++ return [self initWithGNUstepPath:@"Resources" fhsPath:@"share"]; +++#else ++ return [self initWithGNUstepPath:@"Library/Resources" fhsPath:@"share"]; +++#endif ++ } ++ ++ - (void)dealloc { ++@@ -93,19 +97,30 @@ ++ NSString *p; ++ ++ ma = [NSMutableArray arrayWithCapacity:6]; ++- ++- e = ([self->gsSubPath length] > 0) ++- ? [[self gsRootPathes] objectEnumerator] ++- : (NSEnumerator *)nil; ++- while ((p = [e nextObject]) != nil) { ++- p = [p stringByAppendingPathComponent:self->gsSubPath]; ++- if ([ma containsObject:p]) ++- continue; +++ +++ if ([self->gsSubPath length] > 0) { ++ ++- if (![self->fileManager fileExistsAtPath:p]) ++- continue; +++#if GNUSTEP_BASE_LIBRARY +++ NSString *directory; ++ ++- [ma addObject:p]; +++ e = [NSStandardLibraryPaths() objectEnumerator]; +++ while ((directory = [e nextObject])) +++ [ma addObject: [directory stringByAppendingPathComponent:self->gsSubPath]]; +++#else +++ +++ /* Old hack using GNUSTEP_PATHLIST. Should be removed at some point. */ +++ e = [[self gsRootPathes] objectEnumerator]; +++ while ((p = [e nextObject]) != nil) { +++ p = [p stringByAppendingPathComponent:self->gsSubPath]; +++ if ([ma containsObject:p]) +++ continue; +++ +++ if (![self->fileManager fileExistsAtPath:p]) +++ continue; +++ +++ [ma addObject:p]; +++ } +++#endif ++ } ++ ++ e = ([self->fhsSubPath length] > 0) ++Index: sope-core/NGExtensions/NGLogging.subproj/GNUmakefile ++=================================================================== ++--- sope-core/NGExtensions/NGLogging.subproj/GNUmakefile (révision 1632) +++++ sope-core/NGExtensions/NGLogging.subproj/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include ../../common.make ++ ++ SUBPROJECT_NAME = NGLogging ++Index: sope-core/NGExtensions/NGRuleEngine.subproj/GNUmakefile ++=================================================================== ++--- sope-core/NGExtensions/NGRuleEngine.subproj/GNUmakefile (révision 1632) +++++ sope-core/NGExtensions/NGRuleEngine.subproj/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include ../../common.make ++ ++ SUBPROJECT_NAME = NGRuleEngine ++Index: sope-core/GNUmakefile ++=================================================================== ++--- sope-core/GNUmakefile (révision 1632) +++++ sope-core/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../config.make +++include ../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ PACKAGE_NAME=sope-core ++@@ -32,4 +32,4 @@ ++ # package ++ ++ macosx-pkg :: all ++- ../maintenance/make-osxpkg.sh sope-core +++ ../maintenance/make-osxpkg.sh $(PACKAGE_NAME) ++Index: sope-core/NGStreams/GNUmakefile.preamble ++=================================================================== ++--- sope-core/NGStreams/GNUmakefile.preamble (révision 1632) +++++ sope-core/NGStreams/GNUmakefile.preamble (copie de travail) ++@@ -38,7 +38,11 @@ ++ endif ++ ++ ifeq ($(findstring _64, $(GNUSTEP_TARGET_CPU)), _64) +++ifeq ($(findstring openbsd, $(GNUSTEP_TARGET_OS)), openbsd) +++SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib +++else ++ SYSTEM_LIB_DIR += -L/usr/local/lib64 -L/usr/lib64 +++endif ++ else ++ SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib ++ endif ++Index: sope-core/NGStreams/GNUmakefile ++=================================================================== ++--- sope-core/NGStreams/GNUmakefile (révision 1632) +++++ sope-core/NGStreams/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ include ./Version ++ ++@@ -12,7 +12,8 @@ ++ ++ libNGStreams_PCH_FILE = common.h ++ libNGStreams_DLL_DEF = libNGStreams.def ++-libNGStreams_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGStreams_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGStreams_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libNGStreams_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libNGStreams_HEADER_FILES_DIR = NGStreams ++@@ -106,10 +107,12 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-core/samples/GNUmakefile ++=================================================================== ++--- sope-core/samples/GNUmakefile (révision 1632) +++++ sope-core/samples/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ TOOL_NAME = \ ++@@ -36,4 +36,3 @@ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-core/EOControl/GNUmakefile ++=================================================================== ++--- sope-core/EOControl/GNUmakefile (révision 1632) +++++ sope-core/EOControl/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ ++ ifneq ($(frameworks),yes) ++@@ -11,7 +11,8 @@ ++ ++ libEOControl_PCH_FILE = common.h ++ libEOControl_DLL_DEF = libEOControl.def ++-libEOControl_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libEOControl_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libEOControl_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libEOControl_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libEOControl_HEADER_FILES_DIR = . ++@@ -73,10 +74,12 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-core/common.make ++=================================================================== ++--- sope-core/common.make (révision 1632) +++++ sope-core/common.make (copie de travail) ++@@ -6,8 +6,6 @@ ++ include $(SKYROOT)/Version ++ -include ./Version ++ ++-GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT) ++- ++ ADDITIONAL_CPPFLAGS += -pipe -Wall -Wno-protocol ++ ifeq ($(reentrant),yes) ++ ADDITIONAL_CPPFLAGS += -D_REENTRANT=1 ++Index: sope-core/EOCoreData/GNUmakefile ++=================================================================== ++--- sope-core/EOCoreData/GNUmakefile (révision 1632) +++++ sope-core/EOCoreData/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ ++ ifneq ($(frameworks),yes) ++@@ -10,7 +10,8 @@ ++ endif ++ ++ libEOCoreData_PCH_FILE = common.h ++-libEOCoreData_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libEOCoreData_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libEOCoreData_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libEOCoreData_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libEOCoreData_HEADER_FILES_DIR = . ++@@ -67,10 +68,12 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: xmlrpc_call/GNUmakefile ++=================================================================== ++--- xmlrpc_call/GNUmakefile (révision 1632) +++++ xmlrpc_call/GNUmakefile (copie de travail) ++@@ -1,10 +1,11 @@ ++ # GNUstep makefile ++ ++--include ../config.make +++include ../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ ++ TOOL_NAME = xmlrpc_call +++xmlrpc_call_INSTALL_DIR = $(SOPE_TOOLS) ++ ++ xmlrpc_call_PCH_FILE = common.h ++ ++@@ -17,7 +18,6 @@ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++--include fhs.make ++ ++ macosx-pkg :: ++ # do not build a pkg just for this tool ++Index: xmlrpc_call/GNUmakefile.preamble ++=================================================================== ++--- xmlrpc_call/GNUmakefile.preamble (révision 1632) +++++ xmlrpc_call/GNUmakefile.preamble (copie de travail) ++@@ -1,5 +1,6 @@ ++ # compilation settings ++ +++include ../config.make ++ SOPE_ROOT=.. ++ CORE_ROOT=$(SOPE_ROOT)/sope-core ++ APPSERVER_ROOT=$(SOPE_ROOT)/sope-appserver ++@@ -57,14 +58,13 @@ ++ $(foreach dir,$(DEP_DIRS),-F$(GNUSTEP_BUILD_DIR)/$(dir)) ++ endif ++ ++-ifeq ($(findstring _64, $(GNUSTEP_TARGET_CPU)), _64) ++-SYSTEM_LIB_DIR += -L/usr/local/lib64 -L/usr/lib64 +++ifneq ($(CGS_LIBDIR_NAME),) +++SYSTEM_LIB_DIR += -L/usr/local/$(CGS_LIBDIR_NAME) -L/usr/$(CGS_LIBDIR_NAME) ++ else ++ SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib ++ endif ++ ++- ++ # OS dependend stuff ++-ifeq ($(findstring openbsd3, $(GNUSTEP_HOST_OS)), openbsd3) +++ifeq ($(findstring openbsd, $(GNUSTEP_HOST_OS)), openbsd) ++ xmlrpc_call_TOOL_LIBS += -liconv ++ endif ++Index: sope-xml/libxmlSAXDriver/GNUmakefile ++=================================================================== ++--- sope-xml/libxmlSAXDriver/GNUmakefile (révision 1632) +++++ sope-xml/libxmlSAXDriver/GNUmakefile (copie de travail) ++@@ -1,13 +1,13 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++ ++ BUNDLE_NAME = libxmlSAXDriver ++ BUNDLE_EXTENSION = .sax ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/SaxDrivers-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_SAXDRIVERS) ++ ++ libxmlSAXDriver_PCH_FILE = common.h ++ ++@@ -24,4 +24,3 @@ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-xml/DOM/GNUmakefile.preamble ++=================================================================== ++--- sope-xml/DOM/GNUmakefile.preamble (révision 1632) +++++ sope-xml/DOM/GNUmakefile.preamble (copie de travail) ++@@ -1,10 +1,13 @@ ++ # compilation settings ++ +++include ./Version +++ ++ libDOM_HEADER_FILES_DIR = . ++ libDOM_HEADER_FILES_INSTALL_DIR = /DOM ++-libDOM_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libDOM_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libDOM_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libDOM_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++-DOM_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++DOM_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) ++ DOM_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ ++Index: sope-xml/DOM/GNUmakefile ++=================================================================== ++--- sope-xml/DOM/GNUmakefile (révision 1632) +++++ sope-xml/DOM/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ ++ ifneq ($(frameworks),yes) ++@@ -98,10 +98,12 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-xml/ChangeLogSaxDriver/GNUmakefile ++=================================================================== ++--- sope-xml/ChangeLogSaxDriver/GNUmakefile (révision 1632) +++++ sope-xml/ChangeLogSaxDriver/GNUmakefile (copie de travail) ++@@ -1,13 +1,13 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ -include ../../Version ++ -include ./Version ++ ++ BUNDLE_NAME = ChangeLogSaxDriver ++ BUNDLE_EXTENSION = .sax ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/SaxDrivers-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = ${SOPE_SAXDRIVERS}/ ++ ++ ChangeLogSaxDriver_OBJC_FILES = \ ++ ChangeLogSaxDriver.m \ ++@@ -20,4 +20,3 @@ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-xml/GNUmakefile ++=================================================================== ++--- sope-xml/GNUmakefile (révision 1632) +++++ sope-xml/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../config.make +++include ../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ PACKAGE_NAME=sope-xml ++Index: sope-xml/SaxObjC/SaxXMLReaderFactory.m ++=================================================================== ++--- sope-xml/SaxObjC/SaxXMLReaderFactory.m (révision 1632) +++++ sope-xml/SaxObjC/SaxXMLReaderFactory.m (copie de travail) ++@@ -137,11 +137,19 @@ ++ ++ - (void)addSearchPathesForGNUstepEnv:(NSMutableArray *)ma { ++ /* for libFoundation */ +++#if GNUSTEP_BASE_LIBRARY +++NSEnumerator *libraryPaths; +++ NSString *directory, *suffix; +++ +++ suffix = [self libraryDriversSubDir]; +++ libraryPaths = [NSStandardLibraryPaths() objectEnumerator]; +++ while ((directory = [libraryPaths nextObject])) +++ [ma addObject: [directory stringByAppendingPathComponent: suffix]]; +++#else +++ NSString *subdir; +++ NSEnumerator *e; ++ NSDictionary *env; ++- NSEnumerator *e; ++- NSString *subdir; ++ id tmp; ++- ++ env = [[NSProcessInfo processInfo] environment]; ++ ++ if ((tmp = [env objectForKey:@"GNUSTEP_PATHPREFIX_LIST"]) == nil) ++@@ -159,6 +167,7 @@ ++ ++ [ma addObject:tmp]; ++ } +++#endif ++ } ++ ++ - (NSArray *)saxReaderSearchPathes { ++@@ -182,8 +191,8 @@ ++ /* FHS fallback */ ++ ++ tmp = [[NSString alloc] initWithFormat: ++-#if CONFIGURE_64BIT ++- @"lib64/sope-%i.%i/saxdrivers/", +++#ifdef CGS_LIBDIR_NAME +++ [CGS_LIBDIR_NAME stringByAppendingString:@"/sope-%i.%i/saxdrivers/"], ++ #else ++ @"lib/sope-%i.%i/saxdrivers/", ++ #endif ++Index: sope-xml/SaxObjC/SaxObjectModel.h ++=================================================================== ++--- sope-xml/SaxObjC/SaxObjectModel.h (révision 1632) +++++ sope-xml/SaxObjC/SaxObjectModel.h (copie de travail) ++@@ -34,6 +34,7 @@ ++ ++ + (id)modelWithName:(NSString *)_name; ++ + (id)modelWithContentsOfFile:(NSString *)_path; ++++ (NSString *)libraryDriversSubDir; ++ ++ - (id)initWithDictionary:(NSDictionary *)_dict; ++ ++Index: sope-xml/SaxObjC/SaxObjectModel.m ++=================================================================== ++--- sope-xml/SaxObjC/SaxObjectModel.m (révision 1632) +++++ sope-xml/SaxObjC/SaxObjectModel.m (copie de travail) ++@@ -67,12 +67,12 @@ ++ if (searchPathes == nil) { ++ NSMutableArray *ma; ++ NSDictionary *env; ++- id tmp; ++ ++ env = [[NSProcessInfo processInfo] environment]; ++ ma = [NSMutableArray arrayWithCapacity:6]; ++ ++ #if COCOA_Foundation_LIBRARY +++ id tmp; ++ tmp = NSSearchPathForDirectoriesInDomains(NSAllLibrariesDirectory, ++ NSAllDomainsMask, ++ YES); ++@@ -86,7 +86,16 @@ ++ [ma addObject:tmp]; ++ } ++ } +++#elif GNUSTEP_BASE_LIBRARY +++ NSEnumerator *libraryPaths; +++ NSString *directory, *suffix; +++ +++ suffix = [self libraryDriversSubDir]; +++ libraryPaths = [NSStandardLibraryPaths() objectEnumerator]; +++ while ((directory = [libraryPaths nextObject])) +++ [ma addObject: [directory stringByAppendingPathComponent: suffix]]; ++ #else +++ id tmp; ++ if ((tmp = [env objectForKey:@"GNUSTEP_PATHPREFIX_LIST"]) == nil) ++ tmp = [env objectForKey:@"GNUSTEP_PATHLIST"]; ++ tmp = [tmp componentsSeparatedByString:@":"]; ++@@ -122,6 +131,10 @@ ++ return searchPathes; ++ } ++ ++++ (NSString *)libraryDriversSubDir { +++ return [NSString stringWithFormat:@"SaxMappings"]; +++} +++ ++ + (id)modelWithName:(NSString *)_name { ++ NSFileManager *fileManager; ++ NSEnumerator *pathes; ++Index: sope-xml/SaxObjC/GNUmakefile.preamble ++=================================================================== ++--- sope-xml/SaxObjC/GNUmakefile.preamble (révision 1632) +++++ sope-xml/SaxObjC/GNUmakefile.preamble (copie de travail) ++@@ -1,9 +1,12 @@ ++ # compilation settings ++ +++include ./Version +++ ++ libSaxObjC_DLL_DEF = libSaxObjC.def ++-libSaxObjC_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libSaxObjC_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libSaxObjC_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libSaxObjC_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++-SaxObjC_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++SaxObjC_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) ++ SaxObjC_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libSaxObjC_HEADER_FILES_DIR = . ++@@ -48,8 +51,8 @@ ++ ADDITIONAL_CPPFLAGS += -DFHS_INSTALL_ROOT=\@\"$(FHS_INSTALL_ROOT)\" ++ endif ++ ++-ifeq ($(CONFIGURE_64BIT),yes) ++-ADDITIONAL_CPPFLAGS += -DCONFIGURE_64BIT=1 +++ifneq ($(CGS_LIBDIR_NAME),) +++ADDITIONAL_CPPFLAGS += -DCGS_LIBDIR_NAME=\@\"$(CGS_LIBDIR_NAME)\" ++ endif ++ ++ # Apple ++Index: sope-xml/SaxObjC/GNUmakefile ++=================================================================== ++--- sope-xml/SaxObjC/GNUmakefile (révision 1632) +++++ sope-xml/SaxObjC/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ ++ ifneq ($(frameworks),yes) ++@@ -56,10 +56,12 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-xml/common.make ++=================================================================== ++--- sope-xml/common.make (révision 1632) +++++ sope-xml/common.make (copie de travail) ++@@ -1,13 +1,7 @@ ++ # GNUstep makefile ++ ++-SKYROOT=.. ++- ++ include $(GNUSTEP_MAKEFILES)/common.make ++-include $(SKYROOT)/Version ++--include ./Version ++ ++-GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT) ++- ++ ADDITIONAL_CPPFLAGS += -pipe -Wall -Wno-protocol ++ ++ ADDITIONAL_INCLUDE_DIRS += -I.. ++Index: sope-xml/samples/PlistSaxDriver/GNUmakefile ++=================================================================== ++--- sope-xml/samples/PlistSaxDriver/GNUmakefile (révision 1632) +++++ sope-xml/samples/PlistSaxDriver/GNUmakefile (copie de travail) ++@@ -1,11 +1,11 @@ ++ # GNUstep Makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ BUNDLE_NAME = PlistSaxDriver ++ BUNDLE_EXTENSION = .sax ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_USER_ROOT)/Library/Bundles +++BUNDLE_INSTALL_DIR = $(GNUSTEP_BUNDLES) ++ ++ PlistSaxDriver_OBJC_FILES = \ ++ PlistSaxDriver.m ++Index: sope-xml/samples/GNUmakefile ++=================================================================== ++--- sope-xml/samples/GNUmakefile (révision 1632) +++++ sope-xml/samples/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ TOOL_NAME = \ ++@@ -13,14 +13,20 @@ ++ testqp \ ++ ++ rss2plist1_OBJC_FILES = rss2plist1.m +++rss2plist1_INSTALL_DIR = $(SOPE_TOOLS)/ ++ rss2plist2_OBJC_FILES = rss2plist2.m +++rss2plist2_INSTALL_DIR = $(SOPE_TOOLS)/ ++ rssparse_OBJC_FILES = rssparse.m +++rssparse_INSTALL_DIR = $(SOPE_TOOLS)/ ++ saxxml_OBJC_FILES = saxxml.m +++saxxml_INSTALL_DIR = $(SOPE_TOOLS)/ ++ xmln_OBJC_FILES = xmln.m +++xmln_INSTALL_DIR = $(SOPE_TOOLS)/ ++ domxml_OBJC_FILES = domxml.m +++domxml_INSTALL_DIR = $(SOPE_TOOLS)/ ++ testqp_OBJC_FILES = testqp.m +++testqp_INSTALL_DIR = $(SOPE_TOOLS)/ ++ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-xml/samples/GNUmakefile.preamble ++=================================================================== ++--- sope-xml/samples/GNUmakefile.preamble (révision 1632) +++++ sope-xml/samples/GNUmakefile.preamble (copie de travail) ++@@ -1,5 +1,6 @@ ++ # compilation settings ++ +++include ../../config.make ++ ++ rss2plist1_PCH_FILE = common.h ++ rss2plist2_PCH_FILE = common.h ++@@ -42,8 +43,8 @@ ++ $(foreach dir,$(DEP_DIRS),-F$(GNUSTEP_BUILD_DIR)/$(dir)) ++ endif ++ ++-ifeq ($(findstring _64, $(GNUSTEP_TARGET_CPU)), _64) ++-SYSTEM_LIB_DIR += -L/usr/local/lib64 -L/usr/lib64 +++ifneq ($(CGS_LIBDIR_NAME),) +++SYSTEM_LIB_DIR += -L/usr/local/$(CGS_LIBDIR_NAME) -L/usr/$(CGS_LIBDIR_NAME) ++ else ++ SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib ++ endif ++Index: sope-xml/XmlRpc/GNUmakefile.preamble ++=================================================================== ++--- sope-xml/XmlRpc/GNUmakefile.preamble (révision 1632) +++++ sope-xml/XmlRpc/GNUmakefile.preamble (copie de travail) ++@@ -1,10 +1,13 @@ ++ # compilation settings ++ +++include ./Version +++ ++ libXmlRpc_HEADER_FILES_DIR = . ++ libXmlRpc_HEADER_FILES_INSTALL_DIR = /XmlRpc ++-libXmlRpc_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libXmlRpc_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libXmlRpc_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libXmlRpc_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++-XmlRpc_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++XmlRpc_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) ++ XmlRpc_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ ++Index: sope-xml/XmlRpc/GNUmakefile ++=================================================================== ++--- sope-xml/XmlRpc/GNUmakefile (révision 1632) +++++ sope-xml/XmlRpc/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ ++ ifneq ($(frameworks),yes) ++@@ -43,10 +43,12 @@ ++ ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-xml/STXSaxDriver/ExtraSTX/GNUmakefile ++=================================================================== ++--- sope-xml/STXSaxDriver/ExtraSTX/GNUmakefile (révision 1632) +++++ sope-xml/STXSaxDriver/ExtraSTX/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ SUBPROJECT_NAME = ExtraSTX ++Index: sope-xml/STXSaxDriver/GNUmakefile ++=================================================================== ++--- sope-xml/STXSaxDriver/GNUmakefile (révision 1632) +++++ sope-xml/STXSaxDriver/GNUmakefile (copie de travail) ++@@ -1,13 +1,13 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++ ++ BUNDLE_NAME = STXSaxDriver ++ BUNDLE_EXTENSION = .sax ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/SaxDrivers-$(SOPE_MAJOR_VERSION).$(SOPE_MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_SAXDRIVERS) ++ ++ STXSaxDriver_PCH_FILE = common.h ++ ++@@ -24,4 +24,3 @@ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-xml/STXSaxDriver/Model/GNUmakefile ++=================================================================== ++--- sope-xml/STXSaxDriver/Model/GNUmakefile (révision 1632) +++++ sope-xml/STXSaxDriver/Model/GNUmakefile (copie de travail) ++@@ -6,7 +6,7 @@ ++ # Date: 24 November 2003 ++ # ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ SUBPROJECT_NAME = Model ++Index: sope-xml/pyxSAXDriver/GNUmakefile ++=================================================================== ++--- sope-xml/pyxSAXDriver/GNUmakefile (révision 1632) +++++ sope-xml/pyxSAXDriver/GNUmakefile (copie de travail) ++@@ -1,17 +1,16 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++ ++ BUNDLE_NAME = pyxSAXDriver ++ BUNDLE_EXTENSION = .sax ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_USER_ROOT)/Library/SaxDrivers-$(SOPE_MAJOR_VERSION).$(SOPE_MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = ${SOPE_SAXDRIVERS}/ ++ ++ pyxSAXDriver_OBJC_FILES = pyxSAXDriver.m ++ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-appserver/GNUmakefile ++=================================================================== ++--- sope-appserver/GNUmakefile (révision 1632) +++++ sope-appserver/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../config.make +++include ../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ PACKAGE_NAME=sope-appserver ++@@ -38,4 +38,4 @@ ++ # package ++ ++ macosx-pkg :: all ++- ../maintenance/make-osxpkg.sh sope-appserver +++ ../maintenance/make-osxpkg.sh $(PACKAGE_NAME) ++Index: sope-appserver/SoOFS/GNUmakefile.preamble ++=================================================================== ++--- sope-appserver/SoOFS/GNUmakefile.preamble (révision 1632) +++++ sope-appserver/SoOFS/GNUmakefile.preamble (copie de travail) ++@@ -76,17 +76,9 @@ ++ $(foreach dir,$(DEP_DIRS),-F$(GNUSTEP_BUILD_DIR)/$(dir)) ++ endif ++ ++-ifeq ($(findstring _64, $(GNUSTEP_TARGET_CPU)), _64) ++-SYSTEM_LIB_DIR += -L/usr/local/lib64 -L/usr/lib64 ++-else ++-SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib ++-endif ++- ++- ++- ++ # platform specific settings ++ ++-ifneq ($(findstring openbsd3, $(GNUSTEP_TARGET_OS)), openbsd3) +++ifneq ($(findstring openbsd, $(GNUSTEP_TARGET_OS)), openbsd) ++ # OpenBSD does not require libcrypt ++ ifneq ($(findstring darwin, $(GNUSTEP_TARGET_OS)), darwin) ++ # and neither does MacOSX? ... ++@@ -94,6 +86,6 @@ ++ endif ++ endif ++ ++-ifeq ($(findstring openbsd3, $(GNUSTEP_TARGET_OS)), openbsd3) +++ifeq ($(findstring openbsd, $(GNUSTEP_TARGET_OS)), openbsd) ++ $(SOPED_NAME)_TOOL_LIBS += -liconv ++ endif ++Index: sope-appserver/SoOFS/GNUmakefile ++=================================================================== ++--- sope-appserver/SoOFS/GNUmakefile (révision 1632) +++++ sope-appserver/SoOFS/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++@@ -14,7 +14,8 @@ ++ ++ ++ libSoOFS_PCH_FILE = common.h ++-libSoOFS_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libSoOFS_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libSoOFS_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libSoOFS_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libSoOFS_HEADER_FILES_DIR = . ++@@ -75,7 +76,7 @@ ++ ++ BUNDLE_NAME = SoOFS ++ BUNDLE_EXTENSION = .sxp ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/SoProducts-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_PRODUCTS)/ ++ ++ SoOFS_OBJC_FILES = SoOFSProduct.m ++ SoOFS_RESOURCE_FILES = product.plist Version ++@@ -91,9 +92,13 @@ ++ TOOL_NAME = $(SOPED_NAME) ++ ++ $(SOPED_NAME)_OBJC_FILES = sope.m +++$(SOPED_NAME)_INSTALL_DIR = $(SOPE_ADMIN_TOOLS) ++ ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++@@ -102,4 +107,3 @@ ++ endif ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-appserver/NGXmlRpc/GNUmakefile ++=================================================================== ++--- sope-appserver/NGXmlRpc/GNUmakefile (révision 1632) +++++ sope-appserver/NGXmlRpc/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++@@ -12,7 +12,8 @@ ++ endif ++ ++ libNGXmlRpc_PCH_FILE = common.h ++-libNGXmlRpc_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGXmlRpc_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGXmlRpc_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libNGXmlRpc_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libNGXmlRpc_HEADER_FILES_DIR = . ++@@ -65,6 +66,9 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++@@ -72,4 +76,3 @@ ++ endif ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-appserver/WEExtensions/GNUmakefile.preamble ++=================================================================== ++--- sope-appserver/WEExtensions/GNUmakefile.preamble (révision 1632) +++++ sope-appserver/WEExtensions/GNUmakefile.preamble (copie de travail) ++@@ -21,7 +21,8 @@ ++ cp ../bundle-info.plist .) ++ endif ++ ++-libWEExtensions_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libWEExtensions_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libWEExtensions_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libWEExtensions_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ ++Index: sope-appserver/WEExtensions/GNUmakefile ++=================================================================== ++--- sope-appserver/WEExtensions/GNUmakefile (révision 1632) +++++ sope-appserver/WEExtensions/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++@@ -11,7 +11,7 @@ ++ ++ BUNDLE_NAME = WEExtensions ++ BUNDLE_EXTENSION = .wox ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/WOxElemBuilders-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_WOXBUILDERS)/ ++ ++ else ++ FRAMEWORK_NAME = WEExtensions ++@@ -99,6 +99,9 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++@@ -106,4 +109,3 @@ ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-appserver/WEExtensions/WEResourceManager.m ++=================================================================== ++--- sope-appserver/WEExtensions/WEResourceManager.m (révision 1632) +++++ sope-appserver/WEExtensions/WEResourceManager.m (copie de travail) ++@@ -53,28 +53,43 @@ ++ ++ + (NSString *)gsTemplatesSubpath { ++ NSString *p; ++- ++ p = [[WOApplication application] gsTemplatesDirectoryName]; +++#if ! GNUSTEP_BASE_LIBRARY +++ // for GNUSTEP_BASE_LIBRARY this is already there in rootPathesInGNUstep ++ p = [@"Library/" stringByAppendingString:p]; +++#endif ++ return p; ++ } ++ + (NSString *)gsWebSubpath { ++ NSString *p; ++ ++ p = [[WOApplication application] gsWebDirectoryName]; +++#if ! GNUSTEP_BASE_LIBRARY +++ // for GNUSTEP_BASE_LIBRARY this is already there in rootPathesInGNUstep ++ p = [@"Library/" stringByAppendingString:p]; +++#endif ++ return p; ++ } ++ ++ /* locate resource directories */ ++ ++ + (NSArray *)rootPathesInGNUstep { +++ id tmp; +++#if GNUSTEP_BASE_LIBRARY +++ NSEnumerator *libraryPaths; +++ NSString *directory; +++ +++ tmp = [[NSMutableArray alloc] init]; +++ libraryPaths = [NSStandardLibraryPaths() objectEnumerator]; +++ while ((directory = [libraryPaths nextObject])) +++ [tmp addObject: directory]; +++ return tmp; +++#else ++ NSDictionary *env; ++- id tmp; ++- ++ env = [[NSProcessInfo processInfo] environment]; ++ if ((tmp = [env objectForKey:@"GNUSTEP_PATHPREFIX_LIST"]) == nil) ++ tmp = [env objectForKey:@"GNUSTEP_PATHLIST"]; +++#endif ++ ++ return [tmp componentsSeparatedByString:@":"]; ++ } ++@@ -95,9 +110,17 @@ ++ NSMutableArray *ma; ++ BOOL isDir; ++ id tmp; ++- ++ fm = [NSFileManager defaultManager]; ++ ma = [NSMutableArray arrayWithCapacity:8]; +++ +++#ifdef GNUSTEP_BASE_LIBRARY +++ NSEnumerator *libraryPaths; +++ NSString *directory; +++ +++ libraryPaths = [NSStandardLibraryPaths() objectEnumerator]; +++ while ((directory = [libraryPaths nextObject])) +++ [ma addObject: [directory stringByAppendingPathComponent: _name]]; +++#else ++ ++ e = [[self rootPathesInGNUstep] objectEnumerator]; ++ while ((tmp = [e nextObject]) != nil) { ++@@ -115,6 +138,7 @@ ++ ++ [ma addObject:tmp]; ++ } +++#endif ++ ++ /* hack in FHS pathes */ ++ ++Index: sope-appserver/WEExtensions/WETableView/GNUmakefile ++=================================================================== ++--- sope-appserver/WEExtensions/WETableView/GNUmakefile (révision 1632) +++++ sope-appserver/WEExtensions/WETableView/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ SUBPROJECT_NAME = WETableView ++Index: sope-appserver/NGObjWeb/WOCoreApplication+Bundle.m ++=================================================================== ++--- sope-appserver/NGObjWeb/WOCoreApplication+Bundle.m (révision 1632) +++++ sope-appserver/NGObjWeb/WOCoreApplication+Bundle.m (copie de travail) ++@@ -50,8 +50,6 @@ ++ } ++ else { ++ NSDictionary *env; ++- NSEnumerator *e; ++- id tmp; ++ ++ env = [[NSProcessInfo processInfo] environment]; ++ ++@@ -67,7 +65,20 @@ ++ bp = @"/System/Library"; ++ bp = [bp stringByAppendingPathComponent:_domain]; ++ [chkPathes addObject:bp]; +++#elif GNUSTEP_BASE_LIBRARY +++ NSEnumerator *libraryPaths; +++ NSString *directory; +++ +++ libraryPaths = [NSStandardLibraryPaths() objectEnumerator]; +++ while ((directory = [libraryPaths nextObject])) { +++ directory = [directory stringByAppendingPathComponent:_domain]; +++ if ([chkPathes containsObject:directory]) continue; +++ [chkPathes addObject:directory]; +++ +++ } ++ #else +++ NSEnumerator *e; +++ id tmp; ++ if ((tmp = [env objectForKey:@"GNUSTEP_PATHPREFIX_LIST"]) == nil) ++ tmp = [env objectForKey:@"GNUSTEP_PATHLIST"]; ++ tmp = [tmp componentsSeparatedByString:@":"]; ++Index: sope-appserver/NGObjWeb/wobundle-gs.make ++=================================================================== ++--- sope-appserver/NGObjWeb/wobundle-gs.make (révision 1632) +++++ sope-appserver/NGObjWeb/wobundle-gs.make (copie de travail) ++@@ -85,7 +85,7 @@ ++ endif ++ ++ ifeq ($(WOBUNDLE_INSTALL_DIR),) ++-WOBUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Libraries +++WOBUNDLE_INSTALL_DIR = $(GNUSTEP_WEB_APPS) ++ endif ++ # The name of the bundle is in the BUNDLE_NAME variable. ++ # The list of languages the bundle is localized in are in xxx_LANGUAGES ++@@ -287,8 +287,10 @@ ++ @$(MKDIRS) $@ ++ ++ internal-wobundle-install_:: $(WOBUNDLE_INSTALL_DIR) shared-instance-headers-install ++- rm -rf $(WOBUNDLE_INSTALL_DIR)/$(WOBUNDLE_DIR_NAME); \ ++- $(TAR) chf - --exclude=CVS --exclude=.svn --to-stdout $(WOBUNDLE_DIR_NAME) | (cd $(WOBUNDLE_INSTALL_DIR); $(TAR) xf -) +++# rm -rf $(WOBUNDLE_INSTALL_DIR)/$(WOBUNDLE_DIR_NAME); \ +++# $(TAR) chf - --exclude=CVS --exclude=.svn --to-stdout $(WOBUNDLE_DIR_NAME) | (cd $(WOBUNDLE_INSTALL_DIR); $(TAR) xf -) +++ if [ -e $(WOBUNDLE_INSTALL_DIR)/$(WOBUNDLE_DIR_NAME) ]; then rm -rf $(WOBUNDLE_INSTALL_DIR)/$(WOBUNDLE_DIR_NAME); fi; \ +++ cp -LR $(WOBUNDLE_DIR_NAME) $(WOBUNDLE_INSTALL_DIR) ++ ifneq ($(CHOWN_TO),) ++ $(CHOWN) -R $(CHOWN_TO) $(WOBUNDLE_INSTALL_DIR)/$(WOBUNDLE_DIR_NAME) ++ endif ++Index: sope-appserver/NGObjWeb/GNUmakefile.preamble ++=================================================================== ++--- sope-appserver/NGObjWeb/GNUmakefile.preamble (révision 1632) +++++ sope-appserver/NGObjWeb/GNUmakefile.preamble (copie de travail) ++@@ -50,9 +50,6 @@ ++ $(foreach dir,$(DEP_DIRS),-F$(GNUSTEP_BUILD_DIR)/$(dir)) ++ endif ++ ++-SYSTEM_LIB_DIR += $(CONFIGURE_SYSTEM_LIB_DIR) ++- ++- ++ # dependencies ++ ++ ifneq ($(frameworks),yes) ++@@ -85,6 +82,7 @@ ++ $(sope-mime-libs) \ ++ $(sope-core-libs) \ ++ $(sope-xml-libs) +++wod_INSTALL_DIR = $(SOPE_TOOLS) ++ SoCore_BUNDLE_LIBS += \ ++ $(sope-ngobjweb-libs) \ ++ $(sope-mime-libs) \ ++@@ -94,7 +92,7 @@ ++ ++ # platform specific settings ++ ++-ifneq ($(findstring openbsd3, $(GNUSTEP_TARGET_OS)), openbsd3) +++ifneq ($(findstring openbsd, $(GNUSTEP_TARGET_OS)), openbsd) ++ # OpenBSD does not require libcrypt ++ ifneq ($(findstring darwin, $(GNUSTEP_TARGET_OS)), darwin) ++ # and neither does MacOSX? ... ++@@ -116,6 +114,6 @@ ++ libNGObjWeb_LIBRARIES_DEPEND_UPON += -lFoundationExt ++ endif ++ ++-ifeq ($(findstring openbsd3, $(GNUSTEP_TARGET_OS)), openbsd3) +++ifeq ($(findstring openbsd, $(GNUSTEP_TARGET_OS)), openbsd) ++ wod_TOOL_LIBS += -liconv ++ endif ++Index: sope-appserver/NGObjWeb/GNUmakefile ++=================================================================== ++--- sope-appserver/NGObjWeb/GNUmakefile (révision 1632) +++++ sope-appserver/NGObjWeb/GNUmakefile (copie de travail) ++@@ -1,11 +1,9 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ include ./Version ++ ++-GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT) ++- ++ ifneq ($(frameworks),yes) ++ LIBRARY_NAME = libNGObjWeb ++ else ++@@ -14,15 +12,12 @@ ++ ++ ++ ifneq ($(frameworks),yes) ++-ifeq ($(FHS_INSTALL_ROOT),) ++-RESOURCES_DIR = $(GNUSTEP_RESOURCES)/NGObjWeb ++-else ++-RESOURCES_DIR = $(FHS_INSTALL_ROOT)/share/sope-$(MAJOR_VERSION).$(MINOR_VERSION)/ngobjweb +++RESOURCES_DIR = $(SOPE_NGOBJWEB)/ ++ endif ++-endif ++ ++ libNGObjWeb_PCH_FILE = common.h ++-libNGObjWeb_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGObjWeb_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGObjWeb_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libNGObjWeb_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libNGObjWeb_SUBPROJECTS = \ ++@@ -40,7 +35,7 @@ ++ libNGObjWeb_RESOURCES = \ ++ Defaults.plist \ ++ Languages.plist \ ++- DAVPropMap.plist \ +++ DAVPropMap.plist ++ ++ FHS_MANPAGES += \ ++ sope-ngobjweb-defaults.5 \ ++@@ -167,7 +162,7 @@ ++ ++ BUNDLE_NAME = SoCore ++ BUNDLE_EXTENSION = .sxp ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/SoProducts-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_PRODUCTS)/ ++ ++ SoCore_PCH_FILE = common.h ++ SoCore_OBJC_FILES = SoCoreProduct.m ++@@ -190,6 +185,9 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++@@ -198,4 +196,3 @@ ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-appserver/NGObjWeb/WebDAV/GNUmakefile ++=================================================================== ++--- sope-appserver/NGObjWeb/WebDAV/GNUmakefile (révision 1632) +++++ sope-appserver/NGObjWeb/WebDAV/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include ../../Version ++ include ../Version ++ include $(GNUSTEP_MAKEFILES)/common.make ++Index: sope-appserver/NGObjWeb/DynamicElements/GNUmakefile ++=================================================================== ++--- sope-appserver/NGObjWeb/DynamicElements/GNUmakefile (révision 1632) +++++ sope-appserver/NGObjWeb/DynamicElements/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ SUBPROJECT_NAME = DynamicElements ++Index: sope-appserver/NGObjWeb/SoObjects/SoProductLoader.m ++=================================================================== ++--- sope-appserver/NGObjWeb/SoObjects/SoProductLoader.m (révision 1632) +++++ sope-appserver/NGObjWeb/SoObjects/SoProductLoader.m (copie de travail) ++@@ -74,6 +74,14 @@ ++ } ++ ++ - (void)_addGNUstepSearchPathesToArray:(NSMutableArray *)ma { +++#if GNUSTEP_BASE_LIBRARY +++ NSEnumerator *libraryPaths; +++ NSString *directory; +++ +++ libraryPaths = [NSStandardLibraryPaths() objectEnumerator]; +++ while ((directory = [libraryPaths nextObject])) +++ [ma addObject: [directory stringByAppendingPathComponent: self->productDirectoryName]]; +++#else ++ NSDictionary *env; ++ id tmp; ++ ++@@ -97,6 +105,7 @@ ++ [self logWithFormat:@"%s: empty library search path !", ++ __PRETTY_FUNCTION__]; ++ } +++#endif ++ } ++ ++ - (void)_addFHSPathesToArray:(NSMutableArray *)ma { ++Index: sope-appserver/NGObjWeb/SoObjects/SoProductRegistry.m ++=================================================================== ++--- sope-appserver/NGObjWeb/SoObjects/SoProductRegistry.m (révision 1632) +++++ sope-appserver/NGObjWeb/SoObjects/SoProductRegistry.m (copie de travail) ++@@ -231,7 +231,7 @@ ++ ++ fm = [NSFileManager defaultManager]; ++ pi = [NSProcessInfo processInfo]; ++- +++#if ! GNUSTEP_BASE_LIBRARY ++ #if COCOA_Foundation_LIBRARY && !COMPILE_FOR_GNUSTEP ++ /* ++ TODO: (like COMPILE_FOR_GNUSTEP) ++@@ -250,12 +250,9 @@ ++ pathes = [[pathes stringValue] componentsSeparatedByString:@":"]; ++ relPath = @"Library/"; ++ #endif ++- ++- [self debugWithFormat:@"scanning for products ..."]; ++- ++ relPath = [relPath stringByAppendingFormat:@"SoProducts-%i.%i/", ++ SOPE_MAJOR_VERSION, SOPE_MINOR_VERSION]; ++- +++ [self debugWithFormat:@"scanning for products ..."]; ++ for (i = 0; i < [pathes count]; i++) { ++ NSString *lPath; ++ BOOL isDir; ++@@ -271,7 +268,38 @@ ++ [self debugWithFormat:@" directory %@", lPath]; ++ [self scanForProductsInDirectory:lPath]; ++ } +++#else +++ NSEnumerator *libraryPaths; +++ NSString *directory; +++ NSMutableArray *tmppath; ++ +++ libraryPaths = [NSStandardLibraryPaths() objectEnumerator]; +++ tmppath = [[NSMutableArray alloc] init]; +++ while ((directory = [libraryPaths nextObject])) +++ [tmppath addObject: [directory stringByAppendingPathComponent: +++ [NSString stringWithFormat:@"SoProducts-%i.%i/", +++ SOPE_MAJOR_VERSION, SOPE_MINOR_VERSION]]]; +++ pathes = [tmppath mutableCopy]; +++ [self debugWithFormat:@"scanning for products ..."]; +++ for (i = 0; i < [pathes count]; i++) { +++ NSString *lPath; +++ BOOL isDir; +++ +++ lPath = [pathes objectAtIndex:i]; +++ [self debugWithFormat:@" scan: %@", lPath]; +++ +++ if (![fm fileExistsAtPath:lPath isDirectory:&isDir]) +++ continue; +++ if (!isDir) +++ continue; +++ +++ [self debugWithFormat:@" directory %@", lPath]; +++ [self scanForProductsInDirectory:lPath]; +++ } +++ [tmppath release]; +++#endif +++ +++ ++ #if COCOA_Foundation_LIBRARY ++ /* look in wrapper places */ ++ bundle = [NSBundle bundleForClass:[self class]]; ++@@ -282,8 +310,8 @@ ++ /* look into FHS pathes */ ++ ++ relPath = [NSString stringWithFormat: ++-#if CONFIGURE_64BIT ++- @"lib64/sope-%i.%i/products/", +++#ifdef CGS_LIBDIR_NAME +++ [CGS_LIBDIR_NAME stringByAppendingString:@"/sope-%i.%i/products/"], ++ #else ++ @"lib/sope-%i.%i/products/", ++ #endif ++Index: sope-appserver/NGObjWeb/SoObjects/GNUmakefile.preamble ++=================================================================== ++--- sope-appserver/NGObjWeb/SoObjects/GNUmakefile.preamble (révision 1632) +++++ sope-appserver/NGObjWeb/SoObjects/GNUmakefile.preamble (copie de travail) ++@@ -1,5 +1,7 @@ ++ # compilation settings ++ +++include ../../../config.make +++ ++ ADDITIONAL_INCLUDE_DIRS += -I../WebDAV/ ++ ++ ADDITIONAL_CPPFLAGS += -DCOMPILING_NGOBJWEB=1 -DCOMPILE_FOR_GNUSTEP=1 ++@@ -10,6 +12,6 @@ ++ ADDITIONAL_CPPFLAGS += -DFHS_INSTALL_ROOT=\@\"$(FHS_INSTALL_ROOT)\" ++ endif ++ ++-ifeq ($(CONFIGURE_64BIT),yes) ++-ADDITIONAL_CPPFLAGS += -DCONFIGURE_64BIT=1 +++ifneq ($(CGS_LIBDIR_NAME),) +++ADDITIONAL_CPPFLAGS += -DCGS_LIBDIR_NAME=\@\"$(CGS_LIBDIR_NAME)\" ++ endif ++Index: sope-appserver/NGObjWeb/SoObjects/GNUmakefile ++=================================================================== ++--- sope-appserver/NGObjWeb/SoObjects/GNUmakefile (révision 1632) +++++ sope-appserver/NGObjWeb/SoObjects/GNUmakefile (copie de travail) ++@@ -1,7 +1,7 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make ++ include ../subdirs.make +++include ../../../config.make ++ ++ SUBPROJECT_NAME = SoObjects ++ ++Index: sope-appserver/NGObjWeb/Templates/GNUmakefile ++=================================================================== ++--- sope-appserver/NGObjWeb/Templates/GNUmakefile (révision 1632) +++++ sope-appserver/NGObjWeb/Templates/GNUmakefile (copie de travail) ++@@ -1,7 +1,7 @@ ++ # GNUmakefile makefile ++ ++--include ../../../config.make ++ include ../subdirs.make +++include ../../../config.make ++ ++ SUBPROJECT_NAME = Templates ++ ++Index: sope-appserver/NGObjWeb/Templates/WOApplication+Builders.m ++=================================================================== ++--- sope-appserver/NGObjWeb/Templates/WOApplication+Builders.m (révision 1632) +++++ sope-appserver/NGObjWeb/Templates/WOApplication+Builders.m (copie de travail) ++@@ -76,7 +76,7 @@ ++ ++ fm = [NSFileManager defaultManager]; ++ pi = [NSProcessInfo processInfo]; ++- +++#if ! GNUSTEP_BASE_LIBRARY ++ #if COCOA_Foundation_LIBRARY ++ /* ++ TODO: (like COMPILE_FOR_GNUSTEP) ++@@ -121,16 +121,43 @@ ++ [self debugWithFormat:@" directory %@", lPath]; ++ [self scanForBuilderBundlesInDirectory:lPath]; ++ } +++#else +++ NSEnumerator *libraryPaths; +++ NSString *directory; +++ NSMutableArray *tmppathes; +++ +++ libraryPaths = [NSStandardLibraryPaths() objectEnumerator]; +++ tmppathes = [[NSMutableArray alloc] init]; +++ while ((directory = [libraryPaths nextObject])) +++ [tmppathes addObject: [directory stringByAppendingPathComponent: +++ [NSString stringWithFormat:@"WOxElemBuilders-%i.%i/", +++ SOPE_MAJOR_VERSION, SOPE_MINOR_VERSION]]]; +++ pathes = [tmppathes mutableCopy]; +++ for (i = 0; i < [pathes count]; i++) { +++ NSString *lPath; +++ BOOL isDir; +++ +++ lPath = [pathes objectAtIndex:i]; +++ if (![fm fileExistsAtPath:lPath isDirectory:&isDir]) +++ continue; +++ if (!isDir) +++ continue; +++ +++ [self debugWithFormat:@" directory %@", lPath]; +++ [self scanForBuilderBundlesInDirectory:lPath]; +++ } +++ [tmppathes release]; +++#endif ++ ++ /* look into FHS pathes */ ++ ++ relPath = [NSString stringWithFormat: ++-#if CONFIGURE_64BIT ++- @"lib/sope-%i.%i/wox-builders/", +++#ifdef CGS_LIBDIR_NAME +++ [CGS_LIBDIR_NAME stringByAppendingString:@"/sope-%i.%i/wox-builders/"], ++ #else ++- @"lib64/sope-%i.%i/wox-builders/", +++ @"lib/sope-%i.%i/wox-builders/", ++ #endif ++- SOPE_MAJOR_VERSION, SOPE_MINOR_VERSION]; +++ SOPE_MAJOR_VERSION, SOPE_MINOR_VERSION]; ++ pathes = [NSArray arrayWithObjects: ++ #ifdef FHS_INSTALL_ROOT ++ [FHS_INSTALL_ROOT stringByAppendingString:relPath], ++Index: sope-appserver/NGObjWeb/Templates/GNUmakefile.preamble ++=================================================================== ++--- sope-appserver/NGObjWeb/Templates/GNUmakefile.preamble (révision 1632) +++++ sope-appserver/NGObjWeb/Templates/GNUmakefile.preamble (copie de travail) ++@@ -6,6 +6,6 @@ ++ ADDITIONAL_CPPFLAGS += -DFHS_INSTALL_ROOT=\@\"$(FHS_INSTALL_ROOT)\" ++ endif ++ ++-ifeq ($(CONFIGURE_64BIT),yes) ++-ADDITIONAL_CPPFLAGS += -DCONFIGURE_64BIT=1 +++ifneq ($(CGS_LIBDIR_NAME),) +++ADDITIONAL_CPPFLAGS += -DCGS_LIBDIR_NAME=\@\"$(CGS_LIBDIR_NAME)\" ++ endif ++Index: sope-appserver/NGObjWeb/Associations/GNUmakefile ++=================================================================== ++--- sope-appserver/NGObjWeb/Associations/GNUmakefile (révision 1632) +++++ sope-appserver/NGObjWeb/Associations/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ SUBPROJECT_NAME = Associations ++Index: sope-appserver/NGObjWeb/WOHttpAdaptor/GNUmakefile ++=================================================================== ++--- sope-appserver/NGObjWeb/WOHttpAdaptor/GNUmakefile (révision 1632) +++++ sope-appserver/NGObjWeb/WOHttpAdaptor/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ SUBPROJECT_NAME = WOHttpAdaptor ++Index: sope-appserver/NGObjWeb/woapp-gs.make ++=================================================================== ++--- sope-appserver/NGObjWeb/woapp-gs.make (révision 1632) +++++ sope-appserver/NGObjWeb/woapp-gs.make (copie de travail) ++@@ -103,7 +103,7 @@ ++ # Determine the application directory extension ++ WOAPP_EXTENSION = woa ++ ++-GNUSTEP_WOAPPS = $(GNUSTEP_INSTALLATION_DIR)/WOApps +++GNUSTEP_WOAPPS = $(GNUSTEP_WEB_APPS) ++ ++ .PHONY: internal-woapp-all_ \ ++ internal-woapp-install_ \ ++@@ -372,8 +372,9 @@ ++ ++ internal-woapp-install_:: ++ @($(MKINSTALLDIRS) $(GNUSTEP_WOAPPS); \ ++- rm -rf $(GNUSTEP_WOAPPS)/$(WOAPP_DIR_NAME); \ ++- $(TAR) chf - --exclude=CVS --exclude=.svn --to-stdout $(WOAPP_DIR_NAME) | (cd $(GNUSTEP_WOAPPS); $(TAR) xf -)) +++ if [ -e $(GNUSTEP_WOAPPS)/$(WOAPP_DIR_NAME) ]; then rm -rf $(GNUSTEP_WOAPPS)/$(WOAPP_DIR_NAME); fi; \ +++# $(TAR) chf - --exclude=CVS --exclude=.svn --to-stdout $(WOAPP_DIR_NAME) | (cd $(GNUSTEP_WOAPPS); $(TAR) xf -)) +++ cp -LR $(WOAPP_DIR_NAME) $(GNUSTEP_WOAPPS) ++ ifneq ($(CHOWN_TO),) ++ $(CHOWN) -R $(CHOWN_TO) $(GNUSTEP_WOAPPS)/$(WOAPP_DIR_NAME) ++ endif ++Index: sope-appserver/NGObjWeb/WOCoreApplication.m ++=================================================================== ++--- sope-appserver/NGObjWeb/WOCoreApplication.m (révision 1632) +++++ sope-appserver/NGObjWeb/WOCoreApplication.m (copie de travail) ++@@ -730,9 +730,15 @@ ++ [self sopeMajorVersion], [self sopeMinorVersion]]; ++ } ++ + (NGResourceLocator *)ngobjwebResourceLocator { +++#if GNUSTEP_BASE_LIBRARY ++ return [NGResourceLocator resourceLocatorForGNUstepPath: +++ @"Libraries/Resources/NGObjWeb" +++ fhsPath:[self ngobjwebShareDirectorySubPath]]; +++#else +++ return [NGResourceLocator resourceLocatorForGNUstepPath: ++ @"Library/Libraries/Resources/NGObjWeb" ++ fhsPath:[self ngobjwebShareDirectorySubPath]]; +++#endif ++ } ++ ++ + (NSArray *)resourcesSearchPathes { ++Index: sope-appserver/NGObjWeb/NGHttp/GNUmakefile ++=================================================================== ++--- sope-appserver/NGObjWeb/NGHttp/GNUmakefile (révision 1632) +++++ sope-appserver/NGObjWeb/NGHttp/GNUmakefile (copie de travail) ++@@ -1,10 +1,8 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++-GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT) ++- ++ SUBPROJECT_NAME = NGHttp ++ ++ NGHttp_PCH_FILE = common.h ++@@ -37,5 +35,8 @@ ++ NGUrlFormCoder.m \ ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ include $(GNUSTEP_MAKEFILES)/subproject.make ++ -include GNUmakefile.postamble ++Index: sope-appserver/WEPrototype/GNUmakefile ++=================================================================== ++--- sope-appserver/WEPrototype/GNUmakefile (révision 1632) +++++ sope-appserver/WEPrototype/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++@@ -10,7 +10,7 @@ ++ ++ BUNDLE_NAME = WEPrototype ++ BUNDLE_EXTENSION = .wox ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/WOxElemBuilders-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_WOXBUILDERS)/ ++ else ++ FRAMEWORK_NAME = WEPrototype ++ endif ++@@ -46,6 +46,9 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++@@ -53,4 +56,3 @@ ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-appserver/WEPrototype/doc/GNUmakefile ++=================================================================== ++--- sope-appserver/WEPrototype/doc/GNUmakefile (révision 1632) +++++ sope-appserver/WEPrototype/doc/GNUmakefile (copie de travail) ++@@ -2,7 +2,7 @@ ++ ++ SOPE_ROOT=../../.. ++ ++--include $(SOPE_ROOT)/config.make +++include $(SOPE_ROOT)/config.make ++ include $(SOPE_ROOT)/Version ++ include ../Version ++ ++Index: sope-appserver/WEPrototype/GNUmakefile.preamble ++=================================================================== ++--- sope-appserver/WEPrototype/GNUmakefile.preamble (révision 1632) +++++ sope-appserver/WEPrototype/GNUmakefile.preamble (copie de travail) ++@@ -1,4 +1,4 @@ ++-# compiler flags +++# GNUstep makefile ++ ++ SOPE_ROOT=../.. ++ ++@@ -21,7 +21,8 @@ ++ -I$(SOPE_ROOT)/sope-xml ++ ++ ++-libWEPrototype_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libWEPrototype_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libWEPrototype_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libWEPrototype_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libWEPrototype_LIBRARIES_DEPEND_UPON += \ ++Index: sope-appserver/common.make ++=================================================================== ++--- sope-appserver/common.make (révision 1632) +++++ sope-appserver/common.make (copie de travail) ++@@ -4,8 +4,6 @@ ++ include ../Version ++ -include ./Version ++ ++-GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT) ++- ++ ADDITIONAL_CPPFLAGS += -pipe -Wall -Wno-protocol ++ ++ ADDITIONAL_INCLUDE_DIRS += \ ++Index: sope-appserver/samples/CoreDataBlog/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/CoreDataBlog/GNUmakefile (révision 1632) +++++ sope-appserver/samples/CoreDataBlog/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ WOAPP_NAME = CoreDataBlog ++Index: sope-appserver/samples/HelloForm/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/HelloForm/GNUmakefile (révision 1632) +++++ sope-appserver/samples/HelloForm/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ WOAPP_NAME = HelloForm ++Index: sope-appserver/samples/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/GNUmakefile (révision 1632) +++++ sope-appserver/samples/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ SUBPROJECTS += \ ++Index: sope-appserver/samples/iCalPortal/GNUmakefile.preamble ++=================================================================== ++--- sope-appserver/samples/iCalPortal/GNUmakefile.preamble (révision 1632) +++++ sope-appserver/samples/iCalPortal/GNUmakefile.preamble (copie de travail) ++@@ -7,7 +7,9 @@ ++ -lEOControl \ ++ -lXmlRpc -lDOM -lSaxObjC ++ else +++ifneq ($(findstring openbsd, $(GNUSTEP_TARGET_OS)), openbsd) ++ ADDITIONAL_TOOL_LIBS += -lcrypt ++ endif +++endif ++ ++ SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib ++Index: sope-appserver/samples/iCalPortal/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/iCalPortal/GNUmakefile (révision 1632) +++++ sope-appserver/samples/iCalPortal/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ WOAPP_NAME = iCalPortal ++Index: sope-appserver/samples/iCalPortal/Pages/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/iCalPortal/Pages/GNUmakefile (révision 1632) +++++ sope-appserver/samples/iCalPortal/Pages/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../../config.make +++include ../../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ SUBPROJECT_NAME = Pages ++Index: sope-appserver/samples/iCalPortal/WebDAV/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/iCalPortal/WebDAV/GNUmakefile (révision 1632) +++++ sope-appserver/samples/iCalPortal/WebDAV/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../../config.make +++include ../../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ SUBPROJECT_NAME = DAV ++Index: sope-appserver/samples/SoCookieAuth/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/SoCookieAuth/GNUmakefile (révision 1632) +++++ sope-appserver/samples/SoCookieAuth/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ WOAPP_NAME = SoCookieAuth ++Index: sope-appserver/samples/WOxExtTest/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/WOxExtTest/GNUmakefile (révision 1632) +++++ sope-appserver/samples/WOxExtTest/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ WOAPP_NAME = WOxExtTest ++Index: sope-appserver/samples/TestPages/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/TestPages/GNUmakefile (révision 1632) +++++ sope-appserver/samples/TestPages/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ WOAPP_NAME = TestPages ++Index: sope-appserver/samples/parsedav/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/parsedav/GNUmakefile (révision 1632) +++++ sope-appserver/samples/parsedav/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ TOOL_NAME = parsedav ++Index: sope-appserver/samples/xmlrpc/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/xmlrpc/GNUmakefile (révision 1632) +++++ sope-appserver/samples/xmlrpc/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ TOOL_NAME = \ ++Index: sope-appserver/samples/TestPrototype/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/TestPrototype/GNUmakefile (révision 1632) +++++ sope-appserver/samples/TestPrototype/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ WOAPP_NAME = TestPrototype ++Index: sope-appserver/samples/HelloWorld/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/HelloWorld/GNUmakefile (révision 1632) +++++ sope-appserver/samples/HelloWorld/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ WOAPP_NAME = HelloWorld ++Index: sope-appserver/samples/davpropget/GNUmakefile ++=================================================================== ++--- sope-appserver/samples/davpropget/GNUmakefile (révision 1632) +++++ sope-appserver/samples/davpropget/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../../config.make +++include ../../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ TOOL_NAME = davpropget ++Index: sope-appserver/WOExtensions/GNUmakefile.preamble ++=================================================================== ++--- sope-appserver/WOExtensions/GNUmakefile.preamble (révision 1632) +++++ sope-appserver/WOExtensions/GNUmakefile.preamble (copie de travail) ++@@ -12,7 +12,8 @@ ++ -I$(SOPE_ROOT)/sope-xml ++ ++ ++-libWOExtensions_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libWOExtensions_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libWOExtensions_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libWOExtensions_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ ++Index: sope-appserver/WOExtensions/GNUmakefile ++=================================================================== ++--- sope-appserver/WOExtensions/GNUmakefile (révision 1632) +++++ sope-appserver/WOExtensions/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ../Version ++ include ./Version ++@@ -9,7 +9,7 @@ ++ LIBRARY_NAME = libWOExtensions ++ BUNDLE_NAME = WOExtensions ++ BUNDLE_EXTENSION = .wox ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/WOxElemBuilders-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_WOXBUILDERS)/ ++ ++ else ++ FRAMEWORK_NAME = WOExtensions ++@@ -71,6 +71,9 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++@@ -78,4 +81,3 @@ ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-appserver/WOXML/GNUmakefile ++=================================================================== ++--- sope-appserver/WOXML/GNUmakefile (révision 1632) +++++ sope-appserver/WOXML/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include ../common.make ++ include ../Version ++ include ./Version ++@@ -15,6 +15,7 @@ ++ libWOXML_PCH_FILE = common.h ++ libWOXML_HEADER_FILES_DIR = . ++ libWOXML_HEADER_FILES_INSTALL_DIR = /WOXML +++libWOXML_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ ++ ++ libWOXML_HEADER_FILES += \ ++@@ -42,10 +43,12 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-appserver/WOXML/GNUmakefile.preamble ++=================================================================== ++--- sope-appserver/WOXML/GNUmakefile.preamble (révision 1632) +++++ sope-appserver/WOXML/GNUmakefile.preamble (copie de travail) ++@@ -2,7 +2,7 @@ ++ ++ SOPE_ROOT=../.. ++ ++-libWOXML_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libWOXML_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) ++ libWOXML_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libWOXML_INCLUDE_DIRS += -I. -I.. ++Index: sope-ical/samples/GNUmakefile ++=================================================================== ++--- sope-ical/samples/GNUmakefile (révision 1632) +++++ sope-ical/samples/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ TOOL_NAME = icalparsetest icalds vcf2xml vcfparsetest ievalrrule ++@@ -14,4 +14,3 @@ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/tool.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-ical/versitSaxDriver/GNUmakefile ++=================================================================== ++--- sope-ical/versitSaxDriver/GNUmakefile (révision 1632) +++++ sope-ical/versitSaxDriver/GNUmakefile (copie de travail) ++@@ -1,13 +1,13 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ -include ../../Version ++ -include ./Version ++ ++ BUNDLE_NAME = versitSaxDriver ++ BUNDLE_EXTENSION = .sax ++-BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/SaxDrivers-$(MAJOR_VERSION).$(MINOR_VERSION)/ +++BUNDLE_INSTALL_DIR = $(SOPE_SAXDRIVERS)/ ++ ++ versitSaxDriver_PRINCIPAL_CLASS = VSSaxDriver ++ ++@@ -24,4 +24,3 @@ ++ -include GNUmakefile.preamble ++ include $(GNUSTEP_MAKEFILES)/bundle.make ++ -include GNUmakefile.postamble ++--include fhs.make ++Index: sope-ical/GNUmakefile ++=================================================================== ++--- sope-ical/GNUmakefile (révision 1632) +++++ sope-ical/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../config.make +++include ../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ ++ PACKAGE_NAME=sope-ical ++Index: sope-ical/NGiCal/GNUmakefile.postamble ++=================================================================== ++--- sope-ical/NGiCal/GNUmakefile.postamble (révision 1632) +++++ sope-ical/NGiCal/GNUmakefile.postamble (copie de travail) ++@@ -1,10 +1,6 @@ ++ # compilation settings ++ ++-ifeq ($(FHS_INSTALL_ROOT),) ++-MAPDIR="$(GNUSTEP_INSTALLATION_DIR)/Library/SaxMappings/" ++-else ++-MAPDIR="$(FHS_INSTALL_ROOT)/share/sope-$(MAJOR_VERSION).$(MINOR_VERSION)/saxmappings/" ++-endif +++MAPDIR="$(SOPE_SAXMAPPINGS)/" ++ ++ mappings-dir :: ++ $(MKDIRS) $(MAPDIR) ++Index: sope-ical/NGiCal/GNUmakefile ++=================================================================== ++--- sope-ical/NGiCal/GNUmakefile (révision 1632) +++++ sope-ical/NGiCal/GNUmakefile (copie de travail) ++@@ -1,6 +1,6 @@ ++ # GNUstep makefile ++ ++--include ../../config.make +++include ../../config.make ++ include $(GNUSTEP_MAKEFILES)/common.make ++ include ./Version ++ ++@@ -14,7 +14,8 @@ ++ libNGiCal_PCH_FILE = common.h ++ libNGiCal_HEADER_FILES_DIR = . ++ libNGiCal_HEADER_FILES_INSTALL_DIR = /NGiCal ++-libNGiCal_SOVERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGiCal_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) +++libNGiCal_INSTALL_DIR=$(SOPE_SYSLIBDIR) ++ libNGiCal_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) ++ ++ libNGiCal_HEADER_FILES = \ ++@@ -107,10 +108,12 @@ ++ # building ++ ++ -include GNUmakefile.preamble +++ifneq ($(FHS_INSTALL_ROOT),) +++GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include +++endif ++ ifneq ($(frameworks),yes) ++ include $(GNUSTEP_MAKEFILES)/library.make ++ else ++ include $(GNUSTEP_MAKEFILES)/framework.make ++ endif ++ -include GNUmakefile.postamble ++--include fhs.make +--- sope-4.9.r1660.orig/debian/patches/sope-patchset-r1660.diff ++++ sope-4.9.r1660/debian/patches/sope-patchset-r1660.diff +@@ -0,0 +1,4511 @@ ++Index: sope-mime/NGImap4/NGImap4Functions.m ++=================================================================== ++--- sope-mime/NGImap4/NGImap4Functions.m (revision 1660) +++++ sope-mime/NGImap4/NGImap4Functions.m (working copy) ++@@ -367,3 +367,16 @@ ++ } ++ ++ @end /* NGImap4FolderHandler */ +++ +++NSString * +++SaneFolderName(NSString *folderName) +++{ +++ NSString *saneFName; +++ +++ saneFName = [[folderName stringByReplacingString: @"\\" +++ withString: @"\\\\"] +++ stringByReplacingString: @"\"" +++ withString: @"\\\""]; +++ +++ return saneFName; +++} ++Index: sope-mime/NGImap4/NGImap4Client.h ++=================================================================== ++--- sope-mime/NGImap4/NGImap4Client.h (revision 1660) +++++ sope-mime/NGImap4/NGImap4Client.h (working copy) ++@@ -62,6 +62,8 @@ ++ NGImap4ResponseNormalizer *normer; ++ NSMutableArray *responseReceiver; ++ +++ BOOL loggedIn; +++ ++ BOOL isLogin; ++ unsigned tagId; ++ ++@@ -120,6 +122,7 @@ ++ - (NSDictionary *)list:(NSString *)_folder pattern:(NSString *)_pattern; ++ - (NSDictionary *)lsub:(NSString *)_folder pattern:(NSString *)_pattern; ++ - (NSDictionary *)select:(NSString *)_folder; +++- (NSDictionary *)unselect; ++ - (NSDictionary *)status:(NSString *)_folder flags:(NSArray *)_flags; ++ - (NSDictionary *)rename:(NSString *)_folder to:(NSString *)_newName; ++ - (NSDictionary *)delete:(NSString *)_folder; ++@@ -138,7 +141,7 @@ ++ flags:(NSArray *)_flags; ++ - (NSDictionary *)storeFrom:(unsigned)_from to:(unsigned)_to ++ add:(NSNumber *)_add flags:(NSArray *)_flags; ++-- (NSDictionary *)storeFlags:(NSArray *)_flags forMSNs:(id)_msns +++- (NSDictionary *)storeFlags:(NSArray *)_flags forUIDs:(id)_uids ++ addOrRemove:(BOOL)_flag; ++ ++ - (NSDictionary *)copyUid:(unsigned)_uid toFolder:(NSString *)_folder; ++Index: sope-mime/NGImap4/NGImap4Client.m ++=================================================================== ++--- sope-mime/NGImap4/NGImap4Client.m (revision 1660) +++++ sope-mime/NGImap4/NGImap4Client.m (working copy) ++@@ -24,6 +24,8 @@ ++ #include "NGImap4Client.h" ++ #include "NGImap4Context.h" ++ #include "NGImap4Support.h" +++#include "NGImap4Envelope.h" +++#include "NGImap4EnvelopeAddress.h" ++ #include "NGImap4Functions.h" ++ #include "NGImap4ResponseParser.h" ++ #include "NGImap4ResponseNormalizer.h" ++@@ -53,17 +55,17 @@ ++ ++ @end /* NGImap4Client(ConnectionRegistration); */ ++ ++-#if GNUSTEP_BASE_LIBRARY ++-/* FIXME: TODO: move someplace better (hh: NGExtensions...) */ ++-@implementation NSException(setUserInfo) +++// #if GNUSTEP_BASE_LIBRARY +++// /* FIXME: TODO: move someplace better (hh: NGExtensions...) */ +++// @implementation NSException(setUserInfo) ++ ++-- (id)setUserInfo:(NSDictionary *)_userInfo { ++- ASSIGN(self->_e_info, _userInfo); ++- return self; ++-} +++// - (id)setUserInfo:(NSDictionary *)_userInfo { +++// ASSIGN(self->_e_info, _userInfo); +++// return self; +++// } ++ ++-@end /* NSException(setUserInfo) */ ++-#endif +++// @end /* NSException(setUserInfo) */ +++// #endif ++ ++ @interface NGImap4Client(Private) ++ ++@@ -84,6 +86,8 @@ ++ ++ - (NSDictionary *)login; ++ +++- (NSDictionary *) _sopeSORT: (id)_sortSpec qualifier:(EOQualifier *)_qual encoding:(NSString *)_encoding; +++ ++ @end ++ ++ /* ++@@ -195,11 +199,14 @@ ++ self->debug = ImapDebugEnabled; ++ self->responseReceiver = [[NSMutableArray alloc] initWithCapacity:128]; ++ self->normer = [[NGImap4ResponseNormalizer alloc] initWithClient:self]; +++ self->loggedIn = NO; +++ self->context = nil; ++ } ++ return self; ++ } ++ ++ - (void)dealloc { +++ if (self->loggedIn) [self logout]; ++ [self removeFromConnectionRegister]; ++ [self->normer release]; ++ [self->text release]; ++@@ -457,8 +464,8 @@ ++ - (void)reconnect { ++ if ([self->context lastException] != nil) ++ return; ++- ++- [self closeConnection]; +++ +++ [self closeConnection]; ++ self->tagId = 0; ++ [self openConnection]; ++ ++@@ -481,6 +488,7 @@ ++ */ ++ NGHashMap *map; ++ NSString *s, *log; +++ NSDictionary *response; ++ ++ if (self->isLogin ) ++ return nil; ++@@ -499,7 +507,11 @@ ++ ++ self->isLogin = NO; ++ ++- return [self->normer normalizeResponse:map]; +++ response = [self->normer normalizeResponse:map]; +++ +++ self->loggedIn = [[response valueForKey:@"result"] boolValue]; +++ +++ return response; ++ } ++ ++ - (NSDictionary *)logout { ++@@ -508,6 +520,8 @@ ++ ++ map = [self processCommand:@"logout"]; ++ [self closeConnection]; +++ [self->selectedFolder release]; self->selectedFolder = nil; +++ self->loggedIn = NO; ++ ++ return [self->normer normalizeResponse:map]; ++ } ++@@ -547,7 +561,7 @@ ++ if (!(_pattern = [self _folder2ImapFolder:_pattern])) ++ return nil; ++ ++- s = [NSString stringWithFormat:@"list \"%@\" \"%@\"", _folder, _pattern]; +++ s = [NSString stringWithFormat:@"list \"%@\" \"%@\"", SaneFolderName(_folder), _pattern]; ++ map = [self processCommand:s]; ++ ++ if (self->delimiter == nil) { ++@@ -591,7 +605,7 @@ ++ return nil; ++ } ++ ++- s = [NSString stringWithFormat:@"lsub \"%@\" \"%@\"", _folder, _pattern]; +++ s = [NSString stringWithFormat:@"lsub \"%@\" \"%@\"", SaneFolderName(_folder), _pattern]; ++ map = [self processCommand:s]; ++ ++ if (self->delimiter == nil) { ++@@ -617,24 +631,25 @@ ++ 'flags' - array of strings (eg (answered,flagged,draft,seen); ++ 'RawResponse' - the raw IMAP4 response ++ */ ++- NSString *s; ++- id tmp; ++- ++- tmp = self->selectedFolder; // remember ptr to old folder name ++- +++ NSString *s, *newFolder; +++ ++ if (![_folder isNotEmpty]) ++ return nil; ++ if ((_folder = [self _folder2ImapFolder:_folder]) == nil) ++ return nil; ++ ++- self->selectedFolder = [_folder copy]; ++- ++- [tmp release]; tmp = nil; // release old folder name +++ newFolder = [NSString stringWithString: _folder]; +++ ASSIGN (self->selectedFolder, newFolder); ++ ++- s = [NSString stringWithFormat:@"select \"%@\"", self->selectedFolder]; +++ s = [NSString stringWithFormat:@"select \"%@\"", SaneFolderName(self->selectedFolder)]; ++ return [self->normer normalizeSelectResponse:[self processCommand:s]]; ++ } ++ +++- (NSDictionary *)unselect { +++ [self->selectedFolder release]; self->selectedFolder = nil; +++ return [self->normer normalizeResponse:[self processCommand:@"unselect"]]; +++} +++ ++ - (NSDictionary *)status:(NSString *)_folder flags:(NSArray *)_flags { ++ NSString *cmd; ++ ++@@ -646,7 +661,7 @@ ++ return nil; ++ ++ cmd = [NSString stringWithFormat:@"status \"%@\" (%@)", ++- _folder, [_flags componentsJoinedByString:@" "]]; +++ SaneFolderName(_folder), [_flags componentsJoinedByString:@" "]]; ++ return [self->normer normalizeStatusResponse:[self processCommand:cmd]]; ++ } ++ ++@@ -663,20 +678,21 @@ ++ if ((_newName = [self _folder2ImapFolder:_newName]) == nil) ++ return nil; ++ ++- cmd = [NSString stringWithFormat:@"rename \"%@\" \"%@\"", _folder, _newName]; +++ cmd = [NSString stringWithFormat:@"rename \"%@\" \"%@\"", +++ SaneFolderName(_folder), SaneFolderName(_newName)]; ++ ++ return [self->normer normalizeResponse:[self processCommand:cmd]]; ++ } ++ ++ - (NSDictionary *)_performCommand:(NSString *)_op onFolder:(NSString *)_fname { ++ NSString *command; ++- +++ ++ if ((_fname = [self _folder2ImapFolder:_fname]) == nil) ++ return nil; ++- +++ ++ // eg: 'delete "blah"' ++- command = [NSString stringWithFormat:@"%@ \"%@\"", _op, _fname]; ++- +++ command = [NSString stringWithFormat:@"%@ \"%@\"", _op, SaneFolderName(_fname)]; +++ ++ return [self->normer normalizeResponse:[self processCommand:command]]; ++ } ++ ++@@ -820,23 +836,23 @@ ++ return [self->normer normalizeResponse:[self processCommand:cmd]]; ++ } ++ ++-- (NSDictionary *)storeFlags:(NSArray *)_flags forMSNs:(id)_msns +++- (NSDictionary *)storeFlags:(NSArray *)_flags forUIDs:(id)_uids ++ addOrRemove:(BOOL)_flag ++ { ++ NSString *cmd; ++ NSString *flagstr; ++ NSString *seqstr; ++ ++- if ([_msns isKindOfClass:[NSArray class]]) { +++ if ([_uids isKindOfClass:[NSArray class]]) { ++ // TODO: improve by using ranges, eg 1:5 instead of 1,2,3,4,5 ++- _msns = [_msns valueForKey:@"stringValue"]; ++- seqstr = [_msns componentsJoinedByString:@","]; +++ _uids = [_uids valueForKey:@"stringValue"]; +++ seqstr = [_uids componentsJoinedByString:@","]; ++ } ++ else ++- seqstr = [_msns stringValue]; +++ seqstr = [_uids stringValue]; ++ ++ flagstr = [_flags2ImapFlags(self, _flags) componentsJoinedByString:@" "]; ++- cmd = [NSString stringWithFormat:@"store %@ %cFLAGS (%@)", +++ cmd = [NSString stringWithFormat:@"UID STORE %@ %cFLAGS (%@)", ++ seqstr, _flag ? '+' : '-', flagstr]; ++ ++ return [self->normer normalizeResponse:[self processCommand:cmd]]; ++@@ -967,11 +983,12 @@ ++ descr = @"Could not process qualifier for imap search "; ++ descr = [descr stringByAppendingString:reason]; ++ ++- exception = [[NGImap4SearchException alloc] initWithFormat:@"%@", descr]; ++ ui = [NSDictionary dictionaryWithObject:_q forKey:@"qualifier"]; ++- [exception setUserInfo:ui]; +++ exception +++ = [NGImap4SearchException exceptionWithName: @"NGImap4SearchException" +++ reason: descr +++ userInfo: ui]; ++ [self->context setLastException:exception]; ++- [exception release]; ++ } ++ ++ - (NSString *)_searchExprForQual:(EOQualifier *)_qualifier { ++@@ -1093,7 +1110,18 @@ ++ Eg: UID SORT ( DATE REVERSE SUBJECT ) UTF-8 TODO ++ */ ++ NSString *tmp; +++ NSArray *capa; ++ +++ // We first check to see if our server supports IMAP SORT. If not +++ // we'll sort ourself the results. +++ capa = [[self capability] objectForKey: @"capability"]; +++ +++ if ([capa indexOfObject: @"sort"] == NSNotFound) +++ { +++ return [self _sopeSORT: _sortSpec qualifier: _qual encoding: _encoding]; +++ } +++ +++ ++ if ([_sortSpec isKindOfClass:[NSArray class]]) ++ tmp = [self _generateIMAP4SortOrderings:_sortSpec]; ++ else if ([_sortSpec isKindOfClass:[EOSortOrdering class]]) ++@@ -1107,9 +1135,10 @@ ++ tmp = @"DATE"; ++ } ++ +++ ++ return [self primarySort:tmp ++- qualifierString:[self _searchExprForQual:_qual] ++- encoding:_encoding]; +++ qualifierString:[self _searchExprForQual:_qual] +++ encoding:_encoding]; ++ } ++ - (NSDictionary *)sort:(NSArray *)_sortOrderings ++ qualifier:(EOQualifier *)_qual ++@@ -1130,7 +1159,7 @@ ++ return nil; ++ } ++ ++- s = [@"search" stringByAppendingString:s]; +++ s = [@"UID SEARCH" stringByAppendingString:s]; ++ return [self->normer normalizeSearchResponse:[self processCommand:s]]; ++ } ++ ++@@ -1142,7 +1171,7 @@ ++ if ((_folder = [self _folder2ImapFolder:_folder]) == nil) ++ return nil; ++ ++- cmd = [NSString stringWithFormat:@"getacl \"%@\"", _folder]; +++ cmd = [NSString stringWithFormat:@"getacl \"%@\"", SaneFolderName(_folder)]; ++ return [self->normer normalizeGetACLResponse:[self processCommand:cmd]]; ++ } ++ ++@@ -1155,7 +1184,7 @@ ++ return nil; ++ ++ cmd = [NSString stringWithFormat:@"setacl \"%@\" \"%@\" \"%@\"", ++- _folder, _uid, _r]; +++ SaneFolderName(_folder), _uid, _r]; ++ return [self->normer normalizeResponse:[self processCommand:cmd]]; ++ } ++ ++@@ -1166,7 +1195,7 @@ ++ return nil; ++ ++ cmd = [NSString stringWithFormat:@"deleteacl \"%@\" \"%@\"", ++- _folder, _uid]; +++ SaneFolderName(_folder), _uid]; ++ return [self->normer normalizeResponse:[self processCommand:cmd]]; ++ } ++ ++@@ -1177,7 +1206,7 @@ ++ return nil; ++ ++ cmd = [NSString stringWithFormat:@"listrights \"%@\" \"%@\"", ++- _folder, _uid]; +++ SaneFolderName(_folder), _uid]; ++ return [self->normer normalizeListRightsResponse:[self processCommand:cmd]]; ++ } ++ ++@@ -1187,12 +1216,88 @@ ++ if ((_folder = [self _folder2ImapFolder:_folder]) == nil) ++ return nil; ++ ++- cmd = [NSString stringWithFormat:@"myrights \"%@\"", _folder]; +++ cmd = [NSString stringWithFormat:@"myrights \"%@\"", SaneFolderName(_folder)]; ++ return [self->normer normalizeMyRightsResponse:[self processCommand:cmd]]; ++ } ++ ++ /* Private Methods */ ++ +++- (NSDictionary *) _sopeSORT: (id)_sortSpec qualifier:(EOQualifier *)_qual encoding:(NSString *)_encoding { +++ NSMutableDictionary *result; +++ NSDictionary *d; +++ NSCalendarDate *envDate; +++ +++ result = [[[NSMutableDictionary alloc] init] autorelease]; +++ [result setObject: [NSNumber numberWithBool: NO] forKey: @"result"]; +++ +++ // _sortSpec: [REVERSE] {DATE,FROM,SUBJECT} +++ d = [self searchWithQualifier: _qual]; +++ +++ if ((d = [d objectForKey: @"RawResponse"])) +++ { +++ NSMutableDictionary *dict; +++ NSArray *a, *s_a; +++ BOOL b; +++ int i; +++ +++ a = [d objectForKey: @"search"]; +++ d = [self fetchUids: a parts: [NSArray arrayWithObject: @"ENVELOPE"]]; +++ a = [d objectForKey: @"fetch"]; +++ +++ +++ dict = [[[NSMutableDictionary alloc] init] autorelease]; +++ b = YES; +++ +++ for (i = 0; i < [a count]; i++) +++ { +++ NGImap4Envelope *env; +++ id o, uid, s; +++ +++ o = [a objectAtIndex: i]; +++ env = [o objectForKey: @"envelope"]; +++ uid = [o objectForKey: @"uid"]; +++ +++ if ([_sortSpec rangeOfString: @"SUBJECT"].length) +++ { +++ s = [env subject]; +++ if ([s isKindOfClass: [NSData class]]) +++ s = [[[NSString alloc] initWithData: s encoding: NSUTF8StringEncoding] autorelease]; +++ +++ [dict setObject: (s != nil ? s : (id)@"") forKey: uid]; +++ } +++ else if ([_sortSpec rangeOfString: @"FROM"].length) +++ { +++ s = [[[env from] lastObject] email]; +++ [dict setObject: (s != nil ? s : (id)@"") forKey: uid]; +++ } +++ else +++ { +++ envDate = [env date]; +++ if (!envDate) +++ envDate = [NSCalendarDate date]; +++ [dict setObject: envDate forKey: uid]; +++ b = NO; +++ } +++ } +++ +++ if (b) +++ s_a = [dict keysSortedByValueUsingSelector: @selector(caseInsensitiveCompare:)]; +++ else +++ s_a = [dict keysSortedByValueUsingSelector: @selector(compare:)]; +++ +++ if ([_sortSpec rangeOfString: @"REVERSE"].length) +++ { +++ s_a = [[s_a reverseObjectEnumerator] allObjects]; +++ } +++ +++ [result setObject: [NSNumber numberWithBool: YES] forKey: @"result"]; +++ [result setObject: s_a forKey: @"sort"]; +++ } +++ +++ return result; +++} +++ +++ ++ - (NSException *)_processCommandParserException:(NSException *)_exception { ++ [self logWithFormat:@"ERROR(%s): catched IMAP4 parser exception %@: %@", ++ __PRETTY_FUNCTION__, [_exception name], [_exception reason]]; ++@@ -1412,21 +1517,24 @@ ++ return nil; ++ } ++ ++- array = [_folder pathComponents]; +++// array = [_folder pathComponents]; +++ array = [_folder componentsSeparatedByString:@"/"]; ++ ++- if ([array isNotEmpty]) { +++ if ([array count]) { ++ NSString *o; ++ ++ o = [array objectAtIndex:0]; ++- if (([o isEqualToString:@"/"]) || ([o length] == 0)) +++ if ([o length] == 0) ++ array = [array subarrayWithRange:NSMakeRange(1, [array count] - 1)]; ++- ++- o = [array lastObject]; ++- if (([o length] == 0) || ([o isEqualToString:@"/"])) ++- array = [array subarrayWithRange:NSMakeRange(0, [array count] - 1)]; +++ +++ if ([array count]) { +++ o = [array lastObject]; +++ if ([o length] == 0) +++ array = [array subarrayWithRange:NSMakeRange(0, [array count] - 1)]; +++ } ++ } ++ return [[array componentsJoinedByString:self->delimiter] ++- stringByEncodingImap4FolderName]; +++ stringByEncodingImap4FolderName]; ++ } ++ ++ - (NSString *)_imapFolder2Folder:(NSString *)_folder { ++@@ -1442,10 +1550,16 @@ ++ return nil; ++ } ++ +++ if ([_folder hasPrefix: self->delimiter]) +++ _folder = [_folder substringFromIndex: 1]; +++ if ([_folder hasSuffix: self->delimiter]) +++ _folder = [_folder substringToIndex: [_folder length] - 2]; +++ ++ array = [array arrayByAddingObjectsFromArray: ++ [_folder componentsSeparatedByString:[self delimiter]]]; ++- ++- return [[NSString pathWithComponents:array] stringByDecodingImap4FolderName]; +++ +++ return [[array componentsJoinedByString: @"/"] +++ stringByDecodingImap4FolderName]; ++ } ++ ++ - (void)setContext:(NGImap4Context *)_ctx { ++Index: sope-mime/NGImap4/NGSieveClient.m ++=================================================================== ++--- sope-mime/NGImap4/NGSieveClient.m (revision 1660) +++++ sope-mime/NGImap4/NGSieveClient.m (working copy) ++@@ -294,8 +294,8 @@ ++ return con; ++ } ++ ++- logLen = [self->login cStringLength]; ++- bufLen = (logLen * 2) + [self->password cStringLength] +2; +++ logLen = [self->login lengthOfBytesUsingEncoding: NSUTF8StringEncoding]; +++ bufLen = (logLen * 2) + [self->password lengthOfBytesUsingEncoding: NSUTF8StringEncoding] +2; ++ ++ buf = calloc(bufLen + 2, sizeof(char)); ++ ++@@ -306,8 +306,9 @@ ++ password ++ */ ++ sprintf(buf, "%s %s %s", ++- [self->login cString], [self->login cString], ++- [self->password cString]); +++ [self->login cStringUsingEncoding:NSUTF8StringEncoding], +++ [self->login cStringUsingEncoding:NSUTF8StringEncoding], +++ [self->password cStringUsingEncoding:NSUTF8StringEncoding]); ++ ++ buf[logLen] = '\0'; ++ buf[logLen * 2 + 1] = '\0'; ++@@ -656,7 +657,7 @@ ++ fputc('\n', stderr); ++ } ++ else ++- fprintf(stderr, "C: %s\n", [_txt cString]); +++ fprintf(stderr, "C: %s\n", [_txt cStringUsingEncoding:NSUTF8StringEncoding]); ++ } ++ ++ /* write */ ++Index: sope-mime/NGImap4/NGImap4Connection.h ++=================================================================== ++--- sope-mime/NGImap4/NGImap4Connection.h (revision 1660) +++++ sope-mime/NGImap4/NGImap4Connection.h (working copy) ++@@ -89,6 +89,9 @@ ++ ++ - (NSArray *)subfoldersForURL:(NSURL *)_url; ++ - (NSArray *)allFoldersForURL:(NSURL *)_url; +++- (NSArray *)allFoldersForURL:(NSURL *)_url +++ onlySubscribedFolders: (BOOL) subscribedFoldersOnly; +++- (BOOL)selectFolder:(id)_url; ++ ++ /* message operations */ ++ ++Index: sope-mime/NGImap4/NGImap4Connection.m ++=================================================================== ++--- sope-mime/NGImap4/NGImap4Connection.m (revision 1660) +++++ sope-mime/NGImap4/NGImap4Connection.m (working copy) ++@@ -22,6 +22,7 @@ ++ #include "NGImap4Connection.h" ++ #include "NGImap4MailboxInfo.h" ++ #include "NGImap4Client.h" +++#include "NGImap4Functions.h" ++ #include "imCommon.h" ++ ++ @implementation NGImap4Connection ++@@ -66,7 +67,7 @@ ++ self->creationTime = [[NSDate alloc] init]; ++ ++ // TODO: retrieve from IMAP4 instead of using a default ++- self->separator = imap4Separator; +++ self->separator = [imap4Separator copy]; ++ } ++ return self; ++ } ++@@ -321,13 +322,15 @@ ++ return nil; ++ if ([folderName characterAtIndex:0] == '/') ++ folderName = [folderName substringFromIndex:1]; +++ if ([folderName hasSuffix: @"/"]) +++ folderName = [folderName substringToIndex:[folderName length] - 1]; ++ ++ if (_delfn) folderName = [folderName stringByDeletingLastPathComponent]; ++ ++ if ([[self imap4Separator] isEqualToString:@"/"]) ++ return folderName; ++ ++- names = [folderName pathComponents]; +++ names = [folderName componentsSeparatedByString: @"/"]; ++ return [names componentsJoinedByString:[self imap4Separator]]; ++ } ++ - (NSString *)imap4FolderNameForURL:(NSURL *)_url { ++@@ -373,7 +376,9 @@ ++ ++ /* folder operations */ ++ ++-- (NSDictionary *)primaryFetchMailboxHierarchyForURL:(NSURL *)_url { +++- (NSDictionary *)primaryFetchMailboxHierarchyForURL:(NSURL *)_url +++ onlySubscribedFolders: (BOOL) subscribedFoldersOnly +++{ ++ NSDictionary *result; ++ ++ if ((result = [self cachedHierarchyResults]) != nil) ++@@ -381,8 +386,12 @@ ++ ++ if (debugCache) [self logWithFormat:@" no folders cached yet .."]; ++ ++- result = [[self client] list:(onlyFetchInbox ? @"INBOX" : @"*") ++- pattern:@"*"]; +++ if (subscribedFoldersOnly) +++ result = [[self client] lsub:(onlyFetchInbox ? @"INBOX" : @"") +++ pattern:@"*"]; +++ else +++ result = [[self client] list:(onlyFetchInbox ? @"INBOX" : @"") +++ pattern:@"*"]; ++ if (![[result valueForKey:@"result"] boolValue]) { ++ [self errorWithFormat:@"Could not list mailbox hierarchy!"]; ++ return nil; ++@@ -400,6 +409,11 @@ ++ return result; ++ } ++ +++- (NSDictionary *)primaryFetchMailboxHierarchyForURL:(NSURL *)_url +++{ +++ return [self primaryFetchMailboxHierarchyForURL: _url onlySubscribedFolders: NO]; +++} +++ ++ - (NSArray *)subfoldersForURL:(NSURL *)_url { ++ NSDictionary *result; ++ ++@@ -413,10 +427,13 @@ ++ return [self extractSubfoldersForURL:_url fromResultSet:result]; ++ } ++ ++-- (NSArray *)allFoldersForURL:(NSURL *)_url { +++- (NSArray *)allFoldersForURL:(NSURL *)_url +++ onlySubscribedFolders: (BOOL) subscribedFoldersOnly +++{ ++ NSDictionary *result; ++ ++- if ((result = [self primaryFetchMailboxHierarchyForURL:_url]) == nil) +++ if ((result = [self primaryFetchMailboxHierarchyForURL:_url +++ onlySubscribedFolders: subscribedFoldersOnly]) == nil) ++ return nil; ++ if ([result isKindOfClass:[NSException class]]) { ++ [self errorWithFormat:@"failed to retrieve hierarchy: %@", result]; ++@@ -426,6 +443,11 @@ ++ return [self extractFoldersFromResultSet:result]; ++ } ++ +++- (NSArray *)allFoldersForURL:(NSURL *)_url +++{ +++ return [self allFoldersForURL: _url onlySubscribedFolders: NO]; +++} +++ ++ /* message operations */ ++ ++ - (NSArray *)fetchUIDsInURL:(NSURL *)_url qualifier:(id)_qualifier ++@@ -646,7 +668,7 @@ ++ ++ /* store flags */ ++ ++- result = [[self client] storeFlags:_f forMSNs:result addOrRemove:YES]; +++ result = [[self client] storeFlags:_f forUIDs:result addOrRemove:YES]; ++ if (![[result valueForKey:@"result"] boolValue]) { ++ return [self errorForResult:result ++ text:@"Failed to change flags of IMAP4 message"]; ++@@ -760,11 +782,11 @@ ++ // TODO: we should probably just fetch the whole hierarchy? ++ ++ folderName = [self imap4FolderNameForURL:_url]; ++- result = [[self client] select:folderName]; ++- if (![[result valueForKey:@"result"] boolValue]) ++- return NO; ++- ++- return YES; +++ +++ result = [self->client status: folderName +++ flags: [NSArray arrayWithObject: @"UIDVALIDITY"]]; +++ +++ return ([[result valueForKey: @"result"] boolValue]); ++ } ++ ++ - (id)infoForMailboxAtURL:(NSURL *)_url { ++@@ -789,7 +811,8 @@ ++ /* construct path */ ++ ++ newPath = [self imap4FolderNameForURL:_url]; ++- newPath = [newPath stringByAppendingString:[self imap4Separator]]; +++ if ([newPath length]) +++ newPath = [newPath stringByAppendingString:[self imap4Separator]]; ++ newPath = [newPath stringByAppendingString:_mailbox]; ++ ++ /* create */ ++Index: sope-mime/NGImap4/NGImap4ResponseNormalizer.m ++=================================================================== ++--- sope-mime/NGImap4/NGImap4ResponseNormalizer.m (revision 1660) +++++ sope-mime/NGImap4/NGImap4ResponseNormalizer.m (working copy) ++@@ -76,22 +76,6 @@ ++ return self; ++ } ++ ++-/* client callbacks */ ++- ++-- (void)closeConnection { ++- [(id)self->client closeConnection]; ++-} ++- ++-- (NSString *)delimiter { ++- return [self->client delimiter]; ++-} ++- ++-/* folder handling */ ++- ++-- (NSString *)_imapFolder2Folder:(NSString *)_folder { ++- return [self->client _imapFolder2Folder:_folder]; ++-} ++- ++ /* primary */ ++ ++ - (NSMutableDictionary *)normalizeResponse:(NGHashMap *)_map { ++@@ -117,7 +101,7 @@ ++ if ((obj = [_map objectForKey:@"bye"])) { ++ [result setObject:NoNumber forKey:@"result"]; ++ [result setObject:obj forKey:@"reason"]; ++- [self closeConnection]; +++ [self->client closeConnection]; ++ return result; ++ } ++ ++@@ -292,7 +276,7 @@ ++ /* ++ filter for fetch response ++ fetch : NSArray (fetch responses) ++- 'header' - RFC822.HEADER +++ 'header' - RFC822.HEADER and BODY[HEADER.FIELDS (...)] ++ 'text' - RFC822.TEXT ++ 'size' - SIZE ++ 'flags' - FLAGS ++@@ -336,7 +320,12 @@ ++ switch (c) { ++ case 'b': ++ /* Note: we check for _prefix_! eg body[1] is valid too */ ++- if (klen > 3 && [key hasPrefix:@"body"]) { +++ if (klen > 17 && [key hasPrefix:@"body[header.fields"]) { +++ keys[count] = @"header"; +++ values[count] = objForKey(obj, @selector(objectForKey:), key); +++ count++; +++ } +++ else if (klen > 3 && [key hasPrefix:@"body"]) { ++ keys[count] = @"body"; ++ values[count] = objForKey(obj, @selector(objectForKey:), key); ++ count++; ++@@ -516,7 +505,7 @@ ++ } ++ continue; ++ } ++- [tmp setObject:qDesc forKey:[self _imapFolder2Folder:obj]]; +++ [tmp setObject:qDesc forKey:[self->client _imapFolder2Folder:obj]]; ++ } ++ [result setObject:tmp forKey:@"quotas"]; ++ return [[result copy] autorelease]; ++@@ -615,7 +604,7 @@ ++ ++ while ((o = [enumerator nextObject])) { ++ [folder setObject:_imapFlags2Flags(self, [o objectForKey:@"flags"]) ++- forKey:[self _imapFolder2Folder:[o objectForKey:@"folderName"]]]; +++ forKey:[self->client _imapFolder2Folder:[o objectForKey:@"folderName"]]]; ++ } ++ ++ { ++@@ -648,14 +637,13 @@ ++ enumerator = [_flags objectEnumerator]; ++ cnt = 0; ++ while ((obj = [enumerator nextObject])) { ++- if (![obj isNotEmpty]) ++- continue; ++- ++- if (![[obj substringToIndex:1] isEqualToString:@"\\"]) ++- continue; ++- ++- objs[cnt] = [obj substringFromIndex:1]; ++- cnt++; +++ if ([obj isNotEmpty]) { +++ if ([obj hasPrefix:@"\\"]) +++ objs[cnt] = [obj substringFromIndex:1]; +++ else +++ objs[cnt] = obj; +++ cnt++; +++ } ++ } ++ result = [NSArray arrayWithObjects:objs count:cnt]; ++ if (objs) free(objs); ++Index: sope-mime/NGImap4/NGImap4ResponseParser.m ++=================================================================== ++--- sope-mime/NGImap4/NGImap4ResponseParser.m (revision 1660) +++++ sope-mime/NGImap4/NGImap4ResponseParser.m (working copy) ++@@ -31,6 +31,7 @@ ++ @interface NGImap4ResponseParser(ParsingPrivates) ++ - (BOOL)_parseNumberUntaggedResponse:(NGMutableHashMap *)result_; ++ - (NSDictionary *)_parseBodyContent; +++- (NSData *) _parseBodyHeaderFields; ++ ++ - (NSData *)_parseData; ++ ++@@ -84,6 +85,8 @@ ++ static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self, ++ BOOL isBodyStructure); ++ +++static NSArray *_parseLanguages(); +++ ++ static NSString *_parseBodyString(NGImap4ResponseParser *self, ++ BOOL _convertString); ++ static NSString *_parseBodyDecodeString(NGImap4ResponseParser *self, ++@@ -111,6 +114,7 @@ ++ static NSNumber *_parseUnsigned(NGImap4ResponseParser *self); ++ static NSString *_parseUntil(NGImap4ResponseParser *self, char _c); ++ static NSString *_parseUntil2(NGImap4ResponseParser *self, char _c1, char _c2); +++static BOOL _endsWithCQuote(NSString *_string); ++ ++ static __inline__ NSException *_consumeIfMatch ++ (NGImap4ResponseParser *self, unsigned char _m); ++@@ -488,6 +492,50 @@ ++ return [self _parseDataIntoRAM:size]; ++ } ++ +++/* +++ Similair to _parseData but used to parse something like this : +++ +++ BODY[HEADER.FIELDS (X-PRIORITY)] {17} +++ X-Priority: 1 +++ +++ ) +++ +++ Headers are returned as data, as is. +++*/ +++- (NSData *) _parseBodyHeaderFields +++{ +++ NSData *result; +++ unsigned size; +++ NSNumber *sizeNum; +++ +++ /* we skip until we're ready to parse {length} */ +++ _parseUntil(self, '{'); +++ +++ result = nil; +++ +++ if ((sizeNum = _parseUnsigned(self)) == nil) { +++ NSException *e; +++ +++ e = [[NGImap4ParserException alloc] +++ initWithFormat:@"expect a number between {}"]; +++ [self setLastException:[e autorelease]]; +++ return nil; +++ } +++ _consumeIfMatch(self, '}'); +++ _consumeIfMatch(self, '\n'); +++ +++ if ((size = [sizeNum intValue]) == 0) { +++ [self logWithFormat:@"ERROR(%s): got content size '0'!", +++ __PRETTY_FUNCTION__]; +++ return nil; +++ } +++ +++ if (UseMemoryMappedData && (size > Imap4MMDataBoundary)) +++ return [self _parseDataToFile:size]; +++ +++ return [self _parseDataIntoRAM:size]; +++} +++ ++ static int _parseTaggedResponse(NGImap4ResponseParser *self, ++ NGMutableHashMap *result_) ++ { ++@@ -648,13 +696,124 @@ ++ [result_ addObject:_parseUntil(self, '\n') forKey:@"description"]; ++ } ++ +++static inline void +++_purifyQuotedString(NSMutableString *quotedString) { +++ unichar *currentChar, *qString, *maxC, *startC; +++ unsigned int max, questionMarks; +++ BOOL possiblyQuoted, skipSpaces; +++ NSMutableString *newString; +++ +++ newString = [NSMutableString string]; +++ +++ max = [quotedString length]; +++ qString = malloc (sizeof (unichar) * max); +++ [quotedString getCharacters: qString]; +++ currentChar = qString; +++ startC = qString; +++ maxC = qString + max; +++ +++ possiblyQuoted = NO; +++ skipSpaces = NO; +++ +++ questionMarks = 0; +++ +++ while (currentChar < maxC) { +++ if (possiblyQuoted) { +++ if (questionMarks == 2) { +++ if ((*currentChar == 'Q' || *currentChar == 'q' +++ || *currentChar == 'B' || *currentChar == 'b') +++ && ((currentChar + 1) < maxC +++ && (*(currentChar + 1) == '?'))) { +++ currentChar++; +++ questionMarks = 3; +++ } +++ else { +++ possiblyQuoted = NO; +++ } +++ } +++ else if (questionMarks == 4) { +++ if (*currentChar == '=') { +++ skipSpaces = YES; +++ possiblyQuoted = NO; +++ currentChar++; +++ [newString appendString: [NSString stringWithCharacters: startC +++ length: (currentChar - startC)]]; +++ startC = currentChar; +++ } +++ else { +++ possiblyQuoted = NO; +++ } +++ } +++ else { +++ if (*currentChar == '?') { +++ questionMarks++; +++ } +++ else if (*currentChar == ' ' && questionMarks != 3) { +++ possiblyQuoted = NO; +++ } +++ } +++ } +++ else if (*currentChar == '=' +++ && ((currentChar + 1) < maxC +++ && (*(currentChar + 1) == '?'))) { +++ [newString appendString: [NSString stringWithCharacters: startC +++ length: (currentChar - startC)]]; +++ startC = currentChar; +++ possiblyQuoted = YES; +++ skipSpaces = NO; +++ currentChar++; +++ questionMarks = 1; +++ } +++ +++ currentChar++; +++ +++ if (skipSpaces) { +++ while (currentChar < maxC +++ && (*currentChar == ' ' +++ || *currentChar == '\t')) +++ currentChar++; +++ skipSpaces = NO; +++ startC = currentChar; +++ } +++ } +++ +++ if (startC < maxC) +++ [newString appendString: [NSString stringWithCharacters: startC +++ length: (currentChar - startC)]]; +++ +++ [quotedString setString: newString]; +++ free (qString); +++} +++ ++ - (NSString *)_parseQuotedString { +++ NSMutableString *quotedString; +++ NSString *tmpString; +++ BOOL stop; +++ ++ /* parse a quoted string, eg '"' */ ++ if (_la(self, 0) == '"') { ++ _consume(self, 1); ++- return _parseUntil(self, '"'); +++ quotedString = [NSMutableString string]; +++ stop = NO; +++ while (!stop) { +++ tmpString = _parseUntil(self, '"'); +++ [quotedString appendString: tmpString]; +++ if(_endsWithCQuote(tmpString)) { +++ [quotedString deleteSuffix: @"\\"]; +++ [quotedString appendString: @"\""]; +++ } +++ else { +++ stop = YES; +++ } +++ } ++ } ++- return nil; +++ else { +++ quotedString = nil; +++ } +++ +++ _purifyQuotedString(quotedString); +++ +++ return quotedString; ++ } ++ - (void)_consumeOptionalSpace { ++ if (_la(self, 0) == ' ') _consume(self, 1); ++@@ -685,6 +844,10 @@ ++ name = [self _parseQuotedString]; ++ _parseUntil(self, '\n'); ++ } +++ else if (_la(self, 0) == '{') { +++ name = [self _parseQuotedStringOrNIL]; +++ _parseUntil(self, '\n'); +++ } ++ else ++ name = _parseUntil(self, '\n'); ++ ++@@ -1030,10 +1193,15 @@ ++ _consume(self, 7); ++ ++ if (_la(self, 0) == '"') { ++- _consume(self, 1); ++- name = _parseUntil(self, '"'); +++ name = [self _parseQuotedString]; +++// _consume(self, 1); +++// name = _parseUntil(self, '"'); ++ _consumeIfMatch(self, ' '); ++ } +++ else if (_la(self, 0) == '{') { +++ name = [self _parseQuotedStringOrNIL]; +++ _consumeIfMatch(self, ' '); +++ } ++ else { ++ name = _parseUntil(self, ' '); ++ } ++@@ -1090,6 +1258,8 @@ ++ return @""; ++ ++ s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +++ if (s == nil) +++ s = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding]; ++ if (s == nil) { ++ [self logWithFormat: ++ @"ERROR(%s): could not convert data (%d bytes) into string.", ++@@ -1185,7 +1355,7 @@ ++ route = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace]; ++ mailbox = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace]; ++ host = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace]; ++- +++ ++ if (_la(self, 0) != ')') { ++ [self logWithFormat:@"WARNING: IMAP4 envelope " ++ @"address not properly closed (c0=%c,c1=%c): %@", ++@@ -1197,6 +1367,7 @@ ++ address = [[NGImap4EnvelopeAddress alloc] initWithPersonalName:pname ++ sourceRoute:route mailbox:mailbox ++ host:host]; +++ ++ return address; ++ } ++ ++@@ -1382,7 +1553,15 @@ ++ #if 0 ++ [self logWithFormat:@"PARSE KEY: %@", key]; ++ #endif ++- if ([key hasPrefix:@"body["]) { +++ if ([key hasPrefix:@"body[header.fields"]) { +++ NSData *content; +++ +++ if ((content = [self _parseBodyHeaderFields]) != nil) +++ [fetch setObject:content forKey:key]; +++ else +++ [self logWithFormat:@"ERROR: got no body content for key: '%@'",key]; +++ } +++ else if ([key hasPrefix:@"body["]) { ++ NSDictionary *content; ++ ++ if ((content = [self _parseBodyContent]) != nil) ++@@ -1594,8 +1773,11 @@ ++ if (_decode) ++ data = [data decodeQuotedPrintableValueOfMIMEHeaderField:nil]; ++ ++- return [[[StrClass alloc] initWithData:data encoding:encoding] ++- autorelease]; +++ if ([data isKindOfClass: [NSString class]]) +++ return (NSString *) data; +++ else +++ return [[[StrClass alloc] initWithData:data encoding:encoding] +++ autorelease]; ++ } ++ else { ++ str = _parseUntil2(self, ' ', ')'); ++@@ -1620,13 +1802,35 @@ ++ return str; ++ } ++ ++- ++ static NSString *_parseBodyString(NGImap4ResponseParser *self, ++ BOOL _convertString) ++ { ++ return _parseBodyDecodeString(self, _convertString, NO /* no decode */); ++ } ++ +++static NSArray *_parseLanguages(NGImap4ResponseParser *self) { +++ NSMutableArray *languages; +++ NSString *language; +++ +++ languages = [NSMutableArray array]; +++ if (_la(self, 0) == '(') { +++ while (_la(self, 0) != ')') { +++ _consume(self,1); +++ language = _parseBodyString(self, YES); +++ if ([language length]) +++ [languages addObject: language]; +++ } +++ _consume(self,1); +++ } +++ else { +++ language = _parseBodyString(self, YES); +++ if ([language length]) +++ [languages addObject: language]; +++ } +++ +++ return languages; +++} +++ ++ static NSDictionary *_parseBodyParameterList(NGImap4ResponseParser *self) ++ { ++ NSMutableDictionary *list; ++@@ -1646,7 +1850,7 @@ ++ _consumeIfMatch(self, ' '); ++ value = _parseBodyDecodeString(self, YES, YES); ++ ++- [list setObject:value forKey:[key lowercaseString]]; +++ if (value) [list setObject:value forKey:[key lowercaseString]]; ++ } ++ _consumeIfMatch(self, ')'); ++ } ++@@ -1731,13 +1935,14 @@ ++ static NSDictionary *_parseSingleBody(NGImap4ResponseParser *self, ++ BOOL isBodyStructure) { ++ NSString *type, *subtype, *bodyId, *description, ++- *encoding, *bodysize; +++ *result, *encoding, *bodysize; ++ NSDictionary *parameterList; ++ NSMutableDictionary *dict; +++ NSArray *languages; ++ ++ type = [_parseBodyString(self, YES) lowercaseString]; ++ _consumeIfMatch(self, ' '); ++- subtype = _parseBodyString(self, YES); +++ subtype = [_parseBodyString(self, YES) lowercaseString]; ++ _consumeIfMatch(self, ' '); ++ parameterList = _parseBodyParameterList(self); ++ _consumeIfMatch(self, ' '); ++@@ -1762,13 +1967,18 @@ ++ _consumeIfMatch(self, ' '); ++ [dict setObject:_parseBodyString(self, YES) forKey:@"lines"]; ++ } ++- else if ([type isEqualToString:@"message"]) { +++ else if ([type isEqualToString:@"message"] +++ && [subtype isEqualToString:@"rfc822"]) { ++ if (_la(self, 0) != ')') { ++ _consumeIfMatch(self, ' '); ++ _consumeIfMatch(self, '('); ++- [dict setObject:_parseBodyString(self, YES) forKey:@"date"]; +++ result = _parseBodyString(self, YES); +++ if (result == nil) result = @""; +++ [dict setObject:result forKey:@"date"]; ++ _consumeIfMatch(self, ' '); ++- [dict setObject:_parseBodyString(self, YES) forKey:@"subject"]; +++ result = _parseBodyString(self, YES); +++ if (result == nil) result = @""; +++ [dict setObject:result forKey:@"subject"]; ++ _consumeIfMatch(self, ' '); ++ [dict setObject:_parseParenthesizedAddressList(self) forKey:@"from"]; ++ _consumeIfMatch(self, ' '); ++@@ -1783,14 +1993,20 @@ ++ _consumeIfMatch(self, ' '); ++ [dict setObject:_parseParenthesizedAddressList(self) forKey:@"bcc"]; ++ _consumeIfMatch(self, ' '); ++- [dict setObject:_parseBodyString(self, YES) forKey:@"in-reply-to"]; +++ result = _parseBodyString(self, YES); +++ if (result == nil) result = @""; +++ [dict setObject:result forKey:@"in-reply-to"]; ++ _consumeIfMatch(self, ' '); ++- [dict setObject:_parseBodyString(self, YES) forKey:@"messageId"]; +++ result = _parseBodyString(self, YES); +++ if (result == nil) result = @""; +++ [dict setObject:result forKey:@"messageId"]; ++ _consumeIfMatch(self, ')'); ++ _consumeIfMatch(self, ' '); ++ [dict setObject:_parseBody(self, isBodyStructure) forKey:@"body"]; ++ _consumeIfMatch(self, ' '); ++- [dict setObject:_parseBodyString(self, YES) forKey:@"bodyLines"]; +++ result = _parseBodyString(self, YES); +++ if (result == nil) result = @""; +++ [dict setObject:result forKey:@"bodyLines"]; ++ } ++ } ++ ++@@ -1805,14 +2021,9 @@ ++ forKey: @"disposition"]; ++ if (_la(self, 0) != ')') { ++ _consume(self,1); ++- if (_la(self, 0) == '(') { ++- [dict setObject: _parseBodyParameterList(self) ++- forKey: @"language"]; ++- } ++- else { ++- [dict setObject: _parseBodyString(self, YES) ++- forKey: @"language"]; ++- } +++ languages = _parseLanguages(self); +++ if ([languages count]) +++ [dict setObject: languages forKey: @"languages"]; ++ if (_la(self, 0) != ')') { ++ _consume(self,1); ++ [dict setObject: _parseBodyString(self, YES) ++@@ -1829,6 +2040,7 @@ ++ static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self, ++ BOOL isBodyStructure) { ++ NSMutableArray *parts; +++ NSArray *languages; ++ NSString *kind; ++ NSMutableDictionary *dict; ++ ++@@ -1854,14 +2066,9 @@ ++ forKey: @"disposition"]; ++ if (_la(self, 0) != ')') { ++ _consume(self,1); ++- if (_la(self, 0) == '(') { ++- [dict setObject: _parseBodyParameterList(self) ++- forKey: @"language"]; ++- } ++- else { ++- [dict setObject: _parseBodyString(self, YES) ++- forKey: @"language"]; ++- } +++ languages = _parseLanguages(self); +++ if ([languages count]) +++ [dict setObject: languages forKey: @"languages"]; ++ if (_la(self, 0) != ')') { ++ _consume(self,1); ++ [dict setObject: _parseBodyString(self, YES) ++@@ -2170,6 +2377,21 @@ ++ } ++ } ++ +++static BOOL _endsWithCQuote(NSString *_string){ +++ unsigned int quoteSlashes; +++ int pos; +++ +++ quoteSlashes = 0; +++ pos = [_string length] - 1; +++ while (pos > -1 +++ && [_string characterAtIndex: pos] == '\\') { +++ quoteSlashes++; +++ pos--; +++ } +++ +++ return ((quoteSlashes % 2) == 1); +++} +++ ++ - (NSException *)exceptionForFailedMatch:(unsigned char)_match ++ got:(unsigned char)_avail ++ { ++@@ -2225,9 +2447,9 @@ ++ [s release]; ++ ++ if (c == '\n') { ++- if ([self->serverResponseDebug cStringLength] > 2) { +++ if ([self->serverResponseDebug lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding] > 2) { ++ fprintf(stderr, "S[%p]: %s", self, ++- [self->serverResponseDebug cString]); +++ [self->serverResponseDebug cStringUsingEncoding:NSISOLatin1StringEncoding]); ++ } ++ [self->serverResponseDebug release]; ++ self->serverResponseDebug = ++Index: sope-mime/NGImap4/ChangeLog ++=================================================================== ++--- sope-mime/NGImap4/ChangeLog (revision 1660) +++++ sope-mime/NGImap4/ChangeLog (working copy) ++@@ -1,3 +1,45 @@ +++2009-07-01 Wolfgang Sourdeau +++ +++ * NGImap4Connection.m (-initWithClient:password:): we need to copy +++ the imap4Separator, otherwise it will be released when the connection +++ is deallocated. +++ +++2009-06-15 Wolfgang Sourdeau +++ +++ * NSString+Imap4.m (-stringByEncodingImap4FolderName, +++ -stringByDecodingImap4FolderName): reimplemented the original +++ methods in a unicode-safe way, thereby simplifying the code at the +++ same time. +++ +++ * NGImap4Functions.m (SaneFolderName): new function designed to +++ sanitize folder names prior to using them in IMAP commands. +++ +++2008-10-23 Wolfgang Sourdeau +++ +++ * NGImap4Client.m ([NGImap -sort:qualifier:encoding:]): message +++ without date that are sorted on servers which do not have the SORT +++ capability are now given the current date as a work-around. +++ +++2008-09-22 Wolfgang Sourdeau +++ +++ * NGImap4Connection.m ([NGImap -doesMailboxExistAtURL:]): restore +++ the previously selected folder state. +++ +++2008-09-19 Wolfgang Sourdeau +++ +++ * NGImap4Client.m ([NGImap -select:]): simplified method by +++ removing the need for storing the previous folder before releasing +++ it. This strangely seems to fix a crash with gnustep 1.14. +++ +++2008-09-01 Ludovic Marcotte +++ +++ * NGImap4ConnectionManager.m: implemented _garbageCollect. +++ +++2008-08-28 Wolfgang Sourdeau +++ +++ * NGImap4Client.m ([NGImap -unselect]): new method to send +++ "UNSELECT" to the imap server. +++ ++ 2007-08-24 Wolfgang Sourdeau ++ ++ * NGImap4Connection.m: some fix for folders ending with a slash (OGo ++Index: sope-mime/NGImap4/NGImap4ConnectionManager.m ++=================================================================== ++--- sope-mime/NGImap4/NGImap4ConnectionManager.m (revision 1660) +++++ sope-mime/NGImap4/NGImap4ConnectionManager.m (working copy) ++@@ -38,6 +38,9 @@ ++ debugCache = [ud boolForKey:@"NGImap4EnableIMAP4CacheDebug"]; ++ poolingOff = [ud boolForKey:@"NGImap4DisableIMAP4Pooling"]; ++ +++ if ([ud objectForKey:@"NGImap4PoolingCleanupInterval"]) +++ PoolScanInterval = [[ud objectForKey:@"NGImap4PoolingCleanupInterval"] doubleValue]; +++ ++ if (debugOn) NSLog(@"Note: NGImap4EnableIMAP4Debug is enabled!"); ++ if (poolingOff) NSLog(@"WARNING: IMAP4 connection pooling is disabled!"); ++ } ++@@ -53,18 +56,17 @@ ++ if ((self = [super init])) { ++ if (!poolingOff) { ++ self->urlToEntry = [[NSMutableDictionary alloc] initWithCapacity:256]; +++ self->gcTimer = [[NSTimer scheduledTimerWithTimeInterval: +++ PoolScanInterval +++ target:self selector:@selector(_garbageCollect:) +++ userInfo:nil repeats:YES] retain]; ++ } ++- ++- self->gcTimer = [[NSTimer scheduledTimerWithTimeInterval: ++- PoolScanInterval ++- target:self selector:@selector(_garbageCollect:) ++- userInfo:nil repeats:YES] retain]; ++ } ++ return self; ++ } ++ ++ - (void)dealloc { ++- if (self->gcTimer) [self->gcTimer invalidate]; +++ [self->gcTimer invalidate]; ++ [self->urlToEntry release]; ++ [self->gcTimer release]; ++ [super dealloc]; ++@@ -91,6 +93,25 @@ ++ ++ - (void)_garbageCollect:(NSTimer *)_timer { ++ // TODO: scan for old IMAP4 channels +++ NGImap4Connection *entry; +++ NSDate *now; +++ NSArray *a; +++ int i; +++ +++ a = [self->urlToEntry allKeys]; +++ now = [NSDate date]; +++ +++ for (i = 0; i < [a count]; i++) +++ { +++ entry = [self->urlToEntry objectForKey: [a objectAtIndex: i]]; +++ +++ if ([now timeIntervalSinceDate: [entry creationTime]] > PoolScanInterval) +++ { +++ [[entry client] logout]; +++ [self->urlToEntry removeObjectForKey: [a objectAtIndex: i]]; +++ } +++ } +++ ++ [self debugWithFormat:@"should collect IMAP4 channels (%d active)", ++ [self->urlToEntry count]]; ++ } ++@@ -105,34 +126,42 @@ ++ NGImap4Connection *entry; ++ NGImap4Client *client; ++ +++ if (poolingOff) { +++ client = [self imap4ClientForURL:_url password:_p]; +++ entry = [[NGImap4Connection alloc] initWithClient:client +++ password:_p]; +++ return [entry autorelease]; +++ } +++ else { ++ /* check cache */ ++ ++- if ((entry = [self entryForURL:_url]) != nil) { ++- if ([entry isValidPassword:_p]) { +++ if ((entry = [self entryForURL:_url]) != nil) { +++ if ([entry isValidPassword:_p]) { +++ if (debugCache) +++ [self logWithFormat:@"valid password, reusing cache entry ..."]; +++ return entry; +++ } +++ +++ /* different password, password could have changed! */ ++ if (debugCache) ++- [self logWithFormat:@"valid password, reusing cache entry ..."]; ++- return entry; +++ [self logWithFormat:@"different password than cached entry: %@", _url]; +++ entry = nil; ++ } ++- ++- /* different password, password could have changed! */ ++- if (debugCache) ++- [self logWithFormat:@"different password than cached entry: %@", _url]; ++- entry = nil; ++- } ++- else ++- [self debugWithFormat:@"no connection cached yet for url: %@", _url]; +++ else +++ [self debugWithFormat:@"no connection cached yet for url: %@", _url]; ++ ++- /* try to login */ +++ /* try to login */ ++ ++- client = [entry isValidPassword:_p] ++- ? [entry client] ++- : [self imap4ClientForURL:_url password:_p]; +++ client = [entry isValidPassword:_p] +++ ? [entry client] +++ : [self imap4ClientForURL:_url password:_p]; +++ +++ if (client == nil) +++ return nil; ++ ++- if (client == nil) ++- return nil; ++- ++ /* sideeffect of -imap4ClientForURL:password: is to create a cache entry */ ++- return [self entryForURL:_url]; +++ return [self entryForURL:_url]; +++ } ++ } ++ ++ /* client object */ ++Index: sope-mime/NGImap4/NSString+Imap4.m ++=================================================================== ++--- sope-mime/NGImap4/NSString+Imap4.m (revision 1660) +++++ sope-mime/NGImap4/NSString+Imap4.m (working copy) ++@@ -20,117 +20,86 @@ ++ 02111-1307, USA. ++ */ ++ +++#import +++ ++ #include ++ #include "imCommon.h" ++ ++-/* TODO: NOT UNICODE SAFE (uses cString) */ ++- ++-static void _encodeToModifiedUTF7(unsigned char *_buf, int encLen, ++- unsigned char **result_, ++- unsigned int *cntRes_); ++-static int _decodeOfModifiedUTF7(unsigned char *_target, unsigned _targetLen, ++- unsigned *usedBytes_ , ++- unsigned char **buffer_, ++- int *bufLen_, int maxBuf); ++- ++ @implementation NSString(Imap4) ++ +++static unsigned int _encodeToModifiedUTF7(unichar *_char, unsigned char *result_, +++ unsigned int *cntRes_); +++static unsigned int _decodeOfModifiedUTF7(unsigned char *_source, unichar *result_, +++ unsigned int *cntRes_ ); +++ ++ - (NSString *)stringByEncodingImap4FolderName { ++- // TBD: this is restricted to Latin1, should be fixed to UTF-8 ++- /* dude.d& --> dude.d&- */ ++- unsigned char *buf = NULL; +++ unichar *buf = NULL; ++ unsigned char *res = NULL; ++ unsigned int len = 0; ++ unsigned int cnt = 0; ++ unsigned int cntRes = 0; ++ NSString *result = nil; ++- NSData *data; ++ ++- len = [self cStringLength]; ++- buf = calloc(len + 3, sizeof(char)); ++- res = calloc((len * 6) + 3, sizeof(char)); ++- buf[len] = '\0'; ++- res[len * 6] = '\0'; ++- [self getCString:(char *)buf]; +++ len = [self length]; +++ buf = NSZoneMalloc(NULL, (len + 1) * sizeof(unichar)); +++ [self getCharacters: buf]; +++ buf[len] = 0; ++ +++ /* 1 * '&', 3 for the max bytes / char, 1 * '-' */ +++ res = NSZoneMalloc(NULL, ((len * 5) + 1) * sizeof(char)); +++ ++ while (cnt < len) { ++- int c = buf[cnt]; +++ unichar c = buf[cnt]; ++ if (((c > 31) && (c < 38)) || ++ ((c > 38) && (c < 127))) { ++ res[cntRes++] = c; ++- cnt++; ++ } ++ else { ++ if (c == '&') { ++ res[cntRes++] = '&'; ++ res[cntRes++] = '-'; ++- cnt++; ++ } ++ else { ++- int start; ++- ++- start = cnt; ++- ++- while (cnt < (len - 1)) { ++- int c = buf[cnt + 1]; ++- if (((c > 31) && (c < 38)) || ++- ((c > 38) && (c < 127)) || ++- (c == '&')) { ++- break; ++- } ++- else { ++- cnt++; ++- } ++- } ++- { ++- unsigned length; ++- ++- res[cntRes++] = '&'; ++- ++- length = cnt - start + 1; ++- ++- _encodeToModifiedUTF7(buf + start, length, &res, &cntRes); ++- ++- res[cntRes] = '-'; ++- cntRes++; ++- cnt++; ++- } +++ res[cntRes++] = '&'; +++ cnt += _encodeToModifiedUTF7(buf + cnt, res + cntRes, &cntRes); +++ res[cntRes++] = '-'; ++ } ++ } +++ cnt++; ++ } ++- if (buf != NULL) free(buf); buf = NULL; +++ if (buf != NULL) NSZoneFree(NULL, buf); ++ ++- data = [[NSData alloc] initWithBytesNoCopy:res length:cntRes ++- freeWhenDone:YES]; ++- result = [[NSString alloc] initWithData:data ++- encoding:NSISOLatin1StringEncoding]; ++- [data release]; data = nil; ++- ++- return [result autorelease]; +++ res[cntRes] = 0; +++ result = [NSString stringWithCString: (char *) res +++ encoding: NSISOLatin1StringEncoding]; +++ +++ return result; ++ } ++ ++ - (NSString *)stringByDecodingImap4FolderName { ++- // TBD: this is restricted to Latin1, should be fixed to UTF-8 ++- /* dude/d&- --> dude/d& */ ++ unsigned char *buf; ++- unsigned char *res; +++ unichar *res; ++ unsigned int len; ++ unsigned int cnt = 0; ++ unsigned int cntRes = 0; ++ NSString *result = nil; ++- NSData *data; +++// NSData *data; ++ ++- if ((len = [self cStringLength]) == 0) +++ if ((len = [self lengthOfBytesUsingEncoding: NSISOLatin1StringEncoding]) == 0) ++ return @""; ++- ++- buf = calloc(len + 3, sizeof(unsigned char)); ++- res = calloc(len + 3, sizeof(unsigned char)); +++ +++ buf = NSZoneMalloc(NULL, (len + 1) * sizeof(unsigned char)); +++ +++ if ([self getCString:(char *)buf maxLength: len + 1 +++ encoding: NSISOLatin1StringEncoding] == NO) { +++ NSZoneFree(NULL, buf); +++ return @""; +++ } ++ buf[len] = '\0'; ++- res[len] = '\0'; ++- ++- [self getCString:(char *)buf]; ++- ++- while (cnt < (len - 1)) { /* &- */ +++ +++ res = NSZoneMalloc(NULL, (len + 1) * sizeof(unichar)); +++ +++ while (cnt < len) { /* &- */ ++ unsigned char c; ++ ++ c = buf[cnt]; ++@@ -141,29 +110,7 @@ ++ cnt += 2; ++ } ++ else { ++- unsigned usedBytes = 0; ++- unsigned char *buffer; ++- int maxBuf, bufLen; ++- ++- cnt++; ++- maxBuf = 511; ++- bufLen = 0; ++- buffer = calloc(maxBuf + 3, sizeof(char)); ++- ++- if (_decodeOfModifiedUTF7(buf + cnt, len - cnt, &usedBytes , &buffer, ++- &bufLen, maxBuf) == 0) { ++- int cnt1; ++- ++- cnt1 = 0; ++- while (cnt1 < bufLen) { ++- res[cntRes++] = buffer[cnt1++]; ++- } ++- cnt += usedBytes; ++- } ++- else { ++- NSCAssert(NO, @"couldn't decode UTF-7 .."); ++- } ++- free(buffer); buffer = NULL; +++ cnt += _decodeOfModifiedUTF7(buf + cnt + 1, res + cntRes, &cntRes) + 1; ++ } ++ } ++ else { ++@@ -171,20 +118,129 @@ ++ cnt++; ++ } ++ } ++- if (cnt < len) ++- res[cntRes++] = buf[cnt++]; ++- ++- if (buf != NULL) free(buf); buf = NULL; ++ ++- data = [[NSData alloc] initWithBytesNoCopy:res length:cntRes ++- freeWhenDone:YES]; ++- result = [[NSString alloc] initWithData:data ++- encoding:NSISOLatin1StringEncoding]; ++- [data release]; data = nil; ++- ++- return [result autorelease]; +++ if (buf != NULL) NSZoneFree(NULL, buf); +++ +++ res[cntRes] = 0; +++ result = [NSString stringWithCharacters: res length: cntRes]; +++ +++ return result; ++ } ++ +++/* check metamail output for correctness */ +++ +++static unsigned char basis_64[] = +++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +++ +++static char index_64[128] = { +++ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, +++ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, +++ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, +++ 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1, +++ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, +++ 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, +++ -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, +++ 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 +++}; +++ +++#define char64(c) (((c) < 0 || (c) > 127) ? -1 : index_64[(c)]) +++ +++static unsigned int _encodeToModifiedUTF7(unichar *_char, unsigned char *result_, +++ unsigned int *cntRes_) +++{ +++ unsigned int processedSrc, processedDest, cycle; +++ unichar c; +++ char leftover; +++ +++ processedSrc = 0; +++ processedDest = 0; +++ cycle = 0; +++ leftover = 0; +++ +++ c = *_char; +++ while (c > 126 || (c > 0 && c < 32)) { +++ if (cycle == 0) { +++ *(result_ + processedDest) = basis_64[(c >> 10) & 0x3f]; +++ *(result_ + processedDest + 1) = basis_64[(c >> 4) & 0x3f]; +++ leftover = (c << 2); +++ processedDest += 2; +++ cycle = 1; +++ } +++ else if (cycle == 1) { +++ *(result_ + processedDest) = basis_64[(leftover | (c >> 14)) & 0x3f]; +++ *(result_ + processedDest + 1) = basis_64[(c >> 8) & 0x3f]; +++ *(result_ + processedDest + 2) = basis_64[(c >> 2) & 0x3f]; +++ leftover = (c << 4); +++ processedDest += 3; +++ cycle = 2; +++ } +++ else if (cycle == 2) { +++ *(result_ + processedDest) = basis_64[(leftover | (c >> 12)) & 0x3f]; +++ *(result_ + processedDest + 1) = basis_64[(c >> 6) & 0x3f]; +++ *(result_ + processedDest + 2) = basis_64[c & 0x3f]; +++ leftover = 0; +++ processedDest += 3; +++ cycle = 0; +++ } +++ processedSrc++; +++ c = *(_char + processedSrc); +++ } +++ if (leftover) { +++ *(result_ + processedDest) = basis_64[leftover & 0x3f]; +++ processedDest++; +++ } +++ processedSrc--; +++ *cntRes_ += processedDest; +++ +++ return processedSrc; +++} +++ +++static unsigned int _decodeOfModifiedUTF7(unsigned char *_source, unichar *result_, +++ unsigned int *cntRes_) +++{ +++ unsigned int processedSrc, processedDest; +++ unsigned char c, decoded; +++ unichar currentRes; +++ int shift; +++ +++ processedSrc = 0; +++ processedDest = 0; +++ shift = 10; +++ currentRes = 0; +++ +++ c = *_source; +++ while (c != 0 && c != '-') { +++ decoded = index_64[c]; +++ if (shift < 0) { +++ currentRes |= (decoded >> (shift * -1)); +++ *(result_ + processedDest) = currentRes; +++ processedDest++; +++ shift += 16; +++ currentRes = (decoded << shift); +++ } else { +++ currentRes |= (decoded << shift); +++ if (shift == 0) { +++ *(result_ + processedDest) = currentRes; +++ processedDest++; +++ currentRes = 0; +++ shift = 16; +++ } +++ } +++ shift -= 6; +++ processedSrc++; +++ c = *(_source + processedSrc); +++ } +++ if (shift != 10) { +++ *(result_ + processedDest) = currentRes; +++ } +++ if (c == '-') +++ processedSrc++; +++ +++ *cntRes_ += processedDest; +++ +++ return processedSrc; +++} +++ ++ - (NSString *)stringByEscapingImap4Password { ++ // TODO: perf ++ unichar *buffer; ++@@ -193,12 +249,12 @@ ++ NSString *s; ++ ++ len = [self length]; ++- chars = calloc(len + 2, sizeof(unichar)); +++ chars = NSZoneCalloc(NULL, len + 2, sizeof(unichar)); ++ [self getCharacters:chars]; ++- ++- buffer = calloc(len * 2 + 2, sizeof(unichar)); +++ +++ buffer = NSZoneCalloc(NULL, len * 2 + 2, sizeof(unichar)); ++ buffer[len * 2] = '\0'; ++- +++ ++ for (i = 0, j = 0; i < len; i++, j++) { ++ BOOL conv = NO; ++ ++@@ -224,209 +280,11 @@ ++ } ++ buffer[j] = chars[i]; ++ } ++- if (chars != NULL) free(chars); chars = NULL; +++ if (chars != NULL) NSZoneFree(NULL, chars); ++ ++ s = [NSString stringWithCharacters:buffer length:j]; ++- if (buffer != NULL) free(buffer); buffer = NULL; +++ ++ return s; ++ } ++ ++ @end /* NSString(Imap4) */ ++- ++-static void writeChunk(int _c1, int _c2, int _c3, int _pads, ++- unsigned char **result_, ++- unsigned int *cntRes_); ++- ++-static int getChar(int _cnt, int *cnt_, unsigned char *_buf) { ++- int result; ++- ++- if ((_cnt % 2)) { ++- result = _buf[*cnt_]; ++- (*cnt_)++; ++- } ++- else { ++- result = 0; ++- } ++- return result; ++-} ++-static void _encodeToModifiedUTF7(unsigned char *_buf, int encLen, ++- unsigned char **result_, unsigned int *cntRes_) ++-{ ++- int c1, c2, c3; ++- int cnt, cntAll; ++- ++- cnt = 0; ++- cntAll = 0; ++- ++- while (cnt < encLen) { ++- c1 = getChar(cntAll++, &cnt, _buf); ++- if (cnt == encLen) { ++- writeChunk(c1, 0, 0, 2, result_, cntRes_); ++- } ++- else { ++- c2 = getChar(cntAll++, &cnt, _buf); ++- if (cnt == encLen) { ++- writeChunk(c1, c2, 0, 1, result_, cntRes_); ++- } ++- else { ++- c3 = getChar(cntAll++, &cnt, _buf); ++- writeChunk(c1, c2, c3, 0, result_, cntRes_); ++- } ++- } ++- } ++-} ++- ++-/* check metamail output for correctness */ ++- ++-static unsigned char basis_64[] = ++- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; ++- ++-static void writeChunk(int c1, int c2, int c3, int pads, unsigned char **result_, ++- unsigned int *cntRes_) { ++- unsigned char c; ++- ++- c = basis_64[c1>>2]; ++- (*result_)[*cntRes_] = c; ++- (*cntRes_)++; ++- ++- c = basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)]; ++- ++- (*result_)[*cntRes_] = c; ++- (*cntRes_)++; ++- ++- ++- if (pads == 2) { ++- ; ++- } ++- else if (pads) { ++- c = basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)]; ++- (*result_)[*cntRes_] = c; ++- (*cntRes_)++; ++- } ++- else { ++- c = basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)]; ++- ++- (*result_)[*cntRes_] = c; ++- (*cntRes_)++; ++- ++- c = basis_64[c3 & 0x3F]; ++- (*result_)[*cntRes_] = c; ++- (*cntRes_)++; ++- } ++-} ++- ++-static char index_64[128] = { ++- -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, ++- -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, ++- -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, ++- 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1, ++- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, ++- 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, ++- -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, ++- 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 ++-}; ++- ++-#define char64(c) (((c) < 0 || (c) > 127) ? -1 : index_64[(c)]) ++- ++-static int _decodeOfModifiedUTF7(unsigned char *_target, unsigned _targetLen, ++- unsigned *usedBytes_ , unsigned char **buffer_, ++- int *bufLen_, int maxBuf) ++-{ ++- int c1, c2, c3, c4; ++- unsigned int cnt; ++- ++- for (cnt = 0; cnt < _targetLen; ) { ++- c1 = '='; ++- c2 = '='; ++- c3 = '='; ++- c4 = '='; ++- ++- c1 = _target[cnt++]; ++- ++- if (c1 == '-') { ++- (*usedBytes_)++; ++- return 0; ++- } ++- if (cnt < _targetLen) ++- c2 = _target[cnt++]; ++- ++- if (c2 == '-') { ++- (*usedBytes_)+=2; ++- return 0; ++- } ++- ++- (*usedBytes_) += 2; ++- ++- if (cnt < _targetLen) { ++- c3 = _target[cnt++]; ++- (*usedBytes_)++; ++- } ++- ++- if (cnt < _targetLen) { ++- c4 = _target[cnt++]; ++- if (c3 != '-') ++- (*usedBytes_)++; ++- } ++- ++- if (c2 == -1 || c3 == -1 || c4 == -1) { ++- fprintf(stderr, "Warning: base64 decoder saw premature EOF!\n"); ++- return 0; ++- } ++- ++- if (c1 == '=' || c2 == '=') { ++- continue; ++- } ++- ++- c1 = char64(c1); ++- c2 = char64(c2); ++- ++- if (*bufLen_ < maxBuf) { ++- unsigned char c; ++- ++- c = ((c1<<2) | ((c2&0x30)>>4)); ++- ++- if (c) { ++- (*buffer_)[*bufLen_] = c; ++- *bufLen_ = *bufLen_ + 1; ++- } ++- } ++- if (c3 == '-') { ++- return 0; ++- } ++- else if (c3 == '=') { ++- continue; ++- } else { ++- ++- c3 = char64(c3); ++- ++- if (*bufLen_ < maxBuf) { ++- unsigned char c; ++- c = (((c2&0XF) << 4) | ((c3&0x3C) >> 2)); ++- if (c) { ++- (*buffer_)[*bufLen_] = c; ++- *bufLen_ = *bufLen_ + 1; ++- } ++- } ++- ++- if (c4 == '-') { ++- return 0; ++- } ++- else if (c4 == '=') { ++- continue; ++- } else { ++- c4 = char64(c4); ++- ++- if (*bufLen_ < maxBuf) { ++- unsigned char c; ++- ++- c = (((c3&0x03) <<6) | c4); ++- if (c) { ++- (*buffer_)[*bufLen_] = c; ++- (*bufLen_) = (*bufLen_) + 1; ++- } ++- } ++- } ++- } ++- } ++- return 0; ++-} ++Index: sope-mime/NGImap4/NGImap4Functions.h ++=================================================================== ++--- sope-mime/NGImap4/NGImap4Functions.h (revision 1660) +++++ sope-mime/NGImap4/NGImap4Functions.h (working copy) ++@@ -58,4 +58,6 @@ ++ id_folder); ++ BOOL _createSubFolderWithName(id self, NSString *_name, BOOL _app); ++ +++NSString *SaneFolderName(NSString *folderName); +++ ++ #endif /* __NGMime_NGImap4_NGImap4Functions_H__ */ ++Index: sope-mime/NGMail/NGMailAddressParser.h ++=================================================================== ++--- sope-mime/NGMail/NGMailAddressParser.h (revision 1660) +++++ sope-mime/NGMail/NGMailAddressParser.h (working copy) ++@@ -24,7 +24,9 @@ ++ ++ #import ++ ++-@class NSData, NSString, NSArray; +++#import +++ +++@class NSData, NSArray; ++ @class NGMailAddressList; ++ ++ /* ++@@ -34,16 +36,16 @@ ++ @interface NGMailAddressParser : NSObject ++ { ++ @private ++- unsigned char *data; ++- int dataPos; ++- int errorPos; ++- int maxLength; +++ unichar *data; +++ int dataPos; +++ int errorPos; +++ int maxLength; ++ } ++ ++ + (id)mailAddressParserWithString:(NSString *)_string; ++ + (id)mailAddressParserWithData:(NSData *)_data; ++-+ (id)mailAddressParserWithCString:(char *)_cString; ++-- (id)initWithCString:(const unsigned char *)_cstr length:(int unsigned)_len; ++++ (id)mailAddressParserWithCString:(const char *)_cString; +++- (id)initWithString:(NSString *)_str; ++ ++ /* parsing */ ++ ++Index: sope-mime/NGMail/NGMimeMessageGenerator.m ++=================================================================== ++--- sope-mime/NGMail/NGMimeMessageGenerator.m (revision 1660) +++++ sope-mime/NGMail/NGMimeMessageGenerator.m (working copy) ++@@ -86,37 +86,40 @@ ++ char *des = NULL; ++ unsigned int cnt; ++ BOOL doEnc; ++- NSString *str; +++// NSString *str; ++ ++ // TODO: this s***s big time! +++// NSLog (@"class: '%@'", NSStringFromClass ([_data class])); +++// #if APPLE_Foundation_LIBRARY || NeXT_Foundation_LIBRARY +++// str = [[NSString alloc] initWithData:_data +++// encoding:NSISOLatin1StringEncoding]; +++// str = [str autorelease]; +++ +++// #else +++// str = [[NSString alloc] initWithData:_data +++// encoding:NSISOLatin9StringEncoding]; +++// #endif +++// bytes = [str cString]; +++// length = [str cStringLength]; ++ ++-#if APPLE_Foundation_LIBRARY || NeXT_Foundation_LIBRARY ++- str = [[NSString alloc] initWithData:_data ++- encoding:NSISOLatin1StringEncoding]; ++-#else ++- str = [[NSString alloc] initWithData:_data ++- encoding:NSISOLatin9StringEncoding]; ++-#endif ++- str = [str autorelease]; ++- ++- bytes = [str cString]; ++- length = [str cStringLength]; ++- +++ bytes = [_data bytes]; +++ length = [_data length]; +++ ++ /* check whether we need to encode */ ++- ++- for (cnt = 0, doEnc = NO; cnt < length; cnt++) { ++- if ((unsigned char)bytes[cnt] > 127) { +++ cnt = 0; +++ doEnc = NO; +++ while (!doEnc && cnt < length) +++ if ((unsigned char)bytes[cnt] > 127) ++ doEnc = YES; ++- break; ++- } ++- } ++- +++ else +++ cnt++; +++ ++ if (!doEnc) ++ return _data; ++ ++ /* encode quoted printable */ ++ { ++- char iso[] = "=?iso-8859-15?q?"; +++ char iso[] = "=?utf-8?q?"; ++ unsigned isoLen = 16; ++ char isoEnd[] = "?="; ++ unsigned isoEndLen = 2; ++Index: sope-mime/NGMail/NGMailAddressParser.m ++=================================================================== ++--- sope-mime/NGMail/NGMailAddressParser.m (revision 1660) +++++ sope-mime/NGMail/NGMailAddressParser.m (working copy) ++@@ -52,9 +52,9 @@ ++ StrClass = [NSString class]; ++ } ++ ++-static inline NSString *mkStrObj(const unsigned char *s, unsigned int l) { +++static inline NSString *mkStrObj(const unichar *s, unsigned int l) { ++ // TODO: unicode ++- return [(NSString *)[StrClass alloc] initWithCString:(char *)s length:l]; +++ return [(NSString *)[StrClass alloc] initWithCharacters:s length:l]; ++ } ++ ++ static inline id parseWhiteSpaces(NGMailAddressParser *self, BOOL _guessMode) { ++@@ -84,7 +84,7 @@ ++ int keepPos = self->dataPos; // keep reference for backtracking ++ id returnValue = nil; ++ BOOL isAtom = YES; ++- unsigned char text[self->maxLength + 2]; // token text +++ unichar text[self->maxLength + 2]; // token text ++ int length = 0; // token text length ++ BOOL done = NO; ++ ++@@ -94,7 +94,7 @@ ++ done = YES; ++ } ++ else { ++- register unsigned char c = self->data[self->dataPos]; +++ register unichar c = self->data[self->dataPos]; ++ ++ switch (c) { ++ case '(' : case ')': case '<': case '>': ++@@ -162,7 +162,7 @@ ++ int keepPos = self->dataPos; // keep reference for backtracking ++ id returnValue = nil; ++ BOOL isQText = YES; ++- unsigned char text[self->maxLength + 4]; // token text +++ unichar text[self->maxLength + 4]; // token text ++ int length = 0; // token text length ++ BOOL done = YES; ++ ++@@ -172,9 +172,9 @@ ++ done = YES; ++ } ++ else { ++- register char c = self->data[self->dataPos]; +++ register unichar c = self->data[self->dataPos]; ++ ++- switch ((int)c) { +++ switch (c) { ++ case '"' : ++ case '\\': ++ case 13 : ++@@ -215,7 +215,7 @@ ++ int keepPos = self->dataPos; // keep reference for backtracking ++ id returnValue = nil; ++ BOOL isDText = YES; ++- unsigned char text[self->maxLength]; // token text +++ unichar text[self->maxLength]; // token text ++ int length = 0; // token text length ++ BOOL done = YES; ++ ++@@ -225,9 +225,9 @@ ++ done = YES; ++ } ++ else { ++- register char c = self->data[self->dataPos]; +++ register unichar c = self->data[self->dataPos]; ++ ++- switch ((int)c) { +++ switch (c) { ++ case '[': case ']': ++ case '\\': case 13: ++ isDText = (length > 0); ++@@ -320,42 +320,47 @@ ++ /* constructors */ ++ ++ + (id)mailAddressParserWithData:(NSData *)_data { ++- return [[(NGMailAddressParser *)[self alloc] ++- initWithCString:[_data bytes] ++- length:[_data length]] autorelease]; +++ NSString *uniString; +++ +++ uniString = [NSString stringWithCharacters:(unichar *)[_data bytes] +++ length:([_data length] / sizeof(unichar))]; +++ +++ return [(NGMailAddressParser *)self mailAddressParserWithString:uniString]; ++ } +++ ++ + (id)mailAddressParserWithCString:(char *)_cString { ++- return [[(NGMailAddressParser *)[self alloc] ++- initWithCString:(unsigned char *)_cString ++- length:strlen(_cString)] autorelease]; +++ NSString *nsCString; +++ +++ nsCString = [NSString stringWithCString:_cString]; +++ +++ return [(NGMailAddressParser *)self mailAddressParserWithString:nsCString]; ++ } ++-- (id)initWithCString:(const unsigned char *)_cstr length:(int unsigned)_len { +++ ++++ (id)mailAddressParserWithString:(NSString *)_string { +++ return [[(NGMailAddressParser *)[self alloc] initWithString:_string] +++ autorelease]; +++} +++ +++- (id)initWithString:(NSString *)_str { ++ if ((self = [super init])) { ++ // TODO: remember some string encoding? ++- self->data = (unsigned char *)_cstr; ++- self->maxLength = _len; +++ self->maxLength = [_str length]; +++ self->data = malloc(self->maxLength*sizeof(unichar)); +++ [_str getCharacters:self->data]; ++ self->dataPos = 0; ++ self->errorPos = -1; ++ } ++ return self; ++ } ++ ++-- (id)initWithString:(NSString *)_str { ++- // TODO: unicode ++- return [self initWithCString:(unsigned char *)[_str cString] ++- length:[_str cStringLength]]; ++-} ++- ++ - (id)init { ++- return [self initWithCString:NULL length:0]; +++ return [self initWithString:nil]; ++ } ++ ++-+ (id)mailAddressParserWithString:(NSString *)_string { ++- return [[(NGMailAddressParser *)[self alloc] initWithString:_string] ++- autorelease]; ++-} ++- ++ - (void)dealloc { +++ if (self->data != NULL) { +++ free(self->data); +++ } ++ self->data = NULL; ++ self->maxLength = 0; ++ self->dataPos = 0; ++Index: sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m ++=================================================================== ++--- sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m (revision 1660) +++++ sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m (working copy) ++@@ -19,88 +19,45 @@ ++ 02111-1307, USA. ++ */ ++ +++#ifdef HAVE_STRNDUP +++#define _GNU_SOURCE 1 +++#endif +++ +++#include +++ ++ #include "NGMimeHeaderFieldParser.h" ++ #include "NGMimeHeaderFields.h" ++ #include "NGMimeUtilities.h" ++ #include "common.h" ++-#include ++ +++#ifndef HAVE_STRNDUP +++char *strndup(const char *str, size_t len) +++{ +++ char *dup = (char *)malloc(len+1); +++ if (dup) { +++ strncpy(dup,str,len); +++ dup[len]= '\0'; +++ } +++ return dup; +++} +++#endif +++ ++ @implementation NGMimeRFC822DateHeaderFieldParser ++ ++-static Class CalDateClass = Nil; ++-static NSTimeZone *gmt = nil; ++-static NSTimeZone *gmt01 = nil; ++-static NSTimeZone *gmt02 = nil; ++-static NSTimeZone *gmt03 = nil; ++-static NSTimeZone *gmt04 = nil; ++-static NSTimeZone *gmt05 = nil; ++-static NSTimeZone *gmt06 = nil; ++-static NSTimeZone *gmt07 = nil; ++-static NSTimeZone *gmt08 = nil; ++-static NSTimeZone *gmt09 = nil; ++-static NSTimeZone *gmt10 = nil; ++-static NSTimeZone *gmt11 = nil; ++-static NSTimeZone *gmt12 = nil; ++-static NSTimeZone *gmt0530 = nil; ++-static NSTimeZone *gmtM01 = nil; ++-static NSTimeZone *gmtM02 = nil; ++-static NSTimeZone *gmtM03 = nil; ++-static NSTimeZone *gmtM04 = nil; ++-static NSTimeZone *gmtM05 = nil; ++-static NSTimeZone *gmtM06 = nil; ++-static NSTimeZone *gmtM07 = nil; ++-static NSTimeZone *gmtM08 = nil; ++-static NSTimeZone *gmtM09 = nil; ++-static NSTimeZone *gmtM10 = nil; ++-static NSTimeZone *gmtM11 = nil; ++-static NSTimeZone *gmtM12 = nil; ++-static NSTimeZone *gmtM13 = nil; ++-static NSTimeZone *gmtM14 = nil; ++-static NSTimeZone *met = nil; +++static NSTimeZone *gmt = nil; +++static NSTimeZone *met = nil; ++ ++ + (int)version { ++ return 2; ++ } +++ ++ + (void)initialize { ++ static BOOL didInit = NO; ++- Class TzClass; ++ if (didInit) return; ++ didInit = YES; ++ ++- CalDateClass = [NSCalendarDate class]; ++- ++- /* timezones which were actually used in a maillist mailbox */ ++- TzClass = [NSTimeZone class]; ++- gmt = [[TzClass timeZoneWithName:@"GMT"] retain]; ++- met = [[TzClass timeZoneWithName:@"MET"] retain]; ++- gmt01 = [[TzClass timeZoneForSecondsFromGMT: 1 * (60 * 60)] retain]; ++- gmt02 = [[TzClass timeZoneForSecondsFromGMT: 2 * (60 * 60)] retain]; ++- gmt03 = [[TzClass timeZoneForSecondsFromGMT: 3 * (60 * 60)] retain]; ++- gmt04 = [[TzClass timeZoneForSecondsFromGMT: 4 * (60 * 60)] retain]; ++- gmt05 = [[TzClass timeZoneForSecondsFromGMT: 5 * (60 * 60)] retain]; ++- gmt06 = [[TzClass timeZoneForSecondsFromGMT: 6 * (60 * 60)] retain]; ++- gmt07 = [[TzClass timeZoneForSecondsFromGMT: 7 * (60 * 60)] retain]; ++- gmt08 = [[TzClass timeZoneForSecondsFromGMT: 8 * (60 * 60)] retain]; ++- gmt09 = [[TzClass timeZoneForSecondsFromGMT: 9 * (60 * 60)] retain]; ++- gmt10 = [[TzClass timeZoneForSecondsFromGMT: 10 * (60 * 60)] retain]; ++- gmt11 = [[TzClass timeZoneForSecondsFromGMT: 11 * (60 * 60)] retain]; ++- gmt12 = [[TzClass timeZoneForSecondsFromGMT: 12 * (60 * 60)] retain]; ++- gmtM01 = [[TzClass timeZoneForSecondsFromGMT: -1 * (60 * 60)] retain]; ++- gmtM02 = [[TzClass timeZoneForSecondsFromGMT: -2 * (60 * 60)] retain]; ++- gmtM03 = [[TzClass timeZoneForSecondsFromGMT: -3 * (60 * 60)] retain]; ++- gmtM04 = [[TzClass timeZoneForSecondsFromGMT: -4 * (60 * 60)] retain]; ++- gmtM05 = [[TzClass timeZoneForSecondsFromGMT: -5 * (60 * 60)] retain]; ++- gmtM06 = [[TzClass timeZoneForSecondsFromGMT: -6 * (60 * 60)] retain]; ++- gmtM07 = [[TzClass timeZoneForSecondsFromGMT: -7 * (60 * 60)] retain]; ++- gmtM08 = [[TzClass timeZoneForSecondsFromGMT: -8 * (60 * 60)] retain]; ++- gmtM09 = [[TzClass timeZoneForSecondsFromGMT: -9 * (60 * 60)] retain]; ++- gmtM10 = [[TzClass timeZoneForSecondsFromGMT:-10 * (60 * 60)] retain]; ++- gmtM11 = [[TzClass timeZoneForSecondsFromGMT:-11 * (60 * 60)] retain]; ++- gmtM12 = [[TzClass timeZoneForSecondsFromGMT:-12 * (60 * 60)] retain]; ++- gmtM13 = [[TzClass timeZoneForSecondsFromGMT:-13 * (60 * 60)] retain]; ++- gmtM14 = [[TzClass timeZoneForSecondsFromGMT:-14 * (60 * 60)] retain]; ++- ++- gmt0530 = [[TzClass timeZoneForSecondsFromGMT:5 * (60*60) + (30*60)] retain]; +++ gmt = [[NSTimeZone timeZoneWithName:@"GMT"] retain]; +++ met = [[NSTimeZone timeZoneWithName:@"MET"] retain]; ++ } ++ ++ /* ++@@ -111,7 +68,7 @@ ++ TODO: use an own parser for that. ++ */ ++ ++-static int parseMonthOfYear(unsigned char *s, unsigned int len) { +++static int parseMonthOfYear(char *s, unsigned int len) { ++ /* ++ This one is *extremely* forgiving, it only checks what is ++ necessary for the set below. This should work for both, English ++@@ -147,162 +104,110 @@ ++ } ++ } ++ ++-static NSTimeZone *parseTimeZone(unsigned char *s, unsigned int len) { +++static int offsetFromTZAbbreviation(const char **p) { +++ NSString *abbreviation; +++ NSTimeZone *offsetTZ; +++ unsigned int length; +++ +++ length = 0; +++ while (isalpha(*(*p+length))) +++ length++; +++ abbreviation = [[NSString alloc] initWithBytes: *p +++ length: length - 1 +++ encoding: NSISOLatin1StringEncoding]; +++ offsetTZ = [NSTimeZone timeZoneWithAbbreviation: abbreviation]; +++ [abbreviation release]; +++ *p += length; +++ +++ return [offsetTZ secondsFromGMT]; +++} +++ +++static inline char *digitsString(const char *string) { +++ const char *p; +++ unsigned int len; +++ +++ p = string; +++ while (!isdigit(*p)) +++ p++; +++ len = 0; +++ while (isdigit(*(p + len))) +++ len++; +++ +++ return strndup(p, len); +++} +++ +++static NSTimeZone *parseTimeZone(const char *s, unsigned int len) { ++ /* ++ WARNING: failed to parse RFC822 timezone: '+0530' \ ++ (value='Tue, 13 Jul 2004 21:39:28 +0530') ++ TODO: this is because libFoundation doesn't accept 'GMT+0530' as input. ++ */ ++- char *p = (char *)s; +++ char *newString, *digits; +++ const char *p; ++ NSTimeZone *tz; ++- NSString *ts; ++- ++- if (len == 0) ++- return nil; ++- ++- if (*s == '+' || *s == '-') { ++- if (len == 3) { ++- if (p[1] == '0' && p[2] == '0') // '+00' or '-00' ++- return gmt; ++- if (*s == '+') { ++- if (p[1] == '0' && p[2] == '1') // '+01' ++- return gmt01; ++- if (p[1] == '0' && p[2] == '2') // '+02' ++- return gmt02; ++- } ++- } ++- else if (len == 5) { ++- if (p[3] == '0' && p[4] == '0' && p[1] == '0') { // '?0x00' ++- if (p[2] == '0') // '+0000' ++- return gmt; ++- ++- if (*s == '+') { ++- if (p[2] == '1') return gmt01; // '+0100' ++- if (p[2] == '2') return gmt02; // '+0200' ++- if (p[2] == '3') return gmt03; // '+0300' ++- if (p[2] == '4') return gmt04; // '+0400' ++- if (p[2] == '5') return gmt05; // '+0500' ++- if (p[2] == '6') return gmt06; // '+0600' ++- if (p[2] == '7') return gmt07; // '+0700' ++- if (p[2] == '8') return gmt08; // '+0800' ++- if (p[2] == '9') return gmt09; // '+0900' ++- } ++- else if (*s == '-') { ++- if (p[2] == '1') return gmtM01; // '-0100' ++- if (p[2] == '2') return gmtM02; // '-0200' ++- if (p[2] == '3') return gmtM03; // '-0300' ++- if (p[2] == '4') return gmtM04; // '-0400' ++- if (p[2] == '5') return gmtM05; // '-0500' ++- if (p[2] == '6') return gmtM06; // '-0600' ++- if (p[2] == '7') return gmtM07; // '-0700' ++- if (p[2] == '8') return gmtM08; // '-0800' ++- if (p[2] == '9') return gmtM09; // '-0900' ++- } ++- } ++- else if (p[3] == '0' && p[4] == '0' && p[1] == '1') { // "?1x00" ++- if (*s == '+') { ++- if (p[2] == '0') return gmt10; // '+1000' ++- if (p[2] == '1') return gmt11; // '+1100' ++- if (p[2] == '2') return gmt12; // '+1200' ++- } ++- else if (*s == '-') { ++- if (p[2] == '0') return gmtM10; // '-1000' ++- if (p[2] == '1') return gmtM11; // '-1100' ++- if (p[2] == '2') return gmtM12; // '-1200' ++- if (p[2] == '3') return gmtM13; // '-1300' ++- if (p[2] == '4') return gmtM14; // '-1400' ++- } ++- } ++- ++- /* special case for GMT+0530 */ ++- if (strncmp((char *)s, "+0530", 5) == 0) ++- return gmt0530; ++- } ++- else if (len == 7) { ++- /* ++- "MultiMail" submits timezones like this: ++- "Tue, 9 Mar 2004 9:43:00 -05-500", ++- don't know what the "-500" trailer is supposed to mean? Apparently ++- Thunderbird just uses the "-05", so do we. ++- */ ++- ++- if (isdigit(p[1]) && isdigit(p[2]) && (p[3] == '-'||p[3] == '+')) { ++- unsigned char tmp[8]; ++- ++- strncpy((char *)tmp, p, 3); ++- tmp[3] = '0'; ++- tmp[4] = '0'; ++- tmp[5] = '\0'; ++- return parseTimeZone(tmp, 5); ++- } ++- } +++ unsigned int hours, minutes, seconds, remaining; +++ int sign; +++ +++ sign = 1; +++ hours = 0; +++ minutes = 0; +++ seconds = 0; +++ +++ newString = strndup(s, len); +++ p = newString; +++ +++ if (isalpha(*p)) +++ seconds = offsetFromTZAbbreviation(&p); +++ while (isspace(*p)) +++ p++; +++ while (*p == '+' || *p == '-') { +++ if (*p == '-') +++ sign = -sign; +++ p++; ++ } ++- else if (*s == '0') { ++- if (len == 2) { // '00' ++- if (p[1] == '0') return gmt; ++- if (p[1] == '1') return gmt01; ++- if (p[1] == '2') return gmt02; ++- } ++- else if (len == 4) { ++- if (p[2] == '0' && p[3] == '0') { // '0x00' ++- if (p[1] == '0') return gmt; ++- if (p[1] == '1') return gmt01; ++- if (p[1] == '2') return gmt02; ++- } ++- } +++ digits = digitsString(p); +++ p = digits; +++ remaining = strlen(p); +++ switch(remaining) { +++ case 6: /* hhmmss */ +++ seconds += (10 * (*(p + remaining - 2) - 48) +++ + *(p + remaining - 1) - 48); +++ case 4: /* hhmm */ +++ hours += 10 * (*p - 48); +++ p++; +++ case 3: /* hmm */ +++ hours += (*p - 48); +++ p++; +++ minutes += 10 * (*p - 48) + *(p + 1) - 48; +++ break; +++ case 2: /* hh */ +++ hours += 10 * (*p - 48) + *(p + 1) - 48; +++ break; +++ default: +++ NSLog (@"parseTimeZone: cannot parse time notation '%s'", newString); ++ } ++- else if (len == 3) { ++- if (strcasecmp((char *)s, "GMT") == 0) return gmt; ++- if (strcasecmp((char *)s, "UTC") == 0) return gmt; ++- if (strcasecmp((char *)s, "MET") == 0) return met; ++- if (strcasecmp((char *)s, "CET") == 0) return met; ++- } ++- ++- if (isalpha(*s)) { ++- ts = [[NSString alloc] initWithCString:(char *)s length:len]; ++- } ++- else { ++- char buf[len + 5]; ++- ++- buf[0] = 'G'; buf[1] = 'M'; buf[2] = 'T'; ++- if (*s == '+' || *s == '-') { ++- strcpy(&(buf[3]), (char *)s); ++- } ++- else { ++- buf[3] = '+'; ++- strcpy(&(buf[4]), (char *)s); ++- } ++- ts = [[NSString alloc] initWithCString:buf]; ++- } ++-#if 1 ++- NSLog(@"%s: RFC822 TZ Parser: expensive: '%@'", __PRETTY_FUNCTION__, ts); ++-#endif ++- tz = [NSTimeZone timeZoneWithAbbreviation:ts]; ++- [ts release]; +++ free(digits); +++ +++ seconds += sign * (3600 * hours + 60 * minutes); +++ tz = [NSTimeZone timeZoneForSecondsFromGMT: seconds]; +++ free(newString); +++ ++ return tz; ++ } ++ ++ - (id)parseValue:(id)_data ofHeaderField:(NSString *)_field { ++ // TODO: use UNICODE ++ NSCalendarDate *date = nil; ++- unsigned char buf[256]; ++- unsigned char *bytes = buf, *pe; +++ char *bytes, *pe; ++ unsigned length = 0; ++ NSTimeZone *tz = nil; ++ char dayOfMonth, monthOfYear, hour, minute, second; ++ short year; ++ BOOL flag; ++- ++- if ((length = [_data cStringLength]) > 254) { ++- [self logWithFormat: ++- @"header field value to large for date parsing: '%@'(%i)", ++- _data, length]; ++- length = 254; ++- } ++- ++- [_data getCString:(char *)buf maxLength:length]; ++- buf[length] = '\0'; ++- +++ +++ length = [_data lengthOfBytesUsingEncoding: NSUTF8StringEncoding]; +++ bytes = [_data cStringUsingEncoding: NSUTF8StringEncoding]; +++ ++ /* remove leading chars (skip to first digit, the day of the month) */ ++ while (length > 0 && (!isdigit(*bytes))) { ++ bytes++; ++@@ -312,7 +217,7 @@ ++ if (length == 0) { ++ NSLog(@"WARNING(%s): empty value for header field %@ ..", ++ __PRETTY_FUNCTION__, _field); ++- return [CalDateClass date]; +++ return [NSCalendarDate date]; ++ } ++ ++ // TODO: should be a category on NSCalendarDate ++@@ -435,7 +340,8 @@ ++ for (pe = bytes; isalnum(*pe) || *pe == '-' || *pe == '+'; pe++) ++ ; ++ *pe = '\0'; ++- if ((tz = parseTimeZone(bytes, (pe - bytes))) == nil) { +++ if (pe == bytes +++ || (tz = parseTimeZone((const char *) bytes, (pe - bytes))) == nil) { ++ [self logWithFormat: ++ @"WARNING: failed to parse RFC822 timezone: '%s' (value='%@')", ++ bytes, _data]; ++@@ -444,9 +350,9 @@ ++ ++ /* construct and return */ ++ finished: ++- date = [CalDateClass dateWithYear:year month:monthOfYear day:dayOfMonth ++- hour:hour minute:minute second:second ++- timeZone:tz]; +++ date = [NSCalendarDate dateWithYear:year month:monthOfYear day:dayOfMonth +++ hour:hour minute:minute second:second +++ timeZone:tz]; ++ if (date == nil) goto failed; ++ ++ #if 0 ++Index: sope-mime/NGMime/NGMimeMultipartBodyParser.m ++=================================================================== ++--- sope-mime/NGMime/NGMimeMultipartBodyParser.m (revision 1660) +++++ sope-mime/NGMime/NGMimeMultipartBodyParser.m (working copy) ++@@ -428,6 +428,7 @@ ++ NSString *boundary = nil; ++ NSArray *rawBodyParts = nil; ++ BOOL foundError = NO; +++ NSData *boundaryBytes; ++ ++ contentType = [_part contentType]; ++ boundary = [contentType valueOfParameter:@"boundary"]; ++@@ -437,9 +438,10 @@ ++ ++ *(&foundError) = NO; ++ +++ boundaryBytes = [boundary dataUsingEncoding:NSISOLatin1StringEncoding]; ++ *(&rawBodyParts) = [self _parseBody:_body part:_part data:_data ++- boundary:[boundary cString] ++- length:[boundary cStringLength] +++ boundary:[boundaryBytes bytes] +++ length:[boundary length] ++ delegate:_d]; ++ ++ if (rawBodyParts) { ++Index: sope-mime/NGMime/NGMimeHeaderFieldGeneratorSet.m ++=================================================================== ++--- sope-mime/NGMime/NGMimeHeaderFieldGeneratorSet.m (revision 1660) +++++ sope-mime/NGMime/NGMimeHeaderFieldGeneratorSet.m (working copy) ++@@ -77,6 +77,7 @@ ++ [rfc822Set setGenerator:gen forField:@"bcc"]; ++ [rfc822Set setGenerator:gen forField:Fields->from]; ++ [rfc822Set setGenerator:gen forField:@"reply-to"]; +++ [rfc822Set setGenerator:gen forField:@"in-reply-to"]; ++ [rfc822Set setGenerator:gen forField:@"Disposition-Notification-To"]; ++ } ++ ++Index: sope-mime/NGMime/NGMimeType.m ++=================================================================== ++--- sope-mime/NGMime/NGMimeType.m (revision 1660) +++++ sope-mime/NGMime/NGMimeType.m (working copy) ++@@ -120,30 +120,27 @@ ++ ++ /* some unsupported, but known encoding */ ++ else if ([charset isEqualToString:@"ks_c_5601-1987"]) { ++- encoding = [NSString defaultCStringEncoding]; +++ encoding = NSISOLatin1StringEncoding; ++ foundUnsupported = YES; ++ } ++ else if ([charset isEqualToString:@"euc-kr"]) { ++- encoding = [NSString defaultCStringEncoding]; ++- foundUnsupported = YES; +++ encoding = NSKoreanEUCStringEncoding; ++ } ++ else if ([charset isEqualToString:@"big5"]) { ++- encoding = [NSString defaultCStringEncoding]; ++- foundUnsupported = YES; +++ encoding = NSBIG5StringEncoding; ++ } ++ else if ([charset isEqualToString:@"iso-2022-jp"]) { ++- encoding = [NSString defaultCStringEncoding]; ++- foundUnsupported = YES; +++ encoding = NSISO2022JPStringEncoding; ++ } ++ else if ([charset isEqualToString:@"gb2312"]) { ++- encoding = [NSString defaultCStringEncoding]; ++- foundUnsupported = YES; +++ encoding = NSGB2312StringEncoding; ++ } ++ else if ([charset isEqualToString:@"koi8-r"]) { ++- encoding = [NSString defaultCStringEncoding]; ++- foundUnsupported = YES; +++ encoding = NSKOI8RStringEncoding; ++ } ++- +++ else if ([charset isEqualToString:@"windows-1251"]) { +++ encoding = NSWindowsCP1251StringEncoding; +++ } ++ else if ([charset isEqualToString:@"windows-1252"]) { ++ encoding = NSWindowsCP1252StringEncoding; ++ } ++@@ -152,7 +149,7 @@ ++ } ++ else if ([charset isEqualToString:@"x-unknown"] || ++ [charset isEqualToString:@"unknown"]) { ++- encoding = NSASCIIStringEncoding; +++ encoding = NSISOLatin1StringEncoding; ++ } ++ /* ISO Latin 9 */ ++ #if !(NeXT_Foundation_LIBRARY || APPLE_Foundation_LIBRARY) ++@@ -166,7 +163,7 @@ ++ else { ++ [self logWithFormat:@"%s: unknown charset '%@'", ++ __PRETTY_FUNCTION__, _s]; ++- encoding = [NSString defaultCStringEncoding]; +++ encoding = NSISOLatin1StringEncoding; ++ } ++ return encoding; ++ } ++@@ -385,23 +382,26 @@ ++ } ++ ++ - (BOOL)valueNeedsQuotes:(NSString *)_parameterValue { ++- unsigned len = [_parameterValue cStringLength]; ++- char buf[len + 15]; ++- char *cstr; +++ NSData *stringData; +++ const char *cstr; +++ unsigned int count, max; +++ BOOL needsQuote; ++ ++- cstr = &(buf[0]); +++ needsQuote = NO; ++ ++- [_parameterValue getCString:cstr]; cstr[len] = '\0'; ++- while (*cstr) { ++- if (isMime_SpecialByte(*cstr)) ++- return YES; +++ stringData = [_parameterValue dataUsingEncoding:NSUTF8StringEncoding]; +++ cstr = [stringData bytes]; +++ max = [stringData length]; +++ count = 0; +++ while (!needsQuote && count < max) { +++ if (isMime_SpecialByte(*(cstr + count)) +++ || *(cstr + count) == 32) +++ needsQuote = YES; +++ else +++ count++; +++ } ++ ++- if (*cstr == 32) ++- return YES; ++- ++- cstr++; ++- } ++- return NO; +++ return needsQuote; ++ } ++ ++ - (NSString *)stringValue { ++Index: sope-mime/NGMime/NGMimeBodyPart.m ++=================================================================== ++--- sope-mime/NGMime/NGMimeBodyPart.m (revision 1660) +++++ sope-mime/NGMime/NGMimeBodyPart.m (working copy) ++@@ -31,18 +31,6 @@ ++ return 2; ++ } ++ ++-static NGMimeType *defaultType = nil; ++- ++-+ (void)initialize { ++- static BOOL isInitialized = NO; ++- if (!isInitialized) { ++- isInitialized = YES; ++- ++- defaultType = ++- [[NGMimeType mimeType:@"text/plain; charset=us-ascii"] retain]; ++- } ++-} ++- ++ + (id)bodyPartWithHeader:(NGHashMap *)_header { ++ return [[[self alloc] initWithHeader:_header] autorelease]; ++ } ++@@ -156,13 +144,12 @@ ++ if (!Fields) ++ Fields = (NGMimeHeaderNames *)[NGMimePartParser headerFieldNames]; ++ ++- ++ type = [self->header objectForKey:Fields->contentType]; ++ ++ if (![type isKindOfClass:[NGMimeType class]]) ++ type = [NGMimeType mimeType:[type stringValue]]; ++ ++- return (type != nil ? type : (id)defaultType); +++ return type; ++ } ++ ++ - (NSString *)contentId { ++Index: sope-mime/NGMime/ChangeLog ++=================================================================== ++--- sope-mime/NGMime/ChangeLog (revision 1660) +++++ sope-mime/NGMime/ChangeLog (working copy) ++@@ -1,3 +1,25 @@ +++2008-09-08 Wolfgang Sourdeau +++ +++ * NGMimeRFC822DateHeaderFieldParser.m ([NGMimeRFC +++ -parseValue:ofHeaderField:]): don't parse timezone with a length +++ of 0. +++ +++2008-09-01 Wolfgang Sourdeau +++ +++ * NGMimeRFC822DateHeaderFieldParser.m ([NGMimeRFC +++ -parseValue:ofHeaderField:]): use an 8-bit safe encoding when +++ parsing dates. Since we only consider 7-bits characters, we ensure +++ that bad user-agents can be handled more properly. +++ +++ * NGMimeType.m ([NGMimeType +stringEncodingForCharset:]): +++ x-unknown encoding is now translated to an 8-bit safe encoding +++ (NSISOLatin1StringEncoding). +++ +++ * NGMimeAddressHeaderFieldGenerator.m +++ ([NGMimeAddressHeaderFieldGenerator +++ -generateDataForHeaderFieldNamed:value:]): encode resulting string +++ in an 8-bit safe encoding (NSISOLatin1StringEncoding). +++ ++ 2008-01-29 Albrecht Dress ++ ++ * fixes for OGo bug #789 (reply-to QP encoding) ++Index: sope-mime/NGMime/NGMimeContentTypeHeaderFieldGenerator.m ++=================================================================== ++--- sope-mime/NGMime/NGMimeContentTypeHeaderFieldGenerator.m (revision 1660) +++++ sope-mime/NGMime/NGMimeContentTypeHeaderFieldGenerator.m (working copy) ++@@ -36,8 +36,7 @@ ++ NGMimeType *type = nil; // only one content-type field ++ NSString *tmp = nil; ++ NSMutableData *data = nil; ++- unsigned char *ctmp = NULL; ++- unsigned len = 0; +++ NSData *valueData; ++ ++ type = _value; ++ ++@@ -59,21 +58,15 @@ ++ ++ tmp = [type type]; ++ NSAssert(tmp, @"type should not be nil"); ++- len = [tmp length]; ++- ctmp = malloc(len + 4); ++- [tmp getCString:(char *)ctmp]; ctmp[len] = '\0'; ++- [data appendBytes:ctmp length:len]; ++- free(ctmp); +++ valueData = [tmp dataUsingEncoding: NSISOLatin1StringEncoding]; +++ [data appendData: valueData]; +++ +++ [data appendBytes:"/" length:1]; ++ ++- [data appendBytes:"//" length:1]; ++- ++ tmp = [type subType]; ++ if (tmp != nil) { ++- len = [tmp length]; ++- ctmp = malloc(len + 4); ++- [tmp getCString:(char *)ctmp]; ctmp[len] = '\0'; ++- [data appendBytes:ctmp length:len]; ++- free(ctmp); +++ valueData = [tmp dataUsingEncoding: NSISOLatin1StringEncoding]; +++ [data appendData:valueData]; ++ } ++ else ++ [data appendBytes:"*" length:1]; ++@@ -91,12 +84,9 @@ ++ continue; ++ } ++ [data appendBytes:"; " length:2]; ++- ++- len = [name cStringLength]; ++- ctmp = malloc(len + 1); ++- [name getCString:(char *)ctmp]; ctmp[len] = '\0'; ++- [data appendBytes:ctmp length:len]; ++- free(ctmp); +++ +++ valueData = [name dataUsingEncoding: NSUTF8StringEncoding]; +++ [data appendData: valueData]; ++ ++ /* ++ this confuses GroupWise: "= \"" (a space) ++@@ -105,66 +95,30 @@ ++ ++ /* check for encoding */ ++ { ++- unsigned cnt; +++ unsigned cnt, max; +++ const char *dataBytes; ++ BOOL doEnc; ++ ++- len = [value cStringLength]; ++- ctmp = malloc(len + 4); ++- [value getCString:(char *)ctmp]; ctmp[len] = '\0'; ++- cnt = 0; +++ valueData = [value dataUsingEncoding:NSUTF8StringEncoding]; +++ dataBytes = [valueData bytes]; +++ max = [valueData length]; +++ ++ doEnc = NO; ++- while (cnt < len) { ++- if ((unsigned char)ctmp[cnt] > 127) { +++ cnt = 0; +++ while (!doEnc && cnt < max) { +++ if ((unsigned char)dataBytes[cnt] > 127) ++ doEnc = YES; ++- break; ++- } ++- cnt++; +++ else +++ cnt++; ++ } ++ if (doEnc) { ++- unsigned char iso[] = "=?iso-8859-15?q?"; ++- unsigned isoLen = 16; ++- unsigned char isoEnd[] = "?="; ++- unsigned isoEndLen = 2; ++- unsigned desLen; ++- unsigned char *des; ++- ++- if (ctmp) free(ctmp); ++- { ++- NSData *data; ++- ++-#if APPLE_Foundation_LIBRARY || NeXT_Foundation_LIBRARY ++- data = [value dataUsingEncoding:NSISOLatin1StringEncoding]; ++-#else ++- data = [value dataUsingEncoding:NSISOLatin9StringEncoding]; ++-#endif ++- ++- len = [data length]; ++- ctmp = malloc(len + 10); ++- [data getBytes:ctmp]; ctmp[len] = '\0'; ++- } ++- ++- desLen = len * 3 + 20; ++- des = calloc(desLen + 10, sizeof(char)); ++- ++- memcpy(des, ctmp, cnt); ++- memcpy(des + cnt, iso, isoLen); ++- desLen = ++- NGEncodeQuotedPrintableMime(ctmp + cnt, len - cnt, ++- des + cnt + isoLen, ++- desLen - cnt - isoLen); ++- if ((int)desLen != -1) { ++- memcpy(des + cnt + isoLen + desLen, isoEnd, isoEndLen); ++- [data appendBytes:des length:(cnt + isoLen + desLen + isoEndLen)]; ++- } ++- else { ++- NSLog(@"WARNING: An error occour during quoted-printable decoding"); ++- } ++- if (des) free(des); +++ [data appendBytes:"=?utf-8?q?" length:10]; +++ [data appendData: [valueData dataByEncodingQuotedPrintable]]; +++ [data appendBytes:"?=" length:2]; ++ } ++ else { ++- [data appendBytes:ctmp length:len]; +++ [data appendData: valueData]; ++ } ++- free(ctmp); ++ } ++ [data appendBytes:"\"" length:1]; ++ } ++Index: sope-mime/NGMime/NGMimePartGenerator.m ++=================================================================== ++--- sope-mime/NGMime/NGMimePartGenerator.m (revision 1660) +++++ sope-mime/NGMime/NGMimePartGenerator.m (working copy) ++@@ -155,8 +155,9 @@ ++ BOOL isMultiValue, isFirst; ++ ++ /* get field name and strip leading spaces */ ++- fcname = (const unsigned char *)[_field cString]; ++- for (len = [_field cStringLength]; len > 0; fcname++, len--) { +++ fcname = (const unsigned char *)[_field cStringUsingEncoding:NSISOLatin1StringEncoding]; +++ for (len = [_field lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding]; +++ len > 0; fcname++, len--) { ++ if (*fcname != ' ') ++ break; ++ } ++@@ -328,7 +329,7 @@ ++ if ([body isKindOfClass:[NSData class]]) ++ data = body; ++ else if ([body isKindOfClass:[NSString class]]) ++- data = [body dataUsingEncoding:[NSString defaultCStringEncoding]]; +++ data = [body dataUsingEncoding: NSISOLatin1StringEncoding]; ++ else ++ data = nil; ++ ++Index: sope-mime/NGMime/NGMimeBodyParser.m ++=================================================================== ++--- sope-mime/NGMime/NGMimeBodyParser.m (revision 1660) +++++ sope-mime/NGMime/NGMimeBodyParser.m (working copy) ++@@ -67,7 +67,10 @@ ++ if (_data == nil) return nil; ++ ++ ctype = [_part contentType]; ++- +++ if (!ctype +++ && [_d respondsToSelector: @selector(parser:contentTypeOfPart:)]) +++ ctype = [_d parser: self contentTypeOfPart: _part]; +++ ++ if (![ctype isKindOfClass:[NGMimeType class]]) ++ ctype = [NGMimeType mimeType:[ctype stringValue]]; ++ ++@@ -88,10 +91,20 @@ ++ NSStringEncoding encoding; ++ ++ encoding = [NGMimeType stringEncodingForCharset:charset]; ++- +++ +++ // If we nave no encoding here, let's not simply return nil. +++ // We SHOULD try at least UTF-8 and after, Latin1. +++ if (!encoding) +++ encoding = NSUTF8StringEncoding; +++ ++ body = [[[NSString alloc] ++- initWithData:_data +++ initWithData:_data ++ encoding:encoding] autorelease]; +++ +++ if (!body) +++ body = [[[NSString alloc] initWithData:_data +++ encoding:NSISOLatin1StringEncoding] +++ autorelease]; ++ } ++ return body; ++ } ++Index: sope-mime/NGMime/NGMimePartParser.h ++=================================================================== ++--- sope-mime/NGMime/NGMimePartParser.h (revision 1660) +++++ sope-mime/NGMime/NGMimePartParser.h (working copy) ++@@ -117,6 +117,7 @@ ++ BOOL parserParseRawBodyDataOfPart:1; ++ BOOL parserBodyParserForPart:1; ++ BOOL parserDecodeBodyOfPart:1; +++ BOOL parserContentTypeOfPart:1; ++ } delegateRespondsTo; ++ ++ ++@@ -275,6 +276,9 @@ ++ - (id)parser:(NGMimePartParser *)_parser ++ bodyParserForPart:(id)_part; ++ +++- (NGMimeType *)parser:(id)_parser +++ contentTypeOfPart:(id)_part; +++ ++ @end /* NSObject(NGMimePartParserDelegate) */ ++ ++ @interface NSObject(NGMimePartParser) ++Index: sope-mime/NGMime/NGMimePartParser.m ++=================================================================== ++--- sope-mime/NGMime/NGMimePartParser.m (revision 1660) +++++ sope-mime/NGMime/NGMimePartParser.m (working copy) ++@@ -227,7 +227,7 @@ ++ } ++ ++ + (NSStringEncoding)defaultHeaderFieldEncoding { ++- return NSISOLatin1StringEncoding; +++ return NSUTF8StringEncoding; ++ } ++ ++ - (id)valueOfHeaderField:(NSString *)_name data:(id)_data { ++@@ -1091,7 +1091,10 @@ ++ id bodyParser = nil; ++ ++ ctype = [_p contentType]; ++- +++ if (!ctype +++ && self->delegateRespondsTo.parserContentTypeOfPart) +++ ctype = [self->delegate parser: self contentTypeOfPart: _p]; +++ ++ contentType = ([ctype isKindOfClass:[NGMimeType class]]) ++ ? ctype ++ : [NGMimeType mimeType:[ctype stringValue]]; ++Index: sope-mime/NGMime/NGMimeAddressHeaderFieldGenerator.m ++=================================================================== ++--- sope-mime/NGMime/NGMimeAddressHeaderFieldGenerator.m (revision 1660) +++++ sope-mime/NGMime/NGMimeAddressHeaderFieldGenerator.m (working copy) ++@@ -105,10 +105,10 @@ ++ } ++ ++ tmp = [obj displayName]; ++- bufLen = [tmp cStringLength]; +++ bufLen = [tmp lengthOfBytesUsingEncoding: NSUTF8StringEncoding]; ++ ++- buffer = calloc(bufLen + 10, sizeof(char)); ++- [tmp getCString:buffer]; +++ buffer = calloc(bufLen, sizeof(char)); +++ [tmp getCString: buffer maxLength: bufLen encoding: NSUTF8StringEncoding]; ++ ++ cnt = 0; ++ doEnc = NO; ++@@ -117,11 +117,11 @@ ++ /* must encode chars outside ASCII 33..60, 62..126 ranges [RFC 2045, Sect. 6.7] ++ * RFC 2047, Sect. 4.2 also requires chars 63 and 95 to be encoded ++ * For spaces, quotation is fine */ ++- if ((unsigned char)buffer[cnt] < 32 || ++- (unsigned char)buffer[cnt] == 61 || ++- (unsigned char)buffer[cnt] == 63 || ++- (unsigned char)buffer[cnt] == 95 || ++- (unsigned char)buffer[cnt] > 126) { +++ if ((unichar)buffer[cnt] < 32 || +++ (unichar)buffer[cnt] == 61 || +++ (unichar)buffer[cnt] == 63 || +++ (unichar)buffer[cnt] == 95 || +++ (unichar)buffer[cnt] > 126) { ++ doEnc = YES; ++ break; ++ } ++@@ -130,8 +130,13 @@ ++ ++ if (doEnc) { ++ /* FIXME - better use UTF8 encoding! */ +++#if NeXT_Foundation_LIBRARY ++ unsigned char iso[] = "=?iso-8859-15?q?"; ++ unsigned isoLen = 16; +++#else +++ unsigned char iso[] = "=?utf-8?q?"; +++ unsigned isoLen = 10; +++#endif ++ unsigned char isoEnd[] = "?="; ++ unsigned isoEndLen = 2; ++ unsigned desLen; ++@@ -141,10 +146,10 @@ ++ { ++ NSData *data; ++ ++-#if APPLE_Foundation_LIBRARY || NeXT_Foundation_LIBRARY +++#if NeXT_Foundation_LIBRARY ++ data = [tmp dataUsingEncoding:NSISOLatin1StringEncoding]; ++ #else ++- data = [tmp dataUsingEncoding:NSISOLatin9StringEncoding]; +++ data = [tmp dataUsingEncoding:NSUTF8StringEncoding]; ++ #endif ++ ++ bufLen = [data length]; ++@@ -162,8 +167,9 @@ ++ des + isoLen, desLen - isoLen); ++ if ((int)desLen != -1) { ++ memcpy(des + isoLen + desLen, isoEnd, isoEndLen); ++- tmp = [NSString stringWithCString:(char *)des ++- length:(isoLen + desLen + isoEndLen)]; +++ tmp = [[NSString alloc] initWithData: [NSData dataWithBytes:(char *)des length:(isoLen + desLen + isoEndLen)] +++ encoding: NSISOLatin1StringEncoding]; +++ [tmp autorelease]; ++ } ++ else { ++ [self warnWithFormat: ++@@ -190,11 +196,7 @@ ++ } ++ } ++ ++-#if APPLE_Foundation_LIBRARY || NeXT_Foundation_LIBRARY ++ data = [result dataUsingEncoding:NSISOLatin1StringEncoding]; ++-#else ++- data = [result dataUsingEncoding:NSISOLatin9StringEncoding]; ++-#endif ++ [result release]; ++ ++ return data; ++Index: sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m ++=================================================================== ++--- sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m (revision 1660) +++++ sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m (working copy) ++@@ -49,80 +49,70 @@ ++ ++ // TODO: move the stuff below to some NSString or NSData category? ++ ++- data = [NSMutableData dataWithCapacity:64]; +++ data = [NSMutableData dataWithCapacity: 64]; ++ tmp = [field type]; ++ [data appendBytes:[tmp cString] length:[tmp length]]; ++ tmp = [field filename]; ++ if (tmp != nil) { ++ [data appendBytes:"; " length:2]; ++ [data appendBytes:"filename=\"" length:10]; ++- { ++- unsigned char *ctmp; ++- int cnt, len; ++- BOOL doEnc; ++- ++- // TODO: unicode? ++- len = [tmp cStringLength]; ++- ctmp = malloc(len + 3); ++- [tmp getCString:(char *)ctmp]; ctmp[len] = '\0'; ++- cnt = 0; ++- doEnc = NO; ++- while (cnt < len) { ++- if ((unsigned char)ctmp[cnt] > 127) { ++- doEnc = YES; ++- break; ++- } ++- cnt++; +++ +++ NSData *d; +++ unsigned char* bytes; +++ unsigned length; +++ int cnt; +++ BOOL doEnc; +++ +++ //d = [tmp dataUsingEncoding: NSUTF8StringEncoding]; +++ //bytes = [d bytes]; +++ //length = [d length]; +++ bytes = [tmp cStringUsingEncoding: NSUTF8StringEncoding]; +++ length = strlen(bytes); +++ +++ cnt = 0; +++ doEnc = NO; +++ while (cnt < length) { +++ if ((unsigned char)bytes[cnt] > 127) { +++ doEnc = YES; +++ break; ++ } ++- if (doEnc) { ++- char iso[] = "=?iso-8859-15?q?"; ++- unsigned isoLen = 16; ++- char isoEnd[] = "?="; ++- unsigned isoEndLen = 2; ++- unsigned desLen; ++- char *des; ++- ++- if (ctmp) free(ctmp); ++- { ++- NSData *data; +++ cnt++; +++ } ++ ++-#if APPLE_Foundation_LIBRARY || NeXT_Foundation_LIBRARY ++- data = [tmp dataUsingEncoding:NSISOLatin1StringEncoding]; ++-#else ++- data = [tmp dataUsingEncoding:NSISOLatin9StringEncoding]; ++-#endif ++- ++- len = [data length]; ++- ctmp = malloc(len+1); ++- [data getBytes:ctmp]; ctmp[len] = '\0'; ++- } ++- ++- desLen = len * 3 + 20; ++- des = calloc(desLen + 10, sizeof(char)); ++- ++- memcpy(des, ctmp, cnt); ++- memcpy(des + cnt, iso, isoLen); ++- desLen = ++- NGEncodeQuotedPrintableMime((unsigned char *)ctmp + cnt, len - cnt, ++- (unsigned char *)des + cnt + isoLen, ++- desLen - cnt - isoLen); ++- if ((int)desLen != -1) { ++- memcpy(des + cnt + isoLen + desLen, isoEnd, isoEndLen); ++- [data appendBytes:des length:(cnt + isoLen + desLen + isoEndLen)]; ++- } ++- else { +++ if (doEnc) +++ { +++ char iso[] = "=?utf-8?q?"; +++ unsigned isoLen = 10; +++ char isoEnd[] = "?="; +++ unsigned isoEndLen = 2; +++ int desLen; +++ char *des; +++ +++ desLen = length * 3 + 20; +++ +++ des = calloc(desLen + 2, sizeof(char)); +++ +++ memcpy(des, iso, isoLen); +++ desLen = NGEncodeQuotedPrintableMime((unsigned char *)bytes, length, +++ (unsigned char *)(des + isoLen), +++ desLen - isoLen); +++ if (desLen != -1) { +++ memcpy(des + isoLen + desLen, isoEnd, isoEndLen); +++ [data appendBytes:des length:(isoLen + desLen + isoEndLen)]; +++ } +++ else { ++ [self logWithFormat:@"WARNING(%s:%i): An error occour during " ++ @"quoted-printable decoding", ++ __PRETTY_FUNCTION__, __LINE__]; ++- } ++- if (des) free(des); +++ if (des != NULL) free(des); +++ } ++ } ++- else { ++- [data appendBytes:ctmp length:len]; +++ else +++ { +++ [data appendBytes:[tmp cString] length:[tmp length]]; ++ } ++- } ++- // [data appendBytes:[tmp cString] length:[tmp length]]; ++- [data appendBytes:"\"" length:1]; +++ +++ [data appendBytes:"\"" length:1]; ++ } ++ return data; ++ } ++Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m ++=================================================================== ++--- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (revision 1660) +++++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (working copy) ++@@ -713,6 +713,39 @@ ++ return ms; ++ } ++ +++/* GCSEOAdaptorChannel protocol */ +++static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n" \ +++ @" c_name VARCHAR (256) NOT NULL PRIMARY KEY,\n" +++ @" c_content VARCHAR (100000) NOT NULL,\n" +++ @" c_creationdate INT4 NOT NULL,\n" +++ @" c_lastmodified INT4 NOT NULL,\n" +++ @" c_version INT4 NOT NULL,\n" +++ @" c_deleted INT4 NULL\n" +++ @")"); +++static NSString *sqlFolderACLFormat = (@"CREATE TABLE %@ (\n" \ +++ @" c_uid VARCHAR (256) NOT NULL,\n" +++ @" c_object VARCHAR (256) NOT NULL,\n" +++ @" c_role VARCHAR (80) NOT NULL\n" +++ @")"); +++ +++- (NSException *) createGCSFolderTableWithName: (NSString *) tableName +++{ +++ NSString *sql; +++ +++ sql = [NSString stringWithFormat: sqlFolderFormat, tableName]; +++ +++ return [self evaluateExpressionX: sql]; +++} +++ +++- (NSException *) createGCSFolderACLTableWithName: (NSString *) tableName +++{ +++ NSString *sql; +++ +++ sql = [NSString stringWithFormat: sqlFolderACLFormat, tableName]; +++ +++ return [self evaluateExpressionX: sql]; +++} +++ ++ @end /* PostgreSQL72Channel */ ++ ++ @implementation PostgreSQL72Channel(PrimaryKeyGeneration) ++Index: sope-gdl1/MySQL/MySQL4Channel.m ++=================================================================== ++--- sope-gdl1/MySQL/MySQL4Channel.m (revision 1660) +++++ sope-gdl1/MySQL/MySQL4Channel.m (working copy) ++@@ -755,6 +755,39 @@ ++ return pkey; ++ } ++ +++/* GCSEOAdaptorChannel protocol */ +++static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n" \ +++ @" c_name VARCHAR (256) NOT NULL PRIMARY KEY,\n" +++ @" c_content VARCHAR (100000) NOT NULL,\n" +++ @" c_creationdate INT NOT NULL,\n" +++ @" c_lastmodified INT NOT NULL,\n" +++ @" c_version INT NOT NULL,\n" +++ @" c_deleted INT NULL\n" +++ @")"); +++static NSString *sqlFolderACLFormat = (@"CREATE TABLE %@ (\n" \ +++ @" c_uid VARCHAR (256) NOT NULL,\n" +++ @" c_object VARCHAR (256) NOT NULL,\n" +++ @" c_role VARCHAR (80) NOT NULL\n" +++ @")"); +++ +++- (NSException *) createGCSFolderTableWithName: (NSString *) tableName +++{ +++ NSString *sql; +++ +++ sql = [NSString stringWithFormat: sqlFolderFormat, tableName]; +++ +++ return [self evaluateExpressionX: sql]; +++} +++ +++- (NSException *) createGCSFolderACLTableWithName: (NSString *) tableName +++{ +++ NSString *sql; +++ +++ sql = [NSString stringWithFormat: sqlFolderACLFormat, tableName]; +++ +++ return [self evaluateExpressionX: sql]; +++} +++ ++ @end /* MySQL4Channel */ ++ ++ void __link_MySQL4Channel() { ++Index: sope-gdl1/Oracle8/OracleAdaptorChannel.m ++=================================================================== ++--- sope-gdl1/Oracle8/OracleAdaptorChannel.m (revision 1660) +++++ sope-gdl1/Oracle8/OracleAdaptorChannel.m (working copy) ++@@ -1,7 +1,7 @@ ++ /* ++ ** OracleAdaptorChannel.m ++ ** ++-** Copyright (c) 2007 Inverse groupe conseil inc. and Ludovic Marcotte +++** Copyright (c) 2007-2009 Inverse inc. and Ludovic Marcotte ++ ** ++ ** Author: Ludovic Marcotte ++ ** ++@@ -30,6 +30,11 @@ ++ ++ #import ++ +++#include +++ +++static BOOL debugOn = NO; +++static int maxTry = 3; +++static int maxSleep = 500; ++ // ++ // ++ // ++@@ -41,10 +46,11 @@ ++ ++ @implementation OracleAdaptorChannel (Private) ++ ++-- (void) _cleanup +++- (void) _cleanup ++ { ++ column_info *info; ++ int c; +++ sword result; ++ ++ [_resultSetProperties removeAllObjects]; ++ ++@@ -58,11 +64,29 @@ ++ // so we just free the value instead. ++ if (info->value) ++ { ++- if (OCIDescriptorFree((dvoid *)info->value, (ub4)OCI_DTYPE_LOB) != OCI_SUCCESS) +++ if (info->type == SQLT_CLOB +++ || info->type == SQLT_BLOB +++ || info->type == SQLT_BFILEE +++ || info->type == SQLT_CFILEE) +++ { +++ result = OCIDescriptorFree((dvoid *)info->value, (ub4) OCI_DTYPE_LOB); +++ if (result != OCI_SUCCESS) +++ { +++ NSLog (@"value was not a LOB descriptor"); +++ abort(); +++ } +++ } +++ else ++ free(info->value); ++ info->value = NULL; ++ } ++- free(info); +++ else +++ { +++ NSLog (@"trying to free an already freed value!"); +++ abort(); +++ } +++ free(info); +++ ++ [_row_buffer removeObjectAtIndex: c]; ++ } ++ ++@@ -78,8 +102,7 @@ ++ // ++ @implementation OracleAdaptorChannel ++ ++-static void ++-DBTerminate() +++static void DBTerminate() ++ { ++ if (OCITerminate(OCI_DEFAULT)) ++ NSLog(@"FAILED: OCITerminate()"); ++@@ -89,6 +112,11 @@ ++ ++ + (void) initialize ++ { +++ NSUserDefaults *ud; +++ +++ ud = [NSUserDefaults standardUserDefaults]; +++ debugOn = [ud boolForKey: @"OracleAdaptorDebug"]; +++ ++ // We Initialize the OCI process environment. ++ if (OCIInitialize((ub4)OCI_DEFAULT, (dvoid *)0, ++ (dvoid * (*)(dvoid *, size_t)) 0, ++@@ -156,14 +184,17 @@ ++ [super closeChannel]; ++ ++ // We logoff from the database. ++- if (OCILogoff(_oci_ctx, _oci_err)) +++ if (!_oci_ctx || !_oci_err || OCILogoff(_oci_ctx, _oci_err)) ++ { ++ NSLog(@"FAILED: OCILogoff()"); ++ } ++ +++ if (_oci_ctx) +++ OCIHandleFree(_oci_ctx, OCI_HTYPE_SVCCTX); ++ ++- OCIHandleFree(_oci_ctx, OCI_HTYPE_SVCCTX); ++- OCIHandleFree(_oci_err, OCI_HTYPE_ERROR); +++ if (_oci_err) +++ OCIHandleFree(_oci_err, OCI_HTYPE_ERROR); +++ ++ // OCIHandleFree(_oci_env, OCI_HTYPE_ENV); ++ ++ _oci_ctx = (OCISvcCtx *)0; ++@@ -177,7 +208,8 @@ ++ // ++ - (void) dealloc ++ { ++- //NSLog(@"OracleAdaptorChannel: -dealloc"); +++ if (debugOn) +++ NSLog(@"OracleAdaptorChannel: -dealloc"); ++ ++ [self _cleanup]; ++ ++@@ -222,7 +254,7 @@ ++ { ++ EOAttribute *attribute; ++ OCIParam *param; ++- +++ int rCount; ++ column_info *info; ++ ub4 i, clen, count; ++ text *sql, *cname; ++@@ -231,6 +263,9 @@ ++ ++ [self _cleanup]; ++ +++ if (debugOn) +++ [self logWithFormat: @"expression: %@", theExpression]; +++ ++ if (!theExpression || ![theExpression length]) ++ { ++ [NSException raise: @"OracleInvalidExpressionException" ++@@ -244,7 +279,9 @@ ++ } ++ ++ sql = (text *)[theExpression UTF8String]; ++- +++ +++ rCount = 0; +++ retry: ++ // We alloc our statement handle ++ if ((status = OCIHandleAlloc((dvoid *)_oci_env, (dvoid **)&_current_stm, (ub4)OCI_HTYPE_STMT, (CONST size_t) 0, (dvoid **) 0))) ++ { ++@@ -264,13 +301,39 @@ ++ // We check if we're doing a SELECT and if so, we're fetching data! ++ OCIAttrGet(_current_stm, OCI_HTYPE_STMT, &type, 0, OCI_ATTR_STMT_TYPE, _oci_err); ++ self->isFetchInProgress = (type == OCI_STMT_SELECT ? YES : NO); ++- +++ ++ // We execute our statement. Not that we _MUST_ set iter to 0 for non-SELECT statements. ++ if ((status = OCIStmtExecute(_oci_ctx, _current_stm, _oci_err, (self->isFetchInProgress ? (ub4)0 : (ub4)1), (ub4)0, (CONST OCISnapshot *)NULL, (OCISnapshot *)NULL, ++ ([(OracleAdaptorContext *)[self adaptorContext] autoCommit] ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT)))) ++ { +++ ub4 serverStatus; +++ ++ checkerr(_oci_err, status); ++ NSLog(@"Statement execute failed (OCI_ERROR): %@", theExpression); +++ +++ // We check to see if we lost connection and need to reconnect. +++ serverStatus = 0; +++ OCIAttrGet((dvoid *)_oci_env, OCI_HTYPE_SERVER, (dvoid *)&serverStatus, (ub4 *)0, OCI_ATTR_SERVER_STATUS, _oci_err); +++ +++ if (serverStatus == OCI_SERVER_NOT_CONNECTED) +++ { +++ // We cleanup our previous handles +++ [self cancelFetch]; +++ [self closeChannel]; +++ +++ // We try to reconnect a couple of times before giving up... +++ while (rCount < maxTry) +++ { +++ usleep(maxSleep); +++ rCount++; +++ +++ if ([self openChannel]) +++ { +++ NSLog(@"Connection re-established to Oracle - retrying to process the statement."); +++ goto retry; +++ } +++ } +++ } ++ return NO; ++ } ++ ++@@ -302,7 +365,9 @@ ++ // We read the maximum width of a column ++ info->max_width = 0; ++ status = OCIAttrGet((dvoid*)param, (ub4)OCI_DTYPE_PARAM, (dvoid*)&(info->max_width), (ub4 *)0, (ub4)OCI_ATTR_DATA_SIZE, (OCIError *)_oci_err); ++- +++ +++ if (debugOn) +++ NSLog(@"name: %s, type: %d", cname, info->type); ++ attribute = [EOAttribute attributeWithOracleType: info->type name: cname length: clen width: info->max_width]; ++ [_resultSetProperties addObject: attribute]; ++ ++@@ -394,16 +459,17 @@ ++ return NO; ++ } ++ ++- ++ if (OCIEnvInit((OCIEnv **)&_oci_env, (ub4)OCI_DEFAULT, (size_t)0, (dvoid **)0)) ++ { ++ NSLog(@"FAILED: OCIEnvInit()"); +++ [self closeChannel]; ++ return NO; ++ } ++ ++ if (OCIHandleAlloc((dvoid *)_oci_env, (dvoid *)&_oci_err, (ub4)OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0)) ++ { ++ NSLog(@"FAILED: OCIHandleAlloc() on errhp"); +++ [self closeChannel]; ++ return NO; ++ } ++ ++@@ -414,7 +480,10 @@ ++ // Under Oracle 10g, the third parameter of OCILogon() has the form: [//]host[:port][/service_name] ++ // See http://download-west.oracle.com/docs/cd/B12037_01/network.101/b10775/naming.htm#i498306 for ++ // all juicy details. ++- database = [[NSString stringWithFormat:@"%@:%@", [o serverName], [o port]] UTF8String]; +++ if ([o serverName] && [o port]) +++ database = [[NSString stringWithFormat:@"%@:%@/%@", [o serverName], [o port], [o databaseName]] UTF8String]; +++ else +++ database = [[o databaseName] UTF8String]; ++ ++ // We logon to the database. ++ if (OCILogon(_oci_env, _oci_err, &_oci_ctx, (const OraText*)username, strlen(username), ++@@ -422,6 +491,7 @@ ++ { ++ NSLog(@"FAILED: OCILogon(). username = %s password = %s" ++ @" database = %s", username, password, database); +++ [self closeChannel]; ++ return NO; ++ } ++ ++@@ -438,6 +508,11 @@ ++ { ++ sword status; ++ +++ // We check if our connection is open prior to trying to fetch any data. OCIStmtFetch2() returns +++ // NO error code if the OCI environment is set up but the OCILogon() has failed. +++ if (![self isOpen]) +++ return nil; +++ ++ status = OCIStmtFetch2(_current_stm, _oci_err, (ub4)1, (ub4)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT); ++ ++ if (status == OCI_NO_DATA) ++@@ -609,7 +684,7 @@ ++ ++ /* GCSEOAdaptorChannel protocol */ ++ static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n" \ ++- @" c_name VARCHAR2 (256) NOT NULL,\n" +++ @" c_name VARCHAR2 (256) NOT NULL PRIMARY KEY,\n" ++ @" c_content CLOB NOT NULL,\n" ++ @" c_creationdate INTEGER NOT NULL,\n" ++ @" c_lastmodified INTEGER NOT NULL,\n" ++Index: sope-gdl1/Oracle8/OracleAdaptorChannelController.m ++=================================================================== ++--- sope-gdl1/Oracle8/OracleAdaptorChannelController.m (revision 1660) +++++ sope-gdl1/Oracle8/OracleAdaptorChannelController.m (working copy) ++@@ -31,6 +31,8 @@ ++ #import ++ #import ++ +++static BOOL debugOn = NO; +++ ++ // ++ // ++ // ++@@ -48,6 +50,14 @@ ++ // ++ @implementation OracleAdaptorChannelController ++ ++++ (void) initialize +++{ +++ NSUserDefaults *ud; +++ +++ ud = [NSUserDefaults standardUserDefaults]; +++ debugOn = [ud boolForKey: @"OracleAdaptorDebug"]; +++} +++ ++ - (EODelegateResponse) adaptorChannel: (id) theChannel ++ willInsertRow: (NSMutableDictionary *) theRow ++ forEntity: (EOEntity *) theEntity ++@@ -56,7 +66,8 @@ ++ NSArray *keys; ++ int i, c; ++ ++- NSLog(@"willInsertRow: %@ %@", [theRow description], [theEntity description]); +++ if (debugOn) +++ NSLog(@"willInsertRow: %@ %@", [theRow description], [theEntity description]); ++ ++ s = AUTORELEASE([[NSMutableString alloc] init]); ++ ++@@ -101,7 +112,8 @@ ++ NSArray *keys; ++ int i, c; ++ ++- NSLog(@"willUpdatetRow: %@ %@", [theRow description], [theQualifier description]); +++ if (debugOn) +++ NSLog(@"willUpdateRow: %@ %@", [theRow description], [theQualifier description]); ++ ++ s = AUTORELEASE([[NSMutableString alloc] init]); ++ ++Index: sope-core/NGExtensions/NGExtensions/NSString+Ext.h ++=================================================================== ++--- sope-core/NGExtensions/NGExtensions/NSString+Ext.h (revision 1660) +++++ sope-core/NGExtensions/NGExtensions/NSString+Ext.h (working copy) ++@@ -30,6 +30,7 @@ ++ ++ @interface NSString(GSAdditions) ++ +++#if !GNUSTEP ++ - (NSString *)stringWithoutPrefix:(NSString *)_prefix; ++ - (NSString *)stringWithoutSuffix:(NSString *)_suffix; ++ ++@@ -39,6 +40,7 @@ ++ - (NSString *)stringByTrimmingLeadSpaces; ++ - (NSString *)stringByTrimmingTailSpaces; ++ - (NSString *)stringByTrimmingSpaces; +++#endif /* !GNUSTEP */ ++ ++ /* the following are not available in gstep-base 1.6 ? */ ++ - (NSString *)stringByTrimmingLeadWhiteSpaces; ++@@ -47,6 +49,8 @@ ++ ++ @end /* NSString(GSAdditions) */ ++ +++#if !GNUSTEP +++ ++ @interface NSMutableString(GNUstepCompatibility) ++ ++ - (void)trimLeadSpaces; ++@@ -55,6 +59,8 @@ ++ ++ @end /* NSMutableString(GNUstepCompatibility) */ ++ +++#endif /* !GNUSTEP */ +++ ++ #endif ++ ++ /* specific to libFoundation */ ++Index: sope-core/NGExtensions/FdExt.subproj/NSString+Ext.m ++=================================================================== ++--- sope-core/NGExtensions/FdExt.subproj/NSString+Ext.m (revision 1660) +++++ sope-core/NGExtensions/FdExt.subproj/NSString+Ext.m (working copy) ++@@ -39,18 +39,6 @@ ++ : (NSString *)[[self copy] autorelease]; ++ } ++ ++-- (NSString *)stringByReplacingString:(NSString *)_orignal ++- withString:(NSString *)_replacement ++-{ ++- /* very slow solution .. */ ++- ++- if ([self rangeOfString:_orignal].length == 0) ++- return [[self copy] autorelease]; ++- ++- return [[self componentsSeparatedByString:_orignal] ++- componentsJoinedByString:_replacement]; ++-} ++- ++ - (NSString *)stringByTrimmingLeadWhiteSpaces ++ { ++ // should check 'whitespaceAndNewlineCharacterSet' .. ++@@ -96,6 +84,25 @@ ++ return [[self copy] autorelease]; ++ } ++ +++- (NSString *)stringByTrimmingWhiteSpaces +++{ +++ return [[self stringByTrimmingTailWhiteSpaces] +++ stringByTrimmingLeadWhiteSpaces]; +++} +++ +++#ifndef GNUSTEP +++- (NSString *)stringByReplacingString:(NSString *)_orignal +++ withString:(NSString *)_replacement +++{ +++ /* very slow solution .. */ +++ +++ if ([self rangeOfString:_orignal].length == 0) +++ return [[self copy] autorelease]; +++ +++ return [[self componentsSeparatedByString:_orignal] +++ componentsJoinedByString:_replacement]; +++} +++ ++ - (NSString *)stringByTrimmingLeadSpaces ++ { ++ unsigned len; ++@@ -117,6 +124,7 @@ ++ else ++ return [[self copy] autorelease]; ++ } +++ ++ - (NSString *)stringByTrimmingTailSpaces ++ { ++ unsigned len; ++@@ -139,19 +147,17 @@ ++ return [[self copy] autorelease]; ++ } ++ ++-- (NSString *)stringByTrimmingWhiteSpaces ++-{ ++- return [[self stringByTrimmingTailWhiteSpaces] ++- stringByTrimmingLeadWhiteSpaces]; ++-} ++ - (NSString *)stringByTrimmingSpaces ++ { ++ return [[self stringByTrimmingTailSpaces] ++ stringByTrimmingLeadSpaces]; ++ } +++#endif ++ ++ @end /* NSString(GSAdditions) */ ++ +++#if !GNUSTEP +++ ++ @implementation NSMutableString(GNUstepCompatibility) ++ ++ - (void)trimLeadSpaces ++@@ -169,6 +175,8 @@ ++ ++ @end /* NSMutableString(GNUstepCompatibility) */ ++ +++#endif /* !GNUSTEP */ +++ ++ @implementation NSString(lfNSURLUtilities) ++ ++ - (BOOL)isAbsoluteURL ++Index: sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m ++=================================================================== ++--- sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m (revision 1660) +++++ sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m (working copy) ++@@ -140,8 +140,12 @@ ++ ++ ++ #ifdef __linux__ +++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ static NSString *unicharEncoding = @"UCS-2LE"; ++ #else +++static NSString *unicharEncoding = @"UCS-2BE"; +++#endif /* __BYTE_ORDER */ +++#else ++ static NSString *unicharEncoding = @"UCS-2-INTERNAL"; ++ #endif ++ static int IconvLogEnabled = -1; ++@@ -149,21 +153,12 @@ ++ static void checkDefaults(void) { ++ NSUserDefaults *ud; ++ ++- if (IconvLogEnabled != -1) ++- return; ++- ud = [NSUserDefaults standardUserDefaults]; ++- IconvLogEnabled = [ud boolForKey:@"IconvLogEnabled"]?1:0; +++ if (IconvLogEnabled == -1) { +++ ud = [NSUserDefaults standardUserDefaults]; +++ IconvLogEnabled = [ud boolForKey:@"IconvLogEnabled"]?1:0; ++ ++-#ifdef __linux__ ++- if (NSHostByteOrder() == NS_BigEndian) { ++- NSLog(@"Note: using UCS-2 big endian on Linux."); ++- unicharEncoding = @"UCS-2BE"; +++ NSLog(@"Note: using '%@' on Linux.", unicharEncoding); ++ } ++- else { ++- NSLog(@"Note: using UCS-2 little endian on Linux."); ++- unicharEncoding = @"UCS-2LE"; ++- } ++-#endif ++ } ++ ++ static char *iconv_wrapper(id self, char *_src, unsigned _srcLen, ++Index: sope-core/NGExtensions/EOExt.subproj/EOGlobalID+Ext.m ++=================================================================== ++--- sope-core/NGExtensions/EOExt.subproj/EOGlobalID+Ext.m (revision 1660) +++++ sope-core/NGExtensions/EOExt.subproj/EOGlobalID+Ext.m (working copy) ++@@ -19,6 +19,7 @@ ++ 02111-1307, USA. ++ */ ++ +++#import ++ #import ++ #import ++ ++Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h ++=================================================================== ++--- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h (revision 1660) +++++ sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h (working copy) ++@@ -19,6 +19,8 @@ ++ 02111-1307, USA. ++ */ ++ +++#include +++ ++ #include ++ #include ++ #include ++@@ -34,7 +36,7 @@ ++ ++ @interface libxmlHTMLSAXDriver : NSObject < SaxXMLReader > ++ { ++- id contentHandler; +++ NSObject *contentHandler; ++ id dtdHandler; ++ id errorHandler; ++ id entityResolver; ++Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m ++=================================================================== ++--- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m (revision 1660) +++++ sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m (working copy) ++@@ -200,10 +200,10 @@ ++ return self->entityResolver; ++ } ++ ++-- (void)setContentHandler:(id)_handler { +++- (void)setContentHandler:(NSObject *)_handler { ++ ASSIGN(self->contentHandler, _handler); ++ } ++-- (id)contentHandler { +++- (NSObject *)contentHandler { ++ return self->contentHandler; ++ } ++ ++Index: sope-appserver/mod_ngobjweb/GNUmakefile ++=================================================================== ++--- sope-appserver/mod_ngobjweb/GNUmakefile (revision 1660) +++++ sope-appserver/mod_ngobjweb/GNUmakefile (working copy) ++@@ -82,7 +82,7 @@ ++ ++ CFLAGS = -Wall -I. -fPIC \ ++ $(APXS_CFLAGS) $(APR_CFLAGS) \ ++- $(APXS_INCLUDE_DIRS) $(APR_INCLUDE_DIRS) +++ $(APXS_INCLUDE_DIRS) $(APR_INCLUDE_DIRS) -O0 -ggdb ++ ++ LDFLAGS = $(APXS_LDFLAGS) $(APR_LDFLAGS) -shared -fPIC ++ LDLIBS = $(APXS_LIBS) $(APR_LIBS) ++@@ -111,8 +111,7 @@ ++ apache-dir : ++ $(MKDIRS) $(GNUSTEP_INSTALLATION_DIR) ++ ++-install :: apache-dir all ++- $(INSTALL_PROGRAM) $(product) $(GNUSTEP_INSTALLATION_DIR) +++install :: ++ ++ install-usr-libexec :: all ++ $(INSTALL_PROGRAM) $(product) /usr/libexec/httpd/ ++Index: sope-appserver/NGObjWeb/GNUmakefile.postamble ++=================================================================== ++--- sope-appserver/NGObjWeb/GNUmakefile.postamble (revision 1660) +++++ sope-appserver/NGObjWeb/GNUmakefile.postamble (working copy) ++@@ -23,14 +23,20 @@ ++ ++ # install makefiles ++ ++-after-install :: ++- $(MKDIRS) $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ ++- $(INSTALL_DATA) ngobjweb.make $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make +++after-install :: $(DESTDIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make ++ ++ ifneq ($(GNUSTEP_MAKE_VERSION),1.3.0) ++-after-install :: +++after-install :: $(DESTDIR)/$(GNUSTEP_MAKEFILES)/woapp.make $(DESTDIR)/$(GNUSTEP_MAKEFILES)/wobundle.make +++endif +++ +++$(DESTDIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make: ngobjweb.make +++ $(MKDIRS) $(DESTDIR)/$(GNUSTEP_MAKEFILES)/Additional/ +++ $(INSTALL_DATA) ngobjweb.make $(DESTDIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make +++ +++$(DESTDIR)/$(GNUSTEP_MAKEFILES)/woapp.make: woapp-gs.make ++ $(INSTALL_DATA) woapp-gs.make \ ++- $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make +++ $(DESTDIR)/$(GNUSTEP_MAKEFILES)/woapp.make +++ +++$(DESTDIR)/$(GNUSTEP_MAKEFILES)/wobundle.make: wobundle-gs.make ++ $(INSTALL_DATA) wobundle-gs.make \ ++- $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make ++-endif +++ $(DESTDIR)/$(GNUSTEP_MAKEFILES)/wobundle.make ++Index: sope-appserver/NGObjWeb/ChangeLog ++=================================================================== ++--- sope-appserver/NGObjWeb/ChangeLog (revision 1660) +++++ sope-appserver/NGObjWeb/ChangeLog (working copy) ++@@ -1,3 +1,22 @@ +++2009-07-02 Wolfgang Sourdeau +++ +++ * WOMessage.m (-setHeaders:, -setHeader:forKey:, headerForKey:, +++ -appendHeader:forKey:, -appendHeaders:forKey:, setHeaders:forKey:, +++ -headersForKey:): convert the specified header key to lowercase, +++ to ensure they are managed case-insensitively. +++ * WOHttpAdaptor/WOHttpTransaction.m +++ (-deliverResponse:toRequest:onStream:): if the content-type is +++ specified and already has "text/plain" as prefix, we don't +++ override it. +++ +++2009-07-01 Wolfgang Sourdeau +++ +++ * WOHttpAdaptor/WOHttpTransaction.m +++ (-deliverResponse:toRequest:onStream:): we test the content-length +++ and impose a content-type of text/plain when 0. This work-arounds +++ a bug in Mozilla clients where empty responses with a content-type +++ set to X/xml will trigger an exception. +++ ++ 2009-06-10 Helge Hess ++ ++ * DAVPropMap.plist: mapped {DAV:}current-user-principal (v4.9.37) ++Index: sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m ++=================================================================== ++--- sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m (revision 1660) +++++ sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m (working copy) ++@@ -49,6 +49,8 @@ ++ #define XMLNS_INTTASK \ ++ @"{http://schemas.microsoft.com/mapi/id/{00062003-0000-0000-C000-000000000046}/}" ++ +++static Class NSURLKlass = Nil; +++ ++ @interface SoWebDAVRenderer(Privates) ++ - (BOOL)renderStatusResult:(id)_object withDefaultStatus:(int)_defStatus ++ inContext:(WOContext *)_ctx; ++@@ -79,6 +81,8 @@ ++ ++ if ((debugOn = [ud boolForKey:@"SoRendererDebugEnabled"])) ++ NSLog(@"enabled debugging in SoWebDAVRenderer (SoRendererDebugEnabled)"); +++ +++ NSURLKlass = [NSURL class]; ++ } ++ ++ + (id)sharedRenderer { ++@@ -616,16 +620,19 @@ ++ [r appendContentString:s]; ++ } ++ else { +++ s = [self stringForValue:value ofProperty:_key prefixes:nsToPrefix]; ++ [r appendContentCharacter:'<']; ++ [r appendContentString:extName]; ++- [r appendContentCharacter:'>']; ++- ++- s = [self stringForValue:value ofProperty:_key prefixes:nsToPrefix]; ++- [r appendContentString:s]; ++- ++- [r appendContentString:@""]; +++ if ([s length] > 0) { +++ [r appendContentCharacter:'>']; +++ [r appendContentString:s]; +++ [r appendContentString:@""]; +++ } +++ else { +++ [r appendContentString:@"/>"]; +++ } ++ if (formatOutput) [r appendContentCharacter:'\n']; ++ } ++ } ++@@ -694,8 +701,13 @@ ++ } ++ ++ /* tidy href */ ++- href = [self tidyHref:href baseURL:baseURL]; ++- +++ if (useRelativeURLs) { +++ if ([href isKindOfClass: NSURLKlass]) +++ href = [href path]; +++ } +++ else +++ href = [self tidyHref:href baseURL:baseURL]; +++ ++ /* tidy status */ ++ stat = [self tidyStatus:stat]; ++ } ++Index: sope-appserver/NGObjWeb/WODirectAction.m ++=================================================================== ++--- sope-appserver/NGObjWeb/WODirectAction.m (revision 1660) +++++ sope-appserver/NGObjWeb/WODirectAction.m (working copy) ++@@ -46,7 +46,7 @@ ++ } ++ - (id)initWithContext:(WOContext *)_ctx { ++ if ((self = [self initWithRequest:[_ctx request]])) { ++- self->context = [_ctx retain]; +++ self->context = _ctx; ++ } ++ return self; ++ } ++@@ -54,16 +54,16 @@ ++ return [self initWithRequest:nil]; ++ } ++ ++-- (void)dealloc { ++- [self->context release]; ++- [super dealloc]; ++-} +++// - (void)dealloc { +++// [self->context release]; +++// [super dealloc]; +++// } ++ ++ /* accessors */ ++ ++ - (WOContext *)context { ++ if (self->context == nil) ++- self->context = [[[WOApplication application] context] retain]; +++ self->context = [[WOApplication application] context]; ++ return self->context; ++ } ++ ++Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m ++=================================================================== ++--- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (revision 1660) +++++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (working copy) ++@@ -216,6 +216,12 @@ ++ assocCount++; ++ } ++ } +++ if (count > 0) { +++ if ((self->isAbsolute = OWGetProperty(_config, @"absolute"))) { +++ count--; +++ assocCount++; +++ } +++ } ++ ++ self->rest = _config; ++ ++Index: sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m ++=================================================================== ++--- sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (revision 1660) +++++ sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (working copy) ++@@ -41,6 +41,7 @@ ++ WOAssociation *string; ++ WOAssociation *target; ++ WOAssociation *disabled; +++ WOAssociation *isAbsolute; ++ WOElement *template; ++ ++ /* new in WO4: */ ++@@ -360,6 +361,7 @@ ++ { ++ if ((self = [super initWithName:_name hyperlinkInfo:_info template:_t])) { ++ self->href = _info->href; +++ self->isAbsolute = _info->isAbsolute; ++ } ++ return self; ++ } ++@@ -375,8 +377,11 @@ ++ // TODO: we need a binding to disable rewriting! ++ NSRange r; ++ +++ if ([[self->isAbsolute valueInContext:_ctx] boolValue] == YES) +++ return NO; +++ ++ r.length = [_s length]; ++- +++ ++ /* do not rewrite pure fragment URLs */ ++ if (r.length > 0 && [_s characterAtIndex:0] == '#') ++ return NO; ++Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h ++=================================================================== ++--- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (revision 1660) +++++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (working copy) ++@@ -41,7 +41,8 @@ ++ WOAssociation *pageName; ++ WOAssociation *actionClass; ++ WOAssociation *directActionName; ++- +++ WOAssociation *isAbsolute; +++ ++ BOOL sidInUrl; ++ ++ /* 'ivar' associations */ ++Index: sope-appserver/NGObjWeb/WOMessage.m ++=================================================================== ++--- sope-appserver/NGObjWeb/WOMessage.m (revision 1660) +++++ sope-appserver/NGObjWeb/WOMessage.m (working copy) ++@@ -182,7 +182,7 @@ ++ NSString *key; ++ ++ keys = [_headers keyEnumerator]; ++- while ((key = [keys nextObject])) { +++ while ((key = [[keys nextObject] lowercaseString])) { ++ id value; ++ ++ value = [_headers objectForKey:key]; ++@@ -198,34 +198,39 @@ ++ } ++ ++ - (void)setHeader:(NSString *)_header forKey:(NSString *)_key { ++- [self->header setObject:[_header stringValue] forKey:_key]; +++ [self->header setObject:[_header stringValue] +++ forKey:[_key lowercaseString]]; ++ } ++ - (NSString *)headerForKey:(NSString *)_key { ++- return [[self->header objectEnumeratorForKey:_key] nextObject]; +++ return [[self->header objectEnumeratorForKey:[_key lowercaseString]] +++ nextObject]; ++ } ++ ++ - (void)appendHeader:(NSString *)_header forKey:(NSString *)_key { ++- [self->header addObject:_header forKey:_key]; +++ [self->header addObject:_header forKey:[_key lowercaseString]]; ++ } ++ - (void)appendHeaders:(NSArray *)_headers forKey:(NSString *)_key { ++- [self->header addObjects:_headers forKey:_key]; +++ [self->header addObjects:_headers forKey:[_key lowercaseString]]; ++ } ++ ++ - (void)setHeaders:(NSArray *)_headers forKey:(NSString *)_key { ++ NSEnumerator *e; ++ id value; +++ NSString *lowerKey; ++ +++ lowerKey = [_key lowercaseString]; ++ e = [_headers objectEnumerator]; ++ ++- [self->header removeAllObjectsForKey:_key]; +++ [self->header removeAllObjectsForKey:lowerKey]; ++ ++ while ((value = [e nextObject])) ++- [self->header addObject:value forKey:_key]; +++ [self->header addObject:value forKey:lowerKey]; ++ } ++ - (NSArray *)headersForKey:(NSString *)_key { ++ NSEnumerator *values; ++ ++- if ((values = [self->header objectEnumeratorForKey:_key])) { +++ if ((values +++ = [self->header objectEnumeratorForKey:[_key lowercaseString]])) { ++ NSMutableArray *array = nil; ++ id value = nil; ++ ++@@ -243,17 +248,14 @@ ++ NSEnumerator *values; ++ ++ if ((values = [self->header keyEnumerator])) { ++- NSMutableArray *array = nil; +++ NSMutableArray *array; ++ id name = nil; ++- array = [[NSMutableArray alloc] init]; ++- +++ array = [NSMutableArray array]; +++ ++ while ((name = [values nextObject])) ++ [array addObject:name]; ++ ++- name = [array copy]; ++- [array release]; ++- ++- return [name autorelease]; +++ return array; ++ } ++ return nil; ++ } ++Index: sope-appserver/NGObjWeb/SoObjects/SoObject.m ++=================================================================== ++--- sope-appserver/NGObjWeb/SoObjects/SoObject.m (revision 1660) +++++ sope-appserver/NGObjWeb/SoObjects/SoObject.m (working copy) ++@@ -39,22 +39,34 @@ ++ static int debugLookup = -1; ++ static int debugBaseURL = -1; ++ static int useRelativeURLs = -1; +++static int redirectInitted = -1; +++static NSURL *redirectURL = nil; +++ ++ static void _initialize(void) { +++ NSString *url; +++ NSUserDefaults *ud; +++ +++ ud = [NSUserDefaults standardUserDefaults]; +++ ++ if (debugLookup == -1) { ++- debugLookup = [[NSUserDefaults standardUserDefaults] ++- boolForKey:@"SoDebugKeyLookup"] ? 1 : 0; +++ debugLookup = [ud boolForKey:@"SoDebugKeyLookup"] ? 1 : 0; ++ NSLog(@"Note(SoObject): SoDebugKeyLookup is enabled!"); ++ } ++ if (debugBaseURL == -1) { ++- debugBaseURL = [[NSUserDefaults standardUserDefaults] ++- boolForKey:@"SoDebugBaseURL"] ? 1 : 0; +++ debugBaseURL = [ud boolForKey:@"SoDebugBaseURL"] ? 1 : 0; ++ NSLog(@"Note(SoObject): SoDebugBaseURL is enabled!"); ++ } ++ if (useRelativeURLs == -1) { ++- useRelativeURLs = [[NSUserDefaults standardUserDefaults] ++- boolForKey:@"WOUseRelativeURLs"] ?1:0; +++ useRelativeURLs = [ud boolForKey:@"WOUseRelativeURLs"] ?1:0; ++ NSLog(@"Note(SoObject): relative base URLs are enabled."); ++ } +++ if (redirectInitted == -1) { +++ url = [ud stringForKey:@"WOApplicationRedirectURL"]; +++ if ([url length]) { +++ redirectURL = [[NSURL alloc] initWithString: url]; +++ } +++ redirectInitted = 1; +++ } ++ } ++ ++ /* classes */ ++@@ -318,56 +330,61 @@ ++ ++ rq = [_ctx request]; ++ ms = [[NSMutableString alloc] initWithCapacity:128]; +++ +++ if (redirectURL) { +++ [ms appendString: [redirectURL absoluteString]]; +++ } +++ else { +++ if (!useRelativeURLs) { +++ port = [[rq headerForKey:@"x-webobjects-server-port"] intValue]; ++ ++- if (!useRelativeURLs) { ++- port = [[rq headerForKey:@"x-webobjects-server-port"] intValue]; ++- ++- /* this is actually a bug in Apache */ ++- if (port == 0) { ++- static BOOL didWarn = NO; ++- if (!didWarn) { ++- [self warnWithFormat:@"(%s:%i): got an empty port from Apache!", ++- __PRETTY_FUNCTION__, __LINE__]; ++- didWarn = YES; +++ /* this is actually a bug in Apache */ +++ if (port == 0) { +++ static BOOL didWarn = NO; +++ if (!didWarn) { +++ [self warnWithFormat:@"(%s:%i): got an empty port from Apache!", +++ __PRETTY_FUNCTION__, __LINE__]; +++ didWarn = YES; +++ } +++ port = 80; ++ } ++- port = 80; ++- } ++ ++- if ((tmp = [rq headerForKey:@"host"]) != nil) { ++- /* check whether we have a host header with port */ ++- if ([tmp rangeOfString:@":"].length == 0) ++- tmp = nil; ++- } ++- if (tmp != nil) { /* we have a host header with port */ ++- isHTTPS = ++- [[rq headerForKey:@"x-webobjects-server-url"] hasPrefix:@"https"]; ++- [ms appendString:isHTTPS ? @"https://" : @"http://"]; ++- [ms appendString:tmp]; ++- } ++- else if ((tmp = [rq headerForKey:@"x-webobjects-server-url"]) != nil) { ++- /* sometimes the URL is just wrong! (suggests port 80) */ ++- if ([tmp hasSuffix:@":0"] && [tmp length] > 2) { // TODO: bad bad bad ++- [self warnWithFormat:@"%s: got incorrect URL from Apache: '%@'", ++- __PRETTY_FUNCTION__, tmp]; ++- tmp = [tmp substringToIndex:([tmp length] - 2)]; +++ if ((tmp = [rq headerForKey:@"host"]) != nil) { +++ /* check whether we have a host header with port */ +++ if ([tmp rangeOfString:@":"].length == 0) +++ tmp = nil; ++ } ++- else if ([tmp hasSuffix:@":443"] && [tmp hasPrefix:@"http://"]) { ++- /* see OGo bug #1435, Debian Apache hack */ ++- [self warnWithFormat:@"%s: got 'http' protocol but 443 port, " ++- @"assuming Debian/Apache bug (OGo #1435): '%@'", ++- __PRETTY_FUNCTION__, tmp]; ++- tmp = [tmp substringWithRange:NSMakeRange(4, [tmp length] - 4 - 4)]; ++- tmp = [@"https" stringByAppendingString:tmp]; +++ if (tmp != nil) { /* we have a host header with port */ +++ isHTTPS = +++ [[rq headerForKey:@"x-webobjects-server-url"] hasPrefix:@"https"]; +++ [ms appendString:isHTTPS ? @"https://" : @"http://"]; +++ [ms appendString:tmp]; ++ } ++- [ms appendString:tmp]; ++- } ++- else { ++- // TODO: isHTTPS always no in this case? ++- [ms appendString:isHTTPS ? @"https://" : @"http://"]; +++ else if ((tmp = [rq headerForKey:@"x-webobjects-server-url"]) != nil) { +++ /* sometimes the URL is just wrong! (suggests port 80) */ +++ if ([tmp hasSuffix:@":0"] && [tmp length] > 2) { // TODO: bad bad bad +++ [self warnWithFormat:@"%s: got incorrect URL from Apache: '%@'", +++ __PRETTY_FUNCTION__, tmp]; +++ tmp = [tmp substringToIndex:([tmp length] - 2)]; +++ } +++ else if ([tmp hasSuffix:@":443"] && [tmp hasPrefix:@"http://"]) { +++ /* see OGo bug #1435, Debian Apache hack */ +++ [self warnWithFormat:@"%s: got 'http' protocol but 443 port, " +++ @"assuming Debian/Apache bug (OGo #1435): '%@'", +++ __PRETTY_FUNCTION__, tmp]; +++ tmp = [tmp substringWithRange:NSMakeRange(4, [tmp length] - 4 - 4)]; +++ tmp = [@"https" stringByAppendingString:tmp]; +++ } +++ [ms appendString:tmp]; +++ } +++ else { +++ // TODO: isHTTPS always no in this case? +++ [ms appendString:isHTTPS ? @"https://" : @"http://"]; ++ ++- [ms appendString:[rq headerForKey:@"x-webobjects-server-name"]]; ++- if ((isHTTPS ? (port != 443) : (port != 80)) && port != 0) ++- [ms appendFormat:@":%i", port]; +++ [ms appendString:[rq headerForKey:@"x-webobjects-server-name"]]; +++ if ((isHTTPS ? (port != 443) : (port != 80)) && port != 0) +++ [ms appendFormat:@":%i", port]; +++ } ++ } ++ } ++ ++Index: sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m ++=================================================================== ++--- sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (revision 1660) +++++ sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (working copy) ++@@ -696,7 +696,7 @@ ++ *(&out) = nil; ++ ++ [self _httpValidateResponse:_response]; ++- +++ ++ out = [(NGCTextStream *)[NGCTextStream alloc] initWithSource:_out]; ++ ++ NS_DURING { ++@@ -705,6 +705,7 @@ ++ id body; ++ BOOL doZip; ++ BOOL isok = YES; +++ int length; ++ ++ doZip = [_response shouldZipResponseToRequest:_request]; ++ ++@@ -738,7 +739,11 @@ ++ ++ /* add content length header */ ++ ++- snprintf((char *)buf, sizeof(buf), "%d", [body length]); +++ if ((length = [body length]) == 0 +++ && ![[_response headerForKey: @"content-type"] hasPrefix:@"text/plain"]) { +++ [_response setHeader:@"text/plain" forKey:@"content-type"]; +++ } +++ snprintf((char *)buf, sizeof(buf), "%d", length); ++ t1 = [[NSString alloc] initWithCString:(char *)buf]; ++ [_response setHeader:t1 forKey:@"content-length"]; ++ [t1 release]; t1 = nil; ++@@ -766,7 +771,7 @@ ++ NSString *value; ++ ++ if (!hasConnectionHeader) { ++- if ([fieldName caseInsensitiveCompare:@"connection"]==NSOrderedSame) +++ if ([fieldName isEqualToString:@"connection"]) ++ hasConnectionHeader = YES; ++ } ++ +--- sope-4.9.r1660.orig/sope-core/NGStreams/GNUmakefile.preamble ++++ sope-4.9.r1660/sope-core/NGStreams/GNUmakefile.preamble +@@ -1,6 +1,6 @@ + # compilation settings + +-MACHCPU = $(shell echo $$MACHTYPE | cut -f 1 -d '-') ++MACHCPU = $(shell /usr/bin/arch) + + libNGStreams_INCLUDE_DIRS += \ + -I$(GNUSTEP_TARGET_CPU)/$(GNUSTEP_TARGET_OS) \ diff --git a/debian/changelog b/debian/changelog index 512644f93..f366cd2b2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +sogo (1.0.4) unstable; urgency=low + + * New release + * debian/control: + - bumped standards-version + - updated dependencies + + -- Inverse Support Tue, 11 Aug 2009 18:22:41 -0400 + sogo (1.0.3) UNRELEASED; urgency=low * Initial package diff --git a/debian/control b/debian/control index 92b65ab48..07a1934a1 100644 --- a/debian/control +++ b/debian/control @@ -1,22 +1,23 @@ Source: sogo Priority: optional -Maintainer: Cyril Robert -Build-Depends: debhelper (>= 7), autotools-dev, gnustep-base-common, gnustep-base-runtime, gnustep-make, libsope-appserver-dev, libsope-core-dev, libsope-ldap-dev, libsope-mime-dev, libsope-xml-dev +Maintainer: Inverse Support +Build-Depends: debhelper (>= 7), libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev Section: web -Standards-Version: 3.7.3 +Standards-Version: 3.8.2 Package: sogo Section: web -Architecture: i386 -Depends: gnustep-base-common, gnustep-base-runtime, gnustep-gui-common, gnustep-gui-runtime, libsope-core4.9, libsope-appserver4.9, libsope-ldap4.9 -Description: SOGo +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, tmpreaper +Suggests: nginx +Description: a modern and scalable groupware SOGo is a groupware server built around OpenGroupware.org (OGo) and - the SOPE application server. It focuses on scalability. + the SOPE application server with focus on scalability. The Inverse edition of this project has many feature enhancements: - - CalDAV and GroupDAV compliance - - full handling of vCard as well as vCalendar/iCalendar formats - - support for folder sharing and ACLs - The Web interface has been rewritten in an AJAX fashion to provided a faster + * CalDAV and GroupDAV compliance + * full handling of vCard as well as vCalendar/iCalendar formats + * support for folder sharing and ACLs + . + The Web interface has been rewritten in an AJAX fashion to provide a faster UI for the users, consistency in look and feel with the Mozilla applications, and to reduce the load of the transactions on the server. - diff --git a/debian/copyright b/debian/copyright index eaec818e4..7b8abffc7 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,24 +1,33 @@ This package was debianized by Cyril on Mon, 27 Jul 2009 10:57:51 -0400. -It was downloaded from +It was downloaded from http://www.scalableogo.org/fr/downloads/backend.html -Upstream Author(s): +Upstream Authors: - - + Inverse inc. + Skyric AG Copyright: - - + Copyright (C) 2004-2005 SKYRIX Software AG + Copyright (C) 2006-2009 Inverse inc. License: - + This program 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 of the License, or + (at your option) any later version. + + This program 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; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. The Debian packaging is (C) 2009, Cyril and -is licensed under the GPL, see `/usr/share/common-licenses/GPL'. - -# Please also look if there are files or directories which have a -# different copyright/license attached and list them here. +is licensed under the GPL, see `/usr/share/common-licenses/GPL-2'. diff --git a/debian/rules b/debian/rules index a6f2210a9..b90bf7ab4 100755 --- a/debian/rules +++ b/debian/rules @@ -1,90 +1,79 @@ #!/usr/bin/make -f # -*- makefile -*- export DH_VERBOSE=1 +# export DH_OPTIONS="-p sogo" -config.status: configure +config.make: configure dh_testdir -LDFLAGS="-Wl,-z,defs" ./configure - + ./configure #Architecture build: build-arch build-indep build-arch: build-arch-stamp -build-arch-stamp: config.status - - # Add here commands to compile the arch part of the package. - #$(MAKE) +build-arch-stamp: config.make +# Add here commands to compile the arch part of the package. + $(MAKE) touch $@ build-indep: build-indep-stamp -build-indep-stamp: config.status - - # Add here commands to compile the indep part of the package. - #$(MAKE) doc +build-indep-stamp: config.make +# Add here commands to compile the indep part of the package. +# $(MAKE) doc touch $@ clean: dh_testdir dh_testroot rm -f build-arch-stamp build-indep-stamp - make clean + if [ -f config.make ]; then make clean; fi dh_clean -install: install-indep install-arch +install: install-arch install-indep: dh_testdir dh_testroot - dh_clean -k -i + dh_prep -i dh_installdirs -i dh_install -i -install-arch: +install-arch: build-arch dh_testdir dh_testroot - dh_clean -k -s - dh_installdirs -s + dh_prep -i +# dh_installdirs -s - $(MAKE) DESTDIR=$(CURDIR)/debian/tmp GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install - mkdir -p debian/tmp/etc/init.d - mkdir -p debian/tmp/etc/cron.daily - mkdir -p debian/tmp/var/run/sogo - mkdir -p debian/tmp/var/log/sogo - mkdir -p debian/tmp/var/spool/sogo + $(MAKE) DESTDIR=$(CURDIR)/debian/tmp GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install mkdir -p debian/tmp/etc/default - mkdir -p debian/tmp/etc/apache2/conf.d - mkdir -p debian/tmp/usr/sbin - echo "DAEMON=/usr/sbin/sogod-launcher" >> debian/tmp/etc/default/sogo - cp Scripts/sogo-init.d-debian debian/tmp/etc/init.d/sogod - cp Scripts/tmpwatch debian/tmp/etc/cron.daily/sogo-tmpwatch - cp Apache/SOGo-debian.conf debian/tmp/etc/apache2/conf.d/SOGo.conf - cp Scripts/sogod-wrapper debian/tmp/usr/sbin/sogod-launcher + cp Scripts/sogo-default debian/tmp/etc/default/sogo + cp Scripts/sogod-wrapper debian/tmp/usr/sbin/sogod-wrapper + mkdir -p debian/tmp/usr/share/lintian/overrides + cp debian/sogo.overrides debian/tmp/usr/share/lintian/overrides/sogo - dh_install -s +binary-indep: build-indep install-indep -binary-common: +# Build architecture dependant packages using the common target. +binary-arch: build-arch install-arch dh_testdir dh_testroot + dh_installinit -r + dh_installlogrotate + dh_installcron dh_installchangelogs ChangeLog dh_installdocs dh_installexamples dh_installman + dh_install dh_link dh_strip dh_compress dh_fixperms dh_makeshlibs + dh_shlibdeps dh_installdeb dh_gencontrol dh_md5sums dh_builddeb -binary-indep: build-indep install-indep - $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common - -# Build architecture dependant packages using the common target. -binary-arch: build-arch install-arch - $(MAKE) -f debian/rules DH_OPTIONS=-s binary-common - -binary: binary-arch binary-indep +binary: binary-arch .PHONY: build clean binary-indep binary-arch binary install install-indep install-arch diff --git a/debian/sogo.docs b/debian/sogo.docs index 1cd8a04b1..5502ed8f4 100644 --- a/debian/sogo.docs +++ b/debian/sogo.docs @@ -1,4 +1,3 @@ NEWS README TODO -ChangeLog diff --git a/debian/sogo.install b/debian/sogo.install index 8b97305f8..4ce4e02d7 100644 --- a/debian/sogo.install +++ b/debian/sogo.install @@ -1,3 +1,6 @@ -etc/* -usr/* -var/* +etc/default/sogo +usr/sbin/* +usr/lib/GNUstep/* +usr/lib/lib* +usr/include/GNUstep/* +usr/share/lintian/* diff --git a/debian/sogo.postinst b/debian/sogo.postinst old mode 100755 new mode 100644 index ab3f537d6..04d66c1fb --- a/debian/sogo.postinst +++ b/debian/sogo.postinst @@ -1,17 +1,34 @@ -#!/bin/sh +#!/bin/bash + set -e -/usr/sbin/groupadd -f -K GID_MIN=100 -K GID_MAX=500 sogo -USERS=`getent passwd | grep sogo | sed -e 's/\([a-zA-Z]*\):.*/\1/g'` +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package +# +PATH=/bin:/sbin:/usr/bin:/usr/sbin -if [ "$USERS" != "sogo" ] ; then - echo "Adding user sogo" - useradd -d /home/sogo -g sogo -m -K UID_MIN=100 -K UID_MAX=500 -K PASS_MAX_DAYS=-1 -s /bin/bash sogo -fi +case "$1" in + configure) + ;; -chown -R sogo /var/run/sogo -chown -R sogo /var/spool/sogo -chown -R sogo /var/log/sogo -update-rc.d sogod defaults -/sbin/ldconfig + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +#DEBHELPER# + +exit 0 diff --git a/debian/sogo.postrm b/debian/sogo.postrm old mode 100755 new mode 100644 index 28f349900..ed570af19 --- a/debian/sogo.postrm +++ b/debian/sogo.postrm @@ -1,4 +1,32 @@ -#!/bin/sh +#!/bin/bash + set -e -userdel sogo || true -update-rc.d SOGo remove || true + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' overwrit>r> +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + if test "x$1" == "xpurge" ] + then + userdel -r sogo || true + fi + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 0 +esac + +#DEBHELPER# + +exit 0 diff --git a/debian/sogo.prerm b/debian/sogo.prerm old mode 100755 new mode 100644 index c427b52c9..242fb9cc5 --- a/debian/sogo.prerm +++ b/debian/sogo.prerm @@ -1,3 +1,22 @@ -#!/bin/sh +#!/bin/bash + set -e -/etc/init.d/sogod stop + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see /usr/share/doc/packaging-manual/ + +if test "x$1" == "xremove" +then + /etc/init.d/sogo stop +fi + +#DEBHELPER# + +exit 0 From fb69d6c83c67837a30226d48e753f6d69856ccf2 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Wed, 12 Aug 2009 16:24:46 +0000 Subject: [PATCH 14/21] Updated SOGo Installation Guide Monotone-Parent: b3e9a0e81aa41a6be8c77273ff406daa098503f6 Monotone-Revision: 0df538b4bd5700698524e5e97d712b4c0fe936a4 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-08-12T16:24:46 Monotone-Branch: ca.inverse.sogo --- Documentation/SOGo Installation Guide.odt | Bin 32571 -> 33223 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Documentation/SOGo Installation Guide.odt b/Documentation/SOGo Installation Guide.odt index 5c24a0c714ad0d824b07056a74b585c163b85d60..7bde84a24b35d364c54d46ef430262e760f85f67 100644 GIT binary patch delta 30285 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 ASpWb4 delta 29642 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 Date: Wed, 12 Aug 2009 16:28:54 +0000 Subject: [PATCH 15/21] Updated guides Monotone-Parent: 0df538b4bd5700698524e5e97d712b4c0fe936a4 Monotone-Revision: 0044cf5f6592a131133f84f76e539a47a7d8f64a Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-08-12T16:28:54 Monotone-Branch: ca.inverse.sogo --- .../SOGo Mobile Devices Configuration.odt | Bin 19650 -> 20325 bytes ...SOGo Mozilla Thunderbird Configuration.odt | Bin 21029 -> 20868 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Documentation/SOGo Mobile Devices Configuration.odt b/Documentation/SOGo Mobile Devices Configuration.odt index 77bd865a49e9eac070e6cfcf8e20ef5d9017fad9..29aba52720e401be9e29ee64db9d430cd9b80ee9 100644 GIT binary patch delta 15940 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 delta 15205 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 EKmT6*Gynhq diff --git a/Documentation/SOGo Mozilla Thunderbird Configuration.odt b/Documentation/SOGo Mozilla Thunderbird Configuration.odt index 976289f1edc4d85dbaeb88ff99b1d893d4ef5ca4..7a6df3b60af004183c946ee5f4a74399c4c6b81e 100644 GIT binary patch delta 14483 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 From c2d9a2ea344a60c0722498163f1cf427a923b0ba Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 12 Aug 2009 16:32:01 +0000 Subject: [PATCH 16/21] Monotone-Parent: e36cbb9da53308642513123a9831ab22030eca9f Monotone-Revision: 87d1d936dba4536ea960f1ec23222ecd8c906d10 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-12T16:32:01 Monotone-Branch: ca.inverse.sogo --- debian/sogo.prerm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/debian/sogo.prerm b/debian/sogo.prerm index 242fb9cc5..914a28b5e 100644 --- a/debian/sogo.prerm +++ b/debian/sogo.prerm @@ -12,11 +12,6 @@ set -e # # for details, see /usr/share/doc/packaging-manual/ -if test "x$1" == "xremove" -then - /etc/init.d/sogo stop -fi - #DEBHELPER# exit 0 From 20558d13a36aa31c59887a90ae98ba4793caa27c Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 12 Aug 2009 17:24:12 +0000 Subject: [PATCH 17/21] Monotone-Parent: bea77de1f9abc0ecf4b75dd637ecb87af1981845 Monotone-Revision: 5cbdd6208af6261a0b67fc4f229492035a33e1f7 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-12T17:24:12 Monotone-Branch: ca.inverse.sogo --- debian/sogo.cron.daily | 6 + debian/sogo.examples | 1 + debian/sogo.init | 182 ++++++++++++++++ debian/sogo.logrotate | 13 ++ debian/sogo.overrides | 456 +++++++++++++++++++++++++++++++++++++++++ debian/sogo.preinst | 31 +++ 6 files changed, 689 insertions(+) create mode 100644 debian/sogo.cron.daily create mode 100644 debian/sogo.examples create mode 100644 debian/sogo.init create mode 100644 debian/sogo.logrotate create mode 100644 debian/sogo.overrides create mode 100644 debian/sogo.preinst diff --git a/debian/sogo.cron.daily b/debian/sogo.cron.daily new file mode 100644 index 000000000..f5c349eb9 --- /dev/null +++ b/debian/sogo.cron.daily @@ -0,0 +1,6 @@ +#!/bin/sh + +SOGOSPOOL=/var/spool/sogo + +/usr/sbin/tmpreaper 24 "$SOGOSPOOL" +find "$SOGOSPOOL" -type d -empty -exec /bin/rmdir -p {} \; 2> /dev/null diff --git a/debian/sogo.examples b/debian/sogo.examples new file mode 100644 index 000000000..21c308636 --- /dev/null +++ b/debian/sogo.examples @@ -0,0 +1 @@ +Apache/SOGo.conf diff --git a/debian/sogo.init b/debian/sogo.init new file mode 100644 index 000000000..d2bce3d0f --- /dev/null +++ b/debian/sogo.init @@ -0,0 +1,182 @@ +#! /bin/bash + +### BEGIN INIT INFO +# Provides: sogo +# Required-Start: $network +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: SOGo server +### END INIT INFO + +# SOGo init script for Debian GNU/Linux +# +# Copyright (C) 2007-2009 Inverse inc. +# +# Author: Wolfgang Sourdeau +# Ludovic Marcotte +# +# 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. + +# specify more if you are using a load-balancer +PREFORK=1 +SOGO_ARGS="" +USER=sogo + +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +DAEMON=/usr/sbin/sogod-wrapper +NAME=sogod +DESC="Scalable OpenGroupware.Org" + +PIDFILE=/var/run/sogo/sogod. + +if [ -f /etc/default/sogo ]; then + . /etc/default/sogo +fi + +if [ ! -x $DAEMON ]; then + echo "$DAEMON is not executable." + exit 1 +fi + +if [ `/usr/bin/stat /var/run/sogo -c %U` != $USER ]; then + echo "/var/run/sogo is not owned by the ${USER}." + exit 1 +fi + +if [ `/usr/bin/stat /var/spool/sogo -c %U` != $USER ]; then + echo "/var/spool/sogo is not owned by the ${USER}." + exit 1 +fi + +if [ `/usr/bin/stat /var/log/sogo -c %U` != $USER ]; then + echo "/var/log/sogo is not owned by the ${USER}." + exit 1 +fi + +case "$1" in + start) + echo $"Starting $DESC: " + for ((a=1; a <= PREFORK ; a++)) + do + ppid="`cat ${PIDFILE}${a} 2> /dev/null`" + if [ -n "$ppid" ] + then + ppid="`ps --pid ${ppid} -o pid=`" + if [ -n "$ppid" ] + then + echo " $NAME $a already running. Skipped." + else + rm -f ${PIDFILE}${a} + start-stop-daemon -c $USER \ + -b --start --quiet --exec $DAEMON $a + echo " $NAME $a (stale pid file removed)" + fi + else + start-stop-daemon -c $USER \ + -b --start --quiet --exec $DAEMON $a + echo " $NAME $a" + fi + done + ;; + + stop) + echo $"Stopping $DESC: " + su "$USER" -c '/usr/bin/killall gdnc >& /dev/null' + # We kill the parent processes with SIGTERM so that they + # can exit gracefully. + for ((a=1; a <= PREFORK ; a++)) + do + ppid="`cat ${PIDFILE}${a} 2> /dev/null`" + if [ -n "$ppid" ] + then + ppid="`ps --pid ${ppid} -o pid=`" + if [ -n "$ppid" ] + then + if kill $ppid >& /dev/null + then + echo " $NAME $a stopped" + fi + else + echo " $NAME $a not running" + fi + else + echo " $NAME $a not running" + fi + done + + sleep 1 + # We kill the parent and child processes with SIGKILL to make sure they + # really are shutdown, and then we remove their pidfile. + for ((a=1; a <= PREFORK ; a++)) + do + ppid="`cat ${PIDFILE}${a} 2> /dev/null`" + if [ -n "$ppid" ] + then + ppid="`ps --pid ${ppid} -o pid= 2> /dev/null`" + if [ -n "$ppid" ] + then + kill -9 $ppid >& /dev/null + pid="`ps --ppid ${ppid} -o pid= 2> /dev/null`" + if [ -n "$pid" ] + then + kill -9 $pid >& /dev/null + fi + echo " $NAME $a killed" + fi + fi + rm -f ${PIDFILE}${a} + done + ;; + + restart|force-reload) + echo $"Restarting $DESC: " + su "$USER" -c '/usr/bin/killall gdnc >& /dev/null' + for ((a=1; a <= PREFORK ; a++)) + do + ppid="`cat ${PIDFILE}${a} 2> /dev/null`" + if [ -n "$ppid" ] + then + ppid="`ps --pid ${ppid} -o pid=`" + if [ -n "$ppid" ] + then + kill $ppid >& /dev/null + sleep 1 + fi + ppid="`ps --pid ${ppid} -o pid=`" + if [ -n "$ppid" ] + then + pid="`ps --ppid ${ppid} -o pid=`" + kill -9 $ppid >& /dev/null + kill -9 $pid >& /dev/null + fi + rm -f ${PIDFILE}${a} + fi + start-stop-daemon -c $USER \ + -b --start --quiet --exec $DAEMON $a + echo " $NAME $a" + done + ;; + + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|restart|force-reload}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/debian/sogo.logrotate b/debian/sogo.logrotate new file mode 100644 index 000000000..f07979381 --- /dev/null +++ b/debian/sogo.logrotate @@ -0,0 +1,13 @@ +/var/log/sogo/*.log { + daily + missingok + rotate 7 + compress + delaycompress + notifempty + create 640 sogo sogo + sharedscripts + postrotate + /etc/init.d/sogod restart > /dev/null + endscript +} diff --git a/debian/sogo.overrides b/debian/sogo.overrides new file mode 100644 index 000000000..393163aa6 --- /dev/null +++ b/debian/sogo.overrides @@ -0,0 +1,456 @@ +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/Search-bar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/abcard.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/accepted.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/account-settings.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/add-addressbook.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/add-calendar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/add-contact.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/add-user-addressbook.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/add-user-calendar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/addrbook.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/alarm.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/arrow-dwn-sharp.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/arrow-lft-sharp.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/arrow-rit-sharp.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/attachment.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/browser_firefox.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/browser_ie.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/browser_safari.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/busy.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/calendar-folder-16x16.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/calendar-reload.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/choose-date.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/about/dialogs/logo_ckeditor.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/flash/images/placeholder.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/link/images/anchor.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/pagebreak/images/pagebreak.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_address.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_blockquote.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_div.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_h1.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_h2.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_h3.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_h4.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_h5.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_h6.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_p.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/showblocks/images/block_pre.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/angel_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/angry_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/broken_heart.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/confused_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/cry_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/devil_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/embaressed_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/envelope.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/heart.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/kiss.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/lightbulb.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/omg_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/regular_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/sad_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/shades_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/teeth_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/thumbs_down.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/thumbs_up.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/tounge_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/whatchutalkingabout_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/smiley/images/wink_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/templates/templates/images/template1.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/templates/templates/images/template2.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/templates/templates/images/template3.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/uicolor/uicolor.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/uicolor/yui/assets/hue_bg.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/uicolor/yui/assets/hue_thumb.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/uicolor/yui/assets/picker_mask.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/plugins/uicolor/yui/assets/picker_thumb.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/icons.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/arrowdown.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/arrowleft.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/arrowright.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/arrowtop.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/dialog_sides.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/dialog_sides.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/dialog_sides_rtl.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/mini.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/noimage.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/resizer.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/resizer_rtl.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/sprites.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/sprites_ie6.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/images/toolbar_start.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/kama/sprites.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/icons.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/arrowdown.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/arrowleft.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/arrowright.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/arrowtop.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/dialog_sides.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/dialog_sides.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/dialog_sides_rtl.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/mini.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/noimage.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/resizer.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/resizer_rtl.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/sprites.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/office2003/images/sprites_ie6.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/icons.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/arrowdown.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/arrowleft.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/arrowright.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/arrowtop.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/dialog_sides.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/dialog_sides.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/dialog_sides_rtl.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/mini.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/noimage.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/resizer.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/resizer_rtl.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/sprites.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/sprites_ie6.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/_source/skins/v2/images/toolbar_start.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/images/spacer.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/about/dialogs/logo_ckeditor.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/flash/images/placeholder.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/link/images/anchor.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/pagebreak/images/pagebreak.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_address.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_blockquote.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_div.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_h1.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_h2.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_h3.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_h4.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_h5.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_h6.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_p.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/showblocks/images/block_pre.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/angel_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/angry_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/broken_heart.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/confused_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/cry_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/devil_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/embaressed_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/envelope.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/heart.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/kiss.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/lightbulb.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/omg_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/regular_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/sad_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/shades_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/teeth_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/thumbs_down.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/thumbs_up.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/tounge_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/smiley/images/wink_smile.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/templates/templates/images/template1.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/templates/templates/images/template2.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/templates/templates/images/template3.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/uicolor/uicolor.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/uicolor/yui/assets/hue_bg.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/uicolor/yui/assets/picker_mask.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/icons.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/arrowdown.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/arrowleft.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/arrowright.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/arrowtop.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/dialog_sides.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/dialog_sides.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/dialog_sides_rtl.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/mini.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/noimage.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/resizer.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/resizer_rtl.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/sprites.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/sprites_ie6.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/images/toolbar_start.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/kama/sprites.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/icons.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/arrowdown.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/arrowleft.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/arrowright.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/arrowtop.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/dialog_sides.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/dialog_sides.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/dialog_sides_rtl.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/mini.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/noimage.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/resizer.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/resizer_rtl.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/sprites.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/office2003/images/sprites_ie6.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/icons.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/arrowdown.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/arrowleft.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/arrowright.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/arrowtop.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/dialog_sides.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/dialog_sides.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/dialog_sides_rtl.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/mini.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/noimage.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/resizer.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/resizer_rtl.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/sprites.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/sprites_ie6.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/ckeditor/skins/v2/images/toolbar_start.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/closewindow.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/create-account.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/day-view-multicolumn.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/day-view.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/declined.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/dialog-left.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/dialog-right.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/edit.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/empty.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/event-gradient.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/first.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/goto-today.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/green_corner.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/icon-deleted.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/icon-forwarded-replied.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/icon-forwarded.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/icon-new.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/icon-replied.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/icon_read.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/icon_unread.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/important.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/inverse.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/last.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/lori_32x32.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/manage-filters.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/manage-imap.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/menu-check-hover.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/menu-check.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/menu-nocheck.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/message-copy.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/message.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-certificate.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-magicpoint.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-msword.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-ogg.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-pdf.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-postscript.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-rtf.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.lotus-1-2-3.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.ms-excel.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.ms-powerpoint.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.oasis.opendocument.graphics.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.oasis.opendocument.image.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.oasis.opendocument.presentation.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.oasis.opendocument.spreadsheet.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.oasis.opendocument.text-web.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.oasis.opendocument.text.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.rn-realmedia-secure.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.rn-realmedia-vbr.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.rn-realmedia.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.stardivision.calc.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.stardivision.impress.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.stardivision.writer.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.sun.xml.calc.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.sun.xml.draw.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.sun.xml.impress.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-vnd.sun.xml.writer.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-wordperfect.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-7z-compressed.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-abiword.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-applix-spreadsheet.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-applix-word.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-archive.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-arj.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-bzip-compressed-tar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-bzip.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-cd-image.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-compress.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-compressed-tar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-cpio-compressed.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-cpio.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-deb.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-dvi.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-executable.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-font-afm.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-font-bdf.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-font-linux-psf.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-font-pcf.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-font-sunos-news.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-font-ttf.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-gnumeric.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-gzip.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-gzpostscript.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-jar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-killustrator.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-kpresenter.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-kspread.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-kword.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-lha.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-lhz.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-lzma-compressed-tar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-lzma.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-ms-dos-executable.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-perl.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-php.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-python-bytecode.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-rar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-rpm.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-scribus.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-shellscript.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-shockwave-flash.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-stuffit.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-tar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-tarz.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-x-tex.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-xhtml+xml.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-application-zip.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-ascii.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-audio-x-generic.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-audio.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-binary.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-contents2.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-deb.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-document.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-empty.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-exec.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-folder_tar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-font-x-generic.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-font.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-font_bitmap.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-font_truetype.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-font_type1.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-gnome-fs-executable.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-gnome-fs-regular.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-gnome-package.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-gtk-file.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-html.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-image-x-generic.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-image.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-kpresenter_kpr.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-mime_ascii.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-misc.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-package-x-generic.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-package.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-package_editors.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-package_wordprocessing.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-plan.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-rpm.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-shellscript.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-sound.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-spreadsheet.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-stock_addressbook.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-stock_calendar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-stock_certificate.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-stock_script.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-tar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-template_source.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-html.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-plain.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-vnd.wap.wml.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-csh.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-generic-template.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-generic.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-preview.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-python.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-script.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-sh.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-vcalendar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-vcard.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text-x-zsh.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-text.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-tgz.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-txt.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-txt2.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-unknown.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-vcalendar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-vcard.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-video-x-generic.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-video.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-wordprocessing.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-www.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-x-font-afm.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-x-office-address-book.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-x-office-calendar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-x-office-document.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-x-office-drawing.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-x-office-presentation.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-x-office-spreadsheet.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/mime-zip.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/minus.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/month-view.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/needs-action.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/new-card.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/new-event.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/new-list.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/new-task.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/next.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/non_sorted.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/offline-settings.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/plus.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/previous.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/priority.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/properties.png +sogo: embedded-javascript-library usr/lib/GNUstep/SOGo/WebServerResources/prototype.js +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/quota-level-alert.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/quota-level-ok.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/quota-level-warn.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/quota-level.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/read-messages.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/remote-addrbook.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/remove-addressbook.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/remove-calendar.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/remove-contact.gif +sogo: extra-license-file usr/lib/GNUstep/SOGo/WebServerResources/scriptaculous/MIT-LICENSE +sogo: embedded-javascript-library usr/lib/GNUstep/SOGo/WebServerResources/scriptaculous/scriptaculous.js +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/search-messages.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/slider_handle.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/sogo-logo.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/submenu-active.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/submenu-disabled.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/submenu.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tab_left_active.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tab_left_inactive.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tab_right_active.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tab_right_inactive.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-ab-properties-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-compose-attach-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-compose-contacts-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-compose-save-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-compose-security-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-compose-send-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-addressbook-flat-16x16.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-addressbook-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-delete-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-file-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-forward-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-getmail-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-junk-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-print-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-reply-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-replyall-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-stop-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tb-mail-write-flat-24x24.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_account_17x17.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_corner_17x17.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_corner_minus_17x17.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_corner_plus_17x17.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_drafts_17x17.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_inbox_17x17.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_junction_17x17.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_leaf_corner_17x17.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_line_17x17.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_minus_17x17.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_plus_17x17.gif +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_sent_17x17.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tbtv_trash_17x17.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/tentative.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/title_attachment_14x14.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/title_read_14x14.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/title_sortdown_12x12.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/title_sortup_12x12.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/week-view.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/write-message.png +sogo: image-file-in-usr-lib usr/lib/GNUstep/SOGo/WebServerResources/write.png +sogo: package-name-doesnt-match-sonames libGDLContentStore4.9 libNGCards4.9 libOGoContentStore0.9 libSOGoUI1.0 diff --git a/debian/sogo.preinst b/debian/sogo.preinst new file mode 100644 index 000000000..195c3c220 --- /dev/null +++ b/debian/sogo.preinst @@ -0,0 +1,31 @@ +#!/bin/bash + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +if test "x$1" == "xinstall" && test -z "$2" +then + if ! id sogo; then + groupadd -f -K GID_MIN=100 -K GID_MAX=500 sogo + useradd -d /home/sogo -g sogo -m -K UID_MIN=100 -K UID_MAX=500 -K PASS_MAX_DAYS=-1 -s /bin/bash sogo + fi + + for dir in run spool log + do + mkdir /var/$dir/sogo + chown sogo:sogo /var/$dir/sogo + chmod 750 /var/$dir/sogo + done +fi + +#DEBHELPER# + +exit 0 From 059bd049ec0af292dd275f02851c165734dd3898 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 12 Aug 2009 18:03:17 +0000 Subject: [PATCH 18/21] Monotone-Parent: 5cbdd6208af6261a0b67fc4f229492035a33e1f7 Monotone-Revision: 5db99c7f509addf2ed54bb9e12b7649a35e7a68d Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-12T18:03:17 Monotone-Branch: ca.inverse.sogo --- SOPE/sope-debian.diff | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/SOPE/sope-debian.diff b/SOPE/sope-debian.diff index b9b020418..2085c93df 100644 --- a/SOPE/sope-debian.diff +++ b/SOPE/sope-debian.diff @@ -352,12 +352,6 @@ On Debian systems, the complete text of the GNU Lesser General Public License can be found in `/usr/share/common-licenses/LGPL'. ---- sope-4.9.r1660.orig/debian/sope_SOPEVER_-appserver.install -+++ sope-4.9.r1660/debian/sope_SOPEVER_-appserver.install -@@ -1 +1,2 @@ --usr/sbin/sope-* -+usr/lib/GNUstep/SoProducts-*/* -+usr/lib/GNUstep/WOxElemBuilders-*/* --- sope-4.9.r1660.orig/debian/libsope-appserver_SOPEVER_-dev.install +++ sope-4.9.r1660/debian/libsope-appserver_SOPEVER_-dev.install @@ -1,11 +1,10 @@ @@ -379,6 +373,11 @@ usr/lib/libNGObjWeb.so usr/lib/libWOXML.so usr/lib/libWOExtensions.so +@@ -13,3 +12,4 @@ + usr/lib/libNGXmlRpc.so + usr/lib/libSoOFS.so + usr/lib/libWEPrototype.so ++usr/share/GNUstep/Makefiles/* --- sope-4.9.r1660.orig/debian/control +++ sope-4.9.r1660/debian/control @@ -1,8 +1,9 @@ From 6143663d79c318c719a353438d4e89eb786dc457 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 12 Aug 2009 18:17:40 +0000 Subject: [PATCH 19/21] Monotone-Parent: 5db99c7f509addf2ed54bb9e12b7649a35e7a68d Monotone-Revision: 1a782399b604ae97568989d22d23777b11896071 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-12T18:17:40 Monotone-Branch: ca.inverse.sogo --- debian/sogo.postrm | 2 +- debian/sogo.preinst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/sogo.postrm b/debian/sogo.postrm index ed570af19..2abe80bd0 100644 --- a/debian/sogo.postrm +++ b/debian/sogo.postrm @@ -16,7 +16,7 @@ set -e case "$1" in purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) - if test "x$1" == "xpurge" ] + if test "x$1" == "xpurge" then userdel -r sogo || true fi diff --git a/debian/sogo.preinst b/debian/sogo.preinst index 195c3c220..24864f5d0 100644 --- a/debian/sogo.preinst +++ b/debian/sogo.preinst @@ -13,7 +13,7 @@ set -e if test "x$1" == "xinstall" && test -z "$2" then - if ! id sogo; then + if ! id sogo 2> /dev/null; then groupadd -f -K GID_MIN=100 -K GID_MAX=500 sogo useradd -d /home/sogo -g sogo -m -K UID_MIN=100 -K UID_MAX=500 -K PASS_MAX_DAYS=-1 -s /bin/bash sogo fi From 0159e951d183e5e58efee3f928390535f32fef31 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 12 Aug 2009 18:29:34 +0000 Subject: [PATCH 20/21] Monotone-Parent: 1a782399b604ae97568989d22d23777b11896071 Monotone-Revision: 03c8c1c0221284dc94112f17b3904d59c31d5c94 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-12T18:29:34 Monotone-Branch: ca.inverse.sogo --- Scripts/sogo-init.d-debian | 173 ------------------------------------- 1 file changed, 173 deletions(-) delete mode 100755 Scripts/sogo-init.d-debian diff --git a/Scripts/sogo-init.d-debian b/Scripts/sogo-init.d-debian deleted file mode 100755 index 24bf28d34..000000000 --- a/Scripts/sogo-init.d-debian +++ /dev/null @@ -1,173 +0,0 @@ -#! /bin/bash - -# SOGo init script for Debian GNU/Linux -# -# Copyright (C) 2007-2009 Inverse inc. -# -# Author: Wolfgang Sourdeau -# Ludovic Marcotte -# -# 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. - -# specify more if you are using a load-balancer -PREFORK=3 -SOGO_ARGS="" -USER=sogo - -PATH=/sbin:/bin:/usr/sbin:/usr/bin - -DAEMON=/usr/sbin/sogod -NAME=sogod -DESC="Scalable OpenGroupware.Org" - -PIDFILE=/var/run/sogo/sogod. - -if [ -f /etc/default/sogo ]; then - . /etc/default/sogo -fi - -if [ ! -x $DAEMON ]; then - echo "$DAEMON is not executable." - exit 1 -fi - -if [ `/usr/bin/stat /var/run/sogo -c %U` != $USER ]; then - echo "/var/run/sogo is not owned by the ${USER}." - exit 1 -fi - -if [ `/usr/bin/stat /var/spool/sogo -c %U` != $USER ]; then - echo "/var/spool/sogo is not owned by the ${USER}." - exit 1 -fi - -if [ `/usr/bin/stat /var/log/sogo -c %U` != $USER ]; then - echo "/var/log/sogo is not owned by the ${USER}." - exit 1 -fi - -case "$1" in - start) - echo $"Starting $DESC: " - for ((a=1; a <= PREFORK ; a++)) - do - ppid="`cat ${PIDFILE}${a} 2> /dev/null`" - if [ -n "$ppid" ] - then - ppid="`ps --pid ${ppid} -o pid=`" - if [ -n "$ppid" ] - then - echo " $DAEMON $a already running. Skipped." - else - rm -f ${PIDFILE}${a} - start-stop-daemon -c $USER \ - -b --start --quiet --exec $DAEMON $a - echo " $DAEMON $a (stale pid file removed)" - fi - else - start-stop-daemon -c $USER \ - -b --start --quiet --exec $DAEMON $a - echo " $DAEMON $a" - fi - done - ;; - - stop) - echo $"Stopping $DESC: " - su "$USER" -c '/usr/bin/killall gdnc >& /dev/null' - # We kill the parent processes with SIGTERM so that they - # can exit gracefully. - for ((a=1; a <= PREFORK ; a++)) - do - ppid="`cat ${PIDFILE}${a} 2> /dev/null`" - if [ -n "$ppid" ] - then - ppid="`ps --pid ${ppid} -o pid=`" - if [ -n "$ppid" ] - then - if kill $ppid >& /dev/null - then - echo " $DAEMON $a stopped" - fi - else - echo " $DAEMON $a not running" - fi - else - echo " $DAEMON $a not running" - fi - done - - sleep 1 - # We kill the parent and child processes with SIGKILL to make sure they - # really are shutdown, and then we remove their pidfile. - for ((a=1; a <= PREFORK ; a++)) - do - ppid="`cat ${PIDFILE}${a} 2> /dev/null`" - if [ -n "$ppid" ] - then - ppid="`ps --pid ${ppid} -o pid= 2> /dev/null`" - if [ -n "$ppid" ] - then - kill -9 $ppid >& /dev/null - pid="`ps --ppid ${ppid} -o pid= 2> /dev/null`" - if [ -n "$pid" ] - then - kill -9 $pid >& /dev/null - fi - echo " $DAEMON $a killed" - fi - fi - rm -f ${PIDFILE}${a} - done - ;; - - restart|force-reload) - echo $"Restarting $DESC: " - su "$USER" -c '/usr/bin/killall gdnc >& /dev/null' - for ((a=1; a <= PREFORK ; a++)) - do - ppid="`cat ${PIDFILE}${a} 2> /dev/null`" - if [ -n "$ppid" ] - then - ppid="`ps --pid ${ppid} -o pid=`" - if [ -n "$ppid" ] - then - kill $ppid >& /dev/null - sleep 1 - fi - ppid="`ps --pid ${ppid} -o pid=`" - if [ -n "$ppid" ] - then - pid="`ps --ppid ${ppid} -o pid=`" - kill -9 $ppid >& /dev/null - kill -9 $pid >& /dev/null - fi - rm -f ${PIDFILE}${a} - fi - start-stop-daemon -c $USER \ - -b --start --quiet --exec $DAEMON $a - echo " $DAEMON $a" - done - ;; - - *) - N=/etc/init.d/$NAME - echo "Usage: $N {start|stop|restart|force-reload}" >&2 - exit 1 - ;; -esac - -exit 0 From 90fbbd211c34c8b619712836f9d2c5ed024a972a Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 12 Aug 2009 19:03:04 +0000 Subject: [PATCH 21/21] Monotone-Parent: 03c8c1c0221284dc94112f17b3904d59c31d5c94 Monotone-Revision: bc6ce04250c2cbad21bdc2d1f485e5a659478282 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-08-12T19:03:04 Monotone-Branch: ca.inverse.sogo --- debian/sogo.postrm | 3 +++ debian/sogo.preinst | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/debian/sogo.postrm b/debian/sogo.postrm index 2abe80bd0..9bed33fa5 100644 --- a/debian/sogo.postrm +++ b/debian/sogo.postrm @@ -19,6 +19,9 @@ case "$1" in if test "x$1" == "xpurge" then userdel -r sogo || true + rm -rf /var/spool/sogo + rm -rf /var/log/sogo + rm -rf /var/run/sogo fi ;; diff --git a/debian/sogo.preinst b/debian/sogo.preinst index 24864f5d0..384bffc2a 100644 --- a/debian/sogo.preinst +++ b/debian/sogo.preinst @@ -13,16 +13,17 @@ set -e if test "x$1" == "xinstall" && test -z "$2" then - if ! id sogo 2> /dev/null; then + if ! id sogo 1> /dev/null 2>&1; then groupadd -f -K GID_MIN=100 -K GID_MAX=500 sogo useradd -d /home/sogo -g sogo -m -K UID_MIN=100 -K UID_MAX=500 -K PASS_MAX_DAYS=-1 -s /bin/bash sogo fi for dir in run spool log do - mkdir /var/$dir/sogo - chown sogo:sogo /var/$dir/sogo - chmod 750 /var/$dir/sogo + if ! test -d /var/$dir/sogo + then + install -m 750 -o sogo -g sogo -d /var/$dir/sogo + fi done fi