From: wolfgang Date: Wed, 24 Oct 2007 17:21:18 +0000 (+0000) Subject: git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1197 d1b88da0-ebda-0310... X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=885606e2ef68d6a86c959c81bea0d542b5be6ba9;p=scalable-opengroupware.org git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1197 d1b88da0-ebda-0310-925b-ed51d893ca5b --- diff --git a/SOPE/sope-patchset-r1544.diff b/SOPE/sope-patchset-r1544.diff deleted file mode 100644 index 5909c448..00000000 --- a/SOPE/sope-patchset-r1544.diff +++ /dev/null @@ -1,435 +0,0 @@ -Index: sope-mime/NGImap4/NGImap4Connection.m -=================================================================== ---- sope-mime/NGImap4/NGImap4Connection.m (revision 1544) -+++ sope-mime/NGImap4/NGImap4Connection.m (working copy) -@@ -381,7 +381,7 @@ - - if (debugCache) [self logWithFormat:@" no folders cached yet .."]; - -- result = [[self client] list:(onlyFetchInbox ? @"INBOX" : @"*") -+ result = [[self client] list:(onlyFetchInbox ? @"INBOX" : @"") - pattern:@"*"]; - if (![[result valueForKey:@"result"] boolValue]) { - [self errorWithFormat:@"Could not list mailbox hierarchy!"]; -Index: sope-mime/NGImap4/NGImap4ResponseParser.m -=================================================================== ---- sope-mime/NGImap4/NGImap4ResponseParser.m (revision 1544) -+++ sope-mime/NGImap4/NGImap4ResponseParser.m (working copy) -@@ -84,6 +84,8 @@ - static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self, - BOOL isBodyStructure); - -+static NSArray *_parseLanguages(); -+ - static NSString *_parseBodyString(NGImap4ResponseParser *self, - BOOL _convertString); - static NSString *_parseBodyDecodeString(NGImap4ResponseParser *self, -@@ -1627,6 +1629,29 @@ - return _parseBodyDecodeString(self, _convertString, NO /* no decode */); - } - -+static NSArray *_parseLanguages(NGImap4ResponseParser *self) { -+ NSMutableArray *languages; -+ NSString *language; -+ -+ languages = [NSMutableArray array]; -+ if (_la(self, 0) == '(') { -+ while (_la(self, 0) != ')') { -+ _consume(self,1); -+ language = _parseBodyString(self, YES); -+ if ([language length]) -+ [languages addObject: language]; -+ } -+ _consume(self,1); -+ } -+ else { -+ language = _parseBodyString(self, YES); -+ if ([language length]) -+ [languages addObject: language]; -+ } -+ -+ return languages; -+} -+ - static NSDictionary *_parseBodyParameterList(NGImap4ResponseParser *self) - { - NSMutableDictionary *list; -@@ -1734,10 +1759,11 @@ - *encoding, *bodysize; - NSDictionary *parameterList; - NSMutableDictionary *dict; -+ NSArray *languages; - - type = [_parseBodyString(self, YES) lowercaseString]; - _consumeIfMatch(self, ' '); -- subtype = _parseBodyString(self, YES); -+ subtype = [_parseBodyString(self, YES) lowercaseString]; - _consumeIfMatch(self, ' '); - parameterList = _parseBodyParameterList(self); - _consumeIfMatch(self, ' '); -@@ -1762,7 +1788,8 @@ - _consumeIfMatch(self, ' '); - [dict setObject:_parseBodyString(self, YES) forKey:@"lines"]; - } -- else if ([type isEqualToString:@"message"]) { -+ else if ([type isEqualToString:@"message"] -+ && [subtype isEqualToString:@"rfc822"]) { - if (_la(self, 0) != ')') { - _consumeIfMatch(self, ' '); - _consumeIfMatch(self, '('); -@@ -1805,14 +1832,9 @@ - forKey: @"disposition"]; - if (_la(self, 0) != ')') { - _consume(self,1); -- if (_la(self, 0) == '(') { -- [dict setObject: _parseBodyParameterList(self) -- forKey: @"language"]; -- } -- else { -- [dict setObject: _parseBodyString(self, YES) -- forKey: @"language"]; -- } -+ languages = _parseLanguages(self); -+ if ([languages count]) -+ [dict setObject: languages forKey: @"languages"]; - if (_la(self, 0) != ')') { - _consume(self,1); - [dict setObject: _parseBodyString(self, YES) -@@ -1829,6 +1851,7 @@ - static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self, - BOOL isBodyStructure) { - NSMutableArray *parts; -+ NSArray *languages; - NSString *kind; - NSMutableDictionary *dict; - -@@ -1854,14 +1877,9 @@ - forKey: @"disposition"]; - if (_la(self, 0) != ')') { - _consume(self,1); -- if (_la(self, 0) == '(') { -- [dict setObject: _parseBodyParameterList(self) -- forKey: @"language"]; -- } -- else { -- [dict setObject: _parseBodyString(self, YES) -- forKey: @"language"]; -- } -+ languages = _parseLanguages(self); -+ if ([languages count]) -+ [dict setObject: languages forKey: @"languages"]; - if (_la(self, 0) != ')') { - _consume(self,1); - [dict setObject: _parseBodyString(self, YES) -Index: sope-mime/NGMime/NGMimeBodyPart.m -=================================================================== ---- sope-mime/NGMime/NGMimeBodyPart.m (revision 1544) -+++ sope-mime/NGMime/NGMimeBodyPart.m (working copy) -@@ -31,18 +31,6 @@ - return 2; - } - --static NGMimeType *defaultType = nil; -- --+ (void)initialize { -- static BOOL isInitialized = NO; -- if (!isInitialized) { -- isInitialized = YES; -- -- defaultType = -- [[NGMimeType mimeType:@"text/plain; charset=us-ascii"] retain]; -- } --} -- - + (id)bodyPartWithHeader:(NGHashMap *)_header { - return [[[self alloc] initWithHeader:_header] autorelease]; - } -@@ -156,13 +144,12 @@ - if (!Fields) - Fields = (NGMimeHeaderNames *)[NGMimePartParser headerFieldNames]; - -- - type = [self->header objectForKey:Fields->contentType]; - - if (![type isKindOfClass:[NGMimeType class]]) - type = [NGMimeType mimeType:[type stringValue]]; - -- return (type != nil ? type : (id)defaultType); -+ return type; - } - - - (NSString *)contentId { -Index: sope-mime/NGMime/NGMimeBodyParser.m -=================================================================== ---- sope-mime/NGMime/NGMimeBodyParser.m (revision 1544) -+++ sope-mime/NGMime/NGMimeBodyParser.m (working copy) -@@ -67,7 +67,10 @@ - if (_data == nil) return nil; - - ctype = [_part contentType]; -- -+ if (!ctype -+ && [_d respondsToSelector: @selector(parser:contentTypeOfPart:)]) -+ ctype = [_d parser: self contentTypeOfPart: _part]; -+ - if (![ctype isKindOfClass:[NGMimeType class]]) - ctype = [NGMimeType mimeType:[ctype stringValue]]; - -Index: sope-mime/NGMime/NGMimePartParser.h -=================================================================== ---- sope-mime/NGMime/NGMimePartParser.h (revision 1544) -+++ sope-mime/NGMime/NGMimePartParser.h (working copy) -@@ -117,6 +117,7 @@ - BOOL parserParseRawBodyDataOfPart:1; - BOOL parserBodyParserForPart:1; - BOOL parserDecodeBodyOfPart:1; -+ BOOL parserContentTypeOfPart:1; - } delegateRespondsTo; - - -@@ -275,6 +276,9 @@ - - (id)parser:(NGMimePartParser *)_parser - bodyParserForPart:(id)_part; - -+- (NGMimeType *)parser:(id)_parser -+ contentTypeOfPart:(id)_part; -+ - @end /* NSObject(NGMimePartParserDelegate) */ - - @interface NSObject(NGMimePartParser) -Index: sope-mime/NGMime/NGMimePartParser.m -=================================================================== ---- sope-mime/NGMime/NGMimePartParser.m (revision 1544) -+++ sope-mime/NGMime/NGMimePartParser.m (working copy) -@@ -1091,7 +1091,10 @@ - id bodyParser = nil; - - ctype = [_p contentType]; -- -+ if (!ctype -+ && self->delegateRespondsTo.parserContentTypeOfPart) -+ ctype = [self->delegate parser: self contentTypeOfPart: _p]; -+ - contentType = ([ctype isKindOfClass:[NGMimeType class]]) - ? ctype - : [NGMimeType mimeType:[ctype stringValue]]; -Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.h -=================================================================== ---- sope-gdl1/PostgreSQL/PostgreSQL72Channel.h (revision 1544) -+++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.h (working copy) -@@ -28,6 +28,7 @@ - #define ___PostgreSQL72_Channel_H___ - - #include -+#include - #include - - @class NSArray, NSString, NSMutableDictionary; -@@ -40,7 +41,7 @@ - int modification; - } PostgreSQL72FieldInfo; - --@interface PostgreSQL72Channel : EOAdaptorChannel -+@interface PostgreSQL72Channel : EOAdaptorChannel - { - // connection is valid after an openChannel call - PGConnection *connection; -Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m -=================================================================== ---- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (revision 1544) -+++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (working copy) -@@ -713,6 +713,39 @@ - return ms; - } - -+/* GCSEOAdaptorChannel protocol */ -+static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n" \ -+ @" c_name VARCHAR (256) NOT NULL,\n" -+ @" c_content VARCHAR (100000) NOT NULL,\n" -+ @" c_creationdate INT4 NOT NULL,\n" -+ @" c_lastmodified INT4 NOT NULL,\n" -+ @" c_version INT4 NOT NULL,\n" -+ @" c_deleted INT4 NULL\n" -+ @")"); -+static NSString *sqlFolderACLFormat = (@"CREATE TABLE %@ (\n" \ -+ @" c_uid VARCHAR (256) NOT NULL,\n" -+ @" c_object VARCHAR (256) NOT NULL,\n" -+ @" c_role VARCHAR (80) NOT NULL\n" -+ @")"); -+ -+- (NSException *) createGCSFolderTableWithName: (NSString *) tableName -+{ -+ NSString *sql; -+ -+ sql = [NSString stringWithFormat: sqlFolderFormat, tableName]; -+ -+ return [self evaluateExpressionX: sql]; -+} -+ -+- (NSException *) createGCSFolderACLTableWithName: (NSString *) tableName -+{ -+ NSString *sql; -+ -+ sql = [NSString stringWithFormat: sqlFolderACLFormat, tableName]; -+ -+ return [self evaluateExpressionX: sql]; -+} -+ - @end /* PostgreSQL72Channel */ - - @implementation PostgreSQL72Channel(PrimaryKeyGeneration) -Index: sope-appserver/NGObjWeb/GNUmakefile.postamble -=================================================================== ---- sope-appserver/NGObjWeb/GNUmakefile.postamble (revision 1544) -+++ sope-appserver/NGObjWeb/GNUmakefile.postamble (working copy) -@@ -23,14 +23,20 @@ - - # install makefiles - --after-install :: -+after-install :: $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make -+ -+ifneq ($(GNUSTEP_MAKE_VERSION),1.3.0) -+after-install :: $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make -+endif -+ -+$(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make: ngobjweb.make - $(MKDIRS) $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ - $(INSTALL_DATA) ngobjweb.make $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make - --ifneq ($(GNUSTEP_MAKE_VERSION),1.3.0) --after-install :: -+$(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make: woapp-gs.make - $(INSTALL_DATA) woapp-gs.make \ - $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make -+ -+$(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make: wobundle-gs.make - $(INSTALL_DATA) wobundle-gs.make \ - $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make --endif -Index: sope-appserver/NGObjWeb/WOContext.m -=================================================================== ---- sope-appserver/NGObjWeb/WOContext.m (revision 1544) -+++ sope-appserver/NGObjWeb/WOContext.m (working copy) -@@ -64,11 +64,13 @@ - static BOOL testNSURLs = NO; - static BOOL newCURLStyle = NO; - static NSString *WOApplicationSuffix = nil; -+static NSURL *redirectURL = nil; - - + (void)initialize { - static BOOL didInit = NO; - NSUserDefaults *ud; - NSString *cn; -+ NSString *url; - - if (didInit) return; - -@@ -91,6 +93,9 @@ - debugCursor = [ud boolForKey:@"WODebugCursor"] ? 1 : 0; - debugComponentAwake = [ud boolForKey:@"WODebugComponentAwake"]; - WOApplicationSuffix = [[ud stringForKey:@"WOApplicationSuffix"] copy]; -+ url = [ud stringForKey:@"WOApplicationRedirectURL"]; -+ if (url != nil) -+ redirectURL = [NSURL URLWithString: url]; - } - - + (id)contextWithRequest:(WORequest *)_r { -@@ -503,6 +508,11 @@ - return nil; - } - -+ if (redirectURL) { -+ // Use URL from user defaults (WOApplicationRedirectURL) -+ return redirectURL; -+ } -+ - if ((serverURL = [rq headerForKey:@"x-webobjects-server-url"]) == nil) { - if ((host = [rq headerForKey:@"host"])) - serverURL = [@"http://" stringByAppendingString:host]; -Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m -=================================================================== ---- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (revision 1544) -+++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (working copy) -@@ -216,6 +216,12 @@ - assocCount++; - } - } -+ if (count > 0) { -+ if ((self->isAbsolute = OWGetProperty(_config, @"absolute"))) { -+ count--; -+ assocCount++; -+ } -+ } - - self->rest = _config; - -Index: sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m -=================================================================== ---- sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (revision 1544) -+++ sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (working copy) -@@ -40,6 +40,7 @@ - WOAssociation *string; - WOAssociation *target; - WOAssociation *disabled; -+ WOAssociation *isAbsolute; - WOElement *template; - - /* new in WO4: */ -@@ -359,6 +360,7 @@ - { - if ((self = [super initWithName:_name hyperlinkInfo:_info template:_t])) { - self->href = _info->href; -+ self->isAbsolute = _info->isAbsolute; - } - return self; - } -@@ -374,6 +376,9 @@ - // TODO: we need a binding to disable rewriting! - NSRange r; - -+ if ([[self->isAbsolute valueInContext:_ctx] boolValue] == YES) -+ return NO; -+ - r = [_s rangeOfString:@":"]; - if (r.length == 0) - return YES; -Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h -=================================================================== ---- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (revision 1544) -+++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (working copy) -@@ -41,7 +41,8 @@ - WOAssociation *pageName; - WOAssociation *actionClass; - WOAssociation *directActionName; -- -+ WOAssociation *isAbsolute; -+ - BOOL sidInUrl; - - /* 'ivar' associations */ -Index: sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m -=================================================================== ---- sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (revision 1544) -+++ sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (working copy) -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include - #include "common.h" - - #include -@@ -1016,6 +1017,12 @@ - - (void)parser:(NGMimePartParser *)_parser didParseHeader:(NGHashMap *)_header { - } - -+- (NGMimeType *)parser:(id)_parser -+ contentTypeOfPart:(id)_part -+{ -+ return [NGMimeType mimeType: @"text/plain; charset=utf-8"]; -+} -+ - @end /* WOHttpAdaptor */ - - @implementation WOCoreApplication(SimpleParserSelection) diff --git a/SOPE/sope-patchset-r1545.diff b/SOPE/sope-patchset-r1545.diff deleted file mode 100644 index 5a61450b..00000000 --- a/SOPE/sope-patchset-r1545.diff +++ /dev/null @@ -1,510 +0,0 @@ -Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.h -=================================================================== ---- sope-gdl1/PostgreSQL/PostgreSQL72Channel.h (révision 1545) -+++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.h (copie de travail) -@@ -28,6 +28,7 @@ - #define ___PostgreSQL72_Channel_H___ - - #include -+#include - #include - - @class NSArray, NSString, NSMutableDictionary; -@@ -40,7 +41,7 @@ - int modification; - } PostgreSQL72FieldInfo; - --@interface PostgreSQL72Channel : EOAdaptorChannel -+@interface PostgreSQL72Channel : EOAdaptorChannel - { - // connection is valid after an openChannel call - PGConnection *connection; -Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m -=================================================================== ---- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (révision 1545) -+++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (copie de travail) -@@ -713,6 +713,39 @@ - return ms; - } - -+/* GCSEOAdaptorChannel protocol */ -+static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n" \ -+ @" c_name VARCHAR (256) NOT NULL,\n" -+ @" c_content VARCHAR (100000) NOT NULL,\n" -+ @" c_creationdate INT4 NOT NULL,\n" -+ @" c_lastmodified INT4 NOT NULL,\n" -+ @" c_version INT4 NOT NULL,\n" -+ @" c_deleted INT4 NULL\n" -+ @")"); -+static NSString *sqlFolderACLFormat = (@"CREATE TABLE %@ (\n" \ -+ @" c_uid VARCHAR (256) NOT NULL,\n" -+ @" c_object VARCHAR (256) NOT NULL,\n" -+ @" c_role VARCHAR (80) NOT NULL\n" -+ @")"); -+ -+- (NSException *) createGCSFolderTableWithName: (NSString *) tableName -+{ -+ NSString *sql; -+ -+ sql = [NSString stringWithFormat: sqlFolderFormat, tableName]; -+ -+ return [self evaluateExpressionX: sql]; -+} -+ -+- (NSException *) createGCSFolderACLTableWithName: (NSString *) tableName -+{ -+ NSString *sql; -+ -+ sql = [NSString stringWithFormat: sqlFolderACLFormat, tableName]; -+ -+ return [self evaluateExpressionX: sql]; -+} -+ - @end /* PostgreSQL72Channel */ - - @implementation PostgreSQL72Channel(PrimaryKeyGeneration) -Index: sope-gdl1/Oracle8/ChangeLog -=================================================================== ---- sope-gdl1/Oracle8/ChangeLog (révision 1545) -+++ sope-gdl1/Oracle8/ChangeLog (copie de travail) -@@ -1,3 +1,10 @@ -+2007-10-19 Ludovic Marcotte -+ -+ * We call OCITerminate() in OracleAdaptorChannel: -+ -closeChannel: -+ * Some formatting cleanups. -+ -+ - 2007-10-05 Ludovic Marcotte - - * Fixed otest wrt bundle name. -Index: sope-gdl1/Oracle8/OracleAdaptorChannel.m -=================================================================== ---- sope-gdl1/Oracle8/OracleAdaptorChannel.m (révision 1545) -+++ sope-gdl1/Oracle8/OracleAdaptorChannel.m (copie de travail) -@@ -112,7 +112,7 @@ - // Oracle's doc says: "If you call OCIStmtFetch2() with the nrows parameter set to 0, this cancels the cursor." - if (OCIStmtFetch2(_current_stm, _oci_err, (ub4)0, (ub4)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT)) - { -- NSLog( @"Fetch cancellation failed"); -+ NSLog(@"Fetch cancellation failed"); - } - - [self _cleanup]; -@@ -131,8 +131,13 @@ - // We logoff from the database. - if (OCILogoff(_oci_ctx, _oci_err)) - { -- NSLog( @"FAILED: OCILogoff()"); -+ NSLog(@"FAILED: OCILogoff()"); - } -+ -+ if (OCITerminate(OCI_DEFAULT)) -+ { -+ NSLog(@"FAILED: OCITerminate()"); -+ } - } - } - -@@ -369,19 +374,19 @@ - (dvoid * (*)(dvoid *, dvoid *, size_t))0, - (void (*)(dvoid *, dvoid *)) 0 )) - { -- NSLog( @"FAILED: OCIInitialize()"); -+ NSLog(@"FAILED: OCIInitialize()"); - return NO; - } - - if (OCIEnvInit((OCIEnv **)&_oci_env, (ub4)OCI_DEFAULT, (size_t)0, (dvoid **)0)) - { -- NSLog( @"FAILED: OCIEnvInit()"); -+ NSLog(@"FAILED: OCIEnvInit()"); - return NO; - } - - if (OCIHandleAlloc((dvoid *)_oci_env, (dvoid *)&_oci_err, (ub4)OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0)) - { -- NSLog( @"FAILED: OCIHandleAlloc() on errhp"); -+ NSLog(@"FAILED: OCIHandleAlloc() on errhp"); - return NO; - } - -@@ -398,7 +403,7 @@ - if (OCILogon(_oci_env, _oci_err, &_oci_ctx, (const OraText*)username, strlen(username), - (const OraText*)password, strlen(password), (const OraText*)database, strlen(database))) - { -- NSLog( @"FAILED: OCILogon(). username = %s password = %s" -+ NSLog(@"FAILED: OCILogon(). username = %s password = %s" - @" database = %s", username, password, database); - return NO; - } -Index: sope-mime/NGImap4/NGImap4Connection.m -=================================================================== ---- sope-mime/NGImap4/NGImap4Connection.m (révision 1545) -+++ sope-mime/NGImap4/NGImap4Connection.m (copie de travail) -@@ -381,7 +381,7 @@ - - if (debugCache) [self logWithFormat:@" no folders cached yet .."]; - -- result = [[self client] list:(onlyFetchInbox ? @"INBOX" : @"*") -+ result = [[self client] list:(onlyFetchInbox ? @"INBOX" : @"") - pattern:@"*"]; - if (![[result valueForKey:@"result"] boolValue]) { - [self errorWithFormat:@"Could not list mailbox hierarchy!"]; -Index: sope-mime/NGImap4/NGImap4ResponseParser.m -=================================================================== ---- sope-mime/NGImap4/NGImap4ResponseParser.m (révision 1545) -+++ sope-mime/NGImap4/NGImap4ResponseParser.m (copie de travail) -@@ -84,6 +84,8 @@ - static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self, - BOOL isBodyStructure); - -+static NSArray *_parseLanguages(); -+ - static NSString *_parseBodyString(NGImap4ResponseParser *self, - BOOL _convertString); - static NSString *_parseBodyDecodeString(NGImap4ResponseParser *self, -@@ -1627,6 +1629,29 @@ - return _parseBodyDecodeString(self, _convertString, NO /* no decode */); - } - -+static NSArray *_parseLanguages(NGImap4ResponseParser *self) { -+ NSMutableArray *languages; -+ NSString *language; -+ -+ languages = [NSMutableArray array]; -+ if (_la(self, 0) == '(') { -+ while (_la(self, 0) != ')') { -+ _consume(self,1); -+ language = _parseBodyString(self, YES); -+ if ([language length]) -+ [languages addObject: language]; -+ } -+ _consume(self,1); -+ } -+ else { -+ language = _parseBodyString(self, YES); -+ if ([language length]) -+ [languages addObject: language]; -+ } -+ -+ return languages; -+} -+ - static NSDictionary *_parseBodyParameterList(NGImap4ResponseParser *self) - { - NSMutableDictionary *list; -@@ -1734,10 +1759,11 @@ - *encoding, *bodysize; - NSDictionary *parameterList; - NSMutableDictionary *dict; -+ NSArray *languages; - - type = [_parseBodyString(self, YES) lowercaseString]; - _consumeIfMatch(self, ' '); -- subtype = _parseBodyString(self, YES); -+ subtype = [_parseBodyString(self, YES) lowercaseString]; - _consumeIfMatch(self, ' '); - parameterList = _parseBodyParameterList(self); - _consumeIfMatch(self, ' '); -@@ -1762,7 +1788,8 @@ - _consumeIfMatch(self, ' '); - [dict setObject:_parseBodyString(self, YES) forKey:@"lines"]; - } -- else if ([type isEqualToString:@"message"]) { -+ else if ([type isEqualToString:@"message"] -+ && [subtype isEqualToString:@"rfc822"]) { - if (_la(self, 0) != ')') { - _consumeIfMatch(self, ' '); - _consumeIfMatch(self, '('); -@@ -1805,14 +1832,9 @@ - forKey: @"disposition"]; - if (_la(self, 0) != ')') { - _consume(self,1); -- if (_la(self, 0) == '(') { -- [dict setObject: _parseBodyParameterList(self) -- forKey: @"language"]; -- } -- else { -- [dict setObject: _parseBodyString(self, YES) -- forKey: @"language"]; -- } -+ languages = _parseLanguages(self); -+ if ([languages count]) -+ [dict setObject: languages forKey: @"languages"]; - if (_la(self, 0) != ')') { - _consume(self,1); - [dict setObject: _parseBodyString(self, YES) -@@ -1829,6 +1851,7 @@ - static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self, - BOOL isBodyStructure) { - NSMutableArray *parts; -+ NSArray *languages; - NSString *kind; - NSMutableDictionary *dict; - -@@ -1854,14 +1877,9 @@ - forKey: @"disposition"]; - if (_la(self, 0) != ')') { - _consume(self,1); -- if (_la(self, 0) == '(') { -- [dict setObject: _parseBodyParameterList(self) -- forKey: @"language"]; -- } -- else { -- [dict setObject: _parseBodyString(self, YES) -- forKey: @"language"]; -- } -+ languages = _parseLanguages(self); -+ if ([languages count]) -+ [dict setObject: languages forKey: @"languages"]; - if (_la(self, 0) != ')') { - _consume(self,1); - [dict setObject: _parseBodyString(self, YES) -Index: sope-mime/NGMime/NGMimeBodyPart.m -=================================================================== ---- sope-mime/NGMime/NGMimeBodyPart.m (révision 1545) -+++ sope-mime/NGMime/NGMimeBodyPart.m (copie de travail) -@@ -31,18 +31,6 @@ - return 2; - } - --static NGMimeType *defaultType = nil; -- --+ (void)initialize { -- static BOOL isInitialized = NO; -- if (!isInitialized) { -- isInitialized = YES; -- -- defaultType = -- [[NGMimeType mimeType:@"text/plain; charset=us-ascii"] retain]; -- } --} -- - + (id)bodyPartWithHeader:(NGHashMap *)_header { - return [[[self alloc] initWithHeader:_header] autorelease]; - } -@@ -156,13 +144,12 @@ - if (!Fields) - Fields = (NGMimeHeaderNames *)[NGMimePartParser headerFieldNames]; - -- - type = [self->header objectForKey:Fields->contentType]; - - if (![type isKindOfClass:[NGMimeType class]]) - type = [NGMimeType mimeType:[type stringValue]]; - -- return (type != nil ? type : (id)defaultType); -+ return type; - } - - - (NSString *)contentId { -Index: sope-mime/NGMime/NGMimeBodyParser.m -=================================================================== ---- sope-mime/NGMime/NGMimeBodyParser.m (révision 1545) -+++ sope-mime/NGMime/NGMimeBodyParser.m (copie de travail) -@@ -67,7 +67,10 @@ - if (_data == nil) return nil; - - ctype = [_part contentType]; -- -+ if (!ctype -+ && [_d respondsToSelector: @selector(parser:contentTypeOfPart:)]) -+ ctype = [_d parser: self contentTypeOfPart: _part]; -+ - if (![ctype isKindOfClass:[NGMimeType class]]) - ctype = [NGMimeType mimeType:[ctype stringValue]]; - -Index: sope-mime/NGMime/NGMimePartParser.h -=================================================================== ---- sope-mime/NGMime/NGMimePartParser.h (révision 1545) -+++ sope-mime/NGMime/NGMimePartParser.h (copie de travail) -@@ -117,6 +117,7 @@ - BOOL parserParseRawBodyDataOfPart:1; - BOOL parserBodyParserForPart:1; - BOOL parserDecodeBodyOfPart:1; -+ BOOL parserContentTypeOfPart:1; - } delegateRespondsTo; - - -@@ -275,6 +276,9 @@ - - (id)parser:(NGMimePartParser *)_parser - bodyParserForPart:(id)_part; - -+- (NGMimeType *)parser:(id)_parser -+ contentTypeOfPart:(id)_part; -+ - @end /* NSObject(NGMimePartParserDelegate) */ - - @interface NSObject(NGMimePartParser) -Index: sope-mime/NGMime/NGMimePartParser.m -=================================================================== ---- sope-mime/NGMime/NGMimePartParser.m (révision 1545) -+++ sope-mime/NGMime/NGMimePartParser.m (copie de travail) -@@ -1091,7 +1091,10 @@ - id bodyParser = nil; - - ctype = [_p contentType]; -- -+ if (!ctype -+ && self->delegateRespondsTo.parserContentTypeOfPart) -+ ctype = [self->delegate parser: self contentTypeOfPart: _p]; -+ - contentType = ([ctype isKindOfClass:[NGMimeType class]]) - ? ctype - : [NGMimeType mimeType:[ctype stringValue]]; -Index: sope-appserver/NGObjWeb/GNUmakefile.postamble -=================================================================== ---- sope-appserver/NGObjWeb/GNUmakefile.postamble (révision 1545) -+++ sope-appserver/NGObjWeb/GNUmakefile.postamble (copie de travail) -@@ -23,14 +23,20 @@ - - # install makefiles - --after-install :: -+after-install :: $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make -+ -+ifneq ($(GNUSTEP_MAKE_VERSION),1.3.0) -+after-install :: $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make -+endif -+ -+$(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make: ngobjweb.make - $(MKDIRS) $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ - $(INSTALL_DATA) ngobjweb.make $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make - --ifneq ($(GNUSTEP_MAKE_VERSION),1.3.0) --after-install :: -+$(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make: woapp-gs.make - $(INSTALL_DATA) woapp-gs.make \ - $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make -+ -+$(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make: wobundle-gs.make - $(INSTALL_DATA) wobundle-gs.make \ - $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make --endif -Index: sope-appserver/NGObjWeb/WOContext.m -=================================================================== ---- sope-appserver/NGObjWeb/WOContext.m (révision 1545) -+++ sope-appserver/NGObjWeb/WOContext.m (copie de travail) -@@ -64,11 +64,13 @@ - static BOOL testNSURLs = NO; - static BOOL newCURLStyle = NO; - static NSString *WOApplicationSuffix = nil; -+static NSURL *redirectURL = nil; - - + (void)initialize { - static BOOL didInit = NO; - NSUserDefaults *ud; - NSString *cn; -+ NSString *url; - - if (didInit) return; - -@@ -91,6 +93,9 @@ - debugCursor = [ud boolForKey:@"WODebugCursor"] ? 1 : 0; - debugComponentAwake = [ud boolForKey:@"WODebugComponentAwake"]; - WOApplicationSuffix = [[ud stringForKey:@"WOApplicationSuffix"] copy]; -+ url = [ud stringForKey:@"WOApplicationRedirectURL"]; -+ if (url != nil) -+ redirectURL = [NSURL URLWithString: url]; - } - - + (id)contextWithRequest:(WORequest *)_r { -@@ -503,6 +508,11 @@ - return nil; - } - -+ if (redirectURL) { -+ // Use URL from user defaults (WOApplicationRedirectURL) -+ return redirectURL; -+ } -+ - if ((serverURL = [rq headerForKey:@"x-webobjects-server-url"]) == nil) { - if ((host = [rq headerForKey:@"host"])) - serverURL = [@"http://" stringByAppendingString:host]; -Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m -=================================================================== ---- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (révision 1545) -+++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (copie de travail) -@@ -216,6 +216,12 @@ - assocCount++; - } - } -+ if (count > 0) { -+ if ((self->isAbsolute = OWGetProperty(_config, @"absolute"))) { -+ count--; -+ assocCount++; -+ } -+ } - - self->rest = _config; - -Index: sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m -=================================================================== ---- sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (révision 1545) -+++ sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (copie de travail) -@@ -40,6 +40,7 @@ - WOAssociation *string; - WOAssociation *target; - WOAssociation *disabled; -+ WOAssociation *isAbsolute; - WOElement *template; - - /* new in WO4: */ -@@ -359,6 +360,7 @@ - { - if ((self = [super initWithName:_name hyperlinkInfo:_info template:_t])) { - self->href = _info->href; -+ self->isAbsolute = _info->isAbsolute; - } - return self; - } -@@ -374,6 +376,9 @@ - // TODO: we need a binding to disable rewriting! - NSRange r; - -+ if ([[self->isAbsolute valueInContext:_ctx] boolValue] == YES) -+ return NO; -+ - r = [_s rangeOfString:@":"]; - if (r.length == 0) - return YES; -Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h -=================================================================== ---- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (révision 1545) -+++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (copie de travail) -@@ -41,7 +41,8 @@ - WOAssociation *pageName; - WOAssociation *actionClass; - WOAssociation *directActionName; -- -+ WOAssociation *isAbsolute; -+ - BOOL sidInUrl; - - /* 'ivar' associations */ -Index: sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m -=================================================================== ---- sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (révision 1545) -+++ sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (copie de travail) -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include - #include "common.h" - - #include -@@ -1016,6 +1017,12 @@ - - (void)parser:(NGMimePartParser *)_parser didParseHeader:(NGHashMap *)_header { - } - -+- (NGMimeType *)parser:(id)_parser -+ contentTypeOfPart:(id)_part -+{ -+ return [NGMimeType mimeType: @"text/plain; charset=utf-8"]; -+} -+ - @end /* WOHttpAdaptor */ - - @implementation WOCoreApplication(SimpleParserSelection)