diff --git a/SOPE/GDLContentStore/GCSChannelManager.h b/SOPE/GDLContentStore/GCSChannelManager.h index 4e9c64d6b..0890fb938 100644 --- a/SOPE/GDLContentStore/GCSChannelManager.h +++ b/SOPE/GDLContentStore/GCSChannelManager.h @@ -51,6 +51,7 @@ - (void)releaseChannel:(EOAdaptorChannel *)_channel; - (void)releaseChannel:(EOAdaptorChannel *)_channel immediately:(BOOL)_immediately; +- (void) releaseAllChannels; /* checking for tables */ diff --git a/SOPE/GDLContentStore/GCSChannelManager.m b/SOPE/GDLContentStore/GCSChannelManager.m index fe8620b17..1b67aaa38 100644 --- a/SOPE/GDLContentStore/GCSChannelManager.m +++ b/SOPE/GDLContentStore/GCSChannelManager.m @@ -399,6 +399,27 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; } } +- (void) releaseAllChannels +{ + EOAdaptorChannel *channel; + GCSChannelHandle *handle; + NSEnumerator *e; + + e = [busyChannels objectEnumerator]; + while ((handle = [e nextObject])) + { + [handle retain]; + ASSIGN (handle->lastReleaseTime, [NSCalendarDate date]); + [busyChannels removeObject: handle]; + channel = [handle channel]; + if (debugPools) + [self logWithFormat: @"releaseAllChannels: freeing old channel (age %ds, %p) ", (int)[handle age], channel]; + if ([channel isOpen]) + [channel closeChannel]; + [handle release]; + } +} + /* checking for tables */ - (BOOL) canConnect: (NSURL *) _url diff --git a/SoObjects/Appointments/SOGoEMailAlarmsManager.m b/SoObjects/Appointments/SOGoEMailAlarmsManager.m index 32934a1bf..835a775c6 100644 --- a/SoObjects/Appointments/SOGoEMailAlarmsManager.m +++ b/SoObjects/Appointments/SOGoEMailAlarmsManager.m @@ -77,12 +77,12 @@ { iCalCalendar *calendar; GCSFolder *folder; + GCSFolderManager *fm; NSDictionary *eventRecord; - folder = [[GCSFolderManager defaultFolderManager] - folderAtPath: [record objectForKey: @"c_path"]]; - eventRecord = [folder - recordOfEntryWithName: [record objectForKey: @"c_name"]]; + fm = [GCSFolderManager defaultFolderManager]; + folder = [fm folderAtPath: [record objectForKey: @"c_path"]]; + eventRecord = [folder recordOfEntryWithName: [record objectForKey: @"c_name"]]; calendar = [iCalCalendar parseSingleFromSource: [eventRecord objectForKey: @"c_content"]]; @@ -203,6 +203,7 @@ SOGoAppointmentFolder *container; iCalEntityObject *entity; GCSAlarmsFolder *af; + GCSFolderManager *fm; iCalAlarm *alarm; NSMutableArray *alarms; NSDictionary *record; @@ -210,7 +211,8 @@ int count, max; NSString *owner; - af = [[GCSFolderManager defaultFolderManager] alarmsFolder]; + fm = [GCSFolderManager defaultFolderManager]; + af = [fm alarmsFolder]; records = [af recordsForEntriesFromDate: fromDate toDate: toDate]; max = [records count]; alarms = [NSMutableArray arrayWithCapacity: max]; diff --git a/Tools/SOGoEAlarmsNotifier.m b/Tools/SOGoEAlarmsNotifier.m index 7abe3397e..f850f0892 100644 --- a/Tools/SOGoEAlarmsNotifier.m +++ b/Tools/SOGoEAlarmsNotifier.m @@ -53,6 +53,9 @@ #import #import +#import +#import + #import "SOGoEAlarmsNotifier.h" @implementation SOGoEAlarmsNotifier @@ -225,6 +228,8 @@ - (BOOL) run { + GCSChannelManager *cm; + GCSFolderManager *fm; NSArray *arguments, *alarms; NSCalendarDate *startDate, *toDate; NSDictionary *d; @@ -270,7 +275,7 @@ hour: 0 minute: -5 second: 0] toDate: toDate - withMetadata: metadata]; + withMetadata: metadata]; max = [alarms count]; for (count = 0; count < max; count++) @@ -292,6 +297,10 @@ nameInContainer: [[d objectForKey: @"record"] objectForKey: @"c_name"]]; } + // GCSFolder has opened a channel; close it before ending the process + fm = [GCSFolderManager defaultFolderManager]; + cm = [fm channelManager]; + [cm releaseAllChannels]; return YES; }