]> err.no Git - sope/commitdiff
added support for complex davResourceTypes
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Mon, 1 Nov 2004 10:26:36 +0000 (10:26 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Mon, 1 Nov 2004 10:26:36 +0000 (10:26 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@330 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/SoObjects/SoDefaultRenderer.m
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m
sope-core/NGExtensions/NGExtensions/NSString+Ext.h

index 6672cb90aa424f56cb54d880ec3a8efe8ca113db..98c822494ab56f7942cdb4d5502ea70b13ebb350 100644 (file)
@@ -1,3 +1,15 @@
+2004-11-01  Helge Hess  <helge.hess@opengroupware.org>
+
+       * WebDAV/SoWebDAVRenderer.m: added support for multiple resource type
+         tags (v4.3.80)
+
+2004-10-31  Helge Hess  <helge.hess@opengroupware.org>
+
+       * WebDAV/SoWebDAVRenderer.m: preserve etag in response if set (v4.3.79)
+
+       * SoObjects/SoDefaultRenderer.m: fixed typo, check exceptions for 200
+         HTTP codes and do not return them as an error (v4.3.78)
+
 2004-10-27  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * DynamicElements/{WOResetButton.m, WOText.m, WOFileUpload.m,
index 314dbedc0c72c81aff23fd660b2985e3482e488a..9bd1bc7906e9b5d192caf3d477c054a3c22b3cd0 100644 (file)
@@ -96,8 +96,15 @@ static int debugOn = 0;
   if (debugOn)
     [self debugWithFormat:@"    as exception"];
   
-  if ((stat = [_ex httpStatus]) > 0)
+  // TODO: add ability to specify HTTP headers in the user info?
+  
+  if ((stat = [_ex httpStatus]) > 0) {
     [r setStatus:stat];
+    if (stat >= 200 && stat < 300) {
+      [r appendContentString:[_ex reason]];
+      return nil;
+    }
+  }
   else
     [r setStatus:500];
   
@@ -106,7 +113,7 @@ static int debugOn = 0;
        @"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
        @"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
        @"<body>"
-       @"<h3>An error occured during object publishing</h3>"];
+       @"<h3>An error occurred during object publishing</h3>"];
   [r appendContentString:@"<p>"];
   [r appendContentString:[_ex reason]];
   [r appendContentString:@"</p>"];
index 984868a43be3218f07093c91ea3656aa227e1f65..ca086d87fcba17d7089a61794df900f86c54efb4 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=77
+SUBMINOR_VERSION:=80
 
 # v4.3.42  requires libNGExtensions v4.3.116
 # v4.3.40  requires libNGExtensions v4.3.115
index d6f36e8dd2c4a2d84a405a3d100602335b3b974f..1afcb9fe6ae5850bf9004234f56675b56921f4aa 100644 (file)
@@ -144,8 +144,11 @@ static BOOL         formatOutput = NO;
 - (BOOL)renderObjectBodyResult:(id)_object inContext:(WOContext *)_ctx 
   onlyHead:(BOOL)_onlyHead
 {
-  WOResponse *r = [_ctx response];
+  WOResponse *r;
   NSString *tmp;
+  unsigned char buf[128];
+  
+  r = [_ctx response];
   
   /*
     TODO: implement proper etag support. This probably implies that we need
@@ -153,19 +156,21 @@ static BOOL         formatOutput = NO;
          We cannot use davEntityTag on the input parameter, since this is
          usually the plain object.
   */
-  tmp = @"0"; // fallback, cannot use the thing above
-  [r setHeader:tmp forKey:@"ETag"]; // required for WebFolder PUTs
+  if ((tmp = [r headerForKey:@"etag"]) == nil) {
+    tmp = @"0"; // fallback, cannot use the thing above
+    [r setHeader:tmp forKey:@"etag"]; // required for WebFolder PUTs
+  }
   
   if ([_object isKindOfClass:[NSData class]]) {
     [r setHeader:[self mimeTypeForData:_object inContext:_ctx]
        forKey:@"content-type"];
     
-    [r setHeader:[NSString stringWithFormat:@"%d", [_object length]]
-       forKey:@"content-length"];
+    sprintf(buf, "%d", [_object length]);
+    [r setHeader:[NSString stringWithCString:buf] forKey:@"content-length"];
     if (!_onlyHead) [r setContent:_object];
     return YES;
   }
-
+  
   if ([_object isKindOfClass:[NSString class]]) {
     NSData *data;
     
@@ -173,8 +178,8 @@ static BOOL         formatOutput = NO;
        forKey:@"content-type"];
     
     data = [_object dataUsingEncoding:NSUTF8StringEncoding];
-    [r setHeader:[NSString stringWithFormat:@"%d", [data length]]
-       forKey:@"content-length"];
+    sprintf(buf, "%d", [data length]);
+    [r setHeader:[NSString stringWithCString:buf] forKey:@"content-length"];
     [r setContent:data];
     return YES;
   }
@@ -299,6 +304,69 @@ static BOOL         formatOutput = NO;
   return YES;
 }
 
+- (NSString *)stringForResourceType:(id)_value ofProperty:(NSString *)_prop 
+  prefixes:(NSDictionary *)_prefixes
+{
+  NSString *davNS;
+
+  davNS = [_prefixes objectForKey:@"DAV:"];
+  
+  if ([_value isKindOfClass:[NSArray class]]) {
+    /*
+       Use arrays to allow for something like this:
+          <collection/>
+          <C:todos xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+       Item Format:
+         ( TAG )             => tag in DAV: namespace
+         ( TAG, NS )         => tag in NS namespace
+         ( TAG, NS, PREFIX ) => tag in NS namespace with PREFIX
+    */
+    NSMutableString *ms;
+    NSEnumerator *e;
+    id item;
+
+    if ([_value count] == 0)
+      return nil;
+      
+    ms = [NSMutableString stringWithCapacity:16];
+    e  = [_value objectEnumerator];
+    while ((item = [e nextObject]) != nil) {
+      unsigned count;
+
+      if (![item isKindOfClass:[NSArray class]]) {
+       item = [item stringValue];
+       if ([item length] == 0) continue;
+       [ms appendFormat:@"<%@:%@ />", davNS, item];
+       continue;
+      }
+
+      /* process array tags */
+         
+      if ((count = [item count]) == 0)
+       continue;
+         
+      if (count == 1)
+       [ms appendFormat:@"<%@:%@ />", davNS, [item objectAtIndex:0]];
+      else if (count == 2) {
+       /* 0=tag, 1=nsuri */
+       [ms appendFormat:@"<%@ xmlns=\"%@\" />", 
+             [item objectAtIndex:0], [item objectAtIndex:1]];
+      }
+      else {
+       /* 0=tag, 1=nsuri, 2=nsprefix */
+       [ms appendFormat:@"<%@:%@ xmlns:%@=\"%@\" />", 
+             [item objectAtIndex:2], [item objectAtIndex:0],
+             [item objectAtIndex:2], [item objectAtIndex:1]];
+      }
+    }
+    return ms;
+  }
+    
+  _value = [_value stringValue];
+  if ([_value length] == 0) return nil;
+  
+  return [NSString stringWithFormat:@"<%@:%@/>", davNS, _value];
+}
 - (NSString *)stringForValue:(id)_value ofProperty:(NSString *)_prop 
   prefixes:(NSDictionary *)_prefixes
 {
@@ -313,11 +381,8 @@ static BOOL         formatOutput = NO;
   /* special processing for some properties */
   
   if ([_prop isEqualToString:@"{DAV:}resourcetype"]) {
-    _value = [_value stringValue];
-    if ([_value length] == 0) return nil;
-    
-    return [NSString stringWithFormat:@"<%@:%@/>",
-                      [_prefixes objectForKey:@"DAV:"], _value];
+    return [self stringForResourceType:_value ofProperty:_prop
+                prefixes:_prefixes];
   }
   else if ([_prop isEqualToString:@"{DAV:}creationdate"])
     datefmt = @"%Y-%m-%dT%H:%M:%S%zZ";
index f2b877a5a1a2241a4725fed15730d76d07606c4e..50bf3ccbc3f57a22c8d0463766cd345fd4790355 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __NGExtensions_NSString_Ext_H__
 #define __NGExtensions_NSString_Ext_H__