propagate from branch 'ca.inverse.sogo.1_3_12' (head f5ba6db440f5a8ba817af65dea12b4a616fdfe71)
to branch 'ca.inverse.sogo' (head df5dd81d62db331ba5c8de9f2257f9430c586534) Monotone-Parent: df5dd81d62db331ba5c8de9f2257f9430c586534 Monotone-Parent: f5ba6db440f5a8ba817af65dea12b4a616fdfe71 Monotone-Revision: 31373520d86c320c1658f22e3bde2eee178c2003 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-01-09T16:38:18 Monotone-Branch: ca.inverse.sogomaint-2.0.2
commit
5468b9b1a2
19
ChangeLog
19
ChangeLog
|
@ -1,3 +1,8 @@
|
|||
2012-01-05 Francis Lachapelle <flachapelle@inverse.ca>
|
||||
|
||||
* SoObjects/SOGo/SOGoUserManager.m (-_registerSource:inDomain::):
|
||||
log error when duplicated IDs are found.
|
||||
|
||||
2012-01-04 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* UI/WebServerResources/ContactsUI.js
|
||||
|
@ -66,6 +71,20 @@
|
|||
the identifier of the source that authenticated the specified user
|
||||
as the "SOGoSource" entry of the returned dictionary.
|
||||
|
||||
2012-01-03 Francis Lachapelle <flachapelle@inverse.ca>
|
||||
|
||||
* SoObjects/Appointments/SOGoAptMailNotification.m (-setupValues):
|
||||
don't set the start/end times when dealing with an all-day event.
|
||||
|
||||
* SoObjects/Appointments/SOGoAptMailInvitation.m (-getBody): don't
|
||||
display the start/end times when dealing with an all-day event.
|
||||
|
||||
* SoObjects/Appointments/SOGoAptMailReceipt.m (-_formattedUserDate:): idem.
|
||||
|
||||
* SoObjects/Appointments/SOGoAptMailUpdate.m (-getSubject): idem.
|
||||
|
||||
* SoObjects/Appointments/SOGoAptMailDeletion.m (-getBody): idem.
|
||||
|
||||
2012-01-02 Francis Lachapelle <flachapelle@inverse.ca>
|
||||
|
||||
* UI/WebServerResources/UIxPreferences.js (getFilterFromEditor):
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2012-01-09 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* NSString+NGCards.m (-vCardSubvalues): fixed allocation of
|
||||
parsing buffer to avoid a buffer overflow.
|
||||
|
||||
2011-12-30 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* NGVCard.m (-initWithUid:): initialize "CLASS" and "PROFILE".
|
||||
|
|
|
@ -325,7 +325,7 @@
|
|||
ELEM;...:subvalue1;subvalue1,subvalue2 (where KEY = @"") */
|
||||
NSMutableDictionary *values; /* key <> ordered values associations */
|
||||
NSMutableArray *orderedValues = nil; /* those are separated by ';' and contain
|
||||
subvalues, may or may not be named */
|
||||
subvalues, may or may not be named */
|
||||
NSMutableArray *subValues = nil; /* those are separeted by ',' */
|
||||
unichar *stringBuffer, *substringBuffer;
|
||||
NSString *valuesKey, *substring;
|
||||
|
@ -337,7 +337,7 @@
|
|||
valuesKey = @"";
|
||||
|
||||
max = [self length];
|
||||
stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max + 1);
|
||||
stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * (max + 1));
|
||||
[self getCharacters: stringBuffer];
|
||||
stringBuffer[max] = 0;
|
||||
|
||||
|
|
|
@ -35,14 +35,19 @@ vtodo_class2 = "(Confidential task)";
|
|||
/* Invitation */
|
||||
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
|
||||
"(sent by %{SentBy}) " = "(sent by %{SentBy}) ";
|
||||
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}";
|
||||
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}";
|
||||
|
||||
/* Deletion */
|
||||
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
|
||||
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
|
||||
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}";
|
||||
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
|
||||
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}";
|
||||
|
||||
/* Update */
|
||||
"The appointment \"%{Summary}\" for the %{OldStartDate} has changed"
|
||||
= "The appointment \"%{Summary}\" for the %{OldStartDate} has changed";
|
||||
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
|
||||
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
|
||||
"The following parameters have changed in the \"%{Summary}\" meeting:"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2010 Inverse
|
||||
Copyright (C) 2010-2012 Inverse
|
||||
|
||||
This file is part of SOGo
|
||||
|
||||
|
@ -49,12 +49,20 @@
|
|||
if (!values)
|
||||
[self setupValues];
|
||||
|
||||
bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has cancelled"
|
||||
@" this event: %{Summary}.\n\n"
|
||||
@"Start: %{StartDate} at %{StartTime}\n"
|
||||
@"End: %{EndDate} at %{EndTime}\n"
|
||||
@"Description: %{Description}")
|
||||
inContext: context];
|
||||
if ([values objectForKey: @"StartTime"] && [values objectForKey: @"EndTime"])
|
||||
bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has cancelled"
|
||||
@" this event: %{Summary}.\n\n"
|
||||
@"Start: %{StartDate} at %{StartTime}\n"
|
||||
@"End: %{EndDate} at %{EndTime}\n"
|
||||
@"Description: %{Description}")
|
||||
inContext: context];
|
||||
else
|
||||
bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has cancelled"
|
||||
@" this event: %{Summary}.\n\n"
|
||||
@"Start: %{StartDate}\n"
|
||||
@"End: %{EndDate}\n"
|
||||
@"Description: %{Description}")
|
||||
inContext: context];
|
||||
|
||||
return [values keysWithFormat: bodyFormat];
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2010 Inverse
|
||||
Copyright (C) 2010-2012 Inverse
|
||||
|
||||
This file is part of SOGo
|
||||
|
||||
|
@ -54,8 +54,20 @@
|
|||
if (!values)
|
||||
[self setupValues];
|
||||
|
||||
bodyFormat = [self labelForKey: @"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
|
||||
inContext: context];
|
||||
if ([values objectForKey: @"StartTime"] && [values objectForKey: @"EndTime"])
|
||||
bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has invited you"
|
||||
@" to %{Summary}.\n\n"
|
||||
@"Start: %{StartDate} at %{StartTime}\n"
|
||||
@"End: %{EndDate} at %{EndTime}\n"
|
||||
@"Description: %{Description}")
|
||||
inContext: context];
|
||||
else
|
||||
bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has invited you"
|
||||
@" to %{Summary}.\n\n"
|
||||
@"Start: %{StartDate}\n"
|
||||
@"End: %{EndDate}\n"
|
||||
@"Description: %{Description}")
|
||||
inContext: context];
|
||||
|
||||
return [values keysWithFormat: bodyFormat];
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2006-2010 Inverse inc.
|
||||
Copyright (C) 2006-2012 Inverse inc.
|
||||
Copyright (C) 2000-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of SOGo.
|
||||
|
@ -209,14 +209,16 @@
|
|||
date = [self newStartDate];
|
||||
[values setObject: [dateFormatter shortFormattedDate: date]
|
||||
forKey: @"StartDate"];
|
||||
[values setObject: [dateFormatter formattedTime: date]
|
||||
forKey: @"StartTime"];
|
||||
if (![apt isAllDay])
|
||||
[values setObject: [dateFormatter formattedTime: date]
|
||||
forKey: @"StartTime"];
|
||||
|
||||
date = [self newEndDate];
|
||||
[values setObject: [dateFormatter shortFormattedDate: date]
|
||||
forKey: @"EndDate"];
|
||||
[values setObject: [dateFormatter formattedTime: date]
|
||||
forKey: @"EndTime"];
|
||||
if (![apt isAllDay])
|
||||
[values setObject: [dateFormatter formattedTime: date]
|
||||
forKey: @"EndTime"];
|
||||
|
||||
description = [[self apt] comment];
|
||||
[values setObject: (description ? description : @"")
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* SOGoAptMailReceipt.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2009 Inverse inc.
|
||||
* Copyright (C) 2009-2012 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
*
|
||||
|
@ -146,9 +146,12 @@ static NSCharacterSet *wsSet = nil;
|
|||
|
||||
formatter = [currentUser dateFormatterInContext: context];
|
||||
|
||||
return [NSString stringWithFormat: @"%@ - %@",
|
||||
[formatter formattedDate: tzDate],
|
||||
[formatter formattedTime: tzDate]];
|
||||
if ([apt isAllDay])
|
||||
return [formatter formattedDate: tzDate];
|
||||
else
|
||||
return [NSString stringWithFormat: @"%@ - %@",
|
||||
[formatter formattedDate: tzDate],
|
||||
[formatter formattedTime: tzDate]];
|
||||
}
|
||||
|
||||
- (NSString *) aptStartDate
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2010 Inverse
|
||||
Copyright (C) 2010-2012 Inverse
|
||||
|
||||
This file is part of SOGo
|
||||
|
||||
|
@ -131,8 +131,10 @@
|
|||
date = [self oldStartDate];
|
||||
[values setObject: [dateFormatter shortFormattedDate: date]
|
||||
forKey: @"OldStartDate"];
|
||||
[values setObject: [dateFormatter formattedTime: date]
|
||||
forKey: @"OldStartTime"];
|
||||
|
||||
if (![apt isAllDay])
|
||||
[values setObject: [dateFormatter formattedTime: date]
|
||||
forKey: @"OldStartTime"];
|
||||
|
||||
[self _setupBodyValuesWithFormatter: dateFormatter];
|
||||
}
|
||||
|
@ -144,10 +146,16 @@
|
|||
if (!values)
|
||||
[self setupValues];
|
||||
|
||||
subjectFormat = [self labelForKey: @"The appointment \"%{Summary}\" for the"
|
||||
@" %{OldStartDate} at"
|
||||
@" %{OldStartTime} has changed"
|
||||
inContext: context];
|
||||
if ([values objectForKey: @"OldStartTime"])
|
||||
subjectFormat = [self labelForKey: (@"The appointment \"%{Summary}\" for the"
|
||||
@" %{OldStartDate} at"
|
||||
@" %{OldStartTime} has changed")
|
||||
inContext: context];
|
||||
else
|
||||
subjectFormat = [self labelForKey: (@"The appointment \"%{Summary}\" for the"
|
||||
@" %{OldStartDate}"
|
||||
@" has changed")
|
||||
inContext: context];
|
||||
|
||||
return [values keysWithFormat: subjectFormat];
|
||||
}
|
||||
|
|
|
@ -103,44 +103,51 @@
|
|||
sourceID = [udSource objectForKey: @"id"];
|
||||
if ([sourceID length] > 0)
|
||||
{
|
||||
type = [[udSource objectForKey: @"type"] lowercaseString];
|
||||
c = NSClassFromString([_registry sourceClassForType: type]);
|
||||
sogoSource = [c sourceFromUDSource: udSource inDomain: domain];
|
||||
if (sourceID)
|
||||
[_sources setObject: sogoSource forKey: sourceID];
|
||||
else
|
||||
[self errorWithFormat: @"id field missing in an user source,"
|
||||
@" check the SOGoUserSources defaults"];
|
||||
metadata = [NSMutableDictionary dictionary];
|
||||
if (domain)
|
||||
[metadata setObject: domain forKey: @"domain"];
|
||||
value = [udSource objectForKey: @"canAuthenticate"];
|
||||
if (value)
|
||||
[metadata setObject: value forKey: @"canAuthenticate"];
|
||||
value = [udSource objectForKey: @"isAddressBook"];
|
||||
if (value)
|
||||
{
|
||||
[metadata setObject: value forKey: @"isAddressBook"];
|
||||
isAddressBook = [value boolValue];
|
||||
}
|
||||
else
|
||||
isAddressBook = NO;
|
||||
value = [udSource objectForKey: @"displayName"];
|
||||
if (value)
|
||||
[metadata setObject: value forKey: @"displayName"];
|
||||
if ([_sourcesMetadata objectForKey: sourceID])
|
||||
[self errorWithFormat: @"attempted to register a contact/user source"
|
||||
@" with duplicated id (%@)", sourceID];
|
||||
else
|
||||
{
|
||||
if (isAddressBook)
|
||||
[self errorWithFormat: @"addressbook source '%@' has"
|
||||
@" no displayname", sourceID];
|
||||
type = [[udSource objectForKey: @"type"] lowercaseString];
|
||||
c = NSClassFromString([_registry sourceClassForType: type]);
|
||||
sogoSource = [c sourceFromUDSource: udSource inDomain: domain];
|
||||
if (sourceID)
|
||||
[_sources setObject: sogoSource forKey: sourceID];
|
||||
else
|
||||
[self errorWithFormat: @"id field missing in an user source,"
|
||||
@" check the SOGoUserSources defaults"];
|
||||
metadata = [NSMutableDictionary dictionary];
|
||||
if (domain)
|
||||
[metadata setObject: domain forKey: @"domain"];
|
||||
value = [udSource objectForKey: @"canAuthenticate"];
|
||||
if (value)
|
||||
[metadata setObject: value forKey: @"canAuthenticate"];
|
||||
value = [udSource objectForKey: @"isAddressBook"];
|
||||
if (value)
|
||||
{
|
||||
[metadata setObject: value forKey: @"isAddressBook"];
|
||||
isAddressBook = [value boolValue];
|
||||
}
|
||||
else
|
||||
isAddressBook = NO;
|
||||
value = [udSource objectForKey: @"displayName"];
|
||||
if (value)
|
||||
[metadata setObject: value forKey: @"displayName"];
|
||||
else
|
||||
{
|
||||
if (isAddressBook)
|
||||
[self errorWithFormat: @"addressbook source '%@' has"
|
||||
@" no displayname", sourceID];
|
||||
}
|
||||
value = [udSource objectForKey: @"MailFieldNames"];
|
||||
if (value)
|
||||
[metadata setObject: value forKey: @"MailFieldNames"];
|
||||
value = [udSource objectForKey: @"SearchFieldNames"];
|
||||
if (value)
|
||||
[metadata setObject: value forKey: @"SearchFieldNames"];
|
||||
|
||||
[_sourcesMetadata setObject: metadata forKey: sourceID];
|
||||
}
|
||||
value = [udSource objectForKey: @"MailFieldNames"];
|
||||
if (value)
|
||||
[metadata setObject: value forKey: @"MailFieldNames"];
|
||||
value = [udSource objectForKey: @"SearchFieldNames"];
|
||||
if (value)
|
||||
[metadata setObject: value forKey: @"SearchFieldNames"];
|
||||
[_sourcesMetadata setObject: metadata forKey: sourceID];
|
||||
}
|
||||
else
|
||||
[self errorWithFormat: @"attempted to register a contact/user source"
|
||||
|
|
|
@ -457,7 +457,7 @@
|
|||
{
|
||||
WOResponse *result;
|
||||
NSDictionary *data;
|
||||
NSCalendarDate *eventDate;
|
||||
NSCalendarDate *eventStartDate, *eventEndDate;
|
||||
NSTimeZone *timeZone;
|
||||
SOGoUserDefaults *ud;
|
||||
SOGoCalendarComponent *co;
|
||||
|
@ -469,8 +469,10 @@
|
|||
result = [self responseWithStatus: 200];
|
||||
ud = [[context activeUser] userDefaults];
|
||||
timeZone = [ud timeZone];
|
||||
eventDate = [event startDate];
|
||||
[eventDate setTimeZone: timeZone];
|
||||
eventStartDate = [event startDate];
|
||||
eventEndDate = [event endDate];
|
||||
[eventStartDate setTimeZone: timeZone];
|
||||
[eventEndDate setTimeZone: timeZone];
|
||||
co = [self clientObject];
|
||||
|
||||
if (!componentCalendar)
|
||||
|
@ -507,8 +509,10 @@
|
|||
data = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[componentCalendar displayName], @"calendar",
|
||||
[event tag], @"component",
|
||||
[dateFormatter formattedDate: eventDate], @"startDate",
|
||||
[dateFormatter formattedTime: eventDate], @"startTime",
|
||||
[dateFormatter formattedDate: eventStartDate], @"startDate",
|
||||
[dateFormatter formattedTime: eventStartDate], @"startTime",
|
||||
[dateFormatter formattedDate: eventEndDate], @"endDate",
|
||||
[dateFormatter formattedTime: eventEndDate], @"endTime",
|
||||
([event hasRecurrenceRules] ? @"1": @"0"), @"isRecurring",
|
||||
([event isAllDay] ? @"1": @"0"), @"isAllDay",
|
||||
[event summary], @"summary",
|
||||
|
|
Loading…
Reference in New Issue