diff --git a/ActiveSync/NGVCard+ActiveSync.m b/ActiveSync/NGVCard+ActiveSync.m index bb4f29248..aaf6c8581 100644 --- a/ActiveSync/NGVCard+ActiveSync.m +++ b/ActiveSync/NGVCard+ActiveSync.m @@ -222,7 +222,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [self setNote: o]; // Categories - if ((o = [theValues objectForKey: @"Categories"])) + if ((o = [theValues objectForKey: @"Categories"]) && [o length]) [self setCategories: o]; // Birthday diff --git a/ActiveSync/NSString+ActiveSync.m b/ActiveSync/NSString+ActiveSync.m index 1007c4bde..047a5d45a 100644 --- a/ActiveSync/NSString+ActiveSync.m +++ b/ActiveSync/NSString+ActiveSync.m @@ -35,9 +35,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include +#include #include +static NSArray *easCommandCodes = nil; +static NSArray *easCommandParameters = nil; + @implementation NSString (ActiveSync) - (NSString *) sanitizedServerIdWithType: (SOGoMicrosoftActiveSyncFolderType) folderType @@ -61,9 +66,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { NSString *s; - s = [self stringByEscapingHTMLString]; + s = [self safeString]; - return [s safeString]; + return [s stringByEscapingHTMLString]; } - (int) activeSyncFolderType @@ -134,11 +139,78 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (NSString *) _valueForParameter: (NSString *) theParameter { - NSArray *components; + NSMutableArray *components; NSString *s; int i; - components = [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"]; + components = [NSMutableArray arrayWithArray: [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"]]; + + // We handle BASE64 encoded queryStrings. See http://msdn.microsoft.com/en-us/library/ee160227%28v=exchg.80%29.aspx for details. + if ([components count] == 1) + { + NSString *deviceType, *parameterValue; + NSData *queryString; + + int cmd_code, deviceid_length, policy_length, devicetype_length, parameter_code, parameter_length, i; + const char* qs_bytes; + + queryString = [[components objectAtIndex: 0] dataByDecodingBase64]; + qs_bytes = (const char*)[queryString bytes]; + + if (!easCommandCodes) + { + easCommandCodes = [NSArray arrayWithObjects:@"Sync", @"SendMail", @"SmartForward", @"SmartReply", @"GetAttachment", @"na", @"na", @"na", @"na", + @"FolderSync", @"FolderCreate", @"FolderDelete", @"FolderUpdate", @"MoveItems", @"GetItemEstimate", @"MeetingResponse", + @"Search", @"Settings", @"Ping", @"ItemOperations", @"Provision", @"ResolveRecipients", @"ValidateCert", nil]; + RETAIN(easCommandCodes); + } + + if (!easCommandParameters) + { + easCommandParameters = [NSArray arrayWithObjects:@"AttachmentName", @"CollectionId", @"na", @"ItemId", @"LongId", @"na", @"Occurrence", @"Options", @"User", nil]; + RETAIN(easCommandParameters); + } + + // Command code, 1 byte, ie.: cmd= + cmd_code = qs_bytes[1]; + [components addObject: [NSString stringWithFormat: @"cmd=%@", [easCommandCodes objectAtIndex: cmd_code]]]; + + // Device ID length and Device ID (variable) + deviceid_length = qs_bytes[4]; + [components addObject: [NSString stringWithFormat: @"deviceId=%@", [[NSData encodeDataAsHexString: [queryString subdataWithRange: NSMakeRange(5, deviceid_length)]] uppercaseString]]]; + + // Device type length and type (variable) + policy_length = qs_bytes[5+deviceid_length]; + devicetype_length = qs_bytes[5+deviceid_length+1+policy_length]; + deviceType = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(5+deviceid_length+1+policy_length+1, devicetype_length)] + encoding: NSASCIIStringEncoding]; + AUTORELEASE(deviceType); + + [components addObject: [NSString stringWithFormat: @"deviceType=%@", deviceType]]; + + // Command Parameters + i = 5+deviceid_length+1+policy_length+1+devicetype_length; + + while (i < [queryString length]) + { + parameter_code = qs_bytes[i]; + parameter_length = qs_bytes[i+1]; + parameterValue = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(i+1+1, parameter_length)] + encoding: NSASCIIStringEncoding]; + + AUTORELEASE(parameterValue); + + // parameter_code 7 == Options + // http://msdn.microsoft.com/en-us/library/ee237789(v=exchg.80).aspx + if (parameter_code == 7) + [components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code], + ([parameterValue isEqualToString: @"\001"]) ? @"SaveInSent" : @"AcceptMultiPart"]]; + else + [components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code], parameterValue]]; + + i = i + 1 + 1 + parameter_length; + } + } for (i = 0; i < [components count]; i++) { diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index 024b2a2a7..1c15f37e6 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -29,11 +29,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #import "SOGoActiveSyncDispatcher+Sync.h" - #import #import #import #import +#import #import #import #import @@ -122,7 +122,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [o setObjectType: ActiveSyncFolderCacheObject]; [o setTableUrl: [self folderTableURL]]; [o reloadIfNeeded]; - + [[o properties] removeObjectForKey: @"SyncKey"]; [[o properties] removeObjectForKey: @"SyncCache"]; [[o properties] removeObjectForKey: @"DateCache"]; @@ -147,6 +147,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. return [o properties]; } +- (NSString *) _getNameInCache: (id) theCollection withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType +{ + NSString *nameInCache; + + if (theFolderType == ActiveSyncMailFolder) + nameInCache= [[[theCollection mailAccountFolder] imapFolderGUIDs] objectForKey: [theCollection nameInContainer]]; + else + { + NSString *component_name; + if (theFolderType == ActiveSyncContactFolder) + component_name = @"vcard"; + else if (theFolderType == ActiveSyncEventFolder) + component_name = @"vevent"; + else + component_name = @"vtodo"; + + nameInCache= [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]]; + } + + return nameInCache; +} + + // // @@ -190,7 +213,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType inBuffer: (NSMutableString *) theBuffer { - NSMutableDictionary *allValues; + NSMutableDictionary *folderMetadata, *dateCache, *syncCache, *allValues; NSString *clientId, *serverId; NSArray *additions; @@ -276,6 +299,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [theBuffer appendFormat: @"%@", serverId]; [theBuffer appendFormat: @"%d", 1]; [theBuffer appendString: @""]; + + // Update syncCache + folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]]; + + syncCache = [folderMetadata objectForKey: @"SyncCache"]; + dateCache = [folderMetadata objectForKey: @"DateCache"]; + + [syncCache setObject: [folderMetadata objectForKey: @"SyncKey"] forKey: serverId]; + [dateCache setObject: [NSCalendarDate date] forKey: serverId]; + + [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; } } } @@ -375,6 +409,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } } + [theBuffer appendString: @""]; + [theBuffer appendFormat: @"%@", serverId]; + [theBuffer appendFormat: @"%d", 1]; + [theBuffer appendString: @""]; } } } @@ -431,6 +469,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (![sogoObject isKindOfClass: [NSException class]]) [sogoObject delete]; + + [theBuffer appendString: @""]; + [theBuffer appendFormat: @"%@", serverId]; + [theBuffer appendFormat: @"%d", 1]; + [theBuffer appendString: @""]; + + // update syncCache + NSMutableDictionary *folderMetadata, *dateCache, *syncCache; + folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]]; + + syncCache = [folderMetadata objectForKey: @"SyncCache"]; + dateCache = [folderMetadata objectForKey: @"DateCache"]; + + [syncCache removeObjectForKey: serverId]; + [dateCache removeObjectForKey: serverId]; + + [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; } } } @@ -488,18 +543,30 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. more_available = NO; - if (theFolderType == ActiveSyncMailFolder && !([theSyncKey isEqualToString: @"-1"]) && theFilterType) + folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]]; + + // If this is a new sync operation, DateCache and SyncCache needs to be deleted + if ([theSyncKey isEqualToString: @"-1"]) + { + [folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"SyncCache"]; + [folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"DateCache"]; + } + + syncCache = [folderMetadata objectForKey: @"SyncCache"]; + dateCache = [folderMetadata objectForKey: @"DateCache"]; + + if ((theFolderType == ActiveSyncMailFolder || theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder) && + !([folderMetadata objectForKey: @"MoreAvailable"]) && // previous sync operation reached the windowSize + !([theSyncKey isEqualToString: @"-1"]) && // new sync operation + theFilterType) { NSArray *allKeys; NSString *key; + int softdelete_count; softdelete_count = 0; - folderMetadata = [self _folderMetadataForKey: [theCollection nameInContainer]]; - dateCache = [folderMetadata objectForKey: @"DateCache"]; - syncCache = [folderMetadata objectForKey: @"SyncCache"]; - allKeys = [dateCache allKeys]; for (i = 0; i < [allKeys count]; i++) { @@ -510,7 +577,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [s appendString: @""]; [s appendFormat: @"%@", key]; [s appendString: @""]; - + [syncCache removeObjectForKey: key]; [dateCache removeObjectForKey: key]; @@ -520,7 +587,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (softdelete_count >= theWindowSize) { [folderMetadata setObject: [NSNumber numberWithBool: YES] forKey: @"MoreAvailable"]; - [self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]]; + [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; more_available = YES; *theLastServerKey = theSyncKey; @@ -532,7 +599,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } [folderMetadata removeObjectForKey: @"MoreAvailable"]; - [self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]]; + [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; } // @@ -557,7 +624,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSArray *allComponents; BOOL updated; - int deleted; + int deleted, return_count; if (theFolderType == ActiveSyncContactFolder) component_name = @"vcard"; @@ -567,19 +634,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. component_name = @"vtodo"; allComponents = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType]; + allComponents = [allComponents sortedArrayUsingDescriptors: [NSArray arrayWithObjects: [[NSSortDescriptor alloc] initWithKey: @"c_lastmodified" ascending:YES], nil]]; // Check for the WindowSize max = [allComponents count]; - // Disabled for now for GCS folders. - // if (max > theWindowSize) - // { - // max = theWindowSize; - // more_available = YES; - // } - + return_count = 0; + for (i = 0; i < max; i++) { + // Check for the WindowSize and slice accordingly + if (return_count >= theWindowSize) + { + more_available = YES; + + // -1 to make sure that we miss no event in case there are more with the same c_lastmodified + *theLastServerKey = [NSString stringWithFormat: @"%d", [[component objectForKey: @"c_lastmodified"] intValue] - 1]; + + break; + } + component = [allComponents objectAtIndex: i]; deleted = [[component objectForKey: @"c_deleted"] intValue]; @@ -590,17 +664,28 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (deleted) { - [s appendString: @""]; - [s appendFormat: @"%@", uid]; - [s appendString: @""]; + if ([syncCache objectForKey: uid]) + { + [s appendString: @""]; + [s appendFormat: @"%@", uid]; + [s appendString: @""]; + + [syncCache removeObjectForKey: uid]; + [dateCache removeObjectForKey: uid]; + return_count++; + } } else { updated = YES; - if ([[component objectForKey: @"c_creationdate"] intValue] > [theSyncKey intValue]) + if (![syncCache objectForKey: uid]) updated = NO; + else if ([[component objectForKey: @"c_lastmodified"] intValue] == [[syncCache objectForKey: uid] intValue]) + continue; + return_count++; + sogoObject = [theCollection lookupName: [uid sanitizedServerIdWithType: theFolderType] inContext: context acquire: 0]; @@ -635,11 +720,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. continue; } } + + [syncCache setObject: [component objectForKey: @"c_lastmodified"] forKey: uid]; if (updated) [s appendString: @""]; else + { + // no need to set dateCache for Contacts + if ((theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder)) + [dateCache setObject: [componentObject startDate] ? [componentObject startDate] : [NSCalendarDate date] forKey: uid]; // FIXME: need to set proper date for recurring events - softDelete + [s appendString: @""]; + } [s appendFormat: @"%@", uid]; [s appendString: @""]; @@ -652,11 +745,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [s appendString: @""]; else [s appendString: @""]; + + return_count++; } } // for ... - folderMetadata = [NSDictionary dictionaryWithObject: [theCollection davCollectionTag] - forKey: @"SyncKey"]; + if (more_available) + { + [folderMetadata setObject: [NSNumber numberWithBool: YES] forKey: @"MoreAvailable"]; + [folderMetadata setObject: *theLastServerKey forKey: @"SyncKey"]; + } + else + { + [folderMetadata removeObjectForKey: @"MoreAvailable"]; + [folderMetadata setObject: [theCollection davCollectionTag] forKey: @"SyncKey"]; + } + [self _setFolderMetadata: folderMetadata forKey: [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]]]; } @@ -685,27 +789,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. sequence: [[[allMessages objectAtIndex: i] allValues] lastObject]]]; } - // If it's a new Sync operation, DateCache and SyncCache need to be deleted - // but GUID stored by folderSync shouldn't be touched - folderMetadata = [self _folderMetadataForKey: [theCollection nameInContainer]]; - if ([theSyncKey isEqualToString: @"-1"]) - { - [folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"SyncCache"]; - [folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"DateCache"]; - } - - // Check whether GUID in cache is equal to the GUID from imap - this is to avoid cache corruptions if a folder has been renamed and a new folder - // with the same name has been created but folderSync has not yet updated the cache - if (!([[theCollection nameInContainer] isEqualToString: - [NSString stringWithFormat: @"folder%@", [self globallyUniqueIDToIMAPFolderName: [folderMetadata objectForKey: @"GUID"] type: theFolderType]]])) - { - NSLog(@"GUID mismatch don't sync now!"); - return; - } - - syncCache = [folderMetadata objectForKey: @"SyncCache"]; - dateCache = [folderMetadata objectForKey: @"DateCache"]; - sortedBySequence = [[NSMutableArray alloc] initWithDictionary: syncCache]; [sortedBySequence sortUsingSelector: @selector(compareSequence:)]; [sortedBySequence autorelease]; @@ -849,8 +932,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [folderMetadata setObject: [theCollection davCollectionTag] forKey: @"SyncKey"]; } - [self _setFolderMetadata: folderMetadata - forKey: [theCollection nameInContainer]]; + [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; } // default: break; } // switch (folderType) ... @@ -862,9 +944,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [theBuffer appendString: @""]; [theBuffer appendString: s]; [theBuffer appendString: @""]; - - if (more_available) - [theBuffer appendString: @""]; } } @@ -926,6 +1005,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inCollection: theCollection withType: theFolderType inBuffer: theBuffer]; + *processed = YES; } else if ([[element tagName] isEqualToString: @"Fetch"]) { @@ -954,7 +1034,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSMutableString *changeBuffer, *commandsBuffer; BOOL getChanges, first_sync; - unsigned int windowSize, v; + unsigned int windowSize, v, status; changeBuffer = [NSMutableString string]; commandsBuffer = [NSMutableString string]; @@ -965,6 +1045,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. collection = [self collectionFromId: realCollectionId type: folderType]; syncKey = davCollectionTag = [[(id)[theDocumentElement getElementsByTagName: @"SyncKey"] lastObject] textValue]; + + if (collection == nil) + { + // Collection not found - next folderSync will do the cleanup + //NSLog(@"Sync Collection not found %@ %@", collectionId, realCollectionId); + [theBuffer appendString: @""]; + [theBuffer appendFormat: @"%@", syncKey]; + [theBuffer appendFormat: @"%@", collectionId]; + [theBuffer appendFormat: @"%d", 8]; + [theBuffer appendString: @""]; + + return; + } // We check for a window size, default to 100 if not specfied or out of bounds windowSize = [[[(id)[theDocumentElement getElementsByTagName: @"WindowSize"] lastObject] textValue] intValue]; @@ -978,6 +1071,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. windowSize = v; lastServerKey = nil; + status = 1; // From the documention, if GetChanges is missing, we must assume it's a YES. // See http://msdn.microsoft.com/en-us/library/gg675447(v=exchg.80).aspx for all details. @@ -995,6 +1089,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. first_sync = YES; *changeDetected = YES; } + else if ((![syncKey isEqualToString: @"-1"]) && !([[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"SyncCache"])) + { + //NSLog(@"Reset folder: %@", [collection nameInContainer]); + davCollectionTag = @"0"; + first_sync = YES; + *changeDetected = YES; + + if (!([[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"displayName"])) + status = 13; // need folderSync + else + status = 3; // do a complete resync + } // We check our sync preferences and we stash them bodyPreferenceType = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"BodyPreference"] lastObject] getElementsByTagName: @"Type"] lastObject] textValue]; @@ -1004,7 +1110,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"]; - // We generate the commands, if any, for the response. We might also have // generated some in processSyncCommand:inResponse: as we could have // received a Fetch command @@ -1013,9 +1118,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [self processSyncGetChanges: theDocumentElement inCollection: collection withWindowSize: windowSize + //withWindowSize: 5 withSyncKey: syncKey withFolderType: folderType withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]] + //withFilterType: [NSCalendarDate dateFromFilterType: @"7"] inBuffer: changeBuffer lastServerKey: &lastServerKey]; } @@ -1037,10 +1144,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inBuffer: s processed: &processed]; - if (processed) + // Windows phons don't empty Responses tags - such as: . + // We onnly generate this tag when the command has generated a response. + if (processed && [s length]) [commandsBuffer appendFormat: @"%@", s]; - else - [commandsBuffer appendString: s]; } // If we got any changes or if we have applied any commands @@ -1049,9 +1156,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { if (lastServerKey) davCollectionTag = lastServerKey; - else if (![[self _folderMetadataForKey: [collection nameInContainer]] objectForKey: @"MoreAvailable"]) - davCollectionTag = [collection davCollectionTag]; - + else + { + // Use the SyncKey saved by processSyncGetChanges - if processSyncGetChanges is not called (because of getChanges=false) + // SyncKey has the value of the previous sync operation. + davCollectionTag = [[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"SyncKey"]; + + if (!davCollectionTag) + davCollectionTag = [collection davCollectionTag]; + } + *changeDetected = YES; } else @@ -1074,10 +1188,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [theBuffer appendFormat: @"%@", davCollectionTag]; [theBuffer appendFormat: @"%@", collectionId]; - [theBuffer appendFormat: @"%d", 1]; + [theBuffer appendFormat: @"%d", status]; + + // MoreAvailable breaks Windows Mobile devices if not between and + // https://social.msdn.microsoft.com/Forums/en-US/040b254e-f47e-4cc1-a397-6d8393cdb819/airsyncmoreavailable-breaks-windows-mobile-devices-what-am-i-doing-wrong?forum=os_exchangeprotocols + if ([[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"MoreAvailable"]) + [theBuffer appendString: @""]; - [theBuffer appendString: changeBuffer]; [theBuffer appendString: commandsBuffer]; + [theBuffer appendString: changeBuffer]; [theBuffer appendString: @""]; } diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 0d5287a8a..cc57836c8 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -36,6 +36,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import +#import +#import #import #import #import @@ -89,6 +91,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import #import +#import #import #import @@ -186,7 +189,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (theFilter) { - o = [SOGoCacheGCSObject objectWithName: [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], theCollectionId] inContainer: nil]; + o = [SOGoCacheGCSObject objectWithName: [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], theCollectionId] inContainer: nil]; [o setObjectType: ActiveSyncGlobalCacheObject]; [o setTableUrl: [self folderTableURL]]; [o reloadIfNeeded]; @@ -223,7 +226,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Get the GUID of the IMAP folder imapGUIDs = [accountFolder imapFolderGUIDs]; - return [[imapGUIDs allKeysForObject: theIdToTranslate] objectAtIndex: 0]; + //return [[imapGUIDs allKeysForObject: theIdToTranslate] objectAtIndex: 0]; + return [[[imapGUIDs allKeysForObject: [NSString stringWithFormat: @"folder%@", theIdToTranslate]] objectAtIndex: 0] substringFromIndex: 6] ; } return theIdToTranslate; @@ -244,13 +248,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { case ActiveSyncContactFolder: { - collection = [[context activeUser] personalContactsFolderInContext: context]; + collection = [[[[context activeUser] homeFolderInContext: context] lookupName: @"Contacts" inContext: context acquire: NO] lookupName: theCollectionId inContext: context acquire: NO]; + if (!collection || ([collection isKindOfClass: [NSException class]])) + collection = nil; + } break; case ActiveSyncEventFolder: case ActiveSyncTaskFolder: { - collection = [[context activeUser] personalCalendarFolderInContext: context]; + collection = [[[[context activeUser] homeFolderInContext: context] lookupName: @"Calendar" inContext: context acquire: NO] lookupName: theCollectionId inContext: context acquire: NO]; + if (!collection || ([collection isKindOfClass: [NSException class]])) + collection = nil; } break; case ActiveSyncMailFolder: @@ -267,6 +276,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. collection = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", theCollectionId] inContext: context acquire: NO]; + if (![(SOGoMailFolder *)collection exists]) + collection = nil; } } @@ -335,27 +346,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSString *key; nameInContainer = [newFolder nameInContainer]; - - // We strip the "folder" prefix - nameInContainer = [nameInContainer substringFromIndex: 6]; - // save new guid into cache accountFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; - - // update GUID in cache imapGUIDs = [accountFolder imapFolderGUIDs]; + nameInContainer =[imapGUIDs objectForKey: nameInContainer]; - key = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], nameInContainer ]; + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], nameInContainer ]; o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; [o setObjectType: ActiveSyncFolderCacheObject]; [o setTableUrl: [self folderTableURL]]; [o reloadIfNeeded]; - nameInContainer =[imapGUIDs objectForKey: nameInContainer]; - - [[o properties ] setObject: nameInContainer forKey: @"GUID"]; + [[o properties ] setObject: [[newFolder nameInContainer] substringFromIndex: 6] forKey: @"displayName"]; [o save]; - nameInContainer = [[NSString stringWithFormat: @"mail/%@", nameInContainer] stringByEscapingURL]; + nameInContainer = [[NSString stringWithFormat: @"mail/%@", [nameInContainer substringFromIndex: 6]] stringByEscapingURL]; } else { @@ -369,7 +373,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. case 15: { SOGoAppointmentFolders *appointmentFolders; - + SOGoCacheGCSObject *o; + NSString *key; + + nameInContainer = nil; + appointmentFolders = [userFolder privateCalendars: @"Calendar" inContext: context]; [appointmentFolders newFolderWithName: displayName nameInContainer: &nameInContainer]; @@ -377,16 +385,36 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nameInContainer = [NSString stringWithFormat: @"vevent/%@", nameInContainer]; else nameInContainer = [NSString stringWithFormat: @"vtodo/%@", nameInContainer]; + + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], nameInContainer ]; + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + [[o properties ] setObject: displayName forKey: @"displayName"]; + [o save]; } break; case 14: { SOGoContactFolders *contactFolders; + SOGoCacheGCSObject *o; + NSString *key; + + nameInContainer = nil; contactFolders = [userFolder privateContacts: @"Contacts" inContext: context]; [contactFolders newFolderWithName: displayName nameInContainer: &nameInContainer]; nameInContainer = [NSString stringWithFormat: @"vcard/%@", nameInContainer]; + + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], nameInContainer ]; + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + [[o properties ] setObject: displayName forKey: @"displayName"]; + [o save]; } break; default: @@ -428,66 +456,87 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inResponse: (WOResponse *) theResponse { SOGoMailAccounts *accountsFolder; - SOGoMailFolder *folderToDelete; SOGoUserFolder *userFolder; - id currentFolder; - NSException *error; - NSString *serverId; - + id currentFolder, folderToDelete; + NSString *serverId, *nameInCache, *key, *syncKey; + SOGoCacheGCSObject *o; + NSMutableString *s; + NSData *d; + SOGoMicrosoftActiveSyncFolderType folderType; - + serverId = [[[(id)[theDocumentElement getElementsByTagName: @"ServerId"] lastObject] textValue] realCollectionIdWithFolderType: &folderType]; + nameInCache = serverId; serverId = [self globallyUniqueIDToIMAPFolderName: serverId type: folderType]; - userFolder = [[context activeUser] homeFolderInContext: context]; - accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; - currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; - folderToDelete = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", serverId] - inContext: context - acquire: NO]; - - error = [folderToDelete delete]; - - if (!error) + switch (folderType) { - NSString *syncKey, *key; - SOGoCacheGCSObject *o; - NSMutableString *s; - NSData *d; + case ActiveSyncMailFolder: + { + nameInCache = [NSString stringWithFormat: @"folder%@", nameInCache]; + accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; + currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; + + folderToDelete = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", serverId] + inContext: context + acquire: NO]; + } + break; + case ActiveSyncEventFolder: + case ActiveSyncTaskFolder: + { + SOGoAppointmentFolders *appointmentFolders; - // - // We destroy the cache object - // - key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], [folderToDelete nameInContainer]]; - o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; - [o setTableUrl: [self folderTableURL]]; - [o destroy]; - - // - // We update the FolderSync's synckey - // - syncKey = [[NSProcessInfo processInfo] globallyUniqueString]; - - [self _setFolderSyncKey: syncKey]; - - s = [NSMutableString string]; - [s appendString: @""]; - [s appendString: @""]; - [s appendString: @""]; - [s appendFormat: @"%d", 1]; - [s appendFormat: @"%@", syncKey]; - [s appendString: @""]; - - d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; - - [theResponse setContent: d]; - } - else - { - [theResponse setStatus: 500]; - [theResponse appendContentString: @"Unable to delete folder."]; + if (folderType == ActiveSyncEventFolder) + nameInCache = [NSString stringWithFormat: @"vevent/%@", serverId]; + else + nameInCache = [NSString stringWithFormat: @"vtodo/%@", serverId]; + + appointmentFolders = [userFolder privateCalendars: @"Calendar" inContext: context]; + + folderToDelete = [appointmentFolders lookupName: [NSString stringWithFormat: @"%@", serverId] + inContext: context + acquire: NO]; + } + break; + default: + { + [theResponse setStatus: 500]; + [theResponse appendContentString: @"Unsupported folder type during creation."]; + return; + } } + + // FIXME: we should handle exception here + [folderToDelete delete]; + + // + // We destroy the cache object + // + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], nameInCache]; + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setTableUrl: [self folderTableURL]]; + [o destroy]; + + + // + // We update the FolderSync's synckey + // + syncKey = [[NSProcessInfo processInfo] globallyUniqueString]; + + [self _setFolderSyncKey: syncKey]; + + s = [NSMutableString string]; + [s appendString: @""]; + [s appendString: @""]; + [s appendString: @""]; + [s appendFormat: @"%d", 1]; + [s appendFormat: @"%@", syncKey]; + [s appendString: @""]; + + d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; + [theResponse setContent: d]; } // @@ -496,89 +545,127 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (void) processFolderUpdate: (id ) theDocumentElement inResponse: (WOResponse *) theResponse { - NSString *serverId, *parentId, *displayName; - SOGoMailAccounts *accountsFolder; + NSString *serverId, *parentId, *displayName, *newName, *nameInCache, *syncKey, *key; SOGoUserFolder *userFolder; - SOGoMailFolder *folderToUpdate; + SOGoCacheGCSObject *o; + NSMutableString *s; id currentFolder; - NSException *error; + NSData *d; SOGoMicrosoftActiveSyncFolderType folderType; - int status; serverId = [[[(id)[theDocumentElement getElementsByTagName: @"ServerId"] lastObject] textValue] realCollectionIdWithFolderType: &folderType]; + + nameInCache = [NSString stringWithFormat: @"folder%@", serverId]; + serverId = [self globallyUniqueIDToIMAPFolderName: serverId type: folderType]; parentId = [[(id)[theDocumentElement getElementsByTagName: @"ParentId"] lastObject] textValue]; displayName = [[(id)[theDocumentElement getElementsByTagName: @"DisplayName"] lastObject] textValue]; userFolder = [[context activeUser] homeFolderInContext: context]; - accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; - currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; + + + switch (folderType) + { + case ActiveSyncMailFolder: + { + SOGoMailAccounts *accountsFolder; + SOGoMailFolder *folderToUpdate; + + accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; + currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; - folderToUpdate = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", serverId] - inContext: context - acquire: NO]; + folderToUpdate = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", serverId] + inContext: context + acquire: NO]; - // If parent is 0 or displayname is not changed it is either a rename of a folder in 0 or a move to 0 - if ([parentId isEqualToString: @"0"] || - ([serverId hasSuffix: [NSString stringWithFormat: @"/%@", displayName]] && [parentId isEqualToString: @"0"])) - { - error = [folderToUpdate renameTo: [NSString stringWithFormat: @"/%@", [displayName stringByEncodingImap4FolderName]]]; - } - else - { - parentId = [self globallyUniqueIDToIMAPFolderName: [[parentId stringByUnescapingURL] substringFromIndex: 5] type: folderType]; - error = [folderToUpdate renameTo: [NSString stringWithFormat: @"%@/%@", [parentId stringByEncodingImap4FolderName], - [displayName stringByEncodingImap4FolderName]]]; + // If parent is 0 or displayname is not changed it is either a rename of a folder in 0 or a move to 0 + if ([parentId isEqualToString: @"0"] || + ([serverId hasSuffix: [NSString stringWithFormat: @"/%@", displayName]] && [parentId isEqualToString: @"0"])) + { + newName = [NSString stringWithFormat: @"%@", [displayName stringByEncodingImap4FolderName]]; + + // FIXME: handle exception here + [folderToUpdate renameTo: [NSString stringWithFormat: @"/%@", [displayName stringByEncodingImap4FolderName]]]; + } + else + { + parentId = [self globallyUniqueIDToIMAPFolderName: [[parentId stringByUnescapingURL] substringFromIndex: 5] type: folderType]; + newName = [NSString stringWithFormat: @"%@/%@", [parentId stringByEncodingImap4FolderName], [displayName stringByEncodingImap4FolderName]]; + + // FIXME: handle exception here + [folderToUpdate renameTo: newName]; + } + + + // + // We update our cache + // + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], nameInCache]; + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + [[o properties ] setObject: newName forKey: @"displayName"]; + [o save]; + } + break; + case ActiveSyncEventFolder: + case ActiveSyncTaskFolder: + { + SOGoAppointmentFolders *appointmentFolders; + SOGoAppointmentFolder *folderToUpdate; + NSString *nameInCache; + + appointmentFolders = [userFolder privateCalendars: @"Calendar" inContext: context]; + + folderToUpdate = [appointmentFolders lookupName: [NSString stringWithFormat: @"%@", serverId] + inContext: context + acquire: NO]; + + // update the cache anyway regardless of any error; if the rename fails next folderSync will to the cleanup + [folderToUpdate renameTo: [NSString stringWithFormat: @"%@", [displayName stringByEncodingImap4FolderName]]]; + + if (folderType == ActiveSyncEventFolder) + nameInCache = [NSString stringWithFormat: @"vevent/%@", serverId]; + else + nameInCache = [NSString stringWithFormat: @"vtodo/%@",serverId]; + + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], nameInCache ]; + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + [[o properties ] setObject: displayName forKey: @"displayName"]; + [o save]; + } + break; + default: + { + [theResponse setStatus: 500]; + [theResponse appendContentString: @"Unsupported folder type during creation."]; + return; + } } - // Handle new name exist - if (!error) - { - NSString *syncKey, *key; - SOGoCacheGCSObject *o; - NSMutableString *s; - NSData *d; - - // - // We update our cache - // - key = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], serverId]; - o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; - [o setTableUrl: [self folderTableURL]]; - [o reloadIfNeeded]; - - key = [NSString stringWithFormat: @"/%@+%@", [context objectForKey: @"DeviceId"], [folderToUpdate nameInContainer]]; - [o changePathTo: key]; + // + // We update the FolderSync's synckey + // + syncKey = [[NSProcessInfo processInfo] globallyUniqueString]; - // - // We update the FolderSync's synckey - // - syncKey = [[NSProcessInfo processInfo] globallyUniqueString]; + [self _setFolderSyncKey: syncKey]; - // See http://msdn.microsoft.com/en-us/library/gg675615(v=exchg.80).aspx - // we return '9' - we force a FolderSync - status = 1; - - [self _setFolderSyncKey: syncKey]; - - s = [NSMutableString string]; - [s appendString: @""]; - [s appendString: @""]; - [s appendString: @""]; - [s appendFormat: @"%d", status]; - [s appendFormat: @"%@", syncKey]; - [s appendString: @""]; + s = [NSMutableString string]; + [s appendString: @""]; + [s appendString: @""]; + [s appendString: @""]; + [s appendFormat: @"%d", 1]; + [s appendFormat: @"%@", syncKey]; + [s appendString: @""]; + + d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; - d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; - - [theResponse setContent: d]; - } - else - { - [theResponse setStatus: 500]; - [theResponse appendContentString: @"Unable to update folder."]; - } + [theResponse setContent: d]; } @@ -592,21 +679,36 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (void) processFolderSync: (id ) theDocumentElement inResponse: (WOResponse *) theResponse { - - NSMutableDictionary *metadata; - NSMutableString *s; - NSString *syncKey; + NSString *key, *cKey, *nkey, *name, *serverId, *parentId, *nameInCache, *personalFolderName, *syncKey, *folderType; + NSDictionary *folderMetadata, *imapGUIDs; + NSArray *allFoldersMetadata, *allKeys; + NSMutableDictionary *cachedGUIDs, *metadata; + SOGoMailAccounts *accountsFolder; + SOGoMailAccount *accountFolder; + NSMutableString *s, *commands; + SOGoUserFolder *userFolder; + NSMutableArray *folders; + SoSecurityManager *sm; + SOGoCacheGCSObject *o; + id currentFolder; NSData *d; - - BOOL first_sync; - int status; + int status, command_count, i, type, fi, count; + + BOOL first_sync; + + sm = [SoSecurityManager sharedSecurityManager]; metadata = [self _globalMetadataForDevice]; syncKey = [[(id)[theDocumentElement getElementsByTagName: @"SyncKey"] lastObject] textValue]; s = [NSMutableString string]; first_sync = NO; status = 1; + command_count = 0; + commands = [NSMutableString string]; + + [s appendString: @""]; + [s appendString: @""]; if ([syncKey isEqualToString: @"0"]) { @@ -616,215 +718,296 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. else if (![syncKey isEqualToString: [metadata objectForKey: @"FolderSyncKey"]]) { // Synchronization key mismatch or invalid synchronization key - status = 9; + //NSLog(@"FolderSync syncKey mismatch %@ <> %@", syncKey, metadata); + [s appendFormat: @"9"]; + + d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; + [theResponse setContent: d]; + return; } - [self _setFolderSyncKey: syncKey]; + userFolder = [[context activeUser] homeFolderInContext: context]; + accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; + accountFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; - [s appendString: @""]; - [s appendString: @""]; - [s appendFormat: @"%d%@", status, syncKey]; - - if (status == 1) - { - SOGoMailAccounts *accountsFolder; - SOGoMailAccount *accountFolder; - SOGoUserFolder *userFolder; - id currentFolder; - - NSString *key, *cKey, *nkey, *name, *serverId, *parentId; - NSDictionary *folderMetadata, *imapGUIDs; - NSArray *allFoldersMetadata, *allKeys; - NSMutableDictionary *cachedGUIDs; - NSMutableString *commands; - SOGoCacheGCSObject *o; - - int i, type, command_count; - - userFolder = [[context activeUser] homeFolderInContext: context]; - accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; - accountFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; - - allFoldersMetadata = [accountFolder allFoldersMetadata]; + allFoldersMetadata = [accountFolder allFoldersMetadata]; - // Get GUIDs of folder (IMAP) - // e.g. {INBOX = "sogo_73c_192bd57b_d8" - imapGUIDs = [accountFolder imapFolderGUIDs]; + // Get GUIDs of folder (IMAP) + // e.g. {folderINBOX = folder6b93c528176f1151c7260000aef6df92} + imapGUIDs = [accountFolder imapFolderGUIDs]; - cachedGUIDs = [NSMutableDictionary dictionary]; + cachedGUIDs = [NSMutableDictionary dictionary]; - // No need to read cached folder infos during first sync. Otherwise, pull it from the database. - // e.g. {"sogo_73c_192bd57b_d8" = INBOX} - guid = foldername for easy reverse lookup with imapGUIDs - if (!first_sync) - { - NSArray *foldersInCache; - NSString *folderName; + // No need to read cached folder infos during first sync. Otherwise, pull it from the database. + // e.g. {folder6b93c528176f1151c7260000aef6df92 = folderINBOX} - guid = foldername for easy reverse lookup with imapGUIDs + if (!first_sync) + { + NSArray *foldersInCache; - // get the list of folder stored in cache - key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], @"0"]; - o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; - [o setObjectType: ActiveSyncFolderCacheObject]; - [o setTableUrl: [self folderTableURL]]; - [o reloadIfNeeded]; - foldersInCache = [o folderList: [context objectForKey: @"DeviceId"] newerThanVersion: -1]; - - // get guids of folders stored in cache - for (i = 0; i < [foldersInCache count]; i++) - { - folderName = [foldersInCache objectAtIndex: i]; - key = [folderName substringFromIndex: 1]; - - o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; - [o setObjectType: ActiveSyncFolderCacheObject]; - [o setTableUrl: [self folderTableURL]]; - [o reloadIfNeeded]; - - if ([[o properties ] objectForKey: @"GUID"]) - [cachedGUIDs setObject: [key substringFromIndex: [key rangeOfString: @"+"].location+7] - forKey: [[o properties] objectForKey: @"GUID"]]; - } - } + o = [SOGoCacheGCSObject objectWithName: @"0" inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: folderTableURL]; + + foldersInCache = [o cacheEntriesForDeviceId: [context objectForKey: @"DeviceId"] newerThanVersion: -1]; + + // get guids of folders stored in cache + for (i = 0; i < [foldersInCache count]; i++) + { + key = [[foldersInCache objectAtIndex: i] substringFromIndex: 1]; + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + + // When the GUID entry exists the name of the entry has to be changed to new name + if ([[o properties] objectForKey: @"GUID"]) + { + //NSLog(@"Old cacheEntry: %@ displayName: %@ GUID: %@", key, [[o properties] objectForKey: @"displayName"], [[o properties] objectForKey: @"GUID"]); + key = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], [[o properties] objectForKey: @"GUID"]]; + //NSLog(@"New cacheEntry: %@", key); + [[o properties] removeObjectForKey: @"GUID"]; + [[o properties ] setObject: @"updateMe" forKey: @"displayName"]; + [o save]; + [o changePathTo: [NSString stringWithFormat: @"%@", key]]; + } + + // no dispalay Name + if (![[o properties] objectForKey: @"displayName"]) + continue; + + if ([key rangeOfString: @"+folder" options: NSCaseInsensitiveSearch].location != NSNotFound) + [cachedGUIDs setObject: [NSString stringWithFormat: @"folder%@", [[o properties] objectForKey: @"displayName"]] // e.g. CDB648DDBC5040F8AC90792383DBBBAA+folderINBOX + forKey: [key substringFromIndex: [key rangeOfString: @"+"].location+1]]; + else + [cachedGUIDs setObject: [key substringFromIndex: [key rangeOfString: @"+"].location+1] // e.g. CDB648DDBC5040F8AC90792383DBBBAA+vcard/personal + forKey: [key substringFromIndex: [key rangeOfString: @"+"].location+1]]; + } + } - // Handle folders that have been deleted over IMAP - command_count = 0; - commands = [NSMutableString string]; - allKeys = [cachedGUIDs allKeys]; + // Handle folders that have been deleted on server + allKeys = [cachedGUIDs allKeys]; - for (i = 0; i < [allKeys count]; i++) - { - cKey = [allKeys objectAtIndex: i]; + for (i = 0; i < [allKeys count]; i++) + { + cKey = [allKeys objectAtIndex: i]; - if (![imapGUIDs allKeysForObject: cKey]) - { - // Destroy folders cache content to avoid stale data if a new folder gets created with the same name - key = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], [cachedGUIDs objectForKey: cKey]]; - o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; - [o setObjectType: ActiveSyncFolderCacheObject]; - [o setTableUrl: [self folderTableURL]]; - [o reloadIfNeeded]; - - // Only send a delete command if GUID is found - if ([[o properties] objectForKey: @"GUID"]) + // ignore invalid folder in cache caused by fs code bugs + if ([cKey isEqualToString:@"(null)"]) + continue; + + // if a cache entry is not found in imapGUIDs its either an imap which has been deleted or its an other folder type which can be checked via lookupName. + if (![imapGUIDs allKeysForObject: cKey]) + { + // Destroy folders cache content to avoid stale data if a new folder gets created with the same name + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], cKey]; + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + + if ([cKey hasPrefix: @"folder"]) + { + [commands appendFormat: @"%@", [[NSString stringWithFormat: @"mail/%@", [cKey substringFromIndex: 6]] stringByEscapingURL]] ; + command_count++; + + [o destroy]; + } + else + { + if ([cKey rangeOfString: @"vevent" options: NSCaseInsensitiveSearch].location != NSNotFound || + [cKey rangeOfString: @"vtodo" options: NSCaseInsensitiveSearch].location != NSNotFound) + folderType = @"Calendar"; + else + folderType = @"Contacts"; + + if ([ cKey rangeOfString: @"/"].location != NSNotFound) + currentFolder = [[[[context activeUser] homeFolderInContext: context] lookupName: folderType inContext: context acquire: NO] + lookupName: [cKey substringFromIndex: [cKey rangeOfString: @"/"].location+1] inContext: context acquire: NO]; + + // remove the folder from device if it doesn't exists or it has not the proper permissions + if (!currentFolder || + [sm validatePermission: SoPerm_DeleteObjects + onObject: currentFolder + inContext: context] || + [sm validatePermission: SoPerm_AddDocumentsImagesAndFiles + onObject: currentFolder + inContext: context]) { - [commands appendFormat: @"%@", [[NSString stringWithFormat: @"mail/%@", [[o properties ] objectForKey: @"GUID"]] stringByEscapingURL] ]; + [commands appendFormat: @"%@", [cKey stringByEscapingURL] ]; command_count++; - } - - [o destroy]; - } - } - - // Handle addition and changes - for (i = 0; i < [allFoldersMetadata count]; i++) - { - folderMetadata = [allFoldersMetadata objectAtIndex: i]; - - // No GUID -> no sync - if (!([imapGUIDs objectForKey: [[folderMetadata objectForKey: @"path"] substringFromIndex: 1]])) - continue; - - serverId = [NSString stringWithFormat: @"mail/%@", [imapGUIDs objectForKey: [[folderMetadata objectForKey: @"path"] substringFromIndex: 1]]]; - name = [folderMetadata objectForKey: @"displayName"]; - - if ([name hasPrefix: @"/"]) - name = [name substringFromIndex: 1]; - - if ([name hasSuffix: @"/"]) - name = [name substringToIndex: [name length]-1]; - - type = [[folderMetadata objectForKey: @"type"] activeSyncFolderType]; - parentId = @"0"; - - if ([folderMetadata objectForKey: @"parent"]) - { - parentId = [NSString stringWithFormat: @"mail/%@", [imapGUIDs objectForKey: [[folderMetadata objectForKey: @"parent"] substringFromIndex: 1]]]; - name = [[name pathComponents] lastObject]; - } - - // Decide between add and change - if ([cachedGUIDs objectForKey: [imapGUIDs objectForKey: [[folderMetadata objectForKey: @"path"] substringFromIndex: 1]]]) - { - // Search GUID to check name change in cache (diff between IMAP and cache) - if ((![[[folderMetadata objectForKey: @"path"] substringFromIndex: 1] isEqualToString: [imapGUIDs objectForKey: [cachedGUIDs objectForKey: - [[folderMetadata objectForKey: @"path"] substringFromIndex: 1]]]])) - { - key = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], [cachedGUIDs objectForKey: - [imapGUIDs objectForKey: [[folderMetadata objectForKey: @"path"] substringFromIndex: 1]]]]; - nkey = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], [[folderMetadata objectForKey: @"path"] substringFromIndex: 1] ]; - - if (![key isEqualToString: nkey]) - { - [commands appendFormat: @"%@%@%d%@", - [serverId stringByEscapingURL], - [parentId stringByEscapingURL], - type, - [name activeSyncRepresentationInContext: context]]; - - - // Change path in cache - o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; - [o setObjectType: ActiveSyncFolderCacheObject]; - [o setTableUrl: [self folderTableURL]]; - [o reloadIfNeeded]; - [o changePathTo: [NSString stringWithFormat: @"/%@", nkey]]; // ?? why is '/' prefix needed - problem in changePathTo? - - command_count++; - } + [o destroy]; } } - else - { - [commands appendFormat: @"%@%@%d%@", + } + } + + // Handle addition and changes + for (i = 0; i < [allFoldersMetadata count]; i++) + { + folderMetadata = [allFoldersMetadata objectAtIndex: i]; + + nameInCache = [NSString stringWithFormat: @"folder%@", [[folderMetadata objectForKey: @"path"] substringFromIndex: 1]]; + serverId = [NSString stringWithFormat: @"mail/%@", [[imapGUIDs objectForKey: nameInCache] substringFromIndex: 6]]; + name = [folderMetadata objectForKey: @"displayName"]; + + if ([name hasPrefix: @"/"]) + name = [name substringFromIndex: 1]; + + if ([name hasSuffix: @"/"]) + name = [name substringToIndex: [name length]-1]; + + type = [[folderMetadata objectForKey: @"type"] activeSyncFolderType]; + parentId = @"0"; + + if ([folderMetadata objectForKey: @"parent"]) + { + parentId = [NSString stringWithFormat: @"mail/%@", [[imapGUIDs objectForKey: [NSString stringWithFormat: @"folder%@", [[folderMetadata objectForKey: @"parent"] substringFromIndex: 1]]] substringFromIndex: 6]]; + name = [[name pathComponents] lastObject]; + } + + // Decide between add and change + if ([cachedGUIDs objectForKey: [imapGUIDs objectForKey: nameInCache]]) + { + // Search GUID to check name change in cache (diff between IMAP and cache) + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], [cachedGUIDs objectForKey: [imapGUIDs objectForKey: nameInCache ]]]; + nkey = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], [[folderMetadata objectForKey: @"path"] substringFromIndex: 1] ]; + + if (![key isEqualToString: nkey]) + { + [commands appendFormat: @"%@%@%@%d", + [serverId stringByEscapingURL], + [parentId stringByEscapingURL], + [name activeSyncRepresentationInContext: context], type]; + + // Change path in cache + o = [SOGoCacheGCSObject objectWithName: [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], [imapGUIDs objectForKey: nameInCache ]] inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + + [[o properties ] setObject: [[folderMetadata objectForKey: @"path"] substringFromIndex: 1] forKey: @"displayName"]; + [o save]; + + command_count++; + } + } + else + { + [commands appendFormat: @"%@%@%@%d", [serverId stringByEscapingURL], [parentId stringByEscapingURL], - type, - [name activeSyncRepresentationInContext: context]]; + [name activeSyncRepresentationInContext: context], type]; - // Store folder's GUID in cache - key = [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], [[folderMetadata objectForKey: @"path"] substringFromIndex: 1]]; - o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; - [o setObjectType: ActiveSyncFolderCacheObject]; - [o setTableUrl: [self folderTableURL]]; - [o reloadIfNeeded]; + // Store folder's displayName in cache + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], [imapGUIDs objectForKey: nameInCache ]]; + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; - [[o properties ] setObject: [imapGUIDs objectForKey: [[folderMetadata objectForKey: @"path"] substringFromIndex: 1]] forKey: @"GUID"]; - [o save]; + [[o properties ] setObject: [[folderMetadata objectForKey: @"path"] substringFromIndex: 1] forKey: @"displayName"]; + [o save]; - command_count++; - } - } - - if (first_sync) - [s appendFormat: @"%d", command_count+3]; - else - [s appendFormat: @"%d", command_count]; - - if (command_count > 0) - [s appendFormat: @"%@", commands]; - - if (first_sync) - { - // We add the personal calendar - events - // FIXME: add all calendars - currentFolder = [[context activeUser] personalCalendarFolderInContext: context]; - name = [NSString stringWithFormat: @"vevent/%@", [currentFolder nameInContainer]]; - [s appendFormat: @"%@%@%d%@", name, @"0", 8, [[currentFolder displayName] activeSyncRepresentationInContext: context]]; - - // We add the personal calendar - tasks - // FIXME: add all calendars - currentFolder = [[context activeUser] personalCalendarFolderInContext: context]; - name = [NSString stringWithFormat: @"vtodo/%@", [currentFolder nameInContainer]]; - [s appendFormat: @"%@%@%d%@", name, @"0", 7, [[currentFolder displayName] activeSyncRepresentationInContext: context]]; - - // We add the personal address book - // FIXME: add all address books - currentFolder = [[context activeUser] personalContactsFolderInContext: context]; - name = [NSString stringWithFormat: @"vcard/%@", [currentFolder nameInContainer]]; - [s appendFormat: @"%@%@%d%@", name, @"0", 9, [[currentFolder displayName] activeSyncRepresentationInContext: context]]; - } + command_count++; + } } + + personalFolderName = [[[context activeUser] personalCalendarFolderInContext: context] nameInContainer]; + folders = [[[[[context activeUser] homeFolderInContext: context] lookupName: @"Calendar" inContext: context acquire: NO] subFolders] mutableCopy]; + [folders addObjectsFromArray: [[[[context activeUser] homeFolderInContext: context] lookupName: @"Contacts" inContext: context acquire: NO] subFolders]]; + + // Inside this loop we remove all the folder without write/delete permissions + count = [folders count]-1; + for (; count >= 0; count--) + { + if ([sm validatePermission: SoPerm_DeleteObjects + onObject: [folders objectAtIndex: count] + inContext: context] || + [sm validatePermission: SoPerm_AddDocumentsImagesAndFiles + onObject: [folders objectAtIndex: count] + inContext: context]) + { + [folders removeObjectAtIndex: count]; + } + } + + count = [folders count]-1; + NSString *operation; + + for (fi = 0; fi <= count ; fi++) + { + if ([[folders objectAtIndex:fi] isKindOfClass: [SOGoAppointmentFolder class]]) + name = [NSString stringWithFormat: @"vevent/%@", [[folders objectAtIndex:fi] nameInContainer]]; + else + name = [NSString stringWithFormat: @"vcard/%@", [[folders objectAtIndex:fi] nameInContainer]]; + + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], name]; + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + + // Decide between add and change + if (![[o properties ] objectForKey: @"displayName"] || first_sync) + operation = @"Add"; + else if (![[[o properties ] objectForKey: @"displayName"] isEqualToString: [[folders objectAtIndex:fi] displayName]]) + operation = @"Update"; + else + operation = nil; + + if (operation) + { + if ([[folders objectAtIndex:fi] isKindOfClass: [SOGoAppointmentFolder class]]) + { + type = ([[[folders objectAtIndex:fi] nameInContainer] isEqualToString: personalFolderName] ? 8 : 13); + [commands appendFormat: @"<%@>%@%@%@%d", operation, + [name stringByEscapingURL], @"0", [[[folders objectAtIndex:fi] displayName] activeSyncRepresentationInContext: context], type, operation]; + + command_count++; + + [[o properties ] setObject: [[folders objectAtIndex:fi] displayName] forKey: @"displayName"]; + [o save]; + + name = [NSString stringWithFormat: @"vtodo/%@", [[folders objectAtIndex:fi] nameInContainer]]; + type = ([[[folders objectAtIndex:fi] nameInContainer] isEqualToString: personalFolderName] ? 7 : 15); + [commands appendFormat: @"<%@>%@%@%@%d", operation, + [name stringByEscapingURL], @"0", [[[folders objectAtIndex:fi] displayName] activeSyncRepresentationInContext: context], type, operation]; + + command_count++; + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], name]; + + o = [SOGoCacheGCSObject objectWithName: key inContainer: nil]; + [o setObjectType: ActiveSyncFolderCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + [[o properties ] setObject: [[folders objectAtIndex:fi] displayName] forKey: @"displayName"]; + [o save]; + } + else + { + type = ([[[folders objectAtIndex:fi] nameInContainer] isEqualToString: personalFolderName] ? 9 : 14); + [commands appendFormat: @"<%@>%@%@%@%d", operation, + [name stringByEscapingURL], @"0", [[[folders objectAtIndex:fi] displayName] activeSyncRepresentationInContext: context], type, operation]; + + command_count++; + + [[o properties ] setObject: [[folders objectAtIndex:fi] displayName] forKey: @"displayName"]; + [o save]; + } + } + } + - [s appendString: @""]; + // set a new syncKey if there are folder changes + if (command_count > 0) + { + syncKey = [[NSProcessInfo processInfo] globallyUniqueString]; + [self _setFolderSyncKey: syncKey]; + } + + + [s appendFormat: @"%d", status]; + [s appendFormat: @"%@%d%@", syncKey, command_count, commands]; d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; @@ -906,7 +1089,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (void) processGetItemEstimate: (id ) theDocumentElement inResponse: (WOResponse *) theResponse { - NSString *collectionId, *realCollectionId; + NSString *collectionId, *realCollectionId, *nameInCache; id currentCollection; NSMutableString *s; NSData *d; @@ -920,7 +1103,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. collectionId = [[(id)[theDocumentElement getElementsByTagName: @"CollectionId"] lastObject] textValue]; realCollectionId = [collectionId realCollectionIdWithFolderType: &folderType]; + + if (folderType == ActiveSyncMailFolder) + nameInCache = [NSString stringWithFormat: @"folder%@", realCollectionId]; + else + nameInCache = collectionId; + realCollectionId = [self globallyUniqueIDToIMAPFolderName: realCollectionId type: folderType]; + currentCollection = [self collectionFromId: realCollectionId type: folderType]; // @@ -955,7 +1145,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. count = [uids count]; // Add the number of UIDs expected to "soft delete" - count += [self _softDeleteCountWithFilter: filter collectionId: realCollectionId]; + count += [self _softDeleteCountWithFilter: filter collectionId: nameInCache]; } else @@ -1211,6 +1401,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOGoMicrosoftActiveSyncFolderType srcFolderType, dstFolderType; id aMoveOperation; NSArray *moveOperations; + SoSecurityManager *sm; NSMutableString *s; NSData *d; int i; @@ -1233,8 +1424,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [s appendString: @""]; - // FIXME - we should support moving events between calendars, for example, or - // or contacts between address books. if (srcFolderType == ActiveSyncMailFolder && dstFolderType == ActiveSyncMailFolder) { NGImap4Client *client; @@ -1309,13 +1498,66 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } else { - // Non-mail move operations - unsupported for now. - [s appendFormat: @"%d", 1]; + id srcCollection, dstCollection, srcSogoObject, dstSogoObject; + NSArray *elements; + NSString *newUID; + NSException *ex; + + unsigned int count, max; + + srcCollection = [self collectionFromId: srcFolderId type: srcFolderType]; + dstCollection = [self collectionFromId: dstFolderId type: srcFolderType]; + + srcSogoObject = [srcCollection lookupName: [srcMessageId sanitizedServerIdWithType: srcFolderType] + inContext: context + acquire: NO]; + + sm = [SoSecurityManager sharedSecurityManager]; + if (![sm validatePermission: SoPerm_DeleteObjects + onObject: srcCollection + inContext: context]) + { + if (![sm validatePermission: SoPerm_AddDocumentsImagesAndFiles + onObject: dstCollection + inContext: context]) + { + newUID = [srcSogoObject globallyUniqueObjectId]; + dstSogoObject = [[SOGoAppointmentObject alloc] initWithName: [newUID sanitizedServerIdWithType: srcFolderType] + inContainer: dstCollection]; + elements = [[srcSogoObject calendar: NO secure: NO] allObjects]; + max = [elements count]; + for (count = 0; count < max; count++) + [[elements objectAtIndex: count] setUid: newUID]; + + ex = [dstSogoObject saveCalendar: [srcSogoObject calendar: NO secure: NO]]; + if (!ex) + { + ex = [srcSogoObject delete]; + [s appendFormat: @"%@", srcMessageId]; + [s appendFormat: @"%@", newUID]; + [s appendFormat: @"%d", 3]; + } + else + { + [s appendFormat: @"%@", srcMessageId]; + [s appendFormat: @"%d", 1]; + } + } + else + { + [s appendFormat: @"%@", srcMessageId]; + [s appendFormat: @"%d", 2]; + } + } + else + { + [s appendFormat: @"%@", srcMessageId]; + [s appendFormat: @"%d", 1]; + } } [s appendString: @""]; } - [s appendString: @""]; @@ -1421,7 +1663,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. allValues = [[accountFolder imapFolderGUIDs] allValues]; for (i = 0; i < [allValues count]; i++) - [allFoldersID addObject: [NSString stringWithFormat: @"mail/%@", [allValues objectAtIndex: i]]]; + [allFoldersID addObject: [NSString stringWithFormat: @"mail/%@", [[allValues objectAtIndex: i] substringFromIndex: 6]]]; // FIXME: handle multiple GCS collecitons @@ -1449,26 +1691,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. collectionId = [allFoldersID objectAtIndex: j]; realCollectionId = [collectionId realCollectionIdWithFolderType: &folderType]; realCollectionId = [self globallyUniqueIDToIMAPFolderName: realCollectionId type: folderType]; + + if (folderType == ActiveSyncMailFolder) + folderMetadata = [self _folderMetadataForKey: [NSString stringWithFormat: @"folder%@", [[collectionId stringByUnescapingURL] substringFromIndex:5]]]; + else + folderMetadata = [self _folderMetadataForKey: [collectionId stringByUnescapingURL]]; + collection = [self collectionFromId: realCollectionId type: folderType]; - - switch (folderType) - { - case ActiveSyncContactFolder: - folderMetadata = [self _folderMetadataForKey: [NSString stringWithFormat: @"vcard/%@", [collection nameInContainer]]]; - break; - case ActiveSyncEventFolder: - folderMetadata = [self _folderMetadataForKey: [NSString stringWithFormat: @"vevent/%@", [collection nameInContainer]]]; - break; - case ActiveSyncTaskFolder: - folderMetadata = [self _folderMetadataForKey: [NSString stringWithFormat: @"vtodo/%@", [collection nameInContainer]]]; - break; - default: - folderMetadata = [self _folderMetadataForKey: [collection nameInContainer]]; - } + + // If collection doesn't exist skip it - next foldersync will do the cleanup + if (!collection) + continue; syncKey = [folderMetadata objectForKey: @"SyncKey"]; - if (![syncKey isEqualToString: [collection davCollectionTag]]) + if (syncKey && ![syncKey isEqualToString: [collection davCollectionTag]]) { [foldersWithChanges addObject: collectionId]; } @@ -2142,7 +2379,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { d = [[theRequest content] wbxml2xml]; } - documentElement = nil; if (!d) @@ -2165,7 +2401,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } else { - // Ping command with empty body + // Ping or Sync command with empty body cmdName = [NSString stringWithFormat: @"process%@:inResponse:", cmdName]; } diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index e5f349092..e111b9edb 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -67,8 +67,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include - #include +#include typedef struct { uint32_t dwLowDateTime; @@ -323,6 +323,11 @@ struct GlobalObjectId { if (s) { + // We sanitize the content immediately, in case we have non-UNICODE safe + // characters that would be re-encoded later in HTML entities and thus, + // ignore afterwards. + s = [s safeString]; + body = [s dataUsingEncoding: NSUTF8StringEncoding]; } diff --git a/ActiveSync/common.make b/ActiveSync/common.make index 505f53f88..15024630c 100644 --- a/ActiveSync/common.make +++ b/ActiveSync/common.make @@ -16,10 +16,11 @@ ADDITIONAL_INCLUDE_DIRS += \ -I../../SOPE ADDITIONAL_LIB_DIRS += \ - -L../SoObjects/SOGo/SOGo.framework/ \ + -L../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo \ -L../SoObjects/SOGo/$(GNUSTEP_OBJ_DIR)/ \ -L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \ - -L/usr/local/lib + -L/usr/local/lib \ + -Wl,-rpath,$(GNUSTEP_SYSTEM_LIBRARIES)/sogo BUNDLE_LIBS += \ -lSOGo \ diff --git a/ActiveSync/iCalEvent+ActiveSync.m b/ActiveSync/iCalEvent+ActiveSync.m index bbffb0292..6d4d4ad4d 100644 --- a/ActiveSync/iCalEvent+ActiveSync.m +++ b/ActiveSync/iCalEvent+ActiveSync.m @@ -127,7 +127,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. tz = [(iCalDateTime *)[self firstChildWithTag: @"dtstart"] timeZone]; if (!tz) - tz = [iCalTimeZone timeZoneForName: @"Europe/London"]; + tz = [iCalTimeZone timeZoneForName: [userTimeZone name]]; [s appendFormat: @"%@", [tz activeSyncRepresentationInContext: context]]; @@ -334,14 +334,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [o intValue]; } - // - // - // - if ((o = [theValues objectForKey: @"MeetingStatus"])) - { - [o intValue]; - } - // // 0- normal, 1- personal, 2- private and 3-confidential // @@ -361,14 +353,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [self setAccessClass: @"PUBLIC"]; } } - - if ((o = [theValues objectForKey: @"TimeZone"])) - { - // Ugh, we ignore it for now. - userTimeZone = [[[context activeUser] userDefaults] timeZone]; - tz = [iCalTimeZone timeZoneForName: [userTimeZone name]]; - [(iCalCalendar *) parent addTimeZone: tz]; - } + + // We ignore TimeZone sent by mobile devices for now. + // Some Windows devices don't send during event updates. + //if ((o = [theValues objectForKey: @"TimeZone"])) + // { + userTimeZone = [[[context activeUser] userDefaults] timeZone]; + tz = [iCalTimeZone timeZoneForName: [userTimeZone name]]; + [(iCalCalendar *) parent addTimeZone: tz]; + //} // FIXME: merge with iCalToDo if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"])) @@ -481,11 +474,33 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [self setOrganizer: person]; } + // + // iOS is plain stupid here. It seends event invitations with no Organizer. + // We check this corner-case and if MeetingStatus == 1 (see http://msdn.microsoft.com/en-us/library/ee219342(v=exchg.80).aspx or details) + // and there's no organizer, we fake one. + // + if ((o = [theValues objectForKey: @"MeetingStatus"])) + { + if ([o intValue] == 1 && ![theValues objectForKey: @"Organizer_Email"]) + { + iCalPerson *person; + + person = [iCalPerson elementWithTag: @"organizer"]; + [person setEmail: [[[context activeUser] primaryIdentity] objectForKey: @"email"]]; + [person setCn: [[context activeUser] cn]]; + [person setPartStat: @"ACCEPTED"]; + [self setOrganizer: person]; + } + } + + // Attendees - we don't touch the values if we're an attendee. This is gonna // be done automatically by the ActiveSync client when invoking MeetingResponse. if (![self userIsAttendee: [context activeUser]]) { - if ((o = [theValues objectForKey: @"Attendees"])) + // Windows phones sens sometimes an empty Attendees tag. + // We check it's an array before processing it. + if ((o = [theValues objectForKey: @"Attendees"])&& [o isKindOfClass: [NSArray class]]) { NSMutableArray *attendees; NSDictionary *attendee; diff --git a/ActiveSync/iCalTimeZone+ActiveSync.m b/ActiveSync/iCalTimeZone+ActiveSync.m index 0670acc11..c4c0071fd 100644 --- a/ActiveSync/iCalTimeZone+ActiveSync.m +++ b/ActiveSync/iCalTimeZone+ActiveSync.m @@ -76,15 +76,17 @@ struct SYSTEMTIME { byMonth = [rrule byMonth]; if ([byMonth count] > 0) { + tzData->wYear = 0; tzData->wMonth = [[byMonth objectAtIndex: 0] intValue]; mask = [rrule byDayMask]; tzData->wDayOfWeek = [mask firstDay]; - tzData->wDay = [mask firstOccurrence]; + tzData->wDay = ([mask firstOccurrence] == -1) ? 5 : [mask firstOccurrence]; dateValue = [self startDate]; tzData->wHour = [dateValue hourOfDay]; tzData->wMinute = [dateValue minuteOfHour]; tzData->wSecond = [dateValue secondOfMinute]; + tzData->wMilliseconds = 0; } } diff --git a/ChangeLog b/ChangeLog index baaa62e66..18af70a99 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,1394 @@ +commit f7f78eaba6ac5304df937f5b26f5d21979657787 +Author: Francis Lachapelle +Date: Fri Nov 21 09:07:39 2014 -0500 + + Update CKEditor to version 4.4.5 + +M NEWS +M UI/WebServerResources/ckeditor/build-config.js +M UI/WebServerResources/ckeditor/ckeditor.js +M UI/WebServerResources/ckeditor/lang/ar.js +M UI/WebServerResources/ckeditor/lang/ca.js +M UI/WebServerResources/ckeditor/lang/cs.js +M UI/WebServerResources/ckeditor/lang/cy.js +M UI/WebServerResources/ckeditor/lang/da.js +M UI/WebServerResources/ckeditor/lang/de.js +M UI/WebServerResources/ckeditor/lang/es.js +M UI/WebServerResources/ckeditor/lang/fi.js +M UI/WebServerResources/ckeditor/lang/fr.js +M UI/WebServerResources/ckeditor/lang/hu.js +M UI/WebServerResources/ckeditor/lang/is.js +M UI/WebServerResources/ckeditor/lang/it.js +M UI/WebServerResources/ckeditor/lang/nb.js +M UI/WebServerResources/ckeditor/lang/nl.js +M UI/WebServerResources/ckeditor/lang/no.js +M UI/WebServerResources/ckeditor/lang/pl.js +M UI/WebServerResources/ckeditor/lang/pt-br.js +M UI/WebServerResources/ckeditor/lang/ru.js +M UI/WebServerResources/ckeditor/lang/sk.js +M UI/WebServerResources/ckeditor/lang/sv.js +M UI/WebServerResources/ckeditor/lang/uk.js +M UI/WebServerResources/ckeditor/plugins/about/dialogs/about.js +M UI/WebServerResources/ckeditor/plugins/image/dialogs/image.js +M UI/WebServerResources/ckeditor/plugins/link/images/anchor.png +M UI/WebServerResources/ckeditor/plugins/link/images/hidpi/anchor.png +M UI/WebServerResources/ckeditor/skins/moono/editor_ie7.css +M UI/WebServerResources/ckeditor/skins/moono/editor_iequirks.css +M UI/WebServerResources/ckeditor/skins/moono/images/arrow.png +M UI/WebServerResources/ckeditor/skins/moono/images/close.png +M UI/WebServerResources/ckeditor/skins/moono/images/hidpi/close.png +M UI/WebServerResources/ckeditor/skins/moono/images/hidpi/lock-open.png +M UI/WebServerResources/ckeditor/skins/moono/images/hidpi/lock.png +M UI/WebServerResources/ckeditor/skins/moono/images/hidpi/refresh.png +M UI/WebServerResources/ckeditor/skins/moono/images/lock-open.png +M UI/WebServerResources/ckeditor/skins/moono/images/lock.png +M UI/WebServerResources/ckeditor/skins/moono/images/refresh.png + +commit 78ea1473834b84f4cb06656a50b58fc8cf50c2a7 +Author: Francis Lachapelle +Date: Fri Nov 21 08:52:52 2014 -0500 + + Update translations + +M NEWS +M SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings +M SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings +M SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings +M SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings +M UI/AdministrationUI/SpanishArgentina.lproj/Localizable.strings +M UI/Common/BrazilianPortuguese.lproj/Localizable.strings +M UI/Common/SpanishArgentina.lproj/Localizable.strings +M UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings +M UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings +M UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings +M UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/MailerUI/SpanishArgentina.lproj/Localizable.strings +M UI/MainUI/SpanishArgentina.lproj/Localizable.strings +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/PreferencesUI/Czech.lproj/Localizable.strings +M UI/PreferencesUI/Dutch.lproj/Localizable.strings +M UI/PreferencesUI/Finnish.lproj/Localizable.strings +M UI/PreferencesUI/French.lproj/Localizable.strings +M UI/PreferencesUI/German.lproj/Localizable.strings +M UI/PreferencesUI/Hungarian.lproj/Localizable.strings +M UI/PreferencesUI/Polish.lproj/Localizable.strings +M UI/PreferencesUI/Russian.lproj/Localizable.strings +M UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +M UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings +M UI/Scheduler/SpanishArgentina.lproj/Localizable.strings + +commit f7935c6084e0ba5e933c639f115120177e68534c +Author: Ludovic Marcotte +Date: Fri Nov 21 08:29:25 2014 -0500 + + Bumped version numbers for the releasex + +M Documentation/docinfo.xml +M Documentation/includes/global-attributes.asciidoc +M NEWS + +commit 327147f7162c1df4f37ff96f6ce815e48cab9bf7 +Author: Ludovic Marcotte +Date: Wed Nov 19 12:07:50 2014 -0500 + + Fixed typo + +M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc + +commit b4718f363bd439b5521ef1f13946a20ffe5cd408 +Author: Ludovic Marcotte +Date: Wed Nov 19 12:06:44 2014 -0500 + + More documentation fixes for v2.2.10 + +M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc + +commit 95e3c7ca88403003305c2bf32166fdeac45f0005 +Author: Ludovic Marcotte +Date: Tue Nov 18 18:36:59 2014 -0500 + + More doc fixes for v2.2.10 + +M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc + +commit 6bbaf58d437a1233519800758711624dc8f9a998 +Author: Ludovic Marcotte +Date: Tue Nov 18 16:56:45 2014 -0500 + + Initial pass of the doc for v2.2.10 on Debian/Ubuntu + +M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc + +commit ac55509aea982d07c02d429f88131d8da468181b +Author: Ludovic Marcotte +Date: Tue Nov 18 12:45:15 2014 -0500 + + Updated NEWS file regarding the SOPE commit for bug #2957 + +M NEWS + +commit 19221beb1fc0aab45c0b7bcc5fb9ccd9e7561f73 +Author: Jens Erat +Date: Sun Nov 9 22:11:37 2014 +0100 + + Removed erroneous backslash in documentation + +M Documentation/SOGoInstallationGuide.asciidoc + +commit 3d18c94789235c50a8028d209b5cbf0203cb5dce +Author: Francis Lachapelle +Date: Mon Nov 17 14:24:14 2014 -0500 + + Fix extraction of email addresses in some cases + + Fixes #2945 + +M NEWS +M UI/WebServerResources/UIxMailToSelection.js + +commit 1f167d9e821e5d4b54323c048e744c657dc4dd48 +Author: Ludovic Marcotte +Date: Mon Nov 17 11:49:56 2014 -0500 + + Fixed IMAP searches with non-ASCII folder names + +M NEWS +M UI/MailerUI/UIxMailSearch.m +M UI/Templates/MailerUI/UIxMailSearch.wox +M UI/WebServerResources/UIxMailSearch.js + +commit 3872341a85c4e54a5671bde5e414c58c1ebca19e +Author: Ludovic Marcotte +Date: Fri Nov 14 10:34:36 2014 -0500 + + Added required patch for previous commit + +M SoObjects/SOGo/SOGoGCSFolder.m + +commit b3cd609ae76414237db120fd76545afe11f6346b +Author: Ludovic Marcotte +Date: Fri Nov 14 09:13:14 2014 -0500 + + Added WindowSize support for GCS collections + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M NEWS + +commit c0f0f2023c09352179251c9158d9014d9fab55a7 +Author: Ludovic Marcotte +Date: Wed Nov 12 15:09:26 2014 -0500 + + added NEWS entry for BSON goodie + +M NEWS + +commit ea43f4a635124fc012f994a02b95a9f277d4345e +Author: Ludovic Marcotte +Date: Wed Nov 12 15:05:05 2014 -0500 + + Comment improvement + +M ActiveSync/SOGoActiveSyncDispatcher.m + +commit d25fe1a58b23e012e83b52979ce98020b4bd5f63 +Author: Ludovic Marcotte +Date: Wed Nov 12 14:57:54 2014 -0500 + + Dramatically improved BSON deserialization speed by avoiding tz name lookups + +M SoObjects/SOGo/BSONCodec.m + +commit 8e1dc0ecb06b899b20336bb2928050f93c80fc5a +Author: Ludovic Marcotte +Date: Wed Nov 12 12:56:34 2014 -0500 + + Typo in previous commit + +M packaging/rhel/sogo.spec + +commit 715999edc80fa434f2bf882e666a47111c5d2c39 +Author: Ludovic Marcotte +Date: Wed Nov 12 12:54:07 2014 -0500 + + Avoid compilation failures on non-RHEL 7 distros + +M packaging/rhel/sogo.spec + +commit c159d5461bbb26edbe8485ca4461de62f008107c +Author: Ludovic Marcotte +Date: Wed Nov 12 10:02:04 2014 -0500 + + disable rpm-check-build for now + +M packaging/rhel/sogo.spec + +commit 5284b57340d917417ed489875cffbdc5fcbb00e7 +Author: Ludovic Marcotte +Date: Mon Nov 10 16:19:10 2014 -0500 + + More EL7 fixes + +M packaging/rhel/sogo.spec + +commit d8e6447fcc6f41687668fdd3649f4b58478bdcff +Author: Ludovic Marcotte +Date: Mon Nov 10 16:17:06 2014 -0500 + + More disable lasso + +M packaging/rhel/sogo.spec + +commit cb8b0b028ed852bc0877237bf76296ee17aaa1d8 +Author: Ludovic Marcotte +Date: Mon Nov 10 16:15:05 2014 -0500 + + Disable lasso for RHEL7 for now + +M packaging/rhel/sogo.spec + +commit df648c920467773b0871fde538f5003113ca7aab +Author: Francis Lachapelle +Date: Mon Nov 10 13:51:38 2014 -0500 + + Add 'zip' to packages dependencies + + Fixes #2963 + +M packaging/debian-multiarch/control +M packaging/debian/control +M packaging/rhel/sogo.spec + +commit 624af1c0fb494abbf16fc4b8620b13f5e3bf4e7c +Author: Ludovic Marcotte +Date: Mon Nov 10 08:58:30 2014 -0500 + + Fixed test + +M Tests/Integration/test-davacl.py + +commit 395a8ddcfefbd0a897274aa278f30c3fc545f4ac +Author: Ludovic Marcotte +Date: Fri Nov 7 10:36:11 2014 -0500 + + Updated once more the tz and added missing zones + +M SOPE/NGCards/TimeZones/America/Grand_Turk.ics +M SOPE/NGCards/TimeZones/America/Metlakatla.ics +M SOPE/NGCards/TimeZones/Antarctica/Casey.ics +A SOPE/NGCards/TimeZones/Asia/Chita.ics +M SOPE/NGCards/TimeZones/Asia/Irkutsk.ics +M SOPE/NGCards/TimeZones/Asia/Khandyga.ics +M SOPE/NGCards/TimeZones/Asia/Krasnoyarsk.ics +M SOPE/NGCards/TimeZones/Asia/Magadan.ics +M SOPE/NGCards/TimeZones/Asia/Novokuznetsk.ics +M SOPE/NGCards/TimeZones/Asia/Novosibirsk.ics +M SOPE/NGCards/TimeZones/Asia/Omsk.ics +M SOPE/NGCards/TimeZones/Asia/Sakhalin.ics +A SOPE/NGCards/TimeZones/Asia/Srednekolymsk.ics +M SOPE/NGCards/TimeZones/Asia/Urumqi.ics +M SOPE/NGCards/TimeZones/Asia/Ust-Nera.ics +M SOPE/NGCards/TimeZones/Asia/Vladivostok.ics +M SOPE/NGCards/TimeZones/Asia/Yakutsk.ics +M SOPE/NGCards/TimeZones/Asia/Yekaterinburg.ics +M SOPE/NGCards/TimeZones/Australia/Adelaide.ics +M SOPE/NGCards/TimeZones/Australia/Brisbane.ics +M SOPE/NGCards/TimeZones/Australia/Broken_Hill.ics +M SOPE/NGCards/TimeZones/Australia/Currie.ics +M SOPE/NGCards/TimeZones/Australia/Darwin.ics +M SOPE/NGCards/TimeZones/Australia/Eucla.ics +M SOPE/NGCards/TimeZones/Australia/Hobart.ics +M SOPE/NGCards/TimeZones/Australia/Lindeman.ics +M SOPE/NGCards/TimeZones/Australia/Lord_Howe.ics +M SOPE/NGCards/TimeZones/Australia/Melbourne.ics +M SOPE/NGCards/TimeZones/Australia/Perth.ics +M SOPE/NGCards/TimeZones/Australia/Sydney.ics +M SOPE/NGCards/TimeZones/Europe/Kaliningrad.ics +M SOPE/NGCards/TimeZones/Europe/Minsk.ics +M SOPE/NGCards/TimeZones/Europe/Moscow.ics +M SOPE/NGCards/TimeZones/Europe/Simferopol.ics +M SOPE/NGCards/TimeZones/Europe/Volgograd.ics +M SOPE/NGCards/TimeZones/Pacific/Apia.ics +A SOPE/NGCards/TimeZones/Pacific/Bougainville.ics +M SOPE/NGCards/TimeZones/Pacific/Fiji.ics +M SOPE/NGCards/TimeZones/UPDATING + +commit 8cd72a8fda714f62d0a62cee5bb22ac4986ecfef +Author: Ludovic Marcotte +Date: Fri Nov 7 10:06:53 2014 -0500 + + Fix borken ORGANIZER fields during the PUT action + +M SoObjects/Appointments/SOGoAppointmentObject.m + +commit 11a4c1358d6c1b9f6e5bb0fef63572a90d34ff16 +Author: Ludovic Marcotte +Date: Thu Nov 6 11:23:34 2014 -0500 + + Fixed corrupted PNG files (#2975) + +M NEWS +M UI/WebServerResources/arrow-left.png +M UI/WebServerResources/arrow-right.png +M UI/WebServerResources/minus.png +M UI/WebServerResources/plus.png + +commit 54d8aa88870f585ba9bb6422ed7dc68d8a980ea5 +Author: Ludovic Marcotte +Date: Thu Nov 6 11:10:31 2014 -0500 + + Added new zone files + +A SOPE/NGCards/TimeZones/Antarctica/Troll.ics +A SOPE/NGCards/TimeZones/Asia/Khandyga.ics +A SOPE/NGCards/TimeZones/Asia/Ust-Nera.ics +A SOPE/NGCards/TimeZones/Europe/Busingen.ics + +commit 49da494260949c1f6fe022e9825f026241f0f1c1 +Author: Ludovic Marcotte +Date: Thu Nov 6 11:09:16 2014 -0500 + + Fix for bug #2968 + +M NEWS +M SOPE/NGCards/TimeZones/Africa/Abidjan.ics +M SOPE/NGCards/TimeZones/Africa/Accra.ics +M SOPE/NGCards/TimeZones/Africa/Addis_Ababa.ics +M SOPE/NGCards/TimeZones/Africa/Algiers.ics +M SOPE/NGCards/TimeZones/Africa/Asmara.ics +M SOPE/NGCards/TimeZones/Africa/Bamako.ics +M SOPE/NGCards/TimeZones/Africa/Bangui.ics +M SOPE/NGCards/TimeZones/Africa/Banjul.ics +M SOPE/NGCards/TimeZones/Africa/Bissau.ics +M SOPE/NGCards/TimeZones/Africa/Blantyre.ics +M SOPE/NGCards/TimeZones/Africa/Brazzaville.ics +M SOPE/NGCards/TimeZones/Africa/Bujumbura.ics +M SOPE/NGCards/TimeZones/Africa/Cairo.ics +M SOPE/NGCards/TimeZones/Africa/Casablanca.ics +M SOPE/NGCards/TimeZones/Africa/Ceuta.ics +M SOPE/NGCards/TimeZones/Africa/Conakry.ics +M SOPE/NGCards/TimeZones/Africa/Dakar.ics +M SOPE/NGCards/TimeZones/Africa/Dar_es_Salaam.ics +M SOPE/NGCards/TimeZones/Africa/Djibouti.ics +M SOPE/NGCards/TimeZones/Africa/Douala.ics +M SOPE/NGCards/TimeZones/Africa/El_Aaiun.ics +M SOPE/NGCards/TimeZones/Africa/Freetown.ics +M SOPE/NGCards/TimeZones/Africa/Gaborone.ics +M SOPE/NGCards/TimeZones/Africa/Harare.ics +M SOPE/NGCards/TimeZones/Africa/Johannesburg.ics +M SOPE/NGCards/TimeZones/Africa/Juba.ics +M SOPE/NGCards/TimeZones/Africa/Kampala.ics +M SOPE/NGCards/TimeZones/Africa/Khartoum.ics +M SOPE/NGCards/TimeZones/Africa/Kigali.ics +M SOPE/NGCards/TimeZones/Africa/Kinshasa.ics +M SOPE/NGCards/TimeZones/Africa/Lagos.ics +M SOPE/NGCards/TimeZones/Africa/Libreville.ics +M SOPE/NGCards/TimeZones/Africa/Lome.ics +M SOPE/NGCards/TimeZones/Africa/Luanda.ics +M SOPE/NGCards/TimeZones/Africa/Lubumbashi.ics +M SOPE/NGCards/TimeZones/Africa/Lusaka.ics +M SOPE/NGCards/TimeZones/Africa/Malabo.ics +M SOPE/NGCards/TimeZones/Africa/Maputo.ics +M SOPE/NGCards/TimeZones/Africa/Maseru.ics +M SOPE/NGCards/TimeZones/Africa/Mbabane.ics +M SOPE/NGCards/TimeZones/Africa/Mogadishu.ics +M SOPE/NGCards/TimeZones/Africa/Monrovia.ics +M SOPE/NGCards/TimeZones/Africa/Nairobi.ics +M SOPE/NGCards/TimeZones/Africa/Ndjamena.ics +M SOPE/NGCards/TimeZones/Africa/Niamey.ics +M SOPE/NGCards/TimeZones/Africa/Nouakchott.ics +M SOPE/NGCards/TimeZones/Africa/Ouagadougou.ics +M SOPE/NGCards/TimeZones/Africa/Porto-Novo.ics +M SOPE/NGCards/TimeZones/Africa/Sao_Tome.ics +M SOPE/NGCards/TimeZones/Africa/Tripoli.ics +M SOPE/NGCards/TimeZones/Africa/Tunis.ics +M SOPE/NGCards/TimeZones/Africa/Windhoek.ics +M SOPE/NGCards/TimeZones/America/Adak.ics +M SOPE/NGCards/TimeZones/America/Anchorage.ics +M SOPE/NGCards/TimeZones/America/Anguilla.ics +M SOPE/NGCards/TimeZones/America/Antigua.ics +M SOPE/NGCards/TimeZones/America/Araguaina.ics +M SOPE/NGCards/TimeZones/America/Argentina/Buenos_Aires.ics +M SOPE/NGCards/TimeZones/America/Argentina/Catamarca.ics +M SOPE/NGCards/TimeZones/America/Argentina/Cordoba.ics +M SOPE/NGCards/TimeZones/America/Argentina/Jujuy.ics +M SOPE/NGCards/TimeZones/America/Argentina/La_Rioja.ics +M SOPE/NGCards/TimeZones/America/Argentina/Mendoza.ics +M SOPE/NGCards/TimeZones/America/Argentina/Rio_Gallegos.ics +M SOPE/NGCards/TimeZones/America/Argentina/Salta.ics +M SOPE/NGCards/TimeZones/America/Argentina/San_Juan.ics +M SOPE/NGCards/TimeZones/America/Argentina/San_Luis.ics +M SOPE/NGCards/TimeZones/America/Argentina/Tucuman.ics +M SOPE/NGCards/TimeZones/America/Argentina/Ushuaia.ics +M SOPE/NGCards/TimeZones/America/Aruba.ics +M SOPE/NGCards/TimeZones/America/Asuncion.ics +M SOPE/NGCards/TimeZones/America/Atikokan.ics +M SOPE/NGCards/TimeZones/America/Bahia.ics +M SOPE/NGCards/TimeZones/America/Bahia_Banderas.ics +M SOPE/NGCards/TimeZones/America/Barbados.ics +M SOPE/NGCards/TimeZones/America/Belem.ics +M SOPE/NGCards/TimeZones/America/Belize.ics +M SOPE/NGCards/TimeZones/America/Blanc-Sablon.ics +M SOPE/NGCards/TimeZones/America/Boa_Vista.ics +M SOPE/NGCards/TimeZones/America/Bogota.ics +M SOPE/NGCards/TimeZones/America/Boise.ics +M SOPE/NGCards/TimeZones/America/Cambridge_Bay.ics +M SOPE/NGCards/TimeZones/America/Campo_Grande.ics +M SOPE/NGCards/TimeZones/America/Cancun.ics +M SOPE/NGCards/TimeZones/America/Caracas.ics +M SOPE/NGCards/TimeZones/America/Cayenne.ics +M SOPE/NGCards/TimeZones/America/Cayman.ics +M SOPE/NGCards/TimeZones/America/Chicago.ics +M SOPE/NGCards/TimeZones/America/Chihuahua.ics +M SOPE/NGCards/TimeZones/America/Costa_Rica.ics +M SOPE/NGCards/TimeZones/America/Creston.ics +M SOPE/NGCards/TimeZones/America/Cuiaba.ics +M SOPE/NGCards/TimeZones/America/Curacao.ics +M SOPE/NGCards/TimeZones/America/Danmarkshavn.ics +M SOPE/NGCards/TimeZones/America/Dawson.ics +M SOPE/NGCards/TimeZones/America/Dawson_Creek.ics +M SOPE/NGCards/TimeZones/America/Denver.ics +M SOPE/NGCards/TimeZones/America/Detroit.ics +M SOPE/NGCards/TimeZones/America/Dominica.ics +M SOPE/NGCards/TimeZones/America/Edmonton.ics +M SOPE/NGCards/TimeZones/America/Eirunepe.ics +M SOPE/NGCards/TimeZones/America/El_Salvador.ics +M SOPE/NGCards/TimeZones/America/Fortaleza.ics +M SOPE/NGCards/TimeZones/America/Glace_Bay.ics +M SOPE/NGCards/TimeZones/America/Godthab.ics +M SOPE/NGCards/TimeZones/America/Goose_Bay.ics +M SOPE/NGCards/TimeZones/America/Grand_Turk.ics +M SOPE/NGCards/TimeZones/America/Grenada.ics +M SOPE/NGCards/TimeZones/America/Guadeloupe.ics +M SOPE/NGCards/TimeZones/America/Guatemala.ics +M SOPE/NGCards/TimeZones/America/Guayaquil.ics +M SOPE/NGCards/TimeZones/America/Guyana.ics +M SOPE/NGCards/TimeZones/America/Halifax.ics +M SOPE/NGCards/TimeZones/America/Havana.ics +M SOPE/NGCards/TimeZones/America/Hermosillo.ics +M SOPE/NGCards/TimeZones/America/Indiana/Indianapolis.ics +M SOPE/NGCards/TimeZones/America/Indiana/Knox.ics +M SOPE/NGCards/TimeZones/America/Indiana/Marengo.ics +M SOPE/NGCards/TimeZones/America/Indiana/Petersburg.ics +M SOPE/NGCards/TimeZones/America/Indiana/Tell_City.ics +M SOPE/NGCards/TimeZones/America/Indiana/Vevay.ics +M SOPE/NGCards/TimeZones/America/Indiana/Vincennes.ics +M SOPE/NGCards/TimeZones/America/Indiana/Winamac.ics +M SOPE/NGCards/TimeZones/America/Inuvik.ics +M SOPE/NGCards/TimeZones/America/Iqaluit.ics +M SOPE/NGCards/TimeZones/America/Jamaica.ics +M SOPE/NGCards/TimeZones/America/Juneau.ics +M SOPE/NGCards/TimeZones/America/Kentucky/Louisville.ics +M SOPE/NGCards/TimeZones/America/Kentucky/Monticello.ics +M SOPE/NGCards/TimeZones/America/Kralendijk.ics +M SOPE/NGCards/TimeZones/America/La_Paz.ics +M SOPE/NGCards/TimeZones/America/Lima.ics +M SOPE/NGCards/TimeZones/America/Los_Angeles.ics +M SOPE/NGCards/TimeZones/America/Lower_Princes.ics +M SOPE/NGCards/TimeZones/America/Maceio.ics +M SOPE/NGCards/TimeZones/America/Managua.ics +M SOPE/NGCards/TimeZones/America/Manaus.ics +M SOPE/NGCards/TimeZones/America/Marigot.ics +M SOPE/NGCards/TimeZones/America/Martinique.ics +M SOPE/NGCards/TimeZones/America/Matamoros.ics +M SOPE/NGCards/TimeZones/America/Mazatlan.ics +M SOPE/NGCards/TimeZones/America/Menominee.ics +M SOPE/NGCards/TimeZones/America/Merida.ics +M SOPE/NGCards/TimeZones/America/Metlakatla.ics +M SOPE/NGCards/TimeZones/America/Mexico_City.ics +M SOPE/NGCards/TimeZones/America/Miquelon.ics +M SOPE/NGCards/TimeZones/America/Moncton.ics +M SOPE/NGCards/TimeZones/America/Monterrey.ics +M SOPE/NGCards/TimeZones/America/Montevideo.ics +M SOPE/NGCards/TimeZones/America/Montreal.ics +M SOPE/NGCards/TimeZones/America/Montserrat.ics +M SOPE/NGCards/TimeZones/America/Nassau.ics +M SOPE/NGCards/TimeZones/America/New_York.ics +M SOPE/NGCards/TimeZones/America/Nipigon.ics +M SOPE/NGCards/TimeZones/America/Nome.ics +M SOPE/NGCards/TimeZones/America/Noronha.ics +M SOPE/NGCards/TimeZones/America/North_Dakota/Beulah.ics +M SOPE/NGCards/TimeZones/America/North_Dakota/Center.ics +M SOPE/NGCards/TimeZones/America/North_Dakota/New_Salem.ics +M SOPE/NGCards/TimeZones/America/Ojinaga.ics +M SOPE/NGCards/TimeZones/America/Panama.ics +M SOPE/NGCards/TimeZones/America/Pangnirtung.ics +M SOPE/NGCards/TimeZones/America/Paramaribo.ics +M SOPE/NGCards/TimeZones/America/Phoenix.ics +M SOPE/NGCards/TimeZones/America/Port-au-Prince.ics +M SOPE/NGCards/TimeZones/America/Port_of_Spain.ics +M SOPE/NGCards/TimeZones/America/Porto_Velho.ics +M SOPE/NGCards/TimeZones/America/Puerto_Rico.ics +M SOPE/NGCards/TimeZones/America/Rainy_River.ics +M SOPE/NGCards/TimeZones/America/Rankin_Inlet.ics +M SOPE/NGCards/TimeZones/America/Recife.ics +M SOPE/NGCards/TimeZones/America/Regina.ics +M SOPE/NGCards/TimeZones/America/Resolute.ics +M SOPE/NGCards/TimeZones/America/Rio_Branco.ics +M SOPE/NGCards/TimeZones/America/Santa_Isabel.ics +M SOPE/NGCards/TimeZones/America/Santarem.ics +M SOPE/NGCards/TimeZones/America/Santiago.ics +M SOPE/NGCards/TimeZones/America/Santo_Domingo.ics +M SOPE/NGCards/TimeZones/America/Sao_Paulo.ics +M SOPE/NGCards/TimeZones/America/Scoresbysund.ics +M SOPE/NGCards/TimeZones/America/Sitka.ics +M SOPE/NGCards/TimeZones/America/St_Barthelemy.ics +M SOPE/NGCards/TimeZones/America/St_Johns.ics +M SOPE/NGCards/TimeZones/America/St_Kitts.ics +M SOPE/NGCards/TimeZones/America/St_Lucia.ics +M SOPE/NGCards/TimeZones/America/St_Thomas.ics +M SOPE/NGCards/TimeZones/America/St_Vincent.ics +M SOPE/NGCards/TimeZones/America/Swift_Current.ics +M SOPE/NGCards/TimeZones/America/Tegucigalpa.ics +M SOPE/NGCards/TimeZones/America/Thule.ics +M SOPE/NGCards/TimeZones/America/Thunder_Bay.ics +M SOPE/NGCards/TimeZones/America/Tijuana.ics +M SOPE/NGCards/TimeZones/America/Toronto.ics +M SOPE/NGCards/TimeZones/America/Tortola.ics +M SOPE/NGCards/TimeZones/America/Vancouver.ics +M SOPE/NGCards/TimeZones/America/Whitehorse.ics +M SOPE/NGCards/TimeZones/America/Winnipeg.ics +M SOPE/NGCards/TimeZones/America/Yakutat.ics +M SOPE/NGCards/TimeZones/America/Yellowknife.ics +M SOPE/NGCards/TimeZones/Antarctica/Casey.ics +M SOPE/NGCards/TimeZones/Antarctica/Davis.ics +M SOPE/NGCards/TimeZones/Antarctica/DumontDUrville.ics +M SOPE/NGCards/TimeZones/Antarctica/Macquarie.ics +M SOPE/NGCards/TimeZones/Antarctica/Mawson.ics +M SOPE/NGCards/TimeZones/Antarctica/McMurdo.ics +M SOPE/NGCards/TimeZones/Antarctica/Palmer.ics +M SOPE/NGCards/TimeZones/Antarctica/Rothera.ics +M SOPE/NGCards/TimeZones/Antarctica/Syowa.ics +M SOPE/NGCards/TimeZones/Antarctica/Vostok.ics +M SOPE/NGCards/TimeZones/Arctic/Longyearbyen.ics +M SOPE/NGCards/TimeZones/Asia/Aden.ics +M SOPE/NGCards/TimeZones/Asia/Almaty.ics +M SOPE/NGCards/TimeZones/Asia/Amman.ics +M SOPE/NGCards/TimeZones/Asia/Anadyr.ics +M SOPE/NGCards/TimeZones/Asia/Aqtau.ics +M SOPE/NGCards/TimeZones/Asia/Aqtobe.ics +M SOPE/NGCards/TimeZones/Asia/Ashgabat.ics +M SOPE/NGCards/TimeZones/Asia/Baghdad.ics +M SOPE/NGCards/TimeZones/Asia/Bahrain.ics +M SOPE/NGCards/TimeZones/Asia/Baku.ics +M SOPE/NGCards/TimeZones/Asia/Bangkok.ics +M SOPE/NGCards/TimeZones/Asia/Beirut.ics +M SOPE/NGCards/TimeZones/Asia/Bishkek.ics +M SOPE/NGCards/TimeZones/Asia/Brunei.ics +M SOPE/NGCards/TimeZones/Asia/Choibalsan.ics +M SOPE/NGCards/TimeZones/Asia/Chongqing.ics +M SOPE/NGCards/TimeZones/Asia/Colombo.ics +M SOPE/NGCards/TimeZones/Asia/Damascus.ics +M SOPE/NGCards/TimeZones/Asia/Dhaka.ics +M SOPE/NGCards/TimeZones/Asia/Dili.ics +M SOPE/NGCards/TimeZones/Asia/Dubai.ics +M SOPE/NGCards/TimeZones/Asia/Dushanbe.ics +M SOPE/NGCards/TimeZones/Asia/Gaza.ics +M SOPE/NGCards/TimeZones/Asia/Harbin.ics +M SOPE/NGCards/TimeZones/Asia/Hebron.ics +M SOPE/NGCards/TimeZones/Asia/Ho_Chi_Minh.ics +M SOPE/NGCards/TimeZones/Asia/Hong_Kong.ics +M SOPE/NGCards/TimeZones/Asia/Hovd.ics +M SOPE/NGCards/TimeZones/Asia/Irkutsk.ics +M SOPE/NGCards/TimeZones/Asia/Istanbul.ics +M SOPE/NGCards/TimeZones/Asia/Jakarta.ics +M SOPE/NGCards/TimeZones/Asia/Jayapura.ics +M SOPE/NGCards/TimeZones/Asia/Jerusalem.ics +M SOPE/NGCards/TimeZones/Asia/Kabul.ics +M SOPE/NGCards/TimeZones/Asia/Kamchatka.ics +M SOPE/NGCards/TimeZones/Asia/Karachi.ics +M SOPE/NGCards/TimeZones/Asia/Kashgar.ics +M SOPE/NGCards/TimeZones/Asia/Kathmandu.ics +M SOPE/NGCards/TimeZones/Asia/Kolkata.ics +M SOPE/NGCards/TimeZones/Asia/Krasnoyarsk.ics +M SOPE/NGCards/TimeZones/Asia/Kuala_Lumpur.ics +M SOPE/NGCards/TimeZones/Asia/Kuching.ics +M SOPE/NGCards/TimeZones/Asia/Kuwait.ics +M SOPE/NGCards/TimeZones/Asia/Macau.ics +M SOPE/NGCards/TimeZones/Asia/Magadan.ics +M SOPE/NGCards/TimeZones/Asia/Makassar.ics +M SOPE/NGCards/TimeZones/Asia/Manila.ics +M SOPE/NGCards/TimeZones/Asia/Muscat.ics +M SOPE/NGCards/TimeZones/Asia/Nicosia.ics +M SOPE/NGCards/TimeZones/Asia/Novokuznetsk.ics +M SOPE/NGCards/TimeZones/Asia/Novosibirsk.ics +M SOPE/NGCards/TimeZones/Asia/Omsk.ics +M SOPE/NGCards/TimeZones/Asia/Oral.ics +M SOPE/NGCards/TimeZones/Asia/Phnom_Penh.ics +M SOPE/NGCards/TimeZones/Asia/Pontianak.ics +M SOPE/NGCards/TimeZones/Asia/Pyongyang.ics +M SOPE/NGCards/TimeZones/Asia/Qatar.ics +M SOPE/NGCards/TimeZones/Asia/Qyzylorda.ics +M SOPE/NGCards/TimeZones/Asia/Rangoon.ics +M SOPE/NGCards/TimeZones/Asia/Riyadh.ics +M SOPE/NGCards/TimeZones/Asia/Sakhalin.ics +M SOPE/NGCards/TimeZones/Asia/Samarkand.ics +M SOPE/NGCards/TimeZones/Asia/Seoul.ics +M SOPE/NGCards/TimeZones/Asia/Shanghai.ics +M SOPE/NGCards/TimeZones/Asia/Singapore.ics +M SOPE/NGCards/TimeZones/Asia/Taipei.ics +M SOPE/NGCards/TimeZones/Asia/Tashkent.ics +M SOPE/NGCards/TimeZones/Asia/Tbilisi.ics +M SOPE/NGCards/TimeZones/Asia/Tehran.ics +M SOPE/NGCards/TimeZones/Asia/Thimphu.ics +M SOPE/NGCards/TimeZones/Asia/Tokyo.ics +M SOPE/NGCards/TimeZones/Asia/Ulaanbaatar.ics +M SOPE/NGCards/TimeZones/Asia/Urumqi.ics +M SOPE/NGCards/TimeZones/Asia/Vientiane.ics +M SOPE/NGCards/TimeZones/Asia/Vladivostok.ics +M SOPE/NGCards/TimeZones/Asia/Yakutsk.ics +M SOPE/NGCards/TimeZones/Asia/Yekaterinburg.ics +M SOPE/NGCards/TimeZones/Asia/Yerevan.ics +M SOPE/NGCards/TimeZones/Atlantic/Azores.ics +M SOPE/NGCards/TimeZones/Atlantic/Bermuda.ics +M SOPE/NGCards/TimeZones/Atlantic/Canary.ics +M SOPE/NGCards/TimeZones/Atlantic/Cape_Verde.ics +M SOPE/NGCards/TimeZones/Atlantic/Faroe.ics +M SOPE/NGCards/TimeZones/Atlantic/Madeira.ics +M SOPE/NGCards/TimeZones/Atlantic/Reykjavik.ics +M SOPE/NGCards/TimeZones/Atlantic/South_Georgia.ics +M SOPE/NGCards/TimeZones/Atlantic/St_Helena.ics +M SOPE/NGCards/TimeZones/Atlantic/Stanley.ics +M SOPE/NGCards/TimeZones/Australia/Adelaide.ics +M SOPE/NGCards/TimeZones/Australia/Brisbane.ics +M SOPE/NGCards/TimeZones/Australia/Broken_Hill.ics +M SOPE/NGCards/TimeZones/Australia/Currie.ics +M SOPE/NGCards/TimeZones/Australia/Darwin.ics +M SOPE/NGCards/TimeZones/Australia/Eucla.ics +M SOPE/NGCards/TimeZones/Australia/Hobart.ics +M SOPE/NGCards/TimeZones/Australia/Lindeman.ics +M SOPE/NGCards/TimeZones/Australia/Lord_Howe.ics +M SOPE/NGCards/TimeZones/Australia/Melbourne.ics +M SOPE/NGCards/TimeZones/Australia/Perth.ics +M SOPE/NGCards/TimeZones/Australia/Sydney.ics +M SOPE/NGCards/TimeZones/Europe/Amsterdam.ics +M SOPE/NGCards/TimeZones/Europe/Andorra.ics +M SOPE/NGCards/TimeZones/Europe/Athens.ics +M SOPE/NGCards/TimeZones/Europe/Belgrade.ics +M SOPE/NGCards/TimeZones/Europe/Berlin.ics +M SOPE/NGCards/TimeZones/Europe/Bratislava.ics +M SOPE/NGCards/TimeZones/Europe/Brussels.ics +M SOPE/NGCards/TimeZones/Europe/Bucharest.ics +M SOPE/NGCards/TimeZones/Europe/Budapest.ics +M SOPE/NGCards/TimeZones/Europe/Chisinau.ics +M SOPE/NGCards/TimeZones/Europe/Copenhagen.ics +M SOPE/NGCards/TimeZones/Europe/Dublin.ics +M SOPE/NGCards/TimeZones/Europe/Gibraltar.ics +M SOPE/NGCards/TimeZones/Europe/Guernsey.ics +M SOPE/NGCards/TimeZones/Europe/Helsinki.ics +M SOPE/NGCards/TimeZones/Europe/Isle_of_Man.ics +M SOPE/NGCards/TimeZones/Europe/Istanbul.ics +M SOPE/NGCards/TimeZones/Europe/Jersey.ics +M SOPE/NGCards/TimeZones/Europe/Kaliningrad.ics +M SOPE/NGCards/TimeZones/Europe/Kiev.ics +M SOPE/NGCards/TimeZones/Europe/Lisbon.ics +M SOPE/NGCards/TimeZones/Europe/Ljubljana.ics +M SOPE/NGCards/TimeZones/Europe/London.ics +M SOPE/NGCards/TimeZones/Europe/Luxembourg.ics +M SOPE/NGCards/TimeZones/Europe/Madrid.ics +M SOPE/NGCards/TimeZones/Europe/Malta.ics +M SOPE/NGCards/TimeZones/Europe/Mariehamn.ics +M SOPE/NGCards/TimeZones/Europe/Minsk.ics +M SOPE/NGCards/TimeZones/Europe/Monaco.ics +M SOPE/NGCards/TimeZones/Europe/Moscow.ics +M SOPE/NGCards/TimeZones/Europe/Nicosia.ics +M SOPE/NGCards/TimeZones/Europe/Oslo.ics +M SOPE/NGCards/TimeZones/Europe/Paris.ics +M SOPE/NGCards/TimeZones/Europe/Podgorica.ics +M SOPE/NGCards/TimeZones/Europe/Prague.ics +M SOPE/NGCards/TimeZones/Europe/Riga.ics +M SOPE/NGCards/TimeZones/Europe/Rome.ics +M SOPE/NGCards/TimeZones/Europe/Samara.ics +M SOPE/NGCards/TimeZones/Europe/San_Marino.ics +M SOPE/NGCards/TimeZones/Europe/Sarajevo.ics +M SOPE/NGCards/TimeZones/Europe/Simferopol.ics +M SOPE/NGCards/TimeZones/Europe/Skopje.ics +M SOPE/NGCards/TimeZones/Europe/Sofia.ics +M SOPE/NGCards/TimeZones/Europe/Stockholm.ics +M SOPE/NGCards/TimeZones/Europe/Tallinn.ics +M SOPE/NGCards/TimeZones/Europe/Tirane.ics +M SOPE/NGCards/TimeZones/Europe/Uzhgorod.ics +M SOPE/NGCards/TimeZones/Europe/Vaduz.ics +M SOPE/NGCards/TimeZones/Europe/Vatican.ics +M SOPE/NGCards/TimeZones/Europe/Vienna.ics +M SOPE/NGCards/TimeZones/Europe/Vilnius.ics +M SOPE/NGCards/TimeZones/Europe/Volgograd.ics +M SOPE/NGCards/TimeZones/Europe/Warsaw.ics +M SOPE/NGCards/TimeZones/Europe/Zagreb.ics +M SOPE/NGCards/TimeZones/Europe/Zaporozhye.ics +M SOPE/NGCards/TimeZones/Europe/Zurich.ics +M SOPE/NGCards/TimeZones/Indian/Antananarivo.ics +M SOPE/NGCards/TimeZones/Indian/Chagos.ics +M SOPE/NGCards/TimeZones/Indian/Christmas.ics +M SOPE/NGCards/TimeZones/Indian/Cocos.ics +M SOPE/NGCards/TimeZones/Indian/Comoro.ics +M SOPE/NGCards/TimeZones/Indian/Kerguelen.ics +M SOPE/NGCards/TimeZones/Indian/Mahe.ics +M SOPE/NGCards/TimeZones/Indian/Maldives.ics +M SOPE/NGCards/TimeZones/Indian/Mauritius.ics +M SOPE/NGCards/TimeZones/Indian/Mayotte.ics +M SOPE/NGCards/TimeZones/Indian/Reunion.ics +M SOPE/NGCards/TimeZones/Pacific/Apia.ics +M SOPE/NGCards/TimeZones/Pacific/Auckland.ics +M SOPE/NGCards/TimeZones/Pacific/Chatham.ics +M SOPE/NGCards/TimeZones/Pacific/Chuuk.ics +M SOPE/NGCards/TimeZones/Pacific/Easter.ics +M SOPE/NGCards/TimeZones/Pacific/Efate.ics +M SOPE/NGCards/TimeZones/Pacific/Enderbury.ics +M SOPE/NGCards/TimeZones/Pacific/Fakaofo.ics +M SOPE/NGCards/TimeZones/Pacific/Fiji.ics +M SOPE/NGCards/TimeZones/Pacific/Funafuti.ics +M SOPE/NGCards/TimeZones/Pacific/Galapagos.ics +M SOPE/NGCards/TimeZones/Pacific/Gambier.ics +M SOPE/NGCards/TimeZones/Pacific/Guadalcanal.ics +M SOPE/NGCards/TimeZones/Pacific/Guam.ics +M SOPE/NGCards/TimeZones/Pacific/Honolulu.ics +M SOPE/NGCards/TimeZones/Pacific/Johnston.ics +M SOPE/NGCards/TimeZones/Pacific/Kiritimati.ics +M SOPE/NGCards/TimeZones/Pacific/Kosrae.ics +M SOPE/NGCards/TimeZones/Pacific/Kwajalein.ics +M SOPE/NGCards/TimeZones/Pacific/Majuro.ics +M SOPE/NGCards/TimeZones/Pacific/Marquesas.ics +M SOPE/NGCards/TimeZones/Pacific/Midway.ics +M SOPE/NGCards/TimeZones/Pacific/Nauru.ics +M SOPE/NGCards/TimeZones/Pacific/Niue.ics +M SOPE/NGCards/TimeZones/Pacific/Norfolk.ics +M SOPE/NGCards/TimeZones/Pacific/Noumea.ics +M SOPE/NGCards/TimeZones/Pacific/Pago_Pago.ics +M SOPE/NGCards/TimeZones/Pacific/Palau.ics +M SOPE/NGCards/TimeZones/Pacific/Pitcairn.ics +M SOPE/NGCards/TimeZones/Pacific/Pohnpei.ics +M SOPE/NGCards/TimeZones/Pacific/Port_Moresby.ics +M SOPE/NGCards/TimeZones/Pacific/Rarotonga.ics +M SOPE/NGCards/TimeZones/Pacific/Saipan.ics +M SOPE/NGCards/TimeZones/Pacific/Tahiti.ics +M SOPE/NGCards/TimeZones/Pacific/Tarawa.ics +M SOPE/NGCards/TimeZones/Pacific/Tongatapu.ics +M SOPE/NGCards/TimeZones/Pacific/Wake.ics +M SOPE/NGCards/TimeZones/Pacific/Wallis.ics + +commit e08dd3f9eb16bdf122a398fd46a725ec33c55226 +Author: Ludovic Marcotte +Date: Thu Nov 6 10:16:47 2014 -0500 + + Fix for bug #2978 + +M ActiveSync/iCalEvent+ActiveSync.m +M NEWS + +commit 6de70e4043bc09a9182ce8a22e2c4f9a76b11af3 +Author: Ludovic Marcotte +Date: Thu Nov 6 09:35:58 2014 -0500 + + sanitize strings before encoding them when using EAS + +M ActiveSync/NSString+ActiveSync.m +M NEWS + +commit 7052daa1c8fded384e5dd9e7582014a5acd8188e +Author: Francis Lachapelle +Date: Wed Nov 5 10:02:55 2014 -0500 + + Fix rename of subscribed addressbooks + +M NEWS +M UI/Common/product.plist +M UI/WebServerResources/ContactsUI.js + +commit 15be4861b6574ce7573e2ebc6e3d3bc3fb10110f +Author: Francis Lachapelle +Date: Wed Nov 5 08:44:52 2014 -0500 + + Fix support for SieveFolderEncoding default + + Fixes #2622 + +M NEWS +M UI/PreferencesUI/UIxFilterEditor.m + +commit 4b9958336c470a00933b2786c2105a25f95f7801 +Author: Ludovic Marcotte +Date: Tue Nov 4 13:50:10 2014 -0500 + + Handle base64-encoded command parameters in EAS + +M ActiveSync/NSString+ActiveSync.m + +commit 52fdcc34de6fb482b94736652a7699436c17db82 +Author: Ludovic Marcotte +Date: Fri Oct 31 06:46:03 2014 -0400 + + Fixed typo + +M ActiveSync/iCalEvent+ActiveSync.m + +commit 08427e0bfb8bba2fd273443558a6832ac1ac0cc5 +Author: Ludovic Marcotte +Date: Thu Oct 30 18:58:52 2014 -0400 + + set userTimeZone if event has no tz + +M ActiveSync/iCalEvent+ActiveSync.m + +commit d76a4361a094c2a235e310f9e86ab38602d568f7 +Author: Ludovic Marcotte +Date: Thu Oct 30 09:20:21 2014 -0400 + + Added one more sanitization pass on decoded content + +M ActiveSync/SOGoMailObject+ActiveSync.m + +commit 70cd24e111b04a7bb598a56f86da34fefb689fbf +Author: Ludovic Marcotte +Date: Wed Oct 29 16:42:52 2014 -0400 + + Fix for bug #2965 + +M NEWS +M UI/MailerUI/UIxMailView.m + +commit b5023eeb245c0c0cec40b018af404049119cd4d0 +Author: Ludovic Marcotte +Date: Wed Oct 29 14:56:03 2014 -0400 + + Fix for bug #2940 + +M ActiveSync/SOGoActiveSyncDispatcher.m +M Documentation/SOGoInstallationGuide.asciidoc +M NEWS +M SoObjects/SOGo/SOGoSystemDefaults.m + +commit da962aed01b32be85f85483dfbe978aa4e259361 +Author: Ludovic Marcotte +Date: Wed Oct 29 14:20:03 2014 -0400 + + Added support for multiple calendars/addressbooks over ActiveSync + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M ActiveSync/SOGoActiveSyncDispatcher.m +M SoObjects/Mailer/SOGoMailAccount.m +M SoObjects/SOGo/SOGoCacheGCSObject.h +M SoObjects/SOGo/SOGoCacheGCSObject.m + +commit 395545ca519f4771369eca77d0d4b5aa9d79d1df +Author: Ludovic Marcotte +Date: Wed Oct 29 11:13:18 2014 -0400 + + WP fails to sync if an event is changed on the sever and the client sends a modification of another event + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m + +commit b53c7267660ba76d26f08b824b88cc87824a7cd3 +Author: Ludovic Marcotte +Date: Wed Oct 29 10:46:45 2014 -0400 + + TZ fixes on WP devices all day events + +M ActiveSync/iCalTimeZone+ActiveSync.m + +commit 6695aa083f5f315bfd95d61e7da58c261e611c3b +Author: Francis Lachapelle +Date: Fri Oct 17 15:20:25 2014 -0400 + + Fix crash when opening a mailbox with empty filter + + Fixes #2959 + +M UI/MailerUI/UIxMailListActions.m +M UI/WebServerResources/MailerUI.js + +commit 42ef0bfc3f30a4ce77fab46fd48fc197dfe37684 +Author: Ludovic Marcotte +Date: Thu Oct 16 11:49:07 2014 -0400 + + Added doc around IMAP word size vs. ActiveSync on large mail folders + +M Documentation/SOGoInstallationGuide.asciidoc + +commit fb95d84a3a4eb1c3f329a02a4496cc7528f17c2a +Author: Ludovic Marcotte +Date: Thu Oct 16 09:35:15 2014 -0400 + + Handle base64 encoded query strings, popular on Windows devices + +M ActiveSync/NSString+ActiveSync.m + +commit 231987242b367f3d60d45edf3ebddfda4257709f +Author: Ludovic Marcotte +Date: Thu Oct 16 09:10:54 2014 -0400 + + Handle empty Attendees tag + +M ActiveSync/iCalEvent+ActiveSync.m + +commit b4f7ec3708bb5c44aaf1bd6637ee1f1df9a0b783 +Author: Ludovic Marcotte +Date: Thu Oct 16 09:08:50 2014 -0400 + + Don't send empty tag + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m + +commit b2cab02d7064a6a7c79cf71a5aa748fa31be11ad +Author: Ludovic Marcotte +Date: Thu Oct 16 09:03:34 2014 -0400 + + Handle empty categories + +M ActiveSync/NGVCard+ActiveSync.m + +commit d6ff9038ce09e1c5eb507fc8d884708bc706d306 +Author: Ludovic Marcotte +Date: Thu Oct 16 09:02:18 2014 -0400 + + Disable timezone in AS for now + +M ActiveSync/iCalEvent+ActiveSync.m + +commit c43ad378500367eb1639d43ab6f69e81e13d2ff4 +Author: Ludovic Marcotte +Date: Wed Oct 15 15:21:20 2014 -0400 + + Disable OpenChange for now on RHEL 7 + +M packaging/rhel/sogo.spec + +commit 096a0ef8e4f908802176903685e74826c1fbc2ae +Author: Ludovic Marcotte +Date: Wed Oct 15 11:35:59 2014 -0400 + + Disabled openchange builds on all i386 arch + +M packaging/rhel/sogo.spec + +commit e2136e041354f27fb0938b3fad15aa999ebe0621 +Author: Francis Lachapelle +Date: Tue Oct 14 12:54:04 2014 -0400 + + Don't leak database passwords in the logs + + Fixes #2953 + +M NEWS +M SOPE/GDLContentStore/GCSChannelManager.m + +commit 3264458f4be46d8725962bb215350e7ca291ad18 +Author: Ludovic Marcotte +Date: Tue Oct 14 11:27:08 2014 -0400 + + Added back -L directives to properly compile teststrings + +M Tests/Integration/GNUmakefile.preamble + +commit 0327a42c9c7d305af78504264821281de7e9c2d3 +Author: Alexandre Cloutier +Date: Tue Oct 14 10:45:30 2014 -0400 + + Update NEWS file + +M NEWS + +commit 5f811e1a4e4e6b5e89cd616ddbc0b37ff3e0635a +Author: Ludovic Marcotte +Date: Tue Oct 14 10:43:52 2014 -0400 + + Added rpath for integration tests + +M Tests/Integration/GNUmakefile.preamble + +commit 923aa5d9b669d9ebca4b80a50c37c148aa17bb60 +Author: Alexandre Cloutier +Date: Tue Oct 14 10:29:11 2014 -0400 + + bugfix #2952, default sorting for new user + +M UI/WebServerResources/MailerUI.js + +commit 3416bfea94f17dd26b55bb4133c431f2640c9371 +Author: Ludovic Marcotte +Date: Tue Oct 14 10:00:05 2014 -0400 + + Adjusted rpath and removed unusued -L directives + +M ActiveSync/common.make +M Tools/GNUmakefile +M Tools/GNUmakefile.preamble + +commit f6639508089352980758aadc1b9d565157ee4adc +Author: Ludovic Marcotte +Date: Tue Oct 14 09:51:04 2014 -0400 + + Adjusted the rpath, removed unnecessary variables/values + +M Main/GNUmakefile +M Main/GNUmakefile.preamble + +commit ccabd93ff2175dc4c26bf11694542a1acf1d382c +Author: Ludovic Marcotte +Date: Tue Oct 14 09:21:12 2014 -0400 + + moved system lib dirs to additional lib dirs + +M Main/GNUmakefile.preamble + +commit c5a7bcf2aaa4177b873c4a0ca780e046d041e074 +Author: Ludovic Marcotte +Date: Tue Oct 14 09:17:00 2014 -0400 + + Fixed the system lib dir to point to the sogo lib dir + +M Main/GNUmakefile.preamble + +commit 81ff6bebfeb30b2abafa31eb4b0e86b102c0f4c0 +Author: Ludovic Marcotte +Date: Tue Oct 14 09:02:15 2014 -0400 + + Removed dependancies when openchange is disabled + +M packaging/rhel/sogo.spec + +commit 1a8aa5a587c63b3c5d434353a41c6d9cffd540ef +Author: Ludovic Marcotte +Date: Tue Oct 14 09:00:14 2014 -0400 + + Fixed spec file to not build sogo-openchange if disabled + +M packaging/rhel/sogo.spec + +commit 4b76e2b933ae675800139e37fdd14ad1982ebc50 +Author: Ludovic Marcotte +Date: Tue Oct 14 08:43:28 2014 -0400 + + Added lib64 in the search path + +M Tests/Integration/GNUmakefile.preamble + +commit 27ac9e3904f43de0764b426754df6c86db8f3c69 +Author: Francis Lachapelle +Date: Thu Oct 9 15:46:44 2014 -0400 + + Cleanup of unused parameters + +M SoObjects/SOGo/SOGoUserFolder.m +M UI/WebServerResources/AdministrationUI.js + +commit f8a371e351ce161037017ba79c367c494b6d56f1 +Author: Francis Lachapelle +Date: Thu Oct 9 15:12:24 2014 -0400 + + Fix folder's name when subscribing to a folder + +M NEWS +M UI/WebServerResources/UIxContactsUserFolders.js + +commit 460ed2e7bcfd11a2beef4c8146fdd9030a415115 +Author: Francis Lachapelle +Date: Thu Oct 9 15:11:06 2014 -0400 + + Fix JavaScript warning on undefined variable + +M UI/WebServerResources/ContactsUI.js + +commit 6cc8f17c86713f39ba60d8ae8129ea4ceb052f63 +Author: Francis Lachapelle +Date: Thu Oct 9 15:10:20 2014 -0400 + + Fix display name of subscribed folders + +M NEWS +M SoObjects/SOGo/SOGoGCSFolder.m + +commit ff9d49be71645c97d7692af67fda8bfacbb6179a +Author: Ludovic Marcotte +Date: Wed Oct 8 10:25:46 2014 -0400 + + Dropped rpath since it seems to be ignored on el5 + +M Tests/Integration/GNUmakefile.preamble + +commit f1919d10edcb56c4ae87a79a61522063c4d6e808 +Author: Ludovic Marcotte +Date: Wed Oct 8 09:35:50 2014 -0400 + + Flag for conditional openchange build + +M packaging/rhel/sogo.spec + +commit 3e2de9701cd1af8d27b9c0abf43e199049496b5d +Author: Ludovic Marcotte +Date: Wed Oct 8 09:29:08 2014 -0400 + + Fixes + +M packaging/rhel/sogo.spec + +commit 435ebb9eb41fc88a8af1de280f1894608e61f302 +Author: Ludovic Marcotte +Date: Wed Oct 8 09:25:40 2014 -0400 + + Fixes + +M packaging/rhel/sogo.spec + +commit ab9ba66b366c9b97cde626fe8a5cd23b3f0d3cdb +Author: Ludovic Marcotte +Date: Wed Oct 8 09:22:14 2014 -0400 + + More fixes + +M packaging/rhel/sogo.spec + +commit 29295f93c5a1b807eda1e4d6c92f9d1271e72597 +Author: Ludovic Marcotte +Date: Wed Oct 8 09:17:26 2014 -0400 + + Fixed again the spec file + +M packaging/rhel/sogo.spec + +commit 20e0cd623407d2066168818c7dd8c26a6afba05e +Author: Ludovic Marcotte +Date: Wed Oct 8 09:10:02 2014 -0400 + + Fixed RHEL packaging with lib move to "sogo" app directory + +M packaging/rhel/sogo.spec + +commit 25f68c7eb5263aaaaf7c5e4cfe29d8ecc60386ec +Author: Jens Erat +Date: Wed Oct 8 10:07:48 2014 +0200 + + Added missing NGImap4DisableIMAP4Pooling option to documentation + +M Documentation/SOGoInstallationGuide.asciidoc + +commit 22844a57426d9b3e2938a579f959fb934ef59357 +Author: Jens Erat +Date: Wed Oct 8 10:01:17 2014 +0200 + + Minor fixes in documentation + +M Documentation/SOGoInstallationGuide.asciidoc + +commit e3837188fd747ad8cb4d752c99b8027661fed03a +Author: Ludovic Marcotte +Date: Mon Oct 6 14:45:30 2014 -0400 + + Updated spec file for SOGo's private libraries move + +M packaging/rhel/sogo.spec + +commit a0317046ba4aa51450a6c9df451f322178811ff1 +Author: Francis Lachapelle +Date: Sun Oct 5 00:30:27 2014 -0400 + + Card view: don't escape
's in note field + +M NEWS +M UI/Contacts/UIxContactView.m + +commit 4cc6b72cfb434b79d8e0e5f2277fbc3a7f54a2ad +Author: Jeroen Dekkers +Date: Sun Oct 5 15:47:00 2014 +0200 + + Make png files non-executable + +M UI/WebServerResources/error.png +M UI/WebServerResources/notice.png +M UI/WebServerResources/success.png +M UI/WebServerResources/warning.png + +commit d7f8427623288493e9d082f793ed75870134c7e5 +Author: Francis Lachapelle +Date: Fri Oct 3 13:13:42 2014 -0400 + + Improve XSL for documentation + +M Documentation/Makefile +D Documentation/docbook/xsl/sogo-fo-article.xsl +M Documentation/docbook/xsl/sogo-fo.xsl + +commit 7f49dcb2fa0507d98741c3eeaa276f772de49886 +Author: Ludovic Marcotte +Date: Thu Oct 2 13:10:54 2014 -0400 + + Avoid using SOGO_SYSLIBDIR when testing since it's undefined + +M Tests/Integration/GNUmakefile.preamble + +commit f29a47d44328904a150c3c8ffc2a03af63293fb8 +Author: Ludovic Marcotte +Date: Thu Oct 2 12:42:06 2014 -0400 + + Added rpath + +M ActiveSync/common.make + +commit f88cfae611cda5462d5920638c1ff41856eb0a50 +Author: Ludovic Marcotte +Date: Thu Oct 2 12:36:22 2014 -0400 + + Improved and simplified rpath + +M SoObjects/common.make +M Tests/Integration/GNUmakefile.preamble + +commit fb3ddca9e8e3a5f8c5d4698dcb8046202f5ecc2d +Author: Ludovic Marcotte +Date: Thu Oct 2 11:17:45 2014 -0400 + + Improved makefiles + +M SoObjects/Mailer/GNUmakefile +M SoObjects/common.make + +commit ba4a50e778f586aaf5fc536b62b1ea00b9145292 +Author: Ludovic Marcotte +Date: Thu Oct 2 11:05:19 2014 -0400 + + Added rpath kungfu + +M SoObjects/common.make + +commit 8875c42d256444ed230bd834f7ed72fb1595cda2 +Author: Ludovic Marcotte +Date: Thu Oct 2 11:00:43 2014 -0400 + + Fixed makefile + +M SoObjects/common.make + +commit 18431922abd08be9a024589d16ee4117dcf9c477 +Author: Ludovic Marcotte +Date: Thu Oct 2 10:55:05 2014 -0400 + + Fixed makefile + +M ActiveSync/common.make + +commit f93c06e6a915889cc0d1a5de3b3d760efd5a100a +Author: Ludovic Marcotte +Date: Thu Oct 2 10:50:34 2014 -0400 + + Fixed include + +M Tests/Integration/GNUmakefile + +commit 68d79472a529b783273bf766bf4d5e5eb029343d +Author: Ludovic Marcotte +Date: Thu Oct 2 10:46:47 2014 -0400 + + Fixed makefile for teststrings due to sogo lib change + +M Tests/Integration/GNUmakefile +M Tests/Integration/GNUmakefile.preamble + +commit 51ed3717962c2d49f9c0824ced0efa700919dbff +Author: Ludovic Marcotte +Date: Thu Oct 2 10:21:36 2014 -0400 + + Adjusted debian install files regarding sogo lib move + +M packaging/debian-multiarch/sogo-dev.install +M packaging/debian-multiarch/sogo.install +M packaging/debian/sogo-dev.install +M packaging/debian/sogo.install + +commit 6ded9e95b33a80c09b00a63f7199b72f882d99d5 +Author: Jeroen Dekkers +Date: Wed Oct 1 20:36:42 2014 +0200 + + Put private libraries in /usr/lib/sogo + +M Main/GNUmakefile +M Main/GNUmakefile.preamble +M OpenChange/GNUmakefile +M SOPE/GDLContentStore/GNUmakefile +M SOPE/NGCards/GNUmakefile +M SoObjects/SOGo/GNUmakefile +M SoObjects/common.make +M Tests/Integration/GNUmakefile.preamble +M Tests/Unit/GNUmakefile +M Tools/GNUmakefile +M Tools/GNUmakefile.preamble +M UI/AdministrationUI/GNUmakefile +M UI/Common/GNUmakefile +M UI/Contacts/GNUmakefile +M UI/MailPartViewers/GNUmakefile +M UI/MailerUI/GNUmakefile +M UI/MainUI/GNUmakefile +M UI/PreferencesUI/GNUmakefile +M UI/SOGoUI/GNUmakefile +M UI/Scheduler/GNUmakefile +M UI/common.make + +commit 25b7fffb009333e07de5f0327288086de08cd942 +Author: Ludovic Marcotte +Date: Wed Oct 1 14:08:29 2014 -0400 + + Fix for bug #2930 + +M NEWS +M UI/MainUI/SOGoUserHomePage.m + +commit 89284d558c558c5bd2ec8c346fe5c16acbc1c366 +Author: Francis Lachapelle +Date: Wed Oct 1 09:02:03 2014 -0400 + + Add missing translation + +M UI/PreferencesUI/English.lproj/Localizable.strings + +commit 9610fcc5ca4faa9083e4be1c4cdf0bde53e7e228 +Author: Ludovic Marcotte +Date: Mon Sep 29 15:30:02 2014 -0400 + + Bumped version + +M Version + +commit 9cdcfd1d4a86de691a15b2a8d412c073f86dd145 +Author: Ludovic Marcotte +Date: Mon Sep 29 15:20:22 2014 -0400 + + Updated for the 2.2.9a release + +M NEWS +M Version + +commit 95b122c9125a3e8185a6b5fe0f1a7bd0bfefc130 +Author: Ludovic Marcotte +Date: Mon Sep 29 15:04:40 2014 -0400 + + Simplified even more -safeString + +M SoObjects/SOGo/NSString+Utilities.m + +commit aa0499dbacbefac0a7c2c8504eb94be22af26629 +Author: Ludovic Marcotte +Date: Mon Sep 29 14:28:13 2014 -0400 + + Fixed sanitization char skipping and #2936 + +M SoObjects/SOGo/NSString+Utilities.m +M UI/MailerUI/UIxMailListActions.m + +commit 80acafadd38b95dbd4917c157ea24d2a3467dd0c +Author: Francis Lachapelle +Date: Fri Sep 26 14:49:36 2014 -0400 + + Fix URL in documentation + +M Documentation/SOGoMozillaThunderbirdConfigurationGuide.asciidoc + +commit 4c5be2fd97ed230478ec330bc849cd3d96c31589 +Author: Ludovic Marcotte +Date: Fri Sep 26 14:31:57 2014 -0400 + + Update ChangeLog + +M ChangeLog + commit c0e8eb6ce3b2501a0439a95d6d4bfcb9b6c17cf0 Author: Ludovic Marcotte Date: Fri Sep 26 14:29:20 2014 -0400 @@ -1246,6 +2637,15 @@ Date: Fri Aug 1 12:26:53 2014 -0400 M UI/WebServerResources/SchedulerUI.js +commit 1a2fe8908b2f6feb674d69f47f034b253c2a444d +Author: Jesús García Sáez +Date: Wed Mar 19 17:19:07 2014 +0100 + + Revert "Merge pull request #2 from Zentyal/jgarcia/fix-encoding-of-mapistoreuris" + +M OpenChange/MAPIStoreContext.m +M OpenChange/MAPIStoreMailContext.m + commit cde1db93245c8bdfbf8e69ed8efe8a0f6a03027c Author: Ludovic Marcotte Date: Fri Aug 1 09:40:45 2014 -0400 @@ -1475,6 +2875,66 @@ M NEWS M UI/WebServerResources/SchedulerUI.css M UI/WebServerResources/SchedulerUI.js +commit f76a6cfc96aeefd1d5b913a29e60dcce6dfa9b5c +Author: Carlos Pérez-Aradros Herce +Date: Wed Jul 9 13:28:42 2014 +0200 + + Fix mysql cleanup log message + +M Scripts/openchange_user_cleanup + +commit 2b3bc10f786ce6948dfeb90d1752d975de5bbf51 +Author: Kamen Mazdrashki +Date: Thu Jul 3 14:59:49 2014 +0200 + + Scripts/openchange_user_cleanup: Don't hardcode samba private dir, use samba LoadParm() + + Signed-off-by: Kamen Mazdrashki + +M Scripts/openchange_user_cleanup + +commit 3eba5f940e353909628ab6fa59c4f402cccd0e32 +Author: Jesús García Sáez +Date: Wed Jul 2 12:24:09 2014 +0200 + + increase log level of debug message + +M OpenChange/MAPIStoreSOGo.m + +commit 7f2ee7be89d6dbbd0a70eb43a3ef32d6c56761c2 +Author: Jesús García Sáez +Date: Wed Jul 2 10:40:05 2014 +0200 + + Error message only when initialization hadn't been done + + In a multithread environment, sogo_backend_init is registering the thread + only for the first one that calls this function, then the others threads + (even if they call sogo_backend_init) won't be registered because + moduleInitialized was YES. + + We just want to ensure sogo_backend_init is called at least once (per process, + not per thread). + +M OpenChange/MAPIStoreSOGo.m + +commit 41f2e917e76e07f1f6a62dc7eea0e8aada9d2bce +Author: Miguel Julián +Date: Thu Jun 12 16:20:41 2014 +0200 + + Removed development tip comment + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit 65ece612734ec4fd88d08daeed5c86bd06fbd598 +Author: Miguel Julián +Date: Thu Jun 12 15:46:02 2014 +0200 + + Removing some trail characters at event description + + * They are sometimes present after a \r\n\n + +M OpenChange/MAPIStoreAppointmentWrapper.m + commit 94f3246658c151b55ca86404c607fe29de7b94b1 Author: Ludovic Marcotte Date: Tue Jul 29 10:36:20 2014 -0400 @@ -2025,6 +3485,409 @@ Date: Wed Jul 2 10:11:13 2014 -0400 M NEWS +commit 1846e1ee5db7120d4ebca9842ab402333b26cac5 +Author: Kamen Mazdrashki +Date: Tue Jun 24 15:28:42 2014 +0200 + + oc/TallocWrapper: don't handle Threading initialization here + + It is SOGo backend module responsibility to setup/teardonw all + ObjC specific initialization + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/NSObject+MAPIStore.m + +commit 1fc3a57210b61cc73a91757f5d7ddc4050dc5f7f +Author: Kamen Mazdrashki +Date: Thu Jun 19 20:41:37 2014 +0200 + + oc: Protect backend initialization to happen only once + +M OpenChange/MAPIStoreSOGo.m + +commit 5b75c817e21bb43c8a731ff2cb9a04f2e58bf080 +Author: Kamen Mazdrashki +Date: Thu Jun 19 19:57:32 2014 +0200 + + oc: Log when mapistore backend is successfully initialized + +M OpenChange/MAPIStoreSOGo.m + +commit c91741ad1f925b3acc828d88d28b82f640eb6997 +Author: Kamen Mazdrashki +Date: Thu Jun 19 19:43:14 2014 +0200 + + oc/dbmsgreader: Fix to work again this time basen on BSON format for msg data + + Also, implement reading for message data in case only 1 param is passed. + This could be usefull when have msg data by other means than by + reading it directly from DB + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/GNUmakefile +M OpenChange/dbmsgreader.m + +commit 86e54989fbba8997eb41eb0b1b84fd2f10faa0b7 +Author: Kamen Mazdrashki +Date: Fri Jun 20 03:23:38 2014 +0200 + + oc/utils: Make "plext" category publicly visible + + Signed-off-by: Kamen Mazdrashki + +A OpenChange/NSObject+PropertyList.h +M OpenChange/NSObject+PropertyList.m + +commit 116e738e63e7b281191b76665ce616961ca93293 +Author: Kamen Mazdrashki +Date: Thu Jun 19 19:30:17 2014 +0200 + + oc/utils: Move OCDumpPListData() function into plreader - this is the only user for this function + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/NSObject+PropertyList.m +M OpenChange/plreader.m + +commit bf0f2a76d565fc1f0265ad6f45e28c37c965dba3 +Author: Kamen Mazdrashki +Date: Mon Jun 16 13:20:51 2014 +0200 + + oc/MAPIStoreSOGo: Do not destroy current thread context after any API call + + We have thread context already in place during *_init() function. + Thus guarding every API call with TreadInit/Destroy is: + - a bit redundand + - makes SOGo backend not reentrant even on single thread and leads + to hard to find use-after-free crashes + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreSOGo.m + +commit 6de298d20285730e06fb41488ee6d97edfffbfab +Author: Kamen Mazdrashki +Date: Fri Jun 13 14:20:00 2014 +0200 + + oc/MAPIStoreMapping: Split the check for existing entry so we have better error message + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreMapping.m + +commit 98505c1b6b54c477e5c438d7fee3eac9ee100d66 +Author: Kamen Mazdrashki +Date: Fri Jun 13 14:19:20 2014 +0200 + + oc/MAPIStoreContext: Fix log messages to actually print 64bit FMIDs + + Signed-off-by: Kamen Mazdrashki + + Conflicts: + OpenChange/MAPIStoreContext.m + +M OpenChange/MAPIStoreContext.m + +commit 51df0adb79095dde2b0fc48f619a4b8497768970 +Author: Miguel Julián +Date: Thu Jun 12 16:20:41 2014 +0200 + + Removed development tip comment + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit 5d43513dd9f36dd47610c822bee3ace20e91aae5 +Author: Miguel Julián +Date: Thu Jun 12 15:46:02 2014 +0200 + + Removing some trail characters at event description + + * They are sometimes present after a \r\n\n + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit 2458af1a43e6e422538e3627313c591c7121b1d8 +Author: Miguel Julián +Date: Wed Jun 11 16:14:11 2014 +0200 + + All day events deladyed one day if user timezone is +XX:XX + + * Those events were not shown properly in SOGo web UI + +M OpenChange/iCalEvent+MAPIStore.m + +commit 2792baac028ecca9253e5ec88021e0cc7a8c7e53 +Author: Kamen Mazdrashki +Date: Mon Jun 2 01:20:18 2014 +0200 + + openchange: don't overflow possible recipient type while creating message headers + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreMailVolatileMessage.m + +commit 4b383705fff833a1c41dde513119fe847bbaefc7 +Author: Kamen Mazdrashki +Date: Mon Jun 2 01:18:23 2014 +0200 + + openchange: Fix submitWithFlags to submit to BCC-ed recipients also + + this reintroduces commit 7efb263c659451d2c781547a5b38cb5d01ed837f + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreMailVolatileMessage.m + +commit dd7200e00f6d975e8b4d3705745b49fae6509256 +Author: Kamen Mazdrashki +Date: Wed May 7 01:26:34 2014 +0200 + + openchange/MAPIStoreFolder: Add private selector for actual folder delete action + + Usually, it is a bad idea for an object to call its own public methods + (just like in this case). Thus separating impelementation for deleteFolder: + would allow MAPIStoreFolder to call only private implementation when needed + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreFolder.m + +commit 27851ef4280812ce5bf53c1cce33318a4774cc6f +Author: Kamen Mazdrashki +Date: Mon May 5 01:51:18 2014 +0200 + + openchange: FillMessageHeadersFromProperties fix skipping of last value in + possible range of recepients + + IMHO, this fixes a bug, that when saving a meessage, it is saved + without BCC fields. + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreMailVolatileMessage.m + +commit 7da8885190acac061bb54518cf6bbe305eb8d35b +Author: Kamen Mazdrashki +Date: Mon May 5 01:47:17 2014 +0200 + + openchange: getMessageData - replace int literals with ulRecipClass values + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreMailVolatileMessage.m + +commit fc9dc080455025f16c2ef58d14d8b16913eeb999 +Author: Kamen Mazdrashki +Date: Thu Mar 20 17:26:44 2014 +0100 + + oc-sogo: pretty print Exceptions in sogo_backend_handle_objc_exception() + + Now we have a nice stack trace printed out from [NSException callStackSymbols] + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreSOGo.m + +commit bcfb674cd1ba63189eb8210a95b388c0dc2468a6 +Author: Kamen Mazdrashki +Date: Thu Mar 20 17:04:11 2014 +0100 + + oc-sogo: Print both [NSException callStackSymbols] and execinfo.h stack trace + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreSOGo.m + +commit 6be768af42c7e21653149b81cfc1b2f09847d0f9 +Author: Kamen Mazdrashki +Date: Thu Mar 20 16:27:03 2014 +0100 + + oc-sogo: Move memory clean up *after* handling the exception + + Otherwise the mess is full :) + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreSOGo.m + +commit 2c94d21f3e62222304cd75ba7300acf1de8663fe +Author: Kamen Mazdrashki +Date: Thu Mar 20 15:52:21 2014 +0100 + + oc-sogo: Use [e name] and [e reason] selectors + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreSOGo.m + +commit cbe616358dde8a1bbc19d5c84e0371402a919532 +Author: Kamen Mazdrashki +Date: Thu Mar 20 14:36:29 2014 +0100 + + oc-sogo: Clean up AutoRelease pool and unregister threads in Catch handler + + Most of the time we have "not yet implemented" kind of exceptions, + so it is better to clean up allocated resources + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreSOGo.m + +commit 09e6fcc3ff2021b1a9a4a2d99e8a4a852f8c5c93 +Author: Kamen Mazdrashki +Date: Thu Mar 20 14:24:58 2014 +0100 + + oc-sogo: try/catch to guard only the actual impelementation rather than *everything* + + Signed-off-by: Kamen Mazdrashki + +M OpenChange/MAPIStoreSOGo.m + +commit 3b2174eeec1843eeb011129134cecf5b6bfd2246 +Author: Jesús García Sáez +Date: Mon Mar 17 21:08:12 2014 +0100 + + if there is no password file for specific user, try to read global password file + + This way we can have a master password for imap access + +M OpenChange/MAPIStoreUserContext.m + +commit c6b8be742d1197ad24f0d1735db36892a6b4c1aa +Author: Jesús García Sáez +Date: Tue Mar 4 16:40:41 2014 +0100 + + use execinfo.h to get backtrace + + Really poor backtrace because it will only have the frames from oc side, + I don't know why callStackSymbols is returning null, compilation flags? + +M OpenChange/MAPIStoreSOGo.m + +commit a77863947f92730dbd407f25c0e65fc0a9b51c55 +Author: Jesús García Sáez +Date: Tue Mar 4 12:29:13 2014 +0100 + + add try catch to all functions on struct mapistore_backend + +M OpenChange/MAPIStoreSOGo.m + +commit d1f54298d29963e76f12e3cc2ef4abf07b697f68 +Author: Jesús García Sáez +Date: Mon Mar 3 16:09:30 2014 +0100 + + stringByDecodingImap4FolderName is not neccesary + + For russian locale and characters nonexistent in latin1 sogo crashes + +M OpenChange/MAPIStoreMailContext.m + +commit f8028b5a94f1899ca1f20fa3f63d8949c91c7069 +Author: Kamen Mazdrashki +Date: Sat Feb 22 23:01:41 2014 +0100 + + OpenChange: Avoid crashing when creating embedded message in attachment + + Signed-off-by: Kamen Mazdrashki + (cherry picked from commit 15a55f9f707247c9164e8fa7a102639744f686e5) + +M OpenChange/MAPIStoreSOGo.m + +commit 6bef67811432f5685802cb134d85cffd79de2e41 +Author: Jesús García Sáez +Date: Thu Feb 27 17:47:28 2014 +0100 + + fix format logging uint64_t + +M OpenChange/MAPIStoreContext.m + +commit c81476bd040508bf2e70e51ef8052c5400746777 +Author: Jesús García Sáez +Date: Thu Feb 27 17:46:55 2014 +0100 + + no need to modify url + +M OpenChange/MAPIStoreContext.m + +commit a24f009cfe88be15977c661b7fcc100dd76a6f6b +Author: Jesús García Sáez +Date: Thu Feb 27 17:42:58 2014 +0100 + + mapistoreURI encoding should be done the same way as listContextForUser + + stringByEncodingImap4FolderName is used inside [newFolder create] where is needed + +M OpenChange/MAPIStoreMailContext.m + +commit 95298de9f18ce440355eb6ef783e7294d9432a22 +Author: Jesús García Sáez +Date: Mon Feb 10 12:38:42 2014 +0100 + + avoid infinite loop when trying to update a folder id + +M OpenChange/MAPIStoreMapping.m + +commit f6d1a37127eea974a3a64c1cea138b796d62eaa2 +Author: Jesús García Sáez +Date: Tue Dec 24 11:03:03 2013 +0100 + + use properly get_uri function and check ret value + +M OpenChange/MAPIStoreMapping.m + +commit 2aa71cc8a3fdc94b925773ce5dc5cd3b0eced242 +Author: Jesús García Sáez +Date: Fri Dec 20 11:26:09 2013 +0100 + + check ret value properly + +M OpenChange/MAPIStoreContext.m + +commit 34b98a563dec2229a6d7c363e1f77a659d872bb7 +Author: Jesús García Sáez +Date: Tue Nov 19 15:24:31 2013 +0100 + + get_new_folderID functions are now on mapistore_indexing + +M OpenChange/MAPIStoreContext.m + +commit fd308b592fcf8c7052258c4e2e17d25278344e26 +Author: Carlos Pérez-Aradros Herce +Date: Mon Nov 11 03:17:53 2013 +0100 + + Converted all the indexing code to indexing backends + +M OpenChange/MAPIStoreMapping.m + +commit a6bfb9d5c50b2fa299b6bb583dd33630848c0d6f +Author: Carlos Pérez-Aradros Herce +Date: Sat Nov 9 18:00:44 2013 +0100 + + Use indexing generic code instead of tdb private funtions + +M OpenChange/MAPIStoreMapping.h +M OpenChange/MAPIStoreMapping.m + +commit 33b353b97442c106dba2b63b29954f05af9c34b6 +Author: Carlos Pérez-Aradros Herce +Date: Fri Nov 8 17:02:50 2013 +0100 + + Moved to abstract index_context instead of tdb_wrap + +M OpenChange/MAPIStoreContext.h +M OpenChange/MAPIStoreContext.m +M OpenChange/MAPIStoreFallbackContext.m +M OpenChange/MAPIStoreGCSBaseContext.m +M OpenChange/MAPIStoreMailContext.m +M OpenChange/MAPIStoreMapping.h +M OpenChange/MAPIStoreMapping.m +M OpenChange/MAPIStoreNotesContext.m +M OpenChange/MAPIStoreSOGo.m +M OpenChange/MAPIStoreUserContext.h +M OpenChange/MAPIStoreUserContext.m + commit 899a1eb026503165436a333110fa6eb73522c5a6 Author: Ludovic Marcotte Date: Wed Jul 2 08:39:01 2014 -0400 diff --git a/Documentation/Makefile b/Documentation/Makefile index 40bc10436..ee7246fba 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -1,7 +1,7 @@ all: $(patsubst %.asciidoc,%.pdf,$(wildcard *.asciidoc)) %.pdf : %.asciidoc - asciidoc -a docinfo1 -b docbook -d book -d book -o $<.docbook $< + asciidoc -a docinfo1 -b docbook -d book -o $<.docbook $< fop -c fonts/fop-config.xml -xsl docbook/xsl/sogo-fo.xsl -xml $<.docbook -pdf $@ clean: diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index c4f077505..757055903 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -193,7 +193,7 @@ installation for a Red Hat or CentOS distribution. Software Downloads ~~~~~~~~~~~~~~~~~~ -SOGo can be installed using the+yum+utility. To do so, first create +SOGo can be installed using the `yum` utility. To do so, first create the `/etc/yum.repos.d/inverse.repo` configuration file with the following content: @@ -258,13 +258,13 @@ In SOGo, the user's applications settings are stored in `/etc/sogo/sogo.conf`. You can use your favourite text editor to modify the file. -The +sogo.conf+ file is a serialized _property list_. This simple format +The `sogo.conf` file is a serialized _property list_. This simple format encapsulates four basic data types: arrays, dictionaries (or hashes), strings and numbers. Numbers are represented as-is, except for booleans which can take the unquoted values `YES` and `NO`. Strings are not mandatorily quoted, but doing so will avoid you many problems. A dictionary is a sequence of key and value pairs separated in their -middle with a `=` sign. It starts with a `\{` and ends with a +middle with a `=` sign. It starts with a `{` and ends with a corresponding `}`. Each value definition in a dictionary ends with a semicolon. An array is a chain of values starting with `(` and ending with `)`, where the values are separated with a `,`. Also, the file @@ -1167,7 +1167,7 @@ keytool -import -keystore /etc/ssl/certs/java/cacerts \ *The certificate used by the CAS server must also be trusted by SOGo.* In case of a self-signed certificate, this means exporting tomcat's -certificate using the +keytool+utility, converting it to PEM format and +certificate using the `keytool` utility, converting it to PEM format and appending it to the `ca-certificates.crt` file (the name and location of that file differs between distributions). Basically: @@ -1581,8 +1581,8 @@ Note that TLS is supported but SSL is not. |D |SOGoSieveFolderEncoding |Parameter used to specify which encoding is used for IMAP folder names -in Sieve filters. Defaults to "UTF-7". The other possible value is -"UTF-8". +in Sieve filters. Defaults to `UTF-7`. The other possible value is +`UTF-8`. |U |SOGoMailShowSubscribedFoldersOnly |Parameter used to specify if the Web interface should only show @@ -1632,6 +1632,12 @@ cronjob `sogo-tmpwatch`. Defaults to `/var/spool/sogo`. +|S |NGImap4DisableIMAP4Pooling +|Disables IMAP pooling when set to `YES`. Enable pooling by setting to +`NO` or using a caching proxy like imapproxy. + +The default value is `YES`. + |S |NGImap4ConnectionStringSeparator |Parameter used to set the IMAP mailbox separator. Setting this will also have an impact on the mailbox separator used by Sieve filters. @@ -1644,7 +1650,7 @@ SASL mechanism. Please note that feature might be limited at this time. |D |NGImap4ConnectionGroupIdPrefix |Prefix to prepend to names in IMAP ACL transactions, to indicate the -name is a group name not a user name. +name is a group name, not a user name. RFC4314 gives examples where group names are prefixed with `$`. Dovecot, for one, follows this scheme, and will, for example, apply permissions @@ -1993,7 +1999,7 @@ Defaults to `NO` when unset. SOGo Configuration Summary ~~~~~~~~~~~~~~~~~~~~~~~~~~ -The complete SOGo configuration file+/etc/sogo/sogo.conf+should look +The complete SOGo configuration file `/etc/sogo/sogo.conf` should look like this: ---- @@ -2325,7 +2331,7 @@ ActiveSync: |Parameter used to set the maximum amount of time, in seconds, SOGo will wait before replying to a Ping command. -If not set, it defaults to `5` seconds. +If not set, it defaults to `10` seconds. |S |SOGoMaximumSyncInterval |Parameter used to set the maximum amount of time, in seconds, SOGo will @@ -2336,7 +2342,8 @@ If not set, it defaults to `30` seconds. |S |SOGoInternalSyncInterval |Parameter used to set the maximum amount of time, in seconds, SOGo will wait before doing an internal check for data changes (add, delete, and -update). This parameter must be lower than _SOGoMaximumSyncInterval_. +update). This parameter must be lower than _SOGoMaximumSyncInterval_ and +_SOGoMaximumPingInterval_. If not set, it defaults to `10` seconds. @@ -2379,6 +2386,10 @@ see http://support.microsoft.com/kb/291621 for configuration instructions. On the SOGo side, _SOGoEnablePublicAccess_ must be set to `YES` and the URL to use must be of the following format: `http:///SOGo/dav/public/%NAME%/freebusy.ifb` +* If you have very large mail folders (thousands of messages), you will +need to adjust the word size of your IMAP server. In Dovecot, the parameter +to increase is "imap_max_line_length" while under Cyrus IMAP Server, the +parameter is "maxword". We suggest a buffer of 2MB. In order to use the SOGo ActiveSync support code in production environments, you need to get a proper usage license from Microsoft. diff --git a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc index 75eb4eb86..99efb47fe 100644 --- a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc +++ b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc @@ -233,13 +233,12 @@ Installation This section will guide you through the installation of the native Microsoft Outlook compatibility layer SOGo offers. -Red Hat Enterprise Linux v5 and v6 +Red Hat Enterprise Linux v6 x86_64 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you are using Red Hat Enterprise Linux (or CentOS) version 5 or -version 6, packages for Samba 4, OpenChange and SOGo and the SOGo -OpenChange backend are available from SOGo's web site. Please follow the -instructions from +If you are using Red Hat Enterprise Linux version 6 x86_64, packages +for Samba 4, OpenChange and SOGo and the SOGo OpenChange backend are +available from SOGo's web site. Please follow the instructions from http://www.sogo.nu/english/downloads/backend_nightly.html. In order to satisfy certain dependencies, you should also add the EPEL @@ -253,53 +252,48 @@ installation: ---- yum clean all && yum makecache -yum install samba4 \ +yum install samba \ openchange \ sogo-openchange-backend \ openchange-ocsmanager \ - openchange-rpcproxy + openchange-rpcproxy \ + mysql-server \ + MySQL-python ---- Once the packages are installed, refer to the _Configuration_ chapter from this guide. -Debian 6.0 (Squeeze) and Ubuntu 12.04 (Precise Pangolin) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[NOTE] +Samba4/OpenChange are not available for now on CentOS 5 i386/x86_64, +CentOS 6 i386 and CentOS 7. -Samba 4, OpenChange, SOGo and the SOGo OpenChange backend are now +Debian 7.0 (Wheezy) and Ubuntu 12.04 (Precise Pangolin) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +SOGo, OpenChange and the SOGo OpenChange backend are now available from SOGo's web site. Please follow the instructions from -http://www.sogo.nu/english/downloads/backend_nightly.html to setup your +http://www.sogo.nu/english/downloads/backend.html to setup your apt sources. -Debian Squeeze ships an older version of some libraries required by -Samba 4. In order to workaround this, users of this distribution will -have to use the _squeeze-backports_ repository. To do so, create +For Samba 4, you need to use the _wheezy-backports_ repository. To do so, create `/etc/apt/sources.list.d/backports.list`: - deb http://backports.debian.org/debian-backports squeeze-backports main + deb http://http.debian.net/debian wheezy-backports main -Then install the dependencies on Debian Squeeze, do: +On Ubuntu 12.04, you will also have to add the Wheezy sources: ----- -apt-get update -apt-get install -t squeeze-backports libwbclient-dev samba-common smbclient libsmbclient libsmbclient-dev ----- + deb http://ftp.us.debian.org/debian wheezy main + deb http://security.debian.org/ wheezy/updates main -Once ready, install the `samba4` package on top of an existing SOGo +Then install Samba 4 on top of an existing SOGo installation: ---- apt-get update -apt-get install samba4 +apt-get -t wheezy-backports install samba samba-dev ---- -The current post installation script shipped with the Samba 4 package is -far from perfect and might fail even on a fresh install. The following -command is needed to let dpkg know that everything is fine about Samba 4 -if the post install script fails. - - sed --in-place 'N; s/Package: samba4\nStatus: install ok half-configured/Package: samba4\nStatus: install ok installed/;' /var/lib/dpkg/status - Once completed, install the packages related to OpenChange and the SOGo provider: @@ -307,13 +301,53 @@ provider: apt-get install openchangeserver \ sogo-openchange \ openchangeproxy \ - openchange-ocsmanager \ - openchange-rpcproxy + python-ocsmanager \ + mysql-server \ + python-mysqldb ---- Once the packages are installed, refer to the _Configuration_ chapter from this guide. +[NOTE] +On Ubuntu 12.04, the Samba init scripts need to be modified to +disable the upstart check. For more details, refer to: +https://wiki.samba.org/index.php/Samba4/InitScript + + +Ubuntu 14.04 (Trusty Tahr) +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For Ubuntu 14.04, you must not use the Debian Wheezy backports. + +Please follow the instructions from +http://www.sogo.nu/english/downloads/backend.html to setup your +apt sources. + +Then install Samba 4 on top of an existing SOGo +installation: + +---- +apt-get update +apt-get install samba samba-dev +---- + +Once completed, install the packages related to OpenChange and the SOGo +provider: + +---- +apt-get install openchangeserver \ + sogo-openchange \ + openchangeproxy \ + python-ocsmanager \ + mysql-server \ + python-mysqldb +---- + +Once the packages are installed, refer to the _Configuration_ chapter +from this guide. + + Configuration ------------- @@ -349,16 +383,14 @@ You might consider changing the realm and domain used, to suit your enviroment. You might also have to -remove `/etc/samba4/smb.conf` (or `/etc/samba/smb.conf` on Debian-based -distributions) prior running this command. +remove `/etc/samba/smb.conf` prior running this command. Add the following parameters to the `[global]` section of the -`/etc/samba4/smb.conf` (`/samba/smb.conf` if you use a Debian-based -distribution) configuration file: +`/etc/samba/smb.conf` configuration file: ---- ### Configuration required by OpenChange server ### -dcerpc endpoint servers = +epmapper, +mapiproxy +dcerpc endpoint servers = epmapper, mapiproxy, dnsserver dcerpc_mapiproxy:server = true dcerpc_mapiproxy:interfaces = exchange_emsmdb, exchange_nsp, exchange_ds_rfr ### Configuration required by OpenChange server ### @@ -392,11 +424,22 @@ Your Samba 4 configuration file should look like this: OpenChange Configuration ~~~~~~~~~~~~~~~~~~~~~~~~ +OpenChange 2.2 stores its metadata in MySQL so you need to have it installed. + +First, create the OpenChange MySQL user: + +---- +$ mysql -u root -p +mysql> CREATE USER 'openchange-user'@'localhost' IDENTIFIED BY 'openchange$123'; +mysql> GRANT ALL PRIVILEGES ON `openchange`.* TO 'openchange-user'@'localhost' WITH GRANT OPTION; +mysql> FLUSH PRIVILEGES; +---- + The Samba AD schema needs to be filled with additional object definitions by running the following commands:  ---- -openchange_provision +openchange_provision --standalone NOTE: This operation can take several minutes [+] Step 1: Register Exchange OIDs @@ -410,38 +453,59 @@ NOTE: This operation can take several minutes [+] Step 9: Add Exchange classes to Samba schema [+] Step 10: Add possSuperior attributes to Exchange classes [+] Step 11: Extend existing Samba classes and attributes -[+] Step 12: Exchange Samba with Exchange configuration objects +[+] Step 12: Generic Exchange configuration objects +[+] Step 13: Finalize generic Exchange configuration objects +[SUCCESS] Done! +[+] Step 1: Exchange Samba registration +[SUCCESS] Done! +[+] Step 1: Register Exchange Samba as the main server [SUCCESS] Done! ---- -You can safely ignore the "`ERROR: no subClassOf 'serviceAdministrationPoint' for 'rRASAdministrationConnectionPoint'`" message when running the `openchange_provision` command. - -Provision the OpenChange database:  +Create the OpenChange database:  ---- -openchange_provision --openchangedb +openchange_provision --openchangedb --openchangedb-uri 'mysql://openchange-user:openchange$123@localhost/openchange' Setting up openchange db [+] Public Folders =================== - * Public Folder Root 0x0100000000000001 - * IPM_SUBTREE 0x0200000000000001 - * NON_IPM_SUBTREE 0x0300000000000001 - * EFORMS REGISTRY 0x0400000000000001 - * OFFLINE ADDRESS BOOK 0x0500000000000001 - * /o=First Organization/cn=addrlists/cn=oabs/cn=Default Offline Address Book 0x0600000000000001 - * SCHEDULE+ FREE BUSY 0x0700000000000001 - * EX:/o=First Organization/ou=Exchange Administrative Group (UBUNTU-OC) 0x0800000000000001 - * Events Root 0x0900000000000001 + * Public Folder Root : 0x0100000000000001 (72057594037927937) + * IPM_SUBTREE : 0x0200000000000001 (144115188075855873) + * NON_IPM_SUBTREE : 0x0300000000000001 (216172782113783809) + * EFORMS REGISTRY : 0x0400000000000001 (288230376151711745) + * OFFLINE ADDRESS BOOK : 0x0500000000000001 (360287970189639681) + * /o=First Organization/cn=addrlists/cn=oabs/cn=Default Offline Address Book: 0x0600000000000001 (432345564227567617) + * SCHEDULE+ FREE BUSY : 0x0700000000000001 (504403158265495553) + * EX:/o=first organization/ou=first administrative group: 0x0800000000000001 (576460752303423489) + * Events Root : 0x0900000000000001 (648518346341351425) +---- + +Finally, modify `/etc/samba/smb.conf` to specify OpenChange connection information +for its indexing database. Add the following at the end of the `[global]` section: + +---- +mapistore:namedproperties = mysql +namedproperties:mysql_user = openchange-user +namedproperties:mysql_pass = openchange$123 +namedproperties:mysql_host = localhost +namedproperties:mysql_db = openchange + +mapistore:indexing_backend = mysql://openchange-user:openchange$123@localhost/openchange +mapiproxy:openchangedb = mysql://openchange-user:openchange$123@localhost/openchange ---- On RHEL, make sure SELinux is disabled: setenforce 0 -Next, you can start Samba using the usual command : +Next, you can start Samba using the usual command: - /etc/init.d/samba4 start + /etc/init.d/samba start + +On upstart-based distributions, use: + + start samba-ad-dc You can also launch the OpenChange web services: @@ -503,6 +567,10 @@ On Debian-based distributions, do: update-rc.d apache2 defaults && /etc/init.d/apache2 restart +[NOTE] +Debian-based distributions are not supported anymore for +OCSManager/rpcproxy. Support will soon resume. + Name Service Configuration for Web Services ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -540,14 +608,13 @@ samba-tool domain passwordsettings set --complexity=off samba-tool domain passwordsettings set --min-pwd-length=1 samba-tool user add samba-tool user setexpiry --noexpiry -# create user in openchange+ +openchange_newuser --create +# create user in openchange +openchange_newuser --create ---- If you don't have a trust between your IMAP server and SOGo, you must at this point set the cleartext password of the newly created user in -`/var/lib/samba4/private/mapistore/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Lato-Medium - - - 0.5em - solid 2px - 1em - - - solid 1px - 1em - 1em - - - 1em - 1em - - - 1em - - - 1em - - - - - 1.5em - 1.5em - 2.2em - - - - Lato-Light - 10 - Incosolata - - - - 12pt - bold - center - - - page - - - 1px solid - - - - - - - - - - - - - 0em - 0em - 0.2em - - - - - - - - - - - - - square - - - - - - images/ - .png - - 1px solid - 1px solid - 0.5em - 0.5em - 2em - - - - - - - #E0E0E0 - thin #9F9F9F solid - 0pt - 0.5em - - always - - - - - wrap - - - - - - - - blue - underline - - - - - - - - - - diff --git a/Documentation/docbook/xsl/sogo-fo.xsl b/Documentation/docbook/xsl/sogo-fo.xsl index 4f5c4ba31..5ab3c7396 100644 --- a/Documentation/docbook/xsl/sogo-fo.xsl +++ b/Documentation/docbook/xsl/sogo-fo.xsl @@ -165,6 +165,13 @@ underline + + + + + + + diff --git a/Documentation/docinfo.xml b/Documentation/docinfo.xml index ade228dca..76b82caf2 100644 --- a/Documentation/docinfo.xml +++ b/Documentation/docinfo.xml @@ -1,7 +1,7 @@ -Version 2.2.9 - September 2014 -for version 2.2.9 -2014-09-26 +Version 2.2.10 - November 2014 +for version 2.2.10 +2014-11-21 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". diff --git a/Documentation/includes/global-attributes.asciidoc b/Documentation/includes/global-attributes.asciidoc index b5707df1b..62d2f66df 100644 --- a/Documentation/includes/global-attributes.asciidoc +++ b/Documentation/includes/global-attributes.asciidoc @@ -13,6 +13,6 @@ // TODO have the build system take care of this -:release_version: 2.2.9 +:release_version: 2.2.10 // vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab: diff --git a/Main/GNUmakefile b/Main/GNUmakefile index 962730cbc..33a40230d 100644 --- a/Main/GNUmakefile +++ b/Main/GNUmakefile @@ -6,8 +6,7 @@ include ../Version ADDITIONAL_OBJCFLAGS += -fPIE ADDITIONAL_INCLUDE_DIRS += -ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj/ -ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -fPIE -pie +ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -fPIE -pie -Wl,--rpath,$(GNUSTEP_SYSTEM_LIBRARIES)/sogo SOGOD = sogod TOOL_NAME = $(SOGOD) diff --git a/Main/GNUmakefile.preamble b/Main/GNUmakefile.preamble index 022e3d1e2..bc6998db8 100644 --- a/Main/GNUmakefile.preamble +++ b/Main/GNUmakefile.preamble @@ -9,10 +9,9 @@ ADDITIONAL_INCLUDE_DIRS += \ -I.. ADDITIONAL_LIB_DIRS += \ - -L../SoObjects/SOGo/SOGo.framework \ - -L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ - -SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib + -L../SoObjects/SOGo/SOGo.framework/sogo \ + -L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \ + -L../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/ $(SOGOD)_TOOL_LIBS += \ -lSOGo \ diff --git a/NEWS b/NEWS index e2d50e2a8..3a1e23e6c 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,34 @@ +2.2.10 (2014-11-21) +------------------- + +Enhancements + - no longer leaking database passwords in the logs (#2953) + - added support for multiple calendars and address books over ActiveSync + - updated timezone information (#2968) + - updated Brazilian Portuguese, Czech, Dutch, Finnish, French, German, Hungarian, Polish, + Russian, Spanish (Argentina), and Spanish (Spain) translations + - updated CKEditor to version 4.4.5 + +Bug fixes + - fixed freebusy lookup with "Show time as busy" (#2930) + - don't escape
's in a card's note field + - fixed folder's display name when subscribing to a folder + - fixed folder's display name when the active user subscribes another user to one of her/his folders + - fixed error with new user default sorting value for the mailer module (#2952) + - fixed ActiveSync PING command flooding the server (#2940) + - fixed many interop issues with Windows Phones over ActiveSync + - fixed automatic return receipts crash when not in the recepient list (#2965) + - fixed support for Sieve folder encoding parameter (#2622) + - fixed rename of subscribed addressbooks + - sanitize strings before escaping them when using EAS + - fixed handling of event invitations on iOS/EAS with no organizer (#2978) + - fixed corrupted png files (#2975) + - improved dramatically the BSON decoding speed + - added WindowSize support for GCS collections when using EAS + - fixed IMAP search with non-ASCII folder names + - fixed extraction of email addresses when pasting text with tabs (#2945) + - fixed Outlook attachment corruption issues when using AES (#2957) + 2.2.9a (2014-09-29) ------------------- @@ -11,7 +42,7 @@ New features - support for recurrent tasks (#2160) - support for alarms on recurrent events / tasks -Enchancements +Enhancements - alarms can now be snoozed for 1 day - better iOS/Mac OS X Calendar compability regarding alarms (#1920) - force default classification over CalDAV if none is set (#2326) @@ -36,7 +67,7 @@ New features - new user settings for threads collapsing - IMAP global search support (#2670) -Enchancements +Enhancements - major refactoring of the GCS component saving code (dropped OGoContentStore) - printing calendars in colors is now possible in all views; list, daily, weekly and multicolumns - new option to print calendars events and tasks with a background color or with a border color diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index 07d41a5b7..29939b87d 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -133,10 +133,11 @@ $(PLREADER_TOOL)_OBJC_FILES += \ DBMSGREADER_TOOL = dbmsgreader $(DBMSGREADER_TOOL)_OBJC_FILES += \ - dbmsgreader.m + dbmsgreader.m \ + NSObject+PropertyList.m $(DBMSGREADER_TOOL)_LIB_DIRS += \ - -L../SoObjects/SOGo/SOGo.framework/ -lSOGo \ + -L../SoObjects/SOGo/SOGo.framework/sogo -lSOGo \ -L../SOPE/GDLContentStore/obj/ -lGDLContentStore \ -L../SOPE/NGCards/obj/ -lNGCards \ -lNGObjWeb @@ -160,12 +161,12 @@ LIBMAPISTORE_LIBS = $(shell pkg-config libmapistore --libs) -lmapiproxy -lWEExte $(MAPISTORESOGO)_INSTALL_DIR = $(DESTDIR)/$(SAMBA_LIB_DIR)/mapistore_backends $(MAPISTORESOGO)_LIB_DIRS += \ - -L../SoObjects/SOGo/SOGo.framework/ -lSOGo -lgnustep-base -lobjc -lNGObjWeb \ + -L../SoObjects/SOGo/SOGo.framework/sogo/ -lSOGo -lgnustep-base -lobjc -lNGObjWeb \ $(LIBMAPI_LIBS) \ $(LIBMAPISTORE_LIBS) $(SOGOBACKEND)_LIB_DIRS += \ - -L../SoObjects/SOGo/SOGo.framework/ -lSOGo \ + -L../SoObjects/SOGo/SOGo.framework/sogo/ -lSOGo \ $(LIBMAPI_LIBS) \ $(LIBMAPISTORE_LIBS) @@ -178,6 +179,8 @@ ADDITIONAL_INCLUDE_DIRS += \ -DBACKEND_BUNDLE_NAME="@\"$(BUNDLE_NAME)$(BUNDLE_EXTENSION)\"" \ -DSOGO_BUNDLES_DIR="@\"$(BUNDLE_INSTALL_DIR)\"" +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo + -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make include $(GNUSTEP_MAKEFILES)/library.make diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 5445f989c..24c6e1ad3 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -1218,7 +1218,9 @@ static NSCharacterSet *hexCharacterSet = nil; inMemCtx: (TALLOC_CTX *) memCtx { int rc; + NSRange range; NSString *stringValue; + NSString *trimingString = @"\r\n\n"; /* FIXME: there is a confusion in NGCards around "comment" and "description" */ stringValue = [event comment]; @@ -1226,6 +1228,14 @@ static NSCharacterSet *hexCharacterSet = nil; && ![stringValue isEqualToString: @"\r\n"] && ![stringValue isEqualToString: @"\n"]) { + /* Avoiding those trail weird characters at event description */ + range = [stringValue rangeOfString: trimingString + options: NSBackwardsSearch]; + if (range.location > 0) + { + stringValue = [stringValue substringToIndex: (NSMaxRange(range) -1)]; + } + rc = MAPISTORE_SUCCESS; *data = [stringValue asUnicodeInMemCtx: memCtx]; } diff --git a/OpenChange/MAPIStoreContext.h b/OpenChange/MAPIStoreContext.h index 9987b8d2f..533d7f278 100644 --- a/OpenChange/MAPIStoreContext.h +++ b/OpenChange/MAPIStoreContext.h @@ -61,10 +61,10 @@ } + (struct mapistore_contexts_list *) listAllContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx; + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx; + (enum mapistore_error) createRootFolder: (NSString **) mapistoreUriP withFID: (uint64_t ) fid @@ -75,11 +75,11 @@ + (int) openContext: (MAPIStoreContext **) contextPtr withURI: (const char *) newUri connectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; - (id) initFromURL: (NSURL *) newUri withConnectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; - (NSURL *) url; - (struct mapistore_connection_info *) connectionInfo; diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 4f1e67819..5b73173d8 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -100,7 +100,7 @@ static NSMutableDictionary *contextClassMapping; } + (struct mapistore_contexts_list *) listAllContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *list, *current; @@ -112,7 +112,7 @@ static NSMutableDictionary *contextClassMapping; list = NULL; userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; [userContext activateWithUser: [userContext sogoUser]]; classes = GSObjCAllSubclassesOfClass (self); @@ -121,7 +121,7 @@ static NSMutableDictionary *contextClassMapping; { currentClass = [classes objectAtIndex: count]; current = [currentClass listContextsForUser: userName - withTDBIndexing: indexingTdb + withIndexing: indexing inMemCtx: memCtx]; if (current) DLIST_CONCATENATE(list, current, void); @@ -131,7 +131,7 @@ static NSMutableDictionary *contextClassMapping; } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { return NULL; @@ -216,7 +216,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) + (int) openContext: (MAPIStoreContext **) contextPtr withURI: (const char *) newUri connectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct tdb_wrap *) indexingTdb + andTDBIndexing: (struct indexing_context *) indexing { MAPIStoreContext *context; Class contextClass; @@ -239,7 +239,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { context = [[contextClass alloc] initFromURL: baseURL withConnectionInfo: newConnInfo - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; if (context) { [context autorelease]; @@ -272,7 +272,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) - (id) initFromURL: (NSURL *) newUrl withConnectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct tdb_wrap *) indexingTdb + andTDBIndexing: (struct indexing_context *) indexing { NSString *username; @@ -291,7 +291,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) ASSIGN (userContext, [MAPIStoreUserContext userContextWithUsername: username - andTDBIndexing: indexingTdb]); + andTDBIndexing: indexing]); #if 0 mapistore_mgmt_backend_register_user (newConnInfo, @@ -374,17 +374,14 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { if ([objectURL hasPrefix: url]) { - *path = [[objectURL substringFromIndex: 7] - asUnicodeInMemCtx: memCtx]; - [self logWithFormat: @"found path '%s' for fmid %.16x", - *path, fmid]; + *path = [[objectURL substringFromIndex: 7] asUnicodeInMemCtx: memCtx]; + [self logWithFormat: @"found path '%s' for fmid 0x%.16"PRIx64"", *path, fmid]; rc = MAPISTORE_SUCCESS; } else { - [self logWithFormat: @"context (%@, %@) does not contain" - @" found fmid: 0x%.16x", - objectURL, url, fmid]; + [self logWithFormat: @"context (%@, %@) does not contain " + @"found fmid: 0x%.16"PRIx64"", objectURL, url, fmid]; *path = NULL; rc = MAPISTORE_SUCCESS; } @@ -534,7 +531,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { //[self warnWithFormat: @"no id exist yet for '%@', requesting one...", // childURL]; - openchangedb_get_new_folderID (connInfo->oc_ctx, &mappingId); + mapistore_indexing_get_new_folderID (connInfo->mstore_ctx, &mappingId); [mapping registerURL: childURL withID: mappingId]; contextId = 0; @@ -597,9 +594,9 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) memCtx = talloc_zero(NULL, TALLOC_CTX); newFMIDs = [NSMutableArray arrayWithCapacity: max]; - if (openchangedb_get_new_folderIDs (connInfo->oc_ctx, - memCtx, max, &numbers) - != MAPI_E_SUCCESS || numbers->cValues != max) + if (mapistore_indexing_get_new_folderIDs (connInfo->mstore_ctx, + memCtx, max, &numbers) + != MAPISTORE_SUCCESS || numbers->cValues != max) abort (); for (count = 0; count < max; count++) { diff --git a/OpenChange/MAPIStoreFallbackContext.m b/OpenChange/MAPIStoreFallbackContext.m index 1c9a0106b..41463542a 100644 --- a/OpenChange/MAPIStoreFallbackContext.m +++ b/OpenChange/MAPIStoreFallbackContext.m @@ -45,7 +45,7 @@ } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; @@ -72,7 +72,7 @@ inContainer: nil]; [root setOwner: userName]; userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; [userContext ensureFolderTableExists]; [root setTableUrl: [userContext folderTableURL]]; names = [root toManyRelationshipKeys]; diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 3dba819b8..a0455efb6 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -433,10 +433,16 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) deleteFolder +- (void) deleteFolderImpl { + // TODO: raise exception in case underlying delete fails? // [propsMessage delete]; [dbFolder delete]; +} + +- (int) deleteFolder +{ + [self deleteFolderImpl]; [self cleanupCaches]; @@ -890,7 +896,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe { fmid = [mapping idFromURL: [self url]]; [mapping unregisterURLWithID: fmid]; - [self deleteFolder]; + [self deleteFolderImpl]; [mapping registerURL: [newFolder url] withID: fmid]; } diff --git a/OpenChange/MAPIStoreGCSBaseContext.m b/OpenChange/MAPIStoreGCSBaseContext.m index cc09a41fe..216eab01c 100644 --- a/OpenChange/MAPIStoreGCSBaseContext.m +++ b/OpenChange/MAPIStoreGCSBaseContext.m @@ -64,7 +64,7 @@ } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; @@ -79,7 +79,7 @@ if (moduleName) { userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; parentFolder = [[userContext rootFolders] objectForKey: moduleName]; baseUrl = [NSString stringWithFormat: @"sogo://%@@%@/", userName, moduleName]; diff --git a/OpenChange/MAPIStoreMailContext.m b/OpenChange/MAPIStoreMailContext.m index 79ea0b62e..24d974e5a 100644 --- a/OpenChange/MAPIStoreMailContext.m +++ b/OpenChange/MAPIStoreMailContext.m @@ -83,7 +83,7 @@ MakeDisplayFolderName (NSString *folderName) } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; @@ -100,7 +100,7 @@ MakeDisplayFolderName (NSString *folderName) WOContext *woContext; userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; accountFolder = [[userContext rootFolders] objectForKey: @"mail"]; woContext = [userContext woContext]; @@ -245,7 +245,7 @@ MakeDisplayFolderName (NSString *folderName) } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *context; @@ -256,7 +256,7 @@ MakeDisplayFolderName (NSString *folderName) WOContext *woContext; userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; accountFolder = [[userContext rootFolders] objectForKey: @"mail"]; woContext = [userContext woContext]; diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index c640ab7db..7df01fdf1 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -367,7 +367,7 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; msgData->recipients_count = max; msgData->recipients = talloc_array (msgData, struct mapistore_message_recipient, max); current = 0; - for (type = 0; type < 4; type++) + for (type = MAPI_ORIG; type <= MAPI_BCC; type++) { recipients = [allRecipients objectForKey: recTypes[type]]; recipientsMax = [recipients count]; @@ -541,7 +541,7 @@ FillMessageHeadersFromProperties (NGMutableHashMap *headers, NSArray *list; NSCalendarDate *date; NSDictionary *recipients; - NSUInteger type, bccLimit; + enum ulRecipClass type, bccLimit; SOGoUser *activeUser; NSNumber *priority; @@ -561,8 +561,8 @@ FillMessageHeadersFromProperties (NGMutableHashMap *headers, bccLimit = MAPI_BCC; else bccLimit = MAPI_CC; - bccLimit++; - for (type = MAPI_TO; type < bccLimit; type++) + + for (type = MAPI_TO; type <= bccLimit; type++) { recId = recTypes[type]; list = MakeRecipientsList ([recipients objectForKey: recId]); @@ -865,7 +865,7 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS NSMutableArray *recipientEmails; NSArray *list; NSString *recId, *from, *msgClass; - NSUInteger count; + enum ulRecipClass type; SOGoUser *activeUser; SOGoDomainDefaults *dd; NSException *error; @@ -881,9 +881,9 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS recipientEmails = [NSMutableArray arrayWithCapacity: 32]; recipients = [properties objectForKey: @"recipients"]; - for (count = 0; count < 3; count++) + for (type = MAPI_ORIG; type <= MAPI_BCC; type++) { - recId = recTypes[count]; + recId = recTypes[type]; list = [recipients objectForKey: recId]; [recipientEmails addObjectsFromArray: [list objectsForKey: @"email" diff --git a/OpenChange/MAPIStoreMapping.h b/OpenChange/MAPIStoreMapping.h index c974c7496..620112d76 100644 --- a/OpenChange/MAPIStoreMapping.h +++ b/OpenChange/MAPIStoreMapping.h @@ -32,17 +32,15 @@ { void *memCtx; NSString *username; - struct tdb_wrap *indexing; - NSMutableDictionary *mapping; /* FID/MID -> url */ - NSMutableDictionary *reverseMapping; /* url -> FID/MID */ + struct indexing_context *indexing; NSUInteger useCount; } + (id) mappingForUsername: (NSString *) username - withIndexing: (struct tdb_wrap *) indexing; + withIndexing: (struct indexing_context *) indexing; - (id) initForUsername: (NSString *) username - withIndexing: (struct tdb_wrap *) indexing; + withIndexing: (struct indexing_context *) indexing; - (void) increaseUseCount; diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index ffc035aea..194488bc7 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -33,16 +33,15 @@ #import +#undef DEBUG +#include +#include + #import "MAPIStoreTypes.h" #import "MAPIStoreMapping.h" #include -#include - -struct tdb_wrap { - struct tdb_context *tdb; -}; static NSMutableDictionary *mappingRegistry = nil; @@ -59,51 +58,9 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) return [NSString stringWithUnsignedLongLong: idNbr]; } -static int -MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, - void *data) -{ - NSMutableDictionary *mapping; - id idKey; - NSString *uri; - char *idStr, *uriStr; - uint64_t idNbr; - - // get the key - // key examples : key(18) = "0x6900000000000001" - // key(31) = "SOFT_DELETED:0xb100020000000001" - // - idStr = (char *) data1.dptr; - idKey = nil; - - if (strncmp(idStr, "SOFT_DELETED:", 13) != 0) - { - // It's very important here to use strtoull and NOT strtoll as - // the latter will overflow a long long with typical key values. - idNbr = strtoull(idStr, NULL, 0); - // idKey = [NSNumber numberWithUnsignedLongLong: idNbr]; - idKey = MAPIStoreMappingKeyFromId(idNbr); - } - - // get the value and null-terminate it - uriStr = (char *)malloc(sizeof(char *) * data2.dsize+1); - memset(uriStr, 0, data2.dsize+1); - memcpy(uriStr, (const char *) data2.dptr, data2.dsize); - uri = [NSString stringWithUTF8String: uriStr]; - free (uriStr); - - mapping = data; - - if (uri && idKey) - { - [mapping setObject: uri forKey: idKey]; - } - - return 0; -} + (id) mappingForUsername: (NSString *) username - withIndexing: (struct tdb_wrap *) indexing + withIndexing: (struct indexing_context *) indexing { id mapping; @@ -123,8 +80,6 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, if ((self = [super init])) { memCtx = talloc_zero (NULL, TALLOC_CTX); - mapping = [NSMutableDictionary new]; - reverseMapping = [NSMutableDictionary new]; indexing = NULL; useCount = 0; } @@ -153,29 +108,12 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, } - (id) initForUsername: (NSString *) newUsername - withIndexing: (struct tdb_wrap *) newIndexing + withIndexing: (struct indexing_context *) newIndexing { - NSString *idNbr, *uri; - NSArray *keys; - NSUInteger count, max; - if ((self = [self init])) { ASSIGN (username, newUsername); indexing = newIndexing; - (void) talloc_reference (memCtx, newIndexing); - tdb_traverse_read (indexing->tdb, MAPIStoreMappingTDBTraverse, mapping); - keys = [mapping allKeys]; - max = [keys count]; - for (count = 0; count < max; count++) - { - idNbr = [keys objectAtIndex: count]; - uri = [mapping objectForKey: idNbr]; - //[self logWithFormat: @"preregistered id '%@' for url '%@'", idNbr, uri]; - [reverseMapping setObject: idNbr forKey: uri]; - } - - //[self logWithFormat: @"Complete mapping: %@ \nComplete reverse mapping: %@", mapping, reverseMapping]; } return self; @@ -184,83 +122,72 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, - (void) dealloc { [username release]; - [mapping release]; - [reverseMapping release]; talloc_free (memCtx); [super dealloc]; } - (NSString *) urlFromID: (uint64_t) idNbr { - return [mapping objectForKey: MAPIStoreMappingKeyFromId (idNbr)]; + char* url = NULL; + enum mapistore_error ret; + bool soft_delete = false; + + ret = indexing->get_uri(indexing, [username UTF8String], + memCtx, idNbr, &url, &soft_delete); + if (ret != MAPISTORE_SUCCESS) + return NULL; + NSString *res = [[[NSString alloc] initWithUTF8String:url] autorelease]; + talloc_free(url); + + return res; } - (uint64_t) idFromURL: (NSString *) url { - id key; + enum mapistore_error ret; uint64_t idNbr; + bool softDeleted; - key = [reverseMapping objectForKey: url]; - if (key) - idNbr = [key unsignedLongLongValue]; + ret = indexing->get_fmid(indexing, [username UTF8String], [url UTF8String], + false, &idNbr, &softDeleted); + + if (ret == MAPISTORE_SUCCESS && !softDeleted) + return idNbr; else - idNbr = NSNotFound; - - return idNbr; + return NSNotFound; } - (void) _updateFolderWithURL: (NSString *) oldURL withURL: (NSString *) urlString { - NSArray *allKeys; - NSUInteger count, max; - NSString *currentKey, *newKey; - id idKey; - TDB_DATA key, dbuf; + const char *searchURL; + uint64_t idNbr; + bool softDeleted; + NSString *current; + NSString *newURL; - [oldURL retain]; + if ([oldURL isEqualToString: urlString]) return; - allKeys = [reverseMapping allKeys]; - max = [allKeys count]; - for (count = 0; count < max; count++) - { - currentKey = [allKeys objectAtIndex: count]; - if ([currentKey hasPrefix: oldURL]) - { - newKey = [currentKey stringByReplacingPrefix: oldURL - withPrefix: urlString]; + searchURL = [[oldURL stringByAppendingString:@"*"] UTF8String]; - idKey = [reverseMapping objectForKey: currentKey]; - [mapping setObject: newKey forKey: idKey]; - [reverseMapping setObject: idKey forKey: newKey]; - [reverseMapping removeObjectForKey: currentKey]; + while (indexing->get_fmid(indexing, [username UTF8String], + searchURL,true, &idNbr, &softDeleted) == MAPISTORE_SUCCESS) + { + // Ignore deleted + if (softDeleted) continue; - /* update the record in the indexing database */ - key.dptr = (unsigned char *) talloc_asprintf (NULL, "0x%.16"PRIx64, - (uint64_t) [idKey unsignedLongLongValue]); - key.dsize = strlen ((const char *) key.dptr); - - dbuf.dptr = (unsigned char *) talloc_strdup (NULL, - [newKey UTF8String]); - dbuf.dsize = strlen ((const char *) dbuf.dptr); - tdb_store (indexing->tdb, key, dbuf, TDB_MODIFY); - talloc_free (key.dptr); - talloc_free (dbuf.dptr); - } - } - - [oldURL release]; + current = [self urlFromID:idNbr]; + newURL = [current stringByReplacingPrefix: oldURL withPrefix: urlString]; + indexing->update_fmid(indexing, [username UTF8String], idNbr, [newURL UTF8String]); + } } - (void) updateID: (uint64_t) idNbr withURL: (NSString *) urlString { NSString *oldURL; - id idKey; - TDB_DATA key, dbuf; - idKey = MAPIStoreMappingKeyFromId (idNbr); - oldURL = [mapping objectForKey: idKey]; + oldURL = [self urlFromID: idNbr]; if (oldURL) { if ([oldURL hasSuffix: @"/"]) /* is container ? */ @@ -268,28 +195,16 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, if (![urlString hasSuffix: @"/"]) [NSException raise: NSInvalidArgumentException format: @"a container url must have an ending '/'"]; - tdb_transaction_start (indexing->tdb); [self _updateFolderWithURL: oldURL withURL: urlString]; - tdb_transaction_commit (indexing->tdb); } else { if ([urlString hasSuffix: @"/"]) [NSException raise: NSInvalidArgumentException format: @"a leaf url must not have an ending '/'"]; - [mapping setObject: urlString forKey: idKey]; - [reverseMapping setObject: idKey forKey: urlString]; - [reverseMapping removeObjectForKey: oldURL]; - /* update the record in the indexing database */ - key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); - key.dsize = strlen((const char *) key.dptr); - - dbuf.dptr = (unsigned char *) talloc_strdup (NULL, [urlString UTF8String]); - dbuf.dsize = strlen((const char *) dbuf.dptr); - tdb_store (indexing->tdb, key, dbuf, TDB_MODIFY); - talloc_free (key.dptr); - talloc_free (dbuf.dptr); + indexing->update_fmid(indexing, [username UTF8String], + idNbr, [urlString UTF8String]); } } } @@ -297,37 +212,37 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, - (BOOL) registerURL: (NSString *) urlString withID: (uint64_t) idNbr { - id idKey; - BOOL rc; - TDB_DATA key, dbuf; + NSString *oldURL; + uint64_t oldIdNbr; + bool rc; - idKey = MAPIStoreMappingKeyFromId (idNbr); - if ([mapping objectForKey: idKey] - || [reverseMapping objectForKey: urlString]) + oldURL = [self urlFromID: idNbr]; + if (oldURL != NULL) { [self errorWithFormat: - @"attempt to double register an entry ('%@', %lld," - @" 0x%.16"PRIx64")", - urlString, idNbr, idNbr]; - rc = NO; + @"url with idNbr already registered: (oldUrl='%@', newUrl='%@', id=x%.16"PRIx64")", + oldURL, urlString, idNbr]; + return NO; + } + + oldIdNbr = [self idFromURL: urlString]; + if (oldIdNbr != NSNotFound) + { + [self errorWithFormat: + @"attempt to double register an entry with idNbr ('%@', %lld," + @" 0x%.16"PRIx64", oldid=0x%.16"PRIx64")", + urlString, idNbr, idNbr, oldIdNbr]; + return NO; } else { - [mapping setObject: urlString forKey: idKey]; - [reverseMapping setObject: idKey forKey: urlString]; rc = YES; // [self logWithFormat: @"registered url '%@' with id %lld (0x%.16"PRIx64")", // urlString, idNbr, idNbr]; /* Add the record given its fid and mapistore_uri */ - key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); - key.dsize = strlen((const char *) key.dptr); - - dbuf.dptr = (unsigned char *) talloc_strdup(NULL, [urlString UTF8String]); - dbuf.dsize = strlen((const char *) dbuf.dptr); - tdb_store (indexing->tdb, key, dbuf, TDB_INSERT); - talloc_free (key.dptr); - talloc_free (dbuf.dptr); + indexing->add_fmid(indexing, [username UTF8String], + idNbr, [urlString UTF8String]); } return rc; @@ -341,7 +256,6 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, max = [urlStrings count]; if (max == [idNbrs count]) { - tdb_transaction_start (indexing->tdb); for (count = 0; count < max; count++) { newID = [[idNbrs objectAtIndex: count] @@ -349,7 +263,6 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, [self registerURL: [urlStrings objectAtIndex: count] withID: newID]; } - tdb_transaction_commit (indexing->tdb); } else [NSException raise: NSInvalidArgumentException @@ -358,26 +271,8 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, - (void) unregisterURLWithID: (uint64_t) idNbr { - NSString *urlString; - id idKey; - TDB_DATA key; - - idKey = MAPIStoreMappingKeyFromId (idNbr); - urlString = [mapping objectForKey: idKey]; - if (urlString) - { - // [self logWithFormat: @"unregistering url '%@' with id %lld (0x%.16"PRIx64")", - // urlString, idNbr, idNbr]; - [reverseMapping removeObjectForKey: urlString]; - [mapping removeObjectForKey: idKey]; - - /* We hard-delete the entry from the indexing database */ - key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); - key.dsize = strlen((const char *) key.dptr); - - tdb_delete(indexing->tdb, key); - talloc_free(key.dptr); - } + indexing->del_fmid(indexing, [username UTF8String], + idNbr, MAPISTORE_PERMANENT_DELETE); } @end diff --git a/OpenChange/MAPIStoreNotesContext.m b/OpenChange/MAPIStoreNotesContext.m index 36d6804b9..594a819b5 100644 --- a/OpenChange/MAPIStoreNotesContext.m +++ b/OpenChange/MAPIStoreNotesContext.m @@ -38,7 +38,7 @@ } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *context; diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 720635975..923541764 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -49,9 +49,32 @@ #include #include +#include static Class MAPIStoreContextK = Nil; static BOOL leakDebugging = NO; +static BOOL initialization_done = NO; + +#define NS_CURRENT_THREAD_REGISTER() \ + BOOL __nsrct_thread_registered = GSRegisterCurrentThread(); \ + if (!initialization_done) { \ + DEBUG(5, ("[SOGo: %s:%d] You should call sogo_backend_init() first. Current thread: %p, pid: %d\n", \ + __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); \ + } +#define NS_CURRENT_THREAD_TRY_UNREGISTER() \ + if (__nsrct_thread_registered) { \ + GSUnregisterCurrentThread(); \ + } + +#define TRYCATCH_START @try { +#define TRYCATCH_END(pool) \ + } @catch (NSException * e) { \ + enum mapistore_error ret = sogo_backend_handle_objc_exception(e, __PRETTY_FUNCTION__, __LINE__); \ + [pool release]; \ + NS_CURRENT_THREAD_TRY_UNREGISTER(); \ + return ret; \ + } + static enum mapistore_error sogo_backend_unexpected_error() @@ -61,6 +84,35 @@ sogo_backend_unexpected_error() return MAPISTORE_SUCCESS; } +static enum mapistore_error +sogo_backend_handle_objc_exception(NSException *e, const char *fn_name, const int line_no) +{ + NSString *callStackSymbols = nil; + if ([e respondsToSelector:@selector(callStackSymbols)]) + { + callStackSymbols = [[e callStackSymbols] componentsJoinedByString:@"\n\t"]; + } + NSLog(@"[SOGo: %s:%d] - EXCEPTION: %@, reason: %@, backtrace: \n\t%@\n", + fn_name, line_no, [e name], [e reason], callStackSymbols); + + // Another point of view on the stack trace + { + void *frames[128]; + int i, len = backtrace(frames, 128); + char **symbols = backtrace_symbols(frames, len); + NSLog(@"Backtrace using execinfo.h:\n"); + for (i = 0; i < len; ++i) + NSLog(@"\t%s", symbols[i]); + free(symbols); + } + + if ([[e name] isEqual:@"NotImplementedException"]) + { + return MAPISTORE_ERR_NOT_IMPLEMENTED; + } + return MAPISTORE_ERROR; +} + static void sogo_backend_atexit (void) { @@ -73,6 +125,7 @@ sogo_backend_atexit (void) GSUnregisterCurrentThread (); } + /** \details Initialize sogo mapistore backend @@ -88,7 +141,13 @@ sogo_backend_init (void) SoProductRegistry *registry; char *argv[] = { SAMBA_PREFIX "/sbin/samba", NULL }; - GSRegisterCurrentThread (); + GSRegisterCurrentThread(); + + if (initialization_done) { + DEBUG(0, ("SOGo backend already initialized.\n")); + return MAPISTORE_SUCCESS; + } + pool = [NSAutoreleasePool new]; /* Here we work around a bug in GNUstep which decodes XML user @@ -130,6 +189,9 @@ sogo_backend_init (void) [pool release]; + DEBUG(0, ("[SOGo: %s:%d] backend init SUCCESS. Current thread: %p, pid: %d\n", __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); + initialization_done = YES; + return MAPISTORE_SUCCESS; } @@ -144,7 +206,7 @@ sogo_backend_init (void) static enum mapistore_error sogo_backend_create_context(TALLOC_CTX *mem_ctx, struct mapistore_connection_info *conn_info, - struct tdb_wrap *indexingTdb, + struct indexing_context *indexing, const char *uri, void **context_object) { NSAutoreleasePool *pool; @@ -153,23 +215,25 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) { + TRYCATCH_START rc = [MAPIStoreContextK openContext: &context withURI: uri connectionInfo: conn_info - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; if (rc == MAPISTORE_SUCCESS) *context_object = [context tallocWrapper: mem_ctx]; + TRYCATCH_END(pool) } else rc = MAPISTORE_ERROR; [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); return rc; } @@ -178,7 +242,7 @@ static enum mapistore_error sogo_backend_create_root_folder (const char *username, enum mapistore_context_role role, uint64_t fid, const char *name, - // struct tdb_wrap *indexingTdb, + // struct indexing_context *indexing, TALLOC_CTX *mem_ctx, char **mapistore_urip) { NSAutoreleasePool *pool; @@ -188,11 +252,12 @@ sogo_backend_create_root_folder (const char *username, DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) { + TRYCATCH_START userName = [NSString stringWithUTF8String: username]; folderName = [NSString stringWithUTF8String: name]; rc = [MAPIStoreContextK createRootFolder: &mapistoreUri @@ -202,18 +267,19 @@ sogo_backend_create_root_folder (const char *username, withRole: role]; if (rc == MAPISTORE_SUCCESS) *mapistore_urip = [mapistoreUri asUnicodeInMemCtx: mem_ctx]; + TRYCATCH_END(pool) } else rc = MAPISTORE_ERROR; [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); return rc; } static enum mapistore_error -sogo_backend_list_contexts(const char *username, struct tdb_wrap *indexingTdb, +sogo_backend_list_contexts(const char *username, struct indexing_context *indexing, TALLOC_CTX *mem_ctx, struct mapistore_contexts_list **contexts_listp) { @@ -223,22 +289,24 @@ sogo_backend_list_contexts(const char *username, struct tdb_wrap *indexingTdb, DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) { + TRYCATCH_START userName = [NSString stringWithUTF8String: username]; *contexts_listp = [MAPIStoreContextK listAllContextsForUser: userName - withTDBIndexing: indexingTdb + withIndexing: indexing inMemCtx: mem_ctx]; rc = MAPISTORE_SUCCESS; + TRYCATCH_END(pool) } else rc = MAPISTORE_ERROR; [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); return rc; } @@ -273,11 +341,15 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, { wrapper = backend_object; context = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [context getPath: path ofFMID: fmid inMemCtx: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -303,13 +375,17 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, { wrapper = backend_object; context = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [context getRootFolder: &folder withFID: fid]; if (rc == MAPISTORE_SUCCESS) *folder_object = [folder tallocWrapper: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -342,14 +418,18 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder openFolder: &childFolder withFID: fid]; if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -382,13 +462,17 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder createFolder: &childFolder withRow: aRow andFID: fid]; if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -421,11 +505,15 @@ sogo_folder_delete(void *folder_object) { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder deleteFolder]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -449,11 +537,15 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder getChildCount: child_count ofTableType: table_type]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -481,16 +573,20 @@ sogo_folder_open_message(void *folder_object, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder openMessage: &message withMID: mid forWriting: write_access inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -519,15 +615,19 @@ sogo_folder_create_message(void *folder_object, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder createMessage: &message withMID: mid isAssociated: associated]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -551,11 +651,15 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder deleteMessageWithMID: mid andFlags: flags]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -589,8 +693,10 @@ sogo_folder_move_copy_messages(void *folder_object, wrapper = source_folder_object; sourceFolder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [targetFolder moveCopyMessagesWithMIDs: src_mids andCount: mid_count fromFolder: sourceFolder @@ -598,8 +704,10 @@ sogo_folder_move_copy_messages(void *folder_object, andChangeKeys: target_change_keys wantCopy: want_copy inMemCtx: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -632,7 +740,7 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object, else targetFolder = nil; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; if (new_folder_name) @@ -640,14 +748,16 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object, else newFolderName = nil; + TRYCATCH_START rc = [moveFolder moveCopyToFolder: targetFolder withNewName: newFolderName isMove: YES isRecursive: YES inMemCtx: mem_ctx]; + TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -677,19 +787,21 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_ wrapper = target_folder_object; targetFolder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; newFolderName = [NSString stringWithUTF8String: new_folder_name]; + TRYCATCH_START rc = [copyFolder moveCopyToFolder: targetFolder withNewName: newFolderName isMove: NO isRecursive: recursive inMemCtx: mem_ctx]; - + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -715,15 +827,19 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder getDeletedFMIDs: fmidsp andCN: cnp fromChangeNumber: change_num inTableType: table_type inMemCtx: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -750,16 +866,20 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder getTable: &table andRowCount: row_count tableType: table_type andHandleId: handle_id]; if (rc == MAPISTORE_SUCCESS) *table_object = [table tallocWrapper: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -785,13 +905,17 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder modifyPermissions: permissions withCount: pcount andFlags: flags]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -815,12 +939,16 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder preloadMessageBodiesWithMIDs: mids ofTableType: table_type]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -846,12 +974,16 @@ sogo_message_get_message_data(void *message_object, { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START [message getMessageData: msg_dataP inMemCtx: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); rc = MAPISTORE_SUCCESS; } else @@ -877,14 +1009,18 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message createAttachment: &attachment inAID: aidp]; if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -910,14 +1046,18 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message getAttachment: &attachment withAID: aid]; if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -942,15 +1082,19 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message getAttachmentTable: &table andRowCount: row_count]; if (rc == MAPISTORE_SUCCESS) *table_object = [table tallocWrapper: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -977,14 +1121,18 @@ sogo_message_modify_recipients (void *message_object, { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message modifyRecipientsWithRecipients: recipients andCount: count andColumns: columns]; // [context tearDownRequest]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1008,12 +1156,16 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag) { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message setReadFlag: flag]; // [context tearDownRequest]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1037,12 +1189,16 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message saveMessage: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1066,12 +1222,16 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message submitWithFlags: flags]; // [context tearDownRequest]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1100,16 +1260,20 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, { wrapper = attachment_object; attachment = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [attachment openEmbeddedMessage: &message withMID: midP withMAPIStoreMsg: msg inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1137,15 +1301,19 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, { wrapper = attachment_object; attachment = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; - rc = [attachment createEmbeddedMessage: &message - withMAPIStoreMsg: msg - inMemCtx: mem_ctx]; - if (rc == MAPISTORE_SUCCESS) - *message_object = [message tallocWrapper: mem_ctx]; + + TRYCATCH_START + rc = [attachment createEmbeddedMessage: &message + withMAPIStoreMsg: msg + inMemCtx: mem_ctx]; + if (rc == MAPISTORE_SUCCESS) + *message_object = [message tallocWrapper: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1169,11 +1337,15 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [table getAvailableProperties: propertiesP inMemCtx: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1197,12 +1369,16 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [table setColumns: properties withCount: count]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1226,14 +1402,18 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START [table setRestrictions: restrictions]; //[table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1257,14 +1437,18 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START [table setSortOrder: sort_order]; [table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1290,12 +1474,16 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [table getRow: data withRowID: row_id andQueryType: query_type inMemCtx: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1321,12 +1509,16 @@ sogo_table_get_row_count (void *table_object, { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [table getRowCount: row_countp withQueryType: query_type]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1350,11 +1542,15 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id) { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START [table destroyHandle: handle_id]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); rc = MAPISTORE_SUCCESS; } else @@ -1380,11 +1576,15 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec { wrapper = object; propObject = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [propObject getAvailableProperties: propertiesP inMemCtx: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1411,13 +1611,17 @@ sogo_properties_get_properties (void *object, { wrapper = object; propObject = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [propObject getProperties: data withTags: properties andCount: count inMemCtx: mem_ctx]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1441,11 +1645,15 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) { wrapper = object; propObject = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [propObject addPropertiesFromRow: aRow]; + TRYCATCH_END(pool) + [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1472,9 +1680,10 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, /* This fixes a crash occurring during the instantiation of the NSAutoreleasePool below. */ - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; + TRYCATCH_START // printf("rootURI = %s\n", rootURI); if (rootURI) partialURLString = [NSString stringWithUTF8String: rootURI]; @@ -1494,9 +1703,10 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, // printf("uri = %s\n", [partialURLString UTF8String]); *uri = talloc_strdup (mem_ctx, [partialURLString UTF8String]); + TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); return MAPISTORE_SUCCESS; } diff --git a/OpenChange/MAPIStoreUserContext.h b/OpenChange/MAPIStoreUserContext.h index 237819655..f9867d15a 100644 --- a/OpenChange/MAPIStoreUserContext.h +++ b/OpenChange/MAPIStoreUserContext.h @@ -63,10 +63,10 @@ } + (id) userContextWithUsername: (NSString *) username - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; - (id) initWithUsername: (NSString *) newUsername - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; - (NSString *) username; - (SOGoUser *) sogoUser; diff --git a/OpenChange/MAPIStoreUserContext.m b/OpenChange/MAPIStoreUserContext.m index bad00b260..04300fd35 100644 --- a/OpenChange/MAPIStoreUserContext.m +++ b/OpenChange/MAPIStoreUserContext.m @@ -60,7 +60,7 @@ static NSMapTable *contextsTable = nil; } + (id) userContextWithUsername: (NSString *) username - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; { id userContext; @@ -68,7 +68,7 @@ static NSMapTable *contextsTable = nil; if (!userContext) { userContext = [[self alloc] initWithUsername: username - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; [userContext autorelease]; [contextsTable setObject: userContext forKey: username]; } @@ -100,16 +100,12 @@ static NSMapTable *contextsTable = nil; return self; } -- (NSString *) _readUserPassword: (NSString *) newUsername +- (NSString *) _readPasswordFile: (NSString *) path { - NSString *password, *path; + NSString *password; NSData *content; - - password = nil; - - path = [NSString stringWithFormat: SAMBA_PRIVATE_DIR - @"/mapistore/%@/password", newUsername]; + password = nil; content = [NSData dataWithContentsOfFile: path]; if (content) @@ -124,8 +120,26 @@ static NSMapTable *contextsTable = nil; return password; } +- (NSString *) _readUserPassword: (NSString *) newUsername +{ + NSString *password, *path; + + path = [NSString stringWithFormat: SAMBA_PRIVATE_DIR + @"/mapistore/%@/password", newUsername]; + + password = [self _readPasswordFile: path]; + if (password == nil) + { + // Try to get master password + path = [NSString stringWithFormat: SAMBA_PRIVATE_DIR @"/mapistore/master.password"]; + password = [self _readPasswordFile: path]; + } + + return password; +} + - (id) initWithUsername: (NSString *) newUsername - andTDBIndexing: (struct tdb_wrap *) indexingTdb + andTDBIndexing: (struct indexing_context *) indexing { NSString *userPassword; @@ -133,9 +147,9 @@ static NSMapTable *contextsTable = nil; { /* "username" will be retained by table */ username = newUsername; - if (indexingTdb) + if (indexing) ASSIGN (mapping, [MAPIStoreMapping mappingForUsername: username - withIndexing: indexingTdb]); + withIndexing: indexing]); authenticator = [MAPIStoreAuthenticator new]; [authenticator setUsername: username]; diff --git a/OpenChange/NSObject+MAPIStore.m b/OpenChange/NSObject+MAPIStore.m index e02f29f07..9ed02b7ab 100644 --- a/OpenChange/NSObject+MAPIStore.m +++ b/OpenChange/NSObject+MAPIStore.m @@ -47,13 +47,13 @@ MAPIStoreTallocWrapperDestroy (void *data) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; - GSRegisterCurrentThread (); +// GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; wrapper = data; //NSLog (@"destroying wrapped object (wrapper: %p; object: %p (%@))...\n", wrapper, wrapper->instance, NSStringFromClass([wrapper->instance class])); [wrapper->instance release]; [pool release]; - GSUnregisterCurrentThread (); +// GSUnregisterCurrentThread (); return 0; } diff --git a/OpenChange/NSObject+PropertyList.h b/OpenChange/NSObject+PropertyList.h new file mode 100644 index 000000000..34ea28ea8 --- /dev/null +++ b/OpenChange/NSObject+PropertyList.h @@ -0,0 +1,64 @@ +/* dbmsgdump.m - this file is part of SOGo + * + * Copyright (C) 2014 Kamen Mazdrashki + * + * Based on implementation done by Wolfgang Sourdeau + * + * 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 + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This file 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * A format-agnostic dump extensions for: + * NSArray + * NSObject + * NSDictionary + */ + +#ifndef NSOBJECT_PROPERTYLIST_H +#define NSOBJECT_PROPERTYLIST_H + +#import +#import +#import + + +@interface NSObject (plext) + +- (void) displayWithIndentation: (NSInteger) anInt; + +@end + + +@interface NSDictionary (plext) + +- (void) displayKey: (NSString *) key + withIndentation: (NSInteger) anInt; + +- (void) displayWithIndentation: (NSInteger) anInt; + +@end + + +@interface NSArray (plext) + +- (void) displayCount: (NSUInteger) count + withIndentation: (NSInteger) anInt; + +- (void) displayWithIndentation: (NSInteger) anInt; + +@end + +#endif /* NSOBJECT_PROPERTYLIST_H */ diff --git a/OpenChange/NSObject+PropertyList.m b/OpenChange/NSObject+PropertyList.m index 07a42d976..164ac5054 100644 --- a/OpenChange/NSObject+PropertyList.m +++ b/OpenChange/NSObject+PropertyList.m @@ -32,14 +32,10 @@ #import #import +#import "NSObject+PropertyList.h" const char *indentationStep = " "; -@interface NSObject (plext) - -- (void) displayWithIndentation: (NSInteger) anInt; - -@end @implementation NSObject (plext) @@ -139,46 +135,3 @@ const char *indentationStep = " "; @end -static void -OCDumpPListData (NSData *content) -{ - //NSDictionary *d; - //NSPropertyListFormat format; - //NSString *error = nil; - //const char *formatName; - - //d = [NSPropertyListSerialization propertyListFromData: content - // mutabilityOption: NSPropertyListImmutable - // format: &format - // errorDescription: &error]; - //d = [content BSONValue]; - - // if (d) - // { - // switch (format) - // { - // case NSPropertyListOpenStepFormat: - // formatName = "OpenStep"; - // break; - // case NSPropertyListXMLFormat_v1_0: - // formatName = "XML"; - // break; - // case NSPropertyListBinaryFormat_v1_0: - // formatName = "Binary"; - // break; - // case NSPropertyListGNUstepFormat: - // formatName = "GNUstep"; - // break; - // case NSPropertyListGNUstepBinaryFormat: - // formatName = "GNUstep binary"; - // break; - // default: formatName = "unknown"; - // } - - // printf ("File format is: %s\n", formatName); - // [d displayWithIndentation: 0]; - // printf ("\n"); - // } - // else - // printf ("an error occurred: %s\n", [error UTF8String]); -} diff --git a/OpenChange/dbmsgreader.m b/OpenChange/dbmsgreader.m index 97b3356d0..8e56655b8 100644 --- a/OpenChange/dbmsgreader.m +++ b/OpenChange/dbmsgreader.m @@ -36,10 +36,20 @@ #import "MAPIStoreUserContext.h" #import -#import "NSObject+PropertyList.m" +#import +#import "NSObject+PropertyList.h" Class MAPIStoreUserContextK, SOGoMAPIDBObjectK; +static void +DumpBSONData(NSData *data) +{ + NSDictionary *dvalue; + dvalue = [data BSONValue]; + [dvalue displayWithIndentation:0]; + printf("\n"); +} + static void DbDumpObject (NSString *username, NSString *path) { @@ -55,8 +65,9 @@ DbDumpObject (NSString *username, NSString *path) record = [dbobject lookupRecord: path newerThanVersion: -1]; if (record) { + printf("record found: %p\n", record); content = [[record objectForKey: @"c_content"] dataByDecodingBase64]; - OCDumpPListData (content); + DumpBSONData(content); } else NSLog (@"record not found"); @@ -99,9 +110,12 @@ int main (int argc, char *argv[], char *envp[]) SOGoMAPIDBObjectK = NSClassFromString (@"SOGoMAPIDBObject"); arguments = [[NSProcessInfo processInfo] arguments]; - if ([arguments count] > 2) + if ([arguments count] > 2) { DbDumpObject ([arguments objectAtIndex: 1], [arguments objectAtIndex: 2]); + } else if ([arguments count] > 1) { + DumpBSONData([[arguments objectAtIndex:1] dataByDecodingBase64]); + } [pool release]; diff --git a/OpenChange/iCalEvent+MAPIStore.m b/OpenChange/iCalEvent+MAPIStore.m index 4d64a7ac7..40eb0c0ef 100644 --- a/OpenChange/iCalEvent+MAPIStore.m +++ b/OpenChange/iCalEvent+MAPIStore.m @@ -228,6 +228,15 @@ [start setTimeZone: tz]; if (isAllDay) { + /* when user TZ is positive (East) all-day events were not + shown properly in SOGo UI. This day delay fixes it */ + tzOffset = [userTimeZone secondsFromGMTForDate: value]; + if (tzOffset > 0) + { + value = [value dateByAddingYears: 0 months: 0 days: 1 + hours: 0 minutes: 0 + seconds: 0]; + } [start setDate: value]; [start setTimeZone: nil]; } @@ -251,6 +260,15 @@ [end setTimeZone: tz]; if (isAllDay) { + /* when user TZ is positive (East) all-day events were not + shown properly in SOGo UI. This day delay fixes it */ + tzOffset = [userTimeZone secondsFromGMTForDate: value]; + if (tzOffset > 0) + { + value = [value dateByAddingYears: 0 months: 0 days: 1 + hours: 0 minutes: 0 + seconds: 0]; + } [end setDate: value]; [end setTimeZone: nil]; } diff --git a/OpenChange/plreader.m b/OpenChange/plreader.m index f6ee15672..69d0cd099 100644 --- a/OpenChange/plreader.m +++ b/OpenChange/plreader.m @@ -29,6 +29,50 @@ #import "NSObject+PropertyList.m" +static void +OCDumpPListData (NSData *content) +{ + //NSDictionary *d; + //NSPropertyListFormat format; + //NSString *error = nil; + //const char *formatName; + + //d = [NSPropertyListSerialization propertyListFromData: content + // mutabilityOption: NSPropertyListImmutable + // format: &format + // errorDescription: &error]; + //d = [content BSONValue]; + + // if (d) + // { + // switch (format) + // { + // case NSPropertyListOpenStepFormat: + // formatName = "OpenStep"; + // break; + // case NSPropertyListXMLFormat_v1_0: + // formatName = "XML"; + // break; + // case NSPropertyListBinaryFormat_v1_0: + // formatName = "Binary"; + // break; + // case NSPropertyListGNUstepFormat: + // formatName = "GNUstep"; + // break; + // case NSPropertyListGNUstepBinaryFormat: + // formatName = "GNUstep binary"; + // break; + // default: formatName = "unknown"; + // } + + // printf ("File format is: %s\n", formatName); + // [d displayWithIndentation: 0]; + // printf ("\n"); + // } + // else + // printf ("an error occurred: %s\n", [error UTF8String]); +} + static void PLReaderDumpPListFile (NSString *filename) { diff --git a/SOPE/GDLContentStore/GCSChannelManager.m b/SOPE/GDLContentStore/GCSChannelManager.m index 62a395e71..b21b230a6 100644 --- a/SOPE/GDLContentStore/GCSChannelManager.m +++ b/SOPE/GDLContentStore/GCSChannelManager.m @@ -276,7 +276,7 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; EOAdaptorChannel *channel; GCSChannelHandle *handle; NSCalendarDate *now, *lastFailure; - NSString *urlId; + NSString *urlId, *url; channel = nil; urlId = [_url gcsURLId]; @@ -304,10 +304,10 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; } else { + url = [NSString stringWithFormat: @"%@://%@%@", [_url scheme], [_url host], [_url path]]; if (debugPools) { - [self logWithFormat: @"DBPOOL: create new DB channel for URL: %@", - [_url absoluteString]]; + [self logWithFormat: @"DBPOOL: create new DB channel for %@", url]; } /* create channel */ @@ -330,15 +330,13 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; if (lastFailure) { - [self logWithFormat: @"db for %@ is now back up", - [_url absoluteString]]; + [self logWithFormat: @"db for %@ is now back up", url]; [lastFailures removeObjectForKey: urlId]; } } else { - [self errorWithFormat: @"could not open channel %@ for URL: %@", - channel, [_url absoluteString]]; + [self errorWithFormat: @"could not open channel %@ for %@", channel, url]; channel = nil; [lastFailures setObject: now forKey: urlId]; [self warnWithFormat: @" will prevent opening of this" diff --git a/SOPE/GDLContentStore/GNUmakefile b/SOPE/GDLContentStore/GNUmakefile index 84f24d0c0..b94b4057d 100644 --- a/SOPE/GDLContentStore/GNUmakefile +++ b/SOPE/GDLContentStore/GNUmakefile @@ -74,6 +74,7 @@ ifneq ($(frameworks),yes) ifneq ($(FHS_INSTALL_ROOT),) GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include endif +GNUSTEP_TARGET_LDIR=sogo include $(GNUSTEP_MAKEFILES)/library.make else include $(GNUSTEP_MAKEFILES)/framework.make diff --git a/SOPE/NGCards/GNUmakefile b/SOPE/NGCards/GNUmakefile index 90f75848a..31cfdd836 100644 --- a/SOPE/NGCards/GNUmakefile +++ b/SOPE/NGCards/GNUmakefile @@ -131,6 +131,7 @@ ifneq ($(frameworks),yes) ifneq ($(FHS_INSTALL_ROOT),) GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include endif +GNUSTEP_TARGET_LDIR=sogo include $(GNUSTEP_MAKEFILES)/library.make else include $(GNUSTEP_MAKEFILES)/framework.make diff --git a/SOPE/NGCards/TimeZones/Africa/Abidjan.ics b/SOPE/NGCards/TimeZones/Africa/Abidjan.ics index b4a41bae5..2d0886e72 100644 --- a/SOPE/NGCards/TimeZones/Africa/Abidjan.ics +++ b/SOPE/NGCards/TimeZones/Africa/Abidjan.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Abidjan diff --git a/SOPE/NGCards/TimeZones/Africa/Accra.ics b/SOPE/NGCards/TimeZones/Africa/Accra.ics index fbe1a81f4..089fb6353 100644 --- a/SOPE/NGCards/TimeZones/Africa/Accra.ics +++ b/SOPE/NGCards/TimeZones/Africa/Accra.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Accra diff --git a/SOPE/NGCards/TimeZones/Africa/Addis_Ababa.ics b/SOPE/NGCards/TimeZones/Africa/Addis_Ababa.ics index b9d52ae7d..66b60542d 100644 --- a/SOPE/NGCards/TimeZones/Africa/Addis_Ababa.ics +++ b/SOPE/NGCards/TimeZones/Africa/Addis_Ababa.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Addis_Ababa diff --git a/SOPE/NGCards/TimeZones/Africa/Algiers.ics b/SOPE/NGCards/TimeZones/Africa/Algiers.ics index e08496a8a..13b2d9e5b 100644 --- a/SOPE/NGCards/TimeZones/Africa/Algiers.ics +++ b/SOPE/NGCards/TimeZones/Africa/Algiers.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Algiers diff --git a/SOPE/NGCards/TimeZones/Africa/Asmara.ics b/SOPE/NGCards/TimeZones/Africa/Asmara.ics index 192c874df..a456a3b7d 100644 --- a/SOPE/NGCards/TimeZones/Africa/Asmara.ics +++ b/SOPE/NGCards/TimeZones/Africa/Asmara.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Asmara diff --git a/SOPE/NGCards/TimeZones/Africa/Bamako.ics b/SOPE/NGCards/TimeZones/Africa/Bamako.ics index eb06bf6b0..f8e989c75 100644 --- a/SOPE/NGCards/TimeZones/Africa/Bamako.ics +++ b/SOPE/NGCards/TimeZones/Africa/Bamako.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Bamako diff --git a/SOPE/NGCards/TimeZones/Africa/Bangui.ics b/SOPE/NGCards/TimeZones/Africa/Bangui.ics index dd2902b84..03e755b73 100644 --- a/SOPE/NGCards/TimeZones/Africa/Bangui.ics +++ b/SOPE/NGCards/TimeZones/Africa/Bangui.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Bangui diff --git a/SOPE/NGCards/TimeZones/Africa/Banjul.ics b/SOPE/NGCards/TimeZones/Africa/Banjul.ics index a41cc58f9..e9d579e60 100644 --- a/SOPE/NGCards/TimeZones/Africa/Banjul.ics +++ b/SOPE/NGCards/TimeZones/Africa/Banjul.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Banjul diff --git a/SOPE/NGCards/TimeZones/Africa/Bissau.ics b/SOPE/NGCards/TimeZones/Africa/Bissau.ics index 1e90a3eab..14fb6511f 100644 --- a/SOPE/NGCards/TimeZones/Africa/Bissau.ics +++ b/SOPE/NGCards/TimeZones/Africa/Bissau.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Bissau diff --git a/SOPE/NGCards/TimeZones/Africa/Blantyre.ics b/SOPE/NGCards/TimeZones/Africa/Blantyre.ics index 26f666278..98dc53b74 100644 --- a/SOPE/NGCards/TimeZones/Africa/Blantyre.ics +++ b/SOPE/NGCards/TimeZones/Africa/Blantyre.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Blantyre diff --git a/SOPE/NGCards/TimeZones/Africa/Brazzaville.ics b/SOPE/NGCards/TimeZones/Africa/Brazzaville.ics index 40bd02fd2..5dcffaf53 100644 --- a/SOPE/NGCards/TimeZones/Africa/Brazzaville.ics +++ b/SOPE/NGCards/TimeZones/Africa/Brazzaville.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Brazzaville diff --git a/SOPE/NGCards/TimeZones/Africa/Bujumbura.ics b/SOPE/NGCards/TimeZones/Africa/Bujumbura.ics index 0b8471e74..214abc48e 100644 --- a/SOPE/NGCards/TimeZones/Africa/Bujumbura.ics +++ b/SOPE/NGCards/TimeZones/Africa/Bujumbura.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Bujumbura diff --git a/SOPE/NGCards/TimeZones/Africa/Cairo.ics b/SOPE/NGCards/TimeZones/Africa/Cairo.ics index d7ada8472..cb946a0ac 100644 --- a/SOPE/NGCards/TimeZones/Africa/Cairo.ics +++ b/SOPE/NGCards/TimeZones/Africa/Cairo.ics @@ -1,14 +1,22 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Cairo X-LIC-LOCATION:Africa/Cairo BEGIN:STANDARD -TZOFFSETFROM:+0200 +TZOFFSETFROM:+0300 TZOFFSETTO:+0200 TZNAME:EET -DTSTART:19700101T000000 +DTSTART:19700924T235959 +RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1TH END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0300 +TZOFFSETTO:+0300 +TZNAME:EEST +DTSTART:19700424T010000 +RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1FR +END:DAYLIGHT END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Africa/Casablanca.ics b/SOPE/NGCards/TimeZones/Africa/Casablanca.ics index 37b853064..2424b03fd 100644 --- a/SOPE/NGCards/TimeZones/Africa/Casablanca.ics +++ b/SOPE/NGCards/TimeZones/Africa/Casablanca.ics @@ -1,22 +1,22 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Casablanca X-LIC-LOCATION:Africa/Casablanca -BEGIN:DAYLIGHT -TZOFFSETFROM:+0000 -TZOFFSETTO:+0100 -TZNAME:WEST -DTSTART:19700426T020000 -RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU -END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0100 TZOFFSETTO:+0000 TZNAME:WET -DTSTART:19700927T030000 -RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0100 +TZNAME:WEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +END:DAYLIGHT END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Africa/Ceuta.ics b/SOPE/NGCards/TimeZones/Africa/Ceuta.ics index 526241708..237024157 100644 --- a/SOPE/NGCards/TimeZones/Africa/Ceuta.ics +++ b/SOPE/NGCards/TimeZones/Africa/Ceuta.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Ceuta diff --git a/SOPE/NGCards/TimeZones/Africa/Conakry.ics b/SOPE/NGCards/TimeZones/Africa/Conakry.ics index 4ed6bc0c5..72a68faa2 100644 --- a/SOPE/NGCards/TimeZones/Africa/Conakry.ics +++ b/SOPE/NGCards/TimeZones/Africa/Conakry.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Conakry diff --git a/SOPE/NGCards/TimeZones/Africa/Dakar.ics b/SOPE/NGCards/TimeZones/Africa/Dakar.ics index 2485cf464..eb55e58ba 100644 --- a/SOPE/NGCards/TimeZones/Africa/Dakar.ics +++ b/SOPE/NGCards/TimeZones/Africa/Dakar.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Dakar diff --git a/SOPE/NGCards/TimeZones/Africa/Dar_es_Salaam.ics b/SOPE/NGCards/TimeZones/Africa/Dar_es_Salaam.ics index c45ed6520..154b826ba 100644 --- a/SOPE/NGCards/TimeZones/Africa/Dar_es_Salaam.ics +++ b/SOPE/NGCards/TimeZones/Africa/Dar_es_Salaam.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Dar_es_Salaam diff --git a/SOPE/NGCards/TimeZones/Africa/Djibouti.ics b/SOPE/NGCards/TimeZones/Africa/Djibouti.ics index 82cef5d55..7fefeb4b0 100644 --- a/SOPE/NGCards/TimeZones/Africa/Djibouti.ics +++ b/SOPE/NGCards/TimeZones/Africa/Djibouti.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Djibouti diff --git a/SOPE/NGCards/TimeZones/Africa/Douala.ics b/SOPE/NGCards/TimeZones/Africa/Douala.ics index 8a3a7b82e..249062f5f 100644 --- a/SOPE/NGCards/TimeZones/Africa/Douala.ics +++ b/SOPE/NGCards/TimeZones/Africa/Douala.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Douala diff --git a/SOPE/NGCards/TimeZones/Africa/El_Aaiun.ics b/SOPE/NGCards/TimeZones/Africa/El_Aaiun.ics index daa9fa21f..18bb12608 100644 --- a/SOPE/NGCards/TimeZones/Africa/El_Aaiun.ics +++ b/SOPE/NGCards/TimeZones/Africa/El_Aaiun.ics @@ -1,14 +1,22 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/El_Aaiun X-LIC-LOCATION:Africa/El_Aaiun BEGIN:STANDARD -TZOFFSETFROM:+0000 +TZOFFSETFROM:+0100 TZOFFSETTO:+0000 TZNAME:WET -DTSTART:19700101T000000 +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0100 +TZNAME:WEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +END:DAYLIGHT END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Africa/Freetown.ics b/SOPE/NGCards/TimeZones/Africa/Freetown.ics index 2b689ba56..c7daed840 100644 --- a/SOPE/NGCards/TimeZones/Africa/Freetown.ics +++ b/SOPE/NGCards/TimeZones/Africa/Freetown.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Freetown diff --git a/SOPE/NGCards/TimeZones/Africa/Gaborone.ics b/SOPE/NGCards/TimeZones/Africa/Gaborone.ics index 27a91098f..0f94ca8bd 100644 --- a/SOPE/NGCards/TimeZones/Africa/Gaborone.ics +++ b/SOPE/NGCards/TimeZones/Africa/Gaborone.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Gaborone diff --git a/SOPE/NGCards/TimeZones/Africa/Harare.ics b/SOPE/NGCards/TimeZones/Africa/Harare.ics index 7fe0c6302..543e49ad1 100644 --- a/SOPE/NGCards/TimeZones/Africa/Harare.ics +++ b/SOPE/NGCards/TimeZones/Africa/Harare.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Harare diff --git a/SOPE/NGCards/TimeZones/Africa/Johannesburg.ics b/SOPE/NGCards/TimeZones/Africa/Johannesburg.ics index 57f55cdc7..91edd0aab 100644 --- a/SOPE/NGCards/TimeZones/Africa/Johannesburg.ics +++ b/SOPE/NGCards/TimeZones/Africa/Johannesburg.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Johannesburg diff --git a/SOPE/NGCards/TimeZones/Africa/Juba.ics b/SOPE/NGCards/TimeZones/Africa/Juba.ics index 02563da06..99f7b0002 100644 --- a/SOPE/NGCards/TimeZones/Africa/Juba.ics +++ b/SOPE/NGCards/TimeZones/Africa/Juba.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Juba diff --git a/SOPE/NGCards/TimeZones/Africa/Kampala.ics b/SOPE/NGCards/TimeZones/Africa/Kampala.ics index b64e6654f..96ad293b3 100644 --- a/SOPE/NGCards/TimeZones/Africa/Kampala.ics +++ b/SOPE/NGCards/TimeZones/Africa/Kampala.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Kampala diff --git a/SOPE/NGCards/TimeZones/Africa/Khartoum.ics b/SOPE/NGCards/TimeZones/Africa/Khartoum.ics index 3754dfb68..75badb8b0 100644 --- a/SOPE/NGCards/TimeZones/Africa/Khartoum.ics +++ b/SOPE/NGCards/TimeZones/Africa/Khartoum.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Khartoum diff --git a/SOPE/NGCards/TimeZones/Africa/Kigali.ics b/SOPE/NGCards/TimeZones/Africa/Kigali.ics index 5a170e256..0226b6a12 100644 --- a/SOPE/NGCards/TimeZones/Africa/Kigali.ics +++ b/SOPE/NGCards/TimeZones/Africa/Kigali.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Kigali diff --git a/SOPE/NGCards/TimeZones/Africa/Kinshasa.ics b/SOPE/NGCards/TimeZones/Africa/Kinshasa.ics index 232d7dad0..99221a229 100644 --- a/SOPE/NGCards/TimeZones/Africa/Kinshasa.ics +++ b/SOPE/NGCards/TimeZones/Africa/Kinshasa.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Kinshasa diff --git a/SOPE/NGCards/TimeZones/Africa/Lagos.ics b/SOPE/NGCards/TimeZones/Africa/Lagos.ics index 19b6f1ea5..c2486ac7f 100644 --- a/SOPE/NGCards/TimeZones/Africa/Lagos.ics +++ b/SOPE/NGCards/TimeZones/Africa/Lagos.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Lagos diff --git a/SOPE/NGCards/TimeZones/Africa/Libreville.ics b/SOPE/NGCards/TimeZones/Africa/Libreville.ics index 1845ba537..2765b0c6f 100644 --- a/SOPE/NGCards/TimeZones/Africa/Libreville.ics +++ b/SOPE/NGCards/TimeZones/Africa/Libreville.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Libreville diff --git a/SOPE/NGCards/TimeZones/Africa/Lome.ics b/SOPE/NGCards/TimeZones/Africa/Lome.ics index 6549bb42a..227946eed 100644 --- a/SOPE/NGCards/TimeZones/Africa/Lome.ics +++ b/SOPE/NGCards/TimeZones/Africa/Lome.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Lome diff --git a/SOPE/NGCards/TimeZones/Africa/Luanda.ics b/SOPE/NGCards/TimeZones/Africa/Luanda.ics index 0de494b95..324a08b53 100644 --- a/SOPE/NGCards/TimeZones/Africa/Luanda.ics +++ b/SOPE/NGCards/TimeZones/Africa/Luanda.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Luanda diff --git a/SOPE/NGCards/TimeZones/Africa/Lubumbashi.ics b/SOPE/NGCards/TimeZones/Africa/Lubumbashi.ics index 5c8ec090a..c5703a198 100644 --- a/SOPE/NGCards/TimeZones/Africa/Lubumbashi.ics +++ b/SOPE/NGCards/TimeZones/Africa/Lubumbashi.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Lubumbashi diff --git a/SOPE/NGCards/TimeZones/Africa/Lusaka.ics b/SOPE/NGCards/TimeZones/Africa/Lusaka.ics index b3e362b8c..5d792086e 100644 --- a/SOPE/NGCards/TimeZones/Africa/Lusaka.ics +++ b/SOPE/NGCards/TimeZones/Africa/Lusaka.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Lusaka diff --git a/SOPE/NGCards/TimeZones/Africa/Malabo.ics b/SOPE/NGCards/TimeZones/Africa/Malabo.ics index 2fbef4fbf..a3f0ab84c 100644 --- a/SOPE/NGCards/TimeZones/Africa/Malabo.ics +++ b/SOPE/NGCards/TimeZones/Africa/Malabo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Malabo diff --git a/SOPE/NGCards/TimeZones/Africa/Maputo.ics b/SOPE/NGCards/TimeZones/Africa/Maputo.ics index 30df05d2b..40e26f1c7 100644 --- a/SOPE/NGCards/TimeZones/Africa/Maputo.ics +++ b/SOPE/NGCards/TimeZones/Africa/Maputo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Maputo diff --git a/SOPE/NGCards/TimeZones/Africa/Maseru.ics b/SOPE/NGCards/TimeZones/Africa/Maseru.ics index d9f6fa83c..10a504381 100644 --- a/SOPE/NGCards/TimeZones/Africa/Maseru.ics +++ b/SOPE/NGCards/TimeZones/Africa/Maseru.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Maseru diff --git a/SOPE/NGCards/TimeZones/Africa/Mbabane.ics b/SOPE/NGCards/TimeZones/Africa/Mbabane.ics index c6e73fa22..8b2a2da1e 100644 --- a/SOPE/NGCards/TimeZones/Africa/Mbabane.ics +++ b/SOPE/NGCards/TimeZones/Africa/Mbabane.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Mbabane diff --git a/SOPE/NGCards/TimeZones/Africa/Mogadishu.ics b/SOPE/NGCards/TimeZones/Africa/Mogadishu.ics index 70b8639e8..c25678f5b 100644 --- a/SOPE/NGCards/TimeZones/Africa/Mogadishu.ics +++ b/SOPE/NGCards/TimeZones/Africa/Mogadishu.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Mogadishu diff --git a/SOPE/NGCards/TimeZones/Africa/Monrovia.ics b/SOPE/NGCards/TimeZones/Africa/Monrovia.ics index 0f2d6a54e..c509dd137 100644 --- a/SOPE/NGCards/TimeZones/Africa/Monrovia.ics +++ b/SOPE/NGCards/TimeZones/Africa/Monrovia.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Monrovia diff --git a/SOPE/NGCards/TimeZones/Africa/Nairobi.ics b/SOPE/NGCards/TimeZones/Africa/Nairobi.ics index 552822a8f..167681055 100644 --- a/SOPE/NGCards/TimeZones/Africa/Nairobi.ics +++ b/SOPE/NGCards/TimeZones/Africa/Nairobi.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Nairobi diff --git a/SOPE/NGCards/TimeZones/Africa/Ndjamena.ics b/SOPE/NGCards/TimeZones/Africa/Ndjamena.ics index b536d06c3..77316d953 100644 --- a/SOPE/NGCards/TimeZones/Africa/Ndjamena.ics +++ b/SOPE/NGCards/TimeZones/Africa/Ndjamena.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Ndjamena diff --git a/SOPE/NGCards/TimeZones/Africa/Niamey.ics b/SOPE/NGCards/TimeZones/Africa/Niamey.ics index fa4d2e567..b8cba64d7 100644 --- a/SOPE/NGCards/TimeZones/Africa/Niamey.ics +++ b/SOPE/NGCards/TimeZones/Africa/Niamey.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Niamey diff --git a/SOPE/NGCards/TimeZones/Africa/Nouakchott.ics b/SOPE/NGCards/TimeZones/Africa/Nouakchott.ics index 8d31a7c36..c8f8041d0 100644 --- a/SOPE/NGCards/TimeZones/Africa/Nouakchott.ics +++ b/SOPE/NGCards/TimeZones/Africa/Nouakchott.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Nouakchott diff --git a/SOPE/NGCards/TimeZones/Africa/Ouagadougou.ics b/SOPE/NGCards/TimeZones/Africa/Ouagadougou.ics index 5b6bf4c0c..ace03e7ad 100644 --- a/SOPE/NGCards/TimeZones/Africa/Ouagadougou.ics +++ b/SOPE/NGCards/TimeZones/Africa/Ouagadougou.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Ouagadougou diff --git a/SOPE/NGCards/TimeZones/Africa/Porto-Novo.ics b/SOPE/NGCards/TimeZones/Africa/Porto-Novo.ics index 1361b6cb5..d85ecc0e2 100644 --- a/SOPE/NGCards/TimeZones/Africa/Porto-Novo.ics +++ b/SOPE/NGCards/TimeZones/Africa/Porto-Novo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Porto-Novo diff --git a/SOPE/NGCards/TimeZones/Africa/Sao_Tome.ics b/SOPE/NGCards/TimeZones/Africa/Sao_Tome.ics index 9c85867e4..75313f5d0 100644 --- a/SOPE/NGCards/TimeZones/Africa/Sao_Tome.ics +++ b/SOPE/NGCards/TimeZones/Africa/Sao_Tome.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Sao_Tome diff --git a/SOPE/NGCards/TimeZones/Africa/Tripoli.ics b/SOPE/NGCards/TimeZones/Africa/Tripoli.ics index d3d9850bf..11493be4b 100644 --- a/SOPE/NGCards/TimeZones/Africa/Tripoli.ics +++ b/SOPE/NGCards/TimeZones/Africa/Tripoli.ics @@ -1,22 +1,14 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Tripoli X-LIC-LOCATION:Africa/Tripoli -BEGIN:DAYLIGHT -TZOFFSETFROM:+0100 -TZOFFSETTO:+0200 -TZNAME:CEST -DTSTART:19700327T010000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR -END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 -TZOFFSETTO:+0100 -TZNAME:CET -DTSTART:19701030T020000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR +TZOFFSETTO:+0200 +TZNAME:EET +DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Africa/Tunis.ics b/SOPE/NGCards/TimeZones/Africa/Tunis.ics index cc54ccc3d..122673252 100644 --- a/SOPE/NGCards/TimeZones/Africa/Tunis.ics +++ b/SOPE/NGCards/TimeZones/Africa/Tunis.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Tunis diff --git a/SOPE/NGCards/TimeZones/Africa/Windhoek.ics b/SOPE/NGCards/TimeZones/Africa/Windhoek.ics index c8c875f4f..24dcb86cf 100644 --- a/SOPE/NGCards/TimeZones/Africa/Windhoek.ics +++ b/SOPE/NGCards/TimeZones/Africa/Windhoek.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Africa/Windhoek diff --git a/SOPE/NGCards/TimeZones/America/Adak.ics b/SOPE/NGCards/TimeZones/America/Adak.ics index e379b2438..3fc727426 100644 --- a/SOPE/NGCards/TimeZones/America/Adak.ics +++ b/SOPE/NGCards/TimeZones/America/Adak.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Adak diff --git a/SOPE/NGCards/TimeZones/America/Anchorage.ics b/SOPE/NGCards/TimeZones/America/Anchorage.ics index 2fb246172..a34fc0846 100644 --- a/SOPE/NGCards/TimeZones/America/Anchorage.ics +++ b/SOPE/NGCards/TimeZones/America/Anchorage.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Anchorage diff --git a/SOPE/NGCards/TimeZones/America/Anguilla.ics b/SOPE/NGCards/TimeZones/America/Anguilla.ics index d3ab3cd33..6e60dfcbc 100644 --- a/SOPE/NGCards/TimeZones/America/Anguilla.ics +++ b/SOPE/NGCards/TimeZones/America/Anguilla.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Anguilla diff --git a/SOPE/NGCards/TimeZones/America/Antigua.ics b/SOPE/NGCards/TimeZones/America/Antigua.ics index 6db7cec91..9da6564bb 100644 --- a/SOPE/NGCards/TimeZones/America/Antigua.ics +++ b/SOPE/NGCards/TimeZones/America/Antigua.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Antigua diff --git a/SOPE/NGCards/TimeZones/America/Araguaina.ics b/SOPE/NGCards/TimeZones/America/Araguaina.ics index 9a9bf4af2..0bd4ae909 100644 --- a/SOPE/NGCards/TimeZones/America/Araguaina.ics +++ b/SOPE/NGCards/TimeZones/America/Araguaina.ics @@ -1,22 +1,14 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Araguaina X-LIC-LOCATION:America/Araguaina -BEGIN:DAYLIGHT -TZOFFSETFROM:-0300 -TZOFFSETTO:-0200 -TZNAME:BRST -DTSTART:19701018T000000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=3SU -END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0300 TZOFFSETTO:-0300 TZNAME:BRT -DTSTART:19700215T000000 -RRULE:FREQ=YEARLY;BYMONTH=2;BYDAY=3SU +DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/America/Argentina/Buenos_Aires.ics b/SOPE/NGCards/TimeZones/America/Argentina/Buenos_Aires.ics index 55fef3e99..61b28250a 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/Buenos_Aires.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/Buenos_Aires.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/Buenos_Aires diff --git a/SOPE/NGCards/TimeZones/America/Argentina/Catamarca.ics b/SOPE/NGCards/TimeZones/America/Argentina/Catamarca.ics index cbcc43fdd..f24fce6bb 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/Catamarca.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/Catamarca.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/Catamarca diff --git a/SOPE/NGCards/TimeZones/America/Argentina/Cordoba.ics b/SOPE/NGCards/TimeZones/America/Argentina/Cordoba.ics index 808afe05e..963a40b9b 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/Cordoba.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/Cordoba.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/Cordoba diff --git a/SOPE/NGCards/TimeZones/America/Argentina/Jujuy.ics b/SOPE/NGCards/TimeZones/America/Argentina/Jujuy.ics index 753f0132a..44de9c6b4 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/Jujuy.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/Jujuy.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/Jujuy diff --git a/SOPE/NGCards/TimeZones/America/Argentina/La_Rioja.ics b/SOPE/NGCards/TimeZones/America/Argentina/La_Rioja.ics index a8f88c0d9..da14dc26d 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/La_Rioja.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/La_Rioja.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/La_Rioja diff --git a/SOPE/NGCards/TimeZones/America/Argentina/Mendoza.ics b/SOPE/NGCards/TimeZones/America/Argentina/Mendoza.ics index 75e30b63f..1793f5084 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/Mendoza.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/Mendoza.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/Mendoza diff --git a/SOPE/NGCards/TimeZones/America/Argentina/Rio_Gallegos.ics b/SOPE/NGCards/TimeZones/America/Argentina/Rio_Gallegos.ics index 4662a010f..497600fc4 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/Rio_Gallegos.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/Rio_Gallegos.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/Rio_Gallegos diff --git a/SOPE/NGCards/TimeZones/America/Argentina/Salta.ics b/SOPE/NGCards/TimeZones/America/Argentina/Salta.ics index 156724be8..79a267dee 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/Salta.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/Salta.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/Salta diff --git a/SOPE/NGCards/TimeZones/America/Argentina/San_Juan.ics b/SOPE/NGCards/TimeZones/America/Argentina/San_Juan.ics index 4113f2d58..cc1ffd11c 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/San_Juan.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/San_Juan.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/San_Juan diff --git a/SOPE/NGCards/TimeZones/America/Argentina/San_Luis.ics b/SOPE/NGCards/TimeZones/America/Argentina/San_Luis.ics index 336916215..018d19757 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/San_Luis.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/San_Luis.ics @@ -1,13 +1,13 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/San_Luis X-LIC-LOCATION:America/Argentina/San_Luis BEGIN:STANDARD -TZOFFSETFROM:-0400 -TZOFFSETTO:-0400 -TZNAME:WART +TZOFFSETFROM:-0300 +TZOFFSETTO:-0300 +TZNAME:ART DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/America/Argentina/Tucuman.ics b/SOPE/NGCards/TimeZones/America/Argentina/Tucuman.ics index d99d46e2c..eb16b9ca3 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/Tucuman.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/Tucuman.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/Tucuman diff --git a/SOPE/NGCards/TimeZones/America/Argentina/Ushuaia.ics b/SOPE/NGCards/TimeZones/America/Argentina/Ushuaia.ics index 9b6ccd44b..cac913d74 100644 --- a/SOPE/NGCards/TimeZones/America/Argentina/Ushuaia.ics +++ b/SOPE/NGCards/TimeZones/America/Argentina/Ushuaia.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Argentina/Ushuaia diff --git a/SOPE/NGCards/TimeZones/America/Aruba.ics b/SOPE/NGCards/TimeZones/America/Aruba.ics index 34200cbca..e4cd0ea60 100644 --- a/SOPE/NGCards/TimeZones/America/Aruba.ics +++ b/SOPE/NGCards/TimeZones/America/Aruba.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Aruba diff --git a/SOPE/NGCards/TimeZones/America/Asuncion.ics b/SOPE/NGCards/TimeZones/America/Asuncion.ics index 267a9441f..fa6aa014b 100644 --- a/SOPE/NGCards/TimeZones/America/Asuncion.ics +++ b/SOPE/NGCards/TimeZones/America/Asuncion.ics @@ -1,16 +1,9 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Asuncion X-LIC-LOCATION:America/Asuncion -BEGIN:STANDARD -TZOFFSETFROM:-0300 -TZOFFSETTO:-0400 -TZNAME:PYT -DTSTART:19700412T000000 -RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=2SU -END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:-0400 TZOFFSETTO:-0300 @@ -18,5 +11,12 @@ TZNAME:PYST DTSTART:19701004T000000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0300 +TZOFFSETTO:-0400 +TZNAME:PYT +DTSTART:19700322T000000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=4SU +END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/America/Atikokan.ics b/SOPE/NGCards/TimeZones/America/Atikokan.ics index 1ed82ff8b..c2442a65a 100644 --- a/SOPE/NGCards/TimeZones/America/Atikokan.ics +++ b/SOPE/NGCards/TimeZones/America/Atikokan.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Atikokan diff --git a/SOPE/NGCards/TimeZones/America/Bahia.ics b/SOPE/NGCards/TimeZones/America/Bahia.ics index e47aa2f1d..1c8ae0570 100644 --- a/SOPE/NGCards/TimeZones/America/Bahia.ics +++ b/SOPE/NGCards/TimeZones/America/Bahia.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Bahia diff --git a/SOPE/NGCards/TimeZones/America/Bahia_Banderas.ics b/SOPE/NGCards/TimeZones/America/Bahia_Banderas.ics index 0915e90e6..c147b0731 100644 --- a/SOPE/NGCards/TimeZones/America/Bahia_Banderas.ics +++ b/SOPE/NGCards/TimeZones/America/Bahia_Banderas.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Bahia_Banderas diff --git a/SOPE/NGCards/TimeZones/America/Barbados.ics b/SOPE/NGCards/TimeZones/America/Barbados.ics index acad2983c..7c745bb3b 100644 --- a/SOPE/NGCards/TimeZones/America/Barbados.ics +++ b/SOPE/NGCards/TimeZones/America/Barbados.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Barbados diff --git a/SOPE/NGCards/TimeZones/America/Belem.ics b/SOPE/NGCards/TimeZones/America/Belem.ics index a459b609d..adea76075 100644 --- a/SOPE/NGCards/TimeZones/America/Belem.ics +++ b/SOPE/NGCards/TimeZones/America/Belem.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Belem diff --git a/SOPE/NGCards/TimeZones/America/Belize.ics b/SOPE/NGCards/TimeZones/America/Belize.ics index dfaccb159..a52b7a6fa 100644 --- a/SOPE/NGCards/TimeZones/America/Belize.ics +++ b/SOPE/NGCards/TimeZones/America/Belize.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Belize diff --git a/SOPE/NGCards/TimeZones/America/Blanc-Sablon.ics b/SOPE/NGCards/TimeZones/America/Blanc-Sablon.ics index 02bee4e1e..2c59dd830 100644 --- a/SOPE/NGCards/TimeZones/America/Blanc-Sablon.ics +++ b/SOPE/NGCards/TimeZones/America/Blanc-Sablon.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Blanc-Sablon diff --git a/SOPE/NGCards/TimeZones/America/Boa_Vista.ics b/SOPE/NGCards/TimeZones/America/Boa_Vista.ics index 0e3566b6f..54ea7bd8a 100644 --- a/SOPE/NGCards/TimeZones/America/Boa_Vista.ics +++ b/SOPE/NGCards/TimeZones/America/Boa_Vista.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Boa_Vista diff --git a/SOPE/NGCards/TimeZones/America/Bogota.ics b/SOPE/NGCards/TimeZones/America/Bogota.ics index c2227451f..c2f04f930 100644 --- a/SOPE/NGCards/TimeZones/America/Bogota.ics +++ b/SOPE/NGCards/TimeZones/America/Bogota.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Bogota diff --git a/SOPE/NGCards/TimeZones/America/Boise.ics b/SOPE/NGCards/TimeZones/America/Boise.ics index 7ead8d0e3..be1d85579 100644 --- a/SOPE/NGCards/TimeZones/America/Boise.ics +++ b/SOPE/NGCards/TimeZones/America/Boise.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Boise diff --git a/SOPE/NGCards/TimeZones/America/Cambridge_Bay.ics b/SOPE/NGCards/TimeZones/America/Cambridge_Bay.ics index 7471ac2de..494f653cc 100644 --- a/SOPE/NGCards/TimeZones/America/Cambridge_Bay.ics +++ b/SOPE/NGCards/TimeZones/America/Cambridge_Bay.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Cambridge_Bay diff --git a/SOPE/NGCards/TimeZones/America/Campo_Grande.ics b/SOPE/NGCards/TimeZones/America/Campo_Grande.ics index 5c13e8dd6..539ba63d6 100644 --- a/SOPE/NGCards/TimeZones/America/Campo_Grande.ics +++ b/SOPE/NGCards/TimeZones/America/Campo_Grande.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Campo_Grande diff --git a/SOPE/NGCards/TimeZones/America/Cancun.ics b/SOPE/NGCards/TimeZones/America/Cancun.ics index 0950198db..4d5ce11a9 100644 --- a/SOPE/NGCards/TimeZones/America/Cancun.ics +++ b/SOPE/NGCards/TimeZones/America/Cancun.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Cancun diff --git a/SOPE/NGCards/TimeZones/America/Caracas.ics b/SOPE/NGCards/TimeZones/America/Caracas.ics index 72457440d..8dfe62b36 100644 --- a/SOPE/NGCards/TimeZones/America/Caracas.ics +++ b/SOPE/NGCards/TimeZones/America/Caracas.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Caracas diff --git a/SOPE/NGCards/TimeZones/America/Cayenne.ics b/SOPE/NGCards/TimeZones/America/Cayenne.ics index 0589583be..d17dacfca 100644 --- a/SOPE/NGCards/TimeZones/America/Cayenne.ics +++ b/SOPE/NGCards/TimeZones/America/Cayenne.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Cayenne diff --git a/SOPE/NGCards/TimeZones/America/Cayman.ics b/SOPE/NGCards/TimeZones/America/Cayman.ics index a0f44a40a..1671f0a90 100644 --- a/SOPE/NGCards/TimeZones/America/Cayman.ics +++ b/SOPE/NGCards/TimeZones/America/Cayman.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Cayman diff --git a/SOPE/NGCards/TimeZones/America/Chicago.ics b/SOPE/NGCards/TimeZones/America/Chicago.ics index 305323687..647e7b591 100644 --- a/SOPE/NGCards/TimeZones/America/Chicago.ics +++ b/SOPE/NGCards/TimeZones/America/Chicago.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Chicago diff --git a/SOPE/NGCards/TimeZones/America/Chihuahua.ics b/SOPE/NGCards/TimeZones/America/Chihuahua.ics index a6a8ed52c..be2e7c453 100644 --- a/SOPE/NGCards/TimeZones/America/Chihuahua.ics +++ b/SOPE/NGCards/TimeZones/America/Chihuahua.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Chihuahua diff --git a/SOPE/NGCards/TimeZones/America/Costa_Rica.ics b/SOPE/NGCards/TimeZones/America/Costa_Rica.ics index 2ef1f13c1..1d71073f0 100644 --- a/SOPE/NGCards/TimeZones/America/Costa_Rica.ics +++ b/SOPE/NGCards/TimeZones/America/Costa_Rica.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Costa_Rica diff --git a/SOPE/NGCards/TimeZones/America/Creston.ics b/SOPE/NGCards/TimeZones/America/Creston.ics index 5c18503ca..6bf5af18f 100644 --- a/SOPE/NGCards/TimeZones/America/Creston.ics +++ b/SOPE/NGCards/TimeZones/America/Creston.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Creston diff --git a/SOPE/NGCards/TimeZones/America/Cuiaba.ics b/SOPE/NGCards/TimeZones/America/Cuiaba.ics index d1f808753..ea7004e99 100644 --- a/SOPE/NGCards/TimeZones/America/Cuiaba.ics +++ b/SOPE/NGCards/TimeZones/America/Cuiaba.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Cuiaba diff --git a/SOPE/NGCards/TimeZones/America/Curacao.ics b/SOPE/NGCards/TimeZones/America/Curacao.ics index fc3148201..3a930c39d 100644 --- a/SOPE/NGCards/TimeZones/America/Curacao.ics +++ b/SOPE/NGCards/TimeZones/America/Curacao.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Curacao diff --git a/SOPE/NGCards/TimeZones/America/Danmarkshavn.ics b/SOPE/NGCards/TimeZones/America/Danmarkshavn.ics index aa9c3f0f3..8505200ea 100644 --- a/SOPE/NGCards/TimeZones/America/Danmarkshavn.ics +++ b/SOPE/NGCards/TimeZones/America/Danmarkshavn.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Danmarkshavn diff --git a/SOPE/NGCards/TimeZones/America/Dawson.ics b/SOPE/NGCards/TimeZones/America/Dawson.ics index e03e0219f..a1586af7f 100644 --- a/SOPE/NGCards/TimeZones/America/Dawson.ics +++ b/SOPE/NGCards/TimeZones/America/Dawson.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Dawson diff --git a/SOPE/NGCards/TimeZones/America/Dawson_Creek.ics b/SOPE/NGCards/TimeZones/America/Dawson_Creek.ics index 329235787..fc82b7c98 100644 --- a/SOPE/NGCards/TimeZones/America/Dawson_Creek.ics +++ b/SOPE/NGCards/TimeZones/America/Dawson_Creek.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Dawson_Creek diff --git a/SOPE/NGCards/TimeZones/America/Denver.ics b/SOPE/NGCards/TimeZones/America/Denver.ics index 59713abad..2997a961d 100644 --- a/SOPE/NGCards/TimeZones/America/Denver.ics +++ b/SOPE/NGCards/TimeZones/America/Denver.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Denver diff --git a/SOPE/NGCards/TimeZones/America/Detroit.ics b/SOPE/NGCards/TimeZones/America/Detroit.ics index 8b0177c31..68ec9beea 100644 --- a/SOPE/NGCards/TimeZones/America/Detroit.ics +++ b/SOPE/NGCards/TimeZones/America/Detroit.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Detroit diff --git a/SOPE/NGCards/TimeZones/America/Dominica.ics b/SOPE/NGCards/TimeZones/America/Dominica.ics index e7f5a4239..9f15f3a4c 100644 --- a/SOPE/NGCards/TimeZones/America/Dominica.ics +++ b/SOPE/NGCards/TimeZones/America/Dominica.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Dominica diff --git a/SOPE/NGCards/TimeZones/America/Edmonton.ics b/SOPE/NGCards/TimeZones/America/Edmonton.ics index 1f40d2fdd..e4ec742ca 100644 --- a/SOPE/NGCards/TimeZones/America/Edmonton.ics +++ b/SOPE/NGCards/TimeZones/America/Edmonton.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Edmonton diff --git a/SOPE/NGCards/TimeZones/America/Eirunepe.ics b/SOPE/NGCards/TimeZones/America/Eirunepe.ics index 9856cf0d5..11b67a599 100644 --- a/SOPE/NGCards/TimeZones/America/Eirunepe.ics +++ b/SOPE/NGCards/TimeZones/America/Eirunepe.ics @@ -1,13 +1,13 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Eirunepe X-LIC-LOCATION:America/Eirunepe BEGIN:STANDARD -TZOFFSETFROM:-0400 -TZOFFSETTO:-0400 -TZNAME:AMT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0500 +TZNAME:ACT DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/America/El_Salvador.ics b/SOPE/NGCards/TimeZones/America/El_Salvador.ics index 0cd1fcc97..f56f0c2ac 100644 --- a/SOPE/NGCards/TimeZones/America/El_Salvador.ics +++ b/SOPE/NGCards/TimeZones/America/El_Salvador.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/El_Salvador diff --git a/SOPE/NGCards/TimeZones/America/Fortaleza.ics b/SOPE/NGCards/TimeZones/America/Fortaleza.ics index 1fd2e54bf..c5d319a74 100644 --- a/SOPE/NGCards/TimeZones/America/Fortaleza.ics +++ b/SOPE/NGCards/TimeZones/America/Fortaleza.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Fortaleza diff --git a/SOPE/NGCards/TimeZones/America/Glace_Bay.ics b/SOPE/NGCards/TimeZones/America/Glace_Bay.ics index 2f6f93eb9..79348fd10 100644 --- a/SOPE/NGCards/TimeZones/America/Glace_Bay.ics +++ b/SOPE/NGCards/TimeZones/America/Glace_Bay.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Glace_Bay diff --git a/SOPE/NGCards/TimeZones/America/Godthab.ics b/SOPE/NGCards/TimeZones/America/Godthab.ics index a8b8e32e9..2a92ffd1e 100644 --- a/SOPE/NGCards/TimeZones/America/Godthab.ics +++ b/SOPE/NGCards/TimeZones/America/Godthab.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Godthab diff --git a/SOPE/NGCards/TimeZones/America/Goose_Bay.ics b/SOPE/NGCards/TimeZones/America/Goose_Bay.ics index f058578c5..7360db74c 100644 --- a/SOPE/NGCards/TimeZones/America/Goose_Bay.ics +++ b/SOPE/NGCards/TimeZones/America/Goose_Bay.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Goose_Bay diff --git a/SOPE/NGCards/TimeZones/America/Grand_Turk.ics b/SOPE/NGCards/TimeZones/America/Grand_Turk.ics index 16307344d..c3a986d75 100644 --- a/SOPE/NGCards/TimeZones/America/Grand_Turk.ics +++ b/SOPE/NGCards/TimeZones/America/Grand_Turk.ics @@ -1,22 +1,14 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Grand_Turk X-LIC-LOCATION:America/Grand_Turk -BEGIN:DAYLIGHT -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -DTSTART:19700308T020000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU -END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -DTSTART:19701101T020000 -RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU +TZOFFSETTO:-0400 +TZNAME:AST +DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/America/Grenada.ics b/SOPE/NGCards/TimeZones/America/Grenada.ics index 0eeb64336..59e7f12b8 100644 --- a/SOPE/NGCards/TimeZones/America/Grenada.ics +++ b/SOPE/NGCards/TimeZones/America/Grenada.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Grenada diff --git a/SOPE/NGCards/TimeZones/America/Guadeloupe.ics b/SOPE/NGCards/TimeZones/America/Guadeloupe.ics index 9408b8c5d..98891c960 100644 --- a/SOPE/NGCards/TimeZones/America/Guadeloupe.ics +++ b/SOPE/NGCards/TimeZones/America/Guadeloupe.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Guadeloupe diff --git a/SOPE/NGCards/TimeZones/America/Guatemala.ics b/SOPE/NGCards/TimeZones/America/Guatemala.ics index 0d330f70e..96b04a78c 100644 --- a/SOPE/NGCards/TimeZones/America/Guatemala.ics +++ b/SOPE/NGCards/TimeZones/America/Guatemala.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Guatemala diff --git a/SOPE/NGCards/TimeZones/America/Guayaquil.ics b/SOPE/NGCards/TimeZones/America/Guayaquil.ics index 60d50cf6b..d293fb044 100644 --- a/SOPE/NGCards/TimeZones/America/Guayaquil.ics +++ b/SOPE/NGCards/TimeZones/America/Guayaquil.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Guayaquil diff --git a/SOPE/NGCards/TimeZones/America/Guyana.ics b/SOPE/NGCards/TimeZones/America/Guyana.ics index 263dbd7d5..fabbccd6d 100644 --- a/SOPE/NGCards/TimeZones/America/Guyana.ics +++ b/SOPE/NGCards/TimeZones/America/Guyana.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Guyana diff --git a/SOPE/NGCards/TimeZones/America/Halifax.ics b/SOPE/NGCards/TimeZones/America/Halifax.ics index 174e87efc..6a05f08da 100644 --- a/SOPE/NGCards/TimeZones/America/Halifax.ics +++ b/SOPE/NGCards/TimeZones/America/Halifax.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Halifax diff --git a/SOPE/NGCards/TimeZones/America/Havana.ics b/SOPE/NGCards/TimeZones/America/Havana.ics index aafe5237b..59fe09946 100644 --- a/SOPE/NGCards/TimeZones/America/Havana.ics +++ b/SOPE/NGCards/TimeZones/America/Havana.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Havana diff --git a/SOPE/NGCards/TimeZones/America/Hermosillo.ics b/SOPE/NGCards/TimeZones/America/Hermosillo.ics index 26045065d..c9e1f9259 100644 --- a/SOPE/NGCards/TimeZones/America/Hermosillo.ics +++ b/SOPE/NGCards/TimeZones/America/Hermosillo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Hermosillo diff --git a/SOPE/NGCards/TimeZones/America/Indiana/Indianapolis.ics b/SOPE/NGCards/TimeZones/America/Indiana/Indianapolis.ics index bb0926256..3c8d99c5c 100644 --- a/SOPE/NGCards/TimeZones/America/Indiana/Indianapolis.ics +++ b/SOPE/NGCards/TimeZones/America/Indiana/Indianapolis.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Indiana/Indianapolis diff --git a/SOPE/NGCards/TimeZones/America/Indiana/Knox.ics b/SOPE/NGCards/TimeZones/America/Indiana/Knox.ics index ff54c8ea0..c80b4ff0b 100644 --- a/SOPE/NGCards/TimeZones/America/Indiana/Knox.ics +++ b/SOPE/NGCards/TimeZones/America/Indiana/Knox.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Indiana/Knox diff --git a/SOPE/NGCards/TimeZones/America/Indiana/Marengo.ics b/SOPE/NGCards/TimeZones/America/Indiana/Marengo.ics index 94d2cfee1..128e7a87f 100644 --- a/SOPE/NGCards/TimeZones/America/Indiana/Marengo.ics +++ b/SOPE/NGCards/TimeZones/America/Indiana/Marengo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Indiana/Marengo diff --git a/SOPE/NGCards/TimeZones/America/Indiana/Petersburg.ics b/SOPE/NGCards/TimeZones/America/Indiana/Petersburg.ics index 16fcc67ab..7d764ac74 100644 --- a/SOPE/NGCards/TimeZones/America/Indiana/Petersburg.ics +++ b/SOPE/NGCards/TimeZones/America/Indiana/Petersburg.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Indiana/Petersburg diff --git a/SOPE/NGCards/TimeZones/America/Indiana/Tell_City.ics b/SOPE/NGCards/TimeZones/America/Indiana/Tell_City.ics index ff0e23bf6..557ddcf6f 100644 --- a/SOPE/NGCards/TimeZones/America/Indiana/Tell_City.ics +++ b/SOPE/NGCards/TimeZones/America/Indiana/Tell_City.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Indiana/Tell_City diff --git a/SOPE/NGCards/TimeZones/America/Indiana/Vevay.ics b/SOPE/NGCards/TimeZones/America/Indiana/Vevay.ics index 8e6c9418e..50440311d 100644 --- a/SOPE/NGCards/TimeZones/America/Indiana/Vevay.ics +++ b/SOPE/NGCards/TimeZones/America/Indiana/Vevay.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Indiana/Vevay diff --git a/SOPE/NGCards/TimeZones/America/Indiana/Vincennes.ics b/SOPE/NGCards/TimeZones/America/Indiana/Vincennes.ics index 065049a31..2552a33dc 100644 --- a/SOPE/NGCards/TimeZones/America/Indiana/Vincennes.ics +++ b/SOPE/NGCards/TimeZones/America/Indiana/Vincennes.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Indiana/Vincennes diff --git a/SOPE/NGCards/TimeZones/America/Indiana/Winamac.ics b/SOPE/NGCards/TimeZones/America/Indiana/Winamac.ics index 60caf1ffe..a9f90e6a0 100644 --- a/SOPE/NGCards/TimeZones/America/Indiana/Winamac.ics +++ b/SOPE/NGCards/TimeZones/America/Indiana/Winamac.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Indiana/Winamac diff --git a/SOPE/NGCards/TimeZones/America/Inuvik.ics b/SOPE/NGCards/TimeZones/America/Inuvik.ics index eecad3d41..66bfa1b5f 100644 --- a/SOPE/NGCards/TimeZones/America/Inuvik.ics +++ b/SOPE/NGCards/TimeZones/America/Inuvik.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Inuvik diff --git a/SOPE/NGCards/TimeZones/America/Iqaluit.ics b/SOPE/NGCards/TimeZones/America/Iqaluit.ics index b30414740..82fa44511 100644 --- a/SOPE/NGCards/TimeZones/America/Iqaluit.ics +++ b/SOPE/NGCards/TimeZones/America/Iqaluit.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Iqaluit diff --git a/SOPE/NGCards/TimeZones/America/Jamaica.ics b/SOPE/NGCards/TimeZones/America/Jamaica.ics index ac8551c59..82b8cc916 100644 --- a/SOPE/NGCards/TimeZones/America/Jamaica.ics +++ b/SOPE/NGCards/TimeZones/America/Jamaica.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Jamaica diff --git a/SOPE/NGCards/TimeZones/America/Juneau.ics b/SOPE/NGCards/TimeZones/America/Juneau.ics index 5f70c8f96..49b06041b 100644 --- a/SOPE/NGCards/TimeZones/America/Juneau.ics +++ b/SOPE/NGCards/TimeZones/America/Juneau.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Juneau diff --git a/SOPE/NGCards/TimeZones/America/Kentucky/Louisville.ics b/SOPE/NGCards/TimeZones/America/Kentucky/Louisville.ics index 60dc836cf..276d4bb82 100644 --- a/SOPE/NGCards/TimeZones/America/Kentucky/Louisville.ics +++ b/SOPE/NGCards/TimeZones/America/Kentucky/Louisville.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Kentucky/Louisville diff --git a/SOPE/NGCards/TimeZones/America/Kentucky/Monticello.ics b/SOPE/NGCards/TimeZones/America/Kentucky/Monticello.ics index 9ad8f20a1..441494304 100644 --- a/SOPE/NGCards/TimeZones/America/Kentucky/Monticello.ics +++ b/SOPE/NGCards/TimeZones/America/Kentucky/Monticello.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Kentucky/Monticello diff --git a/SOPE/NGCards/TimeZones/America/Kralendijk.ics b/SOPE/NGCards/TimeZones/America/Kralendijk.ics index 1990a171b..d18d4ed33 100644 --- a/SOPE/NGCards/TimeZones/America/Kralendijk.ics +++ b/SOPE/NGCards/TimeZones/America/Kralendijk.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Kralendijk diff --git a/SOPE/NGCards/TimeZones/America/La_Paz.ics b/SOPE/NGCards/TimeZones/America/La_Paz.ics index aa1f4d470..740e54e8e 100644 --- a/SOPE/NGCards/TimeZones/America/La_Paz.ics +++ b/SOPE/NGCards/TimeZones/America/La_Paz.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/La_Paz diff --git a/SOPE/NGCards/TimeZones/America/Lima.ics b/SOPE/NGCards/TimeZones/America/Lima.ics index 60901a3a0..6760635a7 100644 --- a/SOPE/NGCards/TimeZones/America/Lima.ics +++ b/SOPE/NGCards/TimeZones/America/Lima.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Lima diff --git a/SOPE/NGCards/TimeZones/America/Los_Angeles.ics b/SOPE/NGCards/TimeZones/America/Los_Angeles.ics index dab4d9928..3cd58e02e 100644 --- a/SOPE/NGCards/TimeZones/America/Los_Angeles.ics +++ b/SOPE/NGCards/TimeZones/America/Los_Angeles.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Los_Angeles diff --git a/SOPE/NGCards/TimeZones/America/Lower_Princes.ics b/SOPE/NGCards/TimeZones/America/Lower_Princes.ics index 3600f7918..1b0fed302 100644 --- a/SOPE/NGCards/TimeZones/America/Lower_Princes.ics +++ b/SOPE/NGCards/TimeZones/America/Lower_Princes.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Lower_Princes diff --git a/SOPE/NGCards/TimeZones/America/Maceio.ics b/SOPE/NGCards/TimeZones/America/Maceio.ics index 71ccaced1..8886a31fb 100644 --- a/SOPE/NGCards/TimeZones/America/Maceio.ics +++ b/SOPE/NGCards/TimeZones/America/Maceio.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Maceio diff --git a/SOPE/NGCards/TimeZones/America/Managua.ics b/SOPE/NGCards/TimeZones/America/Managua.ics index 35e074fff..b8b484e09 100644 --- a/SOPE/NGCards/TimeZones/America/Managua.ics +++ b/SOPE/NGCards/TimeZones/America/Managua.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Managua diff --git a/SOPE/NGCards/TimeZones/America/Manaus.ics b/SOPE/NGCards/TimeZones/America/Manaus.ics index 056420b02..a27c9b1c4 100644 --- a/SOPE/NGCards/TimeZones/America/Manaus.ics +++ b/SOPE/NGCards/TimeZones/America/Manaus.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Manaus diff --git a/SOPE/NGCards/TimeZones/America/Marigot.ics b/SOPE/NGCards/TimeZones/America/Marigot.ics index effaf29fd..786c00bf1 100644 --- a/SOPE/NGCards/TimeZones/America/Marigot.ics +++ b/SOPE/NGCards/TimeZones/America/Marigot.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Marigot diff --git a/SOPE/NGCards/TimeZones/America/Martinique.ics b/SOPE/NGCards/TimeZones/America/Martinique.ics index e6824f4c0..d2290f780 100644 --- a/SOPE/NGCards/TimeZones/America/Martinique.ics +++ b/SOPE/NGCards/TimeZones/America/Martinique.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Martinique diff --git a/SOPE/NGCards/TimeZones/America/Matamoros.ics b/SOPE/NGCards/TimeZones/America/Matamoros.ics index 0697f2fb3..fd7175a18 100644 --- a/SOPE/NGCards/TimeZones/America/Matamoros.ics +++ b/SOPE/NGCards/TimeZones/America/Matamoros.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Matamoros diff --git a/SOPE/NGCards/TimeZones/America/Mazatlan.ics b/SOPE/NGCards/TimeZones/America/Mazatlan.ics index 0c6b624c8..6101020b6 100644 --- a/SOPE/NGCards/TimeZones/America/Mazatlan.ics +++ b/SOPE/NGCards/TimeZones/America/Mazatlan.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Mazatlan diff --git a/SOPE/NGCards/TimeZones/America/Menominee.ics b/SOPE/NGCards/TimeZones/America/Menominee.ics index 28e7d2aa2..1e0f8c829 100644 --- a/SOPE/NGCards/TimeZones/America/Menominee.ics +++ b/SOPE/NGCards/TimeZones/America/Menominee.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Menominee diff --git a/SOPE/NGCards/TimeZones/America/Merida.ics b/SOPE/NGCards/TimeZones/America/Merida.ics index 8cd04956a..c51e74f12 100644 --- a/SOPE/NGCards/TimeZones/America/Merida.ics +++ b/SOPE/NGCards/TimeZones/America/Merida.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Merida diff --git a/SOPE/NGCards/TimeZones/America/Metlakatla.ics b/SOPE/NGCards/TimeZones/America/Metlakatla.ics index 337e51e45..a01939128 100644 --- a/SOPE/NGCards/TimeZones/America/Metlakatla.ics +++ b/SOPE/NGCards/TimeZones/America/Metlakatla.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Metlakatla @@ -7,7 +7,7 @@ X-LIC-LOCATION:America/Metlakatla BEGIN:STANDARD TZOFFSETFROM:-0800 TZOFFSETTO:-0800 -TZNAME:MeST +TZNAME:PST DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/America/Mexico_City.ics b/SOPE/NGCards/TimeZones/America/Mexico_City.ics index df38186de..8ec190747 100644 --- a/SOPE/NGCards/TimeZones/America/Mexico_City.ics +++ b/SOPE/NGCards/TimeZones/America/Mexico_City.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Mexico_City diff --git a/SOPE/NGCards/TimeZones/America/Miquelon.ics b/SOPE/NGCards/TimeZones/America/Miquelon.ics index d80a89732..41f693456 100644 --- a/SOPE/NGCards/TimeZones/America/Miquelon.ics +++ b/SOPE/NGCards/TimeZones/America/Miquelon.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Miquelon diff --git a/SOPE/NGCards/TimeZones/America/Moncton.ics b/SOPE/NGCards/TimeZones/America/Moncton.ics index 8bd77ddd5..dd879d0c4 100644 --- a/SOPE/NGCards/TimeZones/America/Moncton.ics +++ b/SOPE/NGCards/TimeZones/America/Moncton.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Moncton diff --git a/SOPE/NGCards/TimeZones/America/Monterrey.ics b/SOPE/NGCards/TimeZones/America/Monterrey.ics index 214088d9c..122f7f86c 100644 --- a/SOPE/NGCards/TimeZones/America/Monterrey.ics +++ b/SOPE/NGCards/TimeZones/America/Monterrey.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Monterrey diff --git a/SOPE/NGCards/TimeZones/America/Montevideo.ics b/SOPE/NGCards/TimeZones/America/Montevideo.ics index 3a4c37b91..4c40c05ed 100644 --- a/SOPE/NGCards/TimeZones/America/Montevideo.ics +++ b/SOPE/NGCards/TimeZones/America/Montevideo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Montevideo diff --git a/SOPE/NGCards/TimeZones/America/Montreal.ics b/SOPE/NGCards/TimeZones/America/Montreal.ics index 9db0a3437..295e6ecb5 100644 --- a/SOPE/NGCards/TimeZones/America/Montreal.ics +++ b/SOPE/NGCards/TimeZones/America/Montreal.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Montreal diff --git a/SOPE/NGCards/TimeZones/America/Montserrat.ics b/SOPE/NGCards/TimeZones/America/Montserrat.ics index df15bb319..5fa11de22 100644 --- a/SOPE/NGCards/TimeZones/America/Montserrat.ics +++ b/SOPE/NGCards/TimeZones/America/Montserrat.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Montserrat diff --git a/SOPE/NGCards/TimeZones/America/Nassau.ics b/SOPE/NGCards/TimeZones/America/Nassau.ics index 309baa304..42ab8b6a7 100644 --- a/SOPE/NGCards/TimeZones/America/Nassau.ics +++ b/SOPE/NGCards/TimeZones/America/Nassau.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Nassau diff --git a/SOPE/NGCards/TimeZones/America/New_York.ics b/SOPE/NGCards/TimeZones/America/New_York.ics index 24e1655f3..d481d1ab5 100644 --- a/SOPE/NGCards/TimeZones/America/New_York.ics +++ b/SOPE/NGCards/TimeZones/America/New_York.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/New_York diff --git a/SOPE/NGCards/TimeZones/America/Nipigon.ics b/SOPE/NGCards/TimeZones/America/Nipigon.ics index 5a093da50..beadac97b 100644 --- a/SOPE/NGCards/TimeZones/America/Nipigon.ics +++ b/SOPE/NGCards/TimeZones/America/Nipigon.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Nipigon diff --git a/SOPE/NGCards/TimeZones/America/Nome.ics b/SOPE/NGCards/TimeZones/America/Nome.ics index b73852a83..1f238457a 100644 --- a/SOPE/NGCards/TimeZones/America/Nome.ics +++ b/SOPE/NGCards/TimeZones/America/Nome.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Nome diff --git a/SOPE/NGCards/TimeZones/America/Noronha.ics b/SOPE/NGCards/TimeZones/America/Noronha.ics index 803d376ac..1b9d4e1d3 100644 --- a/SOPE/NGCards/TimeZones/America/Noronha.ics +++ b/SOPE/NGCards/TimeZones/America/Noronha.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Noronha diff --git a/SOPE/NGCards/TimeZones/America/North_Dakota/Beulah.ics b/SOPE/NGCards/TimeZones/America/North_Dakota/Beulah.ics index 60cfb74bd..07e2a5b43 100644 --- a/SOPE/NGCards/TimeZones/America/North_Dakota/Beulah.ics +++ b/SOPE/NGCards/TimeZones/America/North_Dakota/Beulah.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/North_Dakota/Beulah diff --git a/SOPE/NGCards/TimeZones/America/North_Dakota/Center.ics b/SOPE/NGCards/TimeZones/America/North_Dakota/Center.ics index be2928061..a65e9b433 100644 --- a/SOPE/NGCards/TimeZones/America/North_Dakota/Center.ics +++ b/SOPE/NGCards/TimeZones/America/North_Dakota/Center.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/North_Dakota/Center diff --git a/SOPE/NGCards/TimeZones/America/North_Dakota/New_Salem.ics b/SOPE/NGCards/TimeZones/America/North_Dakota/New_Salem.ics index 73cd7bbe5..1e9a1830b 100644 --- a/SOPE/NGCards/TimeZones/America/North_Dakota/New_Salem.ics +++ b/SOPE/NGCards/TimeZones/America/North_Dakota/New_Salem.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/North_Dakota/New_Salem diff --git a/SOPE/NGCards/TimeZones/America/Ojinaga.ics b/SOPE/NGCards/TimeZones/America/Ojinaga.ics index 55bee6678..f5c05cc28 100644 --- a/SOPE/NGCards/TimeZones/America/Ojinaga.ics +++ b/SOPE/NGCards/TimeZones/America/Ojinaga.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Ojinaga diff --git a/SOPE/NGCards/TimeZones/America/Panama.ics b/SOPE/NGCards/TimeZones/America/Panama.ics index a69835531..b16383a1b 100644 --- a/SOPE/NGCards/TimeZones/America/Panama.ics +++ b/SOPE/NGCards/TimeZones/America/Panama.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Panama diff --git a/SOPE/NGCards/TimeZones/America/Pangnirtung.ics b/SOPE/NGCards/TimeZones/America/Pangnirtung.ics index 7be99b8e4..fbad12d5d 100644 --- a/SOPE/NGCards/TimeZones/America/Pangnirtung.ics +++ b/SOPE/NGCards/TimeZones/America/Pangnirtung.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Pangnirtung diff --git a/SOPE/NGCards/TimeZones/America/Paramaribo.ics b/SOPE/NGCards/TimeZones/America/Paramaribo.ics index 5c2a7fabd..3936d9ded 100644 --- a/SOPE/NGCards/TimeZones/America/Paramaribo.ics +++ b/SOPE/NGCards/TimeZones/America/Paramaribo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Paramaribo diff --git a/SOPE/NGCards/TimeZones/America/Phoenix.ics b/SOPE/NGCards/TimeZones/America/Phoenix.ics index 1aa6a6faa..5782a75f4 100644 --- a/SOPE/NGCards/TimeZones/America/Phoenix.ics +++ b/SOPE/NGCards/TimeZones/America/Phoenix.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Phoenix diff --git a/SOPE/NGCards/TimeZones/America/Port-au-Prince.ics b/SOPE/NGCards/TimeZones/America/Port-au-Prince.ics index 3691bc2cb..98c108e00 100644 --- a/SOPE/NGCards/TimeZones/America/Port-au-Prince.ics +++ b/SOPE/NGCards/TimeZones/America/Port-au-Prince.ics @@ -1,14 +1,22 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Port-au-Prince X-LIC-LOCATION:America/Port-au-Prince -BEGIN:STANDARD +BEGIN:DAYLIGHT TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +TZNAME:EDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:EST -DTSTART:19700101T000000 +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/America/Port_of_Spain.ics b/SOPE/NGCards/TimeZones/America/Port_of_Spain.ics index 92fc99984..3c292806a 100644 --- a/SOPE/NGCards/TimeZones/America/Port_of_Spain.ics +++ b/SOPE/NGCards/TimeZones/America/Port_of_Spain.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Port_of_Spain diff --git a/SOPE/NGCards/TimeZones/America/Porto_Velho.ics b/SOPE/NGCards/TimeZones/America/Porto_Velho.ics index ae951be97..b1346e61a 100644 --- a/SOPE/NGCards/TimeZones/America/Porto_Velho.ics +++ b/SOPE/NGCards/TimeZones/America/Porto_Velho.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Porto_Velho diff --git a/SOPE/NGCards/TimeZones/America/Puerto_Rico.ics b/SOPE/NGCards/TimeZones/America/Puerto_Rico.ics index 8ac44189a..6173826fa 100644 --- a/SOPE/NGCards/TimeZones/America/Puerto_Rico.ics +++ b/SOPE/NGCards/TimeZones/America/Puerto_Rico.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Puerto_Rico diff --git a/SOPE/NGCards/TimeZones/America/Rainy_River.ics b/SOPE/NGCards/TimeZones/America/Rainy_River.ics index e2b884054..cd03d763c 100644 --- a/SOPE/NGCards/TimeZones/America/Rainy_River.ics +++ b/SOPE/NGCards/TimeZones/America/Rainy_River.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Rainy_River diff --git a/SOPE/NGCards/TimeZones/America/Rankin_Inlet.ics b/SOPE/NGCards/TimeZones/America/Rankin_Inlet.ics index 198d44182..6d010c951 100644 --- a/SOPE/NGCards/TimeZones/America/Rankin_Inlet.ics +++ b/SOPE/NGCards/TimeZones/America/Rankin_Inlet.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Rankin_Inlet diff --git a/SOPE/NGCards/TimeZones/America/Recife.ics b/SOPE/NGCards/TimeZones/America/Recife.ics index 6e2ea9df2..485d87bbe 100644 --- a/SOPE/NGCards/TimeZones/America/Recife.ics +++ b/SOPE/NGCards/TimeZones/America/Recife.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Recife diff --git a/SOPE/NGCards/TimeZones/America/Regina.ics b/SOPE/NGCards/TimeZones/America/Regina.ics index 96460126f..92994ed4c 100644 --- a/SOPE/NGCards/TimeZones/America/Regina.ics +++ b/SOPE/NGCards/TimeZones/America/Regina.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Regina diff --git a/SOPE/NGCards/TimeZones/America/Resolute.ics b/SOPE/NGCards/TimeZones/America/Resolute.ics index d524b185c..00145bb9a 100644 --- a/SOPE/NGCards/TimeZones/America/Resolute.ics +++ b/SOPE/NGCards/TimeZones/America/Resolute.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Resolute diff --git a/SOPE/NGCards/TimeZones/America/Rio_Branco.ics b/SOPE/NGCards/TimeZones/America/Rio_Branco.ics index f638561e0..cddae8895 100644 --- a/SOPE/NGCards/TimeZones/America/Rio_Branco.ics +++ b/SOPE/NGCards/TimeZones/America/Rio_Branco.ics @@ -1,13 +1,13 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Rio_Branco X-LIC-LOCATION:America/Rio_Branco BEGIN:STANDARD -TZOFFSETFROM:-0400 -TZOFFSETTO:-0400 -TZNAME:AMT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0500 +TZNAME:ACT DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/America/Santa_Isabel.ics b/SOPE/NGCards/TimeZones/America/Santa_Isabel.ics index c8e421ab9..1468e443c 100644 --- a/SOPE/NGCards/TimeZones/America/Santa_Isabel.ics +++ b/SOPE/NGCards/TimeZones/America/Santa_Isabel.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Santa_Isabel diff --git a/SOPE/NGCards/TimeZones/America/Santarem.ics b/SOPE/NGCards/TimeZones/America/Santarem.ics index ba8ff63a2..d6d2c1b09 100644 --- a/SOPE/NGCards/TimeZones/America/Santarem.ics +++ b/SOPE/NGCards/TimeZones/America/Santarem.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Santarem diff --git a/SOPE/NGCards/TimeZones/America/Santiago.ics b/SOPE/NGCards/TimeZones/America/Santiago.ics index 8b0acbfd0..68eb0bc9a 100644 --- a/SOPE/NGCards/TimeZones/America/Santiago.ics +++ b/SOPE/NGCards/TimeZones/America/Santiago.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Santiago @@ -8,15 +8,15 @@ BEGIN:STANDARD TZOFFSETFROM:-0300 TZOFFSETTO:-0400 TZNAME:CLT -DTSTART:19700315T000000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +DTSTART:19700426T000000 +RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:-0400 TZOFFSETTO:-0300 TZNAME:CLST -DTSTART:19701011T000000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SU +DTSTART:19700906T000000 +RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SU END:DAYLIGHT END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/America/Santo_Domingo.ics b/SOPE/NGCards/TimeZones/America/Santo_Domingo.ics index 349670b6d..0587a50a1 100644 --- a/SOPE/NGCards/TimeZones/America/Santo_Domingo.ics +++ b/SOPE/NGCards/TimeZones/America/Santo_Domingo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Santo_Domingo diff --git a/SOPE/NGCards/TimeZones/America/Sao_Paulo.ics b/SOPE/NGCards/TimeZones/America/Sao_Paulo.ics index 758a423eb..7fc832d3e 100644 --- a/SOPE/NGCards/TimeZones/America/Sao_Paulo.ics +++ b/SOPE/NGCards/TimeZones/America/Sao_Paulo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Sao_Paulo diff --git a/SOPE/NGCards/TimeZones/America/Scoresbysund.ics b/SOPE/NGCards/TimeZones/America/Scoresbysund.ics index 08094020b..4bc9794e3 100644 --- a/SOPE/NGCards/TimeZones/America/Scoresbysund.ics +++ b/SOPE/NGCards/TimeZones/America/Scoresbysund.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Scoresbysund diff --git a/SOPE/NGCards/TimeZones/America/Sitka.ics b/SOPE/NGCards/TimeZones/America/Sitka.ics index 3134ecf82..0ccb73e46 100644 --- a/SOPE/NGCards/TimeZones/America/Sitka.ics +++ b/SOPE/NGCards/TimeZones/America/Sitka.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Sitka diff --git a/SOPE/NGCards/TimeZones/America/St_Barthelemy.ics b/SOPE/NGCards/TimeZones/America/St_Barthelemy.ics index 4e88bf89d..06e9c14d7 100644 --- a/SOPE/NGCards/TimeZones/America/St_Barthelemy.ics +++ b/SOPE/NGCards/TimeZones/America/St_Barthelemy.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/St_Barthelemy diff --git a/SOPE/NGCards/TimeZones/America/St_Johns.ics b/SOPE/NGCards/TimeZones/America/St_Johns.ics index be3d8b134..030fd285e 100644 --- a/SOPE/NGCards/TimeZones/America/St_Johns.ics +++ b/SOPE/NGCards/TimeZones/America/St_Johns.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/St_Johns diff --git a/SOPE/NGCards/TimeZones/America/St_Kitts.ics b/SOPE/NGCards/TimeZones/America/St_Kitts.ics index 20dc45a56..f51516d86 100644 --- a/SOPE/NGCards/TimeZones/America/St_Kitts.ics +++ b/SOPE/NGCards/TimeZones/America/St_Kitts.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/St_Kitts diff --git a/SOPE/NGCards/TimeZones/America/St_Lucia.ics b/SOPE/NGCards/TimeZones/America/St_Lucia.ics index f99308a15..e21f6d2b4 100644 --- a/SOPE/NGCards/TimeZones/America/St_Lucia.ics +++ b/SOPE/NGCards/TimeZones/America/St_Lucia.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/St_Lucia diff --git a/SOPE/NGCards/TimeZones/America/St_Thomas.ics b/SOPE/NGCards/TimeZones/America/St_Thomas.ics index ceaf36bd5..8f7537117 100644 --- a/SOPE/NGCards/TimeZones/America/St_Thomas.ics +++ b/SOPE/NGCards/TimeZones/America/St_Thomas.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/St_Thomas diff --git a/SOPE/NGCards/TimeZones/America/St_Vincent.ics b/SOPE/NGCards/TimeZones/America/St_Vincent.ics index 6820a0943..ef4162747 100644 --- a/SOPE/NGCards/TimeZones/America/St_Vincent.ics +++ b/SOPE/NGCards/TimeZones/America/St_Vincent.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/St_Vincent diff --git a/SOPE/NGCards/TimeZones/America/Swift_Current.ics b/SOPE/NGCards/TimeZones/America/Swift_Current.ics index 63a0f4193..494e0de5b 100644 --- a/SOPE/NGCards/TimeZones/America/Swift_Current.ics +++ b/SOPE/NGCards/TimeZones/America/Swift_Current.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Swift_Current diff --git a/SOPE/NGCards/TimeZones/America/Tegucigalpa.ics b/SOPE/NGCards/TimeZones/America/Tegucigalpa.ics index d3e267870..1fa6cdcbb 100644 --- a/SOPE/NGCards/TimeZones/America/Tegucigalpa.ics +++ b/SOPE/NGCards/TimeZones/America/Tegucigalpa.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Tegucigalpa diff --git a/SOPE/NGCards/TimeZones/America/Thule.ics b/SOPE/NGCards/TimeZones/America/Thule.ics index 808440609..b2d49d98c 100644 --- a/SOPE/NGCards/TimeZones/America/Thule.ics +++ b/SOPE/NGCards/TimeZones/America/Thule.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Thule diff --git a/SOPE/NGCards/TimeZones/America/Thunder_Bay.ics b/SOPE/NGCards/TimeZones/America/Thunder_Bay.ics index 9e0bd1458..90464ef84 100644 --- a/SOPE/NGCards/TimeZones/America/Thunder_Bay.ics +++ b/SOPE/NGCards/TimeZones/America/Thunder_Bay.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Thunder_Bay diff --git a/SOPE/NGCards/TimeZones/America/Tijuana.ics b/SOPE/NGCards/TimeZones/America/Tijuana.ics index 04769a097..473e4af9a 100644 --- a/SOPE/NGCards/TimeZones/America/Tijuana.ics +++ b/SOPE/NGCards/TimeZones/America/Tijuana.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Tijuana diff --git a/SOPE/NGCards/TimeZones/America/Toronto.ics b/SOPE/NGCards/TimeZones/America/Toronto.ics index 789aeefdd..c53d26b88 100644 --- a/SOPE/NGCards/TimeZones/America/Toronto.ics +++ b/SOPE/NGCards/TimeZones/America/Toronto.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Toronto diff --git a/SOPE/NGCards/TimeZones/America/Tortola.ics b/SOPE/NGCards/TimeZones/America/Tortola.ics index 999ca9654..c39aa8c85 100644 --- a/SOPE/NGCards/TimeZones/America/Tortola.ics +++ b/SOPE/NGCards/TimeZones/America/Tortola.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Tortola diff --git a/SOPE/NGCards/TimeZones/America/Vancouver.ics b/SOPE/NGCards/TimeZones/America/Vancouver.ics index 0954c1ee9..80eb33716 100644 --- a/SOPE/NGCards/TimeZones/America/Vancouver.ics +++ b/SOPE/NGCards/TimeZones/America/Vancouver.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Vancouver diff --git a/SOPE/NGCards/TimeZones/America/Whitehorse.ics b/SOPE/NGCards/TimeZones/America/Whitehorse.ics index 0774e6106..0f553b0d6 100644 --- a/SOPE/NGCards/TimeZones/America/Whitehorse.ics +++ b/SOPE/NGCards/TimeZones/America/Whitehorse.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Whitehorse diff --git a/SOPE/NGCards/TimeZones/America/Winnipeg.ics b/SOPE/NGCards/TimeZones/America/Winnipeg.ics index 19fa04852..df2ca6e03 100644 --- a/SOPE/NGCards/TimeZones/America/Winnipeg.ics +++ b/SOPE/NGCards/TimeZones/America/Winnipeg.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Winnipeg diff --git a/SOPE/NGCards/TimeZones/America/Yakutat.ics b/SOPE/NGCards/TimeZones/America/Yakutat.ics index 0e9fc4c7b..ba457acca 100644 --- a/SOPE/NGCards/TimeZones/America/Yakutat.ics +++ b/SOPE/NGCards/TimeZones/America/Yakutat.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Yakutat diff --git a/SOPE/NGCards/TimeZones/America/Yellowknife.ics b/SOPE/NGCards/TimeZones/America/Yellowknife.ics index 17d884a7d..390959b93 100644 --- a/SOPE/NGCards/TimeZones/America/Yellowknife.ics +++ b/SOPE/NGCards/TimeZones/America/Yellowknife.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/Yellowknife diff --git a/SOPE/NGCards/TimeZones/Antarctica/Casey.ics b/SOPE/NGCards/TimeZones/Antarctica/Casey.ics index a15ec0529..5615ec486 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/Casey.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/Casey.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/Casey @@ -7,7 +7,7 @@ X-LIC-LOCATION:Antarctica/Casey BEGIN:STANDARD TZOFFSETFROM:+0800 TZOFFSETTO:+0800 -TZNAME:WST +TZNAME:AWST DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Antarctica/Davis.ics b/SOPE/NGCards/TimeZones/Antarctica/Davis.ics index c7d1ae2d2..27eced8f9 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/Davis.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/Davis.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/Davis diff --git a/SOPE/NGCards/TimeZones/Antarctica/DumontDUrville.ics b/SOPE/NGCards/TimeZones/Antarctica/DumontDUrville.ics index 84c41de6b..3fdc300d2 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/DumontDUrville.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/DumontDUrville.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/DumontDUrville diff --git a/SOPE/NGCards/TimeZones/Antarctica/Macquarie.ics b/SOPE/NGCards/TimeZones/Antarctica/Macquarie.ics index cc7fa92e3..faa991e60 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/Macquarie.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/Macquarie.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/Macquarie diff --git a/SOPE/NGCards/TimeZones/Antarctica/Mawson.ics b/SOPE/NGCards/TimeZones/Antarctica/Mawson.ics index 3daa4ee13..9331d91fd 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/Mawson.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/Mawson.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/Mawson diff --git a/SOPE/NGCards/TimeZones/Antarctica/McMurdo.ics b/SOPE/NGCards/TimeZones/Antarctica/McMurdo.ics index 155b1e10b..9eeee120e 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/McMurdo.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/McMurdo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/McMurdo diff --git a/SOPE/NGCards/TimeZones/Antarctica/Palmer.ics b/SOPE/NGCards/TimeZones/Antarctica/Palmer.ics index d14dce814..1e565d30a 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/Palmer.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/Palmer.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/Palmer @@ -8,15 +8,15 @@ BEGIN:STANDARD TZOFFSETFROM:-0300 TZOFFSETTO:-0400 TZNAME:CLT -DTSTART:19700315T000000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +DTSTART:19700426T000000 +RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:-0400 TZOFFSETTO:-0300 TZNAME:CLST -DTSTART:19701011T000000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SU +DTSTART:19700906T000000 +RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SU END:DAYLIGHT END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Antarctica/Rothera.ics b/SOPE/NGCards/TimeZones/Antarctica/Rothera.ics index fb6bdb448..0638f9265 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/Rothera.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/Rothera.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/Rothera diff --git a/SOPE/NGCards/TimeZones/Antarctica/Syowa.ics b/SOPE/NGCards/TimeZones/Antarctica/Syowa.ics index a12a1ce0a..d31a6e5f3 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/Syowa.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/Syowa.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/Syowa diff --git a/SOPE/NGCards/TimeZones/Antarctica/Troll.ics b/SOPE/NGCards/TimeZones/Antarctica/Troll.ics new file mode 100644 index 000000000..e560dec5b --- /dev/null +++ b/SOPE/NGCards/TimeZones/Antarctica/Troll.ics @@ -0,0 +1,22 @@ +BEGIN:VCALENDAR +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Antarctica/Troll +X-LIC-LOCATION:Antarctica/Troll +BEGIN:DAYLIGHT +TZOFFSETFROM:+0000 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T010000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0000 +TZNAME:UTC +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +END:STANDARD +END:VTIMEZONE +END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Antarctica/Vostok.ics b/SOPE/NGCards/TimeZones/Antarctica/Vostok.ics index cbb1b01a7..ad4637ced 100644 --- a/SOPE/NGCards/TimeZones/Antarctica/Vostok.ics +++ b/SOPE/NGCards/TimeZones/Antarctica/Vostok.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Antarctica/Vostok diff --git a/SOPE/NGCards/TimeZones/Arctic/Longyearbyen.ics b/SOPE/NGCards/TimeZones/Arctic/Longyearbyen.ics index 7616d4a85..6b665b635 100644 --- a/SOPE/NGCards/TimeZones/Arctic/Longyearbyen.ics +++ b/SOPE/NGCards/TimeZones/Arctic/Longyearbyen.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Arctic/Longyearbyen diff --git a/SOPE/NGCards/TimeZones/Asia/Aden.ics b/SOPE/NGCards/TimeZones/Asia/Aden.ics index 9e76f377b..bbcc8c4ce 100644 --- a/SOPE/NGCards/TimeZones/Asia/Aden.ics +++ b/SOPE/NGCards/TimeZones/Asia/Aden.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Aden diff --git a/SOPE/NGCards/TimeZones/Asia/Almaty.ics b/SOPE/NGCards/TimeZones/Asia/Almaty.ics index 00b432ed7..850dd152e 100644 --- a/SOPE/NGCards/TimeZones/Asia/Almaty.ics +++ b/SOPE/NGCards/TimeZones/Asia/Almaty.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Almaty diff --git a/SOPE/NGCards/TimeZones/Asia/Amman.ics b/SOPE/NGCards/TimeZones/Asia/Amman.ics index 1b475278d..d869aa5a4 100644 --- a/SOPE/NGCards/TimeZones/Asia/Amman.ics +++ b/SOPE/NGCards/TimeZones/Asia/Amman.ics @@ -1,16 +1,9 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Amman X-LIC-LOCATION:Asia/Amman -BEGIN:STANDARD -TZOFFSETFROM:+0300 -TZOFFSETTO:+0200 -TZNAME:EET -DTSTART:19701030T010000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR -END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:+0200 TZOFFSETTO:+0300 @@ -18,5 +11,12 @@ TZNAME:EEST DTSTART:19700326T235959 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1TH END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0300 +TZOFFSETTO:+0200 +TZNAME:EET +DTSTART:19701030T010000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR +END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Asia/Anadyr.ics b/SOPE/NGCards/TimeZones/Asia/Anadyr.ics index 9e2472b42..e7cbc61ff 100644 --- a/SOPE/NGCards/TimeZones/Asia/Anadyr.ics +++ b/SOPE/NGCards/TimeZones/Asia/Anadyr.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Anadyr diff --git a/SOPE/NGCards/TimeZones/Asia/Aqtau.ics b/SOPE/NGCards/TimeZones/Asia/Aqtau.ics index d3fd5bcd5..02a825733 100644 --- a/SOPE/NGCards/TimeZones/Asia/Aqtau.ics +++ b/SOPE/NGCards/TimeZones/Asia/Aqtau.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Aqtau diff --git a/SOPE/NGCards/TimeZones/Asia/Aqtobe.ics b/SOPE/NGCards/TimeZones/Asia/Aqtobe.ics index 125fbf8f8..9a49eaf06 100644 --- a/SOPE/NGCards/TimeZones/Asia/Aqtobe.ics +++ b/SOPE/NGCards/TimeZones/Asia/Aqtobe.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Aqtobe diff --git a/SOPE/NGCards/TimeZones/Asia/Ashgabat.ics b/SOPE/NGCards/TimeZones/Asia/Ashgabat.ics index 844cd4762..9f029bc2d 100644 --- a/SOPE/NGCards/TimeZones/Asia/Ashgabat.ics +++ b/SOPE/NGCards/TimeZones/Asia/Ashgabat.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Ashgabat diff --git a/SOPE/NGCards/TimeZones/Asia/Baghdad.ics b/SOPE/NGCards/TimeZones/Asia/Baghdad.ics index 2677e7723..64367d789 100644 --- a/SOPE/NGCards/TimeZones/Asia/Baghdad.ics +++ b/SOPE/NGCards/TimeZones/Asia/Baghdad.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Baghdad diff --git a/SOPE/NGCards/TimeZones/Asia/Bahrain.ics b/SOPE/NGCards/TimeZones/Asia/Bahrain.ics index 141fe7ece..395ca403e 100644 --- a/SOPE/NGCards/TimeZones/Asia/Bahrain.ics +++ b/SOPE/NGCards/TimeZones/Asia/Bahrain.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Bahrain diff --git a/SOPE/NGCards/TimeZones/Asia/Baku.ics b/SOPE/NGCards/TimeZones/Asia/Baku.ics index 50280e026..c0dc191c7 100644 --- a/SOPE/NGCards/TimeZones/Asia/Baku.ics +++ b/SOPE/NGCards/TimeZones/Asia/Baku.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Baku diff --git a/SOPE/NGCards/TimeZones/Asia/Bangkok.ics b/SOPE/NGCards/TimeZones/Asia/Bangkok.ics index 1f002532e..e501819c5 100644 --- a/SOPE/NGCards/TimeZones/Asia/Bangkok.ics +++ b/SOPE/NGCards/TimeZones/Asia/Bangkok.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Bangkok diff --git a/SOPE/NGCards/TimeZones/Asia/Beirut.ics b/SOPE/NGCards/TimeZones/Asia/Beirut.ics index 0629652de..edc258d31 100644 --- a/SOPE/NGCards/TimeZones/Asia/Beirut.ics +++ b/SOPE/NGCards/TimeZones/Asia/Beirut.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Beirut diff --git a/SOPE/NGCards/TimeZones/Asia/Bishkek.ics b/SOPE/NGCards/TimeZones/Asia/Bishkek.ics index a4b212f77..e1da4ed81 100644 --- a/SOPE/NGCards/TimeZones/Asia/Bishkek.ics +++ b/SOPE/NGCards/TimeZones/Asia/Bishkek.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Bishkek diff --git a/SOPE/NGCards/TimeZones/Asia/Brunei.ics b/SOPE/NGCards/TimeZones/Asia/Brunei.ics index 79e886dd2..66ba22436 100644 --- a/SOPE/NGCards/TimeZones/Asia/Brunei.ics +++ b/SOPE/NGCards/TimeZones/Asia/Brunei.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Brunei diff --git a/SOPE/NGCards/TimeZones/Asia/Chita.ics b/SOPE/NGCards/TimeZones/Asia/Chita.ics new file mode 100644 index 000000000..0a2dc2847 --- /dev/null +++ b/SOPE/NGCards/TimeZones/Asia/Chita.ics @@ -0,0 +1,14 @@ +BEGIN:VCALENDAR +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Asia/Chita +X-LIC-LOCATION:Asia/Chita +BEGIN:STANDARD +TZOFFSETFROM:+0800 +TZOFFSETTO:+0800 +TZNAME:IRKT +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Asia/Choibalsan.ics b/SOPE/NGCards/TimeZones/Asia/Choibalsan.ics index d03a8c603..f14b157ff 100644 --- a/SOPE/NGCards/TimeZones/Asia/Choibalsan.ics +++ b/SOPE/NGCards/TimeZones/Asia/Choibalsan.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Choibalsan diff --git a/SOPE/NGCards/TimeZones/Asia/Chongqing.ics b/SOPE/NGCards/TimeZones/Asia/Chongqing.ics index 5ec12f610..10174f2fa 100644 --- a/SOPE/NGCards/TimeZones/Asia/Chongqing.ics +++ b/SOPE/NGCards/TimeZones/Asia/Chongqing.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Chongqing diff --git a/SOPE/NGCards/TimeZones/Asia/Colombo.ics b/SOPE/NGCards/TimeZones/Asia/Colombo.ics index 71bc4f566..73ebaa6d9 100644 --- a/SOPE/NGCards/TimeZones/Asia/Colombo.ics +++ b/SOPE/NGCards/TimeZones/Asia/Colombo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Colombo diff --git a/SOPE/NGCards/TimeZones/Asia/Damascus.ics b/SOPE/NGCards/TimeZones/Asia/Damascus.ics index 5269285e3..fc6ea1f52 100644 --- a/SOPE/NGCards/TimeZones/Asia/Damascus.ics +++ b/SOPE/NGCards/TimeZones/Asia/Damascus.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Damascus diff --git a/SOPE/NGCards/TimeZones/Asia/Dhaka.ics b/SOPE/NGCards/TimeZones/Asia/Dhaka.ics index 035a6a911..57066e539 100644 --- a/SOPE/NGCards/TimeZones/Asia/Dhaka.ics +++ b/SOPE/NGCards/TimeZones/Asia/Dhaka.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Dhaka diff --git a/SOPE/NGCards/TimeZones/Asia/Dili.ics b/SOPE/NGCards/TimeZones/Asia/Dili.ics index 4d2450b9a..1ba76b60e 100644 --- a/SOPE/NGCards/TimeZones/Asia/Dili.ics +++ b/SOPE/NGCards/TimeZones/Asia/Dili.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Dili diff --git a/SOPE/NGCards/TimeZones/Asia/Dubai.ics b/SOPE/NGCards/TimeZones/Asia/Dubai.ics index 0fa8f1667..f71c46ba3 100644 --- a/SOPE/NGCards/TimeZones/Asia/Dubai.ics +++ b/SOPE/NGCards/TimeZones/Asia/Dubai.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Dubai diff --git a/SOPE/NGCards/TimeZones/Asia/Dushanbe.ics b/SOPE/NGCards/TimeZones/Asia/Dushanbe.ics index fcc829d36..cad5fb2cb 100644 --- a/SOPE/NGCards/TimeZones/Asia/Dushanbe.ics +++ b/SOPE/NGCards/TimeZones/Asia/Dushanbe.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Dushanbe diff --git a/SOPE/NGCards/TimeZones/Asia/Gaza.ics b/SOPE/NGCards/TimeZones/Asia/Gaza.ics index 848e37dca..4774d9010 100644 --- a/SOPE/NGCards/TimeZones/Asia/Gaza.ics +++ b/SOPE/NGCards/TimeZones/Asia/Gaza.ics @@ -1,14 +1,22 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Gaza X-LIC-LOCATION:Asia/Gaza -BEGIN:STANDARD +BEGIN:DAYLIGHT TZOFFSETFROM:+0200 +TZOFFSETTO:+0300 +TZNAME:EEST +DTSTART:19700326T235959 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1TH +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0300 TZOFFSETTO:+0200 TZNAME:EET -DTSTART:19700101T000000 +DTSTART:19700925T000000 +RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1FR END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Asia/Harbin.ics b/SOPE/NGCards/TimeZones/Asia/Harbin.ics index 702f4e8e9..339c58f0d 100644 --- a/SOPE/NGCards/TimeZones/Asia/Harbin.ics +++ b/SOPE/NGCards/TimeZones/Asia/Harbin.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Harbin diff --git a/SOPE/NGCards/TimeZones/Asia/Hebron.ics b/SOPE/NGCards/TimeZones/Asia/Hebron.ics index 4865c4ac6..b7ed636f4 100644 --- a/SOPE/NGCards/TimeZones/Asia/Hebron.ics +++ b/SOPE/NGCards/TimeZones/Asia/Hebron.ics @@ -1,14 +1,22 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Hebron X-LIC-LOCATION:Asia/Hebron -BEGIN:STANDARD +BEGIN:DAYLIGHT TZOFFSETFROM:+0200 +TZOFFSETTO:+0300 +TZNAME:EEST +DTSTART:19700326T235959 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1TH +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0300 TZOFFSETTO:+0200 TZNAME:EET -DTSTART:19700101T000000 +DTSTART:19700925T000000 +RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1FR END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Asia/Ho_Chi_Minh.ics b/SOPE/NGCards/TimeZones/Asia/Ho_Chi_Minh.ics index 9dc7a02dd..6a6b76734 100644 --- a/SOPE/NGCards/TimeZones/Asia/Ho_Chi_Minh.ics +++ b/SOPE/NGCards/TimeZones/Asia/Ho_Chi_Minh.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Ho_Chi_Minh diff --git a/SOPE/NGCards/TimeZones/Asia/Hong_Kong.ics b/SOPE/NGCards/TimeZones/Asia/Hong_Kong.ics index 69e376e26..370c1c58e 100644 --- a/SOPE/NGCards/TimeZones/Asia/Hong_Kong.ics +++ b/SOPE/NGCards/TimeZones/Asia/Hong_Kong.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Hong_Kong diff --git a/SOPE/NGCards/TimeZones/Asia/Hovd.ics b/SOPE/NGCards/TimeZones/Asia/Hovd.ics index 29cc1be54..4edacf30c 100644 --- a/SOPE/NGCards/TimeZones/Asia/Hovd.ics +++ b/SOPE/NGCards/TimeZones/Asia/Hovd.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Hovd diff --git a/SOPE/NGCards/TimeZones/Asia/Irkutsk.ics b/SOPE/NGCards/TimeZones/Asia/Irkutsk.ics index 22bce1e15..34d6aec6f 100644 --- a/SOPE/NGCards/TimeZones/Asia/Irkutsk.ics +++ b/SOPE/NGCards/TimeZones/Asia/Irkutsk.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Irkutsk X-LIC-LOCATION:Asia/Irkutsk BEGIN:STANDARD -TZOFFSETFROM:+0900 -TZOFFSETTO:+0900 +TZOFFSETFROM:+0800 +TZOFFSETTO:+0800 TZNAME:IRKT DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Asia/Istanbul.ics b/SOPE/NGCards/TimeZones/Asia/Istanbul.ics index 804de5b1b..101552931 100644 --- a/SOPE/NGCards/TimeZones/Asia/Istanbul.ics +++ b/SOPE/NGCards/TimeZones/Asia/Istanbul.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Istanbul diff --git a/SOPE/NGCards/TimeZones/Asia/Jakarta.ics b/SOPE/NGCards/TimeZones/Asia/Jakarta.ics index 36d91bfaa..1b5c0932a 100644 --- a/SOPE/NGCards/TimeZones/Asia/Jakarta.ics +++ b/SOPE/NGCards/TimeZones/Asia/Jakarta.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Jakarta @@ -7,7 +7,7 @@ X-LIC-LOCATION:Asia/Jakarta BEGIN:STANDARD TZOFFSETFROM:+0700 TZOFFSETTO:+0700 -TZNAME:WIT +TZNAME:WIB DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Asia/Jayapura.ics b/SOPE/NGCards/TimeZones/Asia/Jayapura.ics index da1273060..fbc00784c 100644 --- a/SOPE/NGCards/TimeZones/Asia/Jayapura.ics +++ b/SOPE/NGCards/TimeZones/Asia/Jayapura.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Jayapura @@ -7,7 +7,7 @@ X-LIC-LOCATION:Asia/Jayapura BEGIN:STANDARD TZOFFSETFROM:+0900 TZOFFSETTO:+0900 -TZNAME:EIT +TZNAME:WIT DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Asia/Jerusalem.ics b/SOPE/NGCards/TimeZones/Asia/Jerusalem.ics index 07cd14b37..dcbf988cf 100644 --- a/SOPE/NGCards/TimeZones/Asia/Jerusalem.ics +++ b/SOPE/NGCards/TimeZones/Asia/Jerusalem.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Jerusalem @@ -12,11 +12,11 @@ DTSTART:19700327T020000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR END:DAYLIGHT BEGIN:STANDARD -TZOFFSETFROM:+0200 +TZOFFSETFROM:+0300 TZOFFSETTO:+0200 TZNAME:IST -DTSTART:19701004T020000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU +DTSTART:19701025T020000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Asia/Kabul.ics b/SOPE/NGCards/TimeZones/Asia/Kabul.ics index 782574233..72cd088f9 100644 --- a/SOPE/NGCards/TimeZones/Asia/Kabul.ics +++ b/SOPE/NGCards/TimeZones/Asia/Kabul.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Kabul diff --git a/SOPE/NGCards/TimeZones/Asia/Kamchatka.ics b/SOPE/NGCards/TimeZones/Asia/Kamchatka.ics index bb739dfc2..4dff1e192 100644 --- a/SOPE/NGCards/TimeZones/Asia/Kamchatka.ics +++ b/SOPE/NGCards/TimeZones/Asia/Kamchatka.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Kamchatka diff --git a/SOPE/NGCards/TimeZones/Asia/Karachi.ics b/SOPE/NGCards/TimeZones/Asia/Karachi.ics index cf453fbd7..e6fb05d55 100644 --- a/SOPE/NGCards/TimeZones/Asia/Karachi.ics +++ b/SOPE/NGCards/TimeZones/Asia/Karachi.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Karachi diff --git a/SOPE/NGCards/TimeZones/Asia/Kashgar.ics b/SOPE/NGCards/TimeZones/Asia/Kashgar.ics index 9bdcb4577..0640cd0c3 100644 --- a/SOPE/NGCards/TimeZones/Asia/Kashgar.ics +++ b/SOPE/NGCards/TimeZones/Asia/Kashgar.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Kashgar diff --git a/SOPE/NGCards/TimeZones/Asia/Kathmandu.ics b/SOPE/NGCards/TimeZones/Asia/Kathmandu.ics index c1274a577..63c5df266 100644 --- a/SOPE/NGCards/TimeZones/Asia/Kathmandu.ics +++ b/SOPE/NGCards/TimeZones/Asia/Kathmandu.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Kathmandu diff --git a/SOPE/NGCards/TimeZones/Asia/Khandyga.ics b/SOPE/NGCards/TimeZones/Asia/Khandyga.ics new file mode 100644 index 000000000..c6748f928 --- /dev/null +++ b/SOPE/NGCards/TimeZones/Asia/Khandyga.ics @@ -0,0 +1,14 @@ +BEGIN:VCALENDAR +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Asia/Khandyga +X-LIC-LOCATION:Asia/Khandyga +BEGIN:STANDARD +TZOFFSETFROM:+0900 +TZOFFSETTO:+0900 +TZNAME:YAKT +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Asia/Kolkata.ics b/SOPE/NGCards/TimeZones/Asia/Kolkata.ics index 5cf13334e..b6ba22d3d 100644 --- a/SOPE/NGCards/TimeZones/Asia/Kolkata.ics +++ b/SOPE/NGCards/TimeZones/Asia/Kolkata.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Kolkata diff --git a/SOPE/NGCards/TimeZones/Asia/Krasnoyarsk.ics b/SOPE/NGCards/TimeZones/Asia/Krasnoyarsk.ics index 276e43b18..0e6b6866b 100644 --- a/SOPE/NGCards/TimeZones/Asia/Krasnoyarsk.ics +++ b/SOPE/NGCards/TimeZones/Asia/Krasnoyarsk.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Krasnoyarsk X-LIC-LOCATION:Asia/Krasnoyarsk BEGIN:STANDARD -TZOFFSETFROM:+0800 -TZOFFSETTO:+0800 +TZOFFSETFROM:+0700 +TZOFFSETTO:+0700 TZNAME:KRAT DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Asia/Kuala_Lumpur.ics b/SOPE/NGCards/TimeZones/Asia/Kuala_Lumpur.ics index c4de7b39c..7bf14910d 100644 --- a/SOPE/NGCards/TimeZones/Asia/Kuala_Lumpur.ics +++ b/SOPE/NGCards/TimeZones/Asia/Kuala_Lumpur.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Kuala_Lumpur diff --git a/SOPE/NGCards/TimeZones/Asia/Kuching.ics b/SOPE/NGCards/TimeZones/Asia/Kuching.ics index d08a28f64..e1fc44674 100644 --- a/SOPE/NGCards/TimeZones/Asia/Kuching.ics +++ b/SOPE/NGCards/TimeZones/Asia/Kuching.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Kuching diff --git a/SOPE/NGCards/TimeZones/Asia/Kuwait.ics b/SOPE/NGCards/TimeZones/Asia/Kuwait.ics index 16a660077..a4d31b96b 100644 --- a/SOPE/NGCards/TimeZones/Asia/Kuwait.ics +++ b/SOPE/NGCards/TimeZones/Asia/Kuwait.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Kuwait diff --git a/SOPE/NGCards/TimeZones/Asia/Macau.ics b/SOPE/NGCards/TimeZones/Asia/Macau.ics index dc7a62967..d437cbe58 100644 --- a/SOPE/NGCards/TimeZones/Asia/Macau.ics +++ b/SOPE/NGCards/TimeZones/Asia/Macau.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Macau diff --git a/SOPE/NGCards/TimeZones/Asia/Magadan.ics b/SOPE/NGCards/TimeZones/Asia/Magadan.ics index 9bacf7804..f6f1831fe 100644 --- a/SOPE/NGCards/TimeZones/Asia/Magadan.ics +++ b/SOPE/NGCards/TimeZones/Asia/Magadan.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Magadan X-LIC-LOCATION:Asia/Magadan BEGIN:STANDARD -TZOFFSETFROM:+1200 -TZOFFSETTO:+1200 +TZOFFSETFROM:+1000 +TZOFFSETTO:+1000 TZNAME:MAGT DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Asia/Makassar.ics b/SOPE/NGCards/TimeZones/Asia/Makassar.ics index 2c0329db6..995f6fbfb 100644 --- a/SOPE/NGCards/TimeZones/Asia/Makassar.ics +++ b/SOPE/NGCards/TimeZones/Asia/Makassar.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Makassar @@ -7,7 +7,7 @@ X-LIC-LOCATION:Asia/Makassar BEGIN:STANDARD TZOFFSETFROM:+0800 TZOFFSETTO:+0800 -TZNAME:CIT +TZNAME:WITA DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Asia/Manila.ics b/SOPE/NGCards/TimeZones/Asia/Manila.ics index ea4fc2c35..1283ed083 100644 --- a/SOPE/NGCards/TimeZones/Asia/Manila.ics +++ b/SOPE/NGCards/TimeZones/Asia/Manila.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Manila diff --git a/SOPE/NGCards/TimeZones/Asia/Muscat.ics b/SOPE/NGCards/TimeZones/Asia/Muscat.ics index 92257be82..103cf8e00 100644 --- a/SOPE/NGCards/TimeZones/Asia/Muscat.ics +++ b/SOPE/NGCards/TimeZones/Asia/Muscat.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Muscat diff --git a/SOPE/NGCards/TimeZones/Asia/Nicosia.ics b/SOPE/NGCards/TimeZones/Asia/Nicosia.ics index 5d7390266..e935fc316 100644 --- a/SOPE/NGCards/TimeZones/Asia/Nicosia.ics +++ b/SOPE/NGCards/TimeZones/Asia/Nicosia.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Nicosia diff --git a/SOPE/NGCards/TimeZones/Asia/Novokuznetsk.ics b/SOPE/NGCards/TimeZones/Asia/Novokuznetsk.ics index bd39547ae..44fab38ff 100644 --- a/SOPE/NGCards/TimeZones/Asia/Novokuznetsk.ics +++ b/SOPE/NGCards/TimeZones/Asia/Novokuznetsk.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Novokuznetsk @@ -7,7 +7,7 @@ X-LIC-LOCATION:Asia/Novokuznetsk BEGIN:STANDARD TZOFFSETFROM:+0700 TZOFFSETTO:+0700 -TZNAME:NOVT +TZNAME:KRAT DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Asia/Novosibirsk.ics b/SOPE/NGCards/TimeZones/Asia/Novosibirsk.ics index c6ead1abb..b990bac67 100644 --- a/SOPE/NGCards/TimeZones/Asia/Novosibirsk.ics +++ b/SOPE/NGCards/TimeZones/Asia/Novosibirsk.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Novosibirsk X-LIC-LOCATION:Asia/Novosibirsk BEGIN:STANDARD -TZOFFSETFROM:+0700 -TZOFFSETTO:+0700 +TZOFFSETFROM:+0600 +TZOFFSETTO:+0600 TZNAME:NOVT DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Asia/Omsk.ics b/SOPE/NGCards/TimeZones/Asia/Omsk.ics index 8f979338f..6b1dc7288 100644 --- a/SOPE/NGCards/TimeZones/Asia/Omsk.ics +++ b/SOPE/NGCards/TimeZones/Asia/Omsk.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Omsk X-LIC-LOCATION:Asia/Omsk BEGIN:STANDARD -TZOFFSETFROM:+0700 -TZOFFSETTO:+0700 +TZOFFSETFROM:+0600 +TZOFFSETTO:+0600 TZNAME:OMST DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Asia/Oral.ics b/SOPE/NGCards/TimeZones/Asia/Oral.ics index dd73bf3a2..8966be533 100644 --- a/SOPE/NGCards/TimeZones/Asia/Oral.ics +++ b/SOPE/NGCards/TimeZones/Asia/Oral.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Oral diff --git a/SOPE/NGCards/TimeZones/Asia/Phnom_Penh.ics b/SOPE/NGCards/TimeZones/Asia/Phnom_Penh.ics index 67cb44e24..a555365de 100644 --- a/SOPE/NGCards/TimeZones/Asia/Phnom_Penh.ics +++ b/SOPE/NGCards/TimeZones/Asia/Phnom_Penh.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Phnom_Penh diff --git a/SOPE/NGCards/TimeZones/Asia/Pontianak.ics b/SOPE/NGCards/TimeZones/Asia/Pontianak.ics index 77e0ff294..c81e4f09f 100644 --- a/SOPE/NGCards/TimeZones/Asia/Pontianak.ics +++ b/SOPE/NGCards/TimeZones/Asia/Pontianak.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Pontianak @@ -7,7 +7,7 @@ X-LIC-LOCATION:Asia/Pontianak BEGIN:STANDARD TZOFFSETFROM:+0700 TZOFFSETTO:+0700 -TZNAME:WIT +TZNAME:WIB DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Asia/Pyongyang.ics b/SOPE/NGCards/TimeZones/Asia/Pyongyang.ics index 76f09c97e..891d34b52 100644 --- a/SOPE/NGCards/TimeZones/Asia/Pyongyang.ics +++ b/SOPE/NGCards/TimeZones/Asia/Pyongyang.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Pyongyang diff --git a/SOPE/NGCards/TimeZones/Asia/Qatar.ics b/SOPE/NGCards/TimeZones/Asia/Qatar.ics index 16a258049..73c54bc8c 100644 --- a/SOPE/NGCards/TimeZones/Asia/Qatar.ics +++ b/SOPE/NGCards/TimeZones/Asia/Qatar.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Qatar diff --git a/SOPE/NGCards/TimeZones/Asia/Qyzylorda.ics b/SOPE/NGCards/TimeZones/Asia/Qyzylorda.ics index 5afde0859..b80f4c994 100644 --- a/SOPE/NGCards/TimeZones/Asia/Qyzylorda.ics +++ b/SOPE/NGCards/TimeZones/Asia/Qyzylorda.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Qyzylorda diff --git a/SOPE/NGCards/TimeZones/Asia/Rangoon.ics b/SOPE/NGCards/TimeZones/Asia/Rangoon.ics index 5152279f2..9dfd88f04 100644 --- a/SOPE/NGCards/TimeZones/Asia/Rangoon.ics +++ b/SOPE/NGCards/TimeZones/Asia/Rangoon.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Rangoon diff --git a/SOPE/NGCards/TimeZones/Asia/Riyadh.ics b/SOPE/NGCards/TimeZones/Asia/Riyadh.ics index 065817eea..99e4095e2 100644 --- a/SOPE/NGCards/TimeZones/Asia/Riyadh.ics +++ b/SOPE/NGCards/TimeZones/Asia/Riyadh.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Riyadh diff --git a/SOPE/NGCards/TimeZones/Asia/Sakhalin.ics b/SOPE/NGCards/TimeZones/Asia/Sakhalin.ics index ef0988617..b5a09f49c 100644 --- a/SOPE/NGCards/TimeZones/Asia/Sakhalin.ics +++ b/SOPE/NGCards/TimeZones/Asia/Sakhalin.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Sakhalin X-LIC-LOCATION:Asia/Sakhalin BEGIN:STANDARD -TZOFFSETFROM:+1100 -TZOFFSETTO:+1100 +TZOFFSETFROM:+1000 +TZOFFSETTO:+1000 TZNAME:SAKT DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Asia/Samarkand.ics b/SOPE/NGCards/TimeZones/Asia/Samarkand.ics index 9d26335d6..98d868047 100644 --- a/SOPE/NGCards/TimeZones/Asia/Samarkand.ics +++ b/SOPE/NGCards/TimeZones/Asia/Samarkand.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Samarkand diff --git a/SOPE/NGCards/TimeZones/Asia/Seoul.ics b/SOPE/NGCards/TimeZones/Asia/Seoul.ics index b6162ab09..639a652b3 100644 --- a/SOPE/NGCards/TimeZones/Asia/Seoul.ics +++ b/SOPE/NGCards/TimeZones/Asia/Seoul.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Seoul diff --git a/SOPE/NGCards/TimeZones/Asia/Shanghai.ics b/SOPE/NGCards/TimeZones/Asia/Shanghai.ics index 5fb8506ca..d3608584f 100644 --- a/SOPE/NGCards/TimeZones/Asia/Shanghai.ics +++ b/SOPE/NGCards/TimeZones/Asia/Shanghai.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Shanghai diff --git a/SOPE/NGCards/TimeZones/Asia/Singapore.ics b/SOPE/NGCards/TimeZones/Asia/Singapore.ics index 11ccf7e42..ad8c12528 100644 --- a/SOPE/NGCards/TimeZones/Asia/Singapore.ics +++ b/SOPE/NGCards/TimeZones/Asia/Singapore.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Singapore diff --git a/SOPE/NGCards/TimeZones/Asia/Srednekolymsk.ics b/SOPE/NGCards/TimeZones/Asia/Srednekolymsk.ics new file mode 100644 index 000000000..923d7119b --- /dev/null +++ b/SOPE/NGCards/TimeZones/Asia/Srednekolymsk.ics @@ -0,0 +1,14 @@ +BEGIN:VCALENDAR +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Asia/Srednekolymsk +X-LIC-LOCATION:Asia/Srednekolymsk +BEGIN:STANDARD +TZOFFSETFROM:+1100 +TZOFFSETTO:+1100 +TZNAME:SRET +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Asia/Taipei.ics b/SOPE/NGCards/TimeZones/Asia/Taipei.ics index 6b32f8266..0e2da0469 100644 --- a/SOPE/NGCards/TimeZones/Asia/Taipei.ics +++ b/SOPE/NGCards/TimeZones/Asia/Taipei.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Taipei diff --git a/SOPE/NGCards/TimeZones/Asia/Tashkent.ics b/SOPE/NGCards/TimeZones/Asia/Tashkent.ics index d9616b716..a413b5dab 100644 --- a/SOPE/NGCards/TimeZones/Asia/Tashkent.ics +++ b/SOPE/NGCards/TimeZones/Asia/Tashkent.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Tashkent diff --git a/SOPE/NGCards/TimeZones/Asia/Tbilisi.ics b/SOPE/NGCards/TimeZones/Asia/Tbilisi.ics index 529648d01..dc2ce7654 100644 --- a/SOPE/NGCards/TimeZones/Asia/Tbilisi.ics +++ b/SOPE/NGCards/TimeZones/Asia/Tbilisi.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Tbilisi diff --git a/SOPE/NGCards/TimeZones/Asia/Tehran.ics b/SOPE/NGCards/TimeZones/Asia/Tehran.ics index 353382091..5d4fe700f 100644 --- a/SOPE/NGCards/TimeZones/Asia/Tehran.ics +++ b/SOPE/NGCards/TimeZones/Asia/Tehran.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Tehran diff --git a/SOPE/NGCards/TimeZones/Asia/Thimphu.ics b/SOPE/NGCards/TimeZones/Asia/Thimphu.ics index e0fc77b18..a910c1e15 100644 --- a/SOPE/NGCards/TimeZones/Asia/Thimphu.ics +++ b/SOPE/NGCards/TimeZones/Asia/Thimphu.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Thimphu diff --git a/SOPE/NGCards/TimeZones/Asia/Tokyo.ics b/SOPE/NGCards/TimeZones/Asia/Tokyo.ics index 901af164e..9bafe558d 100644 --- a/SOPE/NGCards/TimeZones/Asia/Tokyo.ics +++ b/SOPE/NGCards/TimeZones/Asia/Tokyo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Tokyo diff --git a/SOPE/NGCards/TimeZones/Asia/Ulaanbaatar.ics b/SOPE/NGCards/TimeZones/Asia/Ulaanbaatar.ics index 75ab91a82..7f9841450 100644 --- a/SOPE/NGCards/TimeZones/Asia/Ulaanbaatar.ics +++ b/SOPE/NGCards/TimeZones/Asia/Ulaanbaatar.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Ulaanbaatar diff --git a/SOPE/NGCards/TimeZones/Asia/Urumqi.ics b/SOPE/NGCards/TimeZones/Asia/Urumqi.ics index 659eae551..aac45f973 100644 --- a/SOPE/NGCards/TimeZones/Asia/Urumqi.ics +++ b/SOPE/NGCards/TimeZones/Asia/Urumqi.ics @@ -1,13 +1,13 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Urumqi X-LIC-LOCATION:Asia/Urumqi BEGIN:STANDARD -TZOFFSETFROM:+0800 -TZOFFSETTO:+0800 -TZNAME:CST +TZOFFSETFROM:+0600 +TZOFFSETTO:+0600 +TZNAME:XJT DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Asia/Ust-Nera.ics b/SOPE/NGCards/TimeZones/Asia/Ust-Nera.ics new file mode 100644 index 000000000..f2074d8c5 --- /dev/null +++ b/SOPE/NGCards/TimeZones/Asia/Ust-Nera.ics @@ -0,0 +1,14 @@ +BEGIN:VCALENDAR +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Asia/Ust-Nera +X-LIC-LOCATION:Asia/Ust-Nera +BEGIN:STANDARD +TZOFFSETFROM:+1000 +TZOFFSETTO:+1000 +TZNAME:VLAT +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Asia/Vientiane.ics b/SOPE/NGCards/TimeZones/Asia/Vientiane.ics index db6511537..c203d40d3 100644 --- a/SOPE/NGCards/TimeZones/Asia/Vientiane.ics +++ b/SOPE/NGCards/TimeZones/Asia/Vientiane.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Vientiane diff --git a/SOPE/NGCards/TimeZones/Asia/Vladivostok.ics b/SOPE/NGCards/TimeZones/Asia/Vladivostok.ics index d92e88ed8..0a2d901de 100644 --- a/SOPE/NGCards/TimeZones/Asia/Vladivostok.ics +++ b/SOPE/NGCards/TimeZones/Asia/Vladivostok.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Vladivostok X-LIC-LOCATION:Asia/Vladivostok BEGIN:STANDARD -TZOFFSETFROM:+1100 -TZOFFSETTO:+1100 +TZOFFSETFROM:+1000 +TZOFFSETTO:+1000 TZNAME:VLAT DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Asia/Yakutsk.ics b/SOPE/NGCards/TimeZones/Asia/Yakutsk.ics index 1396c45ff..735464d28 100644 --- a/SOPE/NGCards/TimeZones/Asia/Yakutsk.ics +++ b/SOPE/NGCards/TimeZones/Asia/Yakutsk.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Yakutsk X-LIC-LOCATION:Asia/Yakutsk BEGIN:STANDARD -TZOFFSETFROM:+1000 -TZOFFSETTO:+1000 +TZOFFSETFROM:+0900 +TZOFFSETTO:+0900 TZNAME:YAKT DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Asia/Yekaterinburg.ics b/SOPE/NGCards/TimeZones/Asia/Yekaterinburg.ics index 8eb26bc5e..5aa0e25ea 100644 --- a/SOPE/NGCards/TimeZones/Asia/Yekaterinburg.ics +++ b/SOPE/NGCards/TimeZones/Asia/Yekaterinburg.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Yekaterinburg X-LIC-LOCATION:Asia/Yekaterinburg BEGIN:STANDARD -TZOFFSETFROM:+0600 -TZOFFSETTO:+0600 +TZOFFSETFROM:+0500 +TZOFFSETTO:+0500 TZNAME:YEKT DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Asia/Yerevan.ics b/SOPE/NGCards/TimeZones/Asia/Yerevan.ics index c9965e090..6cd99027b 100644 --- a/SOPE/NGCards/TimeZones/Asia/Yerevan.ics +++ b/SOPE/NGCards/TimeZones/Asia/Yerevan.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Asia/Yerevan diff --git a/SOPE/NGCards/TimeZones/Atlantic/Azores.ics b/SOPE/NGCards/TimeZones/Atlantic/Azores.ics index 21b9ab9fb..773a6066a 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/Azores.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/Azores.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/Azores diff --git a/SOPE/NGCards/TimeZones/Atlantic/Bermuda.ics b/SOPE/NGCards/TimeZones/Atlantic/Bermuda.ics index e7bb1e618..5d97b738c 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/Bermuda.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/Bermuda.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/Bermuda diff --git a/SOPE/NGCards/TimeZones/Atlantic/Canary.ics b/SOPE/NGCards/TimeZones/Atlantic/Canary.ics index 4bad5b47d..32a3a98cb 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/Canary.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/Canary.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/Canary diff --git a/SOPE/NGCards/TimeZones/Atlantic/Cape_Verde.ics b/SOPE/NGCards/TimeZones/Atlantic/Cape_Verde.ics index 873e22548..01d628ba5 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/Cape_Verde.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/Cape_Verde.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/Cape_Verde diff --git a/SOPE/NGCards/TimeZones/Atlantic/Faroe.ics b/SOPE/NGCards/TimeZones/Atlantic/Faroe.ics index f4a311925..dabaca66f 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/Faroe.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/Faroe.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/Faroe diff --git a/SOPE/NGCards/TimeZones/Atlantic/Madeira.ics b/SOPE/NGCards/TimeZones/Atlantic/Madeira.ics index a91fa1210..5ee088c5c 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/Madeira.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/Madeira.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/Madeira diff --git a/SOPE/NGCards/TimeZones/Atlantic/Reykjavik.ics b/SOPE/NGCards/TimeZones/Atlantic/Reykjavik.ics index 22933a425..0e559492f 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/Reykjavik.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/Reykjavik.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/Reykjavik diff --git a/SOPE/NGCards/TimeZones/Atlantic/South_Georgia.ics b/SOPE/NGCards/TimeZones/Atlantic/South_Georgia.ics index ea25f37ef..d3722b4ba 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/South_Georgia.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/South_Georgia.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/South_Georgia diff --git a/SOPE/NGCards/TimeZones/Atlantic/St_Helena.ics b/SOPE/NGCards/TimeZones/Atlantic/St_Helena.ics index 73f201155..7a68d92f3 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/St_Helena.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/St_Helena.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/St_Helena diff --git a/SOPE/NGCards/TimeZones/Atlantic/Stanley.ics b/SOPE/NGCards/TimeZones/Atlantic/Stanley.ics index fd6963380..51b3953c7 100644 --- a/SOPE/NGCards/TimeZones/Atlantic/Stanley.ics +++ b/SOPE/NGCards/TimeZones/Atlantic/Stanley.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Atlantic/Stanley diff --git a/SOPE/NGCards/TimeZones/Australia/Adelaide.ics b/SOPE/NGCards/TimeZones/Australia/Adelaide.ics index b18150ef1..66b3ac307 100644 --- a/SOPE/NGCards/TimeZones/Australia/Adelaide.ics +++ b/SOPE/NGCards/TimeZones/Australia/Adelaide.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Adelaide @@ -7,14 +7,14 @@ X-LIC-LOCATION:Australia/Adelaide BEGIN:STANDARD TZOFFSETFROM:+1030 TZOFFSETTO:+0930 -TZNAME:CST +TZNAME:ACST DTSTART:19700405T030000 RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:+0930 TZOFFSETTO:+1030 -TZNAME:CST +TZNAME:ACDT DTSTART:19701004T020000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU END:DAYLIGHT diff --git a/SOPE/NGCards/TimeZones/Australia/Brisbane.ics b/SOPE/NGCards/TimeZones/Australia/Brisbane.ics index 41d7d128e..7a45ea91c 100644 --- a/SOPE/NGCards/TimeZones/Australia/Brisbane.ics +++ b/SOPE/NGCards/TimeZones/Australia/Brisbane.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Brisbane @@ -7,7 +7,7 @@ X-LIC-LOCATION:Australia/Brisbane BEGIN:STANDARD TZOFFSETFROM:+1000 TZOFFSETTO:+1000 -TZNAME:EST +TZNAME:AEST DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Australia/Broken_Hill.ics b/SOPE/NGCards/TimeZones/Australia/Broken_Hill.ics index 1596260f2..907cc1e5e 100644 --- a/SOPE/NGCards/TimeZones/Australia/Broken_Hill.ics +++ b/SOPE/NGCards/TimeZones/Australia/Broken_Hill.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Broken_Hill @@ -7,14 +7,14 @@ X-LIC-LOCATION:Australia/Broken_Hill BEGIN:STANDARD TZOFFSETFROM:+1030 TZOFFSETTO:+0930 -TZNAME:CST +TZNAME:ACST DTSTART:19700405T030000 RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:+0930 TZOFFSETTO:+1030 -TZNAME:CST +TZNAME:ACDT DTSTART:19701004T020000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU END:DAYLIGHT diff --git a/SOPE/NGCards/TimeZones/Australia/Currie.ics b/SOPE/NGCards/TimeZones/Australia/Currie.ics index bf8ebfdb3..ef930e5b9 100644 --- a/SOPE/NGCards/TimeZones/Australia/Currie.ics +++ b/SOPE/NGCards/TimeZones/Australia/Currie.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Currie @@ -7,14 +7,14 @@ X-LIC-LOCATION:Australia/Currie BEGIN:DAYLIGHT TZOFFSETFROM:+1000 TZOFFSETTO:+1100 -TZNAME:EST +TZNAME:AEDT DTSTART:19701004T020000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+1100 TZOFFSETTO:+1000 -TZNAME:EST +TZNAME:AEST DTSTART:19700405T030000 RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Australia/Darwin.ics b/SOPE/NGCards/TimeZones/Australia/Darwin.ics index 1adf7de3d..7fa76ef0b 100644 --- a/SOPE/NGCards/TimeZones/Australia/Darwin.ics +++ b/SOPE/NGCards/TimeZones/Australia/Darwin.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Darwin @@ -7,7 +7,7 @@ X-LIC-LOCATION:Australia/Darwin BEGIN:STANDARD TZOFFSETFROM:+0930 TZOFFSETTO:+0930 -TZNAME:CST +TZNAME:ACST DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Australia/Eucla.ics b/SOPE/NGCards/TimeZones/Australia/Eucla.ics index 557d522d4..6005ce50b 100644 --- a/SOPE/NGCards/TimeZones/Australia/Eucla.ics +++ b/SOPE/NGCards/TimeZones/Australia/Eucla.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Eucla @@ -7,7 +7,7 @@ X-LIC-LOCATION:Australia/Eucla BEGIN:STANDARD TZOFFSETFROM:+0845 TZOFFSETTO:+0845 -TZNAME:CWST +TZNAME:ACWST DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Australia/Hobart.ics b/SOPE/NGCards/TimeZones/Australia/Hobart.ics index 87636b62f..978063408 100644 --- a/SOPE/NGCards/TimeZones/Australia/Hobart.ics +++ b/SOPE/NGCards/TimeZones/Australia/Hobart.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Hobart @@ -7,14 +7,14 @@ X-LIC-LOCATION:Australia/Hobart BEGIN:DAYLIGHT TZOFFSETFROM:+1000 TZOFFSETTO:+1100 -TZNAME:EST +TZNAME:AEDT DTSTART:19701004T020000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+1100 TZOFFSETTO:+1000 -TZNAME:EST +TZNAME:AEST DTSTART:19700405T030000 RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Australia/Lindeman.ics b/SOPE/NGCards/TimeZones/Australia/Lindeman.ics index eebac0d60..cfe9cdf50 100644 --- a/SOPE/NGCards/TimeZones/Australia/Lindeman.ics +++ b/SOPE/NGCards/TimeZones/Australia/Lindeman.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Lindeman @@ -7,7 +7,7 @@ X-LIC-LOCATION:Australia/Lindeman BEGIN:STANDARD TZOFFSETFROM:+1000 TZOFFSETTO:+1000 -TZNAME:EST +TZNAME:AEST DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Australia/Lord_Howe.ics b/SOPE/NGCards/TimeZones/Australia/Lord_Howe.ics index e3d6fc1d6..3340d9e96 100644 --- a/SOPE/NGCards/TimeZones/Australia/Lord_Howe.ics +++ b/SOPE/NGCards/TimeZones/Australia/Lord_Howe.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Lord_Howe @@ -14,7 +14,7 @@ END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:+1030 TZOFFSETTO:+1100 -TZNAME:LHST +TZNAME:LHDT DTSTART:19701004T020000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU END:DAYLIGHT diff --git a/SOPE/NGCards/TimeZones/Australia/Melbourne.ics b/SOPE/NGCards/TimeZones/Australia/Melbourne.ics index 289ac67a6..a7bb35647 100644 --- a/SOPE/NGCards/TimeZones/Australia/Melbourne.ics +++ b/SOPE/NGCards/TimeZones/Australia/Melbourne.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Melbourne @@ -7,14 +7,14 @@ X-LIC-LOCATION:Australia/Melbourne BEGIN:STANDARD TZOFFSETFROM:+1100 TZOFFSETTO:+1000 -TZNAME:EST +TZNAME:AEST DTSTART:19700405T030000 RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:+1000 TZOFFSETTO:+1100 -TZNAME:EST +TZNAME:AEDT DTSTART:19701004T020000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU END:DAYLIGHT diff --git a/SOPE/NGCards/TimeZones/Australia/Perth.ics b/SOPE/NGCards/TimeZones/Australia/Perth.ics index 5a8ae1b33..ec00a350c 100644 --- a/SOPE/NGCards/TimeZones/Australia/Perth.ics +++ b/SOPE/NGCards/TimeZones/Australia/Perth.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Perth @@ -7,7 +7,7 @@ X-LIC-LOCATION:Australia/Perth BEGIN:STANDARD TZOFFSETFROM:+0800 TZOFFSETTO:+0800 -TZNAME:WST +TZNAME:AWST DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Australia/Sydney.ics b/SOPE/NGCards/TimeZones/Australia/Sydney.ics index 636dc54c1..0a0642f03 100644 --- a/SOPE/NGCards/TimeZones/Australia/Sydney.ics +++ b/SOPE/NGCards/TimeZones/Australia/Sydney.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Australia/Sydney @@ -7,14 +7,14 @@ X-LIC-LOCATION:Australia/Sydney BEGIN:STANDARD TZOFFSETFROM:+1100 TZOFFSETTO:+1000 -TZNAME:EST +TZNAME:AEST DTSTART:19700405T030000 RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:+1000 TZOFFSETTO:+1100 -TZNAME:EST +TZNAME:AEDT DTSTART:19701004T020000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU END:DAYLIGHT diff --git a/SOPE/NGCards/TimeZones/Europe/Amsterdam.ics b/SOPE/NGCards/TimeZones/Europe/Amsterdam.ics index 9a38a036b..c468d8849 100644 --- a/SOPE/NGCards/TimeZones/Europe/Amsterdam.ics +++ b/SOPE/NGCards/TimeZones/Europe/Amsterdam.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Amsterdam diff --git a/SOPE/NGCards/TimeZones/Europe/Andorra.ics b/SOPE/NGCards/TimeZones/Europe/Andorra.ics index 310d7f10d..b446891e2 100644 --- a/SOPE/NGCards/TimeZones/Europe/Andorra.ics +++ b/SOPE/NGCards/TimeZones/Europe/Andorra.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Andorra diff --git a/SOPE/NGCards/TimeZones/Europe/Athens.ics b/SOPE/NGCards/TimeZones/Europe/Athens.ics index 99fe600e4..8f8950747 100644 --- a/SOPE/NGCards/TimeZones/Europe/Athens.ics +++ b/SOPE/NGCards/TimeZones/Europe/Athens.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Athens diff --git a/SOPE/NGCards/TimeZones/Europe/Belgrade.ics b/SOPE/NGCards/TimeZones/Europe/Belgrade.ics index b74f4b374..ecdf3d673 100644 --- a/SOPE/NGCards/TimeZones/Europe/Belgrade.ics +++ b/SOPE/NGCards/TimeZones/Europe/Belgrade.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Belgrade diff --git a/SOPE/NGCards/TimeZones/Europe/Berlin.ics b/SOPE/NGCards/TimeZones/Europe/Berlin.ics index 8da1441c8..51eb7c836 100644 --- a/SOPE/NGCards/TimeZones/Europe/Berlin.ics +++ b/SOPE/NGCards/TimeZones/Europe/Berlin.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Berlin diff --git a/SOPE/NGCards/TimeZones/Europe/Bratislava.ics b/SOPE/NGCards/TimeZones/Europe/Bratislava.ics index 36367fe1d..cde22cd0c 100644 --- a/SOPE/NGCards/TimeZones/Europe/Bratislava.ics +++ b/SOPE/NGCards/TimeZones/Europe/Bratislava.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Bratislava diff --git a/SOPE/NGCards/TimeZones/Europe/Brussels.ics b/SOPE/NGCards/TimeZones/Europe/Brussels.ics index d8a7ad167..034580c65 100644 --- a/SOPE/NGCards/TimeZones/Europe/Brussels.ics +++ b/SOPE/NGCards/TimeZones/Europe/Brussels.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Brussels diff --git a/SOPE/NGCards/TimeZones/Europe/Bucharest.ics b/SOPE/NGCards/TimeZones/Europe/Bucharest.ics index eab94c225..66b13bd17 100644 --- a/SOPE/NGCards/TimeZones/Europe/Bucharest.ics +++ b/SOPE/NGCards/TimeZones/Europe/Bucharest.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Bucharest diff --git a/SOPE/NGCards/TimeZones/Europe/Budapest.ics b/SOPE/NGCards/TimeZones/Europe/Budapest.ics index d17453032..41d932e30 100644 --- a/SOPE/NGCards/TimeZones/Europe/Budapest.ics +++ b/SOPE/NGCards/TimeZones/Europe/Budapest.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Budapest diff --git a/SOPE/NGCards/TimeZones/Europe/Busingen.ics b/SOPE/NGCards/TimeZones/Europe/Busingen.ics new file mode 100644 index 000000000..f95294d59 --- /dev/null +++ b/SOPE/NGCards/TimeZones/Europe/Busingen.ics @@ -0,0 +1,22 @@ +BEGIN:VCALENDAR +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/Busingen +X-LIC-LOCATION:Europe/Busingen +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +END:STANDARD +END:VTIMEZONE +END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Europe/Chisinau.ics b/SOPE/NGCards/TimeZones/Europe/Chisinau.ics index 314ee030d..c9da246f5 100644 --- a/SOPE/NGCards/TimeZones/Europe/Chisinau.ics +++ b/SOPE/NGCards/TimeZones/Europe/Chisinau.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Chisinau diff --git a/SOPE/NGCards/TimeZones/Europe/Copenhagen.ics b/SOPE/NGCards/TimeZones/Europe/Copenhagen.ics index 74c948781..bfb4640a4 100644 --- a/SOPE/NGCards/TimeZones/Europe/Copenhagen.ics +++ b/SOPE/NGCards/TimeZones/Europe/Copenhagen.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Copenhagen diff --git a/SOPE/NGCards/TimeZones/Europe/Dublin.ics b/SOPE/NGCards/TimeZones/Europe/Dublin.ics index cef88f036..d092758e5 100644 --- a/SOPE/NGCards/TimeZones/Europe/Dublin.ics +++ b/SOPE/NGCards/TimeZones/Europe/Dublin.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Dublin diff --git a/SOPE/NGCards/TimeZones/Europe/Gibraltar.ics b/SOPE/NGCards/TimeZones/Europe/Gibraltar.ics index 004937430..3f250f1dc 100644 --- a/SOPE/NGCards/TimeZones/Europe/Gibraltar.ics +++ b/SOPE/NGCards/TimeZones/Europe/Gibraltar.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Gibraltar diff --git a/SOPE/NGCards/TimeZones/Europe/Guernsey.ics b/SOPE/NGCards/TimeZones/Europe/Guernsey.ics index f0aa154d6..38c31ffe6 100644 --- a/SOPE/NGCards/TimeZones/Europe/Guernsey.ics +++ b/SOPE/NGCards/TimeZones/Europe/Guernsey.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Guernsey diff --git a/SOPE/NGCards/TimeZones/Europe/Helsinki.ics b/SOPE/NGCards/TimeZones/Europe/Helsinki.ics index 9fcf261de..0f1c42aaf 100644 --- a/SOPE/NGCards/TimeZones/Europe/Helsinki.ics +++ b/SOPE/NGCards/TimeZones/Europe/Helsinki.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Helsinki diff --git a/SOPE/NGCards/TimeZones/Europe/Isle_of_Man.ics b/SOPE/NGCards/TimeZones/Europe/Isle_of_Man.ics index abc5f4e7d..85e670b14 100644 --- a/SOPE/NGCards/TimeZones/Europe/Isle_of_Man.ics +++ b/SOPE/NGCards/TimeZones/Europe/Isle_of_Man.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Isle_of_Man diff --git a/SOPE/NGCards/TimeZones/Europe/Istanbul.ics b/SOPE/NGCards/TimeZones/Europe/Istanbul.ics index 1b0870509..a7642f5fb 100644 --- a/SOPE/NGCards/TimeZones/Europe/Istanbul.ics +++ b/SOPE/NGCards/TimeZones/Europe/Istanbul.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Istanbul diff --git a/SOPE/NGCards/TimeZones/Europe/Jersey.ics b/SOPE/NGCards/TimeZones/Europe/Jersey.ics index d4d8d9aed..a009202f9 100644 --- a/SOPE/NGCards/TimeZones/Europe/Jersey.ics +++ b/SOPE/NGCards/TimeZones/Europe/Jersey.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Jersey diff --git a/SOPE/NGCards/TimeZones/Europe/Kaliningrad.ics b/SOPE/NGCards/TimeZones/Europe/Kaliningrad.ics index fb43f6611..366fe4a5a 100644 --- a/SOPE/NGCards/TimeZones/Europe/Kaliningrad.ics +++ b/SOPE/NGCards/TimeZones/Europe/Kaliningrad.ics @@ -1,13 +1,13 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Kaliningrad X-LIC-LOCATION:Europe/Kaliningrad BEGIN:STANDARD -TZOFFSETFROM:+0300 -TZOFFSETTO:+0300 -TZNAME:FET +TZOFFSETFROM:+0200 +TZOFFSETTO:+0200 +TZNAME:EET DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Europe/Kiev.ics b/SOPE/NGCards/TimeZones/Europe/Kiev.ics index 1e2eb04c4..1c0abd3ae 100644 --- a/SOPE/NGCards/TimeZones/Europe/Kiev.ics +++ b/SOPE/NGCards/TimeZones/Europe/Kiev.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Kiev diff --git a/SOPE/NGCards/TimeZones/Europe/Lisbon.ics b/SOPE/NGCards/TimeZones/Europe/Lisbon.ics index af75a9757..91f6d448a 100644 --- a/SOPE/NGCards/TimeZones/Europe/Lisbon.ics +++ b/SOPE/NGCards/TimeZones/Europe/Lisbon.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Lisbon diff --git a/SOPE/NGCards/TimeZones/Europe/Ljubljana.ics b/SOPE/NGCards/TimeZones/Europe/Ljubljana.ics index 983520411..f4976327d 100644 --- a/SOPE/NGCards/TimeZones/Europe/Ljubljana.ics +++ b/SOPE/NGCards/TimeZones/Europe/Ljubljana.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Ljubljana diff --git a/SOPE/NGCards/TimeZones/Europe/London.ics b/SOPE/NGCards/TimeZones/Europe/London.ics index f95dea6eb..7927a158c 100644 --- a/SOPE/NGCards/TimeZones/Europe/London.ics +++ b/SOPE/NGCards/TimeZones/Europe/London.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/London diff --git a/SOPE/NGCards/TimeZones/Europe/Luxembourg.ics b/SOPE/NGCards/TimeZones/Europe/Luxembourg.ics index 90b8b9593..5fc71f540 100644 --- a/SOPE/NGCards/TimeZones/Europe/Luxembourg.ics +++ b/SOPE/NGCards/TimeZones/Europe/Luxembourg.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Luxembourg diff --git a/SOPE/NGCards/TimeZones/Europe/Madrid.ics b/SOPE/NGCards/TimeZones/Europe/Madrid.ics index 0ad3e4f05..3ee66e256 100644 --- a/SOPE/NGCards/TimeZones/Europe/Madrid.ics +++ b/SOPE/NGCards/TimeZones/Europe/Madrid.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Madrid diff --git a/SOPE/NGCards/TimeZones/Europe/Malta.ics b/SOPE/NGCards/TimeZones/Europe/Malta.ics index 88e52df2f..c7c56589a 100644 --- a/SOPE/NGCards/TimeZones/Europe/Malta.ics +++ b/SOPE/NGCards/TimeZones/Europe/Malta.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Malta diff --git a/SOPE/NGCards/TimeZones/Europe/Mariehamn.ics b/SOPE/NGCards/TimeZones/Europe/Mariehamn.ics index f51889b79..44f3ffa8f 100644 --- a/SOPE/NGCards/TimeZones/Europe/Mariehamn.ics +++ b/SOPE/NGCards/TimeZones/Europe/Mariehamn.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Mariehamn diff --git a/SOPE/NGCards/TimeZones/Europe/Minsk.ics b/SOPE/NGCards/TimeZones/Europe/Minsk.ics index 06eee1b1e..b33e610ee 100644 --- a/SOPE/NGCards/TimeZones/Europe/Minsk.ics +++ b/SOPE/NGCards/TimeZones/Europe/Minsk.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Minsk @@ -7,7 +7,7 @@ X-LIC-LOCATION:Europe/Minsk BEGIN:STANDARD TZOFFSETFROM:+0300 TZOFFSETTO:+0300 -TZNAME:FET +TZNAME:MSK DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Europe/Monaco.ics b/SOPE/NGCards/TimeZones/Europe/Monaco.ics index 307e8f812..2862287c1 100644 --- a/SOPE/NGCards/TimeZones/Europe/Monaco.ics +++ b/SOPE/NGCards/TimeZones/Europe/Monaco.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Monaco diff --git a/SOPE/NGCards/TimeZones/Europe/Moscow.ics b/SOPE/NGCards/TimeZones/Europe/Moscow.ics index a90dea87b..f0e62dbc5 100644 --- a/SOPE/NGCards/TimeZones/Europe/Moscow.ics +++ b/SOPE/NGCards/TimeZones/Europe/Moscow.ics @@ -1,12 +1,12 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Moscow X-LIC-LOCATION:Europe/Moscow BEGIN:STANDARD -TZOFFSETFROM:+0400 -TZOFFSETTO:+0400 +TZOFFSETFROM:+0300 +TZOFFSETTO:+0300 TZNAME:MSK DTSTART:19700101T000000 END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Europe/Nicosia.ics b/SOPE/NGCards/TimeZones/Europe/Nicosia.ics index c4b107b4b..53d126c94 100644 --- a/SOPE/NGCards/TimeZones/Europe/Nicosia.ics +++ b/SOPE/NGCards/TimeZones/Europe/Nicosia.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Nicosia diff --git a/SOPE/NGCards/TimeZones/Europe/Oslo.ics b/SOPE/NGCards/TimeZones/Europe/Oslo.ics index 984df709a..98a06d9c6 100644 --- a/SOPE/NGCards/TimeZones/Europe/Oslo.ics +++ b/SOPE/NGCards/TimeZones/Europe/Oslo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Oslo diff --git a/SOPE/NGCards/TimeZones/Europe/Paris.ics b/SOPE/NGCards/TimeZones/Europe/Paris.ics index 1cf338d2f..fb3ab55cc 100644 --- a/SOPE/NGCards/TimeZones/Europe/Paris.ics +++ b/SOPE/NGCards/TimeZones/Europe/Paris.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Paris diff --git a/SOPE/NGCards/TimeZones/Europe/Podgorica.ics b/SOPE/NGCards/TimeZones/Europe/Podgorica.ics index 9c4e90ac8..9d00f19d5 100644 --- a/SOPE/NGCards/TimeZones/Europe/Podgorica.ics +++ b/SOPE/NGCards/TimeZones/Europe/Podgorica.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Podgorica diff --git a/SOPE/NGCards/TimeZones/Europe/Prague.ics b/SOPE/NGCards/TimeZones/Europe/Prague.ics index 42171d5c2..0d937be30 100644 --- a/SOPE/NGCards/TimeZones/Europe/Prague.ics +++ b/SOPE/NGCards/TimeZones/Europe/Prague.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Prague diff --git a/SOPE/NGCards/TimeZones/Europe/Riga.ics b/SOPE/NGCards/TimeZones/Europe/Riga.ics index d47d3c7fd..8a8832a54 100644 --- a/SOPE/NGCards/TimeZones/Europe/Riga.ics +++ b/SOPE/NGCards/TimeZones/Europe/Riga.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Riga diff --git a/SOPE/NGCards/TimeZones/Europe/Rome.ics b/SOPE/NGCards/TimeZones/Europe/Rome.ics index f4d52060d..2c782178b 100644 --- a/SOPE/NGCards/TimeZones/Europe/Rome.ics +++ b/SOPE/NGCards/TimeZones/Europe/Rome.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Rome diff --git a/SOPE/NGCards/TimeZones/Europe/Samara.ics b/SOPE/NGCards/TimeZones/Europe/Samara.ics index c195879af..986aee23b 100644 --- a/SOPE/NGCards/TimeZones/Europe/Samara.ics +++ b/SOPE/NGCards/TimeZones/Europe/Samara.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Samara diff --git a/SOPE/NGCards/TimeZones/Europe/San_Marino.ics b/SOPE/NGCards/TimeZones/Europe/San_Marino.ics index 3618bea41..4454142bd 100644 --- a/SOPE/NGCards/TimeZones/Europe/San_Marino.ics +++ b/SOPE/NGCards/TimeZones/Europe/San_Marino.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/San_Marino diff --git a/SOPE/NGCards/TimeZones/Europe/Sarajevo.ics b/SOPE/NGCards/TimeZones/Europe/Sarajevo.ics index 5396845fc..69920c271 100644 --- a/SOPE/NGCards/TimeZones/Europe/Sarajevo.ics +++ b/SOPE/NGCards/TimeZones/Europe/Sarajevo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Sarajevo diff --git a/SOPE/NGCards/TimeZones/Europe/Simferopol.ics b/SOPE/NGCards/TimeZones/Europe/Simferopol.ics index 2480f4f12..68d857fc4 100644 --- a/SOPE/NGCards/TimeZones/Europe/Simferopol.ics +++ b/SOPE/NGCards/TimeZones/Europe/Simferopol.ics @@ -1,22 +1,14 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Simferopol X-LIC-LOCATION:Europe/Simferopol BEGIN:STANDARD TZOFFSETFROM:+0300 -TZOFFSETTO:+0200 -TZNAME:EET -DTSTART:19701025T040000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU -END:STANDARD -BEGIN:DAYLIGHT -TZOFFSETFROM:+0200 TZOFFSETTO:+0300 -TZNAME:EEST -DTSTART:19700329T030000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU -END:DAYLIGHT +TZNAME:MSK +DTSTART:19700101T000000 +END:STANDARD END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Europe/Skopje.ics b/SOPE/NGCards/TimeZones/Europe/Skopje.ics index 2bb8d2eed..3cf4a4f3b 100644 --- a/SOPE/NGCards/TimeZones/Europe/Skopje.ics +++ b/SOPE/NGCards/TimeZones/Europe/Skopje.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Skopje diff --git a/SOPE/NGCards/TimeZones/Europe/Sofia.ics b/SOPE/NGCards/TimeZones/Europe/Sofia.ics index b4c2ffb54..b91c00f7d 100644 --- a/SOPE/NGCards/TimeZones/Europe/Sofia.ics +++ b/SOPE/NGCards/TimeZones/Europe/Sofia.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Sofia diff --git a/SOPE/NGCards/TimeZones/Europe/Stockholm.ics b/SOPE/NGCards/TimeZones/Europe/Stockholm.ics index 38e92dd9f..ae003f724 100644 --- a/SOPE/NGCards/TimeZones/Europe/Stockholm.ics +++ b/SOPE/NGCards/TimeZones/Europe/Stockholm.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Stockholm diff --git a/SOPE/NGCards/TimeZones/Europe/Tallinn.ics b/SOPE/NGCards/TimeZones/Europe/Tallinn.ics index 94cbacce4..804511728 100644 --- a/SOPE/NGCards/TimeZones/Europe/Tallinn.ics +++ b/SOPE/NGCards/TimeZones/Europe/Tallinn.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Tallinn diff --git a/SOPE/NGCards/TimeZones/Europe/Tirane.ics b/SOPE/NGCards/TimeZones/Europe/Tirane.ics index 26b413331..f4a2140b4 100644 --- a/SOPE/NGCards/TimeZones/Europe/Tirane.ics +++ b/SOPE/NGCards/TimeZones/Europe/Tirane.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Tirane diff --git a/SOPE/NGCards/TimeZones/Europe/Uzhgorod.ics b/SOPE/NGCards/TimeZones/Europe/Uzhgorod.ics index ab6f52ef5..0257039ec 100644 --- a/SOPE/NGCards/TimeZones/Europe/Uzhgorod.ics +++ b/SOPE/NGCards/TimeZones/Europe/Uzhgorod.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Uzhgorod diff --git a/SOPE/NGCards/TimeZones/Europe/Vaduz.ics b/SOPE/NGCards/TimeZones/Europe/Vaduz.ics index c7ccf697d..48653e682 100644 --- a/SOPE/NGCards/TimeZones/Europe/Vaduz.ics +++ b/SOPE/NGCards/TimeZones/Europe/Vaduz.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Vaduz diff --git a/SOPE/NGCards/TimeZones/Europe/Vatican.ics b/SOPE/NGCards/TimeZones/Europe/Vatican.ics index a9e0c6123..84e07243b 100644 --- a/SOPE/NGCards/TimeZones/Europe/Vatican.ics +++ b/SOPE/NGCards/TimeZones/Europe/Vatican.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Vatican diff --git a/SOPE/NGCards/TimeZones/Europe/Vienna.ics b/SOPE/NGCards/TimeZones/Europe/Vienna.ics index eb9834d8f..6852c3e81 100644 --- a/SOPE/NGCards/TimeZones/Europe/Vienna.ics +++ b/SOPE/NGCards/TimeZones/Europe/Vienna.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Vienna diff --git a/SOPE/NGCards/TimeZones/Europe/Vilnius.ics b/SOPE/NGCards/TimeZones/Europe/Vilnius.ics index 313e7d86a..365303f11 100644 --- a/SOPE/NGCards/TimeZones/Europe/Vilnius.ics +++ b/SOPE/NGCards/TimeZones/Europe/Vilnius.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Vilnius diff --git a/SOPE/NGCards/TimeZones/Europe/Volgograd.ics b/SOPE/NGCards/TimeZones/Europe/Volgograd.ics index 8718cc5d6..64490487a 100644 --- a/SOPE/NGCards/TimeZones/Europe/Volgograd.ics +++ b/SOPE/NGCards/TimeZones/Europe/Volgograd.ics @@ -1,13 +1,13 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Volgograd X-LIC-LOCATION:Europe/Volgograd BEGIN:STANDARD -TZOFFSETFROM:+0400 -TZOFFSETTO:+0400 -TZNAME:VOLT +TZOFFSETFROM:+0300 +TZOFFSETTO:+0300 +TZNAME:MSK DTSTART:19700101T000000 END:STANDARD END:VTIMEZONE diff --git a/SOPE/NGCards/TimeZones/Europe/Warsaw.ics b/SOPE/NGCards/TimeZones/Europe/Warsaw.ics index 6f9c7ab46..879258a5b 100644 --- a/SOPE/NGCards/TimeZones/Europe/Warsaw.ics +++ b/SOPE/NGCards/TimeZones/Europe/Warsaw.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Warsaw diff --git a/SOPE/NGCards/TimeZones/Europe/Zagreb.ics b/SOPE/NGCards/TimeZones/Europe/Zagreb.ics index 316b08ba1..0f0a56e85 100644 --- a/SOPE/NGCards/TimeZones/Europe/Zagreb.ics +++ b/SOPE/NGCards/TimeZones/Europe/Zagreb.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Zagreb diff --git a/SOPE/NGCards/TimeZones/Europe/Zaporozhye.ics b/SOPE/NGCards/TimeZones/Europe/Zaporozhye.ics index cc8a04b6d..f0d7746ee 100644 --- a/SOPE/NGCards/TimeZones/Europe/Zaporozhye.ics +++ b/SOPE/NGCards/TimeZones/Europe/Zaporozhye.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Zaporozhye diff --git a/SOPE/NGCards/TimeZones/Europe/Zurich.ics b/SOPE/NGCards/TimeZones/Europe/Zurich.ics index 82d6b02ff..44ae49e75 100644 --- a/SOPE/NGCards/TimeZones/Europe/Zurich.ics +++ b/SOPE/NGCards/TimeZones/Europe/Zurich.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Zurich diff --git a/SOPE/NGCards/TimeZones/Indian/Antananarivo.ics b/SOPE/NGCards/TimeZones/Indian/Antananarivo.ics index 8c8bd4c33..3549d11ec 100644 --- a/SOPE/NGCards/TimeZones/Indian/Antananarivo.ics +++ b/SOPE/NGCards/TimeZones/Indian/Antananarivo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Antananarivo diff --git a/SOPE/NGCards/TimeZones/Indian/Chagos.ics b/SOPE/NGCards/TimeZones/Indian/Chagos.ics index a702621bc..8b137f28f 100644 --- a/SOPE/NGCards/TimeZones/Indian/Chagos.ics +++ b/SOPE/NGCards/TimeZones/Indian/Chagos.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Chagos diff --git a/SOPE/NGCards/TimeZones/Indian/Christmas.ics b/SOPE/NGCards/TimeZones/Indian/Christmas.ics index da05a5258..bd46774a5 100644 --- a/SOPE/NGCards/TimeZones/Indian/Christmas.ics +++ b/SOPE/NGCards/TimeZones/Indian/Christmas.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Christmas diff --git a/SOPE/NGCards/TimeZones/Indian/Cocos.ics b/SOPE/NGCards/TimeZones/Indian/Cocos.ics index 0182fd350..553323e87 100644 --- a/SOPE/NGCards/TimeZones/Indian/Cocos.ics +++ b/SOPE/NGCards/TimeZones/Indian/Cocos.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Cocos diff --git a/SOPE/NGCards/TimeZones/Indian/Comoro.ics b/SOPE/NGCards/TimeZones/Indian/Comoro.ics index fe0fe7429..867bca442 100644 --- a/SOPE/NGCards/TimeZones/Indian/Comoro.ics +++ b/SOPE/NGCards/TimeZones/Indian/Comoro.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Comoro diff --git a/SOPE/NGCards/TimeZones/Indian/Kerguelen.ics b/SOPE/NGCards/TimeZones/Indian/Kerguelen.ics index 770d4bc48..55aa7516e 100644 --- a/SOPE/NGCards/TimeZones/Indian/Kerguelen.ics +++ b/SOPE/NGCards/TimeZones/Indian/Kerguelen.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Kerguelen diff --git a/SOPE/NGCards/TimeZones/Indian/Mahe.ics b/SOPE/NGCards/TimeZones/Indian/Mahe.ics index 3fcdd199e..dbbe8976b 100644 --- a/SOPE/NGCards/TimeZones/Indian/Mahe.ics +++ b/SOPE/NGCards/TimeZones/Indian/Mahe.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Mahe diff --git a/SOPE/NGCards/TimeZones/Indian/Maldives.ics b/SOPE/NGCards/TimeZones/Indian/Maldives.ics index ad81069d3..e3f755414 100644 --- a/SOPE/NGCards/TimeZones/Indian/Maldives.ics +++ b/SOPE/NGCards/TimeZones/Indian/Maldives.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Maldives diff --git a/SOPE/NGCards/TimeZones/Indian/Mauritius.ics b/SOPE/NGCards/TimeZones/Indian/Mauritius.ics index a109de782..835717da7 100644 --- a/SOPE/NGCards/TimeZones/Indian/Mauritius.ics +++ b/SOPE/NGCards/TimeZones/Indian/Mauritius.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Mauritius diff --git a/SOPE/NGCards/TimeZones/Indian/Mayotte.ics b/SOPE/NGCards/TimeZones/Indian/Mayotte.ics index 63f714303..bde743401 100644 --- a/SOPE/NGCards/TimeZones/Indian/Mayotte.ics +++ b/SOPE/NGCards/TimeZones/Indian/Mayotte.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Mayotte diff --git a/SOPE/NGCards/TimeZones/Indian/Reunion.ics b/SOPE/NGCards/TimeZones/Indian/Reunion.ics index 306f8f3de..ae4c185b7 100644 --- a/SOPE/NGCards/TimeZones/Indian/Reunion.ics +++ b/SOPE/NGCards/TimeZones/Indian/Reunion.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Indian/Reunion diff --git a/SOPE/NGCards/TimeZones/Pacific/Apia.ics b/SOPE/NGCards/TimeZones/Pacific/Apia.ics index 6b5560239..9b1853a34 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Apia.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Apia.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Apia @@ -7,7 +7,7 @@ X-LIC-LOCATION:Pacific/Apia BEGIN:STANDARD TZOFFSETFROM:+1400 TZOFFSETTO:+1300 -TZNAME:WST +TZNAME:WSST DTSTART:19700405T040000 RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU END:STANDARD diff --git a/SOPE/NGCards/TimeZones/Pacific/Auckland.ics b/SOPE/NGCards/TimeZones/Pacific/Auckland.ics index fc67f9868..3f8b6eca9 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Auckland.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Auckland.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Auckland diff --git a/SOPE/NGCards/TimeZones/Pacific/Bougainville.ics b/SOPE/NGCards/TimeZones/Pacific/Bougainville.ics new file mode 100644 index 000000000..2b97b3bd2 --- /dev/null +++ b/SOPE/NGCards/TimeZones/Pacific/Bougainville.ics @@ -0,0 +1,14 @@ +BEGIN:VCALENDAR +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Pacific/Bougainville +X-LIC-LOCATION:Pacific/Bougainville +BEGIN:STANDARD +TZOFFSETFROM:+1100 +TZOFFSETTO:+1100 +TZNAME:BST +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Pacific/Chatham.ics b/SOPE/NGCards/TimeZones/Pacific/Chatham.ics index 7025715a7..4e75651f2 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Chatham.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Chatham.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Chatham diff --git a/SOPE/NGCards/TimeZones/Pacific/Chuuk.ics b/SOPE/NGCards/TimeZones/Pacific/Chuuk.ics index 4412052d6..1ae8cd371 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Chuuk.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Chuuk.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Chuuk diff --git a/SOPE/NGCards/TimeZones/Pacific/Easter.ics b/SOPE/NGCards/TimeZones/Pacific/Easter.ics index 82c622fec..17df2232c 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Easter.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Easter.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Easter @@ -8,15 +8,15 @@ BEGIN:STANDARD TZOFFSETFROM:-0500 TZOFFSETTO:-0600 TZNAME:EAST -DTSTART:19700314T220000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SA +DTSTART:19700425T220000 +RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=4SA END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:-0600 TZOFFSETTO:-0500 TZNAME:EASST -DTSTART:19701010T220000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SA +DTSTART:19700905T220000 +RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SA END:DAYLIGHT END:VTIMEZONE END:VCALENDAR diff --git a/SOPE/NGCards/TimeZones/Pacific/Efate.ics b/SOPE/NGCards/TimeZones/Pacific/Efate.ics index b81aaf7a9..d75d14c6c 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Efate.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Efate.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Efate diff --git a/SOPE/NGCards/TimeZones/Pacific/Enderbury.ics b/SOPE/NGCards/TimeZones/Pacific/Enderbury.ics index ea38ccf20..2a87dd0e8 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Enderbury.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Enderbury.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Enderbury diff --git a/SOPE/NGCards/TimeZones/Pacific/Fakaofo.ics b/SOPE/NGCards/TimeZones/Pacific/Fakaofo.ics index d655879f4..53e4ca6fe 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Fakaofo.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Fakaofo.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Fakaofo diff --git a/SOPE/NGCards/TimeZones/Pacific/Fiji.ics b/SOPE/NGCards/TimeZones/Pacific/Fiji.ics index c38d96763..224450303 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Fiji.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Fiji.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Fiji @@ -8,8 +8,8 @@ BEGIN:DAYLIGHT TZOFFSETFROM:+1200 TZOFFSETTO:+1300 TZNAME:FJST -DTSTART:19701018T020000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+1300 diff --git a/SOPE/NGCards/TimeZones/Pacific/Funafuti.ics b/SOPE/NGCards/TimeZones/Pacific/Funafuti.ics index b0ae3f620..973850a9c 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Funafuti.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Funafuti.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Funafuti diff --git a/SOPE/NGCards/TimeZones/Pacific/Galapagos.ics b/SOPE/NGCards/TimeZones/Pacific/Galapagos.ics index deb928773..eca405da5 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Galapagos.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Galapagos.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Galapagos diff --git a/SOPE/NGCards/TimeZones/Pacific/Gambier.ics b/SOPE/NGCards/TimeZones/Pacific/Gambier.ics index 4c6f1bf45..3e5c08aef 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Gambier.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Gambier.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Gambier diff --git a/SOPE/NGCards/TimeZones/Pacific/Guadalcanal.ics b/SOPE/NGCards/TimeZones/Pacific/Guadalcanal.ics index e9328d410..ec474a766 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Guadalcanal.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Guadalcanal.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Guadalcanal diff --git a/SOPE/NGCards/TimeZones/Pacific/Guam.ics b/SOPE/NGCards/TimeZones/Pacific/Guam.ics index 74b9a134d..109a53abb 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Guam.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Guam.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Guam diff --git a/SOPE/NGCards/TimeZones/Pacific/Honolulu.ics b/SOPE/NGCards/TimeZones/Pacific/Honolulu.ics index 3e3079804..3a2c729e8 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Honolulu.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Honolulu.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Honolulu diff --git a/SOPE/NGCards/TimeZones/Pacific/Johnston.ics b/SOPE/NGCards/TimeZones/Pacific/Johnston.ics index 6e658946e..2f1b3d66e 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Johnston.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Johnston.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Johnston diff --git a/SOPE/NGCards/TimeZones/Pacific/Kiritimati.ics b/SOPE/NGCards/TimeZones/Pacific/Kiritimati.ics index be6338aba..cdbf23939 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Kiritimati.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Kiritimati.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Kiritimati diff --git a/SOPE/NGCards/TimeZones/Pacific/Kosrae.ics b/SOPE/NGCards/TimeZones/Pacific/Kosrae.ics index 48e924058..8e763d826 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Kosrae.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Kosrae.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Kosrae diff --git a/SOPE/NGCards/TimeZones/Pacific/Kwajalein.ics b/SOPE/NGCards/TimeZones/Pacific/Kwajalein.ics index 1b0a700bc..33f479337 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Kwajalein.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Kwajalein.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Kwajalein diff --git a/SOPE/NGCards/TimeZones/Pacific/Majuro.ics b/SOPE/NGCards/TimeZones/Pacific/Majuro.ics index ec61f9043..bbc050402 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Majuro.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Majuro.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Majuro diff --git a/SOPE/NGCards/TimeZones/Pacific/Marquesas.ics b/SOPE/NGCards/TimeZones/Pacific/Marquesas.ics index 1b6e90549..09c32491b 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Marquesas.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Marquesas.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Marquesas diff --git a/SOPE/NGCards/TimeZones/Pacific/Midway.ics b/SOPE/NGCards/TimeZones/Pacific/Midway.ics index 1e7526cc6..3a0114f2a 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Midway.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Midway.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Midway diff --git a/SOPE/NGCards/TimeZones/Pacific/Nauru.ics b/SOPE/NGCards/TimeZones/Pacific/Nauru.ics index 2e5aaceab..f95f1bdae 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Nauru.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Nauru.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Nauru diff --git a/SOPE/NGCards/TimeZones/Pacific/Niue.ics b/SOPE/NGCards/TimeZones/Pacific/Niue.ics index e54772e00..809002904 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Niue.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Niue.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Niue diff --git a/SOPE/NGCards/TimeZones/Pacific/Norfolk.ics b/SOPE/NGCards/TimeZones/Pacific/Norfolk.ics index 0e4ab1c0f..bf29b647e 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Norfolk.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Norfolk.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Norfolk diff --git a/SOPE/NGCards/TimeZones/Pacific/Noumea.ics b/SOPE/NGCards/TimeZones/Pacific/Noumea.ics index a843996e4..b2993c61d 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Noumea.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Noumea.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Noumea diff --git a/SOPE/NGCards/TimeZones/Pacific/Pago_Pago.ics b/SOPE/NGCards/TimeZones/Pacific/Pago_Pago.ics index a8422a1e0..8b0cdcd2d 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Pago_Pago.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Pago_Pago.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Pago_Pago diff --git a/SOPE/NGCards/TimeZones/Pacific/Palau.ics b/SOPE/NGCards/TimeZones/Pacific/Palau.ics index d20da0487..fedb561b8 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Palau.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Palau.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Palau diff --git a/SOPE/NGCards/TimeZones/Pacific/Pitcairn.ics b/SOPE/NGCards/TimeZones/Pacific/Pitcairn.ics index 3cd8ae58f..6715340a0 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Pitcairn.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Pitcairn.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Pitcairn diff --git a/SOPE/NGCards/TimeZones/Pacific/Pohnpei.ics b/SOPE/NGCards/TimeZones/Pacific/Pohnpei.ics index 171078c1b..dea718b8b 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Pohnpei.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Pohnpei.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Pohnpei diff --git a/SOPE/NGCards/TimeZones/Pacific/Port_Moresby.ics b/SOPE/NGCards/TimeZones/Pacific/Port_Moresby.ics index 7c6bd5ab3..77adeae18 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Port_Moresby.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Port_Moresby.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Port_Moresby diff --git a/SOPE/NGCards/TimeZones/Pacific/Rarotonga.ics b/SOPE/NGCards/TimeZones/Pacific/Rarotonga.ics index 5d338ace2..67150a539 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Rarotonga.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Rarotonga.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Rarotonga diff --git a/SOPE/NGCards/TimeZones/Pacific/Saipan.ics b/SOPE/NGCards/TimeZones/Pacific/Saipan.ics index 9e2657025..d807627d0 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Saipan.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Saipan.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Saipan diff --git a/SOPE/NGCards/TimeZones/Pacific/Tahiti.ics b/SOPE/NGCards/TimeZones/Pacific/Tahiti.ics index 49f65f443..47a0a65a2 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Tahiti.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Tahiti.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Tahiti diff --git a/SOPE/NGCards/TimeZones/Pacific/Tarawa.ics b/SOPE/NGCards/TimeZones/Pacific/Tarawa.ics index 95ec5c0ba..891bf4473 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Tarawa.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Tarawa.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Tarawa diff --git a/SOPE/NGCards/TimeZones/Pacific/Tongatapu.ics b/SOPE/NGCards/TimeZones/Pacific/Tongatapu.ics index f76bd985b..f1b447586 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Tongatapu.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Tongatapu.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Tongatapu diff --git a/SOPE/NGCards/TimeZones/Pacific/Wake.ics b/SOPE/NGCards/TimeZones/Pacific/Wake.ics index 3b1440224..21cc1f0c9 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Wake.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Wake.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Wake diff --git a/SOPE/NGCards/TimeZones/Pacific/Wallis.ics b/SOPE/NGCards/TimeZones/Pacific/Wallis.ics index 39005411b..7823e2d40 100644 --- a/SOPE/NGCards/TimeZones/Pacific/Wallis.ics +++ b/SOPE/NGCards/TimeZones/Pacific/Wallis.ics @@ -1,5 +1,5 @@ BEGIN:VCALENDAR -PRODID:-//Inverse inc.//NONSGML Olson 2012j//EN +PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Pacific/Wallis diff --git a/SOPE/NGCards/TimeZones/UPDATING b/SOPE/NGCards/TimeZones/UPDATING index ad8e4b6cd..d8a436434 100644 --- a/SOPE/NGCards/TimeZones/UPDATING +++ b/SOPE/NGCards/TimeZones/UPDATING @@ -7,8 +7,8 @@ To updated the timezone files: mkdir /tmp/zones cd /tmp/zones - wget ftp://munnari.oz.au/pub/oldtz/tzdata2012j.tar.gz - tar -zxvf tzdata2012j.tar.gz + wget http://www.iana.org/time-zones/repository/releases/tzdata2014i.tar.gz + tar -zxvf tzdata2014i.tar.gz 3- run the conversion tool diff --git a/Scripts/openchange_user_cleanup b/Scripts/openchange_user_cleanup index 411479819..e67289480 100755 --- a/Scripts/openchange_user_cleanup +++ b/Scripts/openchange_user_cleanup @@ -9,12 +9,14 @@ import re import shutil import subprocess import sys +from samba.param import LoadParm imaphost = '127.0.0.1' imapport = 143 -sambaprivate = '/var/lib/samba/private' -mapistorefolder = "%s/mapistore" % (sambaprivate) +samba_lp = LoadParm() +sambaprivate = samba_lp.get("private dir") +mapistorefolder = samba_lp.private_path("mapistore") sogoSysDefaultsFile = "/etc/sogo/sogo.conf" sogoUserDefaultsFile = os.path.expanduser("~sogo/GNUstep/Defaults/.GNUstepDefaults") @@ -212,7 +214,7 @@ On RHEL, install it using 'yum install MySQL-python'""" c=conn.cursor() tablename="sogo_cache_folder_%s" % (username) c.execute("TRUNCATE TABLE %s" % tablename) - print "Table %s emptied" + print "Table %s emptied" % tablename def postgresqlCleanup(dbhost, dbport, dbuser, dbpass, dbname, username): diff --git a/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings b/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings index c9dcbb802..f6117f8ef 100644 --- a/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings +++ b/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings @@ -1,3 +1,4 @@ +"Inviting the following persons is prohibited:" = "Convidando as seguintes pessoas é proibido:"; "Personal Calendar" = "Calendário Pessoal"; vevent_class0 = "(Evento Público)"; vevent_class1 = "(Evento Privado)"; diff --git a/SoObjects/Appointments/SOGoAppointmentObject.m b/SoObjects/Appointments/SOGoAppointmentObject.m index 620900854..b10ce0c59 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.m +++ b/SoObjects/Appointments/SOGoAppointmentObject.m @@ -1768,6 +1768,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent * Verify vCalendar for any inconsistency or missing attributes. * Currently only check if the events have an end date or a duration. * We also check for the default transparency parameters. + * We also check for broken ORGANIZER such as "ORGANIZER;:mailto:sogo3@example.com" * @param rq the HTTP PUT request */ - (void) _adjustEventsInRequestCalendar: (iCalCalendar *) rqCalendar @@ -1792,7 +1793,10 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent [self warnWithFormat: @"Invalid event: no end date; setting duration to %@", [event duration]]; } - + if ([event organizer] && ![[[event organizer] cn] length]) + { + [[event organizer] setCn: [[event organizer] rfc822Email]]; + } } } diff --git a/SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings b/SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings index 6bd6cc294..cdc39f607 100644 --- a/SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings +++ b/SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings @@ -1,3 +1,4 @@ +"Inviting the following persons is prohibited:" = "No está permitido invitar a las siguientes personas:"; "Personal Calendar" = "Calendario personal"; vevent_class0 = "(Evento público)"; vevent_class1 = "(Evento privado)"; diff --git a/SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings b/SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings index 6dca00edd..8923eae93 100644 --- a/SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings +++ b/SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings @@ -1 +1,2 @@ "Personal Address Book" = "Livro de Endereços Pessoais"; +"Collected Address Book" = "Catálogos Coletados"; diff --git a/SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings b/SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings index 1476e55c4..c7e4f1213 100644 --- a/SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings +++ b/SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings @@ -1,2 +1,2 @@ -"SieveFolderName" = "Filtros"; "OtherUsersFolderName" = "Outros Usuários"; +"SharedFoldersName" = "Pastas Compartilhadas"; diff --git a/SoObjects/Mailer/GNUmakefile b/SoObjects/Mailer/GNUmakefile index a7afca3a4..b4725fc4f 100644 --- a/SoObjects/Mailer/GNUmakefile +++ b/SoObjects/Mailer/GNUmakefile @@ -98,7 +98,6 @@ Mailer_LOCALIZED_RESOURCE_FILES = Localizable.strings ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_INCLUDE_DIRS += $(shell xml2-config --cflags) -ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/wobundle.make diff --git a/SoObjects/Mailer/SOGoMailAccount.m b/SoObjects/Mailer/SOGoMailAccount.m index 5bc3ff2ae..ab6021f07 100644 --- a/SoObjects/Mailer/SOGoMailAccount.m +++ b/SoObjects/Mailer/SOGoMailAccount.m @@ -710,7 +710,8 @@ static NSString *inboxFolderName = @"INBOX"; } } - [folders setObject: guid forKey: [object substringFromIndex: 1]]; + [folders setObject: [NSString stringWithFormat: @"folder%@", guid] forKey: [NSString stringWithFormat: @"folder%@", [object substringFromIndex: 1]]]; + } return folders; diff --git a/SoObjects/SOGo/BSONCodec.m b/SoObjects/SOGo/BSONCodec.m index 58625a59f..a55eede3c 100644 --- a/SoObjects/SOGo/BSONCodec.m +++ b/SoObjects/SOGo/BSONCodec.m @@ -11,6 +11,8 @@ #import #import +static NSMutableDictionary *timezoneCache = nil; + #define BSONTYPE(tag,className) [className class], [NSNumber numberWithChar: (tag)] #ifndef objc_msgSend @@ -579,11 +581,38 @@ static NSDictionary *BSONTypes() + (id) BSONFragment: (NSData *) data at: (const void **) base ofType: (uint8_t) typeID { - NSString *v; - - v = [NSString BSONFragment: data at: base ofType: 0x02]; + NSTimeZone *tz; + NSString *key; - return [NSCalendarDate dateWithString: v - calendarFormat: @"%Y-%m-%d %H:%M:%S %Z"]; + unsigned int year, month, day, hour, minute, second; + char timezone[64]; + const char *v; + + if (!timezoneCache) + timezoneCache = [[NSMutableDictionary alloc] init]; + + v = [[NSString BSONFragment: data at: base ofType: 0x02] cStringUsingEncoding: NSASCIIStringEncoding]; + + sscanf(v, "%d-%d-%d %d:%d:%d %s", &year, &month, &day, &hour, &minute, &second, timezone); + + key = [NSString stringWithFormat: @"%s", timezone]; + + if (!(tz = [timezoneCache objectForKey: key])) + { + tz = [NSTimeZone timeZoneWithAbbreviation: key]; + + if (tz) + [timezoneCache setObject: tz forKey: key]; + else + NSLog(@"ERROR: timezone (%@) not found when deserializing BSON data", key); + } + + return [NSCalendarDate dateWithYear: year + month: month + day: day + hour: hour + minute: minute + second: second + timeZone: tz]; } @end diff --git a/SoObjects/SOGo/GNUmakefile b/SoObjects/SOGo/GNUmakefile index f1ee391bd..70b458001 100644 --- a/SoObjects/SOGo/GNUmakefile +++ b/SoObjects/SOGo/GNUmakefile @@ -11,6 +11,8 @@ SOGo_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) #SOGo_INSTALL_DIR = $(SOGO_LIBDIR) SOGo_INSTALL_DIR = $(DESTDIR)$(GNUSTEP_$(GNUSTEP_INSTALLATION_DOMAIN)_FRAMEWORKS) +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo + SOGo_HEADER_FILES = \ SOGoBuild.h \ SOGoProductLoader.h \ @@ -200,6 +202,7 @@ ADDITIONAL_LDFLAGS += -lmemcached ifneq ($(FHS_INSTALL_ROOT),) GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include endif +GNUSTEP_TARGET_LDIR=sogo include $(GNUSTEP_MAKEFILES)/framework.make include $(GNUSTEP_MAKEFILES)/library.make include $(GNUSTEP_MAKEFILES)/tool.make diff --git a/SoObjects/SOGo/SOGoCacheGCSObject.h b/SoObjects/SOGo/SOGoCacheGCSObject.h index 90f7d1ba1..b456c1775 100644 --- a/SoObjects/SOGo/SOGoCacheGCSObject.h +++ b/SoObjects/SOGo/SOGoCacheGCSObject.h @@ -67,8 +67,8 @@ typedef enum { - (NSDictionary *) lookupRecord: (NSString *) path newerThanVersion: (NSInteger) startVersion; -- (NSArray *) folderList: (NSString *) deviceId - newerThanVersion: (NSInteger) startVersion; +- (NSArray *) cacheEntriesForDeviceId: (NSString *) deviceId + newerThanVersion: (NSInteger) startVersion; - (void) setObjectType: (SOGoCacheObjectType) newObjectType; - (SOGoCacheObjectType) objectType; /* message, fai, folder */ diff --git a/SoObjects/SOGo/SOGoCacheGCSObject.m b/SoObjects/SOGo/SOGoCacheGCSObject.m index 0b3ba25e8..1f83f8ed2 100644 --- a/SoObjects/SOGo/SOGoCacheGCSObject.m +++ b/SoObjects/SOGo/SOGoCacheGCSObject.m @@ -250,7 +250,7 @@ static EOAttribute *textColumn = nil; newParentPath = NULL; sql = [NSMutableString stringWithFormat: @"UPDATE %@" - @" SET c_path = '%@'", + @" SET c_path = '/%@'", [self tableName], newPath]; if (newParentPath) @@ -375,9 +375,8 @@ static EOAttribute *textColumn = nil; return record; } -// get a list of all folders -- (NSArray *) folderList: (NSString *) deviceId - newerThanVersion: (NSInteger) startVersion +- (NSArray *) cacheEntriesForDeviceId: (NSString *) deviceId + newerThanVersion: (NSInteger) startVersion { NSMutableArray *recordsOut; NSArray *records; @@ -392,16 +391,22 @@ static EOAttribute *textColumn = nil; tableName = [self tableName]; adaptor = [self tableChannelAdaptor]; - pathValue = [adaptor formatValue: [NSString stringWithFormat: @"/%@+folder%", deviceId] + pathValue = [adaptor formatValue: [NSString stringWithFormat: @"/%@", deviceId] forAttribute: textColumn]; /* query */ sql = [NSMutableString stringWithFormat: - @"SELECT * FROM %@ WHERE c_path LIKE %@ AND c_deleted <> 1", - tableName, pathValue]; + @"SELECT * FROM %@ WHERE c_type = %d AND c_deleted <> 1", tableName, objectType]; + if (startVersion > -1) [sql appendFormat: @" AND c_version > %d", startVersion]; + if (deviceId) { + pathValue = [adaptor formatValue: [NSString stringWithFormat: @"/%@%", deviceId] + forAttribute: textColumn]; + [sql appendFormat: @" AND c_path like %@", pathValue]; + } + /* execution */ records = [self performSQLQuery: sql]; diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index c8a2bccea..921d312c0 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -282,41 +282,40 @@ static NSArray *childRecordFields = nil; return value; } -- (void) _setDisplayNameFromRow: (NSDictionary *) row +- (NSString *) _displayNameFromRow: (NSDictionary *) row { - NSString *primaryDN; + NSString *name, *primaryDN; + name = nil; primaryDN = [row objectForKey: @"c_foldername"]; if ([primaryDN length]) { - DESTROY(displayName); - if ([primaryDN isEqualToString: [container defaultFolderName]]) - displayName = [self labelForKey: primaryDN - inContext: context]; + name = [self labelForKey: primaryDN + inContext: context]; else - displayName = primaryDN; - - RETAIN(displayName); + name = primaryDN; } + + return name; } /* This method fetches the display name defined by the owner, but is also the fallback when a subscriber has not redefined the display name yet in his environment. */ -- (void) _fetchDisplayNameFromOwner +- (NSString *) _displayNameFromOwner { GCSChannelManager *cm; EOAdaptorChannel *fc; NSURL *folderLocation; - NSString *sql; + NSString *name, *sql; NSArray *attrs; NSDictionary *row; + name = nil; cm = [GCSChannelManager defaultChannelManager]; - folderLocation - = [[GCSFolderManager defaultFolderManager] folderInfoLocation]; + folderLocation = [[GCSFolderManager defaultFolderManager] folderInfoLocation]; fc = [cm acquireOpenChannelForURL: folderLocation]; if (fc) { @@ -324,33 +323,34 @@ static NSArray *childRecordFields = nil; // performing the query. This could have unexpected results. NS_DURING { - sql - = [NSString stringWithFormat: (@"SELECT c_foldername FROM %@" - @" WHERE c_path = '%@'"), - [folderLocation gcsTableName], ocsPath]; + sql = [NSString stringWithFormat: (@"SELECT c_foldername FROM %@" + @" WHERE c_path = '%@'"), + [folderLocation gcsTableName], ocsPath]; [fc evaluateExpressionX: sql]; attrs = [fc describeResults: NO]; row = [fc fetchAttributes: attrs withZone: NULL]; if (row) - [self _setDisplayNameFromRow: row]; + name = [self _displayNameFromRow: row]; [fc cancelFetch]; [cm releaseChannel: fc]; } NS_HANDLER; NS_ENDHANDLER; } + + return name; } -- (void) _fetchDisplayNameFromSubscriber +- (NSString *) _displayNameFromSubscriber { NSDictionary *ownerIdentity, *folderSubscriptionValues; - NSString *displayNameFormat; + NSString *name, *displayNameFormat; SOGoDomainDefaults *dd; - displayName = [self folderPropertyValueInCategory: @"FolderDisplayNames"]; - if (!displayName) + name = [self folderPropertyValueInCategory: @"FolderDisplayNames"]; + if (!name) { - [self _fetchDisplayNameFromOwner]; + name = [self _displayNameFromOwner]; // We MUST NOT use SOGoUser instances here (by calling -primaryIdentity) // as it'll load user defaults and user settings which is _very costly_ @@ -358,17 +358,17 @@ static NSArray *childRecordFields = nil; ownerIdentity = [[SOGoUserManager sharedUserManager] contactInfosForUserWithUIDorEmail: owner]; - folderSubscriptionValues = [[NSDictionary alloc] initWithObjectsAndKeys: displayName, @"FolderName", + folderSubscriptionValues = [[NSDictionary alloc] initWithObjectsAndKeys: name, @"FolderName", [ownerIdentity objectForKey: @"cn"], @"UserName", [ownerIdentity objectForKey: @"c_email"], @"Email", nil]; dd = [[context activeUser] domainDefaults]; displayNameFormat = [dd subscriptionFolderFormat]; - displayName = [folderSubscriptionValues keysWithFormat: displayNameFormat]; + name = [folderSubscriptionValues keysWithFormat: displayNameFormat]; } - [displayName retain]; + return name; } - (NSString *) displayName @@ -376,14 +376,14 @@ static NSArray *childRecordFields = nil; if (!displayName) { if (activeUserIsOwner) - [self _fetchDisplayNameFromOwner]; + displayName = [self _displayNameFromOwner]; else { - [self _fetchDisplayNameFromSubscriber]; - + displayName = [self _displayNameFromSubscriber]; if (!displayName) - [self _fetchDisplayNameFromOwner]; + displayName = [self _displayNameFromOwner]; } + [displayName retain]; } return displayName; @@ -949,7 +949,7 @@ static NSArray *childRecordFields = nil; forKey: @"FolderShowAlarms"]; } - [self setFolderPropertyValue: [self displayName] + [self setFolderPropertyValue: [self _displayNameFromSubscriber] inCategory: @"FolderDisplayNames" settings: us]; @@ -1194,7 +1194,7 @@ static NSArray *childRecordFields = nil; qualifier = [EOQualifier qualifierWithQualifierFormat: @"c_lastmodified > %d and c_deleted == 1", syncTokenInt]; - fields = [NSMutableArray arrayWithObjects: @"c_name", @"c_deleted", nil]; + fields = [NSMutableArray arrayWithObjects: @"c_name", @"c_lastmodified", @"c_deleted", nil]; [mRecords addObjectsFromArray: [self _fetchFields: fields withQualifier: qualifier ignoreDeleted: NO]]; diff --git a/SoObjects/SOGo/SOGoSystemDefaults.m b/SoObjects/SOGo/SOGoSystemDefaults.m index 01150e287..b9f1f0225 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.m +++ b/SoObjects/SOGo/SOGoSystemDefaults.m @@ -592,7 +592,7 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict, v = [self integerForKey: @"SOGoMaximumPingInterval"]; if (!v) - v = 5; + v = 10; return v; } diff --git a/SoObjects/SOGo/SOGoUserFolder.m b/SoObjects/SOGo/SOGoUserFolder.m index 9292f9ffa..ba8414b81 100644 --- a/SoObjects/SOGo/SOGoUserFolder.m +++ b/SoObjects/SOGo/SOGoUserFolder.m @@ -153,14 +153,12 @@ - (NSArray *) _subFoldersFromFolder: (SOGoParentFolder *) parentFolder { - NSDictionary *folderSubscriptionValues, *ownerIdentity; - NSString *folderName, *folderOwner, *formattedName; + NSString *folderName, *folderOwner; NSMutableDictionary *currentDictionary; SoSecurityManager *securityManager; SOGoFolder *currentFolder; NSEnumerator *subfolders; NSMutableArray *folders; - SOGoDomainDefaults *dd; Class subfolderClass; folders = [NSMutableArray array]; @@ -193,17 +191,6 @@ [currentDictionary setObject: [currentFolder folderType] forKey: @"type"]; - dd = [[context activeUser] domainDefaults]; - ownerIdentity = [[SOGoUserManager sharedUserManager] - contactInfosForUserWithUIDorEmail: owner]; - folderSubscriptionValues = [[NSDictionary alloc] initWithObjectsAndKeys: [currentFolder displayName], @"FolderName", - [ownerIdentity objectForKey: @"cn"], @"UserName", - [ownerIdentity objectForKey: @"c_email"], @"Email", nil]; - - formattedName = [folderSubscriptionValues keysWithFormat: [dd subscriptionFolderFormat]]; - [currentDictionary setObject: formattedName - forKey: @"formattedName"]; - [folders addObject: currentDictionary]; } } diff --git a/SoObjects/common.make b/SoObjects/common.make index 31f10e1ac..f2c00d252 100644 --- a/SoObjects/common.make +++ b/SoObjects/common.make @@ -18,17 +18,17 @@ ADDITIONAL_INCLUDE_DIRS += \ -I../../SOPE ADDITIONAL_LIB_DIRS += \ - -L../SOGo/SOGo.framework/ \ + -L../SOGo/SOGo.framework/Versions/Current/sogo/ -lSOGo \ -L../../SOGo/$(GNUSTEP_OBJ_DIR)/ \ - -L../../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \ - -L/usr/local/lib + -L../../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ -lNGCards \ + -L../../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/ -lGDLContentStore \ + -L/usr/local/lib \ + -Wl,-rpath,$(SOGO_SYSLIBDIR)/sogo BUNDLE_LIBS += \ - -lSOGo \ - -lGDLContentStore \ -lGDLAccess \ -lNGObjWeb \ - -lNGCards -lNGMime -lNGLdap \ + -lNGMime -lNGLdap \ -lNGStreams -lNGExtensions -lEOControl \ -lDOM -lSaxObjC -lSBJson diff --git a/Tests/Integration/GNUmakefile.preamble b/Tests/Integration/GNUmakefile.preamble index cd29c8e19..68878f481 100644 --- a/Tests/Integration/GNUmakefile.preamble +++ b/Tests/Integration/GNUmakefile.preamble @@ -10,9 +10,10 @@ ADDITIONAL_INCLUDE_DIRS += \ -D_GNU_SOURCE -I../../SOPE/ -I../../SoObjects/ ADDITIONAL_LIB_DIRS += \ - -L../../SoObjects/SOGo/SOGo.framework -lSOGo \ + -L../../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo -lSOGo \ -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/sogo -L/usr/lib/sogo -L/usr/lib64/sogo -lEOControl -lNGStreams -lNGMime -lNGExtensions -ADDITIONAL_LDFLAGS += -Wl,--no-as-needed + +ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -Wl,--rpath,$(GNUSTEP_SYSTEM_LIBRARIES)/sogo diff --git a/Tests/Integration/test-davacl.py b/Tests/Integration/test-davacl.py index a8a1a5bac..e155966c2 100755 --- a/Tests/Integration/test-davacl.py +++ b/Tests/Integration/test-davacl.py @@ -683,12 +683,12 @@ class DAVCalendarAclTest(DAVAclTest): if right == "r": exp_event = event_template % {"class": icsClass, "filename": filename, - "organizer_line": "ORGANIZER:mailto:nobody@somewhere.com\n", + "organizer_line": "ORGANIZER;CN=nobody@somewhere.com:mailto:nobody@somewhere.com\n", "attendee_line": att_line} else: exp_event = event_template % {"class": icsClass, "filename": filename, - "organizer_line": "ORGANIZER:mailto:someone@nowhere.com\n", + "organizer_line": "ORGANIZER;CN=someone@nowhere.com:mailto:someone@nowhere.com\n", "attendee_line": att_line} event = self._getEvent(event_class, True) ics_diff = utilities.ics_compare(exp_event, event) diff --git a/Tests/Unit/GNUmakefile b/Tests/Unit/GNUmakefile index 6b99e05a5..bcfd13850 100644 --- a/Tests/Unit/GNUmakefile +++ b/Tests/Unit/GNUmakefile @@ -33,9 +33,9 @@ $(TEST_TOOL)_CPPFLAGS += \ -Wall -D_GNU_SOURCE -I../../SOPE/ -I../../SoObjects/ -I../../UI/ ADDITIONAL_LIB_DIRS += \ - -L../../SoObjects/SOGo/SOGo.framework/Versions/Current -L../../SOPE/NGCards/obj -L../../SOPE/GDLContentStore/obj -lSOGo -lNGMime -lNGCards -lGDLContentStore -lNGExtensions -lSBJson -lobjc \ + -L../../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo -L../../SOPE/NGCards/obj -L../../SOPE/GDLContentStore/obj -lSOGo -lNGMime -lNGCards -lGDLContentStore -lNGExtensions -lSBJson -lobjc \ -L/usr/local/lib -lSaxObjC \ - -Wl,-rpath,../../SoObjects/SOGo/SOGo.framework/Versions/Current -Wl,-rpath,../../SOPE/NGCards/obj -Wl,-rpath,../../SOPE/GDLContentStore/obj + -Wl,-rpath,../../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo -Wl,-rpath,../../SOPE/NGCards/obj -Wl,-rpath,../../SOPE/GDLContentStore/obj ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -include GNUmakefile.preamble diff --git a/Tools/GNUmakefile b/Tools/GNUmakefile index c5b56a1fc..bb580edc9 100644 --- a/Tools/GNUmakefile +++ b/Tools/GNUmakefile @@ -4,6 +4,8 @@ include ../config.make include $(GNUSTEP_MAKEFILES)/common.make include ../Version +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(GNUSTEP_SYSTEM_LIBRARIES)/sogo + ### SOGO_TOOL = sogo-tool $(SOGO_TOOL)_INSTALL_DIR = $(SOGO_ADMIN_TOOLS) diff --git a/Tools/GNUmakefile.preamble b/Tools/GNUmakefile.preamble index fc78b8b0a..f6ed0bb7f 100644 --- a/Tools/GNUmakefile.preamble +++ b/Tools/GNUmakefile.preamble @@ -10,7 +10,7 @@ ADDITIONAL_INCLUDE_DIRS += \ -D_GNU_SOURCE -I../SOPE/ -I../SoObjects/ ADDITIONAL_LIB_DIRS += \ - -L../SoObjects/SOGo/SOGo.framework -lSOGo \ + -L../SoObjects/SOGo/SOGo.framework/sogo -lSOGo \ -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 -lNGObjWeb + -lEOControl -lNGStreams -lNGMime -lNGExtensions -lNGObjWeb diff --git a/UI/AdministrationUI/GNUmakefile b/UI/AdministrationUI/GNUmakefile index d57aee9dc..041edd709 100644 --- a/UI/AdministrationUI/GNUmakefile +++ b/UI/AdministrationUI/GNUmakefile @@ -25,6 +25,7 @@ AdministrationUI_LOCALIZED_RESOURCE_FILES += \ ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make diff --git a/UI/AdministrationUI/SpanishArgentina.lproj/Localizable.strings b/UI/AdministrationUI/SpanishArgentina.lproj/Localizable.strings index 6a13728f5..b10c86a79 100644 --- a/UI/AdministrationUI/SpanishArgentina.lproj/Localizable.strings +++ b/UI/AdministrationUI/SpanishArgentina.lproj/Localizable.strings @@ -9,7 +9,7 @@ "ACLs" = "ACL's"; /* Modules titles */ -"ACLs_title" = "Gestión de ALC's para carpetas de usuarios"; +"ACLs_title" = "Gestión de ALC's de las carpetas de usuarios"; /* Modules descriptions */ "ACLs_description" = "

El módulo de administración de Listas de Control de Acceso (ACL) permite cambiar las ACL's del Calendario o de la Libreta de Direcciones de cada usuario

Para modificar las ACL's de la carpeta de un usuario, ingrese el nombre del usuario en el cuadro de búsqueda ubicado en la parte superior de la ventana y haga dobe click en la carpeta deseada.

"; diff --git a/UI/Common/BrazilianPortuguese.lproj/Localizable.strings b/UI/Common/BrazilianPortuguese.lproj/Localizable.strings index 606594535..dabc4b454 100644 --- a/UI/Common/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Common/BrazilianPortuguese.lproj/Localizable.strings @@ -69,6 +69,7 @@ "You cannot create a list in a shared address book." = "Você não pode criar uma lista em um catálogo público"; "Warning" = "Aviso"; +"Can't contact server" = "Um erro ocorreu na conexão com o servidor. Por favor, tente mais tarde."; "You are not allowed to access this module or this system. Please contact your system administrator." = "Você não está liberado para acessar este módulo ou este sistema. Por favor, contate seu administrador de sistemas."; @@ -87,7 +88,7 @@ "30 minutes" = "30 minutes"; "45 minutes" = "45 minutos"; "1 hour" = "1 hora"; - +"1 day" = "1 dia"; /* common buttons */ "OK" = "OK"; @@ -101,10 +102,9 @@ "Due Date:" = "Data:"; "Location:" = "Localização:"; -/* Mail labels */ +/* mail labels */ "Important" = "Importante"; "Work" = "Trabalho"; -"Work" = "Trabalho"; "Personal" = "Pessoal"; "To Do" = "Tarefa"; "Later" = "Adiar"; diff --git a/UI/Common/GNUmakefile b/UI/Common/GNUmakefile index 5eaf6c036..eb5671695 100644 --- a/UI/Common/GNUmakefile +++ b/UI/Common/GNUmakefile @@ -33,6 +33,7 @@ CommonUI_LOCALIZED_RESOURCE_FILES += \ ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make diff --git a/UI/Common/SpanishArgentina.lproj/Localizable.strings b/UI/Common/SpanishArgentina.lproj/Localizable.strings index 11ddb4d91..29f239af2 100644 --- a/UI/Common/SpanishArgentina.lproj/Localizable.strings +++ b/UI/Common/SpanishArgentina.lproj/Localizable.strings @@ -88,7 +88,7 @@ "30 minutes" = "30 minutos"; "45 minutes" = "45 minutos"; "1 hour" = "1 hora"; - +"1 day" = "1 día"; /* common buttons */ "OK" = "OK"; diff --git a/UI/Common/product.plist b/UI/Common/product.plist index 160e4155f..d5d6936a1 100644 --- a/UI/Common/product.plist +++ b/UI/Common/product.plist @@ -107,7 +107,7 @@ actionName = "subscribeUsers"; }; renameFolder = { - protectedBy = "Change Permissions"; + protectedBy = "Access Contents Information"; actionClass = "UIxFolderActions"; actionName = "renameFolder"; }; diff --git a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings index da9156772..934456c1c 100644 --- a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings @@ -36,7 +36,6 @@ "delete" = "apagar"; "edit" = "editar"; "invalidemailwarn" = "O email informado é inválido"; -"invaliddatewarn" = "The specified date is invalid."; "new" = "novo"; "Preferred Phone" = "Telefone Preferencial"; @@ -64,6 +63,7 @@ "New Card" = "Novo Contato"; "New List" = "Nova Lista"; +"Edit" = "Editar"; "Properties" = "Propriedades"; "Sharing..." = "Localizando..."; "Write" = "Escrever"; @@ -147,7 +147,7 @@ "You cannot delete the card of \"%{0}\"." = "Você não pode apagar o contato de \"%{0}\"."; -"Address Book Name" = "Nome do Catálogo"; + "You cannot subscribe to a folder that you own!" = "Você não pode inscrever-se em uma pasta que você é dono."; @@ -206,3 +206,10 @@ "A total of %{0} cards were imported in the addressbook." = "A total of %{0} cards were imported in the addressbook."; "Reload" = "Atualizar"; + +/* Properties window */ +"Address Book Name:" = "Nome do Catálogo:"; +"Links to this Address Book" = "Link para este Catálogo"; +"Authenticated User Access" = "Acesso de Usuário Autenticado"; +"CardDAV URL: " = "CardDAV URL:"; + diff --git a/UI/Contacts/GNUmakefile b/UI/Contacts/GNUmakefile index 6e32c50db..ef8a09ebf 100644 --- a/UI/Contacts/GNUmakefile +++ b/UI/Contacts/GNUmakefile @@ -38,6 +38,7 @@ ContactsUI_LOCALIZED_RESOURCE_FILES += \ ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make diff --git a/UI/Contacts/UIxContactView.m b/UI/Contacts/UIxContactView.m index 4880fa667..259a518e9 100644 --- a/UI/Contacts/UIxContactView.m +++ b/UI/Contacts/UIxContactView.m @@ -67,15 +67,18 @@ - (NSString *) _cardStringWithLabel: (NSString *) label value: (NSString *) value + byEscapingHTMLString: (BOOL) escapeHTML asLinkScheme: (NSString *) scheme withLinkAttributes: (NSString *) attrs { NSMutableString *cardString; cardString = [NSMutableString stringWithCapacity: 80]; - value = [[value stringByReplacingString: @"\r" withString: @""] stringByEscapingHTMLString]; + value = [value stringByReplacingString: @"\r" withString: @""]; if ([value length] > 0) { + if (escapeHTML) + value = [value stringByEscapingHTMLString]; if ([scheme length] > 0) value = [NSString stringWithFormat: @"%@", scheme, value, attrs, value]; @@ -94,6 +97,7 @@ { return [self _cardStringWithLabel: label value: value + byEscapingHTMLString: YES asLinkScheme: nil withLinkAttributes: nil]; } @@ -104,6 +108,7 @@ { return [self _cardStringWithLabel: label value: value + byEscapingHTMLString: YES asLinkScheme: scheme withLinkAttributes: nil]; } @@ -144,6 +149,7 @@ return [self _cardStringWithLabel: @"Email:" value: email + byEscapingHTMLString: YES asLinkScheme: @"mailto:" withLinkAttributes: attrs]; } @@ -182,6 +188,7 @@ [secondaryEmails addObject: [self _cardStringWithLabel: nil value: email + byEscapingHTMLString: YES asLinkScheme: @"mailto:" withLinkAttributes: attrs]]; } @@ -365,6 +372,7 @@ return [self _cardStringWithLabel: nil value: data + byEscapingHTMLString: YES asLinkScheme: schema withLinkAttributes: @"target=\"_blank\""]; } @@ -591,13 +599,18 @@ note = [card note]; if (note) { + note = [note stringByEscapingHTMLString]; note = [note stringByReplacingString: @"\r\n" withString: @"
"]; note = [note stringByReplacingString: @"\n" withString: @"
"]; } - return [self _cardStringWithLabel: @"Note:" value: note]; + return [self _cardStringWithLabel: @"Note:" + value: note + byEscapingHTMLString: NO + asLinkScheme: nil + withLinkAttributes: nil]; } /* hrefs */ diff --git a/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings index 0c23cafd0..d038b316d 100644 --- a/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings @@ -12,6 +12,8 @@ publish_info_text = "O solicitante lhe informa sobre um evento anexo."; cancel_info_text = "Seu convite ou evento foi cancelado."; request_info_no_attendee = "está propondo um reunião aos participantes. Você está recebendo este email como uma notificação, você não está agendado como um particiopante."; Appointment = "Apontamento"; +"Status Update" = "Status da Atualização"; +was = "foi"; Organizer = "Organizador"; Time = "Hora"; diff --git a/UI/MailPartViewers/GNUmakefile b/UI/MailPartViewers/GNUmakefile index a094e92eb..57a874fb4 100644 --- a/UI/MailPartViewers/GNUmakefile +++ b/UI/MailPartViewers/GNUmakefile @@ -37,6 +37,7 @@ MailPartViewers_LOCALIZED_RESOURCE_FILES += \ ADDITIONAL_INCLUDE_DIRS += $(shell xml2-config --cflags) ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ -L../../SoObjects/Mailer/obj -L../../SoObjects/Appointments/obj +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make diff --git a/UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings b/UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings index 1a906cff4..7fa91fcd6 100644 --- a/UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings +++ b/UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings @@ -31,7 +31,7 @@ Tentative = "Tentativo"; "delegated from" = "delegado de"; reply_info_no_attendee = "Ha recibido una respuesta a una invitación de evento pero el remitente no aparece como un participante."; -reply_info = "Esta es la respuesta a una invitación a un evento hecha que Usted ha organizado."; +reply_info = "Esta es la respuesta a una invitación a un evento que Usted ha organizado."; "to" = "para"; diff --git a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings index f23eb5b69..b07718473 100644 --- a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings @@ -13,6 +13,7 @@ "Print" = "Imprimir"; "Stop" = "Parar"; "Write" = "Escrever"; +"Search" = "Pesquisar"; "Send" = "Enviar"; "Contacts" = "Contatos"; @@ -41,6 +42,7 @@ "Attachment" = "Anexos"; "Unread" = "Não Lido"; "Flagged" = "Sinalizado"; +"Search multiple mailboxes" = "Pesquisar múltiplas caixas de correio"; /* Main Frame */ @@ -79,7 +81,7 @@ "Remove this folder" = "Apagar esta pasta"; "Erase mails from this folder" = "Apagar emails desta pasta"; "Expunge this folder" = "Expurgar esta pasta"; -"Archive This Folder" = "Archive This Folder"; +"Export This Folder" = "Exportar esta pasta"; "Modify the acl of this folder" = "Modificar os direitos desta pasta"; "Saved Messages.zip" = "Mensagens Salvas.zip"; @@ -94,14 +96,16 @@ "To" = "Para"; "Cc" = "Cc"; "Bcc" = "Bcc"; -"Reply-To" = "Responder-Para"; +"Reply-To" = "Responder-Para"; "Add address" = "Adicionar endereço"; +"Body" = "Corpo"; -"Attachments:" = "Anexos:"; "Open" = "Abrir"; "Select All" = "Selecionar Tudo"; "Attach Web Page..." = "Anexar Página Web..."; -"Attach File(s)..." = "Anexar Arquivo(s)..."; +"file" = "arquivo"; +"files" = "arquivos"; +"Save all" = "Salvar tudo"; "to" = "Para"; "cc" = "Cc"; @@ -236,6 +240,18 @@ "As Not Junk" = "Como Não é Lixo Eletrônico"; "Run Junk Mail Controls" = "Executar Controle de Lixo Eletrônico"; +"Search messages in:" = "Pesquisar mensagens em:"; +"Search" = "Pesquisar"; +"Search subfolders" = "Pesquisar sub-pastas"; +"Match any of the following" = "Combinar qualquer uma das seguintes"; +"Match all of the following" = "Combinar todas as seguintes"; +"contains" = "contêm"; +"does not contain" = "não contêm"; +"No matches found" = "Nenhuma combinação encontrada"; +"results found" = "Resultados encontrados"; +"result found" = "Resultado encontrado"; +"Please specify at least one filter" = "Por favor, especifique pelo menos um filtro"; + /* Folder operations */ "Name :" = "Nome :"; "Enter the new name of your folder :" @@ -278,6 +294,9 @@ "error_missingsubject" = "Está faltando o Assunto"; "error_missingrecipients" = "Sem destinatários selecionados"; "Send Anyway" = "Enviar assim mesmo"; +"Error while saving the draft:" = "Erro ao salvar o rascunho:"; +"Error while uploading the file \"%{0}\":" = "Erro ao carregar o arquivo \"%{0}\":"; +"There is an active file upload. Closing the window will interrupt it." = "Este arquivo está sendo carregado. Fechando a janela irá interromper o processo."; /* Message sending */ "cannot send message: (smtp) all recipients discarded" = "Não é possível enviar a mensagem: todos os destinatários são inválidos."; diff --git a/UI/MailerUI/GNUmakefile b/UI/MailerUI/GNUmakefile index 851eb9abf..b3754bbaf 100644 --- a/UI/MailerUI/GNUmakefile +++ b/UI/MailerUI/GNUmakefile @@ -46,6 +46,7 @@ MailerUI_LOCALIZED_RESOURCE_FILES += \ ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ -L../MailPartViewers/obj/ +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make diff --git a/UI/MailerUI/SpanishArgentina.lproj/Localizable.strings b/UI/MailerUI/SpanishArgentina.lproj/Localizable.strings index 101bcfa44..697ab2374 100644 --- a/UI/MailerUI/SpanishArgentina.lproj/Localizable.strings +++ b/UI/MailerUI/SpanishArgentina.lproj/Localizable.strings @@ -13,6 +13,7 @@ "Print" = "Imprimir"; "Stop" = "Detener"; "Write" = "Redactar"; +"Search" = "Buscar"; "Send" = "Enviar"; "Contacts" = "Contactos"; @@ -41,6 +42,7 @@ "Attachment" = "Adjunto"; "Unread" = "No leído"; "Flagged" = "Marcado"; +"Search multiple mailboxes" = "Buscar en múltiples carpetas"; /* Main Frame */ @@ -94,8 +96,9 @@ "To" = "Para"; "Cc" = "Cc"; "Bcc" = "CCo"; -"Reply-To" = "Responder a"; +"Reply-To" = "Responder a"; "Add address" = "Añadir dirección"; +"Body" = "Cuerpo del mensaje"; "Open" = "Abrir"; "Select All" = "Seleccionar todo"; @@ -237,6 +240,18 @@ "As Not Junk" = "Como correo normal"; "Run Junk Mail Controls" = "Ejecutar controles de correo basura"; +"Search messages in:" = "Buscar mensajes en:"; +"Search" = "Buscar"; +"Search subfolders" = "Buscar en subcarpetas"; +"Match any of the following" = "Coincidir con cualquiera de los siguientes"; +"Match all of the following" = "Coincidir con alguno de los siguientes"; +"contains" = "contiene"; +"does not contain" = "no contiene"; +"No matches found" = "No se encontraron coincidencias"; +"results found" = "resultados encontrados"; +"result found" = "resultado encontrado"; +"Please specify at least one filter" = "Por favor especifique por lo menos un filtro"; + /* Folder operations */ "Name :" = "Nombre: "; "Enter the new name of your folder :" diff --git a/UI/MailerUI/UIxMailListActions.m b/UI/MailerUI/UIxMailListActions.m index 673de4987..f7c583bfe 100644 --- a/UI/MailerUI/UIxMailListActions.m +++ b/UI/MailerUI/UIxMailListActions.m @@ -394,39 +394,42 @@ NSArray *filters; NSString *searchBy, *searchArgument, *searchInput, *searchString, *match; NSMutableArray *searchArray; - int nbFilters = 0, i; + int nbFilters, i; request = [context request]; content = [[request contentAsString] objectFromJSONString]; qualifier = nil; searchString = nil; + match = nil; + filters = [content objectForKey: @"filters"]; - if ([content objectForKey:@"filters"]) + if (filters) { - filters = [content objectForKey:@"filters"]; - sortingAttributes = [content objectForKey:@"sortingAttributes"]; nbFilters = [filters count]; - match = [NSString stringWithString:[sortingAttributes objectForKey:@"match"]]; // AND, OR - - searchArray = [NSMutableArray arrayWithCapacity:nbFilters]; - for (i = 0; i < nbFilters; i++) - { - searchBy = [NSString stringWithString:[[filters objectAtIndex:i] objectForKey:@"searchBy"]]; - searchArgument = [NSString stringWithString:[[filters objectAtIndex:i] objectForKey:@"searchArgument"]]; - searchInput = [NSString stringWithString:[[filters objectAtIndex:i] objectForKey:@"searchInput"]]; + if (nbFilters > 0) { + searchArray = [NSMutableArray arrayWithCapacity: nbFilters]; + sortingAttributes = [content objectForKey: @"sortingAttributes"]; + if (sortingAttributes) + match = [sortingAttributes objectForKey :@"match"]; // AND, OR + for (i = 0; i < nbFilters; i++) + { + searchBy = [NSString stringWithString: [[filters objectAtIndex:i] objectForKey: @"searchBy"]]; + searchArgument = [NSString stringWithString: [[filters objectAtIndex:i] objectForKey: @"searchArgument"]]; + searchInput = [NSString stringWithString: [[filters objectAtIndex:i] objectForKey: @"searchInput"]]; - if ([[[filters objectAtIndex:i] objectForKey:@"negative"] boolValue]) - searchString = [NSString stringWithFormat:@"(not (%@ %@: '%@'))", searchBy, searchArgument, searchInput]; + if ([[[filters objectAtIndex:i] objectForKey: @"negative"] boolValue]) + searchString = [NSString stringWithFormat: @"(not (%@ %@: '%@'))", searchBy, searchArgument, searchInput]; + else + searchString = [NSString stringWithFormat: @"(%@ %@: '%@')", searchBy, searchArgument, searchInput]; + + searchQualifier = [EOQualifier qualifierWithQualifierFormat: searchString]; + [searchArray addObject: searchQualifier]; + } + if ([match isEqualToString: @"OR"]) + qualifier = [[EOOrQualifier alloc] initWithQualifierArray: searchArray]; else - searchString = [NSString stringWithFormat:@"(%@ %@: '%@')", searchBy, searchArgument, searchInput]; - - searchQualifier = [EOQualifier qualifierWithQualifierFormat:searchString]; - [searchArray addObject:searchQualifier]; - } - if ([match isEqualToString:@"OR"]) - qualifier = [[EOOrQualifier alloc] initWithQualifierArray: searchArray]; - else - qualifier = [[EOAndQualifier alloc] initWithQualifierArray: searchArray]; + qualifier = [[EOAndQualifier alloc] initWithQualifierArray: searchArray]; + } } return qualifier; diff --git a/UI/MailerUI/UIxMailSearch.m b/UI/MailerUI/UIxMailSearch.m index a89467df2..92a1ef427 100644 --- a/UI/MailerUI/UIxMailSearch.m +++ b/UI/MailerUI/UIxMailSearch.m @@ -40,26 +40,38 @@ - (void) dealloc { [item release]; + [super dealloc]; } -- (void) setItem: (NSString *) newItem +- (void) setItem: (id) newItem { ASSIGN(item, newItem); } -- (NSString *) item +- (id) item { return item; } +- (NSString *) currentFolderDisplayName +{ + return [[item allValues] lastObject]; +} + +- (NSString *) currentFolderPath +{ + return [[item allKeys] lastObject]; +} + - (NSArray *) mailAccountsList { - SOGoMailAccount *mAccount; + NSDictionary *accountName, *mailbox; + NSString *userName, *aString; SOGoMailAccounts *mAccounts; - NSString *userName, *option, *aString; + SOGoMailAccount *mAccount; NSArray *accountFolders; NSMutableArray *mailboxes; - NSDictionary *accountName; + int nbMailboxes, nbMailAccounts, i, j; // Number of accounts linked with the current user @@ -78,14 +90,17 @@ // Number of mailboxes inside the current account nbMailboxes = [accountFolders count]; - [mailboxes addObject:accountName]; + [mailboxes addObject: [NSDictionary dictionaryWithObject: accountName forKey: accountName]]; + for (j = 0; j < nbMailboxes; j++) { - option = [NSString stringWithFormat:@"%@%@", userName, [[accountFolders objectAtIndex:j] objectForKey:@"displayName"]]; - [mailboxes addObject:option]; + mailbox = [NSDictionary dictionaryWithObject: [NSString stringWithFormat:@"%@%@", userName, [[accountFolders objectAtIndex:j] objectForKey: @"displayName"]] + forKey: [[accountFolders objectAtIndex:j] objectForKey: @"path"]]; + [mailboxes addObject: mailbox]; } } + return mailboxes; } -@end \ No newline at end of file +@end diff --git a/UI/MailerUI/UIxMailView.m b/UI/MailerUI/UIxMailView.m index 371a2a504..8b6ec9218 100644 --- a/UI/MailerUI/UIxMailView.m +++ b/UI/MailerUI/UIxMailView.m @@ -315,6 +315,15 @@ static NSString *mailETag = nil; [matchingIdentityEMail retain]; } } + + if (!matchingIdentityEMail) + { + // This can happen if we receive the message because we are + // in the list of bcc. In this case, we take the first + // identity associated with the account. + matchingIdentityEMail = [[[[[self clientObject] mailAccountFolder] identities] lastObject] objectForKey: @"email"]; + RETAIN(matchingIdentityEMail); + } } return matchingIdentityEMail; @@ -487,13 +496,18 @@ static NSString *mailETag = nil; - (NGHashMap *) _receiptMessageHeaderTo: (NSString *) email { + NSString *subject, *from; NGMutableHashMap *map; - NSString *subject; map = [[NGMutableHashMap alloc] initWithCapacity: 1]; [map autorelease]; [map setObject: email forKey: @"to"]; - [map setObject: [self _matchingIdentityEMail] forKey: @"from"]; + + from = [self _matchingIdentityEMail]; + + if (from) + [map setObject: from forKey: @"from"]; + [map setObject: @"multipart/report; report-type=disposition-notification" forKey: @"content-type"]; subject = [NSString stringWithFormat: diff --git a/UI/MainUI/GNUmakefile b/UI/MainUI/GNUmakefile index 62837f307..acd40f8ef 100644 --- a/UI/MainUI/GNUmakefile +++ b/UI/MainUI/GNUmakefile @@ -32,6 +32,7 @@ MainUI_LOCALIZED_RESOURCE_FILES += \ ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make diff --git a/UI/MainUI/SOGoUserHomePage.m b/UI/MainUI/SOGoUserHomePage.m index 39d96ec26..f3a517549 100644 --- a/UI/MainUI/SOGoUserHomePage.m +++ b/UI/MainUI/SOGoUserHomePage.m @@ -215,7 +215,10 @@ timeZone: [endDate timeZone]]; interval = [endDate timeIntervalSinceDate: startDate] + 60; - intervals = interval / intervalSeconds; /* slices of 15 minutes */ + + // Slices of 15 minutes. The +4 is to take into account that we can + // have a timezone change during the freebusy lookup. + intervals = interval / intervalSeconds + 4; // Build a bit string representation of the freebusy data for the period freeBusyItems = NSZoneCalloc (NULL, intervals, sizeof (int)); diff --git a/UI/MainUI/SpanishArgentina.lproj/Localizable.strings b/UI/MainUI/SpanishArgentina.lproj/Localizable.strings index 99f0cdbee..cd3c336be 100644 --- a/UI/MainUI/SpanishArgentina.lproj/Localizable.strings +++ b/UI/MainUI/SpanishArgentina.lproj/Localizable.strings @@ -10,9 +10,9 @@ "Connect" = "Conectar"; "Wrong username or password." = "Nombre de usuario o contraseña incorrectos."; -"cookiesNotEnabled" = "No se puede conectar dado que su navegador no acepta cookies. Por favor, habilite las cookies en la configuración de su navegador y pruebe de nuevo."; +"cookiesNotEnabled" = "No se puede conectar debido a que su navegador no acepta cookies. Por favor, habilite las cookies en la configuración de su navegador y pruebe de nuevo."; -"browserNotCompatible" = "Hemos detectado que éste sistema no soporta su versión del navegador. Recomendamos usar Firefox. Haga click en el siguiente enlace para descargar la versión más reciente de este navegador."; +"browserNotCompatible" = "Hemos detectado que éste sistema no soporta la versión de su navegador. Recomendamos usar Firefox. Haga click en el siguiente enlace para descargar la versión más reciente de este navegador."; "alternativeBrowsers" = "Como alternativa, también puede usar uno se los siguientes navegadores compatibles: "; "alternativeBrowserSafari" = "Como alternativa, puede usar Safari."; "Download" = "Descarga"; @@ -44,7 +44,7 @@ "Welsh" = "Cymraeg"; "About" = "Acerca de"; -"AboutBox" = "Desarrollado por Inverse, SOGo es un servidor groupware (software colaborativo) con todas las características necesarias con un focus para simlicidad y capacidad de ampliación.

\nSOGo facilita una interface web rica basada en AJAX Web y soporta una multitud de clientes a través del soporte de protocolos estándares como CalDAV y CardDAV.

\nSOGo esta distribuido bajo GNU GPL versión 2 o siguiente, y partes bajo la licencia GNU LGPL versión 2. Esto es software libre: esta autorizado el cambio y la redistribución del mismo. No hay garantías, dentro del límite de la ley.

\nVer esta página para las diferentes opciones de soporte."; +"AboutBox" = "SOGo, una herramienta desarrollada por Inverse, es un servidor con múltiples funcionalidades para facilitar el trabajo en grupo. El enfoque de SOGo es la sencillez y la escalabilidad.

\nSOGo provee una potente interfaz Web basada en AJAX y soporta una amplia variedad de clientes nativos mediante el uso de protocólos estándar como CalDAV y CarDAV.

\nSOGO se distribuye bajo la licencia GNU GPL versión 2 o superior. Algunas partes se distribuyen bajo la licencia GNU LGPL version 2. SOGo es software libre: Usted es libre de modificarlo y redistribuirlo. SOGo se distribuye SIN NINGUNA GARANTIA según los alcances permitidos por la ley.

\nConsulte esta página para conocer varias opciones de soporte."; "Your account was locked due to too many failed attempts." = "Su cuenta ha sido bloqueada debido a un número excesivo de errores de conexión."; "Your account was locked due to an expired password." = "Su cuenta ha sido bloqueada debido a una contraseña caducada."; diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings index eae77b19b..7e3c88b2d 100644 --- a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Encaminhar"; "Password" = "Senha"; "Categories" = "Categorias"; +"Appointments invitations" = "Convites de Compromissos"; "Name" = "Nome"; "Color" = "Cor"; "Add" = "Adicionar"; @@ -97,44 +98,43 @@ "Show time as busy outside working hours" = "Exibir horas como ocupadas quando fora do horário de serviço"; "First week of year :" = "Primeira semana do ano :"; "Enable reminders for Calendar items" = "Habilitar lembretes para os itens do Calendário"; -"Play a sound when a reminder comes due" -= "Executar um som quando existir um lembrete"; +"Play a sound when a reminder comes due" = "Executar um som quando existir um lembrete"; "Default reminder :" = "Lembrete padrão :"; "firstWeekOfYear_January1" = "Inicia em 01 de janeiro"; "firstWeekOfYear_First4DayWeek" = "Primeira semana com 4 dias"; "firstWeekOfYear_FirstFullWeek" = "Primeira semana com 5 dias"; +"Prevent from being invited to appointments" = "Impedir de ser convidado para um compromisso"; +"White list for appointment invitations:" = "Lista branca para convites de compromissos:"; +"Contacts Names" = "Nomes de Contatos"; + /* Default Calendar */ "Default calendar :" = "Calendário Padrão"; "selectedCalendar" = "Calendário selecionado"; "personalCalendar" = "Calendário pessoal"; "firstCalendar" = "Calendário habilizado pela primeira vez"; +"reminder_NONE" = "Não lembrar"; "reminder_5_MINUTES_BEFORE" = "5 minutos"; "reminder_10_MINUTES_BEFORE" = "10 minutos"; "reminder_15_MINUTES_BEFORE" = "15 minutos"; "reminder_30_MINUTES_BEFORE" = "30 minutos"; +"reminder_45_MINUTES_BEFORE" = "45 minutos antes"; "reminder_1_HOUR_BEFORE" = "1 hora"; "reminder_2_HOURS_BEFORE" = "2 horas"; -"reminder_5_HOURS_BEFORE"= "5 horas"; -"reminder_15_HOURS_BEFORE"= "15 horas"; +"reminder_5_HOURS_BEFORE" = "5 horas"; +"reminder_15_HOURS_BEFORE" = "15 horas"; "reminder_1_DAY_BEFORE" = "1 dia"; "reminder_2_DAYS_BEFORE" = "2 dias"; +"reminder_1_WEEK_BEFORE" = "1 semana antes"; /* Mailer */ +"Labels" = "Etiquetas"; "Label" = "Etiqueta"; "Show subscribed mailboxes only" = "Exibir somente caixas de correio inscritas"; "Sort messages by threads" = "Ordenar mensagens por tópicos"; -"Check for new mail:" = "Checar novos emails:"; -"refreshview_manually" = "Manualmente"; -"refreshview_every_minute" = "A cada minuto"; -"refreshview_every_2_minutes" = "A cada 2 minutos"; -"refreshview_every_5_minutes" = "A cada 5 minutos"; -"refreshview_every_10_minutes" = "A cada 10 minutos"; -"refreshview_every_20_minutes" = "A cada 20 minutos"; -"refreshview_every_30_minutes" = "A cada 30 minutos"; -"refreshview_once_per_hour" = "Uma vez por hora"; +"When sending mail, add unknown recipients to my" = "Ao enviar e-mail, adicionar destinatários desconhecidos ao meu"; "Forward messages:" = "Encaminhar mensagens:"; "messageforward_inline" = "No corpo da mensagem"; @@ -153,6 +153,10 @@ "displayremoteinlineimages_never" = "Nunca"; "displayremoteinlineimages_always" = "Sempre"; +/* Contact */ +"Personal Address Book" = "Catálogo Pessoal"; +"Collected Address Book" = "Catálogo Coletado"; + /* IMAP Accounts */ "New Mail Account" = "Nova conta de e-mail"; @@ -200,6 +204,7 @@ "Mail" = "Correio"; "Last" = "Último usado"; "Default Module :" = "Módulo Padrão:"; +"SOGo Version :" = "Versão SOGo:"; "Language :" = "Idioma :"; "choose" = "Escolha ..."; @@ -227,6 +232,16 @@ "Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; +"Refresh View :" = "Atualizar a Visualização:"; +"refreshview_manually" = "Manualmente"; +"refreshview_every_minute" = "A cada minuto"; +"refreshview_every_2_minutes" = "A cada 2 minutos"; +"refreshview_every_5_minutes" = "A cada 5 minutos"; +"refreshview_every_10_minutes" = "A cada 10 minutos"; +"refreshview_every_20_minutes" = "A cada 20 minutos"; +"refreshview_every_30_minutes" = "A cada 30 minutos"; +"refreshview_once_per_hour" = "Uma vez por hora"; + /* Return receipts */ "When I receive a request for a return receipt:" = "Quando eu receber uma confirmação de leitura:"; "Never send a return receipt" = "Nunca enviar confirmação"; @@ -244,6 +259,8 @@ "Active" = "Ativo"; "Move Up" = "Mover para cima"; "Move Down" = "Move para baixo"; +"Connection error" = "Erro de conexão"; +"Service temporarily unavailable" = "Serviço temporariamente indisponível"; /* Filters - UIxFilterEditor */ "Filter name:" = "Nome do filtro:"; @@ -261,6 +278,7 @@ "To or Cc" = "Para ou Cc"; "Size (Kb)" = "Tamanho (Kb)"; "Header" = "Cabeçalho"; +"Body" = "Corpo"; "Flag the message with:" = "Marcar a mensagem com:"; "Discard the message" = "Discate a mensagem"; "File the message in:" = "Arquivo da mensagem em:"; @@ -287,12 +305,8 @@ "Flagged" = "Marcado"; "Junk" = "Lixo"; "Not Junk" = "Não é Lixo"; -"Label 1" = "Rótulo 1"; -"Label 2" = "Rótulo 2"; -"Label 3" = "Rótulo 3"; -"Label 4" = "Rótulo 4"; -"Label 5" = "Rótulo 5"; +/* Password policy */ "The password was changed successfully." = "Senha alterada com sucesso."; "Password must not be empty." = "Le mot de passe ne doit pas être vide."; "The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau."; diff --git a/UI/PreferencesUI/Czech.lproj/Localizable.strings b/UI/PreferencesUI/Czech.lproj/Localizable.strings index 2d36eb27a..4a4b15302 100644 --- a/UI/PreferencesUI/Czech.lproj/Localizable.strings +++ b/UI/PreferencesUI/Czech.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Přeposílání"; "Password" = "Heslo"; "Categories" = "Kategorie"; +"Appointments invitations" = "Pozvání na schůzky"; "Name" = "Jméno"; "Color" = "Barva"; "Add" = "Přidat"; diff --git a/UI/PreferencesUI/Dutch.lproj/Localizable.strings b/UI/PreferencesUI/Dutch.lproj/Localizable.strings index 38d208cfe..ad1a94ffd 100644 --- a/UI/PreferencesUI/Dutch.lproj/Localizable.strings +++ b/UI/PreferencesUI/Dutch.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Doorsturen"; "Password" = "Wachtwoord"; "Categories" = "Categorieën"; +"Appointments invitations" = "Uitnodigingen voor afspraken"; "Name" = "Naam"; "Color" = "Kleur"; "Add" = "Toevoegen"; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 65219eec9..ebc9ace4e 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Forward"; "Password" = "Password"; "Categories" = "Categories"; +"Appointments invitations" = "Appointments invitations"; "Name" = "Name"; "Color" = "Color"; "Add" = "Add"; diff --git a/UI/PreferencesUI/Finnish.lproj/Localizable.strings b/UI/PreferencesUI/Finnish.lproj/Localizable.strings index 0b4525532..c7ab17780 100644 --- a/UI/PreferencesUI/Finnish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Finnish.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Edelleenlähetys"; "Password" = "Salasana"; "Categories" = "Luokat"; +"Appointments invitations" = "Kalenterikutsut"; "Name" = "Nimi"; "Color" = "Väri"; "Add" = "Lisää"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index 58218f0e6..c4a1c5e00 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Transfert"; "Password" = "Mot de passe"; "Categories" = "Catégories"; +"Appointments invitations" = "Invitations"; "Name" = "Nom"; "Color" = "Couleur"; "Add" = "Ajouter"; diff --git a/UI/PreferencesUI/GNUmakefile b/UI/PreferencesUI/GNUmakefile index 7aa0511d2..c2c75ab39 100644 --- a/UI/PreferencesUI/GNUmakefile +++ b/UI/PreferencesUI/GNUmakefile @@ -28,6 +28,7 @@ PreferencesUI_LOCALIZED_RESOURCE_FILES += \ ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make diff --git a/UI/PreferencesUI/German.lproj/Localizable.strings b/UI/PreferencesUI/German.lproj/Localizable.strings index 050f7c3a5..71cea96b0 100644 --- a/UI/PreferencesUI/German.lproj/Localizable.strings +++ b/UI/PreferencesUI/German.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Weiterleitung"; "Password" = "Passwort"; "Categories" = "Kategorien"; +"Appointments invitations" = "Einladungen zu Terminen"; "Name" = "Name"; "Color" = "Farbe"; "Add" = "Hinzufügen"; diff --git a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings index 97c5be583..6bff739fb 100644 --- a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Továbbítás"; "Password" = "Jelszó"; "Categories" = "Kategóriák"; +"Appointments invitations" = "Találkozó meghívók"; "Name" = "Név"; "Color" = "Szín"; "Add" = "Hozzáadás"; diff --git a/UI/PreferencesUI/Polish.lproj/Localizable.strings b/UI/PreferencesUI/Polish.lproj/Localizable.strings index df1126f96..7bf185c5e 100644 --- a/UI/PreferencesUI/Polish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Polish.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Przekazywanie"; "Password" = "Hasło"; "Categories" = "Kategorie"; +"Appointments invitations" = "Ograniczanie zaproszeń"; "Name" = "Nazwa"; "Color" = "Kolor"; "Add" = "Dodaj"; diff --git a/UI/PreferencesUI/Russian.lproj/Localizable.strings b/UI/PreferencesUI/Russian.lproj/Localizable.strings index 493e39f58..0dc61be59 100644 --- a/UI/PreferencesUI/Russian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Russian.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Переслать"; "Password" = "Пароль"; "Categories" = "Категории"; +"Appointments invitations" = "Цель приглашения"; "Name" = "Имя"; "Color" = "Цвет"; "Add" = "Добавить"; @@ -90,10 +91,10 @@ "timeFmt_4" = ""; /* calendar */ -"Week begins on :" = "Неделя начинается с :"; -"Day start time :" = "Рабочий день начинается в :"; +"Week begins on :" = "Неделя начинается с:"; +"Day start time :" = "Рабочий день начинается в:"; "Day end time :" = "Рабочий день заканчивается в :"; -"Day start time must be prior to day end time." = "Day start time must be prior to day end time."; +"Day start time must be prior to day end time." = "Время начала дня должно быть перед временем его окончания."; "Show time as busy outside working hours" = "Показывать время, как занятое, если оно за границами рабочего времени."; "First week of year :" = "Первая неделя года :"; "Enable reminders for Calendar items" = "Включить напоминания для событий календаря"; @@ -124,8 +125,8 @@ "reminder_2_HOURS_BEFORE" = "2 часа"; "reminder_5_HOURS_BEFORE" = "5 часа"; "reminder_15_HOURS_BEFORE" = "15 часов"; -"reminder_1_DAY_BEFORE" = "1 день"; -"reminder_2_DAYS_BEFORE" = "2 дня"; +"reminder_1_DAY_BEFORE" = "1 день назад"; +"reminder_2_DAYS_BEFORE" = "2 дня назад"; "reminder_1_WEEK_BEFORE" = "За 1 неделю"; /* Mailer */ @@ -145,7 +146,7 @@ "And place my signature" = "И поместить мою подпись"; "signatureplacement_above" = "под ответом"; "signatureplacement_below" = "под цитируемым текстом письма"; -"Compose messages in" = "Compose messages in"; +"Compose messages in" = "Составлять сообщения в"; "composemessagestype_html" = "HTML"; "composemessagestype_text" = "Plain text"; "Display remote inline images" = "Показать встроенные изображения из сети"; @@ -159,11 +160,11 @@ /* IMAP Accounts */ "New Mail Account" = "New Mail Account"; -"Server Name:" = "Server Name:"; -"Port:" = "Port:"; +"Server Name:" = "Имя сервера:"; +"Port:" = "Порт:"; "Encryption:" = "Шифрование:"; "None" = "Нет"; -"User Name:" = "User Name:"; +"User Name:" = "Имя пользователя:"; "Password:" = "Пароль:"; "Full Name:" = "Full Name:"; @@ -173,7 +174,7 @@ "(Click to create)" = "(Click to create)"; "Signature" = "Подпись"; -"Please enter your signature below:" = "Please enter your signature below:"; +"Please enter your signature below:" = "Введите вашу подпись ниже:"; "Please specify a valid sender address." = "Пожалуйста укажите правильный адрес отправителя."; "Please specify a valid reply-to address." = "Пожалуйста укажите правильный адрес для ответа."; @@ -194,7 +195,7 @@ "PRIVATE_item" = "Private"; /* Event+task categories */ -"category_none" = "None"; +"category_none" = "Нет"; "calendar_category_labels" = "Годовщина,День рождения,Деловые,Звонки,Клиенты,Конкуренты,Потребители,Избранное,Вслед за,Подарки,Праздники,Идеи,Встречи,Проблемы,Разное,Персональное,Проекты,Государственный праздник,Статус,Поставщики,Путешествия,Отпуск"; /* Default module */ @@ -202,10 +203,10 @@ "Contacts" = "Адресная книга"; "Mail" = "Почта"; "Last" = "Последнее использование"; -"Default Module :" = "Модуль по умолчанию :"; +"Default Module :" = "Модуль по умолчанию:"; "SOGo Version :" = "Версия SOGo:"; -"Language :" = "Язык :"; +"Language :" = "Язык:"; "choose" = "Выбрать ..."; "Arabic" = "العربية"; "Catalan" = "Català"; @@ -271,12 +272,12 @@ "Untitled Filter" = "Фильтр без названия"; "Subject" = "Subject"; -"From" = "From"; +"From" = "От"; "To" = "To"; "Cc" = "Cc"; "To or Cc" = "To or Cc"; -"Size (Kb)" = "Size (Kb)"; -"Header" = "Header"; +"Size (Kb)" = "Размер (кБ)"; +"Header" = "Заголовок"; "Body" = "Тело письма"; "Flag the message with:" = "Пометить сообщение с:"; "Discard the message" = "Уничтожить сообщение"; diff --git a/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings b/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings index 98f09d019..45ccd63df 100644 --- a/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +++ b/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Desvío"; "Password" = "Contraseña"; "Categories" = "Categorías"; +"Appointments invitations" = "Invitaciones a eventos"; "Name" = "Nombre"; "Color" = "Color"; "Add" = "Añadir"; @@ -104,6 +105,10 @@ "firstWeekOfYear_First4DayWeek" = "Primera semana del año de 4 días"; "firstWeekOfYear_FirstFullWeek" = "Primera semana del año completa"; +"Prevent from being invited to appointments" = "No permitir que otros me inviten a eventos"; +"White list for appointment invitations:" = "Lista de excepciones para invitación a eventos:"; +"Contacts Names" = "Nombre de los contactos"; + /* Default Calendar */ "Default calendar :" = "Calendario por defecto"; "selectedCalendar" = "Calendario seleccionado"; @@ -130,15 +135,6 @@ "Show subscribed mailboxes only" = "Mostrar sólo buzones suscritos"; "Sort messages by threads" = "Ordenar mensajes por conversaciones"; "When sending mail, add unknown recipients to my" = "Al enviar correos, agregar destinatarios desconocidos a mi"; -"Check for new mail:" = "Comprobar si hay nuevos correos: "; -"refreshview_manually" = "Manualmente"; -"refreshview_every_minute" = "Cada minuto"; -"refreshview_every_2_minutes" = "Cada 2 minutos"; -"refreshview_every_5_minutes" = "Cada 5 minutos"; -"refreshview_every_10_minutes" = "Cada 10 minutos"; -"refreshview_every_20_minutes" = "Cada 20 minutos"; -"refreshview_every_30_minutes" = "Cada 30 minutos"; -"refreshview_once_per_hour" = "Cada hora"; "Forward messages:" = "Reenviar mensajes:"; "messageforward_inline" = "Incorporado"; @@ -236,6 +232,16 @@ "Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; +"Refresh View :" = "Actualizar la vista:"; +"refreshview_manually" = "Manualmente"; +"refreshview_every_minute" = "Cada minuto"; +"refreshview_every_2_minutes" = "Cada 2 minutos"; +"refreshview_every_5_minutes" = "Cada 5 minutos"; +"refreshview_every_10_minutes" = "Cada 10 minutos"; +"refreshview_every_20_minutes" = "Cada 20 minutos"; +"refreshview_every_30_minutes" = "Cada 30 minutos"; +"refreshview_once_per_hour" = "Cada hora"; + /* Return receipts */ "When I receive a request for a return receipt:" = "Cuando reciba una petición de un acuse de recibo:"; "Never send a return receipt" = "Nunca enviar un acuse de recibo"; diff --git a/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings b/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings index ebad76559..cb59f9ee5 100644 --- a/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +++ b/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Desvío"; "Password" = "Contraseña"; "Categories" = "Categorías"; +"Appointments invitations" = "Avisos de Eventos"; "Name" = "Nombre"; "Color" = "Color"; "Add" = "Añadir"; diff --git a/UI/PreferencesUI/UIxFilterEditor.m b/UI/PreferencesUI/UIxFilterEditor.m index 964ff44b6..50ae1af15 100644 --- a/UI/PreferencesUI/UIxFilterEditor.m +++ b/UI/PreferencesUI/UIxFilterEditor.m @@ -1,6 +1,6 @@ /* UIxFilterEditor.m - this file is part of SOGo * - * Copyright (C) 2010-2013 Inverse inc. + * Copyright (C) 2010-2014 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,7 +36,6 @@ { NSString *filterId; NSDictionary *labels; - NSString *folderEncoding; } @end @@ -114,9 +113,9 @@ return [labels jsonRepresentation]; } -- (NSString *) folderEncoding +- (NSString *) sieveFolderEncoding { - return [[SOGoSystemDefaults sharedSystemDefaults] folderEncoding]; + return [[SOGoSystemDefaults sharedSystemDefaults] sieveFolderEncoding]; } @end diff --git a/UI/SOGoUI/GNUmakefile b/UI/SOGoUI/GNUmakefile index 2b781caed..7ec6f08dc 100644 --- a/UI/SOGoUI/GNUmakefile +++ b/UI/SOGoUI/GNUmakefile @@ -11,6 +11,8 @@ libSOGoUI_HEADER_FILES_DIR = . libSOGoUI_HEADER_FILES_INSTALL_DIR = /SOGoUI libSOGoUI_INTERFACE_VERSION = $(MAJOR_VERSION).$(MINOR_VERSION) +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo + libSOGoUI_HEADER_FILES += \ \ UIxJSClose.h \ @@ -32,5 +34,6 @@ libSOGoUI_OBJC_FILES += \ ifneq ($(FHS_INSTALL_ROOT),) GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include endif +GNUSTEP_TARGET_LDIR=sogo include $(GNUSTEP_MAKEFILES)/library.make -include GNUmakefile.postamble diff --git a/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings index a2c92dfe9..3c5891e81 100644 --- a/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings @@ -5,6 +5,7 @@ "Create a new event" = "Criar um novo evento"; "Create a new task" = "Criar uma nova tarefa"; "Edit this event or task" = "Editar este evento ou tarefa"; +"Print the current calendar view" = "Imprimir a visualização do calendário atual"; "Delete this event or task" = "Apagar este evento ou tarefa"; "Go to today" = "Vai para hoje"; "Switch to day view" = "Visualizar Dia"; @@ -117,7 +118,7 @@ "Name of the Calendar" = "Nome deste Calendário"; "new" = "Novo"; -"printview" = "Visualizar Impressão"; +"Print view" = "Visualização de Impressão"; "edit" = "Editar"; "delete" = "Apagar"; "proposal" = "Proposta"; @@ -145,6 +146,20 @@ "Hide already accepted and rejected appointments" = "Ocultar apontamentos já aceitos e rejeitados"; "Show already accepted and rejected appointments" = "Exibir apontamentos já aceitos e rejeitados"; +/* Print view */ + +"LIST" = "Lista"; +"Print Settings" = "Configurações de Impressão"; +"Title:" = "Título:"; +"Layout:" = "Layout:"; +"What to Print" = "O que imprimir"; +"Options" = "Opções"; +"Tasks with no due date" = "Tarefas sem data de vencimento"; +"Display working hours only" = "Exibir somente o horário de trabalho"; +"Completed tasks" = "Tarefas Completadas"; +"Display events and tasks colors" = "Exibir eventos e tarefas com cores"; +"Borders" = "Fronteiras"; +"Backgrounds" = "Segundo plano"; /* Appointments */ @@ -225,8 +240,13 @@ "view_future" = "Todos os Eventos Futuros"; "view_selectedday" = "Dia Selecionado"; +"view_not_started" = "Tarefas não iniciadas"; +"view_overdue" = "Tarefas em atraso"; +"view_incomplete" = "Tarefas incompletas"; + "View:" = "Visão:"; -"Title or Description" = "Título ou Descrição"; +"Title, category or location" = "Título, categoria ou localização"; +"Entire content" = "Todo o conteúdo"; "Search" = "Pesquisar"; "Search attendees" = "Pesquisar participantes"; @@ -506,7 +526,7 @@ vtodo_class2 = "(Tarefa Confidencial)"; "Links to this Calendar" = "Links para este Calendário"; "Authenticated User Access" = "Acesso a Usuário Autenticado"; -"CalDAV URL" = "CalDAV url"; +"CalDAV URL" = "CalDAV URL:"; "WebDAV ICS URL" = "WebDAV ICS URL"; "WebDAV XML URL" = "WebDAV XML URL"; @@ -526,6 +546,8 @@ vtodo_class2 = "(Tarefa Confidencial)"; "tagWasRemoved" = "Se você remover este calendário da sincronização, será necessário sincronizar novamente seus dados no dispositivo móvel.\nContinuar?"; "DestinationCalendarError" = "Os calendários de origem e destino são os mesmos. Por favor, tente copiar para outro calendário diferente."; "EventCopyError" = "A cópia falhou. Por favor, tente copiar para um calendário diferente."; +"Please select at least one calendar" = "Por favor, selecione pelo menos um calendário"; + "Open Task..." = "Abrir Tarefa..."; "Mark Completed" = "Marcar como Concluída"; diff --git a/UI/Scheduler/GNUmakefile b/UI/Scheduler/GNUmakefile index 9f96857a6..cc574b512 100644 --- a/UI/Scheduler/GNUmakefile +++ b/UI/Scheduler/GNUmakefile @@ -72,6 +72,7 @@ SchedulerUI_RESOURCE_FILES += \ ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/ ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/ +ADDITIONAL_LDFLAGS += -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make diff --git a/UI/Scheduler/SpanishArgentina.lproj/Localizable.strings b/UI/Scheduler/SpanishArgentina.lproj/Localizable.strings index 893f9d4dd..a987dcfbf 100644 --- a/UI/Scheduler/SpanishArgentina.lproj/Localizable.strings +++ b/UI/Scheduler/SpanishArgentina.lproj/Localizable.strings @@ -29,7 +29,7 @@ /* Week */ "Week" = "Semana"; -"this week" = "ésta semana"; +"this week" = "esta semana"; "Week %d" = "Semana %d"; @@ -38,14 +38,14 @@ /* Month */ -"this month" = "éste mes"; +"this month" = "este mes"; "Previous Month" = "Mes anterior"; "Next Month" = "Próximo mes"; /* Year */ -"this year" = "éste año"; +"this year" = "este año"; /* Menu */ @@ -155,7 +155,11 @@ "What to Print" = "Qué imprimir"; "Options" = "Opciones"; "Tasks with no due date" = "Tareas sin fecha de vencimiento"; +"Display working hours only" = "Mostrar solo las horas laborables"; "Completed tasks" = "Tareas completadas"; +"Display events and tasks colors" = "Mostrar los colores de los eventos y las tareas"; +"Borders" = "Bordes"; +"Backgrounds" = "Fondos"; /* Appointments */ @@ -542,6 +546,8 @@ vtodo_class2 = "(Tarea confidencial)"; "tagWasRemoved" = "Si quita este calendario de la sincronización, necesitará recargar los datos en su teléfono móvil.\n¿Continuar?"; "DestinationCalendarError" = "El calendario de origen y el de destino son iguales. Por favor, intente copiar a otro calendario."; "EventCopyError" = "La copia falló. Por favor, intente copiar a un calendario distinto."; +"Please select at least one calendar" = "Por favor, seleccione al menos un calendario"; + "Open Task..." = "Abrir tarea..."; "Mark Completed" = "Marcar como completo"; diff --git a/UI/Templates/MailerUI/UIxMailSearch.wox b/UI/Templates/MailerUI/UIxMailSearch.wox index f26233de5..669bd6d02 100644 --- a/UI/Templates/MailerUI/UIxMailSearch.wox +++ b/UI/Templates/MailerUI/UIxMailSearch.wox @@ -24,7 +24,12 @@ - + diff --git a/UI/WebServerResources/AdministrationUI.js b/UI/WebServerResources/AdministrationUI.js index a2855464e..a22f9d8d1 100644 --- a/UI/WebServerResources/AdministrationUI.js +++ b/UI/WebServerResources/AdministrationUI.js @@ -153,15 +153,11 @@ function addFolderBranchToTree(tree, user, folder, nodeId, subId, isLast) { else icon += 'calendar-folder-16x16.png'; var folderId = user + ":" + folder.name.substr(1); - var name = folder.displayName.escapeHTML(); // name has the format "Folername (Firstname Lastname )" - var pos = name.lastIndexOf(' ('); - if (pos > -1) - name = name.substring(0, pos); // strip the part with fullname and email + var name = folder.displayName.escapeHTML(); var node = new dTreeNode(subId, nodeId, name, 0, '#', folderId, folder.type + '-folder', '', '', icon, icon); node._ls = isLast; var content = tree.node(node, (nodeId + subId), null); - content._formattedName = folder.formattedName; return content; } diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index bfe85c311..fd460859c 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -1113,19 +1113,14 @@ function onAddressBooksMenuPrepareVisibility() { var menu = $("contactFoldersMenu").down("ul");; var listElements = menu.childNodesWithTag("li"); - var modifyOption = listElements[0]; var newListOption = listElements[3]; var removeOption = listElements[5]; var exportOption = listElements[7]; var importOption = listElements[8]; var sharingOption = listElements[listElements.length - 1]; - // Disable the "Sharing" and "Modify" options when address book - // is not owned by user + // Disable the "Sharing" option when address book is not owned by user if (folderOwner == UserLogin || IsSuperUser) { - modifyOption.removeClassName("disabled"); // WARNING: will fail - // for super users - // anyway var aclEditing = selected[0].getAttribute("acl-editing"); if (aclEditing && aclEditing == "available") { sharingOption.removeClassName("disabled"); @@ -1147,8 +1142,7 @@ function onAddressBooksMenuPrepareVisibility() { newListOption.addClassName("disabled"); } - /* Disable the "remove" and "export ab" options when address book is - public */ + // Disable the "remove" and "export ab" options when address book is public if (folderOwner == "nobody") { exportOption.addClassName("disabled"); importOption.addClassName("disabled"); @@ -1629,7 +1623,7 @@ function onContactsReload () { } function initRefreshViewCheckTimer() { - var refreshViewCheck = UserDefaults["SOGoRefreshViewCheck"]; + var refreshViewCheck = typeof UserDefaults == 'undefined' ? false : UserDefaults["SOGoRefreshViewCheck"]; if (refreshViewCheck && refreshViewCheck != "manually") { var interval; if (refreshViewCheck == "once_per_hour") diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 7a5e592f0..995a11f9c 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -843,7 +843,7 @@ function composeNewMessage() { function openMailbox(mailbox, reload) { if (mailbox != Mailer.currentMailbox || reload) { var url = ApplicationBaseURL + encodeURI(mailbox.unescapeHTML()); - var urlParams = {}; + var urlParams = {filters: [], sortingAttributes: {}}; if (!reload) { var messageContent = $("messageContent"); diff --git a/UI/WebServerResources/UIxContactsUserFolders.js b/UI/WebServerResources/UIxContactsUserFolders.js index c473906b9..37433ccaf 100644 --- a/UI/WebServerResources/UIxContactsUserFolders.js +++ b/UI/WebServerResources/UIxContactsUserFolders.js @@ -199,7 +199,7 @@ function addFolderBranchToTree(tree, user, folder, nodeId, subId, isLast) { node._ls = isLast; var content = tree.node(node, (nodeId + subId), null); - content._formattedName = folder.formattedName; + content.displayName = folder.displayName; return content; } @@ -228,7 +228,7 @@ function onConfirmFolderSelection(event) { folderName = description.replace(/>,.*$/, ">", "g"); } else { - folderName = node._formattedName; + folderName = node.displayName; } var data = { folderName: folderName, folder: folder, type: type, window: window }; if (parent$(accessToSubscribedFolder(folder))) diff --git a/UI/WebServerResources/UIxMailSearch.js b/UI/WebServerResources/UIxMailSearch.js index 7c25bdd78..46e966acd 100644 --- a/UI/WebServerResources/UIxMailSearch.js +++ b/UI/WebServerResources/UIxMailSearch.js @@ -30,7 +30,7 @@ function onSearchClick() { } } - for (i = 0; i < filterRows.length; i++){ + for (i = 0; i < filterRows.length; i++) { // Get the information from every filter row before triggering the AJAX call var filter = {}; var searchByOptions = filterRows[i].down(".searchByList").options; @@ -72,47 +72,47 @@ function searchMails() { var optionsList = $("mailAccountsList").options; var nbOptions = optionsList.length; var selectedIndex = optionsList.selectedIndex; - var accountNumber, accountUser, folderPath, folderName; + var accountNumber, folderPath, folderName; var mailAccountIndex = mailAccounts.indexOf(searchParams.searchLocation); + var root = false; if (mailAccountIndex != -1) { accountNumber = "/" + mailAccountIndex; - folderName = accountNumber + "/folderINBOX"; - accountUser = userNames[mailAccountIndex]; - folderPath = accountUser; + folderName = "INBOX"; + folderPath = accountNumber + "/folderINBOX"; + root = true; } else { var searchLocation = searchParams.searchLocation.split("/"); - accountUser = searchLocation[0]; - accountNumber = "/" + userNames.indexOf(accountUser); + accountNumber = "/" + userNames.indexOf(searchLocation[0]); + folderName = optionsList[optionsList.selectedIndex].text.split("/").pop(); - var position = searchLocation.length; - folderName = accountNumber + "/folder" + searchLocation[1].asCSSIdentifier(); - for (i = 2; i < position; i++) - folderName += "/folder" + searchLocation[i]; - - folderPath = optionsList[selectedIndex].innerHTML; + var paths = optionsList[optionsList.selectedIndex].value.split("/"); + folderPath = accountNumber; + for (j = 1; j < paths.length; j++) { + folderPath += "/folder" + paths[j]; + } } var subfolders = []; if (searchParams.subfolder === true) { - for (i = 0; i < nbOptions; i++) { - if ((optionsList[i].innerHTML.search(folderPath) != -1) && (i != selectedIndex)) { - var splitArray = optionsList[i].innerHTML.split("/"); - // Remove the user information since it is not required - splitArray.splice(0, 1); - var subfolder = []; - var level = splitArray.length; - for(j = 0; j < level; j++) { - subfolder += "/folder" + splitArray[j]; - } - subfolders.push(accountNumber + subfolder); + for (i = 1; i < nbOptions; i++) { + var paths = optionsList[i].value.split("/"); + var subfolder = accountNumber; + for (j = 1; j < paths.length; j++) { + subfolder += "/folder" + paths[j]; + } + + if (root || subfolder.indexOf(folderPath) == 0) { + var keypair = {"folderPath" : subfolder, + "folderName" : optionsList[i].text.split("/").pop() }; + subfolders.push(keypair); } } } - var urlstr = (ApplicationBaseURL + folderName + "/uids"); - var callbackData = {"folderName" : folderName, "subfolders" : subfolders, "newSearch" : true}; + var urlstr = (ApplicationBaseURL + folderPath + "/uids"); + var callbackData = {"folderName" : folderName, "folderPath" : folderPath, "subfolders" : subfolders, "newSearch" : true}; var object = {"filters":searchParams.filters, "sortingAttributes":{"match":searchParams.filterMatching}}; var content = Object.toJSON(object); document.searchMailsAjaxRequest = triggerAjaxRequest(urlstr, searchMailsCallback, callbackData, content, {"content-type": "application/json"}); @@ -130,8 +130,6 @@ function searchMailsCallback(http) { for (var x = count; x >= 0; x--){ $(oldEntries[x]).remove(); } - - } // ["To", "Attachment", "Flagged", "Subject", "From", "Unread", "Priority", "Date", "Size", "rowClasses", "labels", "rowID", "uid"] @@ -143,7 +141,7 @@ function searchMailsCallback(http) { var row = document.createElement("tr"); Element.addClassName(row, "resultsRow"); row.setAttribute("uid", response.headers[i][12]); - row.setAttribute("folderName", http.callbackData.folderName); + row.setAttribute("folderPath", http.callbackData.folderPath); var cell1 = document.createElement("td"); Element.addClassName(cell1, "td_table_1"); @@ -168,10 +166,7 @@ function searchMailsCallback(http) { var cell5 = document.createElement("td"); Element.addClassName(cell5, "td_table_5"); cell5.setAttribute("colspan", "2"); - var folderPath = http.callbackData.folderName.split("/"); - var folderLocation = folderPath[folderPath.length - 1]; // get the last element of the array (location) - folderLocation = folderLocation.substr(6); // strip down the prefix folder - cell5.innerHTML = folderLocation; + cell5.innerHTML = http.callbackData.folderName; row.appendChild(cell5); table.appendChild(row); @@ -192,12 +187,13 @@ function searchMailsCallback(http) { } if (http.callbackData.subfolders.length > 0) { - var folderName = http.callbackData.subfolders[0]; + var folderName = http.callbackData.subfolders[0].folderName; + var folderPath = http.callbackData.subfolders[0].folderPath; var subfolders = http.callbackData.subfolders; subfolders.splice(0, 1); - var urlstr = (ApplicationBaseURL + folderName + "/uids"); - var callbackData = {"folderName" : folderName, "subfolders" : subfolders, "newSearch" : false}; + var urlstr = (ApplicationBaseURL + folderPath + "/uids"); + var callbackData = {"folderName" : folderName, "folderPath" : folderPath, "subfolders" : subfolders, "newSearch" : false}; // TODO - need to add these following contents ; asc, no-headers, sort var object = {"filters":searchParams.filters, "sortingAttributes":{"match":searchParams.filterMatching}}; @@ -338,10 +334,10 @@ function onOpenClick(event) { // This function is linked with the openButton and the doubleClick on a message var selectedRow = $("searchMailFooter").down("._selected"); var msguid = selectedRow.getAttribute("uid"); - var folderName = selectedRow.getAttribute("folderName"); + var folderPath = selectedRow.getAttribute("folderPath"); var accountUser = userNames[0]; - var url = "/SOGo/so/" + accountUser + "/Mail" + folderName + "/" + msguid + "/popupview"; + var url = "/SOGo/so/" + accountUser + "/Mail" + folderPath + "/" + msguid + "/popupview"; if (selectedRow) { openMessageWindow(msguid, url); } diff --git a/UI/WebServerResources/UIxMailToSelection.js b/UI/WebServerResources/UIxMailToSelection.js index f9f97a304..19d837937 100644 --- a/UI/WebServerResources/UIxMailToSelection.js +++ b/UI/WebServerResources/UIxMailToSelection.js @@ -159,7 +159,10 @@ function addressFieldChanged(event) { if (addresses.length > 0) { var first = true; for (var i = 0; i < addresses.length; i++) { - var words = addresses[i].split(' '); + var words = addresses[i] + .replace('\t', ' ') + .replace(/,(?! )/, ', ') + .split(' '); var phrase = new Array(); for (var j = 0; j < words.length; j++) { var word = words[j].strip().replace(/<(.+)>/, "$1").replace(',', ''); diff --git a/UI/WebServerResources/arrow-left.png b/UI/WebServerResources/arrow-left.png index 32f22f15d..0a02a6232 100644 Binary files a/UI/WebServerResources/arrow-left.png and b/UI/WebServerResources/arrow-left.png differ diff --git a/UI/WebServerResources/arrow-right.png b/UI/WebServerResources/arrow-right.png index ef4378f42..0b04f17c3 100644 Binary files a/UI/WebServerResources/arrow-right.png and b/UI/WebServerResources/arrow-right.png differ diff --git a/UI/WebServerResources/ckeditor/build-config.js b/UI/WebServerResources/ckeditor/build-config.js index 57789ab8d..9f7794cc1 100644 --- a/UI/WebServerResources/ckeditor/build-config.js +++ b/UI/WebServerResources/ckeditor/build-config.js @@ -29,15 +29,19 @@ var CKBUILDER_CONFIG = { preset: 'basic', ignore: [ '.bender', - '.DS_Store', - '.gitignore', - '.gitattributes', - '.idea', - '.mailmap', 'bender.js', 'bender-err.log', 'bender-out.log', 'dev', + '.DS_Store', + '.gitattributes', + '.gitignore', + 'Gruntfile.js', + '.idea', + '.jscsrc', + '.jshintignore', + '.jshintrc', + '.mailmap', 'node_modules', 'package.json', 'README.md', diff --git a/UI/WebServerResources/ckeditor/ckeditor.js b/UI/WebServerResources/ckeditor/ckeditor.js index 54bcc9ee2..f04b99b44 100644 --- a/UI/WebServerResources/ckeditor/ckeditor.js +++ b/UI/WebServerResources/ckeditor/ckeditor.js @@ -2,463 +2,465 @@ Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ -(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a={timestamp:"E6FD",version:"4.4.3",revision:"fd4f17c",rnd:Math.floor(900*Math.random())+100,_:{pending:[]},status:"unloaded",basePath:function(){var a=window.CKEDITOR_BASEPATH||"";if(!a)for(var d=document.getElementsByTagName("script"),e=0;e=0;s--)if(m[s].priority<=n){m.splice(s+1,0,h);return{removeListener:i}}m.unshift(h)}return{removeListener:i}}, -once:function(){var a=arguments[1];arguments[1]=function(d){d.removeListener();return a.apply(this,arguments)};return this.on.apply(this,arguments)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,d=function(){a=1},e=0,b=function(){e=1};return function(n,h,i){var m=c(this)[n],n=a,p=e;a=e=0;if(m){var s=m.listeners;if(s.length)for(var s=s.slice(0),x,q=0;q=0&&e.listeners.splice(b,1)}},removeAllListeners:function(){var a=c(this),d;for(d in a)delete a[d]},hasListeners:function(a){return(a=c(this)[a])&&a.listeners.length>0}}}()); -CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,c){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fire.call(this,a,c,this)},CKEDITOR.editor.prototype.fireOnce=function(a,c){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fireOnce.call(this,a,c,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype)); -CKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),c={ie:a.indexOf("trident/")>-1,webkit:a.indexOf(" applewebkit/")>-1,air:a.indexOf(" adobeair/")>-1,mac:a.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat"&&(!document.documentMode||document.documentMode<10),mobile:a.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,e=window.location.hostname;return a!=e&&a!="["+e+"]"},secure:location.protocol== -"https:"};c.gecko=navigator.product=="Gecko"&&!c.webkit&&!c.ie;if(c.webkit)a.indexOf("chrome")>-1?c.chrome=true:c.safari=true;var b=0;if(c.ie){b=c.quirks||!document.documentMode?parseFloat(a.match(/msie (\d+)/)[1]):document.documentMode;c.ie9Compat=b==9;c.ie8Compat=b==8;c.ie7Compat=b==7;c.ie6Compat=b<7||c.quirks}if(c.gecko){var f=a.match(/rv:([\d\.]+)/);if(f){f=f[1].split(".");b=f[0]*1E4+(f[1]||0)*100+(f[2]||0)*1}}c.air&&(b=parseFloat(a.match(/ adobeair\/(\d+)/)[1]));c.webkit&&(b=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])); -c.version=b;c.isCompatible=c.iOS&&b>=534||!c.mobile&&(c.ie&&b>6||c.gecko&&b>=2E4||c.air&&b>=1||c.webkit&&b>=522||false);c.hidpi=window.devicePixelRatio>=2;c.needsBrFiller=c.gecko||c.webkit||c.ie&&b>10;c.needsNbspFiller=c.ie&&b<11;c.cssClass="cke_browser_"+(c.ie?"ie":c.gecko?"gecko":c.webkit?"webkit":"unknown");if(c.quirks)c.cssClass=c.cssClass+" cke_browser_quirks";if(c.ie)c.cssClass=c.cssClass+(" cke_browser_ie"+(c.quirks?"6 cke_browser_iequirks":c.version));if(c.air)c.cssClass=c.cssClass+" cke_browser_air"; -if(c.iOS)c.cssClass=c.cssClass+" cke_browser_ios";if(c.hidpi)c.cssClass=c.cssClass+" cke_hidpi";return c}()); +(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,e={timestamp:"E8PB",version:"4.4.5",revision:"25cdcad",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var f=window.CKEDITOR_BASEPATH||"";if(!f)for(var d=document.getElementsByTagName("script"),c=0;c=0;t--)if(p[t].priority<=e){p.splice(t+1,0,m);return{removeListener:j}}p.unshift(m)}return{removeListener:j}}, +once:function(){var a=Array.prototype.slice.call(arguments),f=a[1];a[1]=function(a){a.removeListener();return f.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,f=function(){a=1},d=0,b=function(){d=1};return function(h,m,j){var p=e(this)[h],h=a,u=d;a=d=0;if(p){var t=p.listeners;if(t.length)for(var t=t.slice(0),y,n=0;n=0&&d.listeners.splice(b,1)}},removeAllListeners:function(){var a=e(this),f;for(f in a)delete a[f]},hasListeners:function(a){return(a=e(this)[a])&&a.listeners.length> +0}}}());CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,e){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fire.call(this,a,e,this)},CKEDITOR.editor.prototype.fireOnce=function(a,e){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fireOnce.call(this,a,e,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype)); +CKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),e={ie:a.indexOf("trident/")>-1,webkit:a.indexOf(" applewebkit/")>-1,air:a.indexOf(" adobeair/")>-1,mac:a.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat"&&(!document.documentMode||document.documentMode<10),mobile:a.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,d=window.location.hostname;return a!=d&&a!="["+d+"]"},secure:location.protocol== +"https:"};e.gecko=navigator.product=="Gecko"&&!e.webkit&&!e.ie;if(e.webkit)a.indexOf("chrome")>-1?e.chrome=true:e.safari=true;var b=0;if(e.ie){b=e.quirks||!document.documentMode?parseFloat(a.match(/msie (\d+)/)[1]):document.documentMode;e.ie9Compat=b==9;e.ie8Compat=b==8;e.ie7Compat=b==7;e.ie6Compat=b<7||e.quirks}if(e.gecko){var c=a.match(/rv:([\d\.]+)/);if(c){c=c[1].split(".");b=c[0]*1E4+(c[1]||0)*100+(c[2]||0)*1}}e.air&&(b=parseFloat(a.match(/ adobeair\/(\d+)/)[1]));e.webkit&&(b=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])); +e.version=b;e.isCompatible=e.iOS&&b>=534||!e.mobile&&(e.ie&&b>6||e.gecko&&b>=2E4||e.air&&b>=1||e.webkit&&b>=522||false);e.hidpi=window.devicePixelRatio>=2;e.needsBrFiller=e.gecko||e.webkit||e.ie&&b>10;e.needsNbspFiller=e.ie&&b<11;e.cssClass="cke_browser_"+(e.ie?"ie":e.gecko?"gecko":e.webkit?"webkit":"unknown");if(e.quirks)e.cssClass=e.cssClass+" cke_browser_quirks";if(e.ie)e.cssClass=e.cssClass+(" cke_browser_ie"+(e.quirks?"6 cke_browser_iequirks":e.version));if(e.air)e.cssClass=e.cssClass+" cke_browser_air"; +if(e.iOS)e.cssClass=e.cssClass+" cke_browser_ios";if(e.hidpi)e.cssClass=e.cssClass+" cke_hidpi";return e}()); "unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a= -CKEDITOR.loadFullCore,c=CKEDITOR.loadFullCoreTimeout;if(a){CKEDITOR.status="basic_ready";a&&a._load?a():c&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},c*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={}; -(function(){var a=[],c=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.ie?"-ms-":"",b=/&/g,f=/>/g,d=/"+d+""):e.push('');return e.join("")}, -htmlEncode:function(a){return(""+a).replace(b,"&").replace(f,">").replace(d,"<")},htmlDecode:function(a){return a.replace(g,"&").replace(n,">").replace(h,"<")},htmlEncodeAttr:function(a){return a.replace(e,""").replace(d,"<").replace(f,">")},htmlDecodeAttr:function(a){return a.replace(i,'"').replace(h,"<").replace(n,">")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,d){var e=d(a);e.prototype= -a.prototype;return e},setTimeout:function(a,d,e,b,c){c||(c=window);e||(e=c);return c.setTimeout(function(){b?a.apply(e,[].concat(b)):a.apply(e)},d||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(d){return d.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(d){return d.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(d){return d.replace(a,"")}}(),indexOf:function(a,d){if(typeof d=="function")for(var e=0,b=a.length;e=0?a[e]:null},bind:function(a,d){return function(){return a.apply(d,arguments)}},createClass:function(a){var d=a.$,e=a.base,b=a.privates||a._,c=a.proto,a=a.statics;!d&&(d=function(){e&&this.base.apply(this,arguments)});if(b)var o=d,d=function(){var a=this._||(this._={}),d;for(d in b){var e=b[d];a[d]=typeof e=="function"?CKEDITOR.tools.bind(e,this):e}o.apply(this,arguments)};if(e){d.prototype= -this.prototypedCopy(e.prototype);d.prototype.constructor=d;d.base=e;d.baseProto=e.prototype;d.prototype.base=function(){this.base=e.prototype.base;e.apply(this,arguments);this.base=arguments.callee}}c&&this.extend(d.prototype,c,true);a&&this.extend(d,a,true);return d},addFunction:function(d,e){return a.push(function(){return d.apply(e||this,arguments)})-1},removeFunction:function(d){a[d]=null},callFunction:function(d){var e=a[d];return e&&e.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a= -/^-?\d+\.?\d*px$/,d;return function(e){d=CKEDITOR.tools.trim(e+"")+"px";return a.test(d)?d:e||""}}(),convertToPx:function(){var a;return function(d){if(!a){a=CKEDITOR.dom.element.createFromHtml('
',CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(d)){a.setStyle("width",d);return a.$.clientWidth}return d}}(),repeat:function(a,d){return Array(d+1).join(a)},tryThese:function(){for(var a, -d=0,e=arguments.length;d/g,f=/"+f+""):d.push('');return d.join("")}, +htmlEncode:function(a){return(""+a).replace(b,"&").replace(c,">").replace(f,"<")},htmlDecode:function(a){return a.replace(g,"&").replace(h,">").replace(m,"<")},htmlEncodeAttr:function(a){return a.replace(d,""").replace(f,"<").replace(c,">")},htmlDecodeAttr:function(a){return a.replace(j,'"').replace(m,"<").replace(h,">")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,f){var d=f(a);d.prototype= +a.prototype;return d},setTimeout:function(a,f,d,b,c){c||(c=window);d||(d=c);return c.setTimeout(function(){b?a.apply(d,[].concat(b)):a.apply(d)},f||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(f){return f.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(f){return f.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(f){return f.replace(a,"")}}(),indexOf:function(a,f){if(typeof f=="function")for(var d=0,b=a.length;d=0?a[d]:null},bind:function(a,f){return function(){return a.apply(f,arguments)}},createClass:function(a){var f=a.$,d=a.base,b=a.privates||a._,c=a.proto,a=a.statics;!f&&(f=function(){d&&this.base.apply(this,arguments)});if(b)var e=f,f=function(){var a=this._||(this._={}),f;for(f in b){var d=b[f];a[f]=typeof d=="function"?CKEDITOR.tools.bind(d,this):d}e.apply(this,arguments)};if(d){f.prototype= +this.prototypedCopy(d.prototype);f.prototype.constructor=f;f.base=d;f.baseProto=d.prototype;f.prototype.base=function(){this.base=d.prototype.base;d.apply(this,arguments);this.base=arguments.callee}}c&&this.extend(f.prototype,c,true);a&&this.extend(f,a,true);return f},addFunction:function(f,d){return a.push(function(){return f.apply(d||this,arguments)})-1},removeFunction:function(f){a[f]=null},callFunction:function(f){var d=a[f];return d&&d.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a= +/^-?\d+\.?\d*px$/,f;return function(d){f=CKEDITOR.tools.trim(d+"")+"px";return a.test(f)?f:d||""}}(),convertToPx:function(){var a;return function(f){if(!a){a=CKEDITOR.dom.element.createFromHtml('
',CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(f)){a.setStyle("width",f);return a.$.clientWidth}return f}}(),repeat:function(a,f){return Array(f+1).join(a)},tryThese:function(){for(var a, +f=0,d=arguments.length;f8)&&c)a=c+":"+a;return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))},getHead:function(){var a=this.$.getElementsByTagName("head")[0];return a= -a?new CKEDITOR.dom.element(a):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(a){this.$.open("text/html","replace");CKEDITOR.env.ie&&(a=a.replace(/(?:^\s*]*?>)|^/i,'$&\n