Merge to 2.2.1

This commit is contained in:
Francis Lachapelle
2014-03-07 14:03:41 -05:00
34 changed files with 538 additions and 168 deletions
+1 -1
View File
@@ -36,7 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
{
return [self descriptionWithCalendarFormat: @"%Y-%m-%d-T%H:%M:%S.%FZ" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil];
return [self descriptionWithCalendarFormat: @"%Y-%m-%dT%H:%M:%S.%FZ" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil];
}
+51 -26
View File
@@ -571,24 +571,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
case ActiveSyncMailFolder:
default:
{
NSMutableArray *addedOrChangedMessages;
SOGoMailObject *mailObject;
NSString *uid, *command;
NSDictionary *aMessage;
NSArray *allMessages;
int deleted_count;
allMessages = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType];
addedOrChangedMessages = [NSMutableArray array];
deleted_count = 0;
// Check for the WindowSize.
// FIXME: we should eventually check for modseq and slice the maximum
// amount of messages returned to ensure we don't have the same
// modseq accross contiguous boundaries
max = [allMessages count];
if (max > theWindowSize)
{
max = theWindowSize;
more_available = YES;
}
// We first check the number of deleted messages we have
// We do NOT honor the window size here as it seems to be
// impossible to get the modseq of an expunged message so
// we can't iterate in the list of deleted messages.
for (i = 0; i < max; i++)
{
aMessage = [allMessages objectAtIndex: i];
@@ -601,31 +604,53 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[s appendString: @"<Delete xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
[s appendString: @"</Delete>"];
deleted_count++;
}
else
{
if ([command isEqualToString: @"added"])
[s appendString: @"<Add xmlns=\"AirSync:\">"];
else
[s appendString: @"<Change xmlns=\"AirSync:\">"];
mailObject = [theCollection lookupName: uid
inContext: context
acquire: 0];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
[s appendString: @"</ApplicationData>"];
if ([command isEqualToString: @"added"])
[s appendString: @"</Add>"];
else
[s appendString: @"</Change>"];
[addedOrChangedMessages addObject: aMessage];
}
}
// We then "pad" with our added/changed messages. We ALWAYS
// at least return one if available
max = [addedOrChangedMessages count];
for (i = 0; i < max; i++)
{
aMessage = [addedOrChangedMessages objectAtIndex: i];
uid = [[[aMessage allKeys] lastObject] stringValue];
command = [[aMessage allValues] lastObject];
if ([command isEqualToString: @"added"])
[s appendString: @"<Add xmlns=\"AirSync:\">"];
else
[s appendString: @"<Change xmlns=\"AirSync:\">"];
mailObject = [theCollection lookupName: uid
inContext: context
acquire: 0];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
[s appendString: @"</ApplicationData>"];
if ([command isEqualToString: @"added"])
[s appendString: @"</Add>"];
else
[s appendString: @"</Change>"];
// We check if we must stop padding
if (i+1+deleted_count > theWindowSize)
{
more_available = YES;
break;
}
}
//
if (more_available)
{
+4 -3
View File
@@ -166,8 +166,8 @@ struct GlobalObjectId {
- (NSString *) _emailAddressesFrom: (NSArray *) enveloppeAddresses
{
NGImap4EnvelopeAddress *address;
NSString *email, *rc, *name;
NSMutableArray *addresses;
NSString *email, *rc;
int i, max;
rc = nil;
@@ -179,7 +179,8 @@ struct GlobalObjectId {
for (i = 0; i < max; i++)
{
address = [enveloppeAddresses objectAtIndex: i];
email = [NSString stringWithFormat: @"\"%@\" <%@>", [address personalName], [address baseEMail]];
name = [address personalName];
email = [NSString stringWithFormat: @"\"%@\" <%@>", (name ? name : [address baseEMail]), [address baseEMail]];
if (email)
[addresses addObject: email];
@@ -377,7 +378,7 @@ struct GlobalObjectId {
// DateReceived
value = [self date];
if (value)
[s appendFormat: @"<DateReceived xmlns=\"Email:\">%@</DateReceived>", [value activeSyncRepresentationWithoutSeparatorsInContext: context]];
[s appendFormat: @"<DateReceived xmlns=\"Email:\">%@</DateReceived>", [value activeSyncRepresentationInContext: context]];
// DisplayTo
[s appendFormat: @"<DisplayTo xmlns=\"Email:\">%@</DisplayTo>", [[context activeUser] login]];
+190
View File
@@ -1,3 +1,193 @@
commit 23789b48bcdcbac738039d214a92cd0bb5aff9e4
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Mar 7 13:59:51 2014 -0500
Update Dutch translation
M NEWS
M UI/MailPartViewers/Dutch.lproj/Localizable.strings
M UI/PreferencesUI/Dutch.lproj/Localizable.strings
M UI/Scheduler/Dutch.lproj/Localizable.strings
commit 142296f71e0e22eae76572e7ff23a3b00a2c076f
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Mar 7 10:53:17 2014 -0500
Preparation for release 2.2.1
M Documentation/SOGo Installation Guide.odt
M Documentation/SOGo Mobile Devices Configuration.odt
M Documentation/SOGo Mozilla Thunderbird Configuration.odt
M Documentation/SOGo Native Microsoft Outlook Configuration.odt
M NEWS
M Version
commit 3bae2387d4e0efcfe88fd56fa743c70deb638ee8
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Mar 6 22:13:17 2014 -0500
Fix contact autocompletion when UID is a digit
M NEWS
M UI/WebServerResources/SOGoAutoCompletion.js
M UI/WebServerResources/generic.css
commit 6cecca6c4f0ffb6edea41f3ade3b7f90f92cdf81
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Mar 6 21:32:36 2014 -0500
Fix CSS id for string prefixed with a digit
When encoding a string as a CSS identifier, we must add an underscore if
the strings starts with a digit.
M NEWS
M SoObjects/Mailer/SOGoMailAccounts.m
M SoObjects/SOGo/NSString+Utilities.m
M UI/WebServerResources/JavascriptAPIExtensions.js
commit 28b1938bd972462be383ef612e38a93870ccff1b
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Mar 6 21:25:48 2014 -0500
Show folder name in dialog when renaming folder
M NEWS
M UI/WebServerResources/MailerUI.js
M UI/WebServerResources/generic.js
commit 31ace947cbf1fbbfa93a92ed0f028e5a56b8b0d1
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Mar 6 14:16:08 2014 -0500
Fixed race condition when syncing huge amount of deleted messages using AS
M ActiveSync/SOGoActiveSyncDispatcher+Sync.m
M NEWS
M SoObjects/Mailer/SOGoMailFolder.m
commit 0cea36df2eebdcda55098fa0ae9416976a39a332
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Mar 6 14:10:47 2014 -0500
Updated NEWS regarding previous commit
M NEWS
commit afd745232331267499592e18e5d0b857454d3cbd
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Mar 6 14:05:59 2014 -0500
Fixed returned date format and fixing missing 'name part' in address
M ActiveSync/SOGoMailObject+ActiveSync.m
commit e4a21bcef5afb1245023d5561c0d60c183bfe623
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Mar 6 09:27:43 2014 -0500
Webmail: fix encoding of subfolder name
Fixes #2637
M NEWS
M SoObjects/Mailer/SOGoMailFolder.m
M UI/MailerUI/UIxMailFolderActions.m
commit 0c99323db3e5404301c249512b736d426bd41d09
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Mar 5 13:42:38 2014 -0500
Fix possible exception when retrieving reminder
Fixes #2624
M NEWS
M UI/PreferencesUI/UIxPreferences.m
commit da208d5b4acd18aff399261cafc9d105c8f56e55
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Mar 5 09:09:33 2014 -0500
Updated NEWS regarding previous commit
M NEWS
commit 158af711528027cd63a3c70708fab96eee41dd19
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Mar 5 09:07:39 2014 -0500
Fix for bug #2609
M ActiveSync/NSDate+ActiveSync.m
commit 163bce39b5ab7afc060a5af9dfd7dafa632f7b61
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Tue Mar 4 22:03:28 2014 -0500
Fix list sorting of events by calendar name
Fixes #2629
M NEWS
M UI/Templates/SchedulerUI/UIxCalMainView.wox
commit 02c72fee6ad0bf8850de88ab65a01191ff351ecc
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Tue Mar 4 21:32:57 2014 -0500
Fix unsubscription when renaming an IMAP folder
Fixes #2630
M NEWS
M SoObjects/Mailer/SOGoMailFolder.m
commit 8bef84bded384cde99dd2ee7ebfe9ebbeeedf2e6
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Tue Mar 4 09:22:00 2014 -0500
Update translations
M NEWS
M UI/PreferencesUI/Czech.lproj/Localizable.strings
M UI/PreferencesUI/Finnish.lproj/Localizable.strings
M UI/PreferencesUI/Hungarian.lproj/Localizable.strings
commit 8db3b22eb9bde326d3892c88b5c1cb9bb0251170
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Mon Mar 3 22:08:29 2014 -0500
Bump version to 2.2.0a
M Version
commit 1aabcf04b5d26471a62f97566bb3fd6911848f48
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Mon Mar 3 22:07:24 2014 -0500
Fix sogo-tool operations on Sieve script
Fixes #2617
M NEWS
M SoObjects/Mailer/SOGoMailAccount.h
M SoObjects/Mailer/SOGoMailAccount.m
M SoObjects/SOGo/SOGoSieveManager.h
M SoObjects/SOGo/SOGoSieveManager.m
M Tools/GNUmakefile.preamble
M Tools/SOGoToolExpireAutoReply.m
M Tools/SOGoToolUserPreferences.m
commit c6b227160c70db0fb892c2df1f5bb64caae45fc9
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Mon Feb 24 16:53:46 2014 -0500
Update ChangeLog
M ChangeLog
M NEWS
commit 5f2920db9b1c7fd89af8019d8a007bfddb20a742
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Mon Feb 24 16:47:41 2014 -0500
Binary file not shown.
Binary file not shown.
+21
View File
@@ -1,3 +1,24 @@
2.2.1 (2014-03-07)
------------------
Enhancements
- updated Czech, Dutch, Finnish, and Hungarian translations
- show current folder name in prompt dialog when renaming a mail folder
Bug fixes
- fixed an issue with ActiveSync when the number of messages in the mailbox was greater than the window-size specified by the client
- fixed sogo-tool operations on Sieve script (#2617)
- fixed unsubscription when renaming an IMAP folder (#2630)
- fixed sorting of events list by calendar name (#2629)
- fixed wrong date format leading to Android email syncing issues (#2609)
- fixed possible exception when retrieving the default event reminder value (#2624)
- fixed encoding of mail folder name when creating a subfolder (#2637)
- fixed returned date format for email messages in Active Sync
- fixed missing 'name part' in address for email messages in Active Sync
- fixed race condition when syncing huge amount of deleted messages over Active Sync
- fixed encoding of string as CSS identifier when the string starts with a digit
- fixed auto-completion popupmenu when UID is a digit
2.2.0 (2014-02-24)
------------------
+3 -1
View File
@@ -1,5 +1,5 @@
/*
Copyright (C) 2009-2013 Inverse inc.
Copyright (C) 2009-2014 Inverse inc.
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOGo.
@@ -71,6 +71,8 @@ typedef enum {
- (id) getInboxQuota;
- (BOOL) updateFilters;
- (BOOL) updateFiltersWithUsername: (NSString *) theUsername
andPassword: (NSString *) thePassword;
- (NSArray *) identities;
- (NSString *) signature;
+8 -2
View File
@@ -1,6 +1,6 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
Copyright (C) 2007-2013 Inverse inc.
Copyright (C) 2007-2014 Inverse inc.
This file is part of SOGo.
@@ -306,12 +306,18 @@ static NSString *inboxFolderName = @"INBOX";
}
- (BOOL) updateFilters
{
return [self updateFiltersWithUsername: nil andPassword: nil];
}
- (BOOL) updateFiltersWithUsername: (NSString *) theUsername
andPassword: (NSString *) thePassword
{
SOGoSieveManager *manager;
manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]];
return [manager updateFiltersForAccount: self];
return [manager updateFiltersForAccount: self withUsername: theUsername andPassword: thePassword];
}
+7 -4
View File
@@ -78,20 +78,23 @@
{
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];
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 = [key intValue];
if ([key isEqualToString: [NSString stringWithFormat: @"%d", keyCount]]
&& keyCount > -1 && keyCount < [accounts count])
obj = [SOGoMailAccount objectWithName: _key inContainer: self];
obj = [SOGoMailAccount objectWithName: key inContainer: self];
else
obj = [NSException exceptionWithHTTPStatus: 404 /* Not Found */];
}
+17 -10
View File
@@ -44,6 +44,7 @@
#import <NGImap4/NGImap4Connection.h>
#import <NGImap4/NGImap4Client.h>
#import <NGImap4/NSString+Imap4.h>
#import <SOGo/DOMNode+SOGo.h>
#import <SOGo/NSArray+Utilities.h>
@@ -293,19 +294,19 @@ static NSString *defaultUserID = @"anyone";
destURL = [[NSURL alloc] initWithScheme: [imap4URL scheme]
host: [imap4URL host]
path: [NSString stringWithFormat: @"%@%@",
path, newName]];
path, [newName stringByEncodingImap4FolderName]]];
[destURL autorelease];
error = [imap4 moveMailboxAtURL: imap4URL
toURL: destURL];
if (!error)
{
ASSIGN (imap4URL, nil);
ASSIGN (nameInContainer,
([NSString stringWithFormat: @"folder%@", [newName asCSSIdentifier]]));
// We unsubscribe to the old one, and subscribe back to the new one
[client subscribe: [destURL path]];
[client unsubscribe: [imap4URL path]];
ASSIGN (imap4URL, nil);
ASSIGN (nameInContainer,
([NSString stringWithFormat: @"folder%@", [newName asCSSIdentifier]]));
}
}
else
@@ -994,7 +995,7 @@ static NSString *defaultUserID = @"anyone";
if ([self imap4Connection])
{
error = [imap4 createMailbox: [self relativeImap4Name]
error = [imap4 createMailbox: [[self relativeImap4Name] stringByEncodingImap4FolderName]
atURL: [container imap4URL]];
if (error)
rc = NO;
@@ -1939,8 +1940,11 @@ static NSString *defaultUserID = @"anyone";
uid = [theId intValue];
result = [[imap4 client] fetchModseqForUid: uid];
modseq = [[[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"] intValue];
tag = [NSString stringWithFormat: @"%d-%d", uid, modseq-1];
if (modseq < 1)
modseq = 1;
tag = [NSString stringWithFormat: @"%d-%d", uid, modseq];
}
return tag;
@@ -1998,7 +2002,7 @@ static NSString *defaultUserID = @"anyone";
// Check updated items
//
//
// . uid fetch 1:* (FLAGS) (changedsince 171)
// . uid fetch 1:* (UID) (changedsince 171)
//
// To get the modseq of a specific message:
//
@@ -2100,11 +2104,14 @@ static NSString *defaultUserID = @"anyone";
// We fetch deleted ones
if (highestmodseq > 0)
{
id uid;
uids = [self fetchUIDsOfVanishedItems: highestmodseq];
for (i = 0; i < [uids count]; i++)
{
d = [NSDictionary dictionaryWithObject: @"deleted" forKey: [uids objectAtIndex: i]];
uid = [uids objectAtIndex: i];
d = [NSDictionary dictionaryWithObject: @"deleted" forKey: uid];
[allTokens addObject: d];
}
}
+25 -10
View File
@@ -332,8 +332,7 @@ static NSCharacterSet *controlCharSet = nil;
(cssEscapingCount + 1)
* sizeof (unichar));
for (count = 0; count < cssEscapingCount; count++)
*(cssEscapingCharacters + count)
= [[characters objectAtIndex: count] characterAtIndex: 0];
*(cssEscapingCharacters + count) = [[characters objectAtIndex: count] characterAtIndex: 0];
*(cssEscapingCharacters + cssEscapingCount) = 0;
}
@@ -360,14 +359,20 @@ static NSCharacterSet *controlCharSet = nil;
cssIdentifier = [NSMutableString string];
max = [self length];
for (count = 0; count < max; count++)
if (max > 0)
{
currentChar = [self characterAtIndex: count];
idx = [self _cssCharacterIndex: currentChar];
if (idx > -1)
[cssIdentifier appendString: cssEscapingStrings[idx]];
else
[cssIdentifier appendFormat: @"%C", currentChar];
if (isdigit([self characterAtIndex: 0]))
// A CSS identifier can't start with a digit; we add an underscore
[cssIdentifier appendString: @"_"];
for (count = 0; count < max; count++)
{
currentChar = [self characterAtIndex: count];
idx = [self _cssCharacterIndex: currentChar];
if (idx > -1)
[cssIdentifier appendString: cssEscapingStrings[idx]];
else
[cssIdentifier appendFormat: @"%C", currentChar];
}
}
return cssIdentifier;
@@ -397,7 +402,17 @@ static NSCharacterSet *controlCharSet = nil;
newString = [NSMutableString string];
max = [self length];
for (count = 0; count < max - 2; count++)
count = 0;
if (max > 0
&& [self characterAtIndex: 0] == '_'
&& isdigit([self characterAtIndex: 1]))
{
/* If the identifier starts with an underscore followed by a digit,
we remove the underscore */
count = 1;
}
for (; count < max - 2; count++)
{
currentChar = [self characterAtIndex: count];
if (currentChar == '_')
+8 -3
View File
@@ -1,9 +1,8 @@
/* SOGoSieveManager.h - this file is part of SOGo
*
* Copyright (C) 2010-2011 Inverse inc.
* Copyright (C) 2010-2014 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Ludovic Marcotte <lmarcotte@inverse.ca>
* Author: Inverse <info@inverse.ca>
*
* 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,8 +46,14 @@
- (NSString *) lastScriptError;
- (NGSieveClient *) clientForAccount: (SOGoMailAccount *) theAccount;
- (NGSieveClient *) clientForAccount: (SOGoMailAccount *) theAccount
withUsername: (NSString *) theUsername
andPassword: (NSString *) thePassword;
- (BOOL) updateFiltersForAccount: (SOGoMailAccount *) theAccount;
- (BOOL) updateFiltersForAccount: (SOGoMailAccount *) theAccount
withUsername: (NSString *) theUsername
andPassword: (NSString *) thePassword;
@end
+38 -8
View File
@@ -1,9 +1,8 @@
/* SOGoSieveManager.m - this file is part of SOGo
*
* Copyright (C) 2010-2011 Inverse inc.
* Copyright (C) 2010-2014 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Ludovic Marcotte <lmarcotte@inverse.ca>
* Author: Inverse <info@inverse.ca>
*
* 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
@@ -625,6 +624,16 @@ static NSString *sieveScriptName = @"sogo";
//
//
- (NGSieveClient *) clientForAccount: (SOGoMailAccount *) theAccount
{
return [self clientForAccount: theAccount withUsername: nil andPassword: nil];
}
//
//
//
- (NGSieveClient *) clientForAccount: (SOGoMailAccount *) theAccount
withUsername: (NSString *) theUsername
andPassword: (NSString *) thePassword
{
NSDictionary *result;
NSString *login, *authname, *password;
@@ -640,8 +649,16 @@ static NSString *sieveScriptName = @"sogo";
// Extract credentials from mail account
login = [[theAccount imap4URL] user];
authname = [[theAccount imap4URL] user];
password = [theAccount imap4PasswordRenewed: NO];
if (!theUsername && !thePassword)
{
authname = [[theAccount imap4URL] user];
password = [theAccount imap4PasswordRenewed: NO];
}
else
{
authname = theUsername;
password = thePassword;
}
// We connect to our Sieve server and check capabilities, in order
// to generate the right script, based on capabilities
@@ -725,7 +742,7 @@ static NSString *sieveScriptName = @"sogo";
return nil;
}
if (![[result valueForKey:@"result"] boolValue]) {
if (![[result valueForKey:@"result"] boolValue] && !theUsername && !thePassword) {
NSLog(@"failure. Attempting with a renewed password (no authname supported)");
password = [theAccount imap4PasswordRenewed: YES];
result = [client login: login password: password];
@@ -741,10 +758,23 @@ static NSString *sieveScriptName = @"sogo";
return client;
}
//
//
//
- (BOOL) updateFiltersForAccount: (SOGoMailAccount *) theAccount
{
return [self updateFiltersForAccount: theAccount
withUsername: nil
andPassword: nil];
}
//
//
//
- (BOOL) updateFiltersForAccount: (SOGoMailAccount *) theAccount
withUsername: (NSString *) theUsername
andPassword: (NSString *) thePassword
{
NSMutableArray *req;
NSMutableString *script, *header;
@@ -762,7 +792,7 @@ static NSString *sieveScriptName = @"sogo";
req = [NSMutableArray arrayWithCapacity: 15];
ud = [user userDefaults];
client = [self clientForAccount: theAccount];
client = [self clientForAccount: theAccount withUsername: theUsername andPassword: thePassword];
if (!client)
return NO;
@@ -888,7 +918,7 @@ static NSString *sieveScriptName = @"sogo";
// We put and activate the script only if we actually have a script
// that does something...
if (b)
if (b && [script length])
{
result = [client putScript: sieveScriptName script: script];
+1 -1
View File
@@ -14,4 +14,4 @@ ADDITIONAL_LIB_DIRS += \
-L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ -lOGoContentStore \
-L../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/ -lGDLContentStore \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ -lNGCards \
-L/usr/local/lib -L/usr/lib -lEOControl -lNGStreams -lNGMime -lNGExtensions
-L/usr/local/lib -L/usr/lib -lEOControl -lNGStreams -lNGMime -lNGExtensions -lNGObjWeb
+24 -6
View File
@@ -36,13 +36,19 @@
#import <NGExtensions/NSNull+misc.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <SOGo/NSString+Utilities.h>
#import "SOGo/SOGoCredentialsFile.h"
#import <SOGo/SOGoProductLoader.h>
#import <SOGo/SOGoSieveManager.h>
#import <SOGo/SOGoSystemDefaults.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserDefaults.h>
#import <Mailer/SOGoMailAccounts.h>
#import <Mailer/SOGoMailAccount.h>
#import "SOGoTool.h"
@interface SOGoToolExpireAutoReply : SOGoTool
@@ -80,12 +86,10 @@
{
NSMutableDictionary *vacationOptions;
SOGoUserDefaults *userDefaults;
SOGoSieveManager *manager;
SOGoUser *user;
BOOL result;
user = [SOGoUser userWithLogin: theLogin];
manager = [SOGoSieveManager sieveManagerForUser: user];
userDefaults = [user userDefaults];
vacationOptions = [[userDefaults vacationOptions] mutableCopy];
[vacationOptions autorelease];
@@ -96,10 +100,24 @@
if (result)
{
result = [manager updateFiltersForLogin: theLogin
authname: theUsername
password: thePassword
account: nil];
SOGoUserFolder *home;
SOGoMailAccounts *folder;
SOGoMailAccount *account;
WOContext *localContext;
Class SOGoMailAccounts_class;
[[SOGoProductLoader productLoader] loadProducts: [NSArray arrayWithObject: @"Mailer.SOGo"]];
SOGoMailAccounts_class = NSClassFromString(@"SOGoMailAccounts");
localContext = [WOContext context];
[localContext setActiveUser: user];
home = [user homeFolderInContext: localContext];
folder = [SOGoMailAccounts_class objectWithName: @"Mail" inContainer: home];
account = [folder lookupName: @"0" inContext: localContext acquire: NO];
[account setContext: localContext];
result = [account updateFiltersWithUsername: theUsername andPassword: thePassword];
if (!result)
{
// Can't update Sieve script -- Reactivate auto-reply
+29 -11
View File
@@ -27,12 +27,18 @@
#import <Foundation/NSString.h>
#import <Foundation/NSUserDefaults.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WOApplication.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoProductLoader.h>
#import "SOGo/SOGoCredentialsFile.h"
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserFolder.h>
#import <SOGo/SOGoUserDefaults.h>
#import <SOGo/SOGoUserSettings.h>
#import <SOGo/SOGoSieveManager.h>
#import <Mailer/SOGoMailAccounts.h>
#import <Mailer/SOGoMailAccount.h>
#import "SOGoTool.h"
@@ -102,7 +108,6 @@ typedef enum
// Vacation
//
- (BOOL) _updateSieveScripsForkey: (NSString *) theKey
manager: (SOGoSieveManager *) theManager
login: (NSString *) theLogin
{
if ([theKey caseInsensitiveCompare: @"Forward"] == NSOrderedSame ||
@@ -126,11 +131,28 @@ typedef enum
NSLog(@"To update Sieve scripts, you must provide the \"-p credentialFile\" parameter");
return NO;
}
return [theManager updateFiltersForLogin: theLogin
authname: authname
password: authpwd
account: nil];
/* update sieve script */
SOGoUser *user;
SOGoUserFolder *home;
SOGoMailAccounts *folder;
SOGoMailAccount *account;
WOContext *localContext;
Class SOGoMailAccounts_class;
[[SOGoProductLoader productLoader] loadProducts: [NSArray arrayWithObject: @"Mailer.SOGo"]];
SOGoMailAccounts_class = NSClassFromString(@"SOGoMailAccounts");
user = [SOGoUser userWithLogin: theLogin];
localContext = [WOContext context];
[localContext setActiveUser: user];
home = [user homeFolderInContext: localContext];
folder = [SOGoMailAccounts_class objectWithName: @"Mail" inContainer: home];
account = [folder lookupName: @"0" inContext: localContext acquire: NO];
[account setContext: localContext];
return [account updateFiltersWithUsername: authname andPassword: authpwd];
}
return YES;
@@ -154,7 +176,6 @@ typedef enum
if (max > 3)
{
SOGoDefaultsSource *source;
SOGoSieveManager *manager;
SOGoUser *user;
cmd = [self _cmdFromString: [sanitizedArguments objectAtIndex: 0]];
@@ -164,7 +185,6 @@ typedef enum
key = [sanitizedArguments objectAtIndex: 3];
user = [SOGoUser userWithLogin: userId];
manager = [SOGoSieveManager sieveManagerForUser: user];
if ([type caseInsensitiveCompare: @"defaults"] == NSOrderedSame)
source = [user userDefaults];
@@ -254,7 +274,6 @@ typedef enum
}
rc = [self _updateSieveScripsForkey: key
manager: manager
login: userId];
if (rc)
[source synchronize];
@@ -266,7 +285,6 @@ typedef enum
case UserPreferencesUnset:
[source removeObjectForKey: key];
rc = [self _updateSieveScripsForkey: key
manager: manager
login: userId];
if (rc)
[source synchronize];
@@ -12,6 +12,8 @@ publish_info_text = "De afzender stelt u op de hoogte van bijgevoegde afspraak."
cancel_info_text = "Uw uitnodiging of de hele afspraak is vervallen..";
request_info_no_attendee = "stelt een afspraak voor met de volgende deelnemers. U ontvangt deze mail als notificatie, u bent geen deelnemer.";
Appointment = "afspraak";
"Status Update" = "Statusupdate";
was = "was";
Organizer = "Organisator";
Time = "Tijd";
+4
View File
@@ -28,8 +28,11 @@
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WOResponse.h>
#import <NGObjWeb/WORequest.h>
#import <NGImap4/NGImap4Connection.h>
#import <NGImap4/NGImap4Client.h>
#import <NGImap4/NSString+Imap4.h>
#import <EOControl/EOQualifier.h>
#import <Mailer/SOGoMailAccount.h>
@@ -60,6 +63,7 @@
folderName = [[context request] formValueForKey: @"name"];
if ([folderName length] > 0)
{
folderName = [folderName stringByEncodingImap4FolderName];
newFolder
= [co lookupName: [NSString stringWithFormat: @"folder%@", folderName]
inContext: context
@@ -111,18 +111,22 @@
"personalCalendar" = "Osobní kalendář";
"firstCalendar" = "První kalendář";
"reminder_NONE" = "Bez připomenutí";
"reminder_5_MINUTES_BEFORE" = "5 minut";
"reminder_10_MINUTES_BEFORE" = "10 minut";
"reminder_15_MINUTES_BEFORE" = "15 minut";
"reminder_30_MINUTES_BEFORE" = "30 minut";
"reminder_45_MINUTES_BEFORE" = "45 minut";
"reminder_1_HOUR_BEFORE" = "1 hodina";
"reminder_2_HOURS_BEFORE" = "2 hodiny";
"reminder_5_HOURS_BEFORE"= "5 hodiny";
"reminder_15_HOURS_BEFORE"= "15 hodin";
"reminder_5_HOURS_BEFORE" = "5 hodiny";
"reminder_15_HOURS_BEFORE" = "15 hodin";
"reminder_1_DAY_BEFORE" = "1 den";
"reminder_2_DAYS_BEFORE" = "2 dny";
"reminder_1_WEEK_BEFORE" = "1 týden";
/* Mailer */
"Labels" = "Značky";
"Label" = "Označkovat";
"Show subscribed mailboxes only" = "Ukázat pouze odebírané mailové schránky";
"Sort messages by threads" = "Třídit zprávy podle souvislostí";
@@ -240,59 +244,56 @@
"Ask me" = "Zeptat se";
/* Filters - UIxPreferences */
"Filters" = "Filters";
"Active" = "Active";
"Move Up" = "Move Up";
"Move Down" = "Move Down";
"Filters" = "Třídění";
"Active" = "Aktiv";
"Move Up" = "Posunout nahoru";
"Move Down" = "Posunout dolů";
/* Filters - UIxFilterEditor */
"Filter name:" = "Filter name:";
"For incoming messages that" = "For incoming messages that";
"match all of the following rules:" = "match all of the following rules:";
"match any of the following rules:" = "match any of the following rules:";
"match all messages" = "match all messages";
"Perform these actions:" = "Perform these actions:";
"Filter name:" = "Jméno filtru:";
"For incoming messages that" = "Pro příchozí zprávy, které";
"match all of the following rules:" = "vyhovují všem následujícím podmínkám:";
"match any of the following rules:" = "vyhovují některé z následujících podmínek:";
"match all messages" = "odpovídají všem zprávám";
"Perform these actions:" = "Proveď tyto akce:";
"Untitled Filter" = "Nepojmenovaný filtr";
"Subject" = "Subject";
"From" = "From";
"To" = "To";
"Cc" = "Cc";
"To or Cc" = "To or Cc";
"Size (Kb)" = "Size (Kb)";
"Header" = "Header";
"Flag the message with:" = "Flag the message with:";
"Discard the message" = "Discard the message";
"File the message in:" = "File the message in:";
"Keep the message" = "Keep the message";
"Forward the message to:" = "Forward the message to:";
"Send a reject message:" = "Send a reject message:";
"Send a vacation message" = "Send a vacation message";
"Stop processing filter rules" = "Stop processing filter rules";
"Subject" = "Předmět";
"From" = "Odesílatel";
"To" = "Komu";
"Cc" = "Kopie";
"To or Cc" = "Komu nebo Kopie";
"Size (Kb)" = "Velikost (Kb)";
"Header" = "Hlavička";
"Body" = "Tělo";
"Flag the message with:" = "Označ zprávu jako:";
"Discard the message" = "Odstraň zprávu";
"File the message in:" = "Ulož zprávu do složky:";
"Keep the message" = "Zprávu ponechej";
"Forward the message to:" = "Přepošli zprávu na:";
"Send a reject message:" = "Pošli zprávu s odmítnutím:";
"Send a vacation message" = "Pošli odpověď v nepřítomnosti";
"Stop processing filter rules" = "Ukonči zpracování";
"is under" = "is under";
"is over" = "is over";
"is" = "is";
"is under" = "je menší než";
"is over" = "je větší než";
"is" = "je rovno";
"is not" = "is not";
"contains" = "contains";
"does not contain" = "does not contain";
"matches" = "matches";
"does not match" = "does not match";
"matches regex" = "matches regex";
"does not match regex" = "does not match regex";
"contains" = "obsahuje";
"does not contain" = "neobsahuje";
"matches" = "odpovídá";
"does not match" = "neodpovídá";
"matches regex" = "odpovídá regulárnímu výrazu";
"does not match regex" = "neodpovídá regulárnímu výrazu";
"Seen" = "Seen";
"Deleted" = "Deleted";
"Answered" = "Answered";
"Flagged" = "Flagged";
"Junk" = "Junk";
"Not Junk" = "Not Junk";
"Label 1" = "Label 1";
"Label 2" = "Label 2";
"Label 3" = "Label 3";
"Label 4" = "Label 4";
"Label 5" = "Label 5";
"Seen" = "Přečtené";
"Deleted" = "Smazané";
"Answered" = "Odpovězené";
"Flagged" = "Oštítkované";
"Junk" = "Nevyžádané";
"Not Junk" = "Jako vyžádané";
/* Password policy */
"The password was changed successfully." = "Heslo bylo úspěšně změněno.";
"Password must not be empty." = "Heslo nesmí být prázdné.";
"The passwords do not match. Please try again." = "Hesla se neshodují. Prosím zadejte je znovu.";
@@ -305,4 +306,4 @@
"Unhandled policy error: %{0}" = "Neošetřená chyba: %{0}";
"Unhandled error response" = "Neošetřená chyba";
"Password change is not supported." = "Změna hesla není podporována.";
"Unhandled HTTP error code: %{0}" = "Neošetřený HTTP chybový kód: %{0}";
"Unhandled HTTP error code: %{0}" = "Neošetřený HTTP chybový kód: %{0}";
@@ -111,18 +111,22 @@
"personalCalendar" = "Persoonlijke agenda";
"firstCalendar" = "Eerste ingeschakelde agenda";
"reminder_NONE" = "Geen herinnering";
"reminder_5_MINUTES_BEFORE" = "5 minuten";
"reminder_10_MINUTES_BEFORE" = "10 minuten";
"reminder_15_MINUTES_BEFORE" = "15 minuten";
"reminder_30_MINUTES_BEFORE" = "30 minuten";
"reminder_45_MINUTES_BEFORE" = "45 minuten van tevoren";
"reminder_1_HOUR_BEFORE" = "1 uur";
"reminder_2_HOURS_BEFORE" = "2 uren";
"reminder_5_HOURS_BEFORE"= "5 uren";
"reminder_15_HOURS_BEFORE"= "15 uren";
"reminder_5_HOURS_BEFORE" = "5 uren";
"reminder_15_HOURS_BEFORE" = "15 uren";
"reminder_1_DAY_BEFORE" = "1 dag";
"reminder_2_DAYS_BEFORE" = "2 dagen";
"reminder_1_WEEK_BEFORE" = "1 week van tevoren";
/* Mailer */
"Labels" = "Labels";
"Label" = "Labelen";
"Show subscribed mailboxes only" = "Toon alleen geabonneerde postvakken";
"Sort messages by threads" = "Berichten sorteren op threads";
@@ -261,6 +265,7 @@
"To or Cc" = "aan of cc";
"Size (Kb)" = "Grootte (Kb)";
"Header" = "Header";
"Body" = "Inhoud";
"Flag the message with:" = "Markeer het bericht met:";
"Discard the message" = "Het bericht verwijderen";
"File the message in:" = "Verplaats het bericht naar:";
@@ -287,12 +292,8 @@
"Flagged" = "Gemarkeerd";
"Junk" = "Junk";
"Not Junk" = "Geen junk";
"Label 1" = "Label 1";
"Label 2" = "Label 2";
"Label 3" = "Label 3";
"Label 4" = "Label 4";
"Label 5" = "Label 5";
/* Password policy */
"The password was changed successfully." = "Het wachtwoord is met succes veranderd.";
"Password must not be empty." = "Wachtwoord mag niet leeg zijn.";
"The passwords do not match. Please try again." = "De wachtwoorden komen niet overeen. Probeer opnieuw.";
@@ -305,4 +306,4 @@
"Unhandled policy error: %{0}" = "Onverwerkte beleidsfout: %{0}";
"Unhandled error response" = "Onverwerkte foutmelding";
"Password change is not supported." = "Wachtwoordwijziging wordt niet ondersteund.";
"Unhandled HTTP error code: %{0}" = "Onverwerkte HTTP-foutcode: %{0}";
"Unhandled HTTP error code: %{0}" = "Onverwerkte HTTP-foutcode: %{0}";
@@ -265,6 +265,7 @@
"To or Cc" = "Kenelle tai Kopio";
"Size (Kb)" = "Koko (Kb)";
"Header" = "Otsikko";
"Body" = "Runko";
"Flag the message with:" = "Merkitse viesti:";
"Discard the message" = "Hylkää viesti";
"File the message in:" = "Arkistoi viesti:";
@@ -111,19 +111,23 @@
"personalCalendar" = "Személyes naptár";
"firstCalendar" = "Első engedélyezett naptár";
"reminder_5_MINUTES_BEFORE" = "5 perc";
"reminder_NONE" = "Nincs emlékeztető";
"reminder_5_MINUTES_BEFORE" = "5 perccel előtte";
"reminder_10_MINUTES_BEFORE" = "10 perc";
"reminder_15_MINUTES_BEFORE" = "15 perc";
"reminder_15_MINUTES_BEFORE" = "15 perccel előtte";
"reminder_30_MINUTES_BEFORE" = "30 perc";
"reminder_1_HOUR_BEFORE" = "1 óra";
"reminder_2_HOURS_BEFORE" = "2 óra";
"reminder_5_HOURS_BEFORE"= "5 óra";
"reminder_15_HOURS_BEFORE"= "15 óra";
"reminder_1_DAY_BEFORE" = "1 nap";
"reminder_2_DAYS_BEFORE" = "2 nap";
"reminder_45_MINUTES_BEFORE" = "45 perccel előtte";
"reminder_1_HOUR_BEFORE" = "1 órával előtte";
"reminder_2_HOURS_BEFORE" = "2 órával előtte";
"reminder_5_HOURS_BEFORE" = "5 órával előtte";
"reminder_15_HOURS_BEFORE" = "15 órával előtte";
"reminder_1_DAY_BEFORE" = "1 nappal előtte";
"reminder_2_DAYS_BEFORE" = "2 nappal előtte";
"reminder_1_WEEK_BEFORE" = "1 héttel előtte";
/* Mailer */
"Label" = "Cimke";
"Labels" = "Címkék";
"Label" = "Címke";
"Show subscribed mailboxes only" = "Csak azok a fiókok mutatása, amelyre feliratkozott";
"Sort messages by threads" = "Üzenetek beszélgetések szerinti rendezése ";
"Check for new mail:" = "Új üzenetek letöltése:";
@@ -261,6 +265,7 @@
"To or Cc" = "Címzett vagy másolat";
"Size (Kb)" = "Méret (Kb)";
"Header" = "Fejléc";
"Body" = "Levéltörzs";
"Flag the message with:" = "Üzenet címkézése ezzel:";
"Discard the message" = "Üzenet eldobása";
"File the message in:" = "Az üzenet alábbi mappába helyezése:";
@@ -287,12 +292,8 @@
"Flagged" = "Megcímkézett";
"Junk" = "Szemét";
"Not Junk" = "Nem szemét";
"Label 1" = "Címke 1";
"Label 2" = "Címke 2";
"Label 3" = "Címke 3";
"Label 4" = "Címke 4";
"Label 5" = "Címke 5";
/* Password policy */
"The password was changed successfully." = "A jelszó megváltoztatása sikeres.";
"Password must not be empty." = "Jelszó nem lehet üres.";
"The passwords do not match. Please try again." = "Jelszavak nem egyeznek meg. Kérem próbálja meg újra.";
@@ -305,4 +306,4 @@
"Unhandled policy error: %{0}" = "Nem kezelt szabályrendszer hiba: %{0}";
"Unhandled error response" = "Nem kezelt hiba válasz";
"Password change is not supported." = "Jelszó változtatása nem támogatott.";
"Unhandled HTTP error code: %{0}" = "Nem kezelt HTTP hiba kód: %{0}";
"Unhandled HTTP error code: %{0}" = "Nem kezelt HTTP hiba kód: %{0}";
+6 -3
View File
@@ -571,10 +571,13 @@ static NSArray *reminderValues = nil;
int index;
value = [userDefaults calendarDefaultReminder];
index = [reminderValues indexOfObject: value];
if (value != nil)
{
index = [reminderValues indexOfObject: value];
if (index != NSNotFound)
return [reminderItems objectAtIndex: index];
if (index != NSNotFound)
return [reminderItems objectAtIndex: index];
}
return @"NONE";
}
@@ -418,6 +418,7 @@ validate_endbeforestart = "Het einde is voor de begindatum.";
"eventDeleteConfirmation" = "Weet u zeker dat u de volgende afspraken wilt verwijderen?";
"taskDeleteConfirmation" = "Weet u zeker dat u de volgende taken wilt verwijderen?";
"Would you like to continue?" = "Wilt u doorgaan?";
"You cannot remove nor unsubscribe from your personal calendar."
= "U kunt niet uw persoonlijke agenda verwijderen of opzeggen.";
+1 -1
View File
@@ -165,7 +165,7 @@
<td id="eventStartHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="Start"/></td>
<td id="eventEndHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="End"/></td>
<td id="eventLocationHeader" class="headerCell headerLocation sortableTableHeader"><var:string label:value="Location"/></td>
<td id="calendarNameHeader" class="headerCell headerCalendarName sortableTableHeader"><var:string label:value="Calendar"/></td>
<td id="eventCalendarNameHeader" class="headerCell headerCalendarName sortableTableHeader"><var:string label:value="Calendar"/></td>
</tr>
</thead>
<tbody><!-- events list --></tbody>
@@ -106,6 +106,10 @@ String.prototype.asCSSIdentifier = function() {
newString = newString.replace(re, escapeds[i]);
}
if (/^\d+/.test(newString)) {
newString = '_' + newString;
}
return newString;
};
+2 -1
View File
@@ -2309,7 +2309,8 @@ function onMenuCreateFolderConfirm(event) {
}
function onMenuRenameFolder(event) {
showPromptDialog(_("Rename Folder..."), _("Enter the new name of your folder :"), onMenuRenameFolderConfirm);
var folderName = document.menuTarget.down('.nodeName').childNodes[0].nodeValue;
showPromptDialog(_("Rename Folder..."), _("Enter the new name of your folder :"), onMenuRenameFolderConfirm, folderName);
}
function onMenuRenameFolderConfirm() {
+9 -4
View File
@@ -167,10 +167,12 @@ var SOGoAutoCompletionInterface = {
for (var i = 0; i < data.contacts.length; i++) {
var contact = data.contacts[i];
var completeEmail = contact["c_cn"];
var uid = "" + contact[this.uidField];
var c_name = "" + contact['c_name'];
if (contact["c_mail"])
completeEmail += " <" + contact["c_mail"] + ">";
var node = new Element('li', { 'address': completeEmail,
'uid': contact[this.uidField] });
'uid': uid });
var matchPosition = completeEmail.toLowerCase().indexOf(data.searchText.toLowerCase());
if (matchPosition > -1) {
var matchBefore = completeEmail.substring(0, matchPosition);
@@ -184,7 +186,7 @@ var SOGoAutoCompletionInterface = {
node.appendChild(document.createTextNode(completeEmail));
}
list.appendChild(node);
if (contact['c_name'].endsWith (".vlf")) {
if (c_name.endsWith(".vlf")) {
// Keep track of list containers
node.writeAttribute("container", contact['container']);
}
@@ -211,6 +213,7 @@ var SOGoAutoCompletionInterface = {
this.menu.setStyle({ top: top + "px",
left: offset[0] + "px",
height: height,
maxWidth: (window.width() - offset[0] - 12) + "px",
visibility: "visible" });
this.menu.scrollTop = 0;
@@ -225,8 +228,10 @@ var SOGoAutoCompletionInterface = {
if (data.contacts.length == 1) {
// Single result
var contact = data.contacts[0];
input.writeAttribute("uid", contact[this.uidField]);
if (contact['c_name'].endsWith(".vlf")) {
var uid = "" + contact[this.uidField];
var c_name = "" + contact['c_name'];
input.writeAttribute("uid", uid);
if (c_name.endsWith(".vlf")) {
this.writeAttribute("container", contact['container']);
}
var completeEmail = contact["c_cn"];
+2
View File
@@ -251,6 +251,8 @@ DIV.contactSelector DIV.contactList
padding-bottom: .15em;
margin: 0px;
width: auto;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer; }
+4 -1
View File
@@ -2157,7 +2157,10 @@ function _showPromptDialog(title, label, callback, defaultValue) {
}
if (Prototype.Browser.IE)
jQuery('#bgDialogDiv').css('opacity', 0.4);
jQuery(dialog).fadeIn('fast', function () { dialog.down("input").focus(); });
jQuery(dialog).fadeIn('fast', function () {
var input = dialog.down("input");
input.selectText(0, input.value.length);
});
}
function showSelectDialog(title, label, options, button, callbackFcn, callbackArg, defaultValue) {
+1 -1
View File
@@ -4,4 +4,4 @@
MAJOR_VERSION=2
MINOR_VERSION=2
SUBMINOR_VERSION=0
SUBMINOR_VERSION=1