From 905d2c885ca8c8167c811018841bc9e542bbf9a5 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 27 Mar 2012 16:47:14 +0000 Subject: [PATCH 01/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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; } From 5ef5bd94ee56f9cd2d0f5bd4866319069b4c4e1e Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 14 May 2012 20:17:21 +0000 Subject: [PATCH 30/35] Monotone-Parent: ec60fc6d9bbb30cc304f19f19609c756f5bebcd0 Monotone-Revision: f4084f570506f57a1c5cce79d74ec2112e81733e Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-05-14T20:17:21 Monotone-Branch: ca.inverse.sogo --- ...Native Microsoft Outlook Configuration.odt | Bin 26678 -> 25751 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 5a5b9af372415868c34ad9ee21f1f0e5d67ec194..f6bd61998b121f454a4050f525ffb4e75b0ed75a 100644 GIT binary patch delta 23171 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 Date: Mon, 14 May 2012 20:20:26 +0000 Subject: [PATCH 31/35] Monotone-Parent: f4084f570506f57a1c5cce79d74ec2112e81733e Monotone-Revision: b458e410b31539173b547c1c563f0b7ce41f6252 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-05-14T20:20:26 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 ++ OpenChange/gen-property-selectors.py | 52 ++++++++++++++-------------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 387a35ca8..a5e9838bf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2012-05-14 Wolfgang Sourdeau + * OpenChange/gen-property-selectors.py: "bannedProps" is now a + set, for faster lookups. + * UI/WebServerResources/UIxContactsUserFolders.js: folder ids are in the form "user:module/folder", therefore we must remove the first char, which is a slash. diff --git a/OpenChange/gen-property-selectors.py b/OpenChange/gen-property-selectors.py index 0a496db39..57e25defd 100755 --- a/OpenChange/gen-property-selectors.py +++ b/OpenChange/gen-property-selectors.py @@ -106,32 +106,32 @@ extern const enum MAPITAGS MAPIStoreSupportedProperties[]; # hack: some properties have multiple and incompatible types. Sometimes those # props are not related at all... -bannedProps = [ "PidTagBodyHtml", "PidTagFavAutosubfolders", - "PidTagAttachDataObj", "PidTagAclTable", "PidTagAclData", - "PidTagRulesTable", "PidTagRulesData", "PidTagDisableWinsock", - "PidTagHierarchyServer", "PidTagOfflineAddrbookEntryid", - "PidTagShorttermEntryidFromObject", - "PidTagNormalMessageSizeExtended", - "PidTagAssocMessageSizeExtended", "PidTagMessageSizeExtended", - "PidTagOabContainerGuid", - "PidTagOfflineAddressBookMessageClass", "PidTagScriptData", - "PidTagOfflineAddressBookTruncatedProperties", - "PidTagOfflineAddressBookContainerGuid", - "PidTagOfflineAddressBookDistinguishedName", - "PidTagOfflineAddressBookShaHash", - "PidTagSenderTelephoneNumber", "PidTagGatewayNeedsToRefresh", - "PidTagWlinkType", "PidTagWlinkFlags", - "PidTagWlinkGroupClsid", "PidTagWlinkGroupName", - "PidTagWlinkGroupHeaderID", - "PidTagScheduleInfoDelegatorWantsCopy", "PidTagWlinkOrdinal", - "PidTagWlinkSection", "PidTagWlinkCalendarColor", - "PidTagWlinkAddressBookEID", "PidTagWlinkFolderType", - "PidTagScheduleInfoDelegateNames", - "PidTagScheduleInfoDelegateEntryIds", - "PidTagBusiness2TelephoneNumbers", - "PidTagHome2TelephoneNumbers", - "PidTagAttachDataObject", "PidTagShorttermEntryIdFromObject", - ] +bannedProps = {"PidTagBodyHtml", "PidTagFavAutosubfolders", + "PidTagAttachDataObj", "PidTagAclTable", "PidTagAclData", + "PidTagRulesTable", "PidTagRulesData", "PidTagDisableWinsock", + "PidTagHierarchyServer", "PidTagOfflineAddrbookEntryid", + "PidTagShorttermEntryidFromObject", + "PidTagNormalMessageSizeExtended", + "PidTagAssocMessageSizeExtended", "PidTagMessageSizeExtended", + "PidTagOabContainerGuid", + "PidTagOfflineAddressBookMessageClass", "PidTagScriptData", + "PidTagOfflineAddressBookTruncatedProperties", + "PidTagOfflineAddressBookContainerGuid", + "PidTagOfflineAddressBookDistinguishedName", + "PidTagOfflineAddressBookShaHash", + "PidTagSenderTelephoneNumber", "PidTagGatewayNeedsToRefresh", + "PidTagWlinkType", "PidTagWlinkFlags", + "PidTagWlinkGroupClsid", "PidTagWlinkGroupName", + "PidTagWlinkGroupHeaderID", + "PidTagScheduleInfoDelegatorWantsCopy", "PidTagWlinkOrdinal", + "PidTagWlinkSection", "PidTagWlinkCalendarColor", + "PidTagWlinkAddressBookEID", "PidTagWlinkFolderType", + "PidTagScheduleInfoDelegateNames", + "PidTagScheduleInfoDelegateEntryIds", + "PidTagBusiness2TelephoneNumbers", + "PidTagHome2TelephoneNumbers", + "PidTagAttachDataObject", "PidTagShorttermEntryIdFromObject", + } def ParseExchangeH(names, lines): state = 0 From cf1e0e3bc4b9a096300f78f546ce17c1ca00fb9b Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 14 May 2012 20:25:12 +0000 Subject: [PATCH 32/35] Modernized/simplified syntax Monotone-Parent: b458e410b31539173b547c1c563f0b7ce41f6252 Monotone-Revision: 896076b20bdf94cbc408070acc36cdf121794929 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-05-14T20:25:12 Monotone-Branch: ca.inverse.sogo --- OpenChange/gen-property-selectors.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/OpenChange/gen-property-selectors.py b/OpenChange/gen-property-selectors.py index 57e25defd..3052c21bd 100755 --- a/OpenChange/gen-property-selectors.py +++ b/OpenChange/gen-property-selectors.py @@ -199,7 +199,7 @@ def FindHFile(filename): return found def ProcessHeaders(names, hdict): - for filename in hdict.keys(): + for filename in hdict: header_filename = FindHFile(filename) header_file = open(header_filename, "r") lines = header_file.readlines() @@ -243,12 +243,10 @@ if __name__ == "__main__": prop_types = {} # sanitization: only take unicode version of text properties - all_keys = names.keys() - for name in all_keys: - prop_tag = names[name] + for name, prop_tag in names.iteritems(): prop_id = prop_tag >> 16 prop_type = prop_tag & 0xffff - if not prop_types.has_key(prop_id): + if not prop_id in prop_types: prop_types[prop_id] = [] prop_types[prop_id].append(prop_type) if (prop_type & 0xfff) == 0x001e: @@ -256,19 +254,15 @@ if __name__ == "__main__": names[name] = prop_tag #sanitization: report multiple types for the same keynames - all_keys = prop_types.keys() - for prop_id in all_keys: - xtypes = prop_types[prop_id] + for prop_id, xtypes in prop_types.iteritems(): cnt = len(xtypes) if cnt > 1: print "%d types available for prop id 0x%.4x: %s" % (cnt, prop_id, ", ".join(["%.4x" % x for x in xtypes])) supported_properties = [] - all_keys = names.keys() current_getter_idx = 0 highest_prop_idx = 0 - for name in all_keys: - prop_tag = names[name] + for name, prop_tag in names.iteritems(): supported_properties.append(" 0x%.8x" % prop_tag); prop_idx = (prop_tag & 0xffff0000) >> 16 getters_idx[prop_idx] = " 0x%.4x" % current_getter_idx From 1a46b346aa593e3a8cc9adfe9ecaf7550006b02e Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 14 May 2012 20:40:37 +0000 Subject: [PATCH 33/35] Monotone-Parent: 896076b20bdf94cbc408070acc36cdf121794929 Monotone-Revision: 25f8df1c5f86087b0e7ba1ba87e86db95ad798ab Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-05-14T20:40:37 Monotone-Branch: ca.inverse.sogo --- ...Native Microsoft Outlook Configuration.odt | Bin 25751 -> 25976 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 f6bd61998b121f454a4050f525ffb4e75b0ed75a..2ca726dde90a7fe34cd2335ee21929770fb1aa7f 100644 GIT binary patch delta 18730 zcmbT8bBrL-6X(Y^c5K_WwPV}%j(5;AvxD8Sv18k|ZQHi3+uvPsxnFX*KdzEbI+g0Y zm)Cjy?W&hlCy#(WkAfm7$$>*)fPlb&fIt+)BFG^^6jTcDnpJs7B7=ZP#+r$NBGwe^ zg8>`*uFZLZc)n}ux%vB}elUigfqE}6%S0Px>C?h*j<2+GDz{QP2QDG4p@z;_1uS8G z5)cPEX33f|YDxL?0<*NpV9G6F&Uv$|qwg3L#r!g`><20{c?r)vkH_|Ef8xOWh-rvJ z^8K;nz)Ym!ev|x{Q_=*;SQu-FSm)%EPpOzG%b#00Di17s=Yz$uO6YM}W=b$ct$DJY z`IUSxozM>g>#>Xsd8%5e2-Wo#yCTGkV`Uha-OaN;8Z`J|Eh6s{^+CqG@ae1L6LgV8KJ1lZL9;1m|}8@k>+|LCP~i zp|rLXudQA7wo~OLU)o+Fmadt)O0{&}#dnYnzB^It50iQrynG?IkB4u>}eZ06;M`z}0J6+j)-|<3!v-XTit*X}^UKOjNqYr#rd%kIs91!<h9PX~<1V*&N^PlTp zKP#bmN=_FSn<~7xuBjIq!=Mb$T;1;%G@VbO+5zhES^L8%ODX-)_6cnN{O3MDG8@ke z;of)}r!Q~^`?lq`Xp&Q?`5NaXdkc3(F!F(-7%6~xQNfx&-QC3?O8#_JO>x9q#c#nb zdd82j!Y##RG_v3v^pjCgI!q{d)?{$iCP{sy$#edSs;heD0J%fwn8zS=g-}|BlZwDB z8sJ&J@g_H?MR0~9ag;(H$v%E*0#-9_y>&ia9N=wrCh)e5stZzsk?OoMakWV4%n?$i zjjHRGQDsuYiXc-P+VpBn6fYhiMsiI`|ESp-(>9yGM9TX_9|E!YAu;^Q| z;ihuaqliN3(8v>dpygV(+@wrNE} zs;AutXjs|5#cz2{t*83XSJnHoNMg*^Mtc{b>vLW=YOWf!!%wYTyxFVEc@F^UDby_#m>D~LRsK8MyoLN&XdWgi-4r6r1l2G@AhZ(TZiNW^_Siel+ z*q*IWchN-WN8~km7qtU=H#`D*dripoO#&~}O+KDppdLKa9drK_@S$u*eTt`L>2M0( zkQJ)Fd{yn_8@c)S*bNWHFnuNfRN-uXj@p4|+IV4GN8rKhN=+qqXG%bq&9*@IpOR^( z{?Yt7rML6&l9{k21hk62M9R11BwN6L@+PiSs~fPn@j;Pj&RJKM{vk+o5K$Q%5(tkd z#nPjVuWWDnsN7e)eOaQqMD}*4=$vwFJx>$vW7B(yzbBzlWhwLn9CjGZuw8XV(m!1Q@aZo^`Kl)9M!t3@S6y(H z94t1dQZ*=1zDH^s%;e*lBTI-Fh<2u`TwUyo4xSw2|QEB+_ZadP9JhjhSx?@qXwy{fug90?d%-o&{VXU6cn%MO3bEFL7)Y=4#yR z)}_R!_AJBk(4G_>*uOht%5>jrE`$n*6OH>hz;j>K=f752}^aZYGtjX1B z%IyV!tc>}|{pk~VNgK9>kVQkEANDn^4eN4EI4pF2?^|2G(xtaQW8!lUhCw;n6kBV8 zoX5AL_D!WrRj^gcEQj~zP8TT;_!oZ=Qq}b3M3t#$o~tvqaUZGA*uH31#b5y61}YU} z@|(jl0!!Z@HJEtqa3TWZ)W{fd)&|pN_S~5l;!;K?;(+!I~B~%-e$!*f2l%9 zDafA`z3}54F<#?aHp>HF zaX-^*8eJf#DxS^jU=@;(R85jt2Iu(~!DVpP8?}$g)Jwjf0+;doom3C}St+tND>CPx7wNict_m)(FF{bh zxP;6yYS3kH^t`F6#H=l`!GB78N4NqS)tiW3l%y!*<-@fVxN~|>lj<1Tn^CJi>4v38 zw?%pVsNk$euw!E4RoLo}Rw{)&Jnjlsi?yZYa9o6;Etxhf8d;j6;Q2}Uw<{b#;#j$J zl(Yuc|9;elpnLk=&VEz1&yY)%q7n2<4dBYn1zs^@fc#6QXZq zw0^-*GB;-7Q<~@b`?s?2ol#q6<`z69J4(=Ud>2Q_qxt&1gElXBIeDj$wnBBh?%x^_ z?QJOzXo1pS`JN``l$~>LMoYkTG>)S%-FR1Bh;B2yI>Y%luC)EV`EpZ^15MK@cvf_B znzT64-b_O;m21&AftBf>BEgU8BsEtz_LB%a+SD(YE2b*g&f-*>nf`g`@cx!BuVM+tSHzqNdP)-^MNrq{zyLWnBTa zD$OBYY&A9`$2ZK7v@eUQ7}OaTCW}o`70GP}eRQ`GQ7a(O_8HIvx*vsrxo5&SL2sGp;1F#M6O61zoNUW^QT|_;;c=Z$Ib1=+D3EBNlNboL?)H-U-r1p zTCd<}dL=#Z|H$+IE9w6)2ly}V|JzvxKo-l^sGnt%ghBq9jD&)CrKnNh|EhstU|{~$ zK$ZV9@}KB`4B;Pk#$Jx`*T_67U@V?E*yQN}5hy9eLJ_g>rsF{@oPF3*#t|OOAs}Sq zg4kk&gVUBlI;P-egQn5=r<;i68MEA3w2s`Hv&zW)3{N>=nGY7h&XbcW)3uz0l$IlBD^IfKR>sKe4_=fwVI8cS}k4Qyd$99kDGh$U9aXg z(k5>}E*ubW zzmD-ajc&bau16X(*WwIphn-ue84VVu$b)KL?m8fi0as zg$lg1&HwDIdEp1#(Fv3PuHmJvC0QO}BY*Jbi}2+^Gw{BHj<8ethzDui1+2tZ-3|6? zuRQ=ho`CICvm<8Y#ziEb12GyMH8c7iX?ezp2-Bf5HWiNvFe1TBJ4cNmIcWvlB6vWb-ALS^NzC= zX9Ac(KbBIpIIpbZUSENl4rQ)BpDqTK?DYDqc?fAtXGW41$-MO4pPR4SJ%X4pg#P<=uGJESw$ya0 zA>LVX_S_Suj|QXTd*;@GxQ7_pS;JqA7&u*yBLH|ep;oX|Ycgo0i7JJz>cEU*dt&~a zOa^ttI(FsW9Rb-4SjM7GT$Wl;?|9d-DI)31L|ElvFGD|HxqA=`Z=vgtuNM8$6;+xj z`3#nKhPe4VT{o~iYN^q`P;5*wBnsx2FPxrJ9nYInTT)6go{dtS*6*M<#i0!&slT(h zolU^xZ0up$&re2pA2vXOu)5FQWKyp}r z20bsB9)JxH4jR!Z(kou?@^LwVh%ThQBLFPZCG81Y#J94|%l_CdSpEJCxZE1&`^6+E zvRX71XK@gLBh#ikpCHkQWU{ns{?UBf$67tD$;aK^@5&vES;yIle=73=ZhHd_3v0?> zW013){~TMx)uVembo0@6e+v>p2SLunY=}J=rZycEH|-{ciiDBn@J|Ww%+$>C#R9;< zEh1g=n?$Nt>UfgR1q>F|@J6)!5<4ot8f6bS437|xy+0aw*R3mNop&jT6CRdI*Mx92 z7Uf2yT7(BwDTtGasEq4ho$x7Pq5NJqW~gOTU<8(o4IfT`3i_Xii^q9)R#>i^_Cw}~ z>Sv01`-5u#jsnh#xnN9z5io|iD&XCU;iK}6mulK=>j+T|`BhqI6Y}IrKeik*gy%2o zOA{~EsZC${$;YJ&?geWRd`latVA{vjpk&}El|y7sD6@`N3?dpFS5EUc*|p6@4e*uH zrde-Cbo#&CEU$_ZVK4mBUWF%@X8AT}GhwMV?ovacYw`=0EIg4Jc9Zbe_5kjbGy7}H z;WN97D#s0jQ~a)inS9;1E09bnf(4Q;VAYu4~n)nXY)V@YYoT2sBtB4o! z2p)GK`+j%6R46xYhhK4v-+`kQ7&|JwT=tiV)!UJ9)64ux)J{v7UVcSpb1Fmwoq)Ep z@J4e0-0{!>(x-n=BhRY>t9@X`_b-)qlZk{CsGOtX(|Z4{o_9xZ*P|~|g-s6fRhUFI zUprndr{NDtIt$Tw9A7V@GlzlxWr9t8jcpu@dJ~m%R!D4x!NWzlg4+7w(C_BD22^m6NZ($Yr)rztIS&mY_gLXgpF&YoY2~u=+SKQ=JE6BC z_m~;&&z3XsGA;+!6%73G8mDN#+Sg4};DFtNPCTPW`e&Q3LLhUeBoO;OZ#FN5ufT9F zZh;1s&fv#=Yz&PH3qP?9fTluYlRanbf~( z{+Q?rXgJH+o^jnHh1>)-B+pMY$YEw#3!$}CLzuCa47|pFW3=~fpvhI4(N7w}Qauf5 zK@#gBI;h;;lPM?#DzMb}6fgE0_$kEeTL^7q-}C7OodC<+rX7w!kUyA|Ec`Kg$_~P` zVVR>_vac{=0nq7)fqC)tqz0Hc$aCo5Est>rL4((~pTL@Kp+ob|n^^UuTSL9#=`(rH zafjxkLOugXU88?vKr+lQ<*|LIs!LH+cxv6qgefxS0;4a%LZjZvwVBNPgX2)`0*q&z z$C^`>Bm%-?%$`I#abNHWW-!s5q|R(%S!WkLgH2N2mO#R8OzMVT6VY1XpdQlGWTn3^ zA@|$%s`KymvC07UzUxf=pq~DW!nls*wRyMa_!{tgFLzW)c(~QtuQwpYBw-ULljbDF zx6kZKy3*wk%00Ow2C*D5oSsIM;37sgz{9?*3GisV{odo4(XlQVZ?bd{GSo>2(@<$7 zd@IsRkQ6i?l6uZ&bVBYvWZjG7GXrl5MLU>5uf_W7aD|3Yk`b4Gk6G;;{+q(_&{~<| zIU=?2qYg*Hu^)0E2Z~RYdANp48>BTpVA4spk z9e@a;u&>|5p#!U_$ZzaH@$Vp~8l_-0(a~G|Ryzhk(`;fqP>RN)&xe@Dakt@&wn0MC zy49K0-+%kZaOkPzv1$cO}p{D9B7AQ3P|WlGkb7taZv#a6brkb#2L9dq7njskVtaka9Xxid3w`^#h^;G3 zbycDLHSBby6AE`s?gAEpf6!5P$3muC5lzP4Tg_DYdXa>&pMPMVx!ea>) z8HA|E^$hp)(bM~bGyiz@;$h;TQ6W0bRVNVhnFGW_AYu(WTO6%#wrGL+B*|G)p7NGn zK(po!A%?EkcD`lCG32W@B8TkHdHnW`#^KDLu?n0+he7S`qs_n-mL}%+wBFz2jbPt` zT;6MNg|7t3_{(N~(jV4Ge*uK3x~aZ-TTZCBVOz6B00=(Bc?JrNH1l@jQ{~kt_v0hS zOzfcS_f?Hmhb%1X2)^oyKHc8g9<+*G;-sNXNUa=MM}1du8|(hQFsEBz!Zj`7UCzkr zOKeo=RhFa-_Q2g@|6Kgx*d&n-iW%Zsfim5k@h#myYL!~w;QUh+j)704uD@{ttR4c< z6AV|G480hw;eD>Wd6A$^<;SSz?!k%koAT8TXY^%a$3Gnc-#Fm4u;Na3%)kOmXEelM z4aU$(9KyXyz#~GK2WR(D>+@oJeuFt5aUKomVxhN&Mu=7gMuQj5GIgj!u0RR z8hTV4$nnLolEX-^!vgs11`=`6^0u*gFrU?g^hO#&(sN#5>@8l8t_{F(s zedlb4K|S$a=e-z{y^# z3#*EM4Cn*~_B?B*9O$REECH}Nh<^CC=5SNar7=mJsJBmRR1!CYy-8s zh*!JEulv{z|0>4pqO-N+7DQKJ^0*IP2#Igi?19##?58ZphcMg&f5G^Jq=|92M9Wy4 zfMgWntyc#e`ctH$J(uaY%Bd&V4{1-c*xaY^DlYASWIy&kv>|WHFRzzI6R6H-MJ1<< zu@Q)t4||KB?dz6zIHMln0?p2GfzV>K$S&d97?%+FFUujBc+i8p7Y50Dr&xK4WwZFRmP%yba1=eK9n+@bua~v2MfDm4Z^hK93w5xSegz{i7>SzH8gWLWD`i-@{NP`AY}1o|#4@t@8HJ&`U5s+d z=*YN5H-hjNB)|4|ufI6At4yb?Ht>q-n>?|Oi-}KLqv|Xu5_cD0NY1mPfURpp>j(Wy znRIWx!^0cqhk`fWYWV|e(;T)5B^3qTBnPd>WB9ndof;x-DPq<419Lx5U9ejYqF=+% zk&Bj0ey=xIO1w~_w!Y#HQFBcNWf>0DvSpK z@=JC81585yL0Z<2e-Dcmv@EXbH?DVhZ{Y|^J99qbr(R~A7PirOCm9TPx}=JA2BmG5CSOIQMUG7jxr|( z1xq5y{t2W=&V~@P#4n5)f~8=QmcerJnzo4KEjClInwyY}9TA8cb(N!wSz!-A!U7{6 z`rzQF{e#DB@nqC*w^pmXys?+4Mm?rgFKywe75X{n{0xqM!o9av65fF8&p}BDn3-yJ zvr*NvBL1SGH0l#o(FXCKB9hU=roNr7h&mYG%(O)=gPsTc#+A3izn5Q~S z^)=4TIT1#cebjhEo;K3%0ph2+H@+|82s^{vqt30J6E%`)Gmo4WhIxodE+eA9g5}Ao zR8h_!qcv?j3V|GAZDdbqsrxGetof5#=coBe`O|gx)hjPyfpBQ%cG1N@D@JBW((tfq zV#p#**sIyg_t(DjdD8)tS<-H1_7T`E3W)Uv1F1>jKQ|t0}nlP`LIX z)H3x=3Qb|K5VqE;5qm9aMd8YHiKl@x!NgnjNxG7whf}{H6HM&}7?+k677|!sQl&Fc zA}|+gQh|iT^~~UNuB{^D+XvRz2M~ytkPi#Eub5!PyJOM}4}ujt=`J(J)@n{j@DPSy zx$segJr?pbHs22LGG$4{&_>kJUc?0l6>@hDksXB$^$a__o*wTeUN*Qe7djdAY8t16 zwtQWD8`kyZhWTS?t-&Gb!eTtxx8r^KAmw3N_7`i$OG6J!ZEO zx>?r?NY!xdx9);|1g7wjz--pCzbb;iPbu2hpt+O4_gT2X`1Oa|U&qefz;CoL|+ZZCr@3$~XTuR``K@l{D7nXi^KVf`}-d$|0w=P zGv_NWrLiISnxrB4hNPk8Ty9mJ?aWe7bIvd4KC7v}T)e+a=ZZe6ILh#hwY`a7Bn&vO zdk$P810(-(dWq1LS&J~Ve9s814F^xGkLY4p1ER0$JneP)6rdl#_xhsNF{1PycSRw? zu$UAz6nsgW79)7Z&9@Y1HHC;H|k4`Le6!&9B z0=w7F%D=|lS0-X~o9rJr%d-~XSe*k&VfXm48accy@a;s)M?JO0@+m^2ac87TzO}=u@GLD=qpxe$t?_#nP$u)zdLB+{vD)rdd`Cw zydT;zMYMUn=&e;QKBzW=TfOUJU6y1{0iblj2SwV9%42_z%?E<;ln_;b&9m~S4de-c zOK*1gy`5~FS#nX1YXs-FC`-eQdkB~lu-Eru7fj3%jZ%7(aPZH19#1I`U4%lego8LI=EOV5SH{aTR??h`1m(o+B!SD*;L@-2wv??cl#1_FdMU3iV4Eq@6 zLpbypnpd1@&VO|kL%8~#+-MRT2Iu>k!Vpf@r{)xn$Bwlvete|LNrr?cw4$>FdR>LX zW7z;kRu5yIl)X&2G4#o}`*N3`%g0V_fdX>z+yYHWyl8XSt?(eLEQO0ZZ*v{#RT3^w zd>Zr>bfWk_PQY6DwTX~d8O*o z_3t`N+UtRnooyqFyKhGvQQ~|*+$b54~m9ISDp}G4YmyC zuKK(vptP(;QG4#vn!^(<4CY?< zS)u8jPVfx=5O4xY-f839|6Hu*;I1ObPdwT>W{oF{RKKi(U&r=0alN8fDX)r_&j7q~ zn~MB-4hhr0S-2YN!lLtV!zc@6*K!;jNw&du)P{M=YdLVE1l0K`c2B;8L@kjXhO-k% ziE}C1wO^dF0`oHjp}ehoN<*ECGAJC>V)X;@-M%9cbeRDBk^dVaPjHIST0n`s-fZ=~ zsXnH_#!pn4l6NxH`g`0PSMsJ^e_*0oSVe2J-$Cyw)@Hzg`tzAQY0K+$UxQ6so|Qzy zMZzt29v}^8QkkheKbO7? zp}=1eRFSDxxUFT}g4Uz{a3P1Dl0@5IMVaAYr5OuNUhbX<3D;(ka!T{HirXvfO@CkM-MSqDJ%$Ehd z=DojU94VjkvGc-rcL@YgMFGO5pAHMtBVk--IzDX<3&K<_Ucw_2M?fi@MN286L3+9o ziH+N$S-g^-NAnqzDigl$<`%7#dR^~C>FFrrMX(Ojypy^MoDL9f9vry)Fi zq&zg23rc+=ZVw2lOyb&@0w~b_LTtcTqBrXMGbB$rgud`@LDP_-WVoID!Bg2CDM32) z@j|-{#^3agyB6n}0C3%8?!w$jxEXHB{XO(1v1(>ZNO8eEk|TsAlWG%HgfMUHJxOV= zQyG!Cr6jDXPNSC9!sKJwZpaTKuJ(HHd+J6!kGI2O{MidOy8`C4dz!~a5ijzHRH!~R zkptR=d9c?bY1uA`@FFAUlip?3Z-=7l)=UuOC%PvF=PWm(F2E(*_{0HUla5Qgxw!g_ zivnvnjc6t(sz-k<3yxJ*0r_;B6gkcvM;IkK(=X9SqFr-4c9MiQxa5=p&HGjZUN=B? zD%tY6G@65ii~!&B2_JcGU_tcgB=WPh!9a)1Mzu^DH7rUuf7@rKktw1?wQ+d98VuT^ zj77SR+DO#p1mK1)->aR3USCQ1*$URwfjM0hU)-pEAnr2}@XU>P{3EG+)aAQJW-Ppf z$!0ALOn?WS{gEvjozYIPs&dDS=@2bCoyFWQ%(1RkX2}8Rv?QJswREw3c2n4KuM5&&)^%y>CFyF3W$AcsCc^_~`J zO1z~wiu%cgINV_dus{QI!SN38l|JuGuZE7n3}MbirCMnrm=MKI$Y?|xT?sPlo1x{$ z`j6sWKc{eN)ycFPCu4;qvwyJsb*n<`Cu>@P)BIC|cb{Mtk4Nm!R}EtlytI9@^c@AKAxZSJvH65 zbsye~h`s`TU97X+4z)(zjlP*9+jaT)Dq0*I7=so4PP4DO|M4dQtGtxAUwrUliFZX{ zHbO_L^616Z&BEVi)&d8%yPgNEd>3raDWXYn7|@Zfj35m>i=i2K^;~%5PE_Cl5i26} z&rwC`o-TngI!=IKcC`V+=9K_N$S4H~QPBPuX8ae%?w+SXFgnG6Vs?WAPvH#){hrYa zQm9}IqDtj%@t79G4!?586YbE5HE6|#mtMPDS$V~%Xy(P%YR%fE!AL@cMnUG(egy?s z&#v+$fXi~dj9q;WI?Rx;DJ)9~xqMH6)5R{~JH`D} z!I#xuUah$^_ImHReLl%MYtd*oYP5vCu`|M-J9)y7*g?ZqDK_+P5JcP?VC!Kn?RBb# z0H@W5UmchV2G28u+;)QX-wJbmUt1HFemfgv9vlaKU=@iCWnq!!15o{cf?c^!_Uc(5=5BI3j$RA`iyT}Nr5(Ue> zy^R$`92k%a@<$+ZHP%Mb@h;jfGfJTvh&XsQBTaf~_A%y_Nm}&hiR)hXYi$Oa+dDq+ zya}M*4Li4U$W@CVVq_@%9d0is3QhyGF9$Trmgh^*%y4-RlP9%l=cZY@Too`=c}09w zkLqJeTy%!#|0tyCEXi1HQ01UcaL5xxoQXTiXB=0wh~2wW7#Uc0)GD0#v0AQgx^Gtt zn7R{tY&dv{in1^afoRz>Bh%pD;2vzt^9~{=bLAXa=^IyCW0CRk8_rbpDfBqRm#{^H z=Ew7}D`4*B6Al>v{JR!?l(G}Nggk0y(2AWNpU%#W(yfYn{-5nh@8Uv3Y}m>azt7GJ zD7d$<7Y-W{#M8?-l$f?=7;KD?p|%?8b*Byt)bv6aGz5ssQ_&z*QDkqBwioBr#>Nz( z882_dk`~WcRJ3cikX2D&^2?9~@bx&mnIusY$&6nD)Qrv#$DIaVdr1^7W=_OZZENVU z){pb%e2@Yo<2*e08>VpVq)P&ZaW(A#J=ij0mArhK{3WjvR?6s~k$l2zS0PtHRoZV3 z%sE+levde+wKtIbG6K8EQ*?b~Q#>Q^T(Y_(+a5)^g)QwzYRcicWnr4-9W1`TwtdHs zkuf4KLyh1Kp^zgAmtcFnC&|XdoJ$#wtdH@OtfXhRw%tgU80^@R-Wr89RY<&nAxusU zgwaZVj&ZW~@I2de;x@Ike*QmLMIRP**|E=h}MWl2*4hN;oS0r*si3bm}SK@ zC-W-@tN{Ge$|C_G`}f51M>mD!Nc3>7V$%Th^BDxZaS4|%oc+UD8H@lf0;VLoy**6e z;C+BUKrw8m5n~D0@dfT@_Rm}(TYYuGrkPEb@>OCnxxAibFr~b2fq&aNUicpX_Jhn7f*Qj1 zw?o;Yd;`M`jgiW+%3g6WlB)t}lNBb($=}M4xzcF!a6RFxK?x?@u^nF{i0Mv@wT5YQjOBxo7ma_Gd0!8(b~n3famw+=tip%$-2Ogs)E{+kH-@+8c>&tz(()}!95rM{ zP+yEl1}?45q%fif#09VRJLjs2uvc7-J|Sjbo@}!uDDI|1tTL1YmfcXb(-#pK~>FIi~@u^u?3hxS2p~7Q0k4@ceBftI)rZSfPZc@<11wfj>io@;Ik_%1~XWu2FtGj(4wnohQh?66PJg%dv30Z7 zB;9s7g|-rTY$eOoU4fmKL1vRXF+NLR(@MGWK|s<{cwD=PW##)=*hU{6fnp(1QQ%7bHR!8nf zrbJA^m_ZRgTR%P)^23}S7Ai>f1uK&koLI-If-1VtsGX{v zdESPHVS}-zkwe!|?OBX!=TcAToXy|E8D}|Xp2XZZrE_j6`I}ux;K^?V%&S*K?QOrx zWds_)gs)!w2zb$?a(C|d8byDr0?bmDJi*SMFdHg;7fQakvR{FH6g9nuFe-IXmrK}z zOV_0R<`XrngxZp$H za+-#D`tnvSF|e!WgK*753Nj>q)$8X|a^u=yb1O)5#M(6H%4`Yk5pBH70K-#^Jg2gW zawV8*5VP;kNzYKIrv2@S$=jqW2ty*Q%D@s|I4_vaYkCO9AE7q*1GktZLgZlXsfL)J zT$Qv+2~t1Sg}-@HVZEdEZD8W`_BKn>#$u_%eVPr`>7)}KLtgR-ebIIvVY_Zsl*4&; zoP&YSQtWMuHLFpWk3HAw0ejp&!hVud2bq%tmal6>|=rX)t&0W8dexmi3UvhZwbYbU1T zf1t7#9<^PXxdNeE4|?J3E*I$Mn2bk2d>vWqnm$Ula#7)Jac--9QsoPf_!PQhbz z-dhtECUL5Mi3}270B3dQafayNIhCIoM&m%xhvZTsq!)tUYR23(vH2dIMf>khDLlTO z-z+EcyT`8^1hubn4qK>ydH1g(t*_`Fx}*1uX}jOjgEQm3G_gF0w(7h)g<11ndbajZ zRIyRGe~|E+E6d6t*kCUu1whbdVNqU^!!sJ8*w`5lFi?^r0R~}3>6|SSUvtsG(3t*m z0lSAYa`tY5dz*gP%buu_F%})A(Q#88-f#Vg)*~%t&*Afj6-r#4E0He}m?KbcD)BIH zM;7m^*Gl^E!WyXjDcQ14oJPmEfdET~Xv4TMy0)D6KNd_%%gp_>LM9_kR!Jr?^ zSw$dR1aKg9fY#d4iUn6WR)9LlA9=8djD8=a7+6U+6#DPG*mq`=Ex8kacOzV%(ubcS zM>Y6s`V+??##Rm0!gxm0BO4!oGS&K~G>EIpMMB$_#E#OIDzKm_(}uY%QvlmM-ryx6e`9o8?y#O8>;-qxLFybzfGDkguoIjK?EOl%0 z6UZe@fJOBbvqZdxFu(afv=X4g7`5%Fix0c>nyK0oWNB~(3HAK9%+J;y#A=Is15h6{9EFC`?)~?~j`!;tl zW)f|?c!FkZ#z%pQ_7l7_5!-&T$M3SO$;ajt0t7T?qy-$`X8K`$EfgiJNs1w)f(r*AIyoir0JX z1(U{8l!#ujHK`5)NTKX27`?&A3VLJTB;;~2#9McLvfxEdLVxhinuV9>Op3UFPaWx( z1k4YW5*Zx>_NIgd0-;M)H|nE?nfACNg3D9MXwg+$kld`d6Od5zOd@=lvti6xCnQ@3 z6p|#azq99a$InWz9t9%pA zeNvN;Hy=-z*uncJnq`BZq`ckwg9WTZ!uetRdLV*CFR^iY$v34?yvX1BJ?+)}Kvd_l zLw0A=;QE+K9cVkRL% zYuWOw{L^uiORe>hI__1FgxU!!cV?BHJYO2sSdPar=w3lbV07z#;Zh3IfG$uH>sp=8 z-Y_=-!=LiAGUWl|hd27!+a>)?M=KusBIo2%4(v3bVa;^P2sWlHb6hD^kG{rsZAG1g zZ48DMT+=yqEk+~y=iUfEa~Or?xoawf6SSBbrb_C-{=}|Se13K5OsP(r9tY3C*yf6;yEF3Fq9T{!+yl##(KEN7^QXbgO&fBk?Z26-MQf7@ zrHnB%IhPR2q-F4%l1R|a*gAZrgnS+(k(tJMBGpRTeXs21 zgX>T_y#F&TcL%TC?e~YqB70qc%YraVhx50E>Q|XFQOjDgND=%6KpuF%zI_qc)9dsP+unGl2jZRVpgGR#Q?$4pz)T0zrF?9 zC0c&}yj8)~hniw~`z`>Epi`5Z0xLcxce(=xmr@M_PCOoHRaAh^Pgh6MpgZz&aIN3s zp$4y_Q^{7>xuW{4Y#1-4&Jc5A|)kZ zjypEEd8!M>`O8$1w=P{?N5Eu-M6poq!|bA2mVrq}0IFcm?z#|Smeo@_EtTcarz`1% zMM`)Cx)7rLdm~tj`A!v1!wvpwB*N;x5oTXO13|rPBV)Z$)yq^D!Q)fL`pP_Tm+k@k zrYe7~RwneV@5g<1F6o8T#dBo(H>u?*9+E4`&!n)m%S};ZtzNEJ4J!p)exClqCK5~! zbHVH9niwYrmkAO4j;-ObM|9N*wm$o1HKZbJ&D66TJ$YiPLm`Lf*RKEU0ayo%477iL z8o+n{@5Y!)K=@y)%>TCkwBfjzySiFCSh_HJ+S@hg$h+)vqjX$VNxx*GNYfIj#nFg` z;82n)2~#$>pu2;w4%;M?Lq9*Q)smz^dWRUDC4@0}l<9sL2+6GbXiM%MBPJYDJ9fN| zlz2d}cE^mZR6Oxt;v0GyUVgUroFqU`0|+eAq%ntD|D%g*4~H_1;&U^saSLH;GG=H* zVqzF&-Ia>m+6Z&O%t)h|L4(-VL_|`lFJ&kS<1)F1(Xwk>8EqnqEV)D%msMI4gN%EYQG{_LOU-SJn@KE3Z|t>Olfd9k%InJc>{;Mm;ULf!(+ratfz$!gTvQo);PZ&}Z?54&?hN{zHh5~Qe~=Iw~E-g38#K->8q*fDA=UyqVNkhQqlg! zQwurw=H$IfhJR`ZRaF-&MNfATo`JoQS+Gux6ljZQX9EmDv3XtitK&K0KHDXqg8j6v zvLB-aHwV$x$hvK5{1z8>!x>=@;j94ZB@DWVO`gG4nfQ&y=_J)XA;m3i5{EJlO$cwn z6{Fox^P)F83=&B2h^hgsT-f-;3Lb?Qw`DB%ZVOG^Xv_|osvhq(4Xmv9W^sbVw{|NQ zZpfww!oCsZ-HPh8P}ZK@VagAfv3N1-UXY~XH#on~Aoko3g5TRq4028{AIx*>$cwKJ zsyVCa%~ETrWG%dTZ*qOhH{cJD6zcV2c@wUNDlbdGDNpOT;_AV2un@oeezsk=-&AkJ z<0|&(Vh6tIH7f%va(L-C?MMzp4UOrUDYkLANyV75&RJ&kZ_ z@Me0fbjMU{3vV>P^;|{XLa-b!Phk|)wK#RIkC>wP`H@!|IacQn7TmXjE4nTUSoSJT zylD&~HJNiYWc>bzWl%8re$hkSpog7?#}@sasmbBGJXp)Iv5*Rjn1=1Mk25vzoa#%q zcbjM7l3a?WdlE;v3#krQMtp8_GVUgnl^yx{?R~VMcdnhcbZ*3JB_OTb@)w;$zSTQA zvWg)LFtf}4E5WnSy0PI^wl!N(3u1!1MrX@?uB(TQi3xTb>66DV`2@A3sq`d5^c<9-K}N|4i@CCO%n<(RSy zIaqpxwrnHf%(Hjm6{dWT=0DrwP8G>9wHx)Q29qdf^%q-CU7Pcu)9r8&5$140 z&#v@rHG`6QP-#vPW=nMBi_*!AFtMB$G{T$FN~uFaxAK=BTr6)*$w<(XZ=P^hQAcJ= z-unA{7dqMV3HqZdmkMd#Q-<(bp6Dgk+tw;EHZ(E|(?pEnzI%yI*!9bKZA?t1gY5x@zk*>PP;l)}zU~mnPD?=9-vUOkJZJ$p`|p$^;CJJ#fjIw6 z9RgO5#oz|-j^#wrchES|Y_2WVoVW`QU;=dH%<<-UOTaF`2x?8l1D6AEKxRNG1SY86 z9k?AVp}T6rVx>K?LvQS1C{C7l-8fm>k*I;w3#Q>k$u7-J}XFe zOf?XQ#$j_AY_7CmdAWfhnjlTkdXK4W-BbL+u);}F>bP;o86OMX|Ls1fWW!o>>SxOXtwfFY?IYzScJ8h|QI zb1lp=@K7>)5Qr?%(**92mA`Z$fd;<*(M3K@>l0RRmqf7DVEy-$b%T~=K=M>Tk)r>} i;aV~PcRC8D7L67<_1CIbTUs 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 Kp>;hT!~+0^Oz Date: Tue, 15 May 2012 13:24:04 +0000 Subject: [PATCH 34/35] Monotone-Parent: fa858afb28392ab411b14c34ac2889901bc0e49a Monotone-Revision: 22cbe59df1fd7bc7e696537291a1822e5d95e2f1 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-05-15T13:24:04 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 +++ OpenChange/gen-property-selectors.py | 57 +++++++++++++++------------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index a5e9838bf..c6352ae72 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-05-15 Wolfgang Sourdeau + + * OpenChange/gen-property-selectors.py: the use of the "{}" to + construct a set is only valid on py2.7 therefore we make use of + set([]) instead. + 2012-05-14 Wolfgang Sourdeau * OpenChange/gen-property-selectors.py: "bannedProps" is now a diff --git a/OpenChange/gen-property-selectors.py b/OpenChange/gen-property-selectors.py index 3052c21bd..e30ae6104 100755 --- a/OpenChange/gen-property-selectors.py +++ b/OpenChange/gen-property-selectors.py @@ -106,32 +106,37 @@ extern const enum MAPITAGS MAPIStoreSupportedProperties[]; # hack: some properties have multiple and incompatible types. Sometimes those # props are not related at all... -bannedProps = {"PidTagBodyHtml", "PidTagFavAutosubfolders", - "PidTagAttachDataObj", "PidTagAclTable", "PidTagAclData", - "PidTagRulesTable", "PidTagRulesData", "PidTagDisableWinsock", - "PidTagHierarchyServer", "PidTagOfflineAddrbookEntryid", - "PidTagShorttermEntryidFromObject", - "PidTagNormalMessageSizeExtended", - "PidTagAssocMessageSizeExtended", "PidTagMessageSizeExtended", - "PidTagOabContainerGuid", - "PidTagOfflineAddressBookMessageClass", "PidTagScriptData", - "PidTagOfflineAddressBookTruncatedProperties", - "PidTagOfflineAddressBookContainerGuid", - "PidTagOfflineAddressBookDistinguishedName", - "PidTagOfflineAddressBookShaHash", - "PidTagSenderTelephoneNumber", "PidTagGatewayNeedsToRefresh", - "PidTagWlinkType", "PidTagWlinkFlags", - "PidTagWlinkGroupClsid", "PidTagWlinkGroupName", - "PidTagWlinkGroupHeaderID", - "PidTagScheduleInfoDelegatorWantsCopy", "PidTagWlinkOrdinal", - "PidTagWlinkSection", "PidTagWlinkCalendarColor", - "PidTagWlinkAddressBookEID", "PidTagWlinkFolderType", - "PidTagScheduleInfoDelegateNames", - "PidTagScheduleInfoDelegateEntryIds", - "PidTagBusiness2TelephoneNumbers", - "PidTagHome2TelephoneNumbers", - "PidTagAttachDataObject", "PidTagShorttermEntryIdFromObject", - } +bannedProps = set(["PidTagBodyHtml", "PidTagFavAutosubfolders", + "PidTagAttachDataObj", "PidTagAclTable", "PidTagAclData", + "PidTagRulesTable", "PidTagRulesData", + "PidTagDisableWinsock", + "PidTagHierarchyServer", "PidTagOfflineAddrbookEntryid", + "PidTagShorttermEntryidFromObject", + "PidTagNormalMessageSizeExtended", + "PidTagAssocMessageSizeExtended", + "PidTagMessageSizeExtended", + "PidTagOabContainerGuid", + "PidTagOfflineAddressBookMessageClass", "PidTagScriptData", + "PidTagOfflineAddressBookTruncatedProperties", + "PidTagOfflineAddressBookContainerGuid", + "PidTagOfflineAddressBookDistinguishedName", + "PidTagOfflineAddressBookShaHash", + "PidTagSenderTelephoneNumber", + "PidTagGatewayNeedsToRefresh", + "PidTagWlinkType", "PidTagWlinkFlags", + "PidTagWlinkGroupClsid", "PidTagWlinkGroupName", + "PidTagWlinkGroupHeaderID", + "PidTagScheduleInfoDelegatorWantsCopy", + "PidTagWlinkOrdinal", + "PidTagWlinkSection", "PidTagWlinkCalendarColor", + "PidTagWlinkAddressBookEID", "PidTagWlinkFolderType", + "PidTagScheduleInfoDelegateNames", + "PidTagScheduleInfoDelegateEntryIds", + "PidTagBusiness2TelephoneNumbers", + "PidTagHome2TelephoneNumbers", + "PidTagAttachDataObject", + "PidTagShorttermEntryIdFromObject", + ]) def ParseExchangeH(names, lines): state = 0 From dbc75ceddbfa8700cd099ce6fcbd1c21f15f5a45 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 15 May 2012 13:24:15 +0000 Subject: [PATCH 35/35] alignment Monotone-Parent: 22cbe59df1fd7bc7e696537291a1822e5d95e2f1 Monotone-Revision: 3c99de4fc0fd90e4716ce18b2354e46dc72159ec Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-05-15T13:24:15 Monotone-Branch: ca.inverse.sogo --- OpenChange/gen-property-selectors.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/OpenChange/gen-property-selectors.py b/OpenChange/gen-property-selectors.py index e30ae6104..8c728bb99 100755 --- a/OpenChange/gen-property-selectors.py +++ b/OpenChange/gen-property-selectors.py @@ -233,8 +233,8 @@ if __name__ == "__main__": names = {} ProcessHeaders(names, - { "gen_ndr/exchange.h": ParseExchangeH, - "mapistore/mapistore_nameid.h": ParseMapistoreNameIDH }) + {"gen_ndr/exchange.h": ParseExchangeH, + "mapistore/mapistore_nameid.h": ParseMapistoreNameIDH}) getters = [] getters_idx = [] @@ -284,14 +284,14 @@ if __name__ == "__main__": filename = "%s.m" % output h_filename = "%s.h" % output outf = open(filename, "wb+") - outf.write(m_template % { "getters_idx": ",\n".join(getters_idx), - "getters": ",\n".join(getters), - "nbr_getters": len(getters), - "last_property": highest_prop_idx, - "nbr_supported_properties": len(supported_properties), - "supported_properties": ",\n".join(supported_properties), - "filename": filename, - "h_filename": h_filename }) + outf.write(m_template % {"getters_idx": ",\n".join(getters_idx), + "getters": ",\n".join(getters), + "nbr_getters": len(getters), + "last_property": highest_prop_idx, + "nbr_supported_properties": len(supported_properties), + "supported_properties": ",\n".join(supported_properties), + "filename": filename, + "h_filename": h_filename}) outf.close() outf = open(h_filename, "wb+") @@ -300,7 +300,7 @@ if __name__ == "__main__": if ord(x) < 65 or ord(x) > 90: x = "_" exclusion = exclusion + x - outf.write(h_template % { "prototypes": "\n".join(prototypes), - "h_exclusion": exclusion, - "filename": h_filename }) + outf.write(h_template % {"prototypes": "\n".join(prototypes), + "h_exclusion": exclusion, + "filename": h_filename }) outf.close()