From 5ed99a6e5128057202058ad6bd2b64e9f9507e85 Mon Sep 17 00:00:00 2001 From: relikd Date: Mon, 11 Feb 2019 20:28:03 +0100 Subject: [PATCH] Fix auto parse url if app is closed --- baRSS/AppHook.m | 20 ++++++++++++++------ baRSS/Helper/FeedDownload.h | 2 +- baRSS/Helper/FeedDownload.m | 18 +++++++++--------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/baRSS/AppHook.m b/baRSS/AppHook.m index ea37e4d..8463d3d 100644 --- a/baRSS/AppHook.m +++ b/baRSS/AppHook.m @@ -60,12 +60,14 @@ url = [url substringFromIndex:5]; if ([url hasPrefix:@"//"]) url = [url substringFromIndex:2]; - [FeedDownload autoDownloadAndParseURL:url]; + [FeedDownload autoDownloadAndParseURL:url successBlock:^{ + [self reopenPreferencesIfOpen]; + }]; } } -#pragma mark - Handle Menu Interaction +#pragma mark - App Preferences /// Called whenever the user activates the preferences (either through menu click or hotkey). @@ -87,6 +89,16 @@ [FeedDownload scheduleUpdateForUpcomingFeeds]; } +/// Close previous preferences window and re-open at the same position (will drop undo manager stack!) +- (void)reopenPreferencesIfOpen { + if (self.prefWindow) { + CGPoint screenPoint = self.prefWindow.window.frame.origin; + [self.prefWindow close]; + [self openPreferences]; + [self.prefWindow.window setFrameOrigin:screenPoint]; + } +} + #pragma mark - Core Data stack @@ -109,10 +121,6 @@ return _persistentContainer; } - -#pragma mark - Core Data Saving and Undo support - - - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { // Save changes in the application's managed object context before the application terminates. NSManagedObjectContext *context = self.persistentContainer.viewContext; diff --git a/baRSS/Helper/FeedDownload.h b/baRSS/Helper/FeedDownload.h index bb74bfc..dcc7db2 100644 --- a/baRSS/Helper/FeedDownload.h +++ b/baRSS/Helper/FeedDownload.h @@ -39,7 +39,7 @@ + (void)forceUpdateAllFeeds; // Downloading + (void)newFeed:(NSString *)urlStr askUser:(nonnull NSString*(^)(RSHTMLMetadata *meta))askUser block:(nonnull void(^)(RSParsedFeed *parsed, NSError *error, NSHTTPURLResponse *response))block; -+ (void)autoDownloadAndParseURL:(NSString*)urlStr; ++ (void)autoDownloadAndParseURL:(NSString*)urlStr successBlock:(nullable os_block_t)block; + (void)batchDownloadFeeds:(NSArray *)list favicons:(BOOL)fav showErrorAlert:(BOOL)alert finally:(nullable os_block_t)block; // Favicon image download + (void)downloadFavicon:(NSString*)urlStr finished:(void(^)(NSImage * _Nullable img))block; diff --git a/baRSS/Helper/FeedDownload.m b/baRSS/Helper/FeedDownload.m index 8340a93..07aa973 100644 --- a/baRSS/Helper/FeedDownload.m +++ b/baRSS/Helper/FeedDownload.m @@ -123,17 +123,17 @@ static BOOL _nextUpdateIsForced = NO; Called when schedule timer runs out (earliest @c .schedule date). Or if forced by user request. */ + (void)updateTimerCallback { - if (![self allowNetworkConnection]) - return; NSLog(@"fired"); - BOOL updateAll = _nextUpdateIsForced; _nextUpdateIsForced = NO; NSManagedObjectContext *moc = [StoreCoordinator createChildContext]; NSArray *list = [StoreCoordinator getListOfFeedsThatNeedUpdate:updateAll inContext:moc]; //NSAssert(list.count > 0, @"ERROR: Something went wrong, timer fired too early."); - + if (![self allowNetworkConnection]) { + [moc reset]; + return; + } [self batchDownloadFeeds:list favicons:updateAll showErrorAlert:NO finally:^{ [StoreCoordinator saveContext:moc andParent:YES]; // save parents too ... [moc reset]; @@ -279,10 +279,6 @@ static BOOL _nextUpdateIsForced = NO; @param block Parameter @c success is only @c YES if download was successful or if status code is 304 (not modified). */ + (void)backgroundUpdateFeed:(Feed*)feed showErrorAlert:(BOOL)alert finally:(nullable void(^)(BOOL success))block { - if (![self allowNetworkConnection]) { - if (block) block(NO); - return; - } NSManagedObjectID *oid = feed.objectID; NSManagedObjectContext *moc = feed.managedObjectContext; NSURLRequest *req = [self newRequest:feed.meta ignoreCache:(feed.articles.count == 0)]; @@ -320,7 +316,7 @@ static BOOL _nextUpdateIsForced = NO; Creates new @c FeedGroup, @c Feed, @c FeedMeta and @c FeedArticle instances and saves them to the persistent store. Update duration is set to the default of 30 minutes. */ -+ (void)autoDownloadAndParseURL:(NSString*)url { ++ (void)autoDownloadAndParseURL:(NSString*)url successBlock:(nullable os_block_t)block { NSManagedObjectContext *moc = [StoreCoordinator createChildContext]; Feed *f = [Feed appendToRootWithDefaultIntervalInContext:moc]; f.meta.url = url; @@ -330,6 +326,10 @@ static BOOL _nextUpdateIsForced = NO; } [StoreCoordinator saveContext:moc andParent:YES]; [moc reset]; + if (successful) { + [self scheduleUpdateForUpcomingFeeds]; + if (block) block(); + } }]; }