sogo/SoObjects/Mailer/SOGoMailAccounts.m
Patrice Levesque 5e9d0ce95a Fix warning: ‘-textValue’ not found in protocol(s)
Confusingly, labelNode is a DOMElement, not a DOMNode, so textValue cannot
apply here; textContent which would be an appropriate replacement does not
exist AFAIK in this DOM Library.

So we manually get the text node via firstChild then get its text value
via nodeValue.
2016-03-07 10:34:40 -05:00

256 lines
7 KiB
Objective-C

/*
Copyright (C) 2004-2005 SKYRIX Software AG
Copyright (C) 2007-2013 Inverse inc.
This file is part of SOGo.
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.
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
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <NGObjWeb/NSException+HTTP.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WORequest.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <DOM/DOMElement.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
{
SOGoUser *user;
user = [SOGoUser userWithLogin: [self ownerInContext: nil]];
return [user mailAccounts];
}
- (NSArray *) toManyRelationshipKeys
{
NSMutableArray *keys;
NSArray *accounts;
int count, max;
SOGoUser *user;
user = [SOGoUser userWithLogin: [self ownerInContext: nil]];
accounts = [user mailAccounts];
max = [accounts count];
keys = [NSMutableArray arrayWithCapacity: max];
for (count = 0; count < max; count++)
[keys addObject: [NSString stringWithFormat: @"%d", count]];
return keys;
}
/* name lookup */
- (id) lookupName: (NSString *) _key
inContext: (id) _ctx
acquire: (BOOL) _flag
{
id obj;
NSArray *accounts;
NSString *key;
SOGoUser *user;
int keyCount;
key = [_key fromCSSIdentifier];
/* first check attributes directly bound to the application */
obj = [super lookupName:key inContext:_ctx acquire:NO];
if (!obj)
{
user = [SOGoUser userWithLogin: [self ownerInContext: nil]];
accounts = [user mailAccounts];
keyCount = [key intValue];
if ([key isEqualToString: [NSString stringWithFormat: @"%d", keyCount]]
&& keyCount > -1 && keyCount < [accounts count])
obj = [SOGoMailAccount objectWithName: key inContainer: self];
else
obj = [NSException exceptionWithHTTPStatus: 404 /* Not Found */];
}
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 firstChild] nodeValue];
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 */