Persistence fixes on OS X.
[FIXED] OS X: Handle recovery from unsupported stores. [FIXED] OS X: Use predicate instead of predicate template.
This commit is contained in:
parent
9968491e3b
commit
587461144b
@ -181,6 +181,34 @@ static NSDateFormatter *rfc3339DateFormatter = nil;
|
|||||||
dbg(@"StoreManager: %@", message);
|
dbg(@"StoreManager: %@", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)ubiquityStoreManager:(UbiquityStoreManager *)manager didEncounterError:(NSError *)error cause:(UbiquityStoreManagerErrorCause)cause context:(id)context {
|
||||||
|
|
||||||
|
err(@"StoreManager: cause=%d, context=%@, error=%@", cause, context, error);
|
||||||
|
|
||||||
|
switch (cause) {
|
||||||
|
case UbiquityStoreManagerErrorCauseDeleteStore:
|
||||||
|
case UbiquityStoreManagerErrorCauseDeleteLogs:
|
||||||
|
case UbiquityStoreManagerErrorCauseCreateStorePath:
|
||||||
|
case UbiquityStoreManagerErrorCauseClearStore:
|
||||||
|
break;
|
||||||
|
case UbiquityStoreManagerErrorCauseOpenLocalStore: {
|
||||||
|
wrn(@"Local store could not be opened, resetting it.");
|
||||||
|
manager.hardResetEnabled = YES;
|
||||||
|
[manager hardResetLocalStorage];
|
||||||
|
|
||||||
|
[NSException raise:NSGenericException format:@"Local store was reset, application must be restarted to use it."];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case UbiquityStoreManagerErrorCauseOpenCloudStore: {
|
||||||
|
wrn(@"iCloud store could not be opened, resetting it.");
|
||||||
|
manager.hardResetEnabled = YES;
|
||||||
|
[manager hardResetCloudStorage];
|
||||||
|
[manager useiCloudStore:YES alertUser:NO];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - Import / Export
|
#pragma mark - Import / Export
|
||||||
|
|
||||||
- (void)loadRFC3339DateFormatter {
|
- (void)loadRFC3339DateFormatter {
|
||||||
|
@ -80,13 +80,40 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
- (IBAction)togglePreference:(NSMenuItem *)sender {
|
- (IBAction)togglePreference:(NSMenuItem *)sender {
|
||||||
|
|
||||||
if (sender == useICloudItem)
|
if (sender == useICloudItem)
|
||||||
[self.storeManager useiCloudStore:sender.state == NSOffState];
|
[self.storeManager useiCloudStore:sender.state == NSOffState alertUser:YES];
|
||||||
if (sender == rememberPasswordItem)
|
if (sender == rememberPasswordItem)
|
||||||
[MPConfig get].rememberKey = [NSNumber numberWithBool:![[MPConfig get].rememberKey boolValue]];
|
[MPConfig get].rememberKey = [NSNumber numberWithBool:![[MPConfig get].rememberKey boolValue]];
|
||||||
if (sender == savePasswordItem)
|
if (sender == savePasswordItem)
|
||||||
[MPConfig get].saveKey = [NSNumber numberWithBool:![[MPConfig get].saveKey boolValue]];
|
[MPConfig get].saveKey = [NSNumber numberWithBool:![[MPConfig get].saveKey boolValue]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)didUpdateConfigForKey:(SEL)configKey fromValue:(id)oldValue {
|
||||||
|
|
||||||
|
if (configKey == @selector(rememberKey))
|
||||||
|
self.rememberPasswordItem.state = [[MPConfig get].rememberKey boolValue]? NSOnState: NSOffState;
|
||||||
|
if (configKey == @selector(saveKey))
|
||||||
|
self.savePasswordItem.state = [[MPConfig get].saveKey boolValue]? NSOnState: NSOffState;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
|
||||||
|
|
||||||
|
if ([keyPath isEqualToString:@"key"]) {
|
||||||
|
if (self.key)
|
||||||
|
[self.lockItem setEnabled:YES];
|
||||||
|
else {
|
||||||
|
[self.lockItem setEnabled:NO];
|
||||||
|
[self.passwordWindow close];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
|
||||||
|
|
||||||
|
return [[self managedObjectContext] undoManager];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - NSApplicationDelegate
|
||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
||||||
|
|
||||||
// Setup delegates and listeners.
|
// Setup delegates and listeners.
|
||||||
@ -95,7 +122,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
|
|
||||||
// Initially, use iCloud.
|
// Initially, use iCloud.
|
||||||
if ([[MPConfig get].firstRun boolValue])
|
if ([[MPConfig get].firstRun boolValue])
|
||||||
[[self storeManager] useiCloudStore:YES];
|
[[self storeManager] useiCloudStore:YES alertUser:YES];
|
||||||
|
|
||||||
// Status item.
|
// Status item.
|
||||||
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
|
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
|
||||||
@ -137,36 +164,6 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
self.key = nil;
|
self.key = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)didUpdateConfigForKey:(SEL)configKey fromValue:(id)oldValue {
|
|
||||||
|
|
||||||
if (configKey == @selector(rememberKey))
|
|
||||||
self.rememberPasswordItem.state = [[MPConfig get].rememberKey boolValue]? NSOnState: NSOffState;
|
|
||||||
if (configKey == @selector(saveKey))
|
|
||||||
self.savePasswordItem.state = [[MPConfig get].saveKey boolValue]? NSOnState: NSOffState;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)ubiquityStoreManager:(UbiquityStoreManager *)manager didSwitchToiCloud:(BOOL)didSwitch {
|
|
||||||
|
|
||||||
self.useICloudItem.state = didSwitch? NSOnState: NSOffState;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
|
|
||||||
|
|
||||||
if ([keyPath isEqualToString:@"key"]) {
|
|
||||||
if (self.key)
|
|
||||||
[self.lockItem setEnabled:YES];
|
|
||||||
else {
|
|
||||||
[self.lockItem setEnabled:NO];
|
|
||||||
[self.passwordWindow close];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
|
|
||||||
|
|
||||||
return [[self managedObjectContext] undoManager];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
|
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
|
||||||
{
|
{
|
||||||
// Save changes in the application's managed object context before the application terminates.
|
// Save changes in the application's managed object context before the application terminates.
|
||||||
@ -213,4 +210,11 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
return NSTerminateNow;
|
return NSTerminateNow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - UbiquityStoreManagerDelegate
|
||||||
|
|
||||||
|
- (void)ubiquityStoreManager:(UbiquityStoreManager *)manager didSwitchToiCloud:(BOOL)didSwitch {
|
||||||
|
|
||||||
|
self.useICloudItem.state = didSwitch? NSOnState: NSOffState;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -113,14 +113,10 @@
|
|||||||
if (![query length] || ![MPAppDelegate get].keyID)
|
if (![query length] || ![MPAppDelegate get].keyID)
|
||||||
return nil;
|
return nil;
|
||||||
|
|
||||||
NSFetchRequest *fetchRequest = [MPAppDelegate.managedObjectModel
|
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([MPElementEntity class])];
|
||||||
fetchRequestFromTemplateWithName:@"MPElements"
|
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"uses" ascending:NO]];
|
||||||
substitutionVariables:[NSDictionary dictionaryWithObjectsAndKeys:
|
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(%@ == '' OR name BEGINSWITH[cd] %@) AND keyID == %@",
|
||||||
query, @"query",
|
query, query, [MPAppDelegate get].keyID];
|
||||||
[MPAppDelegate get].keyID, @"keyID",
|
|
||||||
nil]];
|
|
||||||
[fetchRequest setSortDescriptors:
|
|
||||||
[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"uses" ascending:NO]]];
|
|
||||||
|
|
||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
self.siteResults = [[MPAppDelegate managedObjectContext] executeFetchRequest:fetchRequest error:&error];
|
self.siteResults = [[MPAppDelegate managedObjectContext] executeFetchRequest:fetchRequest error:&error];
|
||||||
|
@ -401,33 +401,6 @@
|
|||||||
inf(@"didSwitchToiCloud: %d", didSwitch);
|
inf(@"didSwitchToiCloud: %d", didSwitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)ubiquityStoreManager:(UbiquityStoreManager *)manager didEncounterError:(NSError *)error cause:(UbiquityStoreManagerErrorCause)cause context:(id)context {
|
|
||||||
|
|
||||||
err(@"StoreManager: cause=%d, context=%@, error=%@", cause, context, error);
|
|
||||||
|
|
||||||
switch (cause) {
|
|
||||||
case UbiquityStoreManagerErrorCauseDeleteStore:
|
|
||||||
case UbiquityStoreManagerErrorCauseDeleteLogs:
|
|
||||||
case UbiquityStoreManagerErrorCauseCreateStorePath:
|
|
||||||
case UbiquityStoreManagerErrorCauseClearStore:
|
|
||||||
break;
|
|
||||||
case UbiquityStoreManagerErrorCauseOpenLocalStore: {
|
|
||||||
wrn(@"Local store could not be opened, resetting it.");
|
|
||||||
manager.hardResetEnabled = YES;
|
|
||||||
[manager hardResetLocalStorage];
|
|
||||||
exit(1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case UbiquityStoreManagerErrorCauseOpenCloudStore: {
|
|
||||||
wrn(@"iCloud store could not be opened, resetting it.");
|
|
||||||
manager.hardResetEnabled = YES;
|
|
||||||
[manager hardResetCloudStorage];
|
|
||||||
[manager useiCloudStore:YES alertUser:NO];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - TestFlight
|
#pragma mark - TestFlight
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user