]> err.no Git - scalable-opengroupware.org/commitdiff
moved etag support code to SOGoObject base class
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 20 Jul 2005 14:51:39 +0000 (14:51 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 20 Jul 2005 14:51:39 +0000 (14:51 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@851 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/SoObjects/SOGo/ChangeLog
SOGo/SoObjects/SOGo/SOGoContentObject.h
SOGo/SoObjects/SOGo/SOGoContentObject.m
SOGo/SoObjects/SOGo/SOGoObject.h
SOGo/SoObjects/SOGo/SOGoObject.m
SOGo/SoObjects/SOGo/Version

index abb58241bf6f557a486dff82d04add16de495012..8658cf4683e0483f57d16873579614cb342c8ae0 100644 (file)
@@ -1,3 +1,8 @@
+2005-07-20  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SOGoContentObject.m: moved generic etag checking to SOGoObject (to
+         share implementation with Mailer) (v0.9.65)
+
 2005-07-19  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * AgenorUserManager.m: properly implemented internet/intranet vacation
index 1567063ba92018fc61d77a3e8ba2a32f02277f2d..f4c2efe0ff4e233f2d4e2dcafca7a5adb396677c 100644 (file)
@@ -54,7 +54,6 @@
 /* etag support */
 
 - (id)davEntityTag;
-- (NSException *)matchesRequestConditionInContext:(id)_ctx;
 
 /* message type */
 
index 10ae9f0c1a4c22ec8e28d864aba4a300e68a3de4..193bb9d6f653d367e78fea3c4355f267cb6b2ac3 100644 (file)
@@ -21,7 +21,6 @@
 
 #include "SOGoContentObject.h"
 #include "SOGoFolder.h"
-#include <NGObjWeb/WEClientCapabilities.h>
 #include "common.h"
 #include <GDLContentStore/GCSFolder.h>
 
 
 @implementation SOGoContentObject
 
-static BOOL kontactGroupDAV = YES;
-
-+ (void)initialize {
-  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
-  
-  kontactGroupDAV = 
-    [ud boolForKey:@"SOGoDisableKontact34GroupDAVHack"] ? NO : YES;
-}
+// TODO: check superclass version
 
 - (void)dealloc {
   [self->content release];
@@ -258,118 +250,6 @@ static BOOL kontactGroupDAV = YES;
   return [folder versionOfContentWithName:[self nameInContainer]];
 }
 
-- (NSArray *)parseETagList:(NSString *)_c {
-  NSMutableArray *ma;
-  NSArray  *etags;
-  unsigned i, count;
-  
-  if ([_c length] == 0)
-    return nil;
-  if ([_c isEqualToString:@"*"])
-    return nil;
-  
-  etags = [_c componentsSeparatedByString:@","];
-  count = [etags count];
-  ma    = [NSMutableArray arrayWithCapacity:count];
-  for (i = 0; i < count; i++) {
-    NSString *etag;
-    
-    etag = [[etags objectAtIndex:i] stringByTrimmingSpaces];
-    if ([etag hasPrefix:@"\""] && [etag hasSuffix:@"\""])
-      etag = [etag substringWithRange:NSMakeRange(1, [etag length] - 2)];
-    
-    if (etag != nil) [ma addObject:etag];
-  }
-  return ma;
-}
-
-- (NSException *)checkIfMatchCondition:(NSString *)_c inContext:(id)_ctx {
-  /* only run the request if one of the etags matches the resource etag */
-  NSArray  *etags;
-  NSString *etag;
-  
-  if ([_c isEqualToString:@"*"])
-    /* to ensure that the resource exists! */
-    return nil;
-  
-  if ((etags = [self parseETagList:_c]) == nil)
-    return nil;
-  if ([etags count] == 0) /* no etags to check for? */
-    return nil;
-  
-  etag = [self davEntityTag];
-  if ([etag length] == 0) /* has no etag, ignore */
-    return nil;
-  
-  if ([etags containsObject:etag]) {
-    [self debugWithFormat:@"etag '%@' matches: %@", etag, 
-          [etags componentsJoinedByString:@","]];
-    return nil; /* one etag matches, so continue with request */
-  }
-
-  /* hack for Kontact 3.4 */
-  
-  if (kontactGroupDAV) {
-    WEClientCapabilities *cc;
-    
-    cc = [[(WOContext *)_ctx request] clientCapabilities];
-    if ([[cc userAgentType] isEqualToString:@"Konqueror"]) {
-      if ([cc majorVersion] == 3 && [cc minorVersion] == 4) {
-       [self logWithFormat:
-               @"WARNING: applying Kontact 3.4 GroupDAV hack"
-               @" - etag check is disabled!"
-               @" (can be enabled using 'ZSDisableKontact34GroupDAVHack')"];
-       return nil;
-      }
-    }
-  }
-  
-  // TODO: we might want to return the davEntityTag in the response
-  [self debugWithFormat:@"etag '%@' does not match: %@", etag, 
-       [etags componentsJoinedByString:@","]];
-  return [NSException exceptionWithHTTPStatus:412 /* Precondition Failed */
-                     reason:@"Precondition Failed"];
-}
-
-- (NSException *)checkIfNoneMatchCondition:(NSString *)_c inContext:(id)_ctx {
-  /*
-    If one of the etags is still the same, we can ignore the request.
-    
-    Can be used for PUT to ensure that the object does not exist in the store
-    and for GET to retrieve the content only if if the etag changed.
-  */
-#if 0
-  if ([_c isEqualToString:@"*"])
-    return nil;
-  
-  if ((a = [self parseETagList:_c]) == nil)
-    return nil;
-#else
-  [self logWithFormat:@"TODO: implement if-none-match for etag: '%@'", _c];
-#endif
-  return nil;
-}
-
-- (NSException *)matchesRequestConditionInContext:(id)_ctx {
-  NSException *error;
-  WORequest *rq;
-  NSString  *c;
-  
-  if ((rq = [(WOContext *)_ctx request]) == nil)
-    return nil; /* be tolerant - no request, no condition */
-  
-  if ((c = [rq headerForKey:@"if-match"]) != nil) {
-    if ((error = [self checkIfMatchCondition:c inContext:_ctx]) != nil)
-      return error;
-  }
-  if ((c = [rq headerForKey:@"if-none-match"]) != nil) {
-    if ((error = [self checkIfNoneMatchCondition:c inContext:_ctx]) != nil)
-      return error;
-  }
-  
-  return nil;
-}
-
 /* WebDAV */
 
 - (NSException *)davMoveToTargetObject:(id)_target newName:(NSString *)_name
index f4d18b8fe7547b0d88d2af349399f0ea49b002b9..f04ad5732e8c7c8fa25ab6957d41b94d7cac6a4b 100644 (file)
 - (NSException *)delete;
 - (id)GETAction:(id)_ctx;
 
+/* etag support */
+
+- (NSException *)matchesRequestConditionInContext:(id)_ctx;
+
 /* description */
 
 - (void)appendAttributesToDescription:(NSMutableString *)_ms;
index 77fbf6a586ca3a47e5461aa3d3f2fd8ab06a8239..3bf55bea28bac0050a0ca58d6e902be3a8a251d7 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "SOGoObject.h"
 #include "SOGoUserFolder.h"
+#include <NGObjWeb/WEClientCapabilities.h>
 #include <NGObjWeb/SoObject+SoDAV.h>
 #include "common.h"
 
 
 @implementation SOGoObject
 
+static BOOL kontactGroupDAV = YES;
+
 + (int)version {
   return 0;
 }
 
++ (void)initialize {
+  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
+  
+  kontactGroupDAV = 
+    [ud boolForKey:@"SOGoDisableKontact34GroupDAVHack"] ? NO : YES;
+}
+
 - (BOOL)doesRetainContainer {
   return YES;
 }
   return r;
 }
 
+/* etag support */
+
+- (NSArray *)parseETagList:(NSString *)_c {
+  NSMutableArray *ma;
+  NSArray  *etags;
+  unsigned i, count;
+  
+  if ([_c length] == 0)
+    return nil;
+  if ([_c isEqualToString:@"*"])
+    return nil;
+  
+  etags = [_c componentsSeparatedByString:@","];
+  count = [etags count];
+  ma    = [NSMutableArray arrayWithCapacity:count];
+  for (i = 0; i < count; i++) {
+    NSString *etag;
+    
+    etag = [[etags objectAtIndex:i] stringByTrimmingSpaces];
+    if ([etag hasPrefix:@"\""] && [etag hasSuffix:@"\""])
+      etag = [etag substringWithRange:NSMakeRange(1, [etag length] - 2)];
+    
+    if (etag != nil) [ma addObject:etag];
+  }
+  return ma;
+}
+
+- (NSException *)checkIfMatchCondition:(NSString *)_c inContext:(id)_ctx {
+  /* only run the request if one of the etags matches the resource etag */
+  NSArray  *etags;
+  NSString *etag;
+  
+  if ([_c isEqualToString:@"*"])
+    /* to ensure that the resource exists! */
+    return nil;
+  
+  if ((etags = [self parseETagList:_c]) == nil)
+    return nil;
+  if ([etags count] == 0) /* no etags to check for? */
+    return nil;
+  
+  etag = [self davEntityTag];
+  if ([etag length] == 0) /* has no etag, ignore */
+    return nil;
+  
+  if ([etags containsObject:etag]) {
+    [self debugWithFormat:@"etag '%@' matches: %@", etag, 
+          [etags componentsJoinedByString:@","]];
+    return nil; /* one etag matches, so continue with request */
+  }
+
+  /* hack for Kontact 3.4 */
+  
+  if (kontactGroupDAV) {
+    WEClientCapabilities *cc;
+    
+    cc = [[(WOContext *)_ctx request] clientCapabilities];
+    if ([[cc userAgentType] isEqualToString:@"Konqueror"]) {
+      if ([cc majorVersion] == 3 && [cc minorVersion] == 4) {
+       [self logWithFormat:
+               @"WARNING: applying Kontact 3.4 GroupDAV hack"
+               @" - etag check is disabled!"
+               @" (can be enabled using 'ZSDisableKontact34GroupDAVHack')"];
+       return nil;
+      }
+    }
+  }
+  
+  // TODO: we might want to return the davEntityTag in the response
+  [self debugWithFormat:@"etag '%@' does not match: %@", etag, 
+       [etags componentsJoinedByString:@","]];
+  return [NSException exceptionWithHTTPStatus:412 /* Precondition Failed */
+                     reason:@"Precondition Failed"];
+}
+
+- (NSException *)checkIfNoneMatchCondition:(NSString *)_c inContext:(id)_ctx {
+  /*
+    If one of the etags is still the same, we can ignore the request.
+    
+    Can be used for PUT to ensure that the object does not exist in the store
+    and for GET to retrieve the content only if if the etag changed.
+  */
+#if 0
+  if ([_c isEqualToString:@"*"])
+    return nil;
+  
+  if ((a = [self parseETagList:_c]) == nil)
+    return nil;
+#else
+  [self logWithFormat:@"TODO: implement if-none-match for etag: '%@'", _c];
+#endif
+  return nil;
+}
+
+- (NSException *)matchesRequestConditionInContext:(id)_ctx {
+  NSException *error;
+  WORequest *rq;
+  NSString  *c;
+  
+  if ((rq = [(WOContext *)_ctx request]) == nil)
+    return nil; /* be tolerant - no request, no condition */
+  
+  if ((c = [rq headerForKey:@"if-match"]) != nil) {
+    if ((error = [self checkIfMatchCondition:c inContext:_ctx]) != nil)
+      return error;
+  }
+  if ((c = [rq headerForKey:@"if-none-match"]) != nil) {
+    if ((error = [self checkIfNoneMatchCondition:c inContext:_ctx]) != nil)
+      return error;
+  }
+  
+  return nil;
+}
+
 /* description */
 
 - (void)appendAttributesToDescription:(NSMutableString *)_ms {
index cf0769b0afca827bbea40afd43294c50929c4d24..6313547efb3b2136d87a6e77187c591d4afb71d4 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=64
+SUBMINOR_VERSION:=65
 
 # v0.9.63 requires libNGiCal          v4.5.54
 # v0.9.60 requires libNGiCal          v4.5.49