see ChangeLog

Monotone-Revision: 9054022ef1ca8aeba6e34842d27d9b94ce002b89

Monotone-Author: dev-unix.inverse.qc.ca
Monotone-Date: 2006-06-15T19:34:10
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
dev-unix.inverse.qc.ca
2006-06-15 19:34:10 +00:00
commit f18c764ffa
965 changed files with 99196 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
2005-07-21 Helge Hess <helge.hess@opengroupware.org>
* product.plist: make addressbook only available to owner (v0.9.15)
2005-07-18 Helge Hess <helge.hess@opengroupware.org>
* SOGoContactObject.m: print an error log if a vCard could not be
parsed, cached failed parsing attempts (v0.9.14)
2005-07-15 Helge Hess <helge.hess@opengroupware.org>
* SOGoContactFolder.m: fixed a gcc 4.0 warning (v0.9.13)
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)
* SOGoContactObject.m: removed special GET action, the redirect to
'view' seems to be handled by SOPE now. This also makes WebDAV GET
work (v0.9.10)
2005-03-20 Helge Hess <helge.hess@opengroupware.org>
* SOGoContactFolder.m: changed to use GDLContentStore (v0.9.9)
2005-02-24 Helge Hess <helge.hess@opengroupware.org>
* SOGoContactObject.m: fixed a MacOSX warning (v0.9.8)
2005-02-18 Helge Hess <helge.hess@opengroupware.org>
* SOGoContactObject.m: added a REST method to patch a single field of
the contact (v0.9.7)
2005-02-06 Helge Hess <helge.hess@opengroupware.org>
* SOGoContactObject.m, SOGoContactFolder.m: added proper
message/folder class (v0.9.6)
2004-12-08 Marcus Mueller <znek@mulle-kybernetik.com>
* SOGoContactFolder.m: changed to NGLogging (v0.9.5)
2004-09-25 Helge Hess <helge.hess@opengroupware.org>
* fixed compilation on MacOSX (v0.9.4)
2004-08-27 Helge Hess <helge.hess@skyrix.com>
* v0.9.3
* SOGoContactObject.m: use 'cn' as davDisplayName
* SOGoContactObject.[hm]: can now decode the property list stored in
the store (v0.9.2)
* started implementation of contact folders (v0.9.1)
2004-08-26 Marcus Mueller <znek@mulle-kybernetik.com>
* Product.m: typo in comment fixed
* SOGoContactFolder.h, SOGoContactObject.h: changed _Appointments_ to
_Contacts_
2004-08-25 Marcus Mueller <znek@mulle-kybernetik.com>
* ChangeLog: created
+22
View File
@@ -0,0 +1,22 @@
# GNUstep makefile
include ../common.make
BUNDLE_NAME = Contacts
Contacts_PRINCIPAL_CLASS = SOGoContactsProduct
Contacts_OBJC_FILES = \
Product.m \
\
SOGoContactObject.m \
SOGoContactFolder.m \
Contacts_RESOURCE_FILES += \
Version \
product.plist \
-include GNUmakefile.preamble
include $(GNUSTEP_MAKEFILES)/bundle.make
-include GNUmakefile.postamble
include ../../fhsbundle.make
+1
View File
@@ -0,0 +1 @@
# compilation settings
+33
View File
@@ -0,0 +1,33 @@
/*
Copyright (C) 2004 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
// $Id: Product.m 274 2004-08-26 13:10:49Z znek $
#import <Foundation/NSObject.h>
@interface SOGoContactsProduct : NSObject
{
}
@end
@implementation SOGoContactsProduct
@end /* SOGoContactsProduct */
+58
View File
@@ -0,0 +1,58 @@
We can basically store anything we want in the property list. But we should
watch inetOrgPerson and vCard person compatibility in case we want to move
to vCard storage later on.
inetOrgPerson fields
====================
businessCategory
carLicense
departmentNumber
destinationIndicator
employeeNumber
employeeType
facsimileTelephoneNumber
givenName
homePostalAddress
initials
jpegPhoto
l
mail
manager
mobile
o
objectClass
ou
pager
physicalDeliveryOfficeName
postOfficeBox
postalCode
preferredLanguage
registeredAddress
roomNumber
secretary
seeAlso
sn
street
telephoneNumber
teletexTerminalIdentifier
title
uid
userCertificate
userPKCS12
userPassword
x121Address
audio
cn
description
displayName
homePhone
internationaliSDNNumber
labeledURI
photo
postalAddress
preferredDeliveryMethod
st
telexNumber
userSMIMECertificate
x500uniqueIdentifier
+49
View File
@@ -0,0 +1,49 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#ifndef __Contacts_SOGoContactFolder_H__
#define __Contacts_SOGoContactFolder_H__
#include <SOGo/SOGoFolder.h>
/*
SOGoContactFolder
Parent object: the SOGoUserFolder
Child objects: SOGoContactObject
The SOGoContactFolder maps to an GCS folder of type 'contact', that
is, a content folder containing vcal?? files (and a proper quicktable).
*/
@class NSString, NSArray, NSCalendarDate, NSException;
@class GCSFolder;
@interface SOGoContactFolder : SOGoFolder
{
}
/* fetching */
- (NSArray *)fetchCoreInfos;
@end
#endif /* __Contacts_SOGoContactFolder_H__ */
+123
View File
@@ -0,0 +1,123 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include "SOGoContactFolder.h"
#include <SOGo/SOGoCustomGroupFolder.h>
#include <SOGo/AgenorUserManager.h>
#include <GDLContentStore/GCSFolder.h>
#include <NGiCal/NGiCal.h>
#include "common.h"
#include <unistd.h>
#include <stdlib.h>
@implementation SOGoContactFolder
/* name lookup */
- (BOOL)isValidContactName:(NSString *)_key {
if ([_key length] == 0)
return NO;
return YES;
}
- (id)contactWithName:(NSString *)_key inContext:(id)_ctx {
static Class ctClass = Nil;
id ct;
if (ctClass == Nil)
ctClass = NSClassFromString(@"SOGoContactObject");
if (ctClass == Nil) {
[self errorWithFormat:@"missing SOGoContactObject class!"];
return nil;
}
ct = [[ctClass alloc] initWithName:_key inContainer:self];
return [ct autorelease];
}
- (id)lookupName:(NSString *)_key inContext:(id)_ctx acquire:(BOOL)_flag {
id obj;
/* first check attributes directly bound to the application */
if ((obj = [super lookupName:_key inContext:_ctx acquire:NO]))
return obj;
if ([self isValidContactName:_key]) {
#if 0
if ([[self ocsFolder] versionOfContentWithName:_key])
#endif
return [self contactWithName:_key inContext:_ctx];
}
/* return 404 to stop acquisition */
return [NSException exceptionWithHTTPStatus:404 /* Not Found */];
}
/* fetching */
- (NSArray *)fixupRecords:(NSArray *)_records {
return _records;
}
- (NSArray *)fetchCoreInfos {
NSArray *fields, *records;
fields = [NSArray arrayWithObjects:
@"c_name", @"cn",
@"sn", @"givenname", @"l",
@"mail", @"telephonenumber",
nil];
records = [[self ocsFolder] fetchFields:fields matchingQualifier:nil];
if (records == nil) {
[self errorWithFormat:@"(%s): fetch failed!", __PRETTY_FUNCTION__];
return nil;
}
records = [self fixupRecords:records];
//[self debugWithFormat:@"fetched %i records.", [records count]];
return records;
}
/* GET */
- (id)GETAction:(id)_ctx {
// TODO: I guess this should really be done by SOPE (redirect to
// default method)
WOResponse *r;
NSString *uri;
uri = [[_ctx request] uri];
if (![uri hasSuffix:@"/"]) uri = [uri stringByAppendingString:@"/"];
uri = [uri stringByAppendingString:@"view"];
r = [_ctx response];
[r setStatus:302 /* moved */];
[r setHeader:uri forKey:@"location"];
return r;
}
/* folder type */
- (NSString *)outlookFolderClass {
return @"IPF.Contact";
}
@end /* SOGoContactFolder */
+54
View File
@@ -0,0 +1,54 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#ifndef __Contacts_SOGoContactObject_H__
#define __Contacts_SOGoContactObject_H__
#include <SOGo/SOGoContentObject.h>
/*
SOGoContactObject
Represents a single contact. This SOPE controller object manages all the
attendee storages (that is, it might store into multiple folders for meeting
appointments!).
Note: SOGoContactObject do not need to exist yet. They can also be "new"
appointments with an externally generated unique key.
*/
@class NSDictionary;
@class NGVCard;
@interface SOGoContactObject : SOGoContentObject
{
id record; /* either an NSMutableDictionary or a NGVCard */
}
/* accessors */
- (id)record;
- (BOOL)isVCardRecord;
- (NGVCard *)vCard;
@end
#endif /* __Contacts_SOGoContactObject_H__ */
+162
View File
@@ -0,0 +1,162 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include "SOGoContactObject.h"
#include <NGiCal/NGVCard.h>
#include "common.h"
@implementation SOGoContactObject
- (void)dealloc {
[self->record release];
[super dealloc];
}
/* content */
- (id)record {
if (self->record == nil) {
NSString *s;
s = [self contentAsString];
if ([s hasPrefix:@"BEGIN:VCARD"]) {
NSArray *v;
v = [NGVCard parseVCardsFromSource:s];
if ([v count] == 0) {
[self errorWithFormat:@"Could not parse vCards from content!"];
return nil;
}
self->record = [[v objectAtIndex:0] retain];
}
else
self->record = [[s propertyList] copy];
if (self->record == nil)
self->record = [[NSNull null] retain];
}
return [self->record isNotNull] ? self->record : nil;
}
- (BOOL)isVCardRecord {
return [[self record] isKindOfClass:[NGVCard class]];
}
- (NGVCard *)vCard {
return [[self record] isKindOfClass:[NGVCard class]]
? [self record]
: nil;
}
/* key value coding */
- (id)valueForKey:(NSString *)_key {
id value;
if ((value = [[self record] valueForKey:_key]) != nil)
return value;
return [super valueForKey:_key];
}
/* DAV */
- (NSString *)davDisplayName {
NSString *n;
if ((n = [self valueForKey:@"cn"]))
return n;
return [self nameInContainer];
}
/* specialized actions */
- (NSException *)saveRecord:(id)_record {
if ([_record isKindOfClass:[NGVCard class]]) {
// TODO: implement a vCard generator
return [NSException exceptionWithHTTPStatus:501 /* Not Implemented */
reason:@"Saving vCards is not supported yet."];
}
return [self saveContentString:[_record description]];
}
- (NSException *)patchField:(NSString *)_fname value:(NSString *)_value
inContext:(id)_ctx
{
NSMutableDictionary *md;
if ([self isVCardRecord]) {
return [NSException exceptionWithHTTPStatus:501 /* Not Implemented */
reason:@"Changing vCards is not supported yet."];
}
if ([_fname length] == 0) {
return [NSException exceptionWithHTTPStatus:400 /* Bad Request */
reason:@"missing form field name"];
}
if ((md = [[[self record] mutableCopy] autorelease]) == nil) {
return [NSException exceptionWithHTTPStatus:404 /* Not Found */
reason:@"did not find contact record"];
}
[md setObject:[_value isNotNull] ? _value : @"" forKey:_fname];
return [self saveRecord:md];
}
- (id)patchOneFieldAction:(id)_ctx {
/*
expects: fieldname\nfieldvalue
TODO: should be extended to properly parse XML.
*/
NSArray *fields;
NSException *error;
fields = [[[(WOContext *)_ctx request] contentAsString]
componentsSeparatedByString:@"\n"];
if ([fields count] < 2) {
return [NSException exceptionWithHTTPStatus:400 /* Bad Request */
reason:@"missing form fields"];
}
error = [self patchField:[fields objectAtIndex:0]
value:[fields objectAtIndex:1]
inContext:_ctx];
if (error != nil)
return error;
return [(WOContext *)_ctx response];
}
/* message type */
- (NSString *)outlookMessageClass {
return @"IPM.Contact";
}
@end /* SOGoContactObject */
+7
View File
@@ -0,0 +1,7 @@
# version file
SUBMINOR_VERSION:=15
# v0.9.12 requires libSOGo v0.9.54
# v0.9.9 requires libGDLContentStore v4.5.26
# v0.9.5 requires libNGExtensions v4.5.136
+33
View File
@@ -0,0 +1,33 @@
/*
Copyright (C) 2002-2004 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
// $Id: common.h 577 2005-02-17 14:38:14Z helge $
#import <Foundation/Foundation.h>
#if NeXT_Foundation_LIBRARY || COCOA_Foundation_LIBRARY
# include <NGExtensions/NGObjectMacros.h>
# include <NGExtensions/NSString+Ext.h>
#endif
#include <NGExtensions/NGExtensions.h>
#include <NGObjWeb/NGObjWeb.h>
#include <NGObjWeb/SoObjects.h>
+35
View File
@@ -0,0 +1,35 @@
{
requires = ( MAIN );
publicResources = (
);
factories = {
};
classes = {
SOGoContactFolder = {
superclass = "SOGoFolder";
protectedBy = "View";
defaultAccess = "allow"; /* I think this affects key lookup */
defaultRoles = {
"View" = "Owner";
"WebDAV Access" = "Owner";
};
};
SOGoContactObject = {
superclass = "SOGoContentObject";
protectedBy = "View";
defaultAccess = "allow"; /* I think this affects key lookup */
defaultRoles = {
"View" = "Owner";
"WebDAV Access" = "Owner";
};
methods = {
};
};
};
}