]> err.no Git - sope/commitdiff
work on REPORT
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sun, 4 Jun 2006 14:11:28 +0000 (14:11 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sun, 4 Jun 2006 14:11:28 +0000 (14:11 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1267 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/SoObjects/SoActionInvocation.m
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WebDAV/SoObjectWebDAVDispatcher.m

index 49f4bae639bc9a251831095f3d3491076eff9283..438bac41352e9f89d001e4403150088443d3f40b 100644 (file)
@@ -1,3 +1,9 @@
+2006-06-04  Helge Hess  <helge.hess@opengroupware.org>
+
+       * WebDAV/SoWebDAVDispatcher.m: added some basic REPORT support, allows
+         mapping of the top-level report XML element name to a SoMethod
+         (v4.5.234)
+
 2006-05-20  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * DynamicElements/WOForm.api: added wosid parameter. There probably
index 25ea8a74b83804ee823eb0d5d12e570bd692ff7d..01f01c38431cc6a79fc863c97d96d4acaf177fec 100644 (file)
@@ -119,7 +119,7 @@ static int debugOn = 0;
     qppath = [_spec valueForKey:key];
     value  = [qppath isNotNull] ? [soapEnvelope lookupQueryPath:qppath] : nil;
     
-    [args setObject:(value != nil ? value : [NSNull null]) forKey:key];
+    [args setObject:(value != nil ? value : (id)[NSNull null]) forKey:key];
   }
   return args;
 }
@@ -130,6 +130,8 @@ static int debugOn = 0;
 {
   if ([_type isEqualToString:@"SOAP"])
     return [self extractSOAPArgumentsFromContext:_ctx specification:_spec];
+
+  // TODO: would be cool to have that for REPORTs as well
   
   [self errorWithFormat:
           @"cannot extract parameters for request type: '%@'", _type];
index 9ae0437d08c0372561a609586e4701867663a48c..65ce298d0f348c6fe7ebf128765882e529dc7c2c 100644 (file)
@@ -1,7 +1,8 @@
 # version file
 
-SUBMINOR_VERSION:=233
+SUBMINOR_VERSION:=234
 
+# v4.5.234 requires libDOM          v4.5.21
 # v4.5.214 requires libNGExtensions v4.5.179
 # v4.5.122 requires libNGExtensions v4.5.153
 # v4.5.91  requires libNGExtensions v4.5.134
index 22d47d72acbe2c49efa5e52133cc1db8dbc3c214..92b3dc9a9acde7726b17ced1e14a753b32d6339a 100644 (file)
@@ -39,6 +39,7 @@
 #include <NGObjWeb/WEClientCapabilities.h>
 #include <SaxObjC/SaxObjC.h>
 #include <SaxObjC/XMLNamespaces.h>
+#include <DOM/DOMDocument.h>
 #include <NGExtensions/NSString+Ext.h>
 #include "common.h"
 
@@ -104,7 +105,7 @@ static NSTimeZone                *gmt      = nil;
   ui = [NSDictionary dictionaryWithObjectsAndKeys:
                       self, @"dispatcher",
                       [NSNumber numberWithInt:_status], @"http-status",
-                      nil];
+                    nil];
   return [NSException exceptionWithName:
                        [NSString stringWithFormat:@"HTTP%i", _status]
                      reason:_reason
@@ -1509,8 +1510,10 @@ static NSTimeZone                *gmt      = nil;
 /* DAV reports */
 
 - (id)doREPORT:(WOContext *)_ctx {
+  id<DOMDocument> domDocument;
   WORequest *rq;
-  id domDocument;
+  NSString  *mname;
+  id method, resultObject;
   
   rq = [_ctx request];
   
@@ -1528,12 +1531,58 @@ static NSTimeZone                *gmt      = nil;
                 reason:@"Could not parse XML of WebDAV REPORT."];
   }
   
-  /* process DOM */
+  /* first try to lookup method with fully qualified name */
+  
+  mname  = [NSString stringWithFormat:@"{%@}%@",
+                      [[domDocument documentElement] namespaceURI],
+                      [[domDocument documentElement] localName]];
+  method = [self->object lookupName:mname inContext:_ctx acquire:NO];
+  
+  if (method == nil || [method isKindOfClass:[NSException class]]) {
+    /* then try to lookup by simplified name */
+    id m2;
+    
+    m2 = [self->object lookupName:[[domDocument documentElement] localName]
+                      inContext:_ctx acquire:NO];
+    if (m2 == nil)
+      ; /* failed */
+    else if ([m2 isKindOfClass:[NSException class]]) {
+      if (method == nil)
+       method = m2; /* use the second exceptions */
+    }
+    else {
+      method = m2;
+      mname  = [[domDocument documentElement] localName];
+    }
+  }
+  
+  // TODO: what I would really like to have here is a pluggable dispatcher
+  //       mechanism which translates the report payload into a customized
+  //       method call.
+  
+  /* check for lookup errors */
+  
+  if (method == nil || [method isKindOfClass:[NSException class]]) {
+    [self logWithFormat:@"did not find a method to server the REPORT"];
+    return [NSException exceptionWithHTTPStatus:501 /* not implemented */
+                       reason:@"did not find the specified REPORT"];
+  }
+  else if ([method isKindOfClass:[NSException class]]) {
+    [self logWithFormat:@"failed to lookup the REPORT: %@", method];
+    return method;
+  }
+  else if (![method isCallable]) {
+    [self warnWithFormat:
+            @"object found for REPORT '%@' is not callable: %@",
+            mname, method];
+  }
+  [self debugWithFormat:@"REPORT method: %@", method];
 
-  [self logWithFormat:@"TODO: process REPORT: %@", domDocument];
+  /* perform call */
   
-  return [self httpException:405 /* method not allowed */
-              reason:@"WebDAV reports not yet implemented."];
+  resultObject = [method callOnObject:[_ctx clientObject] inContext:_ctx];
+  if (debugOn) [self debugWithFormat:@"got REPORT result: %@", resultObject];
+  return resultObject;
 }
 
 /* CalDAV */