From 905d2c885ca8c8167c811018841bc9e542bbf9a5 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 27 Mar 2012 16:47:14 +0000 Subject: [PATCH 01/29] Monotone-Parent: b4a3ddf3836324fd1f4925acb0426089a4a0350a Monotone-Revision: c1548a6a3e72a7d9b567b63d50198115fa48ab0b Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-27T16:47:14 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 17 ++ SoObjects/Contacts/SOGoContactFolders.m | 46 ++++ SoObjects/Contacts/SOGoContactLDIFEntry.m | 5 + SoObjects/Contacts/SOGoContactSourceFolder.m | 274 +++++++++++++++++++ SoObjects/Contacts/SOGoUserFolder+Contacts.m | 27 ++ 5 files changed, 369 insertions(+) diff --git a/ChangeLog b/ChangeLog index 7afe15f01..8c39ecf6a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2012-03-27 Wolfgang Sourdeau + + * SoObjects/Contacts/SOGoContactFolders.m + (-lookupName:inContext:acquire:): overriden method that enables + the lookup of hidden public sources with iOS devices. + + * SoObjects/Contacts/SOGoContactLDIFEntry.m (-davAddressData): new + getter similar to davCalendarData. + + * SoObjects/Contacts/SOGoContactSourceFolder.m + (-davAddressbookMultiget): new REPORT handler based on + -[SOGoAppointmentFolder davCalendarMultiget]. + + * SoObjects/Contacts/SOGoUserFolder+Contacts.m + (-davDirectoryGateway): new getter that returns the url to the + first available directory source. + 2012-03-26 Wolfgang Sourdeau * OpenChange/MAPIStoreTasksMessage.m (-save): take PR_HTML as diff --git a/SoObjects/Contacts/SOGoContactFolders.m b/SoObjects/Contacts/SOGoContactFolders.m index 01b1f3abb..537d7a08a 100644 --- a/SoObjects/Contacts/SOGoContactFolders.m +++ b/SoObjects/Contacts/SOGoContactFolders.m @@ -259,6 +259,52 @@ return keys; } +- (id) lookupName: (NSString *) name + inContext: (WOContext *) lookupContext + acquire: (BOOL) acquire +{ + id folder = nil; + SOGoUser *currentUser; + SOGoUserManager *um; + SOGoSystemDefaults *sd; + NSEnumerator *domains; + NSArray *sourceIDs; + NSString *domain, *srcDisplayName; + + if ([[context request] isIPhoneAddressBookApp]) + { + currentUser = [context activeUser]; + if (activeUserIsOwner + || [[currentUser login] isEqualToString: owner]) + { + domain = [currentUser domain]; + um = [SOGoUserManager sharedUserManager]; + sd = [SOGoSystemDefaults sharedSystemDefaults]; + domains = [[sd visibleDomainsForDomain: domain] objectEnumerator]; + while (domain) + { + sourceIDs = [um addressBookSourceIDsInDomain: domain]; + if ([sourceIDs containsObject: name]) + { + srcDisplayName = [um displayNameForSourceWithID: name]; + folder = [SOGoContactSourceFolder + folderWithName: name + andDisplayName: srcDisplayName + inContainer: self]; + [folder setSource: [um sourceWithID: name]]; + } + domain = [domains nextObject]; + } + } + } + + if (!folder) + folder = [super lookupName: name inContext: lookupContext + acquire: acquire]; + + return folder; +} + - (NSException *) setDavContactsCategories: (NSString *) newCategories { SOGoUser *ownerUser; diff --git a/SoObjects/Contacts/SOGoContactLDIFEntry.m b/SoObjects/Contacts/SOGoContactLDIFEntry.m index 6801875fb..4472ae901 100644 --- a/SoObjects/Contacts/SOGoContactLDIFEntry.m +++ b/SoObjects/Contacts/SOGoContactLDIFEntry.m @@ -166,6 +166,11 @@ return @"text/x-vcard"; } +- (NSString *) davAddressData +{ + return [self contentAsString]; +} + - (NSException *) save { return [(SOGoContactSourceFolder *) container saveLDIFEntry: self]; diff --git a/SoObjects/Contacts/SOGoContactSourceFolder.m b/SoObjects/Contacts/SOGoContactSourceFolder.m index b4a5b2318..1f6437bb9 100644 --- a/SoObjects/Contacts/SOGoContactSourceFolder.m +++ b/SoObjects/Contacts/SOGoContactSourceFolder.m @@ -24,6 +24,7 @@ #import #import #import +#import #import #import @@ -34,17 +35,23 @@ #import #import #import +#import #import +#import +#import #import #import +#import #import #import #import +#import #import #import #import #import +#import #import "SOGoContactFolders.h" #import "SOGoContactGCSFolder.h" @@ -350,6 +357,273 @@ return result; } +- (NSString *) _deduceObjectNameFromURL: (NSString *) url + fromBaseURL: (NSString *) baseURL +{ + NSRange urlRange; + NSString *name; + + urlRange = [url rangeOfString: baseURL]; + if (urlRange.location != NSNotFound) + { + name = [url substringFromIndex: NSMaxRange (urlRange)]; + if ([name hasPrefix: @"/"]) + name = [name substringFromIndex: 1]; + } + else + name = nil; + + return name; +} + +/* TODO: multiget reorg */ +- (NSString *) _nodeTagForProperty: (NSString *) property +{ + NSString *namespace, *nodeName, *nsRep; + NSRange nsEnd; + + nsEnd = [property rangeOfString: @"}"]; + namespace + = [property substringFromRange: NSMakeRange (1, nsEnd.location - 1)]; + nodeName = [property substringFromIndex: nsEnd.location + 1]; + if ([namespace isEqualToString: XMLNS_CARDDAV]) + nsRep = @"C"; + else + nsRep = @"D"; + + return [NSString stringWithFormat: @"%@:%@", nsRep, nodeName]; +} + +- (NSString *) _nodeTag: (NSString *) property +{ + static NSMutableDictionary *tags = nil; + NSString *nodeTag; + + if (!tags) + tags = [NSMutableDictionary new]; + nodeTag = [tags objectForKey: property]; + if (!nodeTag) + { + nodeTag = [self _nodeTagForProperty: property]; + [tags setObject: nodeTag forKey: property]; + } + + return nodeTag; +} + +- (NSString **) _properties: (NSString **) properties + count: (unsigned int) propertiesCount + ofObject: (NSDictionary *) object +{ + SOGoContactLDIFEntry *ldifEntry; + NSString **currentProperty; + NSString **values, **currentValue; + SEL methodSel; + +// NSLog (@"_properties:ofObject:: %@", [NSDate date]); + + values = NSZoneMalloc (NULL, + (propertiesCount + 1) * sizeof (NSString *)); + *(values + propertiesCount) = nil; + + ldifEntry = [SOGoContactLDIFEntry + contactEntryWithName: [object objectForKey: @"c_name"] + withLDIFEntry: object + inContainer: self]; + currentProperty = properties; + currentValue = values; + while (*currentProperty) + { + methodSel = SOGoSelectorForPropertyGetter (*currentProperty); + if (methodSel && [ldifEntry respondsToSelector: methodSel]) + *currentValue = [[ldifEntry performSelector: methodSel] + stringByEscapingXMLString]; + currentProperty++; + currentValue++; + } + +// NSLog (@"/_properties:ofObject:: %@", [NSDate date]); + + return values; +} + +- (NSArray *) _propstats: (NSString **) properties + count: (unsigned int) propertiesCount + ofObject: (NSDictionary *) object +{ + NSMutableArray *propstats, *properties200, *properties404, *propDict; + NSString **property, **values, **currentValue; + NSString *propertyValue, *nodeTag; + +// NSLog (@"_propstats:ofObject:: %@", [NSDate date]); + + propstats = [NSMutableArray array]; + + properties200 = [NSMutableArray array]; + properties404 = [NSMutableArray array]; + + values = [self _properties: properties count: propertiesCount + ofObject: object]; + currentValue = values; + + property = properties; + while (*property) + { + nodeTag = [self _nodeTag: *property]; + if (*currentValue) + { + propertyValue = [NSString stringWithFormat: @"<%@>%@", + nodeTag, *currentValue, nodeTag]; + propDict = properties200; + } + else + { + propertyValue = [NSString stringWithFormat: @"<%@/>", nodeTag]; + propDict = properties404; + } + [propDict addObject: propertyValue]; + property++; + currentValue++; + } + free (values); + + if ([properties200 count]) + [propstats addObject: [NSDictionary dictionaryWithObjectsAndKeys: + properties200, @"properties", + @"HTTP/1.1 200 OK", @"status", + nil]]; + if ([properties404 count]) + [propstats addObject: [NSDictionary dictionaryWithObjectsAndKeys: + properties404, @"properties", + @"HTTP/1.1 404 Not Found", @"status", + nil]]; +// NSLog (@"/_propstats:ofObject:: %@", [NSDate date]); + + return propstats; +} + +- (void) _appendPropstat: (NSDictionary *) propstat + toBuffer: (NSMutableString *) r +{ + NSArray *properties; + unsigned int count, max; + + [r appendString: @""]; + properties = [propstat objectForKey: @"properties"]; + max = [properties count]; + for (count = 0; count < max; count++) + [r appendString: [properties objectAtIndex: count]]; + [r appendString: @""]; + [r appendString: [propstat objectForKey: @"status"]]; + [r appendString: @""]; +} + +- (void) appendObject: (NSDictionary *) object + properties: (NSString **) properties + count: (unsigned int) propertiesCount + withBaseURL: (NSString *) baseURL + toBuffer: (NSMutableString *) r +{ + NSArray *propstats; + unsigned int count, max; + + [r appendFormat: @""]; + [r appendString: baseURL]; + [r appendString: [[object objectForKey: @"c_name"] stringByEscapingURL]]; + [r appendString: @""]; + +// NSLog (@"(appendPropstats...): %@", [NSDate date]); + propstats = [self _propstats: properties count: propertiesCount + ofObject: object]; + max = [propstats count]; + for (count = 0; count < max; count++) + [self _appendPropstat: [propstats objectAtIndex: count] + toBuffer: r]; +// NSLog (@"/(appendPropstats...): %@", [NSDate date]); + + [r appendString: @""]; +} + +- (void) appendMissingObjectRef: (NSString *) href + toBuffer: (NSMutableString *) r +{ + [r appendString: @""]; + [r appendString: href]; + [r appendString: @"HTTP/1.1 404 Not Found"]; +} + +- (void) _appendComponentProperties: (NSArray *) properties + matchingURLs: (id ) refs + toResponse: (WOResponse *) response +{ + NSObject *element; + NSString *url, *baseURL, *cname; + NSString **propertiesArray; + NSMutableString *buffer; + unsigned int count, max, propertiesCount; + + baseURL = [self davURLAsString]; +#warning review this when fixing http://www.scalableogo.org/bugs/view.php?id=276 + if (![baseURL hasSuffix: @"/"]) + baseURL = [NSString stringWithFormat: @"%@/", baseURL]; + + propertiesArray = [properties asPointersOfObjects]; + propertiesCount = [properties count]; + + max = [refs length]; + buffer = [NSMutableString stringWithCapacity: max*512]; + + for (count = 0; count < max; count++) + { + element = [refs objectAtIndex: count]; + url = [[[element firstChild] nodeValue] stringByUnescapingURL]; + cname = [self _deduceObjectNameFromURL: url fromBaseURL: baseURL]; + if (cname) + [self appendObject: [source lookupContactEntry: cname] + properties: propertiesArray + count: propertiesCount + withBaseURL: baseURL + toBuffer: buffer]; + else + [self appendMissingObjectRef: url + toBuffer: buffer]; + } + [response appendContentString: buffer]; +// NSLog (@"/adding properties with url"); + + NSZoneFree (NULL, propertiesArray); +} + +- (WOResponse *) performMultigetInContext: (WOContext *) queryContext + inNamespace: (NSString *) namespace +{ + WOResponse *r; + id document; + DOMElement *documentElement, *propElement; + + r = [context response]; + [r prepareDAVResponse]; + [r appendContentString: + [NSString stringWithFormat: @"", namespace]]; + document = [[queryContext request] contentAsDOMDocument]; + documentElement = (DOMElement *) [document documentElement]; + propElement = [documentElement firstElementWithTag: @"prop" + inNamespace: @"DAV:"]; + [self _appendComponentProperties: [propElement flatPropertyNameOfSubElements] + matchingURLs: [documentElement getElementsByTagName: @"href"] + toResponse: r]; + [r appendContentString:@""]; + + return r; +} + +- (id) davAddressbookMultiget: (id) queryContext +{ + return [self performMultigetInContext: queryContext + inNamespace: @"urn:ietf:params:xml:ns:carddav"]; +} + - (NSString *) davDisplayName { return displayName; diff --git a/SoObjects/Contacts/SOGoUserFolder+Contacts.m b/SoObjects/Contacts/SOGoUserFolder+Contacts.m index 817c91cb8..2244456d4 100644 --- a/SoObjects/Contacts/SOGoUserFolder+Contacts.m +++ b/SoObjects/Contacts/SOGoUserFolder+Contacts.m @@ -29,6 +29,7 @@ #import #import +#import #import #import @@ -58,4 +59,30 @@ return [NSArray arrayWithObject: tag]; } +- (NSArray *) davDirectoryGateway +{ + NSArray *tag, *sources; + SOGoContactFolders *parent; + SOGoUserManager *um; + NSString *domain, *url; + + domain = [[context activeUser] domain]; + um = [SOGoUserManager sharedUserManager]; + sources = [um addressBookSourceIDsInDomain: domain]; + if ([sources count] > 0) + { + parent = [self privateContacts: @"Contacts" inContext: context]; + url = [NSString stringWithFormat: @"%@%@/", [parent davURLAsString], + [sources objectAtIndex: 0]]; + tag = [NSArray arrayWithObject: + [NSArray arrayWithObjects: @"href", @"DAV:", @"D", + url, nil]]; + } + else + tag = nil; + + return tag; +} + + @end From 4489085c59496805223fb1df9e885cd9a5dfae5f Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 27 Mar 2012 20:55:20 +0000 Subject: [PATCH 02/29] Monotone-Parent: c1548a6a3e72a7d9b567b63d50198115fa48ab0b Monotone-Revision: 7a38303ac45419355a1bdedefd53d63339248410 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-27T20:55:20 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 1 + SoObjects/Contacts/SOGoContactSourceFolder.m | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8c39ecf6a..b053aa93c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,7 @@ * SoObjects/Contacts/SOGoUserFolder+Contacts.m (-davDirectoryGateway): new getter that returns the url to the first available directory source. + (-davResourceType): declare resource as "directory" (carddav). 2012-03-26 Wolfgang Sourdeau diff --git a/SoObjects/Contacts/SOGoContactSourceFolder.m b/SoObjects/Contacts/SOGoContactSourceFolder.m index 1f6437bb9..260a7ce35 100644 --- a/SoObjects/Contacts/SOGoContactSourceFolder.m +++ b/SoObjects/Contacts/SOGoContactSourceFolder.m @@ -137,14 +137,13 @@ - (NSArray *) davResourceType { NSMutableArray *resourceType; - NSArray *cardDavCollection; - - cardDavCollection - = [NSArray arrayWithObjects: @"addressbook", - @"urn:ietf:params:xml:ns:carddav", nil]; + NSArray *type; resourceType = [NSMutableArray arrayWithArray: [super davResourceType]]; - [resourceType addObject: cardDavCollection]; + type = [NSArray arrayWithObjects: @"addressbook", XMLNS_CARDDAV, nil]; + [resourceType addObject: type]; + type = [NSArray arrayWithObjects: @"directory", XMLNS_CARDDAV, nil]; + [resourceType addObject: type]; return resourceType; } @@ -621,7 +620,7 @@ - (id) davAddressbookMultiget: (id) queryContext { return [self performMultigetInContext: queryContext - inNamespace: @"urn:ietf:params:xml:ns:carddav"]; + inNamespace: XMLNS_CARDDAV]; } - (NSString *) davDisplayName From d28ca1ecdcdfbcbd3c2090d04f3132885cdb04f3 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 28 Mar 2012 04:42:02 +0000 Subject: [PATCH 03/29] Monotone-Parent: 7a38303ac45419355a1bdedefd53d63339248410 Monotone-Revision: f8af7a968c459aff400e85a6c5422a0c7a370167 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-28T04:42:02 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 5 +++++ SoObjects/SOGo/LDAPSource.m | 14 +++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index b053aa93c..efb9ae8ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-03-28 Wolfgang Sourdeau + + * SoObjects/SOGo/LDAPSource.m (-allEntryIDs): take the _filter + ivar into account. + 2012-03-27 Wolfgang Sourdeau * SoObjects/Contacts/SOGoContactFolders.m diff --git a/SoObjects/SOGo/LDAPSource.m b/SoObjects/SOGo/LDAPSource.m index b5cbc146a..3269ca10c 100644 --- a/SoObjects/SOGo/LDAPSource.m +++ b/SoObjects/SOGo/LDAPSource.m @@ -830,6 +830,8 @@ andMultipleBookingsField: (NSString *) newMultipleBookingsField NSEnumerator *entries; NGLdapEntry *currentEntry; NGLdapConnection *ldapConnection; + EOQualifier *qualifier; + NSMutableString *qs; NSString *value; NSArray *attributes; NSMutableArray *ids; @@ -838,17 +840,23 @@ andMultipleBookingsField: (NSString *) newMultipleBookingsField ldapConnection = [self _ldapConnection]; attributes = [NSArray arrayWithObject: IDField]; + + qs = [NSMutableString stringWithFormat: @"(%@='*')", CNField]; + if ([_filter length]) + [qs appendFormat: @" AND %@", _filter]; + qualifier = [EOQualifier qualifierWithQualifierFormat: qs]; + if ([_scope caseInsensitiveCompare: @"BASE"] == NSOrderedSame) entries = [ldapConnection baseSearchAtBaseDN: baseDN - qualifier: nil + qualifier: qualifier attributes: attributes]; else if ([_scope caseInsensitiveCompare: @"ONE"] == NSOrderedSame) entries = [ldapConnection flatSearchAtBaseDN: baseDN - qualifier: nil + qualifier: qualifier attributes: attributes]; else entries = [ldapConnection deepSearchAtBaseDN: baseDN - qualifier: nil + qualifier: qualifier attributes: attributes]; while ((currentEntry = [entries nextObject])) From dcb952e1b7e04e2c42c43338e72602d0a588e7f9 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 28 Mar 2012 15:05:58 +0000 Subject: [PATCH 04/29] Monotone-Parent: f8af7a968c459aff400e85a6c5422a0c7a370167 Monotone-Revision: 600b3a1c268cabeca401fb335f2e4c76bd1709b7 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-28T15:05:58 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 ++++++ SoObjects/Contacts/SOGoFolder+CardDAV.m | 17 +++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index efb9ae8ec..ca5486e35 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2012-03-28 Wolfgang Sourdeau + * SoObjects/Contacts/SOGoFolder+CardDAV.m (_isValidFilter:): + accept "email" as filter name. + (_appendObject:withBaseURL:toREPORTResponse:): fixed the ordering + of XML elements as the address*-data props where put outside of + the tree. + * SoObjects/SOGo/LDAPSource.m (-allEntryIDs): take the _filter ivar into account. diff --git a/SoObjects/Contacts/SOGoFolder+CardDAV.m b/SoObjects/Contacts/SOGoFolder+CardDAV.m index fed4c2105..3466e940e 100644 --- a/SoObjects/Contacts/SOGoFolder+CardDAV.m +++ b/SoObjects/Contacts/SOGoFolder+CardDAV.m @@ -73,17 +73,17 @@ etagLine = [NSString stringWithFormat: @"%@", [component davEntityTag]]; [r appendContentString: etagLine]; - [r appendContentString: @"" - @"HTTP/1.1 200 OK" - @"" - @""]; + [r appendContentString: @""]; contactString = [[component contentAsString] stringByEscapingXMLString]; [r appendContentString: contactString]; - [r appendContentString: @"" - @""]; - [r appendContentString: contactString]; [r appendContentString: @"" - @""]; + @""]; + [r appendContentString: contactString]; + [r appendContentString: @"" + @"" + @"HTTP/1.1 200 OK" + @"" + @""]; } } @@ -124,6 +124,7 @@ return ([newString isEqualToString: @"sn"] || [newString isEqualToString: @"givenname"] + || [newString isEqualToString: @"email"] || [newString isEqualToString: @"mail"] || [newString isEqualToString: @"telephonenumber"]); } From 269393250b5b2a4b2aece6145b5c20a9a0e47f6a Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 28 Mar 2012 20:04:32 +0000 Subject: [PATCH 05/29] Monotone-Parent: 600b3a1c268cabeca401fb335f2e4c76bd1709b7 Monotone-Revision: d93b5b4142f73cdb24bac181e6d92140b7a59313 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-28T20:04:32 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 7 +++++++ OpenChange/SOGoMAPIFSMessage.h | 2 +- OpenChange/SOGoMAPIFSMessage.m | 33 ++++++++++++++++----------------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index ca5486e35..a7793891b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2012-03-28 Wolfgang Sourdeau + * OpenChange/SOGoMAPIFSMessage.m + (_readFileChangesDataWithDate:andInode:): use the inode number + rather than the filesize as change indicator since a new file is + created each time the dictionary is written to disk, thanks to the + "atomically" flag. + (-save): write the file atomically. + * SoObjects/Contacts/SOGoFolder+CardDAV.m (_isValidFilter:): accept "email" as filter name. (_appendObject:withBaseURL:toREPORTResponse:): fixed the ordering diff --git a/OpenChange/SOGoMAPIFSMessage.h b/OpenChange/SOGoMAPIFSMessage.h index 0a0385721..ec6494938 100644 --- a/OpenChange/SOGoMAPIFSMessage.h +++ b/OpenChange/SOGoMAPIFSMessage.h @@ -31,7 +31,7 @@ @interface SOGoMAPIFSMessage : SOGoMAPIVolatileMessage { NSString *completeFilename; - NSUInteger fileSize; + NSUInteger inode; NSData *lastModificationTime; } diff --git a/OpenChange/SOGoMAPIFSMessage.m b/OpenChange/SOGoMAPIFSMessage.m index 495bba96d..8a854fa1d 100644 --- a/OpenChange/SOGoMAPIFSMessage.m +++ b/OpenChange/SOGoMAPIFSMessage.m @@ -41,7 +41,7 @@ if ((self = [super init])) { completeFilename = nil; - fileSize = 0; + inode = 0; lastModificationTime = nil; } @@ -86,7 +86,7 @@ } - (BOOL) _readFileChangesDataWithDate: (NSDate **) newLMTime - andSize: (NSUInteger *) newFileSize + andInode: (NSUInteger *) newInode { BOOL rc; NSDictionary *attributes; @@ -97,7 +97,7 @@ if (attributes) { *newLMTime = [attributes fileModificationDate]; - *newFileSize = [attributes fileSize]; + *newInode = [attributes fileSystemFileNumber]; rc = YES; } else @@ -107,22 +107,22 @@ } - (BOOL) _checkFileChangesDataWithDate: (NSDate **) newLMTime - andSize: (NSUInteger *) newFileSize + andInode: (NSUInteger *) newInode { BOOL hasChanged = NO; NSDate *lastLMTime; - NSUInteger lastFileSize; + NSUInteger lastInode; if ([self _readFileChangesDataWithDate: &lastLMTime - andSize: &lastFileSize]) + andInode: &lastInode]) { - if (fileSize != lastFileSize + if (inode != lastInode || ![lastModificationTime isEqual: lastLMTime]) { if (lastLMTime) *newLMTime = lastLMTime; - if (newFileSize) - *newFileSize = lastFileSize; + if (newInode) + *newInode = lastInode; hasChanged = YES; } } @@ -136,10 +136,10 @@ NSString *error; NSPropertyListFormat format; NSDate *lastLMTime; - NSUInteger lastFileSize; + NSUInteger lastInode; if ([self _checkFileChangesDataWithDate: &lastLMTime - andSize: &lastFileSize]) + andInode: &lastInode]) { [self logWithFormat: @"file '%@' new or modified: rereading properties", [self completeFilename]]; @@ -158,7 +158,7 @@ @" of message: '%@'", error]; } ASSIGN (lastModificationTime, lastLMTime); - fileSize = lastFileSize; + inode = lastInode; } return [super properties]; @@ -168,7 +168,7 @@ { NSData *content; NSDate *lastLMTime; - NSUInteger lastFileSize; + NSUInteger lastInode; [container ensureDirectory]; @@ -178,14 +178,13 @@ dataFromPropertyList: [self properties] format: NSPropertyListBinaryFormat_v1_0 errorDescription: NULL]; - if (![content writeToFile: [self completeFilename] atomically: NO]) + if (![content writeToFile: [self completeFilename] atomically: YES]) [NSException raise: @"MAPIStoreIOException" format: @"could not save message"]; - [self _readFileChangesDataWithDate: &lastLMTime - andSize: &lastFileSize]; + [self _readFileChangesDataWithDate: &lastLMTime andInode: &lastInode]; ASSIGN (lastModificationTime, lastLMTime); - fileSize = lastFileSize; + inode = lastInode; // [self logWithFormat: @"fs message written to '%@'", [self completeFilename]]; } From 64b8498eac7f1aa0b900e98675889cf2daa0dd5b Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 30 Mar 2012 14:09:07 +0000 Subject: [PATCH 06/29] Monotone-Parent: 34215cf1c90ce31c32de705320b2cd5f2bee55ec Monotone-Revision: d1a795ace9b3ecfe78615e345153f5c37d0ca4b2 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-30T14:09:07 Monotone-Branch: ca.inverse.sogo --- Version | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Version b/Version index 4364995c1..09503ebca 100644 --- a/Version +++ b/Version @@ -2,6 +2,6 @@ # This file is included by library makefiles to set the version information # of the executable. -MAJOR_VERSION=1 -MINOR_VERSION=3 -SUBMINOR_VERSION=15 +MAJOR_VERSION=2 +MINOR_VERSION=0 +SUBMINOR_VERSION=0 From 2adcb276b2f09ada9c427de36d4625c84dabdefb Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 30 Mar 2012 15:33:47 +0000 Subject: [PATCH 07/29] Monotone-Parent: 4899b773e21bd6c56bae726bf720e184b8ef9ec0 Monotone-Revision: cb7b77723f765942d950c5620150b720f5d0c5b1 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-30T15:33:47 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 8 ++++++++ OpenChange/MAPIStoreCalendarMessage.m | 4 ++-- OpenChange/MAPIStoreContext.h | 4 ++-- OpenChange/MAPIStoreMailMessage.m | 2 +- OpenChange/MAPIStoreObject.h | 2 -- OpenChange/MAPIStoreObject.m | 15 --------------- OpenChange/MAPIStoreUserContext.h | 4 ++++ OpenChange/MAPIStoreUserContext.m | 14 ++++++++++++++ 8 files changed, 31 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 646dab57b..8859b3097 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2012-03-30 Wolfgang Sourdeau + + * OpenChange/MAPIStoreUserContext.m (-timeZone): new method that + returns the timezone of an owner user. + + * OpenChange/MAPIStoreObject.m (-ownerTimeZone): removed method, + replaced with the one above. + 2012-03-29 Francis Lachapelle * UI/WebServerResources/UIxPreferences.js (savePreferences): fixed diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 004a30afc..6890fe172 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -118,7 +118,7 @@ [MAPIStoreAppointmentWrapper wrapperWithICalEvent: event andUser: [userContext sogoUser] andSenderEmail: nil - inTimeZone: [self ownerTimeZone] + inTimeZone: [userContext timeZone] withConnectionInfo: [context connectionInfo]]); } @@ -766,7 +766,7 @@ isAllDay = [value boolValue]; if (!isAllDay) { - tzName = [[self ownerTimeZone] name]; + tzName = [[[self userContext] timeZone] name]; tz = [iCalTimeZone timeZoneForName: tzName]; [vCalendar addTimeZone: tz]; } diff --git a/OpenChange/MAPIStoreContext.h b/OpenChange/MAPIStoreContext.h index ef3be71a6..fdea9bbd1 100644 --- a/OpenChange/MAPIStoreContext.h +++ b/OpenChange/MAPIStoreContext.h @@ -55,8 +55,8 @@ { struct mapistore_connection_info *connInfo; NSMutableArray *containersBag; - SOGoUser *activeUser; - MAPIStoreUserContext *userContext; + SOGoUser *activeUser; /* the user accessing the resource */ + MAPIStoreUserContext *userContext; /* the owner or the resource */ NSURL *contextUrl; } diff --git a/OpenChange/MAPIStoreMailMessage.m b/OpenChange/MAPIStoreMailMessage.m index aa0469774..005cade2f 100644 --- a/OpenChange/MAPIStoreMailMessage.m +++ b/OpenChange/MAPIStoreMailMessage.m @@ -284,7 +284,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) wrapperWithICalEvent: event andUser: [context activeUser] andSenderEmail: senderEmail - inTimeZone: [self ownerTimeZone] + inTimeZone: [[self userContext] timeZone] withConnectionInfo: [context connectionInfo]]; [appointmentWrapper retain]; } diff --git a/OpenChange/MAPIStoreObject.h b/OpenChange/MAPIStoreObject.h index 773e806ac..cb7ed7809 100644 --- a/OpenChange/MAPIStoreObject.h +++ b/OpenChange/MAPIStoreObject.h @@ -77,8 +77,6 @@ - (uint64_t) objectId; - (NSString *) url; -- (NSTimeZone *) ownerTimeZone; - /* properties */ - (BOOL) canGetProperty: (enum MAPITAGS) propTag; diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index c0649c7a3..f2f8d0ebe 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -210,21 +210,6 @@ static Class NSExceptionK, MAPIStoreFolderK; containerURL, [self nameInContainer]]; } -- (NSTimeZone *) ownerTimeZone -{ - NSString *owner; - SOGoUserDefaults *ud; - NSTimeZone *tz; - WOContext *woContext; - - woContext = [[self userContext] woContext]; - owner = [sogoObject ownerInContext: woContext]; - ud = [[SOGoUser userWithLogin: owner] userDefaults]; - tz = [ud timeZone]; - - return tz; -} - - (void) addProperties: (NSDictionary *) newNewProperties { [properties addEntriesFromDictionary: newNewProperties]; diff --git a/OpenChange/MAPIStoreUserContext.h b/OpenChange/MAPIStoreUserContext.h index 43ae2e7ed..5cdd38710 100644 --- a/OpenChange/MAPIStoreUserContext.h +++ b/OpenChange/MAPIStoreUserContext.h @@ -27,6 +27,7 @@ @class NSMutableDictionary; @class NSString; +@class NSTimeZone; @class WOContext; @@ -43,6 +44,7 @@ { NSString *username; SOGoUser *sogoUser; + NSTimeZone *timeZone; SOGoUserFolder *userFolder; NSMutableArray *containersBag; @@ -63,6 +65,8 @@ - (NSString *) username; - (SOGoUser *) sogoUser; +- (NSTimeZone *) timeZone; + - (SOGoUserFolder *) userFolder; - (NSDictionary *) rootFolders; diff --git a/OpenChange/MAPIStoreUserContext.m b/OpenChange/MAPIStoreUserContext.m index 53f20d37c..dcb3cfb72 100644 --- a/OpenChange/MAPIStoreUserContext.m +++ b/OpenChange/MAPIStoreUserContext.m @@ -137,6 +137,20 @@ static NSMapTable *contextsTable = nil; return sogoUser; } +- (NSTimeZone *) timeZone +{ + if (!timeZone) + { + SOGoUser *user; + + user = [self sogoUser]; + timeZone = [[user userDefaults] timeZone]; + [timeZone retain]; + } + + return timeZone; +} + - (SOGoUserFolder *) userFolder { if (!userFolder) From a4b083eb1e8a564e321e49788f546fb6848aac98 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 30 Mar 2012 19:51:37 +0000 Subject: [PATCH 08/29] Monotone-Parent: cb7b77723f765942d950c5620150b720f5d0c5b1 Monotone-Revision: 1900d82b81c570a73d4db548a566ed09b57ee43a Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-30T19:51:37 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 5 +++++ OpenChange/MAPIApplication.m | 5 +++++ OpenChange/MAPIStoreAppointmentWrapper.h | 2 -- OpenChange/MAPIStoreAppointmentWrapper.m | 4 ---- OpenChange/MAPIStoreContactsAttachment.m | 2 -- OpenChange/MAPIStoreTypes.h | 3 +++ OpenChange/MAPIStoreTypes.m | 2 ++ 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8859b3097..2f00edb37 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2012-03-30 Wolfgang Sourdeau + * OpenChange/MAPIApplication.m (-init): utcTZ is now initialized + here. + + * OpenChange/MAPIStoreTypes.[hm]: new host module for utcTZ. + * OpenChange/MAPIStoreUserContext.m (-timeZone): new method that returns the timezone of an owner user. diff --git a/OpenChange/MAPIApplication.m b/OpenChange/MAPIApplication.m index 707e0f579..8da1c1078 100644 --- a/OpenChange/MAPIApplication.m +++ b/OpenChange/MAPIApplication.m @@ -21,6 +21,7 @@ */ #import +#import #import #import @@ -28,6 +29,7 @@ #import #import "MAPIStoreUserContext.h" +#import "MAPIStoreTypes.h" #import "MAPIApplication.h" @@ -49,6 +51,9 @@ MAPIApplication *MAPIApp = nil; MAPIApp = [super init]; [MAPIApp retain]; + + utcTZ = [NSTimeZone timeZoneWithName: @"UTC"]; + [utcTZ retain]; } return MAPIApp; diff --git a/OpenChange/MAPIStoreAppointmentWrapper.h b/OpenChange/MAPIStoreAppointmentWrapper.h index efb5ac2a1..74b275275 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.h +++ b/OpenChange/MAPIStoreAppointmentWrapper.h @@ -35,8 +35,6 @@ @class SOGoUser; -extern NSTimeZone *utcTZ; - @interface MAPIStoreAppointmentWrapper : NSObject { struct mapistore_connection_info *connInfo; diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index b3eb8df02..c3eddf6fe 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -59,16 +59,12 @@ #include #include -NSTimeZone *utcTZ; - static NSCharacterSet *hexCharacterSet = nil; @implementation MAPIStoreAppointmentWrapper + (void) initialize { - utcTZ = [NSTimeZone timeZoneWithName: @"UTC"]; - [utcTZ retain]; if (!hexCharacterSet) { hexCharacterSet = [NSCharacterSet characterSetWithCharactersInString: @"1234567890abcdefABCDEF"]; diff --git a/OpenChange/MAPIStoreContactsAttachment.m b/OpenChange/MAPIStoreContactsAttachment.m index 6a9afe86a..00fc652d6 100644 --- a/OpenChange/MAPIStoreContactsAttachment.m +++ b/OpenChange/MAPIStoreContactsAttachment.m @@ -35,8 +35,6 @@ #include -extern NSTimeZone *utcTZ; - /* TODO: handle URL pictures via PidTagAttachMethod = ref ? */ @implementation MAPIStoreContactsAttachment diff --git a/OpenChange/MAPIStoreTypes.h b/OpenChange/MAPIStoreTypes.h index 286c0b298..8e2fb7d46 100644 --- a/OpenChange/MAPIStoreTypes.h +++ b/OpenChange/MAPIStoreTypes.h @@ -32,6 +32,9 @@ @class NSData; @class NSDictionary; +@class NSTimeZone; + +extern NSTimeZone *utcTZ; uint8_t *MAPIBoolValue (void *memCtx, BOOL value); uint32_t *MAPILongValue (void *memCtx, uint32_t value); diff --git a/OpenChange/MAPIStoreTypes.m b/OpenChange/MAPIStoreTypes.m index bcef90ae1..fc4ca727a 100644 --- a/OpenChange/MAPIStoreTypes.m +++ b/OpenChange/MAPIStoreTypes.m @@ -36,6 +36,8 @@ #include #include +NSTimeZone *utcTZ; + uint8_t * MAPIBoolValue (void *memCtx, BOOL value) { From 4f148bafc653837d50509ec8cca7f6e134dd5b3c Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 30 Mar 2012 19:58:16 +0000 Subject: [PATCH 09/29] Monotone-Parent: 1900d82b81c570a73d4db548a566ed09b57ee43a Monotone-Revision: b0de6c606ce6f295a8956a42ed0f0bc3b6e3cca3 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-30T19:58:16 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 8 ++++ OpenChange/MAPIStoreCalendarMessage.m | 30 +++++++------- OpenChange/MAPIStoreMailVolatileMessage.m | 7 +++- OpenChange/MAPIStoreObject.m | 33 ++++++++++++--- OpenChange/MAPIStoreTasksMessage.m | 49 ++++++++--------------- 5 files changed, 75 insertions(+), 52 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2f00edb37..ed8c5bedd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2012-03-30 Wolfgang Sourdeau + * OpenChange/MAPIStoreTasksMessage.m (-save): do not reset fields + that have not been passed in the properties array, since only + RopDeleteProperties should remove them. + + * OpenChange/MAPIStoreObject.m (-addPropertiesFromRow:): dates are + now all converted to the user's timezone, even though it just + inverts the problem we currently have. + * OpenChange/MAPIApplication.m (-init): utcTZ is now initialized here. diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 6890fe172..70aa0b64a 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -770,6 +770,8 @@ tz = [iCalTimeZone timeZoneForName: tzName]; [vCalendar addTimeZone: tz]; } + else + tz = nil; // start value = [properties objectForKey: MAPIPropertyKey (PR_START_DATE)]; @@ -779,18 +781,18 @@ if (value) { start = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtstart"]; + [start setTimeZone: tz]; if (isAllDay) + { + [start setDate: value]; + [start setTimeZone: nil]; + } + else { tzOffset = [[value timeZone] secondsFromGMTForDate: value]; value = [value dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 - seconds: -tzOffset]; - [start setTimeZone: nil]; - [start setDate: value]; - } - else - { - [start setTimeZone: tz]; + seconds: tzOffset]; [start setDateTime: value]; } } @@ -802,18 +804,18 @@ if (value) { end = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtend"]; + [end setTimeZone: tz]; if (isAllDay) + { + [end setDate: value]; + [end setTimeZone: nil]; + } + else { tzOffset = [[value timeZone] secondsFromGMTForDate: value]; value = [value dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 - seconds: -tzOffset]; - [end setTimeZone: nil]; - [end setDate: value]; - } - else - { - [end setTimeZone: tz]; + seconds: tzOffset]; [end setDateTime: value]; } } diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index 2d5a937e5..3a3d66be3 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -29,6 +29,7 @@ #import #import #import +#import #import #import #import @@ -495,7 +496,11 @@ FillMessageHeadersFromProperties (NGMutableHashMap *headers, date = [mailProperties objectForKey: MAPIPropertyKey (PR_CLIENT_SUBMIT_TIME)]; if (date) - [headers addObject: [date rfc822DateString] forKey: @"date"]; + { + date = [date addYear: 0 month: 0 day: 0 + hour: 0 minute: 0 second: [[date timeZone] secondsFromGMT]]; + [headers addObject: [date rfc822DateString] forKey: @"date"]; + } [headers addObject: @"1.0" forKey: @"MIME-Version"]; } diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index f2f8d0ebe..fd727e180 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -20,7 +20,9 @@ * Boston, MA 02111-1307, USA. */ +#import #import +#import #import #import #import @@ -432,16 +434,37 @@ static Class NSExceptionK, MAPIStoreFolderK; struct SPropValue *cValue; NSUInteger counter; NSMutableDictionary *newProperties; + NSTimeZone *tz; + NSInteger tzOffset; + id value; + + tz = nil; newProperties = [NSMutableDictionary dictionaryWithCapacity: aRow->cValues]; for (counter = 0; counter < aRow->cValues; counter++) { cValue = aRow->lpProps + counter; - if ((cValue->ulPropTag & 0xfff) == PT_STRING8) - [self warnWithFormat: - @"attempting to set string property as PR_STRING8: %.8x", - cValue->ulPropTag]; - [newProperties setObject: NSObjectFromSPropValue (cValue) + value = NSObjectFromSPropValue (cValue); + switch (cValue->ulPropTag & 0xffff) + { + case PT_STRING8: + case PT_MV_STRING8: + [self warnWithFormat: + @"attempting to set string property as PR_STRING8: %.8x", + cValue->ulPropTag]; + break; + case PT_SYSTIME: + if (!tz) + { + tz = [[self userContext] timeZone]; + tzOffset = -[tz secondsFromGMT]; + } + value = [value addYear: 0 month: 0 day: 0 + hour: 0 minute: 0 second: tzOffset]; + [value setTimeZone: tz]; + break; + } + [newProperties setObject: value forKey: MAPIPropertyKey (cValue->ulPropTag)]; } diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index 963c04a0b..cad848f76 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -329,7 +329,8 @@ iCalToDo *vToDo; id value; iCalDateTime *date; - NSString *status, *priority; + iCalTimeZone *tz; + NSString *status, *priority, *tzName; NSCalendarDate *now; NSInteger tzOffset; double doubleValue; @@ -338,6 +339,10 @@ vCalendar = [vToDo parent]; [vCalendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"]; + tzName = [[[self userContext] timeZone] name]; + tz = [iCalTimeZone timeZoneForName: tzName]; + [vCalendar addTimeZone: tz]; + // summary value = [properties objectForKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)]; @@ -358,12 +363,12 @@ value = [value htmlToText]; } } - if (value && [value length] == 0) - value = nil; - [vToDo setComment: value]; - if (value) - [vToDo setComment: value]; + { + if ([value length] == 0) + value = nil; + [vToDo setComment: value]; + } // location value = [properties objectForKey: MAPIPropertyKey (PidLidLocation)]; @@ -388,31 +393,17 @@ if (value) { date = (iCalDateTime *) [vToDo uniqueChildWithTag: @"dtstart"]; - tzOffset = [[value timeZone] secondsFromGMTForDate: value]; - value = [value dateByAddingYears: 0 months: 0 days: 0 - hours: 0 minutes: 0 - seconds: -tzOffset]; - [date setDate: value]; + [date setTimeZone: tz]; + [date setDateTime: value]; } - else - { - [vToDo setStartDate: nil]; - } - + // due value = [properties objectForKey: MAPIPropertyKey (PidLidTaskDueDate)]; if (value) { date = (iCalDateTime *) [vToDo uniqueChildWithTag: @"due"]; - tzOffset = [[value timeZone] secondsFromGMTForDate: value]; - value = [value dateByAddingYears: 0 months: 0 days: 0 - hours: 0 minutes: 0 - seconds: -tzOffset]; - [date setDate: value]; - } - else - { - [vToDo setDue: nil]; + [date setTimeZone: tz]; + [date setDateTime: value]; } // completed @@ -426,10 +417,6 @@ seconds: -tzOffset]; [date setDate: value]; } - else - { - [vToDo setCompleted: nil]; - } // status value = [properties objectForKey: MAPIPropertyKey (PidLidTaskStatus)]; @@ -459,10 +446,8 @@ default: // IMPORTANCE_NORMAL priority = @"5"; } + [vToDo setPriority: priority]; } - else - priority = @"0"; // None - [vToDo setPriority: priority]; // percent complete // NOTE: this does not seem to work on Outlook 2003. PidLidPercentComplete's value From 07b500412fc0d2b7542a3ff6199a5efa51c81213 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 30 Mar 2012 20:02:33 +0000 Subject: [PATCH 10/29] Monotone-Parent: b0de6c606ce6f295a8956a42ed0f0bc3b6e3cca3 Monotone-Revision: 24970ed1a272e80da6d29bce76d7fb4093a1d2a6 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-30T20:02:33 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 4 ++++ OpenChange/MAPIStoreCalendarMessage.m | 11 +++++++---- OpenChange/MAPIStoreTasksMessage.m | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed8c5bedd..be5956ea4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,12 @@ 2012-03-30 Wolfgang Sourdeau + * OpenChange/MAPIStoreCalendarMessage.m (-save): remove comment if + content is "\n". + * OpenChange/MAPIStoreTasksMessage.m (-save): do not reset fields that have not been passed in the properties array, since only RopDeleteProperties should remove them. + Remove comment if content is "\n". * OpenChange/MAPIStoreObject.m (-addPropertiesFromRow:): dates are now all converted to the user's timezone, even though it just diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 70aa0b64a..daa9cc83d 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -874,10 +874,13 @@ value = [value htmlToText]; } } - if (value && [value length] == 0) - value = nil; - [newEvent setComment: value]; - + if (value) + { + if ([value length] == 0 || [value isEqualToString: @"\\n"]) + value = nil; + [newEvent setComment: value]; + } + /* recurrence */ value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentRecur)]; diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index cad848f76..e3a24afe5 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -365,7 +365,7 @@ } if (value) { - if ([value length] == 0) + if ([value length] == 0 || [value isEqualToString: @"\\n"]) value = nil; [vToDo setComment: value]; } From 060b29f5562acf8ef509f180388815229cee8970 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 3 Apr 2012 20:56:58 +0000 Subject: [PATCH 11/29] Monotone-Parent: 24970ed1a272e80da6d29bce76d7fb4093a1d2a6 Monotone-Revision: 4759c8b57eaf377a0e0d928df4a65adaa731ad74 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-03T20:56:58 Monotone-Branch: ca.inverse.sogo --- debian/control-squeeze | 45 ++++++++++++++++++++++++++++++++++++++++++ debian/rules | 10 ++++++++++ 2 files changed, 55 insertions(+) create mode 100644 debian/control-squeeze diff --git a/debian/control-squeeze b/debian/control-squeeze new file mode 100644 index 000000000..019b6335b --- /dev/null +++ b/debian/control-squeeze @@ -0,0 +1,45 @@ +Source: sogo +Priority: optional +Maintainer: Inverse Support +Build-Depends: debhelper (>= 7.0.15), gobjc | objc-compiler, libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-gdl1-4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev, libxml2-dev, libsbjson-dev, libssl-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev, libmapi-dev, libmapistore-dev, libmapiproxy-dev +Section: web +Standards-Version: 3.9.1 + +Package: sogo +Section: web +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, tmpreaper, sope4.9-libxmlsaxdriver, sope4.9-db-connector, gnustep-make, libcurl3 +Suggests: nginx +Description: a modern and scalable groupware + SOGo is a groupware server built around OpenGroupware.org (OGo) and + 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 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. + +Package: sogo-openchange +Section: net +Priority: extra +Architecture: any +Depends: sogo (= ${binary:Version}), ${misc:Depends} +Description: a modern and scalable groupware - OpenChange backend + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the backend plugin for using SOGo as a backend to OpenChange. + +Package: sogo-dbg +Section: debug +Priority: extra +Architecture: any +Depends: sogo (= ${binary:Version}), ${misc:Depends} +Description: a modern and scalable groupware - debugging symbols + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the debugging symbols for SOGo. diff --git a/debian/rules b/debian/rules index 4c5529411..38028afbf 100755 --- a/debian/rules +++ b/debian/rules @@ -14,6 +14,9 @@ build-arch: build-arch-stamp build-arch-stamp: config.make # Add here commands to compile the arch part of the package. $(MAKE) + if pkg-config --atleast-version=1.0 libmapi; \ + then (cd OpenChange; $(MAKE)); \ + fi touch $@ clean: @@ -21,6 +24,9 @@ clean: dh_testroot rm -f build-arch-stamp if [ -f config.make ]; then make clean; fi + if pkg-config --atleast-version=1.0 libmapi; \ + then (cd OpenChange; make clean); \ + fi dh_clean install: install-arch @@ -37,6 +43,10 @@ install-arch: build-arch # dh_installdirs -s $(MAKE) DESTDIR=$(CURDIR)/debian/tmp GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install + if pkg-config --atleast-version=1.0 libmapi; \ + then (cd OpenChange; $(MAKE) DESTDIR=$(CURDIR)/debian/tmp GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install); \ + fi + mkdir -p debian/tmp/etc/default cp Scripts/sogo-default debian/tmp/etc/default/sogo mkdir -p debian/tmp/usr/share/lintian/overrides From 1e1cdcc89c84624095701fe2fcf576057d881270 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 14:25:42 +0000 Subject: [PATCH 12/29] Monotone-Parent: 4759c8b57eaf377a0e0d928df4a65adaa731ad74 Monotone-Revision: 187ac928b725957508cddf0bb5f4aeebc606ab3e Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T14:25:42 Monotone-Branch: ca.inverse.sogo --- OpenChange/SOGoMAPIFSFolder.m | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenChange/SOGoMAPIFSFolder.m b/OpenChange/SOGoMAPIFSFolder.m index 429e23f93..b26e0ea9d 100644 --- a/OpenChange/SOGoMAPIFSFolder.m +++ b/OpenChange/SOGoMAPIFSFolder.m @@ -39,6 +39,7 @@ #import "SOGoMAPIFSFolder.h" #undef DEBUG +#include #include #include #include From 6d22a0bb495e6a21d4ce48cc5a9791dee2faabeb Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 14:33:59 +0000 Subject: [PATCH 13/29] Monotone-Parent: 187ac928b725957508cddf0bb5f4aeebc606ab3e Monotone-Revision: ef03560e468928024dd2c8b7176bc66f200c293c Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T14:33:59 Monotone-Branch: ca.inverse.sogo --- OpenChange/MAPIStoreFAIMessage.m | 1 + OpenChange/MAPIStoreFallbackContext.m | 1 + OpenChange/MAPIStoreRecurrenceUtils.m | 2 ++ OpenChange/NSArray+MAPIStore.m | 1 + OpenChange/NSDate+MAPIStore.m | 1 + 5 files changed, 6 insertions(+) diff --git a/OpenChange/MAPIStoreFAIMessage.m b/OpenChange/MAPIStoreFAIMessage.m index 81a9dfb9c..0611c6347 100644 --- a/OpenChange/MAPIStoreFAIMessage.m +++ b/OpenChange/MAPIStoreFAIMessage.m @@ -28,6 +28,7 @@ #import "MAPIStoreFAIMessage.h" #undef DEBUG +#include #include #include #include diff --git a/OpenChange/MAPIStoreFallbackContext.m b/OpenChange/MAPIStoreFallbackContext.m index f77ecea68..c5270d055 100644 --- a/OpenChange/MAPIStoreFallbackContext.m +++ b/OpenChange/MAPIStoreFallbackContext.m @@ -31,6 +31,7 @@ #import "MAPIStoreFallbackContext.h" #undef DEBUG +#include #include @implementation MAPIStoreFallbackContext diff --git a/OpenChange/MAPIStoreRecurrenceUtils.m b/OpenChange/MAPIStoreRecurrenceUtils.m index 010066e43..09d6ce793 100644 --- a/OpenChange/MAPIStoreRecurrenceUtils.m +++ b/OpenChange/MAPIStoreRecurrenceUtils.m @@ -21,6 +21,7 @@ */ #import +#import #import #import @@ -32,6 +33,7 @@ #import "NSDate+MAPIStore.h" #import "MAPIStoreRecurrenceUtils.h" +#include #include #include #include diff --git a/OpenChange/NSArray+MAPIStore.m b/OpenChange/NSArray+MAPIStore.m index 1192ce124..7a41245d4 100644 --- a/OpenChange/NSArray+MAPIStore.m +++ b/OpenChange/NSArray+MAPIStore.m @@ -29,6 +29,7 @@ #import "NSArray+MAPIStore.h" #undef DEBUG +#include #include #include #include diff --git a/OpenChange/NSDate+MAPIStore.m b/OpenChange/NSDate+MAPIStore.m index 1c09fd0a2..eb873978b 100644 --- a/OpenChange/NSDate+MAPIStore.m +++ b/OpenChange/NSDate+MAPIStore.m @@ -27,6 +27,7 @@ #import "NSDate+MAPIStore.h" #undef DEBUG +#include #include #include #include From ad900e855517f6ffdb286b0b1a3428d01510ed55 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 14:42:03 +0000 Subject: [PATCH 14/29] Monotone-Parent: ef03560e468928024dd2c8b7176bc66f200c293c Monotone-Revision: 5917f0d7b5316a06c638876b97dc983b080ce797 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T14:42:03 Monotone-Branch: ca.inverse.sogo --- Apache/SOGo-debian.conf | 67 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 Apache/SOGo-debian.conf diff --git a/Apache/SOGo-debian.conf b/Apache/SOGo-debian.conf new file mode 100644 index 000000000..f4f32a335 --- /dev/null +++ b/Apache/SOGo-debian.conf @@ -0,0 +1,67 @@ +Alias /SOGo.woa/WebServerResources/ \ + /usr/share/SOGo/WebServerResources/ +Alias /SOGo/WebServerResources/ \ + /usr/share/SOGo/WebServerResources/ +AliasMatch /SOGo/so/ControlPanel/Products/(.*)/Resources/(.*) \ + /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2 + + + AllowOverride None + Order deny,allow + Allow from all + + + + SetHandler default-handler + + +## Uncomment the following to enable proxy-side authentication, you will then +## need to set the "SOGoTrustProxyAuthentication" SOGo user default to YES and +## adjust the "x-webobjects-remote-user" proxy header in the "Proxy" section +## below. +# +# AuthType XXX +# Require valid-user +# SetEnv proxy-nokeepalive 1 +# Allow from all +# + +ProxyRequests Off +SetEnv proxy-nokeepalive 1 +ProxyPreserveHost On + +# When using CAS, you should uncomment this and install cas-proxy-validate.py +# in /usr/lib/cgi-bin to reduce server overloading +# +# ProxyPass /SOGo/casProxy http://localhost/cgi-bin/cas-proxy-validate.py +# +# Order deny,allow +# Allow from your-cas-host-addr +# + +ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0 + + +## adjust the following to your configuration + RequestHeader set "x-webobjects-server-port" "443" + RequestHeader set "x-webobjects-server-name" "yourhostname" + RequestHeader set "x-webobjects-server-url" "https://yourhostname" + +## When using proxy-side autentication, you need to uncomment and +## adjust the following line: +# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e" + + RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0" + RequestHeader set "x-webobjects-remote-host" %{REMOTE_HOST}e env=REMOTE_HOST + + AddDefaultCharset UTF-8 + + Order allow,deny + Allow from all + + +## We use mod_rewrite to pass remote address to the SOGo proxy. +# The remote address will appear in SOGo's log files and in the X-Forward +# header of emails. +RewriteEngine On +RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT] From 57e55c105dd2cf0998210a099d3bfd6e9263c982 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 14:55:54 +0000 Subject: [PATCH 15/29] Monotone-Parent: 5917f0d7b5316a06c638876b97dc983b080ce797 Monotone-Revision: 3d32d81fda0002213d650cb8e71bfd4508d1b134 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T14:55:54 Monotone-Branch: ca.inverse.sogo --- Apache/SOGo-debian.conf | 67 ----------------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 Apache/SOGo-debian.conf diff --git a/Apache/SOGo-debian.conf b/Apache/SOGo-debian.conf deleted file mode 100644 index f4f32a335..000000000 --- a/Apache/SOGo-debian.conf +++ /dev/null @@ -1,67 +0,0 @@ -Alias /SOGo.woa/WebServerResources/ \ - /usr/share/SOGo/WebServerResources/ -Alias /SOGo/WebServerResources/ \ - /usr/share/SOGo/WebServerResources/ -AliasMatch /SOGo/so/ControlPanel/Products/(.*)/Resources/(.*) \ - /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2 - - - AllowOverride None - Order deny,allow - Allow from all - - - - SetHandler default-handler - - -## Uncomment the following to enable proxy-side authentication, you will then -## need to set the "SOGoTrustProxyAuthentication" SOGo user default to YES and -## adjust the "x-webobjects-remote-user" proxy header in the "Proxy" section -## below. -# -# AuthType XXX -# Require valid-user -# SetEnv proxy-nokeepalive 1 -# Allow from all -# - -ProxyRequests Off -SetEnv proxy-nokeepalive 1 -ProxyPreserveHost On - -# When using CAS, you should uncomment this and install cas-proxy-validate.py -# in /usr/lib/cgi-bin to reduce server overloading -# -# ProxyPass /SOGo/casProxy http://localhost/cgi-bin/cas-proxy-validate.py -# -# Order deny,allow -# Allow from your-cas-host-addr -# - -ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0 - - -## adjust the following to your configuration - RequestHeader set "x-webobjects-server-port" "443" - RequestHeader set "x-webobjects-server-name" "yourhostname" - RequestHeader set "x-webobjects-server-url" "https://yourhostname" - -## When using proxy-side autentication, you need to uncomment and -## adjust the following line: -# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e" - - RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0" - RequestHeader set "x-webobjects-remote-host" %{REMOTE_HOST}e env=REMOTE_HOST - - AddDefaultCharset UTF-8 - - Order allow,deny - Allow from all - - -## We use mod_rewrite to pass remote address to the SOGo proxy. -# The remote address will appear in SOGo's log files and in the X-Forward -# header of emails. -RewriteEngine On -RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT] From 9e503e7d8f10c16638624098c21fc4644f6c33e7 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 16:01:21 +0000 Subject: [PATCH 16/29] Debian: new "sogo-openchange" and "sogo-dev" packages; fixed some issues reported by lintian Monotone-Parent: 3d32d81fda0002213d650cb8e71bfd4508d1b134 Monotone-Revision: a1bd23348352232bd3363b00a4cd69557a3c780e Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T16:01:21 Monotone-Branch: ca.inverse.sogo --- debian/control | 24 +++++++++++++++++++++++- debian/rules | 39 +++++++++++++++++++++++++++------------ debian/sogo.install | 12 ++++++++++-- 3 files changed, 60 insertions(+), 15 deletions(-) diff --git a/debian/control b/debian/control index 7f20d1028..ce8e0415e 100644 --- a/debian/control +++ b/debian/control @@ -1,7 +1,7 @@ Source: sogo Priority: optional Maintainer: Inverse Support -Build-Depends: debhelper (>= 7.0.15), gobjc | objc-compiler, libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-gdl1-4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev, libxml2-dev, libsbjson-dev, libssl-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev +Build-Depends: debhelper (>= 7.0.15), gobjc | objc-compiler, libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-gdl1-4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev, libxml2-dev, libsbjson-dev, libssl-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev, libmapi-dev, libmapistore-dev, libmapiproxy-dev Section: web Standards-Version: 3.9.1 @@ -22,6 +22,28 @@ Description: a modern and scalable groupware UI for the users, consistency in look and feel with the Mozilla applications, and to reduce the load of the transactions on the server. +Package: sogo-dev +Section: devel +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: a modern and scalable groupware - development files + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the development files for developing SOGo modules. + +Package: sogo-openchange +Section: net +Priority: extra +Architecture: any +Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: a modern and scalable groupware - OpenChange backend + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the backend plugin for using SOGo as a backend + to OpenChange. + Package: sogo-dbg Section: debug Priority: extra diff --git a/debian/rules b/debian/rules index 38028afbf..486706ba2 100755 --- a/debian/rules +++ b/debian/rules @@ -3,6 +3,8 @@ export DH_VERBOSE=1 # export DH_OPTIONS="-p sogo" +DESTDIR=$(CURDIR)/debian/tmp + config.make: configure dh_testdir ./configure @@ -23,28 +25,41 @@ clean: dh_testdir dh_testroot rm -f build-arch-stamp - if [ -f config.make ]; then make clean; fi - if pkg-config --atleast-version=1.0 libmapi; \ - then (cd OpenChange; make clean); \ + if [ -f config.make ]; \ + then \ + if pkg-config --atleast-version=1.0 libmapi; \ + then \ + (cd OpenChange; make clean); \ + fi; \ + make clean; \ fi dh_clean install: install-arch dh_testdir dh_testroot - dh_prep -i - dh_installdirs -i - dh_install -i +# dh_prep -i +# dh_installdirs -i +# dh_install -i install-arch: build-arch dh_testdir dh_testroot - dh_prep -i + dh_prep # dh_installdirs -s - $(MAKE) DESTDIR=$(CURDIR)/debian/tmp GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install + $(MAKE) DESTDIR=$(DESTDIR) GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install if pkg-config --atleast-version=1.0 libmapi; \ - then (cd OpenChange; $(MAKE) DESTDIR=$(CURDIR)/debian/tmp GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install); \ + then \ + (cd OpenChange; \ + $(MAKE) \ + DESTDIR=$(DESTDIR) \ + GNUSTEP_INSTALLATION_DOMAIN=SYSTEM \ + install); \ + rm -f $(DESTDIR)/usr/lib/mapistore_backends/libMAPIStoreSOGo.so.1; \ + rm -f $(DESTDIR)/usr/lib/mapistore_backends/libMAPIStoreSOGo.so; \ + mv -f $(DESTDIR)/usr/lib/mapistore_backends/libMAPIStoreSOGo.so.1.0.0 \ + $(DESTDIR)/usr/lib/mapistore_backends/SOGo.so; \ fi mkdir -p debian/tmp/etc/default @@ -53,7 +68,7 @@ install-arch: build-arch cp debian/sogo.overrides debian/tmp/usr/share/lintian/overrides/sogo mkdir -p debian/tmp/etc/apache2/conf.d cp Apache/SOGo.conf debian/tmp/etc/apache2/conf.d/SOGo.conf - install -D -m 600 Scripts/sogo.cron debian/tmp/etc/cron.d/sogo + install -D -m 644 Scripts/sogo.cron debian/tmp/etc/cron.d/sogo # Build architecture dependant packages using the common target. binary-arch: build-arch install-arch @@ -74,8 +89,8 @@ binary-arch: build-arch install-arch ( cd debian/sogo-dbg/usr/lib/debug/usr/lib/; \ ln -s GNUstep/Frameworks/SOGo.framework/Versions/*/libSOGo* ./ ) dh_compress - dh_fixperms -X/etc/cron.d/sogo - dh_makeshlibs + dh_fixperms + dh_makeshlibs -X/usr/lib/mapistore_backends dh_shlibdeps dh_installdeb dh_gencontrol diff --git a/debian/sogo.install b/debian/sogo.install index e3c791a2d..61cbf5074 100644 --- a/debian/sogo.install +++ b/debian/sogo.install @@ -2,7 +2,15 @@ etc/default/sogo etc/apache2/conf.d/SOGo.conf etc/cron.d/sogo usr/sbin/* -usr/lib/GNUstep/* -usr/lib/lib* +usr/lib/GNUstep/Frameworks/* +usr/lib/GNUstep/Libraries/* +usr/lib/GNUstep/OCSTypeModels/* +usr/lib/GNUstep/SaxDrivers-4.9/* +usr/lib/GNUstep/SaxMappings/* +usr/lib/GNUstep/WOxElemBuilders-4.9/* +usr/lib/GNUstep/SOGo/*.SOGo +usr/lib/GNUstep/SOGo/Templates +usr/lib/GNUstep/SOGo/WebServerResources +usr/lib/lib*.so.* usr/include/GNUstep/* usr/share/lintian/* From 54cf621005f03cdc15399e15a45a7430d99e07b5 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 16:05:04 +0000 Subject: [PATCH 17/29] Monotone-Parent: a1bd23348352232bd3363b00a4cd69557a3c780e Monotone-Revision: e3a9ec04316de2d167901095be0994ce71e98dd5 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T16:05:04 Monotone-Branch: ca.inverse.sogo --- debian/control | 12 ------------ debian/control-squeeze | 15 +++++++++++++-- debian/sogo-dev.install | 2 ++ debian/sogo-openchange.install | 2 ++ 4 files changed, 17 insertions(+), 14 deletions(-) create mode 100644 debian/sogo-dev.install create mode 100644 debian/sogo-openchange.install diff --git a/debian/control b/debian/control index ce8e0415e..fd59a148d 100644 --- a/debian/control +++ b/debian/control @@ -32,18 +32,6 @@ Description: a modern and scalable groupware - development files . This package contains the development files for developing SOGo modules. -Package: sogo-openchange -Section: net -Priority: extra -Architecture: any -Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Description: a modern and scalable groupware - OpenChange backend - SOGo is a groupware server built around OpenGroupware.org (OGo) and - the SOPE application server with focus on scalability. - . - This package contains the backend plugin for using SOGo as a backend - to OpenChange. - Package: sogo-dbg Section: debug Priority: extra diff --git a/debian/control-squeeze b/debian/control-squeeze index 019b6335b..ce8e0415e 100644 --- a/debian/control-squeeze +++ b/debian/control-squeeze @@ -22,16 +22,27 @@ Description: a modern and scalable groupware UI for the users, consistency in look and feel with the Mozilla applications, and to reduce the load of the transactions on the server. +Package: sogo-dev +Section: devel +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: a modern and scalable groupware - development files + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the development files for developing SOGo modules. + Package: sogo-openchange Section: net Priority: extra Architecture: any -Depends: sogo (= ${binary:Version}), ${misc:Depends} +Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} Description: a modern and scalable groupware - OpenChange backend SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server with focus on scalability. . - This package contains the backend plugin for using SOGo as a backend to OpenChange. + This package contains the backend plugin for using SOGo as a backend + to OpenChange. Package: sogo-dbg Section: debug diff --git a/debian/sogo-dev.install b/debian/sogo-dev.install new file mode 100644 index 000000000..a29817742 --- /dev/null +++ b/debian/sogo-dev.install @@ -0,0 +1,2 @@ +usr/include/GNUstep/* +usr/lib/lib*.so diff --git a/debian/sogo-openchange.install b/debian/sogo-openchange.install new file mode 100644 index 000000000..dcae5f4e2 --- /dev/null +++ b/debian/sogo-openchange.install @@ -0,0 +1,2 @@ +usr/lib/mapistore_backends/* +usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore From fb1e560c71d850f84d71646dc012f3d5194e436b Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 16:10:25 +0000 Subject: [PATCH 18/29] Debian fixes Monotone-Parent: e3a9ec04316de2d167901095be0994ce71e98dd5 Monotone-Revision: 929e17ff05c17b5978929e33d5250710c9674c66 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T16:10:25 Monotone-Branch: ca.inverse.sogo --- debian/sogo.install | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/sogo.install b/debian/sogo.install index 61cbf5074..8a55c7961 100644 --- a/debian/sogo.install +++ b/debian/sogo.install @@ -12,5 +12,4 @@ usr/lib/GNUstep/SOGo/*.SOGo usr/lib/GNUstep/SOGo/Templates usr/lib/GNUstep/SOGo/WebServerResources usr/lib/lib*.so.* -usr/include/GNUstep/* usr/share/lintian/* From 3d2c13d1a7515879e13a8610ab67ae7d313e2497 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 20:28:18 +0000 Subject: [PATCH 19/29] Monotone-Parent: 929e17ff05c17b5978929e33d5250710c9674c66 Monotone-Revision: 403e9c9f8b6284761ab422dee636699902d4babe Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T20:28:18 Monotone-Branch: ca.inverse.sogo --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index fd59a148d..fb4425a7f 100644 --- a/debian/control +++ b/debian/control @@ -1,7 +1,7 @@ Source: sogo Priority: optional Maintainer: Inverse Support -Build-Depends: debhelper (>= 7.0.15), gobjc | objc-compiler, libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-gdl1-4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev, libxml2-dev, libsbjson-dev, libssl-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev, libmapi-dev, libmapistore-dev, libmapiproxy-dev +Build-Depends: debhelper (>= 7.0.15), gobjc | objc-compiler, libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-gdl1-4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev, libxml2-dev, libsbjson-dev, libssl-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev Section: web Standards-Version: 3.9.1 From e70aeda75b862c7eb3086d15cbc4e3f5cd8791c2 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 20:37:42 +0000 Subject: [PATCH 20/29] Monotone-Parent: 49a23fbd758d213ee3123b508598dcc5bdede2a5 Monotone-Revision: 14299c2bb1edae221876accbfabb1adecd109549 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T20:37:42 Monotone-Branch: ca.inverse.sogo --- debian/control | 2 +- debian/control-squeeze | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/control b/debian/control index fb4425a7f..cb378e19b 100644 --- a/debian/control +++ b/debian/control @@ -25,7 +25,7 @@ Description: a modern and scalable groupware Package: sogo-dev Section: devel Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} +Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} Description: a modern and scalable groupware - development files SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server with focus on scalability. diff --git a/debian/control-squeeze b/debian/control-squeeze index ce8e0415e..e4339f79a 100644 --- a/debian/control-squeeze +++ b/debian/control-squeeze @@ -25,7 +25,7 @@ Description: a modern and scalable groupware Package: sogo-dev Section: devel Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} +Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} Description: a modern and scalable groupware - development files SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server with focus on scalability. From fde6d06c098ca643ae52389fca1e2c7cc8bb78d6 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 4 Apr 2012 20:45:21 +0000 Subject: [PATCH 21/29] Monotone-Parent: 14299c2bb1edae221876accbfabb1adecd109549 Monotone-Revision: 366adf06b05b4f972813f3e731ae3338140ba86e Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-04T20:45:21 Monotone-Branch: ca.inverse.sogo --- debian/control | 1 + debian/control-squeeze | 1 + 2 files changed, 2 insertions(+) diff --git a/debian/control b/debian/control index cb378e19b..6642d7fb3 100644 --- a/debian/control +++ b/debian/control @@ -26,6 +26,7 @@ Package: sogo-dev Section: devel Architecture: any Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Replaces: sogo (<< ${binary:Version}) Description: a modern and scalable groupware - development files SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server with focus on scalability. diff --git a/debian/control-squeeze b/debian/control-squeeze index e4339f79a..7a047b1a2 100644 --- a/debian/control-squeeze +++ b/debian/control-squeeze @@ -26,6 +26,7 @@ Package: sogo-dev Section: devel Architecture: any Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Replaces: sogo (<< ${binary:Version}) Description: a modern and scalable groupware - development files SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server with focus on scalability. From 974d1a6bd79e16a7a7e52df94dbefa3647539425 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 10 Apr 2012 14:48:14 +0000 Subject: [PATCH 22/29] Monotone-Parent: ba40327d7cdcc284485580a61af95f9056989d40 Monotone-Revision: c50f677f6d597a2c063db713c6e8af3961c44b34 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-10T14:48:14 Monotone-Branch: ca.inverse.sogo --- debian/sogo-openchange.install-multiarch | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 debian/sogo-openchange.install-multiarch diff --git a/debian/sogo-openchange.install-multiarch b/debian/sogo-openchange.install-multiarch new file mode 100644 index 000000000..d3f119d33 --- /dev/null +++ b/debian/sogo-openchange.install-multiarch @@ -0,0 +1,2 @@ +usr/lib/*/mapistore_backends/* +usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore From be172c6d05c14ef7dd6962b4c18febf9a6ac5920 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 10 Apr 2012 15:35:51 +0000 Subject: [PATCH 23/29] Split multiarch build in debian-multiarch for new distros Monotone-Parent: c50f677f6d597a2c063db713c6e8af3961c44b34 Monotone-Revision: 28e6e54b234c882f7da005f4413e9a5beeae28ef Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-10T15:35:51 Monotone-Branch: ca.inverse.sogo --- debian-multiarch/changelog | 48 ++++ debian-multiarch/compat | 1 + debian-multiarch/control | 61 +++++ debian-multiarch/copyright | 31 +++ debian-multiarch/rules | 105 +++++++++ debian-multiarch/sogo-dev.install | 2 + debian-multiarch/sogo.cron.daily | 6 + debian-multiarch/sogo.dirs | 3 + debian-multiarch/sogo.docs | 10 + debian-multiarch/sogo.init | 100 ++++++++ debian-multiarch/sogo.install | 15 ++ debian-multiarch/sogo.logrotate | 13 ++ debian-multiarch/sogo.overrides | 4 + debian-multiarch/sogo.postinst | 36 +++ debian-multiarch/sogo.postrm | 35 +++ debian-multiarch/sogo.preinst | 32 +++ debian-multiarch/sogo.prerm | 17 ++ debian-multiarch/source/format | 1 + debian/compat | 2 +- debian/sogo.overrides | 363 ------------------------------ debian/source/format | 1 + 21 files changed, 522 insertions(+), 364 deletions(-) create mode 100644 debian-multiarch/changelog create mode 100644 debian-multiarch/compat create mode 100644 debian-multiarch/control create mode 100644 debian-multiarch/copyright create mode 100755 debian-multiarch/rules create mode 100644 debian-multiarch/sogo-dev.install create mode 100644 debian-multiarch/sogo.cron.daily create mode 100644 debian-multiarch/sogo.dirs create mode 100644 debian-multiarch/sogo.docs create mode 100644 debian-multiarch/sogo.init create mode 100644 debian-multiarch/sogo.install create mode 100644 debian-multiarch/sogo.logrotate create mode 100644 debian-multiarch/sogo.overrides create mode 100644 debian-multiarch/sogo.postinst create mode 100644 debian-multiarch/sogo.postrm create mode 100644 debian-multiarch/sogo.preinst create mode 100644 debian-multiarch/sogo.prerm create mode 100644 debian-multiarch/source/format create mode 100644 debian/source/format diff --git a/debian-multiarch/changelog b/debian-multiarch/changelog new file mode 100644 index 000000000..82a72fc5b --- /dev/null +++ b/debian-multiarch/changelog @@ -0,0 +1,48 @@ +sogo (1.3.5) unstable; urgency=low + + * New upstream release. + + -- Inverse Support Wed, 25 January 2011 12:00:00 -0500 + +sogo (1.2.2) unstable; urgency=low + + * New upstream release. + + -- Inverse Support Tue, 04 May 2010 16:45:59 -0400 + +sogo (1.2.1) unstable; urgency=low + + * New upstream release. + * SOGo-debian.conf installed as /etc/apache2/conf.d/ + * SOGo.conf removed from documentation examples. + + -- Inverse Support Wed, 17 Feb 2010 11:06:41 -0500 + +sogo (1.2.0) unstable; urgency=low + + * New upstream release. + + -- Inverse Support Tue, 26 Jan 2010 08:34:20 -0500 + +sogo (1.1.0) unstable; urgency=low + + * New release + * Install a default Apache 2 configuration file. + * Added a dependency on sope4.9-libxmlsaxdriver, sope4.9-db-connector + + -- Inverse Support Wed, 28 Oct 2009 17:06:03 -0400 + +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 + + -- Cyril Robert Tue, 23 Dec 2008 00:49:45 +0100 diff --git a/debian-multiarch/compat b/debian-multiarch/compat new file mode 100644 index 000000000..45a4fb75d --- /dev/null +++ b/debian-multiarch/compat @@ -0,0 +1 @@ +8 diff --git a/debian-multiarch/control b/debian-multiarch/control new file mode 100644 index 000000000..1f861a83f --- /dev/null +++ b/debian-multiarch/control @@ -0,0 +1,61 @@ +Source: sogo +Priority: optional +Maintainer: Inverse Support +Build-Depends: debhelper (>= 8.0.0), gobjc | objc-compiler, libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-gdl1-4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev, libxml2-dev, libsbjson-dev, libssl-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev, libmapi-dev, libmapistore-dev, libmapiproxy-dev +Section: web +Standards-Version: 3.9.2 + +Package: sogo +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Section: web +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, tmpreaper, sope4.9-libxmlsaxdriver, sope4.9-db-connector, gnustep-make, libcurl3 +Suggests: nginx +Description: a modern and scalable groupware + SOGo is a groupware server built around OpenGroupware.org (OGo) and + 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 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. + +Package: sogo-dev +Section: devel +Architecture: any +Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Replaces: sogo (<< ${binary:Version}) +Description: a modern and scalable groupware - development files + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the development files for developing SOGo modules. + +Package: sogo-openchange +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Section: net +Priority: extra +Architecture: any +Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: a modern and scalable groupware - OpenChange backend + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the backend plugin for using SOGo as a backend + to OpenChange. + +Package: sogo-dbg +Section: debug +Priority: extra +Architecture: any +Depends: sogo (= ${binary:Version}), ${misc:Depends} +Description: a modern and scalable groupware - debugging symbols + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the debugging symbols for SOGo. diff --git a/debian-multiarch/copyright b/debian-multiarch/copyright new file mode 100644 index 000000000..8c26684c5 --- /dev/null +++ b/debian-multiarch/copyright @@ -0,0 +1,31 @@ +This package was debianized by Inverse on +Mon, 27 Jul 2009 10:57:51 -0400. + +It was downloaded from http://www.sogo.nu/downloads/backend.html + +Upstream Authors: + + Inverse inc. + +Copyright: + + Copyright (C) 2006-2010 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, Inverse and +is licensed under the GPL, see `/usr/share/common-licenses/GPL-2'. diff --git a/debian-multiarch/rules b/debian-multiarch/rules new file mode 100755 index 000000000..35c730cc8 --- /dev/null +++ b/debian-multiarch/rules @@ -0,0 +1,105 @@ +#!/usr/bin/make -f +# -*- makefile -*- +export DH_VERBOSE=1 +# export DH_OPTIONS="-p sogo" + +DESTDIR=$(CURDIR)/debian/tmp +DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) + +config.make: configure + dh_testdir + ./configure + +#Architecture +build: build-arch + +build-arch: build-arch-stamp +build-arch-stamp: config.make +# Add here commands to compile the arch part of the package. + $(MAKE) + if pkg-config --atleast-version=1.0 libmapi; \ + then (cd OpenChange; $(MAKE)); \ + fi + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-arch-stamp + if [ -f config.make ]; \ + then \ + if pkg-config --atleast-version=1.0 libmapi; \ + then \ + (cd OpenChange; make clean); \ + fi; \ + make clean; \ + fi + dh_clean + +install: install-arch + dh_testdir + dh_testroot +# dh_prep -i +# dh_installdirs -i +# dh_install -i + +install-arch: build-arch + dh_testdir + dh_testroot + dh_prep +# dh_installdirs -s + + $(MAKE) DESTDIR=$(DESTDIR) GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install + if pkg-config --atleast-version=1.0 libmapi; \ + then \ + (cd OpenChange; \ + $(MAKE) \ + DESTDIR=$(DESTDIR) \ + GNUSTEP_INSTALLATION_DOMAIN=SYSTEM \ + install); \ + rm -f $(DESTDIR)/usr/lib/$(DEB_HOST_MULTIARCH)/mapistore_backends/libMAPIStoreSOGo.so.1; \ + rm -f $(DESTDIR)/usr/lib/$(DEB_HOST_MULTIARCH)/mapistore_backends/libMAPIStoreSOGo.so; \ + mv -f $(DESTDIR)/usr/lib/$(DEB_HOST_MULTIARCH)/mapistore_backends/libMAPIStoreSOGo.so.1.0.0 \ + $(DESTDIR)/usr/lib/$(DEB_HOST_MULTIARCH)/mapistore_backends/SOGo.so; \ + fi + + mkdir -p debian/tmp/etc/default + cp Scripts/sogo-default debian/tmp/etc/default/sogo + mkdir -p debian/tmp/usr/share/lintian/overrides + cp debian/sogo.overrides debian/tmp/usr/share/lintian/overrides/sogo + mkdir -p debian/tmp/etc/apache2/conf.d + cp Apache/SOGo.conf debian/tmp/etc/apache2/conf.d/SOGo.conf + install -D -m 644 Scripts/sogo.cron debian/tmp/etc/cron.d/sogo + +# 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 --dbg-package=sogo-dbg +# workaround for http://sourceware.org/bugzilla/show_bug.cgi?id=9538 +# to let gdb find the symbols for libSOGo + ( cd debian/sogo-dbg/usr/lib/debug/usr/lib/; \ + ln -s GNUstep/Frameworks/SOGo.framework/Versions/*/libSOGo* ./ ) + dh_compress + dh_fixperms + dh_makeshlibs -X/usr/lib/$(DEB_HOST_MULTIARCH)/mapistore_backends + dh_shlibdeps + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +binary-indep: build install +# We have nothing to do by default. + +binary: binary-arch binary-indep +.PHONY: build clean binary-arch binary install install-arch diff --git a/debian-multiarch/sogo-dev.install b/debian-multiarch/sogo-dev.install new file mode 100644 index 000000000..a29817742 --- /dev/null +++ b/debian-multiarch/sogo-dev.install @@ -0,0 +1,2 @@ +usr/include/GNUstep/* +usr/lib/lib*.so diff --git a/debian-multiarch/sogo.cron.daily b/debian-multiarch/sogo.cron.daily new file mode 100644 index 000000000..09bf4a3b3 --- /dev/null +++ b/debian-multiarch/sogo.cron.daily @@ -0,0 +1,6 @@ +#!/bin/sh + +SOGOSPOOL=/var/spool/sogo + +/usr/sbin/tmpreaper 24 "$SOGOSPOOL" +find "$SOGOSPOOL" -mindepth 1 -type d -empty -exec /bin/rmdir -p {} \; 2> /dev/null diff --git a/debian-multiarch/sogo.dirs b/debian-multiarch/sogo.dirs new file mode 100644 index 000000000..77877b7bd --- /dev/null +++ b/debian-multiarch/sogo.dirs @@ -0,0 +1,3 @@ +etc +var +usr diff --git a/debian-multiarch/sogo.docs b/debian-multiarch/sogo.docs new file mode 100644 index 000000000..02b9d95c5 --- /dev/null +++ b/debian-multiarch/sogo.docs @@ -0,0 +1,10 @@ +NEWS +TODO +Scripts/sql-update-1.2.2_to_1.3.0.sh +Scripts/sql-update-1.2.2_to_1.3.0-mysql.sh +Scripts/sql-update-1.3.3_to_1.3.4.sh +Scripts/sql-update-1.3.3_to_1.3.4-mysql.sh +Scripts/sql-update-1.3.11_to_1.3.12.sh +Scripts/sql-update-1.3.11_to_1.3.12-mysql.sh +Scripts/sogo-backup.sh +Scripts/updates.php diff --git a/debian-multiarch/sogo.init b/debian-multiarch/sogo.init new file mode 100644 index 000000000..9dc4b5c27 --- /dev/null +++ b/debian-multiarch/sogo.init @@ -0,0 +1,100 @@ +#!/bin/bash +### BEGIN INIT INFO +# Provides: sogo +# Required-Start: $remote_fs $network +# Required-Stop: $remote_fs $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-2010 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. +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +NAME=sogo +DAEMON=/usr/sbin/sogod +DESC="SOGo" + +USER=$NAME +PREFORK=1 + +PIDFILE=/var/run/$NAME/$NAME.pid +LOGFILE=/var/log/$NAME/$NAME.log + +if [ -f /etc/default/$NAME ]; then + . /etc/default/$NAME +fi + +. /lib/lsb/init-functions + +if [ ! -x $DAEMON ]; then + log_failure_msg "$DAEMON is not executable." + exit 1 +fi + +set -e + +. /usr/share/GNUstep/Makefiles/GNUstep.sh + +DAEMON_OPTS="-WOWorkersCount $PREFORK -WOPidFile $PIDFILE -WOLogFile $LOGFILE" + +case "$1" in + start) + log_daemon_msg "Starting $DESC" "$NAME" + + # Ensure directory's existence and permissions + install -o $USER -g adm -m 755 -d /var/run/$NAME + install -o $USER -g adm -m 750 -d /var/spool/$NAME + install -o $USER -g adm -m 750 -d /var/log/$NAME + + if ! start-stop-daemon -c $USER --quiet --start --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS + then + log_progress_msg "already running" + fi + log_end_msg 0 + ;; + stop) + log_daemon_msg "Stopping $DESC" "$NAME" + start-stop-daemon --stop --pidfile $PIDFILE --retry=TERM/20/KILL/5 --oknodo + log_end_msg 0 + ;; + restart|force-reload) + log_daemon_msg "Restarting $DESC" "$NAME" + start-stop-daemon --stop --pidfile $PIDFILE --retry=TERM/20/KILL/5 --oknodo + # Ensure directory's existence and permissions + install -o $USER -g adm -m 755 -d /var/run/$NAME + install -o $USER -g adm -m 750 -d /var/spool/$NAME + install -o $USER -g adm -m 750 -d /var/log/$NAME + start-stop-daemon -c $USER --quiet --start --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS + log_end_msg 0 + ;; + status) + status_of_proc -p $PIDFILE "$DAEMON" $NAME && exit 0 || exit $? + ;; + *) + echo "Usage: $NAME {start|stop|restart|status}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/debian-multiarch/sogo.install b/debian-multiarch/sogo.install new file mode 100644 index 000000000..8a55c7961 --- /dev/null +++ b/debian-multiarch/sogo.install @@ -0,0 +1,15 @@ +etc/default/sogo +etc/apache2/conf.d/SOGo.conf +etc/cron.d/sogo +usr/sbin/* +usr/lib/GNUstep/Frameworks/* +usr/lib/GNUstep/Libraries/* +usr/lib/GNUstep/OCSTypeModels/* +usr/lib/GNUstep/SaxDrivers-4.9/* +usr/lib/GNUstep/SaxMappings/* +usr/lib/GNUstep/WOxElemBuilders-4.9/* +usr/lib/GNUstep/SOGo/*.SOGo +usr/lib/GNUstep/SOGo/Templates +usr/lib/GNUstep/SOGo/WebServerResources +usr/lib/lib*.so.* +usr/share/lintian/* diff --git a/debian-multiarch/sogo.logrotate b/debian-multiarch/sogo.logrotate new file mode 100644 index 000000000..2e8b28fd8 --- /dev/null +++ b/debian-multiarch/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/sogo restart > /dev/null 2>&1 + endscript +} diff --git a/debian-multiarch/sogo.overrides b/debian-multiarch/sogo.overrides new file mode 100644 index 000000000..cf3442214 --- /dev/null +++ b/debian-multiarch/sogo.overrides @@ -0,0 +1,4 @@ +sogo: embedded-javascript-library usr/lib/GNUstep/SOGo/WebServerResources/prototype.js +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: package-name-doesnt-match-sonames libGDLContentStore4.9 libNGCards4.9 libOGoContentStore0.9 libSOGoUI1.0 diff --git a/debian-multiarch/sogo.postinst b/debian-multiarch/sogo.postinst new file mode 100644 index 000000000..e43bfd92a --- /dev/null +++ b/debian-multiarch/sogo.postinst @@ -0,0 +1,36 @@ +#!/bin/bash + +set -e + +# 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 + +case "$1" in + configure) + # update timestamp on imgs,css,js to let apache know the files changed + find /usr/lib/GNUstep/SOGo/WebServerResources -exec touch {} \; + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +#DEBHELPER# + +exit 0 diff --git a/debian-multiarch/sogo.postrm b/debian-multiarch/sogo.postrm new file mode 100644 index 000000000..9bed33fa5 --- /dev/null +++ b/debian-multiarch/sogo.postrm @@ -0,0 +1,35 @@ +#!/bin/bash + +set -e + +# 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 + rm -rf /var/spool/sogo + rm -rf /var/log/sogo + rm -rf /var/run/sogo + fi + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 0 +esac + +#DEBHELPER# + +exit 0 diff --git a/debian-multiarch/sogo.preinst b/debian-multiarch/sogo.preinst new file mode 100644 index 000000000..384bffc2a --- /dev/null +++ b/debian-multiarch/sogo.preinst @@ -0,0 +1,32 @@ +#!/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 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 + if ! test -d /var/$dir/sogo + then + install -m 750 -o sogo -g sogo -d /var/$dir/sogo + fi + done +fi + +#DEBHELPER# + +exit 0 diff --git a/debian-multiarch/sogo.prerm b/debian-multiarch/sogo.prerm new file mode 100644 index 000000000..914a28b5e --- /dev/null +++ b/debian-multiarch/sogo.prerm @@ -0,0 +1,17 @@ +#!/bin/bash + +set -e + +# 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/ + +#DEBHELPER# + +exit 0 diff --git a/debian-multiarch/source/format b/debian-multiarch/source/format new file mode 100644 index 000000000..163aaf8d8 --- /dev/null +++ b/debian-multiarch/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/compat b/debian/compat index 7f8f011eb..45a4fb75d 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -7 +8 diff --git a/debian/sogo.overrides b/debian/sogo.overrides index 5a591ee62..cf3442214 100644 --- a/debian/sogo.overrides +++ b/debian/sogo.overrides @@ -1,367 +1,4 @@ -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.png -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/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/delegated.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/dot.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_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/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/source/format b/debian/source/format new file mode 100644 index 000000000..163aaf8d8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) From 0f5639f1b883b8bff44a3ccafaaff69f852de934 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 10 Apr 2012 16:02:54 +0000 Subject: [PATCH 24/29] Fix empty package Monotone-Parent: 28e6e54b234c882f7da005f4413e9a5beeae28ef Monotone-Revision: cac9e2abd986a1cd4f20b31e0c48359b21028a7d Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-10T16:02:54 Monotone-Branch: ca.inverse.sogo --- debian-multiarch/sogo-openchange.install | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 debian-multiarch/sogo-openchange.install diff --git a/debian-multiarch/sogo-openchange.install b/debian-multiarch/sogo-openchange.install new file mode 100644 index 000000000..d3f119d33 --- /dev/null +++ b/debian-multiarch/sogo-openchange.install @@ -0,0 +1,2 @@ +usr/lib/*/mapistore_backends/* +usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore From d19e0e882364efd5ab791266e511fdbe01844ce7 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 11 Apr 2012 13:48:28 +0000 Subject: [PATCH 25/29] Monotone-Parent: cac9e2abd986a1cd4f20b31e0c48359b21028a7d Monotone-Revision: 57d6964f28d741f062f7dd0eb4065411c322df25 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-11T13:48:28 Monotone-Branch: ca.inverse.sogo --- debian-multiarch/rules | 12 +++++++++++- debian/rules | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/debian-multiarch/rules b/debian-multiarch/rules index 35c730cc8..1580a1ce5 100755 --- a/debian-multiarch/rules +++ b/debian-multiarch/rules @@ -6,9 +6,12 @@ export DH_VERBOSE=1 DESTDIR=$(CURDIR)/debian/tmp DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) +include /etc/GNUstep/GNUstep.conf +include /usr/share/GNUstep/Makefiles/common.make + config.make: configure dh_testdir - ./configure + ./configure --prefix=$(GNUSTEP_SYSTEM_ROOT) #Architecture build: build-arch @@ -26,6 +29,9 @@ clean: dh_testdir dh_testroot rm -f build-arch-stamp + ( cd Tests/Integration; make clean ) + rm -f Tests/Integration/config.py + -find Tests -name "*.pyc" -exec rm -f {} \; if [ -f config.make ]; \ then \ if pkg-config --atleast-version=1.0 libmapi; \ @@ -34,6 +40,10 @@ clean: fi; \ make clean; \ fi + -rm -f OpenChange/MAPIStorePropertySelectors.* + -find OpenChange -type d -name "unrtf-*" -exec rm -rf {} \; + -rm -f OpenChange/unrtf*-stamp + -rm -f config.make dh_clean install: install-arch diff --git a/debian/rules b/debian/rules index 486706ba2..023869853 100755 --- a/debian/rules +++ b/debian/rules @@ -5,9 +5,12 @@ export DH_VERBOSE=1 DESTDIR=$(CURDIR)/debian/tmp +include /etc/GNUstep/GNUstep.conf +include /usr/share/GNUstep/Makefiles/common.make + config.make: configure dh_testdir - ./configure + ./configure --prefix=$(GNUSTEP_SYSTEM_ROOT) #Architecture build: build-arch @@ -25,6 +28,9 @@ clean: dh_testdir dh_testroot rm -f build-arch-stamp + ( cd Tests/Integration; make clean ) + rm -f Tests/Integration/config.py + -find Tests -name "*.pyc" -exec rm -f {} \; if [ -f config.make ]; \ then \ if pkg-config --atleast-version=1.0 libmapi; \ @@ -33,6 +39,10 @@ clean: fi; \ make clean; \ fi + -rm -f OpenChange/MAPIStorePropertySelectors.* + -find OpenChange -type d -name "unrtf-*" -exec rm -rf {} \; + -rm -f OpenChange/unrtf*-stamp + -rm -f config.make dh_clean install: install-arch From d804b9c7b0d262f8403b3838af96f26f1dbbb307 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 11 Apr 2012 15:31:25 +0000 Subject: [PATCH 26/29] Rolled back to compat=7 for old debian dists Monotone-Parent: 57d6964f28d741f062f7dd0eb4065411c322df25 Monotone-Revision: 19df67a347106e2e3f51c36766416cf4c3279bee Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-11T15:31:25 Monotone-Branch: ca.inverse.sogo --- debian/compat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/compat b/debian/compat index 45a4fb75d..7f8f011eb 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -8 +7 From 2dd2db084defb55679df2515903ef2bf79fc006f Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 11 Apr 2012 20:10:00 +0000 Subject: [PATCH 27/29] Monotone-Parent: 19df67a347106e2e3f51c36766416cf4c3279bee Monotone-Revision: d32a965a357a3d40a91ce6b756792c0e03dc7414 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-11T20:10:00 Monotone-Branch: ca.inverse.sogo --- ...Native Microsoft Outlook Configuration.odt | Bin 24986 -> 26678 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Documentation/SOGo Native Microsoft Outlook Configuration.odt b/Documentation/SOGo Native Microsoft Outlook Configuration.odt index 316b81cc45888c838c24a5bf5b2e524d4b0673ac..5a5b9af372415868c34ad9ee21f1f0e5d67ec194 100644 GIT binary patch literal 26678 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 LUFK?hbN0UgNFsc` delta 22546 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 From 502b2764d93cd78796dbca410f6e07cee6b924b1 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 23 Apr 2012 15:17:02 +0000 Subject: [PATCH 28/29] Monotone-Parent: b2a750dba2c2bf3d145e44d412e5a647e552cf59 Monotone-Revision: 4db7d3fdd4a7987df1c5a8025f88b58228fa357c Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-04-23T15:17:02 Monotone-Branch: ca.inverse.sogo --- SOPE/NGCards/CardElement.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SOPE/NGCards/CardElement.h b/SOPE/NGCards/CardElement.h index b15b2175d..7bccaa46f 100644 --- a/SOPE/NGCards/CardElement.h +++ b/SOPE/NGCards/CardElement.h @@ -106,17 +106,18 @@ - (void) addType: (NSString *) aType; +/* rendering */ - (NSArray *) orderOfAttributeKeys; - (NSArray *) orderOfValueKeys; - - (NSString *) versitString; - (CardGroup *) searchParentOfClass: (Class) parentClass; +/* conversion */ - (id) elementWithClass: (Class) elementClass; +/* copy */ - (void) setAttributesAsCopy: (NSMutableDictionary *) someAttributes; - - (NSMutableArray *) deepCopyOfArray: (NSArray *) oldArray withZone: (NSZone *) aZone; - (NSMutableDictionary *) deepCopyOfDictionary: (NSDictionary *) oldDictionary From 905c635774bfd3f2e334bde0d01a9cb1682a9b0c Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Sat, 5 May 2012 03:01:23 +0000 Subject: [PATCH 29/29] Monotone-Parent: 63e5b1e4803ea8f6e3495f26b87df7a20d1ee379 Monotone-Revision: 8820ab3233ed6f1bdd0c2a203ea8208f8410f3bd Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-05-05T03:01:23 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 +++ OpenChange/MAPIStoreSOGo.m | 77 +++++++++++++++++++++++++++++++-- OpenChange/NSObject+MAPIStore.m | 3 ++ 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index e1693e74c..0c9077e9d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-05-04 Wolfgang Sourdeau + + * OpenChange/MAPIStoreSOGo.m: register and unregister current + thread before and after each backend operation, in order to avoid + issues in multithreaded environment. + 2012-05-01 Wolfgang Sourdeau * UI/WebServerResources/generic.js (accessToSubscribedFolder): use diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index f2b6a807e..0e790a5b7 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -64,9 +64,11 @@ sogo_backend_atexit (void) { NSAutoreleasePool *pool; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; NSLog (@"allocated classes:\n%s", GSDebugAllocationList (YES)); [pool release]; + GSUnregisterCurrentThread (); } /** @@ -84,6 +86,7 @@ sogo_backend_init (void) SoProductRegistry *registry; char *argv[] = { SAMBA_PREFIX "/sbin/samba", NULL }; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; /* Here we work around a bug in GNUstep which decodes XML user @@ -149,6 +152,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) @@ -164,6 +168,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, rc = MAPISTORE_ERROR; [pool release]; + GSUnregisterCurrentThread (); return rc; } @@ -182,6 +187,7 @@ sogo_backend_create_root_folder (const char *username, DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) @@ -200,6 +206,7 @@ sogo_backend_create_root_folder (const char *username, rc = MAPISTORE_ERROR; [pool release]; + GSUnregisterCurrentThread (); return rc; } @@ -215,6 +222,7 @@ sogo_backend_list_contexts(const char *username, struct tdb_wrap *indexingTdb, DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) @@ -229,6 +237,7 @@ sogo_backend_list_contexts(const char *username, struct tdb_wrap *indexingTdb, rc = MAPISTORE_ERROR; [pool release]; + GSUnregisterCurrentThread (); return rc; } @@ -263,9 +272,11 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, { wrapper = backend_object; context = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [context getPath: path ofFMID: fmid inMemCtx: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -291,11 +302,13 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, { wrapper = backend_object; context = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [context getRootFolder: &folder withFID: fid]; if (rc == MAPISTORE_SUCCESS) *folder_object = [folder tallocWrapper: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -328,12 +341,14 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder openFolder: &childFolder withFID: fid]; if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; // [context tearDownRequest]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -366,11 +381,13 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder createFolder: &childFolder withRow: aRow andFID: fid]; if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -403,9 +420,11 @@ sogo_folder_delete(void *folder_object) { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder deleteFolder]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -429,9 +448,11 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder getChildCount: child_count ofTableType: table_type]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -459,6 +480,7 @@ sogo_folder_open_message(void *folder_object, { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder openMessage: &message withMID: mid @@ -467,6 +489,7 @@ sogo_folder_open_message(void *folder_object, if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -495,6 +518,7 @@ sogo_folder_create_message(void *folder_object, { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder createMessage: &message withMID: mid @@ -502,6 +526,7 @@ sogo_folder_create_message(void *folder_object, if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -525,9 +550,11 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder deleteMessageWithMID: mid andFlags: flags]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -560,6 +587,7 @@ sogo_folder_move_copy_messages(void *folder_object, wrapper = source_folder_object; sourceFolder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [targetFolder moveCopyMessagesWithMIDs: src_mids andCount: mid_count @@ -568,6 +596,7 @@ sogo_folder_move_copy_messages(void *folder_object, andChangeKeys: target_change_keys wantCopy: want_copy]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -593,6 +622,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder getDeletedFMIDs: fmidsp andCN: cnp @@ -600,6 +630,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, inTableType: table_type inMemCtx: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -626,6 +657,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder getTable: &table andRowCount: row_count @@ -634,6 +666,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, if (rc == MAPISTORE_SUCCESS) *table_object = [table tallocWrapper: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -659,11 +692,13 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, { wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [folder modifyPermissions: permissions withCount: pcount andFlags: flags]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -689,10 +724,12 @@ sogo_message_get_message_data(void *message_object, { wrapper = message_object; message = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; [message getMessageData: msg_dataP inMemCtx: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); rc = MAPISTORE_SUCCESS; } else @@ -718,12 +755,14 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void { wrapper = message_object; message = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message createAttachment: &attachment inAID: aidp]; if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -749,12 +788,14 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, { wrapper = message_object; message = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message getAttachment: &attachment withAID: aid]; if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -779,6 +820,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo { wrapper = message_object; message = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message getAttachmentTable: &table andRowCount: row_count]; @@ -786,6 +828,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo *table_object = [table tallocWrapper: mem_ctx]; // [context tearDownRequest]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -812,12 +855,14 @@ sogo_message_modify_recipients (void *message_object, { wrapper = message_object; message = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message modifyRecipientsWithRecipients: recipients andCount: count andColumns: columns]; // [context tearDownRequest]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -841,10 +886,12 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag) { wrapper = message_object; message = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message setReadFlag: flag]; // [context tearDownRequest]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -868,10 +915,12 @@ sogo_message_save (void *message_object) { wrapper = message_object; message = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message saveMessage]; // [context tearDownRequest]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -895,10 +944,12 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) { wrapper = message_object; message = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [message submitWithFlags: flags]; // [context tearDownRequest]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -923,12 +974,11 @@ sogo_message_attachment_open_embedded_message DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - pool = [NSAutoreleasePool new]; - if (attachment_object) { wrapper = attachment_object; attachment = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [attachment openEmbeddedMessage: &message withMID: midP @@ -937,6 +987,7 @@ sogo_message_attachment_open_embedded_message if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -960,9 +1011,11 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje { wrapper = table_object; table = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [table getAvailableProperties: propertiesP inMemCtx: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -986,10 +1039,12 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope { wrapper = table_object; table = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [table setColumns: properties withCount: count]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -1013,12 +1068,14 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr { wrapper = table_object; table = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; [table setRestrictions: restrictions]; [table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -1042,12 +1099,14 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, { wrapper = table_object; table = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; [table setSortOrder: sort_order]; [table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -1073,10 +1132,12 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, { wrapper = table_object; table = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [table getRow: data withRowID: row_id andQueryType: query_type inMemCtx: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -1102,10 +1163,12 @@ sogo_table_get_row_count (void *table_object, { wrapper = table_object; table = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [table getRowCount: row_countp withQueryType: query_type]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -1129,9 +1192,11 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id) { wrapper = table_object; table = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; [table destroyHandle: handle_id]; [pool release]; + GSUnregisterCurrentThread (); rc = MAPISTORE_SUCCESS; } else @@ -1157,9 +1222,11 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec { wrapper = object; propObject = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [propObject getAvailableProperties: propertiesP inMemCtx: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -1186,11 +1253,13 @@ sogo_properties_get_properties (void *object, { wrapper = object; propObject = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [propObject getProperties: data withTags: properties andCount: count inMemCtx: mem_ctx]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -1214,9 +1283,11 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) { wrapper = object; propObject = wrapper->MAPIStoreSOGoObject; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [propObject addPropertiesFromRow: aRow]; [pool release]; + GSUnregisterCurrentThread (); } else { @@ -1244,7 +1315,6 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, /* This fixes a crash occurring during the instantiation of the NSAutoreleasePool below. */ GSRegisterCurrentThread (); - pool = [NSAutoreleasePool new]; // printf("rootURI = %s\n", rootURI); @@ -1268,7 +1338,6 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, *uri = talloc_strdup (mem_ctx, [partialURLString UTF8String]); [pool release]; - GSUnregisterCurrentThread (); return MAPISTORE_SUCCESS; diff --git a/OpenChange/NSObject+MAPIStore.m b/OpenChange/NSObject+MAPIStore.m index 7fc75a74d..914d644a8 100644 --- a/OpenChange/NSObject+MAPIStore.m +++ b/OpenChange/NSObject+MAPIStore.m @@ -21,6 +21,7 @@ */ #import +#import #import #import "MAPIStoreTypes.h" @@ -44,11 +45,13 @@ MAPIStoreTallocWrapperDestroy (void *data) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; wrapper = data; // NSLog (@"destroying wrapped object (wrapper: %p; object: %p)...\n", wrapper, wrapper->MAPIStoreSOGoObject); [wrapper->MAPIStoreSOGoObject release]; [pool release]; + GSUnregisterCurrentThread (); return 0; }