propagate from branch 'ca.inverse.sogo.1_3_16' (head d29498142c4a9f1d780373bd5f0d80b17f6e2c33)

to branch 'ca.inverse.sogo' (head 7ce650138898448e808ecf1785eedab0ad0d3e6d)

Monotone-Parent: 7ce650138898448e808ecf1785eedab0ad0d3e6d
Monotone-Parent: d29498142c4a9f1d780373bd5f0d80b17f6e2c33
Monotone-Revision: 41c57dcc45ba83665003200a0ea8b1cc14d09eec

Monotone-Author: ludovic@Sophos.ca
Monotone-Date: 2012-05-30T12:46:26
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Ludovic Marcotte 2012-05-30 12:46:26 +00:00
commit f0d028a858
24 changed files with 195 additions and 136 deletions

View file

@ -1,3 +1,29 @@
2012-05-29 Francis Lachapelle <flachapelle@inverse.ca>
* UI/WebServerResources/UIxMailEditor.js (validateEditorInput):
merged with onValidate.
(onValidate): don't force the subject to be defined, but alert
the user.
* UI/MailerUI/UIxMailView.m (-messageSubject): don't set the
subject to "Untitled" if it's not set.
* UI/MailPartViewers/UIxMailPartMessageViewer.m (-messageSubject): idem.
* UI/MailerUI/UIxMailEditor.m (-validateForSend): don't force the
subject to be defined.
* SoObjects/Mailer/SOGoMailObject+Draft.m (-subjectForReply): make
sure subject is a defined value to avoid "null" strings in the
reply message.
2012-05-28 Francis Lachapelle <flachapelle@inverse.ca>
* UI/WebServerResources/SchedulerUI.js (validateUploadForm): hide
Cancel button when the form is valid and disable the Submit button.
* UI/WebServerResources/ContactsUI.js (validateUploadForm): idem.
2012-05-24 Jean Raby <jraby@inverse.ca> 2012-05-24 Jean Raby <jraby@inverse.ca>
* debian*/rules: Restart sogod after pkg upgrade (dh_installinit -R) * debian*/rules: Restart sogod after pkg upgrade (dh_installinit -R)
@ -35,7 +61,7 @@
to read its freebusy info. to read its freebusy info.
Without this, sogo would always auto-accept invitations from 'unprivileged' Without this, sogo would always auto-accept invitations from 'unprivileged'
users, potentially bypassing the multiplebooking parameter. users, potentially bypassing the multiplebooking parameter.
2012-05-14 Wolfgang Sourdeau <wsourdeau@inverse.ca> 2012-05-14 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/gen-property-selectors.py: "bannedProps" is now a * OpenChange/gen-property-selectors.py: "bannedProps" is now a
@ -105,7 +131,7 @@
* OpenChange/MAPIStoreSOGo.m: register and unregister current * OpenChange/MAPIStoreSOGo.m: register and unregister current
thread before and after each backend operation, in order to avoid thread before and after each backend operation, in order to avoid
issues in multithreaded environment. issues in multithreaded environment.
2012-05-01 Wolfgang Sourdeau <wsourdeau@inverse.ca> 2012-05-01 Wolfgang Sourdeau <wsourdeau@inverse.ca>

View file

@ -354,7 +354,7 @@ static NGCardsSaxHandler *sax = nil;
- (void) setChildrenAsCopy: (NSMutableArray *) someChildren - (void) setChildrenAsCopy: (NSMutableArray *) someChildren
{ {
unsigned int count, max; NSUInteger count, max;
ASSIGN (children, someChildren); ASSIGN (children, someChildren);
@ -399,7 +399,7 @@ static NGCardsSaxHandler *sax = nil;
- (NSString *) description - (NSString *) description
{ {
NSMutableString *str; NSMutableString *str;
unsigned int count, max; NSUInteger count, max;
str = [NSMutableString stringWithCapacity:64]; str = [NSMutableString stringWithCapacity:64];
[str appendFormat:@"<%p[%@]:%@", [str appendFormat:@"<%p[%@]:%@",
@ -421,7 +421,7 @@ static NGCardsSaxHandler *sax = nil;
- (void) replaceThisElement: (CardElement *) oldElement - (void) replaceThisElement: (CardElement *) oldElement
withThisOne: (CardElement *) newElement withThisOne: (CardElement *) newElement
{ {
unsigned int index; NSUInteger index;
index = [children indexOfObject: oldElement]; index = [children indexOfObject: oldElement];
if (index != NSNotFound) if (index != NSNotFound)

View file

@ -1,3 +1,17 @@
2012-05-30 Francis Lachapelle <flachapelle@inverse.ca>
* iCalRepeatableEntityObject.m (-exceptionDatesWithTimeZone:)
(-rules:withTimeZone:): exception dates and exception rules must
also be adjusted for floating all-day repeating events.
2012-05-29 Francis Lachapelle <flachapelle@inverse.ca>
* iCalRecurrenceCalculator.m
(_removeExceptionDatesFromRanges:withDates:withinRange:startingWithDate:):
when removing exception dates, avoid removing dates matching the
end date of the occurrence. This fixes an issue with all-day
daily events.
2012-04-23 Wolfgang Sourdeau <wsourdeau@inverse.ca> 2012-04-23 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* iCalMonthlyRecurrenceCalculator.m (NGMonthDaySet_clear): make * iCalMonthlyRecurrenceCalculator.m (NGMonthDaySet_clear): make

View file

@ -189,6 +189,7 @@ static Class yearlyCalcClass = Nil;
NSCalendarDate *currentDate; NSCalendarDate *currentDate;
NGCalendarDateRange *currentRange; NGCalendarDateRange *currentRange;
unsigned int count, maxRanges; unsigned int count, maxRanges;
NSComparisonResult compare;
dates = [[self _dates: exdates withinRange: limits] objectEnumerator]; dates = [[self _dates: exdates withinRange: limits] objectEnumerator];
while ((currentDate = [dates nextObject])) while ((currentDate = [dates nextObject]))
@ -197,8 +198,12 @@ static Class yearlyCalcClass = Nil;
for (count = maxRanges; count > 0; count--) for (count = maxRanges; count > 0; count--)
{ {
currentRange = [ranges objectAtIndex: count - 1]; currentRange = [ranges objectAtIndex: count - 1];
if ([currentRange containsDate: currentDate]) compare = [[currentRange startDate] compare: currentDate];
[ranges removeObjectAtIndex: count - 1]; if ((compare == NSOrderedAscending || compare == NSOrderedSame) &&
[[currentRange endDate] compare: currentDate] == NSOrderedDescending)
{
[ranges removeObjectAtIndex: count - 1];
}
} }
} }
} }

View file

@ -42,21 +42,21 @@
- (void)setRecurrenceRules:(NSArray *)_rrule; - (void)setRecurrenceRules:(NSArray *)_rrule;
- (BOOL)hasRecurrenceRules; - (BOOL)hasRecurrenceRules;
- (NSArray *)recurrenceRules; - (NSArray *)recurrenceRules;
- (NSArray *)recurrenceRulesWithTimeZone: (iCalTimeZone *) timezone; - (NSArray *)recurrenceRulesWithTimeZone: (id) timezone;
- (void)removeAllExceptionRules; - (void)removeAllExceptionRules;
- (void)addToExceptionRules:(id)_rrule; - (void)addToExceptionRules:(id)_rrule;
- (BOOL)hasExceptionRules; - (BOOL)hasExceptionRules;
- (NSArray *)exceptionRules; - (NSArray *)exceptionRules;
- (NSArray *)exceptionRulesWithTimeZone: (iCalTimeZone *) timezone; - (NSArray *)exceptionRulesWithTimeZone: (id) timezone;
- (void)removeAllExceptionDates; - (void)removeAllExceptionDates;
- (void)addToExceptionDates:(NSCalendarDate *)_date; - (void)addToExceptionDates:(NSCalendarDate *)_date;
- (BOOL)hasExceptionDates; - (BOOL)hasExceptionDates;
- (NSArray *)exceptionDates; - (NSArray *)exceptionDates;
- (NSArray *)exceptionDatesWithTimeZone: (iCalTimeZone*) theTimeZone; - (NSArray *)exceptionDatesWithTimeZone: (id) theTimeZone;
- (NSArray *) rules: (NSArray *) theRules withTimeZone: (iCalTimeZone *) theTimeZone; - (NSArray *) rules: (NSArray *) theRules withTimeZone: (id) theTimeZone;
- (BOOL)isRecurrent; - (BOOL)isRecurrent;
- (BOOL)isWithinCalendarDateRange:(NGCalendarDateRange *)_range - (BOOL)isWithinCalendarDateRange:(NGCalendarDateRange *)_range

View file

@ -1,6 +1,6 @@
/* /*
Copyright (C) 2004-2005 SKYRIX Software AG Copyright (C) 2004-2005 SKYRIX Software AG
Copyright (C) 2011 Inverse inc. Copyright (C) 2012 Inverse inc.
This file is part of SOPE. This file is part of SOPE.
@ -24,10 +24,12 @@
#import <Foundation/NSCalendarDate.h> #import <Foundation/NSCalendarDate.h>
#import <Foundation/NSEnumerator.h> #import <Foundation/NSEnumerator.h>
#import <Foundation/NSString.h> #import <Foundation/NSString.h>
#import <Foundation/NSTimeZone.h>
#import <NGExtensions/NGCalendarDateRange.h> #import <NGExtensions/NGCalendarDateRange.h>
#import "NSCalendarDate+NGCards.h" #import "NSCalendarDate+NGCards.h"
#import "NSString+NGCards.h"
#import "iCalDateTime.h" #import "iCalDateTime.h"
#import "iCalEvent.h" #import "iCalEvent.h"
#import "iCalTimeZone.h" #import "iCalTimeZone.h"
@ -79,7 +81,7 @@
return [self childrenWithTag: @"rrule"]; return [self childrenWithTag: @"rrule"];
} }
- (NSArray *) recurrenceRulesWithTimeZone: (iCalTimeZone *) timezone - (NSArray *) recurrenceRulesWithTimeZone: (id) timezone
{ {
NSArray *rules; NSArray *rules;
@ -113,7 +115,7 @@
return [self childrenWithTag: @"exrule"]; return [self childrenWithTag: @"exrule"];
} }
- (NSArray *) exceptionRulesWithTimeZone: (iCalTimeZone *) timezone - (NSArray *) exceptionRulesWithTimeZone: (id) timezone
{ {
NSArray *rules; NSArray *rules;
@ -131,12 +133,13 @@
* @see exceptionRulesWithTimeZone: * @see exceptionRulesWithTimeZone:
* @return a new array of iCalRecurrenceRule instances, adjusted for the timezone. * @return a new array of iCalRecurrenceRule instances, adjusted for the timezone.
*/ */
- (NSArray *) rules: (NSArray *) theRules withTimeZone: (iCalTimeZone *) theTimeZone - (NSArray *) rules: (NSArray *) theRules withTimeZone: (id) theTimeZone
{ {
NSArray *rules; NSArray *rules;
NSCalendarDate *untilDate; NSCalendarDate *untilDate;
NSMutableArray *fixedRules; NSMutableArray *fixedRules;
iCalRecurrenceRule *currentRule; iCalRecurrenceRule *currentRule;
int offset;
unsigned int max, count; unsigned int max, count;
rules = theRules; rules = theRules;
@ -152,7 +155,14 @@
untilDate = [currentRule untilDate]; untilDate = [currentRule untilDate];
if (untilDate) if (untilDate)
{ {
untilDate = [theTimeZone computedDateForDate: untilDate]; if ([theTimeZone isKindOfClass: [iCalTimeZone class]])
untilDate = [(iCalTimeZone *) theTimeZone computedDateForDate: untilDate];
else
{
offset = [(NSTimeZone *) theTimeZone secondsFromGMTForDate: untilDate];
untilDate = (NSCalendarDate *) [untilDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0
seconds:-offset];
}
[currentRule setUntilDate: untilDate]; [currentRule setUntilDate: untilDate];
} }
[fixedRules addObject: currentRule]; [fixedRules addObject: currentRule];
@ -232,12 +242,13 @@
* @see [iCalTimeZone computedDatesForStrings:] * @see [iCalTimeZone computedDatesForStrings:]
* @return the exception dates, adjusted to the timezone. * @return the exception dates, adjusted to the timezone.
*/ */
- (NSArray *) exceptionDatesWithTimeZone: (iCalTimeZone *) theTimeZone - (NSArray *) exceptionDatesWithTimeZone: (id) theTimeZone
{ {
NSArray *dates, *exDates; NSArray *dates, *exDates;
NSEnumerator *dateList; NSEnumerator *dateList;
NSCalendarDate *exDate; NSCalendarDate *exDate;
NSString *dateString; NSString *dateString;
int offset;
unsigned i; unsigned i;
if (theTimeZone) if (theTimeZone)
@ -251,9 +262,19 @@
for (i = 0; i < [exDates count]; i++) for (i = 0; i < [exDates count]; i++)
{ {
dateString = [exDates objectAtIndex: i]; dateString = [exDates objectAtIndex: i];
exDate = [theTimeZone computedDateForString: dateString]; if ([theTimeZone isKindOfClass: [iCalTimeZone class]])
{
exDate = [(iCalTimeZone *) theTimeZone computedDateForString: dateString];
}
else
{
exDate = [dateString asCalendarDate];
offset = [(NSTimeZone *) theTimeZone secondsFromGMTForDate: exDate];
exDate = (NSCalendarDate *) [exDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0
seconds:-offset];
}
[(NSMutableArray *) dates addObject: exDate]; [(NSMutableArray *) dates addObject: exDate];
} }
} }
} }
else else

View file

@ -125,9 +125,7 @@
NSArray *ranges; NSArray *ranges;
NGCalendarDateRange *checkRange, *firstRange; NGCalendarDateRange *checkRange, *firstRange;
NSCalendarDate *startDate, *endDate; NSCalendarDate *startDate, *endDate;
NSTimeZone *timeZone; id firstStartDate, firstEndDate, timeZone;
id firstStartDate, firstEndDate;
iCalTimeZone *eventTimeZone;
BOOL doesOccur; BOOL doesOccur;
int offset; int offset;
@ -139,9 +137,11 @@
// Set the range to check with respect to the event timezone (extracted from the start date) // Set the range to check with respect to the event timezone (extracted from the start date)
firstStartDate = (iCalDateTime *)[self uniqueChildWithTag: @"dtstart"]; firstStartDate = (iCalDateTime *)[self uniqueChildWithTag: @"dtstart"];
eventTimeZone = [(iCalDateTime *)firstStartDate timeZone]; timeZone = [(iCalDateTime *)firstStartDate timeZone];
if (eventTimeZone) if (timeZone)
startDate = [eventTimeZone computedDateForDate: theOccurenceDate]; {
startDate = [(iCalTimeZone *)timeZone computedDateForDate: theOccurenceDate];
}
else else
{ {
startDate = theOccurenceDate; startDate = theOccurenceDate;
@ -150,13 +150,14 @@
// The event lasts all-day and has no timezone (floating); we convert the range of the first event // The event lasts all-day and has no timezone (floating); we convert the range of the first event
// to the occurence's timezone. // to the occurence's timezone.
timeZone = [theOccurenceDate timeZone]; timeZone = [theOccurenceDate timeZone];
offset = [timeZone secondsFromGMTForDate: [firstRange startDate]]; offset = [(NSTimeZone *)timeZone secondsFromGMTForDate: [firstRange startDate]];
firstStartDate = (NSCalendarDate *)[[firstRange startDate] dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 firstStartDate = (NSCalendarDate *)[[firstRange startDate] dateByAddingYears:0 months:0 days:0 hours:0 minutes:0
seconds:-offset]; seconds:-offset];
firstEndDate = (NSCalendarDate *)[[firstRange endDate] dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 firstEndDate = (NSCalendarDate *)[[firstRange endDate] dateByAddingYears:0 months:0 days:0 hours:0 minutes:0
seconds:-offset]; seconds:-offset];
[(NSCalendarDate *)firstStartDate setTimeZone: timeZone]; [(NSCalendarDate *)firstStartDate setTimeZone: timeZone];
[(NSCalendarDate *)firstEndDate setTimeZone: timeZone]; [(NSCalendarDate *)firstEndDate setTimeZone: timeZone];
firstRange = [NGCalendarDateRange calendarDateRangeWithStartDate: firstStartDate firstRange = [NGCalendarDateRange calendarDateRangeWithStartDate: firstStartDate
endDate: firstEndDate]; endDate: firstEndDate];
} }
@ -168,9 +169,9 @@
// Calculate the occurrences for the given date // Calculate the occurrences for the given date
ranges = [iCalRecurrenceCalculator recurrenceRangesWithinCalendarDateRange: checkRange ranges = [iCalRecurrenceCalculator recurrenceRangesWithinCalendarDateRange: checkRange
firstInstanceCalendarDateRange: firstRange firstInstanceCalendarDateRange: firstRange
recurrenceRules: [self recurrenceRulesWithTimeZone: eventTimeZone] recurrenceRules: [self recurrenceRulesWithTimeZone: timeZone]
exceptionRules: [self exceptionRulesWithTimeZone: eventTimeZone] exceptionRules: [self exceptionRulesWithTimeZone: timeZone]
exceptionDates: [self exceptionDatesWithTimeZone: eventTimeZone]]; exceptionDates: [self exceptionDatesWithTimeZone: timeZone]];
doesOccur = [ranges dateRangeArrayContainsDate: startDate]; doesOccur = [ranges dateRangeArrayContainsDate: startDate];
} }

View file

@ -53,12 +53,14 @@
nil nil
}; };
BOOL hasPrefix; BOOL hasPrefix;
unsigned int i; NSUInteger i;
NSString *subject, *newSubject; NSString *subject, *newSubject;
hasPrefix = NO; hasPrefix = NO;
subject = [self decodedSubject]; subject = [self decodedSubject];
if (![subject length]) subject = @"";
i = 0; i = 0;
while (!hasPrefix && replyPrefixes[i]) while (!hasPrefix && replyPrefixes[i])
if ([subject hasPrefix: replyPrefixes[i]]) if ([subject hasPrefix: replyPrefixes[i]])
@ -99,7 +101,7 @@
NSDictionary *parts; NSDictionary *parts;
NSString *rawPart, *content, *contentKey; NSString *rawPart, *content, *contentKey;
SOGoUserDefaults *ud; SOGoUserDefaults *ud;
int index; NSUInteger index;
BOOL htmlComposition, htmlContent; BOOL htmlComposition, htmlContent;
content = @""; content = @"";
@ -189,7 +191,7 @@
static NSString *sescape[] = { static NSString *sescape[] = {
@"/", @"..", @"~", @"\"", @"'", @" ", @".", nil @"/", @"..", @"~", @"\"", @"'", @" ", @".", nil
}; };
unsigned int count, length; NSUInteger count, length;
subject = [self decodedSubject]; subject = [self decodedSubject];
length = [subject length]; length = [subject length];
@ -298,7 +300,7 @@
NSString *newPath; NSString *newPath;
NSArray *subparts; NSArray *subparts;
NSString *type; NSString *type;
unsigned int i; NSUInteger i;
type = [[part objectForKey: @"type"] lowercaseString]; type = [[part objectForKey: @"type"] lowercaseString];
if ([type isEqualToString: @"multipart"]) if ([type isEqualToString: @"multipart"])

View file

@ -471,7 +471,8 @@ static int cssEscapingCount;
- (int) timeValue - (int) timeValue
{ {
int i, time; int time;
NSInteger i;
if ([self length] > 0) if ([self length] > 0)
{ {

View file

@ -198,6 +198,7 @@
"Import Cards" = "Import Cards"; "Import Cards" = "Import Cards";
"Select a vCard or LDIF file." = "Select a vCard or LDIF file."; "Select a vCard or LDIF file." = "Select a vCard or LDIF file.";
"Upload" = "Upload"; "Upload" = "Upload";
"Uploading" = "Uploading";
"Done" = "Done"; "Done" = "Done";
"An error occured while importing contacts." = "An error occured while importing contacts."; "An error occured while importing contacts." = "An error occured while importing contacts.";
"No card was imported." = "No card was imported."; "No card was imported." = "No card was imported.";

View file

@ -43,7 +43,7 @@
@interface UIxMailPartAlternativeViewer : UIxMailPartViewer @interface UIxMailPartAlternativeViewer : UIxMailPartViewer
{ {
id childInfo; id childInfo;
unsigned int childIndex; NSUInteger childIndex;
} }
@end @end
@ -70,7 +70,7 @@
- (NSArray *) childPartTypes - (NSArray *) childPartTypes
{ {
NSMutableArray *types; NSMutableArray *types;
unsigned i, count; NSUInteger i, count;
NSArray *childParts; NSArray *childParts;
childParts = [[self bodyInfo] valueForKey:@"parts"]; childParts = [[self bodyInfo] valueForKey:@"parts"];
@ -89,10 +89,10 @@
return types; return types;
} }
- (unsigned int) _preferredTypesPart: (NSArray *) types - (NSUInteger) _preferredTypesPart: (NSArray *) types
{ {
unsigned int count, max; NSUInteger count, max;
unsigned int part; NSUInteger part;
const NSString *priorities[] = { @"multipart/related", @"multipart/mixed", const NSString *priorities[] = { @"multipart/related", @"multipart/mixed",
@"text/calendar", @"text/html", @"text/calendar", @"text/html",
@"text/plain" }; @"text/plain" };
@ -113,7 +113,7 @@
- (int) _selectPartIndexFromTypes: (NSArray *) _types - (int) _selectPartIndexFromTypes: (NSArray *) _types
{ {
/* returns the index of the selected part or NSNotFound */ /* returns the index of the selected part or NSNotFound */
unsigned count, max, part; NSUInteger count, max, part;
part = [self _preferredTypesPart: _types]; part = [self _preferredTypesPart: _types];
if (part == NSNotFound) if (part == NSNotFound)
@ -136,7 +136,7 @@
- (void) selectChildInfo - (void) selectChildInfo
{ {
unsigned idx; NSUInteger idx;
[childInfo release]; childInfo = nil; [childInfo release]; childInfo = nil;
childIndex = 0; childIndex = 0;
@ -164,7 +164,7 @@
return childInfo; return childInfo;
} }
- (unsigned int) childIndex - (NSUInteger) childIndex
{ {
if (!childIndex) if (!childIndex)
[self selectChildInfo]; [self selectChildInfo];
@ -176,7 +176,7 @@
{ {
char buf[8]; char buf[8];
sprintf (buf, "%d", [self childIndex] + 1); sprintf (buf, "%"PRIuPTR"", [self childIndex] + 1);
return [NSString stringWithCString:buf]; return [NSString stringWithCString:buf];
} }

View file

@ -165,7 +165,7 @@
subject = [baseSubject decodedHeader]; subject = [baseSubject decodedHeader];
if (![subject length]) if (![subject length])
subject = [self labelForKey: @"Untitled"]; subject = @"";
return subject; return subject;
} }

View file

@ -283,9 +283,9 @@
= "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; = "The messages could not be moved to the trash folder. Would you like to delete them immediately?";
/* Message editing */ /* Message editing */
"error_validationfailed" = "Validation failed"; "error_missingsubject" = "The message has no subject. Are you sure you want to send it?";
"error_missingsubject" = "Subject is missing"; "error_missingrecipients" = "Please specify at least one recipient.";
"error_missingrecipients" = "No recipients specified"; "Send Anyway" = "Send Anyway";
/* Message sending */ /* Message sending */
"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; "cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid.";

View file

@ -394,7 +394,7 @@ static NSArray *infoKeys = nil;
{ {
if (![_info isNotNull]) return; if (![_info isNotNull]) return;
[self debugWithFormat:@"loading info ..."]; [self debugWithFormat:@"loading info ..."];
[self takeValuesFromDictionary:_info]; [self setValuesForKeysWithDictionary:_info];
} }
- (NSDictionary *) storeInfo - (NSDictionary *) storeInfo
@ -653,10 +653,7 @@ static NSArray *infoKeys = nil;
if (![self hasOneOrMoreRecipients]) if (![self hasOneOrMoreRecipients])
error = [NSException exceptionWithHTTPStatus: 400 /* Bad Request */ error = [NSException exceptionWithHTTPStatus: 400 /* Bad Request */
reason: @"Please select a recipient!"]; reason: [self labelForKey: @"error_missingrecipients"]];
else if ([[self subject] length] == 0)
error = [NSException exceptionWithHTTPStatus: 400 /* Bad Request */
reason: @"Please set a subject!"];
else else
error = nil; error = nil;

View file

@ -192,7 +192,7 @@
baseSubject = [[message valueForKey: @"envelope"] subject]; baseSubject = [[message valueForKey: @"envelope"] subject];
subject = [baseSubject decodedHeader]; subject = [baseSubject decodedHeader];
if (![subject length]) if (![subject length])
subject = [self labelForKey: @"Untitled"]; subject = @"";
return [subject stringByEscapingHTMLString]; return [subject stringByEscapingHTMLString];
} }

View file

@ -125,8 +125,8 @@
// TODO: this is ugly, create reusable link facility in SOPE // TODO: this is ugly, create reusable link facility in SOPE
// TODO: remove 'search' and 'filterpopup', preserve sorting // TODO: remove 'search' and 'filterpopup', preserve sorting
NSMutableString *ms; NSMutableString *ms;
NSArray *qp; NSArray *qp;
unsigned i, count; NSUInteger i, count;
qp = [[u substringFromIndex:(r.location + r.length)] qp = [[u substringFromIndex:(r.location + r.length)]
componentsSeparatedByString:@"&"]; componentsSeparatedByString:@"&"];
@ -193,8 +193,8 @@
SOGoMailAccounts *co; SOGoMailAccounts *co;
SOGoContactFolders *folders; SOGoContactFolders *folders;
SOGoParentFolder *folder; SOGoParentFolder *folder;
WORequest *request; WORequest *request;
int i, count; NSUInteger i, count;
parameters = nil; parameters = nil;
co = [self clientObject]; co = [self clientObject];
@ -549,7 +549,7 @@
NSArray *available; NSArray *available;
NSDictionary *metaData; NSDictionary *metaData;
SOGoUserDefaults *ud; SOGoUserDefaults *ud;
unsigned int i; NSUInteger i;
if (!columnsOrder) if (!columnsOrder)
{ {
@ -636,8 +636,8 @@
NSMutableArray *folders; NSMutableArray *folders;
NSMutableString *path; NSMutableString *path;
SOGoUserDefaults *ud; SOGoUserDefaults *ud;
NSString *s; NSString *s;
int i, j, k; NSUInteger i, j, k;
ud = [[context activeUser] userDefaults]; ud = [[context activeUser] userDefaults];
folders = [NSMutableArray array]; folders = [NSMutableArray array];

View file

@ -96,8 +96,6 @@ static NSString *mailETag = nil;
NSString *subject; NSString *subject;
subject = [[self clientObject] decodedSubject]; subject = [[self clientObject] decodedSubject];
if (![subject length])
subject = [self labelForKey: @"Untitled"];
return subject; return subject;
} }

View file

@ -110,6 +110,7 @@
"Import Events" = "Import Events"; "Import Events" = "Import Events";
"Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics)."; "Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics).";
"Upload" = "Upload"; "Upload" = "Upload";
"Uploading" = "Uploading";
"Publish Calendar..." = "Publish Calendar..."; "Publish Calendar..." = "Publish Calendar...";
"Reload Remote Calendars" = "Reload Remote Calendars"; "Reload Remote Calendars" = "Reload Remote Calendars";
"Properties" = "Properties"; "Properties" = "Properties";

View file

@ -118,7 +118,7 @@
- (NSArray *) filterAppointments:(NSArray *) _apts - (NSArray *) filterAppointments:(NSArray *) _apts
{ {
NSMutableArray *filtered; NSMutableArray *filtered;
unsigned i, count, p, pCount; NSUInteger i, count, p, pCount;
NSString *email, *partmailsString, *state, *pEmail; NSString *email, *partmailsString, *state, *pEmail;
NSDictionary *info, *primaryIdentity; NSDictionary *info, *primaryIdentity;
NSArray *partmails, *partstates; NSArray *partmails, *partstates;
@ -370,7 +370,7 @@
{ {
NSArray *apts; NSArray *apts;
NSMutableArray *filtered; NSMutableArray *filtered;
unsigned i, count; NSUInteger i, count;
if (allDayApts) if (allDayApts)
return allDayApts; return allDayApts;
@ -532,7 +532,8 @@
NSString *uidsString, *loc, *prevMethod, *userFolderID; NSString *uidsString, *loc, *prevMethod, *userFolderID;
id <WOActionResults> r; id <WOActionResults> r;
BOOL useGroups; BOOL useGroups;
unsigned index; NSUInteger index;
uidsString = [self queryParameterForKey: @"userUIDString"]; uidsString = [self queryParameterForKey: @"userUIDString"];
uidsString = [uidsString stringByTrimmingSpaces]; uidsString = [uidsString stringByTrimmingSpaces];

View file

@ -525,7 +525,7 @@ iRANGE(2);
iCalTrigger *aTrigger; iCalTrigger *aTrigger;
NSString *duration, *quantity; NSString *duration, *quantity;
unichar c; unichar c;
unsigned int i; NSUInteger i;
if ([component hasAlarms]) if ([component hasAlarms])
{ {
@ -1289,7 +1289,7 @@ iRANGE(2);
NSString *currentOwner; NSString *currentOwner;
SOGoAppointmentFolder *currentCalendar; SOGoAppointmentFolder *currentCalendar;
SOGoUser *currentUser; SOGoUser *currentUser;
unsigned i; NSUInteger i;
calendars = [self calendarList]; calendars = [self calendarList];
owners = [NSMutableArray arrayWithCapacity: [calendars count]]; owners = [NSMutableArray arrayWithCapacity: [calendars count]];
@ -1562,7 +1562,7 @@ RANGE(2);
{ {
NSString *cycleRep; NSString *cycleRep;
NSArray *cycles; NSArray *cycles;
unsigned i, count; NSUInteger i, count;
if (!_rrule) if (!_rrule)
return [[self cycles] objectAtIndex:0]; return [[self cycles] objectAtIndex:0];
@ -1721,7 +1721,7 @@ RANGE(2);
// s = [self queryParameterForKey:_qp]; // s = [self queryParameterForKey:_qp];
// if(s && [s length] > 0) { // if(s && [s length] > 0) {
// NSArray *es; // NSArray *es;
// unsigned i, count; // NSUInteger i, count;
// es = [s componentsSeparatedByString: @","]; // es = [s componentsSeparatedByString: @","];
// count = [es count]; // count = [es count];
@ -1766,7 +1766,7 @@ RANGE(2);
- (void) _handleAttendeesEdition - (void) _handleAttendeesEdition
{ {
NSMutableArray *newAttendees; NSMutableArray *newAttendees;
unsigned int count, max; NSUInteger count, max;
NSString *currentEmail; NSString *currentEmail;
iCalPerson *currentAttendee; iCalPerson *currentAttendee;
NSString *json, *role, *partstat; NSString *json, *role, *partstat;
@ -2189,7 +2189,7 @@ RANGE(2);
iCalTrigger *aTrigger; iCalTrigger *aTrigger;
iCalAlarm *anAlarm; iCalAlarm *anAlarm;
NSString *aValue; NSString *aValue;
unsigned int index; NSUInteger index;
anAlarm = [iCalAlarm new]; anAlarm = [iCalAlarm new];

View file

@ -12,25 +12,6 @@ var Contact = {
deleteContactsRequestCount: null deleteContactsRequestCount: null
}; };
function validateEditorInput(sender) {
var errortext = "";
var field;
field = document.pageform.subject;
if (field.value == "")
errortext = errortext + labels.error_missingsubject + "\n";
if (!hasRecipients())
errortext = errortext + labels.error_missingrecipients + "\n";
if (errortext.length > 0) {
alert(labels.error_validationfailed + ":\n"
+ errortext);
return false;
}
return true;
}
function openContactsFolder(contactsFolder, reload, idx) { function openContactsFolder(contactsFolder, reload, idx) {
if ((contactsFolder && contactsFolder != Contact.currentAddressBook) if ((contactsFolder && contactsFolder != Contact.currentAddressBook)
|| reload) { || reload) {
@ -799,13 +780,21 @@ function hideImportResults () {
} }
function validateUploadForm () { function validateUploadForm () {
rc = false; rc = false;
if ($("contactsFile").value.length) if ($("contactsFile").value.length) {
var btn = jQuery('#uploadSubmit');
jQuery('#uploadCancel').fadeOut('fast');
btn.addClass("disabled");
btn.children('span').text(_('Uploading'));
rc = true; rc = true;
}
return rc; return rc;
} }
function uploadCompleted(response) { function uploadCompleted(response) {
data = response.evalJSON(true); data = response.evalJSON(true);
jQuery('#uploadCancel').show();
var btn = jQuery('#uploadSubmit');
btn.removeClass("disabled");
btn.children('span').text(_('Upload'));
var div = $("uploadResults"); var div = $("uploadResults");
if (data.imported <= 0) if (data.imported <= 0)
$("uploadResultsContent").update(_("An error occured while importing contacts.")); $("uploadResultsContent").update(_("An error occured while importing contacts."));

View file

@ -2849,13 +2849,21 @@ function hideImportResults(event) {
} }
function validateUploadForm() { function validateUploadForm() {
rc = false; rc = false;
if ($("calendarFile").value.length) if ($("calendarFile").value.length) {
var btn = jQuery('#uploadSubmit');
jQuery('#uploadCancel').fadeOut('fast');
btn.addClass("disabled");
btn.children('span').text(_('Uploading'));
rc = true; rc = true;
}
return rc; return rc;
} }
function uploadCompleted(response) { function uploadCompleted(response) {
data = response.evalJSON(true); data = response.evalJSON(true);
jQuery('#uploadCancel').show();
var btn = jQuery('#uploadSubmit');
btn.removeClass("disabled");
btn.children('span').text(_('Upload'));
var div = $("uploadResults"); var div = $("uploadResults");
if (data.imported < 0) if (data.imported < 0)
$("uploadResultsContent").update(_("An error occurred while importing calendar.")); $("uploadResultsContent").update(_("An error occurred while importing calendar."));

View file

@ -237,7 +237,7 @@ TABLE#contactsList TD#mailHeader
DIV.contactSelection DIV.contactSelection
{ {
z-index: 10; z-index: 1;
background: inherit; background: inherit;
position: absolute; position: absolute;
bottom: 0em; bottom: 0em;

View file

@ -107,51 +107,45 @@ function insertContact(inputNode, contactName, contactEmail) {
/* mail editor */ /* mail editor */
function validateEditorInput() { function onValidate(onSuccess) {
var errortext = ""; if (document.pageform.action != "send") {
var field;
if (!hasRecipients()) {
field = document.pageform.subject; showAlertDialog(_("error_missingrecipients"));
if (field.value == "") }
errortext = errortext + _("error_missingsubject") + "\n"; else if (document.pageform.subject.value == "") {
showConfirmDialog(_("Warning"), _("error_missingsubject"), onValidateDone.bind(this, onSuccess), null, _("Send anyway"), _("Cancel"));
if (!hasRecipients()) }
errortext = errortext + _("error_missingrecipients") + "\n"; else {
onValidateDone(onSuccess);
if (errortext.length > 0) { }
alert(_("error_validationfailed") + ":\n" + errortext);
return false;
} }
return true;
} }
function onValidate(event) { function onValidateDone(onSuccess) {
var rc = false; var input = currentAttachmentInput();
if (input)
input.parentNode.removeChild(input);
if (document.pageform.action != "send" var toolbar = document.getElementById("toolbar");
&& validateEditorInput()) { if (!document.busyAnim)
var input = currentAttachmentInput(); document.busyAnim = startAnimation(toolbar);
if (input)
input.parentNode.removeChild(input);
var toolbar = document.getElementById("toolbar");
if (!document.busyAnim)
document.busyAnim = startAnimation(toolbar);
var lastRow = $("lastRow");
lastRow.down("select").name = "popup_last";
window.shouldPreserve = true; var lastRow = $("lastRow");
lastRow.down("select").name = "popup_last";
window.shouldPreserve = true;
document.pageform.action = "send";
AIM.submit($(document.pageform), {'onComplete' : onPostComplete});
if (typeof onSuccess == 'function')
onSuccess();
document.pageform.action = "send"; disposeDialog();
AIM.submit($(document.pageform), {'onComplete' : onPostComplete}); return true;
rc = true;
}
return rc;
} }
function onPostComplete(response) { function onPostComplete(response) {
@ -184,9 +178,9 @@ function onPostComplete(response) {
} }
function clickedEditorSend() { function clickedEditorSend() {
if (onValidate()) { onValidate(function() {
document.pageform.submit(); document.pageform.submit();
} });
return false; return false;
} }