2008-05-16 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+ * SoObjects/SOGo/SOGoGCSFolder.m ([SOGoGCSFolder
+ -subscribe:reallyDoinTheNameOf:delegatedUserfromMailInvitation:isMailInvitationinContext:localContext]):
+ published method.
+ ([-folderReference]): no longer distingish between the user owned
+ and the subscribed folders.
+
+ * SoObjects/SOGo/SOGoFolder.m ([SOGoFolder -compare:otherFolder]):
+ no longer use the "_" in the folder's nameInContainer.
+
+ * UI/Common/UIxFolderActions.m ([UIxFolderActions -subscribeAction])
+ ([UIxFolderActions -unsubscribeAction]): use the client object's
+ method for un-/subscribing.
+
+ * SoObjects/SOGo/SOGoObject.m ([SOGoObject
+ -pathArrayToSOGoObject]): removed useless method.
+
* SoObjects/Appointments/SOGoAppointmentFolder.m
([SOGoAppointmentFolder -davCalendarQuery:queryContext]): added
partial support for the "text-match" caldav directive.
- (NSArray *) aclUsers
{
- return [container aclUsersForObjectAtPath: [self pathArrayToSOGoObject]];
+ NSMutableArray *pathArray;
+
+ pathArray = [NSMutableArray arrayWithArray: [container pathArrayToFolder]];
+ [pathArray addObject: nameInContainer];
+
+ return pathArray;
}
- (NSArray *) aclsForUser: (NSString *) uid
@interface SOGoFolder : SOGoObject
{
NSMutableString *displayName;
+ BOOL isSubscription;
}
- (void) setDisplayName: (NSString *) newDisplayName;
- (NSString *) displayName;
+- (void) setIsSubscription: (BOOL) newIsSubscription;
+- (BOOL) isSubscription;
+
+- (NSString *) realNameInContainer;
+
- (NSString *) folderType;
- (NSArray *) fetchContentObjectNames;
- (id) init
{
if ((self = [super init]))
- displayName = nil;
+ {
+ displayName = nil;
+ isSubscription = NO;
+ }
return self;
}
return ((displayName) ? displayName : nameInContainer);
}
+- (void) setIsSubscription: (BOOL) newIsSubscription
+{
+ isSubscription = newIsSubscription;
+}
+
+- (BOOL) isSubscription
+{
+ return isSubscription;
+}
+
+- (NSString *) realNameInContainer
+{
+ NSString *realNameInContainer, *ownerName;
+
+ if (isSubscription)
+ {
+ ownerName = [self ownerInContext: context];
+ realNameInContainer
+ = [nameInContainer substringFromIndex: [ownerName length] + 1];
+ }
+ else
+ realNameInContainer = nameInContainer;
+
+ return realNameInContainer;
+}
+
- (NSString *) folderType
{
[self subclassResponsibility: _cmd];
/* sorting */
- (NSComparisonResult) _compareByOrigin: (SOGoFolder *) otherFolder
{
- NSArray *thisElements, *otherElements;
- unsigned thisCount, otherCount;
NSComparisonResult comparison;
- thisElements = [nameInContainer componentsSeparatedByString: @"_"];
- otherElements = [[otherFolder nameInContainer]
- componentsSeparatedByString: @"_"];
- thisCount = [thisElements count];
- otherCount = [otherElements count];
- if (thisCount == otherCount)
- {
- if (thisCount == 1)
- comparison = NSOrderedSame;
- else
- comparison = [[thisElements objectAtIndex: 0]
- compare: [otherElements objectAtIndex: 0]];
- }
+ if (isSubscription == [otherFolder isSubscription])
+ comparison = NSOrderedSame;
else
{
- if (thisCount > otherCount)
+ if (isSubscription)
comparison = NSOrderedDescending;
else
comparison = NSOrderedAscending;
- (NSComparisonResult) _compareByNameInContainer: (SOGoFolder *) otherFolder
{
- NSString *otherName;
+ NSString *selfName, *otherName;
NSComparisonResult comparison;
- otherName = [otherFolder nameInContainer];
- if ([nameInContainer hasSuffix: @"personal"])
+ selfName = [self realNameInContainer];
+ otherName = [otherFolder realNameInContainer];
+ if ([selfName isEqualToString: @"personal"])
{
- if ([otherName hasSuffix: @"personal"])
- comparison = [nameInContainer compare: otherName];
+ if ([otherName isEqualToString: @"personal"])
+ comparison = NSOrderedSame;
else
comparison = NSOrderedAscending;
}
else
{
- if ([otherName hasSuffix: @"personal"])
+ if ([otherName isEqualToString: @"personal"])
comparison = NSOrderedDescending;
else
- comparison = NSOrderedSame;
+ comparison = [selfName compare: otherName];
}
return comparison;
@class NSString;
@class GCSFolder;
+@class WOContext;
+@class WOResponse;
/*
SOGoGCSFolder
- (GCSFolder *) ocsFolder;
- (NSString *) folderReference;
+- (NSArray *) pathArrayToFolder;
/* lower level fetches */
- (BOOL) nameExistsInFolder: (NSString *) objectName;
- (NSException *) delete;
- (void) renameTo: (NSString *) newName;
+- (WOResponse *) subscribe: (BOOL) reallyDo
+ inTheNameOf: (NSString *) delegatedUser
+ fromMailInvitation: (BOOL) isMailInvitation
+ inContext: (WOContext *) localContext;
+
/* acls as a container */
- (NSArray *) aclUsersForObjectAtPath: (NSArray *) objectPathArray;
- (NSArray *) aclsForUser: (NSString *) uid
{
id newFolder;
NSArray *elements, *pathElements;
- NSString *path, *objectPath, *login, *ocsName, *folderName;
+ NSString *path, *objectPath, *login, *currentUser, *ocsName, *folderName;
+ WOContext *context;
elements = [reference componentsSeparatedByString: @":"];
login = [elements objectAtIndex: 0];
+ context = [[WOApplication application] context];
+ currentUser = [[context activeUser] login];
objectPath = [elements objectAtIndex: 1];
pathElements = [objectPath componentsSeparatedByString: @"/"];
if ([pathElements count] > 1)
newFolder = [self objectWithName: folderName inContainer: aContainer];
[newFolder setOCSPath: path];
[newFolder setOwner: login];
+ [newFolder setIsSubscription: ![login isEqualToString: currentUser]];
if (![newFolder displayName])
newFolder = nil;
- (NSString *) folderReference
{
- NSString *login, *reference, *realName;
- NSArray *nameComponents;
+ return [NSString stringWithFormat: @"%@:%@/%@",
+ owner,
+ [container nameInContainer],
+ [self realNameInContainer]];
+}
- login = [[context activeUser] login];
- if ([owner isEqualToString: login])
- reference = nameInContainer;
- else
- {
- nameComponents = [nameInContainer componentsSeparatedByString: @"_"];
- if ([nameComponents count] > 1)
- realName = [nameComponents objectAtIndex: 1];
- else
- realName = nameInContainer;
+- (NSArray *) pathArrayToFolder
+{
+ NSArray *basePathElements;
+ unsigned int max;
- reference = [NSString stringWithFormat: @"%@:%@/%@",
- owner,
- [container nameInContainer],
- realName];
- }
+ basePathElements = [[self ocsPath] componentsSeparatedByString: @"/"];
+ max = [basePathElements count];
- return reference;
+ return [basePathElements subarrayWithRange: NSMakeRange (2, max - 2)];
}
- (NSString *) davDisplayName
}
}
-#warning this method is dirty code
- (NSDictionary *) fetchContentStringsAndNamesOfAllObjects
{
NSDictionary *files;
[self errorWithFormat:@"(%s): fetch failed!", __PRETTY_FUNCTION__];
return nil;
}
- if ([files isKindOfClass:[NSException class]])
- return files;
+
return files;
}
#warning this code should be cleaned up
-#warning this code is a dup of UIxFolderActions,\
- we should remove the methods there
- (void) _subscribeUser: (SOGoUser *) subscribingUser
reallyDo: (BOOL) reallyDo
+ fromMailInvitation: (BOOL) isMailInvitation
inResponse: (WOResponse *) response
{
NSMutableArray *folderSubscription;
- NSString *subscriptionPointer, *baseFolder, *folder;
+ NSString *subscriptionPointer, *mailInvitationURL;
NSUserDefaults *ud;
- NSArray *realFolderPath;
NSMutableDictionary *moduleSettings;
ud = [subscribingUser userSettings];
- baseFolder = [container nameInContainer];
- moduleSettings = [ud objectForKey: baseFolder];
+ moduleSettings = [ud objectForKey: [container nameInContainer]];
if ([owner isEqualToString: [subscribingUser login]])
{
forKey: @"SubscribedFolders"];
}
- realFolderPath = [nameInContainer componentsSeparatedByString: @"_"];
- if ([realFolderPath count] > 1)
- folder = [realFolderPath objectAtIndex: 1];
- else
- folder = [realFolderPath objectAtIndex: 0];
-
subscriptionPointer = [self folderReference];
if (reallyDo)
[folderSubscription addObjectUniquely: subscriptionPointer];
[ud synchronize];
- [response setStatus: 204];
+ if (isMailInvitation)
+ {
+ mailInvitationURL = [[self soURLToBaseContainerForCurrentUser]
+ absoluteString];
+ [response setStatus: 302];
+ [response setHeader: mailInvitationURL
+ forKey: @"location"];
+ }
+ else
+ [response setStatus: 204];
}
}
-- (WOResponse *) _subscribe: (BOOL) reallyDo
- inTheNameOf: (NSString *) delegatedUser
- inContext: (WOContext *) localContext
+- (WOResponse *) subscribe: (BOOL) reallyDo
+ inTheNameOf: (NSString *) delegatedUser
+ fromMailInvitation: (BOOL) isMailInvitation
+ inContext: (WOContext *) localContext
{
WOResponse *response;
SOGoUser *currentUser, *subscriptionUser;
if (validRequest)
[self _subscribeUser: subscriptionUser
reallyDo: reallyDo
+ fromMailInvitation: isMailInvitation
inResponse: response];
else
{
- (id <WOActionResults>) davSubscribe: (WOContext *) queryContext
{
- return [self _subscribe: YES
+ return [self subscribe: YES
inTheNameOf: [self _parseDAVDelegatedUser: queryContext]
+ fromMailInvitation: NO
inContext: queryContext];
}
- (id <WOActionResults>) davUnsubscribe: (WOContext *) queryContext
{
- return [self _subscribe: NO
+ return [self subscribe: NO
inTheNameOf: [self _parseDAVDelegatedUser: queryContext]
+ fromMailInvitation: NO
inContext: queryContext];
}
/* acls */
- (NSArray *) aclUsers
{
- return [self aclUsersForObjectAtPath: [self pathArrayToSOGoObject]];
+ return [self aclUsersForObjectAtPath: [self pathArrayToFolder]];
}
- (NSArray *) aclsForUser: (NSString *) uid
NSArray *ownAcls, *containerAcls;
acls = [NSMutableArray array];
- ownAcls = [self aclsForUser: uid
- forObjectAtPath: [self pathArrayToSOGoObject]];
+ ownAcls = [self aclsForUser: uid forObjectAtPath: [self pathArrayToFolder]];
[acls addObjectsFromArray: ownAcls];
if ([container respondsToSelector: @selector (aclsForUser:)])
{
{
return [self setRoles: roles
forUser: uid
- forObjectAtPath: [self pathArrayToSOGoObject]];
+ forObjectAtPath: [self pathArrayToFolder]];
}
- (void) removeAclsForUsers: (NSArray *) users
{
return [self removeAclsForUsers: users
- forObjectAtPath: [self pathArrayToSOGoObject]];
+ forObjectAtPath: [self pathArrayToFolder]];
}
- (NSString *) defaultUserID
- (NSString *) nameInContainer;
- (id) container;
-- (NSArray *) pathArrayToSOGoObject;
-
- (NSURL *) davURL;
- (NSURL *) soURL;
- (NSURL *) soURLToBaseContainerForUser: (NSString *) uid;
return container;
}
-- (NSArray *) pathArrayToSOGoObject
-{
- NSMutableArray *realPathArray;
- NSString *objectName;
- NSArray *objectDescription;
-
- realPathArray
- = [NSMutableArray arrayWithArray: [self pathArrayToSoObject]];
- if ([realPathArray count] > 2)
- {
- objectName = [realPathArray objectAtIndex: 2];
- if ([objectName isKindOfClass: [NSString class]])
- {
- objectDescription = [objectName componentsSeparatedByString: @"_"];
- if ([objectDescription count] > 1)
- {
- [realPathArray replaceObjectAtIndex: 0
- withObject: [objectDescription objectAtIndex: 0]];
- [realPathArray replaceObjectAtIndex: 2
- withObject: [objectDescription objectAtIndex: 1]];
- }
- }
- }
-
- return realPathArray;
-}
-
/* ownership */
- (void) setOwner: (NSString *) newOwner
@implementation UIxFolderActions
-#warning some of this code could probably be moved in one of the \
- clientObject classes...
-
- (void) _setupContext
{
NSString *mailInvitationParam;
isMailInvitation = [mailInvitationParam boolValue];
}
-- (WOResponse *) _realSubscribe: (BOOL) reallyDo
-{
- WOResponse *response;
- NSMutableArray *folderSubscription;
- NSString *mailInvitationURL, *subscriptionPointer;
-
- if ([owner isEqualToString: login])
- {
- response = [self responseWithStatus: 403];
- [response appendContentString:
- @"You cannot (un)subscribe to a folder that you own!"];
- }
- else
- {
- folderSubscription
- = [moduleSettings objectForKey: @"SubscribedFolders"];
- if (!(folderSubscription
- && [folderSubscription isKindOfClass: [NSMutableArray class]]))
- {
- folderSubscription = [NSMutableArray array];
- [moduleSettings setObject: folderSubscription
- forKey: @"SubscribedFolders"];
- }
- subscriptionPointer = [[self clientObject] folderReference];
- if (reallyDo)
- [folderSubscription addObjectUniquely: subscriptionPointer];
- else
- [folderSubscription removeObject: subscriptionPointer];
-
- [ud synchronize];
-
- if (isMailInvitation)
- {
- mailInvitationURL
- = [[clientObject soURLToBaseContainerForCurrentUser]
- absoluteString];
- response = [self responseWithStatus: 302];
- [response setHeader: mailInvitationURL
- forKey: @"location"];
- }
- else
- response = [self responseWith204];
- }
-
- return response;
-}
-
- (WOResponse *) subscribeAction
{
[self _setupContext];
- return [self _realSubscribe: YES];
+ return [clientObject subscribe: YES
+ inTheNameOf: nil
+ fromMailInvitation: isMailInvitation
+ inContext: context];
}
- (WOResponse *) unsubscribeAction
{
[self _setupContext];
- return [self _realSubscribe: NO];
+ return [clientObject subscribe: NO
+ inTheNameOf: nil
+ fromMailInvitation: isMailInvitation
+ inContext: context];
}
- (WOResponse *) canAccessContentAction
function onAddressBookRemove(event) {
var selector = $("contactFolders");
var nodes = selector.getSelectedNodes();
- if (nodes.length > 0) {
+ if (nodes.length > 0) {
nodes[0].deselect();
- var folderId = nodes[0].getAttribute("id");
- var folderIdElements = folderId.split("_");
- if (folderIdElements.length > 1)
- unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId);
+ var owner = nodes[0].getAttribute("owner");
+ if (owner != UserLogin) {
+ var folderId = nodes[0].getAttribute("id");
+ unsubscribeFromFolder(folderId, owner, onFolderUnsubscribeCB, folderId);
+ }
else {
var abId = folderIdElements[0].substr(1);
deletePersonalAddressBook(abId);
var nodes = $("calendarList").getSelectedNodes();
for (var i = 0; i < nodes.length; i++) {
nodes[i].deselect();
- var folderId = nodes[i].getAttribute("id");
- var folderIdElements = folderId.split("_");
- if (folderIdElements.length > 1) {
- unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId);
+ var owner = nodes[i].getAttribute("owner");
+ if (owner != UserLogin) {
+ var folderId = nodes[i].getAttribute("id");
+ unsubscribeFromFolder(folderId, owner,
+ onFolderUnsubscribeCB, folderId);
}
else
deletePersonalCalendar(folderIdElements[0]);
}
}
-function unsubscribeFromFolder(folder, refreshCallback, refreshCallbackData) {
+function unsubscribeFromFolder(folder, owner, refreshCallback,
+ refreshCallbackData) {
if (document.body.hasClassName("popup")) {
window.opener.unsubscribeFromFolder(folder, refreshCallback,
refreshCallbackData);
}
else {
- var folderData = folder.split("_");
- var username = folderData[0];
- var folderPath = folderData[1];
- if (username.startsWith('/'))
- username = username.substring(1);
- if (username != UserLogin) {
+ if (owner.startsWith('/'))
+ owner = owner.substring(1);
+ if (owner != UserLogin) {
var url = (ApplicationBaseURL + folder + "/unsubscribe");
removeFolderRequestCount++;
var rfCbData = { method: refreshCallback, data: refreshCallbackData };