]> err.no Git - scalable-opengroupware.org/commitdiff
more work on etags and locations
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Thu, 14 Jul 2005 09:05:03 +0000 (09:05 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Thu, 14 Jul 2005 09:05:03 +0000 (09:05 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@743 d1b88da0-ebda-0310-925b-ed51d893ca5b

15 files changed:
SOGo/SoObjects/Appointments/ChangeLog
SOGo/SoObjects/Appointments/SOGoAppointmentFolder.h
SOGo/SoObjects/Appointments/SOGoAppointmentFolder.m
SOGo/SoObjects/Appointments/Version
SOGo/SoObjects/Contacts/ChangeLog
SOGo/SoObjects/Contacts/SOGoContactFolder.h
SOGo/SoObjects/Contacts/SOGoContactFolder.m
SOGo/SoObjects/Contacts/SOGoContactObject.m
SOGo/SoObjects/Contacts/Version
SOGo/SoObjects/SOGo/ChangeLog
SOGo/SoObjects/SOGo/SOGoAppointment.h
SOGo/SoObjects/SOGo/SOGoContentObject.m
SOGo/SoObjects/SOGo/SOGoFolder.h
SOGo/SoObjects/SOGo/SOGoFolder.m
SOGo/SoObjects/SOGo/Version

index 0020203e72a5e1058595e92bbee636902ffc58cd..ef7e4c600a4b77f4155db5e953d4c8da2cce4f13 100644 (file)
@@ -1,3 +1,8 @@
+2005-07-14  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SOGoAppointmentFolder.m: moved +globallyUniqueObjectId method to
+         SOGoFolder.m baseclass (v0.9.42)
+
 2005-07-13  Helge Hess  <helge.hess@opengroupware.org>
 
        * SOGoAppointmentFolder.m: added a method to determine the resource
index 27782d9819f38a64b42a803c545f32598a30631c..853ef0dc12584756ff17f680bc7b932dc374c38a 100644 (file)
@@ -46,8 +46,6 @@
   NSMutableDictionary *uidToFilename;
 }
 
-+ (NSString *)globallyUniqueObjectId;
-
 /* selection */
 
 - (NSArray *)calendarUIDs;
index b01b4a3f82a736c18e7ec9da7b4f1358f89d6d48..3faab10846ff8d40bf18c02356ba8d1d5a5e5259 100644 (file)
@@ -28,8 +28,6 @@
 #include <NGiCal/NGiCal.h>
 #include <NGExtensions/NGCalendarDateRange.h>
 #include "common.h"
-#include <unistd.h>
-#include <stdlib.h>
 
 #if APPLE_Foundation_LIBRARY || NeXT_Foundation_LIBRARY
 @interface NSDate(UsedPrivates)
@@ -62,27 +60,6 @@ static NSTimeZone *MET    = nil;
   MET = [[NSTimeZone timeZoneWithAbbreviation:@"MET"] retain];
 }
 
-+ (NSString *)globallyUniqueObjectId {
-  /*
-    4C08AE1A-A808-11D8-AC5A-000393BBAFF6
-    SOGo-Web-28273-18283-288182
-    printf( "%x", *(int *) &f);
-  */
-  static int   pid = 0;
-  static int   sequence = 0;
-  static float rndm = 0;
-  float f;
-
-  if (pid == 0) { /* break if we fork ;-) */
-      pid = getpid();
-      rndm = random();
-  }
-  sequence++;
-  f = [[NSDate date] timeIntervalSince1970];
-  return [NSString stringWithFormat:@"%0X-%0X-%0X-%0X",
-                  pid, *(int *)&f, sequence++, random];
-}
-
 - (void)dealloc {
   [self->uidToFilename release];
   [super dealloc];
index c492133d14a9cd65f24f1341a5692caa5e8661d2..02257ba2513ebec89166bdf2da670697c6b521bc 100644 (file)
@@ -1,7 +1,8 @@
 # Version file
 
-SUBMINOR_VERSION:=40
+SUBMINOR_VERSION:=42
 
+# v0.9.42 requires libSOGo            v0.9.54
 # v0.9.32 requires libGDLContentStore v4.5.26
 # v0.9.28 requires libNGiCal          v4.5.47
 # v0.9.26 requires libSOGo            v0.9.30
index 1921172238ab621eda26ef607c1b7b21481fa323..43d3b0c148a20f0110696c190ac792c92cc74ef2 100644 (file)
@@ -1,3 +1,8 @@
+2005-07-14  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SOGoContactFolder.m: use +globallyUniqueObjectId method from
+         SOGoFolder.m baseclass (v0.9.12)
+
 2005-07-13  Helge Hess  <helge.hess@opengroupware.org>
 
        * SOGoContactObject.m: hardened against vCard content (v0.9.11)
index e68e7dab1380c2e33a4336eda269f530ae1696c6..4e4e3f66cbc387e02001c06dfdf9a3d6f928b5ca 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __Contacts_SOGoContactFolder_H__
 #define __Contacts_SOGoContactFolder_H__
@@ -41,8 +40,6 @@
 {
 }
 
-+ (NSString *)globallyUniqueObjectId;
-
 /* fetching */
 
 - (NSArray *)fetchCoreInfos;
index 608fcc8690917e0016b772ebad5a22af30effdbc..6bd07b897292c765f0ab3eb21807db4e065b31cd 100644 (file)
 
 @implementation SOGoContactFolder
 
-+ (NSString *)globallyUniqueObjectId {
-  /*
-    4C08AE1A-A808-11D8-AC5A-000393BBAFF6
-    SOGo-Web-28273-18283-288182
-    printf( "%x", *(int *) &f);
-  */
-  static int   pid = 0;
-  static int   sequence = 0;
-  static float rndm = 0;
-  float f;
-
-  if (pid == 0) { /* break if we fork ;-) */
-      pid = getpid();
-      rndm = random();
-  }
-  sequence++;
-  f = [[NSDate date] timeIntervalSince1970];
-  return [NSString stringWithFormat:@"%0X-%0X-%0X-%0X",
-                  pid, *(int *)&f, sequence++, random];
-}
-
-- (void)dealloc {
-  [super dealloc];
-}
-
 /* name lookup */
 
 - (BOOL)isValidContactName:(NSString *)_key {
index 64ae6bd7a59c9f52f5ff62e8196eb4f309fd020b..9092b2a2d5da2327e8219ab77518503a0c4a43ae 100644 (file)
@@ -67,7 +67,7 @@
 
 - (id)valueForKey:(NSString *)_key {
   id value;
-
+  
   if ((value = [[self record] valueForKey:_key]) != nil)
     return value;
 
index f941fe0f8b0b09690a8f5b264aaa661ae6efc1f3..a234750e60f3d911c4d5bc3b17485798cafd32e2 100644 (file)
@@ -1,6 +1,7 @@
 # version file
 
-SUBMINOR_VERSION:=11
+SUBMINOR_VERSION:=12
 
-# v0.9.9 requires libGDLContentStore v4.5.26
-# v0.9.5 requires libNGExtensions    v4.5.136
+# v0.9.12 requires libSOGo            v0.9.54
+# v0.9.9  requires libGDLContentStore v4.5.26
+# v0.9.5  requires libNGExtensions    v4.5.136
index 25d2d2b577573edf152eeffb85e84bab711c7d82..7d9c6413706531b9b6e73b0c402c34bb42c19a74 100644 (file)
@@ -1,5 +1,13 @@
 2005-07-14  Helge Hess  <helge.hess@opengroupware.org>
 
+       * v0.9.54
+       
+       * SOGoContentObject.m: added support for special 'new' key (server will
+         assign a name and add the new location in a special response header)
+       
+       * SOGoFolder.m: added +globallyUniqueObjectId (previously the method
+         was duplicated in each subclass)
+         
        * SOGoContentObject.m: added transactionally save etag-checks in PUT
          (use the etag value as the baseVersion in the content store)
          (v0.9.53)
index dfdd731f9054edfc1a46ae441aa8caa7df2cafb2..278f6e62b4c69714510302f22529543ba6639111 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef        __SOGoAppointment_H_
 #define        __SOGoAppointment_H_
index a520050c46d1b51b779de35de13a86680ad89645..5316413e40400655d1bf0563864a3a11881a5e0a 100644 (file)
@@ -20,6 +20,7 @@
 */
 
 #include "SOGoContentObject.h"
+#include "SOGoFolder.h"
 #include <NGObjWeb/WEClientCapabilities.h>
 #include "common.h"
 #include <GDLContentStore/GCSFolder.h>
@@ -161,13 +162,37 @@ static BOOL kontactGroupDAV = YES;
   WORequest    *rq;
   NSException  *error;
   unsigned int baseVersion;
-  id           etag;
+  id           etag, tmp;
+  BOOL         needsLocation;
   
   if ((error = [self matchesRequestConditionInContext:_ctx]) != nil)
     return error;
   
   rq = [_ctx request];
   
+  /* check whether its a request to the 'special' 'new' location */
+  /*
+    Note: this is kinda hack. The OGo ZideStore detects writes to 'new' as
+          object creations and will assign a server side identifier. Most
+         current GroupDAV clients rely on this behaviour, so we reproduce it
+         here.
+         A correct client would loop until it has a name which doesn't not
+         yet exist (by using if-none-match).
+  */
+  needsLocation = NO;
+  tmp = [[self nameInContainer] stringByDeletingPathExtension];
+  if ([tmp isEqualToString:@"new"]) {
+    tmp = [[[self container] class] globallyUniqueObjectId];
+    needsLocation = YES;
+    
+    [self debugWithFormat:
+           @"reassigned a new location for special new-location: %@", tmp];
+    
+    /* kinda dangerous */
+    ASSIGNCOPY(self->nameInContainer, tmp);
+    ASSIGN(self->ocsPath, nil);
+  }
+  
   /* determine base version from etag in if-match header */
   /*
     Note: The -matchesRequestConditionInContext: already checks whether the
@@ -176,10 +201,11 @@ static BOOL kontactGroupDAV = YES;
          commit.
           (between the check and the update a change could have been done)
   */
-  etag = [rq headerForKey:@"if-match"];
-  etag = [self parseETagList:etag];
-  if ([etag count] > 0) {
-    if ([etag count] > 1) {
+  tmp  = [rq headerForKey:@"if-match"];
+  tmp  = [self parseETagList:tmp];
+  etag = nil;
+  if ([tmp count] > 0) {
+    if ([tmp count] > 1) {
       /*
        Note: we would have to attempt a save for _each_ of the etags being
              passed in! In practice most WebDAV clients submit exactly one
@@ -187,10 +213,10 @@ static BOOL kontactGroupDAV = YES;
       */
       [self warnWithFormat:
              @"Got multiple if-match etags from client, only attempting to "
-             @"save with the first: %@", etag];
+             @"save with the first: %@", tmp];
     }
     
-    etag = [etag objectAtIndex:0];
+    etag = [tmp objectAtIndex:0];
   }
   baseVersion = ([etag length] > 0)
     ? [etag unsignedIntValue]
@@ -202,11 +228,19 @@ static BOOL kontactGroupDAV = YES;
                     baseVersion:baseVersion]) != nil)
     return error;
   
-  // TODO: this should be automatic if we return nil?
+  /* setup response */
+  
+  // TODO: this should be automatic in the SoDispatcher if we return nil?
   [[_ctx response] setStatus:201 /* Created */];
   
   if ((etag = [self davEntityTag]) != nil)
     [[_ctx response] setHeader:etag forKey:@"etag"];
+  
+  if (needsLocation) {
+    [[_ctx response] setHeader:[self baseURLInContext:_ctx] 
+                    forKey:@"location"];
+  }
+  
   return [_ctx response];
 }
 
index f48036e9fd13a3189c6abb12fd909cab2d472ad0..f64d8e11cfde6b7516ad6d0fdfa37b0464c3e383 100644 (file)
@@ -40,6 +40,8 @@
   GCSFolder *ocsFolder;
 }
 
++ (NSString *)globallyUniqueObjectId;
+
 /* accessors */
 
 - (void)setOCSPath:(NSString *)_Path;
index c4a11c08f447030f957bcc2cad65c54655de5fbe..ee96bf3b8e9e8eaf6778a050308bdfdf9611b53d 100644 (file)
@@ -23,6 +23,8 @@
 #include "common.h"
 #include <GDLContentStore/GCSFolderManager.h>
 #include <GDLContentStore/GCSFolder.h>
+#include <unistd.h>
+#include <stdlib.h>
 
 @implementation SOGoFolder
 
             NSStringFromClass([self superclass]), [super version]);
 }
 
++ (NSString *)globallyUniqueObjectId {
+  /*
+    4C08AE1A-A808-11D8-AC5A-000393BBAFF6
+    SOGo-Web-28273-18283-288182
+    printf( "%x", *(int *) &f);
+  */
+  static int   pid = 0;
+  static int   sequence = 0;
+  static float rndm = 0;
+  float f;
+
+  if (pid == 0) { /* break if we fork ;-) */
+    pid = getpid();
+    rndm = random();
+  }
+  sequence++;
+  f = [[NSDate date] timeIntervalSince1970];
+  return [NSString stringWithFormat:@"%0X-%0X-%0X-%0X",
+                  pid, *(int *)&f, sequence++, random];
+}
+
 - (void)dealloc {
   [self->ocsFolder release];
   [self->ocsPath   release];
index 53f7a36009aa38908fc99d587ab1b6e1a4f35cf8..6b46324579b1e2ddda8a68f0657272eab551de45 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=53
+SUBMINOR_VERSION:=54
 
 # v0.9.50 requires libGDLContentStore v4.5.30
 # v0.9.34 requires libGDLContentStore v4.5.26