Added DAV support for mails labels.
parent
616ee7c6e4
commit
1c439c866e
|
@ -1,8 +1,6 @@
|
|||
/* SOGoContactFolders.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2006-2011 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Copyright (C) 2006-2013 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -20,13 +18,6 @@
|
|||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/* MailItems IPF.Note
|
||||
ContactItems IPF.Contact
|
||||
AppointmentItems IPF.Appointment
|
||||
NoteItems IPF.StickyNote
|
||||
TaskItems IPF.Task
|
||||
JournalItems IPF.Journal */
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
@ -50,6 +41,7 @@
|
|||
#import "SOGoContactFolders.h"
|
||||
|
||||
#define XMLNS_INVERSEDAV @"urn:inverse:params:xml:ns:inverse-dav"
|
||||
|
||||
@implementation SOGoContactFolders
|
||||
|
||||
+ (NSString *) gcsFolderType
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2009-2011 Inverse inc.
|
||||
Copyright (C) 2009-2013 Inverse inc.
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of SOGo.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
Copyright (C) 2007-2011 Inverse inc.
|
||||
Copyright (C) 2007-2013 Inverse inc.
|
||||
|
||||
This file is part of SOGo.
|
||||
|
||||
|
@ -26,6 +26,9 @@
|
|||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
|
||||
#import <DOM/DOMElement.h>
|
||||
#import <DOM/DOMProtocols.h>
|
||||
|
||||
#import <NGObjWeb/NSException+HTTP.h>
|
||||
#import <NGObjWeb/SoHTTPAuthenticator.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
|
@ -56,6 +59,8 @@
|
|||
|
||||
#import "SOGoMailAccount.h"
|
||||
|
||||
#define XMLNS_INVERSEDAV @"urn:inverse:params:xml:ns:inverse-dav"
|
||||
|
||||
@implementation SOGoMailAccount
|
||||
|
||||
static NSString *inboxFolderName = @"INBOX";
|
||||
|
|
|
@ -1,20 +1,21 @@
|
|||
/*
|
||||
Copyright (C) 2009-2013 Inverse inc.
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of OpenGroupware.org.
|
||||
This file is part of SOGo.
|
||||
|
||||
OGo is free software; you can redistribute it and/or modify it under
|
||||
SOGo 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
|
||||
SOGo 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
|
||||
License along with SOGo; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
/*
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
Copyright (C) 2007-2013 Inverse inc.
|
||||
|
||||
This file is part of OpenGroupware.org.
|
||||
This file is part of SOGo.
|
||||
|
||||
OGo is free software; you can redistribute it and/or modify it under
|
||||
SOGo 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
|
||||
SOGo 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.
|
||||
|
@ -26,14 +27,20 @@
|
|||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
#import <DOM/DOMElement.h>
|
||||
#import <DOM/DOMProtocols.h>
|
||||
|
||||
#import "../SOGo/NSArray+Utilities.h"
|
||||
#import "../SOGo/NSObject+DAV.h"
|
||||
#import "../SOGo/NSString+Utilities.h"
|
||||
#import "../SOGo/SOGoUser.h"
|
||||
#import "../SOGo/SOGoUserDefaults.h"
|
||||
#import "SOGoMailAccount.h"
|
||||
|
||||
#import "SOGoMailAccounts.h"
|
||||
|
||||
#define XMLNS_INVERSEDAV @"urn:inverse:params:xml:ns:inverse-dav"
|
||||
|
||||
@implementation SOGoMailAccounts
|
||||
|
||||
- (NSArray *) mailAccounts
|
||||
|
@ -92,4 +99,156 @@
|
|||
return obj;
|
||||
}
|
||||
|
||||
/*
|
||||
Mail labels/tags synchronization.
|
||||
|
||||
Request:
|
||||
|
||||
<D:propfind xmlns:D="DAV:" xmlns:x0="urn:inverse:params:xml:ns:inverse-dav"><D:prop><x0:mails-labels/></D:prop></D:propfind>
|
||||
|
||||
Result:
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<D:multistatus>
|
||||
<D:response>
|
||||
<D:href>/SOGo/dav/sogo10/Mail/</D:href>
|
||||
<D:propstat>
|
||||
<D:status>HTTP/1.1 200 OK</D:status>
|
||||
<D:prop>
|
||||
<n1:mails-labels>
|
||||
<n1:label color="#f00" id="$label1">Important</n1:label>
|
||||
<n1:label color="#ff9a00" id="$label2">Work</n1:label>
|
||||
<n1:label color="#009a00" id="$label3">Personal</n1:label>
|
||||
<n1:label color="#3130ff" id="$label4">To Do</n1:label>
|
||||
<n1:label color="#9c309c" id="$label5">Later</n1:label>
|
||||
</n1:mails-labels>
|
||||
</D:prop>
|
||||
</D:propstat>
|
||||
</D:response>
|
||||
</D:multistatus>
|
||||
|
||||
*/
|
||||
- (SOGoWebDAVValue *) davMailsLabels
|
||||
{
|
||||
NSDictionary *labelsFromDefaults, *labelValues, *attributes;
|
||||
NSMutableArray *davMailsLabels;
|
||||
NSUInteger count, max;
|
||||
SOGoUser *ownerUser;
|
||||
NSArray *allKeys, *values;
|
||||
NSString *key;
|
||||
|
||||
ownerUser = [SOGoUser userWithLogin: owner];
|
||||
labelsFromDefaults = [[ownerUser userDefaults] mailLabelsColors];
|
||||
allKeys = [labelsFromDefaults allKeys];
|
||||
max = [allKeys count];
|
||||
|
||||
davMailsLabels = [NSMutableArray arrayWithCapacity: max];
|
||||
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
key = [allKeys objectAtIndex: count];
|
||||
values = [labelsFromDefaults objectForKey: key];
|
||||
|
||||
attributes = [NSDictionary dictionaryWithObjectsAndKeys: key, @"id",
|
||||
[values objectAtIndex: 1], @"color",
|
||||
nil];
|
||||
|
||||
labelValues = davElementWithAttributesAndContent(@"label",
|
||||
attributes,
|
||||
XMLNS_INVERSEDAV,
|
||||
[values objectAtIndex: 0]);
|
||||
|
||||
[davMailsLabels addObject: labelValues];
|
||||
}
|
||||
|
||||
return [davElementWithContent (@"mails-labels",
|
||||
XMLNS_INVERSEDAV,
|
||||
davMailsLabels)
|
||||
asWebDAVValue];
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
We get something like that:
|
||||
|
||||
Request:
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<propertyupdate xmlns="DAV:" xmlns:i="urn:inverse:params:xml:ns:inverse-dav">
|
||||
<set>
|
||||
<prop>
|
||||
<i:mails-labels>
|
||||
<i:label color="#f00" id="$label1">Important</i:label>
|
||||
<i:label color="#ff9a00" id="$label2">Work</i:label>
|
||||
<i:label color="#009a00" id="$label3">Personal</i:label>
|
||||
<i:label color="#3130ff" id="$label4">To Do</i:label>
|
||||
<i:label color="#9c309c" id="$label5">Later</i:label>
|
||||
</i:mails-labels>
|
||||
</prop>
|
||||
</set>
|
||||
</propertyupdate>
|
||||
|
||||
Response:
|
||||
|
||||
<D:multistatus>
|
||||
<D:response>
|
||||
<D:href>/SOGo/dav/sogo10/Mail/</D:href>
|
||||
<D:propstat>
|
||||
<D:prop>
|
||||
<a:mails-labels/>
|
||||
</D:prop>
|
||||
<D:status>HTTP/1.1 200 OK</D:status>
|
||||
</D:propstat>
|
||||
</D:response>
|
||||
</D:multistatus>
|
||||
|
||||
*/
|
||||
- (NSException *) setDavMailsLabels: (NSString *) newLabels
|
||||
{
|
||||
id <DOMElement> documentElement, labelNode;
|
||||
id <DOMNodeList> labelNodes;
|
||||
id <DOMDocument> document;
|
||||
|
||||
NSString *label, *name, *color;
|
||||
NSMutableDictionary *labels;
|
||||
NSMutableArray *values;
|
||||
SOGoUserDefaults *ud;
|
||||
SOGoUser *ownerUser;
|
||||
|
||||
NSUInteger count, max;
|
||||
|
||||
labels = [NSMutableDictionary dictionary];
|
||||
|
||||
if ([newLabels length] > 0)
|
||||
{
|
||||
document = [[context request] contentAsDOMDocument];
|
||||
documentElement = [document documentElement];
|
||||
labelNodes = [documentElement getElementsByTagName: @"label"];
|
||||
max = [labelNodes length];
|
||||
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
values = [NSMutableArray array];
|
||||
|
||||
labelNode = [labelNodes objectAtIndex: count];
|
||||
|
||||
label = [labelNode attribute: @"id"];
|
||||
name = [labelNode textValue];
|
||||
color = [labelNode attribute: @"color"];
|
||||
|
||||
[values addObject: name];
|
||||
[values addObject: color];
|
||||
|
||||
[labels setObject: values forKey: label];
|
||||
}
|
||||
}
|
||||
|
||||
ownerUser = [SOGoUser userWithLogin: owner];
|
||||
ud = [ownerUser userDefaults];
|
||||
[ud setMailLabelsColors: labels];
|
||||
[ud synchronize];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end /* SOGoMailAccounts */
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
/* SOGoMailNamespace.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2010 Wolfgang Sourdeau
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Copyright (C) 2010-2013 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -29,9 +29,6 @@
|
|||
"WebDAV Access" = ( "Owner", "AuthorizedSubscriber" );
|
||||
};
|
||||
};
|
||||
/* SOGoSharedMailAccount = {
|
||||
superclass = "SOGoMailAccount";
|
||||
}; */
|
||||
SOGoMailFolder = {
|
||||
superclass = "SOGoMailBaseObject";
|
||||
defaultRoles = {
|
||||
|
@ -44,9 +41,6 @@
|
|||
"Change Permissions" = ( "Owner", "MailAdministrator" );
|
||||
};
|
||||
};
|
||||
/* SOGoSharedInboxFolder = {
|
||||
superclass = "SOGoMailFolder";
|
||||
}; */
|
||||
SOGoTrashFolder = {
|
||||
superclass = "SOGoMailFolder";
|
||||
};
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
/* NSDictionary+DAV.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2008-2009 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Copyright (C) 2008-2013 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -59,6 +57,7 @@
|
|||
- (NSString *)
|
||||
asWebDavStringWithNamespaces: (NSMutableDictionary *) namespaces
|
||||
{
|
||||
NSDictionary *attributes;
|
||||
NSMutableString *webdavString;
|
||||
NSString *nsTag, *ns, *subString, *element;
|
||||
BOOL firstLevel;
|
||||
|
@ -88,6 +87,22 @@
|
|||
[webdavString appendString: [self _namespaceDecl: namespaces]];
|
||||
[namespaces release];
|
||||
}
|
||||
|
||||
attributes = [self objectForKey: @"attributes"];
|
||||
|
||||
if (attributes)
|
||||
{
|
||||
NSArray *keys;
|
||||
int i;
|
||||
|
||||
keys = [attributes allKeys];
|
||||
|
||||
for (i = 0; i < [keys count]; i++)
|
||||
{
|
||||
[webdavString appendFormat: @" %@=\"%@\"", [keys objectAtIndex: i], [attributes objectForKey: [keys objectAtIndex: i]]];
|
||||
}
|
||||
}
|
||||
|
||||
if (subString)
|
||||
[webdavString appendFormat: @">%@</%@>", subString, element];
|
||||
else
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
/* NSObject+DAV.h - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2008 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Copyright (C) 2008-2013 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -47,6 +45,12 @@ typedef enum _HTTPStatusCode {
|
|||
n, @"ns", \
|
||||
c, @"content", nil]
|
||||
|
||||
#define davElementWithAttributesAndContent(t,a,n,c) \
|
||||
[NSDictionary dictionaryWithObjectsAndKeys: t, @"method", \
|
||||
a, @"attributes", \
|
||||
n, @"ns", \
|
||||
c, @"content", nil]
|
||||
|
||||
SEL SOGoSelectorForPropertyGetter (NSString *property);
|
||||
SEL SOGoSelectorForPropertySetter (NSString *property);
|
||||
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
/* NSObject+DAV.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2008-2010 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Copyright (C) 2008-2013 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
/* NSString+DAV.h - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2008 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Copyright (C) 2008-2013 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -314,12 +314,12 @@ static int cssEscapingCount;
|
|||
int count;
|
||||
|
||||
strings = [NSArray arrayWithObjects: @"_U_", @"_D_", @"_H_", @"_A_", @"_S_",
|
||||
@"_C_", @"_CO_", @"_SP_", @"_SQ_", @"_AM_", @"_P_", nil];
|
||||
@"_C_", @"_CO_", @"_SP_", @"_SQ_", @"_AM_", @"_P_", @"_DS_", nil];
|
||||
[strings retain];
|
||||
cssEscapingStrings = [strings asPointersOfObjects];
|
||||
|
||||
characters = [NSArray arrayWithObjects: @"_", @".", @"#", @"@", @"*", @":",
|
||||
@",", @" ", @"'", @"&", @"+", nil];
|
||||
@",", @" ", @"'", @"&", @"+", @"$", nil];
|
||||
cssEscapingCount = [strings count];
|
||||
cssEscapingCharacters = NSZoneMalloc (NULL,
|
||||
(cssEscapingCount + 1)
|
||||
|
|
|
@ -78,10 +78,10 @@
|
|||
SOGoSearchMinimumWordLength = 2;
|
||||
|
||||
SOGoMailLabelsColors = {
|
||||
label1 = ("Important", "#f00");
|
||||
label2 = ("Work", "#ff9a00");
|
||||
label3 = ("Personal", "#009a00");
|
||||
label4 = ("To Do", "#3130ff");
|
||||
label5 = ("Later", "#9c309c");
|
||||
$label1 = ("Important", "#f00");
|
||||
$label2 = ("Work", "#ff9a00");
|
||||
$label3 = ("Personal", "#009a00");
|
||||
$label4 = ("To Do", "#3130ff");
|
||||
$label5 = ("Later", "#9c309c");
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
/* SOGoObject.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
* Copyright (C) 2006-2009 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Copyright (C) 2006-2013 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
/* SOGoWebDAVValue.m - this file is part of $PROJECT_NAME_HERE$
|
||||
*
|
||||
* Copyright (C) 2008 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Copyright (C) 2008-2013 Inverse inc.
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
</script>
|
||||
<style type="text/css">
|
||||
<var:foreach list="availableLabels" item="currentLabel">
|
||||
#label-menu LI.<var:string value="currentLabel.name"/>,
|
||||
#label-menu LI.<var:string value="currentLabel.name.asCSSIdentifier"/>,
|
||||
TABLE.messageList TR[labels~=<var:string const:value='"' const:escapeHTML="NO"
|
||||
/><var:string value="currentLabel.name"/><var:string const:value='"' const:escapeHTML="NO"/>] TD
|
||||
{ color: <var:string value="currentLabel.color"/>; }
|
||||
|
@ -181,7 +181,7 @@
|
|||
<li><var:string label:value="None" /></li>
|
||||
<li><!-- separator --></li>
|
||||
<var:foreach list="availableLabels" item="currentLabel">
|
||||
<li var:class="currentLabel.name" var:data-name="currentLabel.name"> <var:string value="currentLabel.label"/></li>
|
||||
<li var:class="currentLabel.name.asCSSIdentifier" var:data-name="currentLabel.name"> <var:string value="currentLabel.label"/></li>
|
||||
</var:foreach>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
Loading…
Reference in New Issue