]> err.no Git - sope/commitdiff
fixed WebDAV URL handling on MacOSX
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Fri, 8 Oct 2004 12:26:57 +0000 (12:26 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Fri, 8 Oct 2004 12:26:57 +0000 (12:26 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@231 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/NGObjWeb/WEClientCapabilities.h
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WEClientCapabilities.m
sope-appserver/NGObjWeb/WebDAV/SoObjectDataSource.m
sope-appserver/NGObjWeb/WebDAV/SoObjectResultEntry.h
sope-appserver/NGObjWeb/WebDAV/SoObjectResultEntry.m
sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m

index e4e2cd6fec2870216ca5a8a0f895c9a3376b6c70..546a80623ccfbcb43e60de4ac7f6ff54c1d2b78e 100644 (file)
@@ -1,3 +1,17 @@
+2004-10-08  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v4.3.55
+
+       * WebDAV/SoObjectResultEntry.m, WebDAV/SoWebDAVRenderer.m: improved
+         debugging and error detection facilities
+
+       * WebDAV/SoObjectDataSource.m: fixed URL construction on Cocoa
+         Foundation (you cannot use NSPathUtilities to work on URLs with that
+         Foundation)
+
+       * WEClientCapabilities.m: added Goliath as a known (WebDAV) user agent,
+         added -isRSSClient method
+
 2004-10-07  Helge Hess  <helge.hess@opengroupware.org>
 
        * v4.3.54
index a5905d4f2b2e97fc521512eba6b0cdd51255bf0e..38c83197653a91784d4906210415417fd7748c9f 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __WEExtensions_WEClientCapabilities_H__
 #define __WEExtensions_WEClientCapabilities_H__
@@ -67,6 +66,7 @@
 - (BOOL)isDAVClient;
 - (BOOL)isXmlRpcClient;
 - (BOOL)isBLogClient;
+- (BOOL)isRSSClient;
 
 - (BOOL)doesSupportCSSOverflow;
 - (BOOL)doesSupportDHTMLDragAndDrop;
index f96f5d3038c9ace6b08aaa945362cae3ebc645e8..178036b284ce6d9daa1af4544742313162fb38b2 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=54
+SUBMINOR_VERSION:=55
 
 # v4.3.42  requires libNGExtensions v4.3.116
 # v4.3.40  requires libNGExtensions v4.3.115
index f61e82856d8040dfef6dd9cd81bebe42c4a0a21f..6c5b45ccca5fb1a12d73bc42e2bb47a88f8d5d1c 100644 (file)
@@ -67,6 +67,7 @@
 #define WEUA_SOPE             37
 #define WEUA_Ecto             38
 #define WEUA_NewsFire         39
+#define WEUA_Goliath          40
 
 #define WEOS_UNKNOWN   0
 #define WEOS_WINDOWS   1
   else if (strstr(ua, "NewsFire")) {
     self->browser = WEUA_NewsFire;
   }
+  else if (strstr(ua, "Goliath")) {
+    self->browser = WEUA_Goliath;
+  }
   else if (strstr(ua, "SOPE/")) {
     self->browser = WEUA_SOPE;
   }
     case WEUA_KungLog:          return @"KungLog";
     case WEUA_Ecto:             return @"Ecto";
     case WEUA_NewsFire:         return @"NewsFire";
+    case WEUA_Goliath:          return @"Goliath";
     default:                    return @"unknown";
   }
 }
   if (self->browser == WEUA_ZideLook)         return YES;
   if (self->browser == WEUA_Entourage)        return YES;
   if (self->browser == WEUA_Morgul)           return YES;
+  if (self->browser == WEUA_Goliath)          return YES;
   return NO;
 }
 
   if (self->browser == WEUA_Ecto)    return YES;
   return NO;
 }
+- (BOOL)isRSSClient {
+  if (self->browser == WEUA_NetNewsWire) return YES;
+  if (self->browser == WEUA_NewsFire)    return YES;
+  return NO;
+}
 
 - (BOOL)doesSupportCSSOverflow {
   if (![self isCSS1Browser])
@@ -1024,4 +1035,7 @@ static NSString *WEClientDetectorFormName = @"WEClientDetect";
 
   NewsFire
     'NewsFire/0.23'
+  
+  Goliath
+    'Goliath/1.0.1 (Macintosh-Carbon; PPC)'
 */
index 6469f89c4bd224311586df61029f2cc9a00f984e..ba75731373a6a013aebd75f2f7b0d4d0ac982f1f 100644 (file)
 static BOOL debugOn = NO;
 
 + (void)initialize {
-  debugOn = [[NSUserDefaults standardUserDefaults]
-                            boolForKey:@"SoObjectDataSourceDebugEnabled"];
+  NSUserDefaults *ud;
+  
+  ud = [NSUserDefaults standardUserDefaults];
+  debugOn = [ud boolForKey:@"SoObjectDataSourceDebugEnabled"];
 }
 
 - (id)initWithObject:(id)_object inContext:(id)_ctx {
@@ -95,6 +97,7 @@ static BOOL debugOn = NO;
   NSArray      *queriedAttrNames;
   NSArray      *orderings;
   NSString     *childKey;
+  NSString     *tmp;
   BOOL         isBrief = YES; // do not encode "sub-errors", just omit the item
   
   [self debugWithFormat:@"performing flat query: %@", _fs];
@@ -131,7 +134,8 @@ static BOOL debugOn = NO;
       if (isBrief) // when the brief header is set, forget errors
        e = nil;
     }
-    else if ((child = [self->object lookupName:childKey inContext:_ctx acquire:NO])==nil) {
+    else if ((child = [self->object lookupName:childKey inContext:_ctx 
+                          acquire:NO])==nil) {
       /* not found */
       [self debugWithFormat:@"  did not find key '%@'", childKey];
        
@@ -176,9 +180,26 @@ static BOOL debugOn = NO;
     }
       
     /* calc URI */
-      
+    
+    /* 
+       Note: we cannot use NSPathUtilities, those will reformat the string on
+             Cocoa Foundation! (eg http://a => http:/a, remove double slashes)
+    */
     childHref = [childKey stringByEscapingURL];
-    childHref = [[_fs entityName] stringByAppendingPathComponent:childHref];
+    tmp = [_fs entityName];
+    if (![tmp hasSuffix:@"/"]) 
+      tmp = [tmp stringByAppendingString:@"/"];
+    childHref = [tmp stringByAppendingString:childHref];
+    
+    if (debugOn) {
+      // TODO: this happens if we access using Goliath
+      if ([childHref hasPrefix:@"http:/"] && 
+         ![childHref hasPrefix:@"http://"]) {
+       [self logWithFormat:@"BROKEN CHILD URL: %@ (entity=%@,key=%@)", 
+             childHref, [_fs entityName], childKey];
+       abort();
+      }
+    }
     
     /* add errors if required */
     
index 1ed98fc591180f47bae74c869c2424a9da220cf4..04b5f6bcfe25c7b86e6b5e6a436fa416c37f29e6 100644 (file)
@@ -1,7 +1,7 @@
 /*
-  Copyright (C) 2000-2003 SKYRIX Software AG
+  Copyright (C) 2002-2004 SKYRIX Software AG
 
-  This file is part of OGo
+  This file is part of OpenGroupware.org.
 
   OGo is free software; you can redistribute it and/or modify it under
   the terms of the GNU Lesser General Public License as published by the
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __WebDAV_SoObjectResultEntry_H__
 #define __WebDAV_SoObjectResultEntry_H__
index 05b5ff2a503f87c9c5d6e47f2b9b7f93a618f990..de7850b674a599c8832d14a0781e6624d6ca1c36 100644 (file)
@@ -1,7 +1,7 @@
 /*
-  Copyright (C) 2000-2003 SKYRIX Software AG
+  Copyright (C) 2000-2004 SKYRIX Software AG
 
-  This file is part of OGo
+  This file is part of OpenGroupware.org.
 
   OGo is free software; you can redistribute it and/or modify it under
   the terms of the GNU Lesser General Public License as published by the
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "SoObjectResultEntry.h"
 #include "common.h"
 
 @implementation SoObjectResultEntry
 
+static BOOL debugOn = NO;
+
 - (id)initWithURI:(NSString *)_href object:(id)_o values:(NSDictionary *)_d {
-  self->href   = [_href copy];
-  self->values = [_d retain];
-  self->object = [_o retain];
+  if ((self = [super init])) {
+    if (debugOn) {
+      // TODO: this happens if we access using Goliath
+      if ([_href hasPrefix:@"http:/"] && ![_href hasPrefix:@"http://"]) {
+       [self logWithFormat:@"BROKEN URL: %@", _href];
+       [self release];
+       abort();
+       return nil;
+      }
+    }
+    
+    self->href   = [_href copy];
+    self->values = [_d retain];
+    self->object = [_o retain];
+  }
   return self;
 }
+- (id)init {
+  return [self initWithURI:nil object:nil values:nil];
+}
 
 - (void)dealloc {
   [self->href   release];
 - (id)valueForKey:(NSString *)_key {
   if ([_key isEqualToString:@"{DAV:}href"])
     return self->href;
-  else if ([_key isEqualToString:@"{DAV:}status"])
+  
+  if ([_key isEqualToString:@"{DAV:}status"])
     return nil;
-  else {
-#if 1
+  
+  if (!debugOn)
     return [self->values objectForKey:_key];
-#else
+  
+  {
     id v = [self->values objectForKey:_key];
     [self logWithFormat:@"key %@: %@", _key, v];
     return v;
-#endif
   }
 }
 
index 5fc01c2d02a14dc2461efcc9765d03249b836249..d6f36e8dd2c4a2d84a405a3d100602335b3b974f 100644 (file)
@@ -374,8 +374,19 @@ static BOOL         formatOutput = NO;
   return baseURL;
 }
 
-- (NSString *)tidyHref:(id)href baseURL:(id)baseURL {
-  href = [href stringValue];
+- (NSString *)tidyHref:(id)_href baseURL:(id)baseURL {
+  NSString *href;
+  
+  href = [_href stringValue];
+  
+  if (debugOn) {
+    // TODO: this happens if we access using Goliath
+    if ([href hasPrefix:@"http:/"] && ![href hasPrefix:@"http://"]) {
+      [self logWithFormat:@"BROKEN URL: %@", _href];
+      return nil;
+    }
+  }
+  
   if (href == nil) {
     if (debugOn) {
       [self logWithFormat:
@@ -436,7 +447,7 @@ static BOOL         formatOutput = NO;
   /* we do not map these DAV properties because they are very special */
   if (!_namesOnly) {
     if ((href = [entry valueForKey:@"{DAV:}href"]) == nil) {
-      if ((key = [_propMap objectForKey:@"{DAV:}href"])) {
+      if ((key = [_propMap objectForKey:@"{DAV:}href"]) != nil) {
         if ((href = [entry valueForKey:key]) == nil) {
           if (debugOn) {
             [self debugWithFormat:
@@ -475,7 +486,7 @@ static BOOL         formatOutput = NO;
   [r appendContentString:@"<D:response>"];
   if (formatOutput) [r appendContentCharacter:'\n'];
   
-  if (href) {
+  if ([href isNotNull]) {
     [r appendContentString:@"<D:href>"];
     /*
       TODO: need to find out what is appropriate! While Cadaver and ZideLook
@@ -493,7 +504,11 @@ static BOOL         formatOutput = NO;
     [r appendContentString:@"</D:href>"];
     if (formatOutput) [r appendContentCharacter:'\n'];
   }
-      
+  else {
+    [self logWithFormat:
+           @"WARNING: WebDAV result entry has no valid href: %@", entry];
+  }
+  
   [r appendContentString:@"<D:propstat>"];
   if (stat) {
     [r appendContentString:@"<D:status>"];