+2008-04-23 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+
+ * SoObjects/SOGo/SOGoObject.m ([SOGoObject +initialize]): the
+ module is now a framework and we now load the new DAVReportMap
+ description file.
+ ([-davOwner]): the principal URL is now based on the DAV
+ application URL.
+ ([SOGoObject
+ -lookupName:lookupNameinContext:localContextacquire:acquire]): we
+ now lookup report methods from here (code from SOGoFolder). The
+ method has changed to refer to the new DAVReportMAP description
+ file in order to resolve the lookups on self.
+ ([SOGoObject -davSupportedReportSet]): implemented the new
+ "supported-report-set" dav method, based on the new mechanism
+ described above.
+
+ * SoObjects/SOGo/SOGoFolder.m: REPORT lookups are now done
+ directly from SOGoObject.
+
+ * SoObjects/SOGo/SOGoUser.m ([SOGoUser
+ -initWithLogin:newLoginroles:newRoles]): we make sure realUID is
+ not an empty string.
+
+ * SoObjects/SOGo/SOGoUserFolder.m ([SOGoUserFolder
+ -davResourceType]): we declare self as a "principal".
+
+ * SoObjects/SOGo/SOGoContentObject.m ([SOGoContentObject
+ -davContentLength]): the content length should is now based on the
+ UTF-8 encoding.
+
2008-04-22 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/Scheduler/UIxCalendarSelector.m ([UIxCalendarSelector
-I.. -DSOGO_BUILD_DATE="@\"$(BUILD_DATE)\""
ADDITIONAL_LIB_DIRS += \
- -L../SoObjects/SOGo/$(GNUSTEP_OBJ_DIR)/ \
+ -L../SoObjects/SOGo/SOGo.framework \
-L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/
libOGoContentStore_HEADER_FILES_DIR = .
libOGoContentStore_HEADER_FILES_INSTALL_DIR = /OGoContentStore
libOGoContentStore_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)
-libOGoContentStore_INSTALL_DIR=$(SOGO_SYSLIBDIR)
ADDITIONAL_INCLUDE_DIRS += -I../SOPE
ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj
libGDLContentStore_PCH_FILE = common.h
libGDLContentStore_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)
-libGDLContentStore_INSTALL_DIR=$(SOGO_SYSLIBDIR)
libGDLContentStore_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION)
TOOL_NAME = gcs_ls gcs_mkdir gcs_cat gcs_recreatequick gcs_gensql
libNGCards_HEADER_FILES_DIR = .
libNGCards_HEADER_FILES_INSTALL_DIR = /NGCards
libNGCards_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)
-libNGCards_INSTALL_DIR=$(SOGO_SYSLIBDIR)
libNGCards_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION)
libNGCards_HEADER_FILES = \
--- /dev/null
+{ /* -*-java-*- */
+ /* CalDAV */
+ "{urn:ietf:params:xml:ns:caldav}calendar-query" = davCalendarQuery;
+ "{urn:ietf:params:xml:ns:caldav}calendar-multiget" = davCalendarMultiget;
+
+ /* CardDAV */
+ "{urn:ietf:params:xml:ns:carddav}addressbook-query" = davAddressbookQuery;
+ "{urn:ietf:params:xml:ns:carddav}addressbook-multiget"
+ = davAddressbookMultiget;
+ "{urn:ietf:params:xml:ns:carddav}supported-collation-set"
+ = davSupportedCollectionSet;
+
+ /* Inverse DAV */
+ "{urn:inverse:params:xml:ns:inverse-dav}collection-query"
+ = davCollectionQuery;
+ "{urn:inverse:params:xml:ns:inverse-dav}acl-query" = davAclQuery;
+}
-include ../../Version
-include ./Version
-LIBRARY_NAME = libSOGo
+FRAMEWORK_NAME = SOGo
+
+SOGo_INSTALL_DIR = $(SOGO_LIBDIR)
TOOL_NAME = \
# agenor_email2uid \
# agenor_emails4uid \
# agenor_defaults
-libSOGo_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)
-libSOGo_INSTALL_DIR=$(SOGO_SYSLIBDIR)
-
-libSOGo_HEADER_FILES_DIR = .
-libSOGo_HEADER_FILES_INSTALL_DIR = /SOGo
+SOGo_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)
-libSOGo_HEADER_FILES = \
+SOGo_HEADER_FILES = \
SOGoCache.h \
SOGoObject.h \
SOGoContentObject.h \
\
WORequest+SOGo.h
-libSOGo_OBJC_FILES = \
+SOGo_OBJC_FILES = \
SOGoCache.m \
SOGoObject.m \
SOGoContentObject.m \
\
WORequest+SOGo.m
+SOGo_RESOURCE_FILES = \
+ DAVReportMap.plist
+
# tools
agenor_email2uid_OBJC_FILES += agenor_email2uid.m
ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/
-include GNUmakefile.preamble
-include ../common.make
ifneq ($(FHS_INSTALL_ROOT),)
GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include
endif
-include $(GNUSTEP_MAKEFILES)/library.make
+include $(GNUSTEP_MAKEFILES)/framework.make
include $(GNUSTEP_MAKEFILES)/tool.make
-include GNUmakefile.postamble
# compilation settings
-libSOGo_INCLUDE_DIRS += -I.. -I../../..
+SOGo_INCLUDE_DIRS += -I.. -I../.. -DSOGO_MAJOR_VERSION="\"$(MAJOR_VERSION)\"" -DSOGO_MINOR_VERSION="\"$(MINOR_VERSION)\""
-SYSTEM_LIB_DIR += -L/usr/local/lib
-
-libSOGo_LIBRARIES_DEPEND_UPON += \
+SOGo_LIBRARIES_DEPEND_UPON += \
-lOGoContentStore \
-lGDLAccess \
-lNGObjWeb \
content = [record objectForKey: @"c_content"];
return [NSString stringWithFormat: @"%u",
- [content lengthOfBytesUsingEncoding: NSISOLatin1StringEncoding]];
+ [content lengthOfBytesUsingEncoding: NSUTF8StringEncoding]];
}
- (NSException *) davMoveToTargetObject: (id) _target
#import <Foundation/NSString.h>
#import <Foundation/NSURL.h>
-#import <NGObjWeb/SoSelectorInvocation.h>
-
#import <SaxObjC/XMLNamespaces.h>
#import "NSString+Utilities.h"
return nil;
}
-- (id) lookupName: (NSString *) lookupName
- inContext: (id) localContext
- acquire: (BOOL) acquire
-{
- id obj;
- NSArray *davNamespaces;
- NSDictionary *davInvocation;
- NSString *objcMethod;
-
- obj = [super lookupName: lookupName inContext: localContext
- acquire: acquire];
- if (!obj)
- {
- davNamespaces = [self davNamespaces];
- if ([davNamespaces count] > 0)
- {
- davInvocation = [lookupName asDavInvocation];
- if (davInvocation
- && [davNamespaces
- containsObject: [davInvocation objectForKey: @"ns"]])
- {
- objcMethod = [[davInvocation objectForKey: @"method"]
- davMethodToObjC];
- obj = [[SoSelectorInvocation alloc]
- initWithSelectorNamed:
- [NSString stringWithFormat: @"%@:", objcMethod]
- addContextParameter: YES];
- [obj autorelease];
- }
- }
- }
-
- return obj;
-}
-
#warning we should remove this method
- (NSArray *) toOneRelationshipKeys
{
#import <Foundation/NSBundle.h>
#import <Foundation/NSClassDescription.h>
+#import <Foundation/NSFileManager.h>
+#import <Foundation/NSPathUtilities.h>
#import <Foundation/NSString.h>
#import <Foundation/NSUserDefaults.h>
#import <Foundation/NSURL.h>
#import <NGObjWeb/SoClass.h>
#import <NGObjWeb/SoClassSecurityInfo.h>
#import <NGObjWeb/SoObject+SoDAV.h>
+#import <NGObjWeb/SoSelectorInvocation.h>
+#import <NGObjWeb/SoWebDAVValue.h>
#import <NGObjWeb/WEClientCapabilities.h>
#import <NGObjWeb/WOApplication.h>
#import <NGObjWeb/WOContext.h>
#import "NSArray+Utilities.h"
#import "NSCalendarDate+SOGo.h"
#import "NSDictionary+Utilities.h"
+#import "NSObject+Utilities.h"
#import "NSString+Utilities.h"
#import "SOGoCache.h"
#import "SOGoDAVAuthenticator.h"
static BOOL kontactGroupDAV = YES;
static BOOL sendACLAdvisories = NO;
+static NSDictionary *reportMap = nil;
+
@interface SOGoObject(Content)
- (NSString *) contentAsString;
@end
@implementation SOGoObject
++ (void) _loadReportMap
+{
+ NSFileManager *fm;
+ NSEnumerator *paths;
+ NSString *currentPath, *filename;
+
+ [self logWithFormat: @"Loading DAV REPORT map:"];
+
+ fm = [NSFileManager defaultManager];
+ paths = [NSStandardLibraryPaths() objectEnumerator];
+ while (!reportMap && (currentPath = [paths nextObject]))
+ {
+ filename = [NSString stringWithFormat: @"%@/SOGo-%s.%s/SOGo.framework"
+ @"/Resources/DAVReportMap.plist",
+ currentPath,
+ SOGO_MAJOR_VERSION, SOGO_MINOR_VERSION];
+ [self logWithFormat: @" %@", filename];
+ if ([fm fileExistsAtPath: filename])
+ {
+ reportMap = [[NSDictionary alloc] initWithContentsOfFile: filename];
+ [self logWithFormat: @"found!"];
+ }
+ }
+}
+
+ (void) initialize
{
NSUserDefaults *ud;
kontactGroupDAV = ![ud boolForKey:@"SOGoDisableKontact34GroupDAVHack"];
sendACLAdvisories = [ud boolForKey: @"SOGoACLsSendEMailNotifications"];
+ if (!reportMap)
+ [self _loadReportMap];
// SoClass security declarations
// require View permission to access the root (bound to authenticated ...)
/* DAV ACL properties */
- (NSString *) davOwner
{
- return [NSString stringWithFormat: @"%@users/%@",
- [self rootURLInContext: context],
+ return [NSString stringWithFormat: @"%@%@",
+ [WOApplication davURL],
[self ownerInContext: nil]];
}
return ma;
}
+- (NSString *) _reportSelector: (NSString *) reportName
+{
+ NSString *methodName, *objcMethod, *resultName;
+ SEL reportSel;
+
+ resultName = nil;
+
+ methodName = [reportMap objectForKey: reportName];
+ if (methodName)
+ {
+ objcMethod = [NSString stringWithFormat: @"%@:", methodName];
+ reportSel = NSSelectorFromString (objcMethod);
+ if ([self respondsToSelector: reportSel])
+ resultName = objcMethod;
+ }
+
+ return resultName;
+}
+
- (id) lookupName: (NSString *) lookupName
inContext: (id) localContext
acquire: (BOOL) acquire
{
id obj;
SOGoCache *cache;
+ NSString *objcMethod;
cache = [SOGoCache sharedCache];
obj = [cache objectNamed: lookupName inContainer: self];
{
obj = [[self soClass] lookupKey: lookupName inContext: localContext];
if (obj)
+ [obj bindToObject: self inContext: localContext];
+ else
{
- [obj bindToObject: self inContext: localContext];
- [cache registerObject: obj withName: lookupName inContainer: self];
+ objcMethod = [self _reportSelector: lookupName];
+ if (objcMethod)
+ {
+ obj = [[SoSelectorInvocation alloc]
+ initWithSelectorNamed: objcMethod
+ addContextParameter: YES];
+ [obj autorelease];
+ }
}
+
+ if (obj)
+ [cache registerObject: obj withName: lookupName inContainer: self];
}
return obj;
- (id) DELETEAction: (id) _ctx
{
- NSException *error;
+ id result;
- if ((error = [self delete]) != nil)
- return error;
-
+ result = [self delete];
/* Note: returning 'nil' breaks in SoObjectRequestHandler */
- return [NSNumber numberWithBool:YES]; /* delete worked out ... */
+ if (!result)
+ result = [NSNumber numberWithBool: YES]; /* delete worked out ... */
+
+ return result;
}
- (BOOL) isFolderish
if ([content length])
{
[r setStatus: 207];
- [r setHeader: @"text/xml; charset=\"utf-8\"" forKey: @"content-type"];
- [r appendContentString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"];
+ [r setHeader: @"application/xml; charset=\"utf-8\""
+ forKey: @"content-type"];
+ [r appendContentString:
+ @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"];
[r appendContentString: content];
}
else
return exception;
}
+- (NSArray *) davSupportedReportSet
+{
+ NSEnumerator *reportKeys;
+ NSMutableArray *reportSet;
+ NSString *currentKey, *currentValue;
+
+ reportSet = [NSMutableArray array];
+
+ reportKeys = [[reportMap allKeys] objectEnumerator];
+ while ((currentKey = [reportKeys nextObject]))
+ if ([self _reportSelector: currentKey])
+ {
+ currentValue = [[currentKey asDavInvocation]
+ keysWithFormat: @"<%{method} xmlns=\"%{ns}\"/>"];
+ [reportSet addObject: [SoWebDAVValue valueForObject: currentValue
+ attributes: nil]];
+ }
+
+ return [SOGoDAVSet davSetWithArray: reportSet ofValuesTaggedAs: @"report"];
+}
+
@end /* SOGoObject */
objectForKey: @"c_uid"];
}
- if (realUID)
+ if ([realUID length])
self = [super initWithLogin: realUID roles: newRoles];
else
{
return results;
}
+- (NSArray *) davResourceType
+{
+ NSMutableArray *rType;
+
+ rType = [NSMutableArray arrayWithArray: [super davResourceType]];
+ [rType addObject: @"principal"];
+
+ return rType;
+}
+
- (NSString *) _baseDAVURLWithSuffix: (NSString *) suffix
{
NSURL *prefixURL;
libSOGoUI_HEADER_FILES_DIR = .
libSOGoUI_HEADER_FILES_INSTALL_DIR = /SOGoUI
libSOGoUI_INTERFACE_VERSION = $(MAJOR_VERSION).$(MINOR_VERSION)
-libSOGoUI_INSTALL_DIR=$(SOGO_SYSLIBDIR)
libSOGoUI_HEADER_FILES += \
\