diff options
author | ritsuka <[email protected]> | 2015-05-14 19:37:49 +0000 |
---|---|---|
committer | ritsuka <[email protected]> | 2015-05-14 19:37:49 +0000 |
commit | 2659b80cc0d4e078db19436f4f144b50525f2983 (patch) | |
tree | 54a8813f4a53c25e1630e6aa654c348e603f9ee8 /macosx/HBPresetsManager.m | |
parent | 970688a142998ddf68cf1950436bb92e0385139c (diff) |
MacGui: use libhb built-in presets and validation functions. Update the format and save the presets in UserPresets.json, the old presets are automatically imported if the new presets file is not found. The mac gui now requires 10.7 or later.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@7181 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx/HBPresetsManager.m')
-rw-r--r-- | macosx/HBPresetsManager.m | 296 |
1 files changed, 114 insertions, 182 deletions
diff --git a/macosx/HBPresetsManager.m b/macosx/HBPresetsManager.m index 2420e5acb..29205e371 100644 --- a/macosx/HBPresetsManager.m +++ b/macosx/HBPresetsManager.m @@ -9,6 +9,8 @@ #import "HBUtilities.h" +#include "preset.h" + NSString *HBPresetsChangedNotification = @"HBPresetsChangedNotification"; @interface HBPresetsManager () <HBTreeNodeDelegate> @@ -42,183 +44,130 @@ NSString *HBPresetsChangedNotification = @"HBPresetsChangedNotification"; return self; } -- (NSIndexPath *)indexPathOfPreset:(HBPreset *)preset -{ - __block NSIndexPath *retValue = nil; - - // Visit the whole tree to find the index path. - [self.root enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) - { - if ([obj isEqualTo:preset]) - { - retValue = idx; - *stop = YES; - } - }]; - - return retValue; -} - #pragma mark - HBTreeNode delegate -- (void)nodeDidChange +- (void)nodeDidChange:(id)node { [[NSNotificationCenter defaultCenter] postNotificationName:HBPresetsChangedNotification object:nil]; } -#pragma mark - Load/Save - -- (BOOL)loadPresetsFromURL:(NSURL *)url +- (void)treeDidRemoveNode:(id)node { - NSArray *presetsArray = [[NSArray alloc] initWithContentsOfURL:url]; - - for (NSDictionary *child in presetsArray) + if (node == self.defaultPreset) { - [self.root.children addObject:[self loadFromDict:child]]; + // Select a new default preset + [self selectNewDefault]; } +} - // If the preset list contains no leaf, - // add back the built in presets. - __block BOOL leafFound = NO; - [self.root enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) { - if ([obj isLeaf]) - { - leafFound = YES; - *stop = YES; - } - }]; +#pragma mark - Load/Save - if (!leafFound) - { - [self generateBuiltInPresets]; - } +/** + * Loads the old presets format (0.10 and earlier) plist + * + * @param url the url of the plist + */ +- (void)loadOldPresetsFromURL:(NSURL *)url +{ + HBPreset *oldPresets = [[HBPreset alloc] initWithContentsOfURL:url]; - if (self.defaultPreset == nil) + for (HBPreset *preset in oldPresets.children) { - [self selectNewDefault]; + [self.root.children addObject:preset]; } - - return YES; } -- (BOOL)savePresetsToURL:(NSURL *)url +- (BOOL)checkIfOutOfDate:(NSDictionary *)dict { - NSMutableArray *presetsArray = [[NSMutableArray alloc] init]; + int major, minor, micro; + hb_presets_current_version(&major, &minor, µ); - for (HBPreset *node in self.root.children) + if (major != [dict[@"VersionMajor"] intValue] || + minor != [dict[@"VersionMinor"] intValue] || + micro != [dict[@"VersionMicro"] intValue]) { - [presetsArray addObject:[self convertToDict:node]]; + return YES; } - - return [presetsArray writeToURL:url atomically:YES]; - - return YES; + return NO; } -- (BOOL)savePresets +- (BOOL)loadPresetsFromURL:(NSURL *)url { - return [self savePresetsToURL:self.fileURL]; -} + NSData *presetData = [[NSData alloc] initWithContentsOfURL:url]; -#pragma mark - NSDictionary conversions - -/** - * Converts the NSDictionary to a HBPreset object, - */ -- (HBPreset *)loadFromDict:(NSDictionary *)dict -{ - HBPreset *node = nil; - if ([dict[@"Folder"] boolValue]) + // Try to load to load the old presets file + // if the new one is empty + if (presetData == nil) { - node = [[HBPreset alloc] initWithFolderName:dict[@"PresetName"] - builtIn:![dict[@"Type"] boolValue]]; - - for (NSDictionary *child in dict[@"ChildrenArray"]) - { - [node.children addObject:[self loadFromDict:child]]; - } + [self loadOldPresetsFromURL:[url.URLByDeletingPathExtension URLByAppendingPathExtension:@"plist"]]; + [self generateBuiltInPresets]; } else { - node = [[HBPreset alloc] initWithName:dict[@"PresetName"] - content:dict - builtIn:![dict[@"Type"] boolValue]]; - node.isDefault = [dict[@"Default"] boolValue]; + const char *json = [[NSString alloc] initWithData:presetData encoding:NSUTF8StringEncoding].UTF8String; + const char *cleanedJson = hb_presets_clean_json(json); + + NSData *cleanedData = [NSData dataWithBytes:cleanedJson length:strlen(cleanedJson)]; + NSDictionary *presetsDict = [NSJSONSerialization JSONObjectWithData:cleanedData options:0 error:NULL]; - if ([dict[@"Default"] boolValue]) + if ([self checkIfOutOfDate:presetsDict]) { - self.defaultPreset = node; + const char *updatedJson = hb_presets_import_json(cleanedJson); + NSData *updatedData = [NSData dataWithBytes:updatedJson length:strlen(cleanedJson)]; + presetsDict = [NSJSONSerialization JSONObjectWithData:updatedData options:0 error:NULL]; } - } - - node.delegate = self; - - return node; -} -/** - * Converts the HBPreset and its childrens to a NSDictionary. - */ -- (NSDictionary *)convertToDict:(HBPreset *)node -{ - NSMutableDictionary *output = [[NSMutableDictionary alloc] init]; - [output addEntriesFromDictionary:node.content]; - - output[@"PresetName"] = node.name; - output[@"Folder"] = @(!node.isLeaf); - output[@"Type"] = @(!node.isBuiltIn); - output[@"Default"] = @(node.isDefault); - - if (!node.isLeaf) - { - NSMutableArray *childArray = [[NSMutableArray alloc] init]; - for (HBPreset *child in node.children) + for (NSDictionary *child in presetsDict[@"PresetList"]) { - [childArray addObject:[self convertToDict:child]]; + [self.root.children addObject:[[HBPreset alloc] initWithDictionary:child]]; } - output[@"ChildrenArray"] = childArray; + if ([self checkIfOutOfDate:presetsDict]) + { + [self generateBuiltInPresets]; + } } - return output; -} - -#pragma mark - Presets Management - -- (BOOL)checkBuiltInsForUpdates -{ - __block BOOL retValue = NO; - + // If the preset list contains no leaf, + // add back the built in presets. + __block BOOL leafFound = NO; [self.root enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) { - NSDictionary *dict = [obj content]; - - if ([obj isBuiltIn] && [obj isLeaf]) + if ([obj isLeaf]) { - if (!dict[@"PresetBuildNumber"] || - [dict[@"PresetBuildNumber"] intValue] < [[[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"] intValue]) - { - retValue = YES; - *stop = YES; - } + leafFound = YES; + *stop = YES; } }]; - return retValue; + if (!leafFound) + { + [self generateBuiltInPresets]; + } + + [self selectNewDefault]; + + return YES; } -- (void)addPresetFromDictionary:(NSDictionary *)preset +- (BOOL)savePresetsToURL:(NSURL *)url { - HBPreset *presetNode = [[HBPreset alloc] initWithName:preset[@"PresetName"] - content:preset - builtIn:NO]; - - [self.root insertObject:presetNode inChildrenAtIndex:[self.root countOfChildren]]; + return [self.root writeToURL:url atomically:YES format:HBPresetFormatJson removeRoot:YES]; +} - [self savePresets]; +- (BOOL)savePresets +{ + return [self savePresetsToURL:self.fileURL]; } +#pragma mark - Presets Management + - (void)addPreset:(HBPreset *)preset { + // Make sure no preset has the default flag enabled. + [preset enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) { + [obj setIsDefault:NO]; + }]; + [self.root insertObject:preset inChildrenAtIndex:[self.root countOfChildren]]; [self savePresets]; @@ -226,39 +175,16 @@ NSString *HBPresetsChangedNotification = @"HBPresetsChangedNotification"; - (void)deletePresetAtIndexPath:(NSIndexPath *)idx { - HBPreset *parentNode = self.root; - - // Find the preset parent array - // and delete it. - NSUInteger currIdx = 0; - NSUInteger i = 0; - for (i = 0; i < idx.length - 1; i++) - { - currIdx = [idx indexAtPosition:i]; - - if (parentNode.children.count > currIdx) - { - parentNode = (parentNode.children)[currIdx]; - } - } - - currIdx = [idx indexAtPosition:i]; + [self.root removeObjectAtIndexPath:idx]; +} - if (parentNode.children.count > currIdx) - { - if ([(parentNode.children)[currIdx] isDefault]) - { - [parentNode removeObjectFromChildrenAtIndex:currIdx]; - // Try to select a new default preset - [self selectNewDefault]; - } - else - { - [parentNode removeObjectFromChildrenAtIndex:currIdx]; - } - } +- (NSIndexPath *)indexPathOfPreset:(HBPreset *)preset +{ + return [self.root indexPathOfObject:preset]; } +#pragma mark - Default preset + /** * Private method to select a new default after the default preset is deleted * or when the built-in presets are regenerated. @@ -290,12 +216,15 @@ NSString *HBPresetsChangedNotification = @"HBPresetsChangedNotification"; *stop = YES; } - if ([obj isDefault]) { + if ([obj isDefault]) + { + self.defaultPreset = obj; defaultAlreadySetted = YES; } }]; - if (defaultAlreadySetted) { + if (defaultAlreadySetted) + { return; } else if (normalPreset) @@ -308,7 +237,8 @@ NSString *HBPresetsChangedNotification = @"HBPresetsChangedNotification"; self.defaultPreset = firstUserPreset; firstUserPreset.isDefault = YES; } - else if (firstBuiltInPreset) { + else if (firstBuiltInPreset) + { self.defaultPreset = firstBuiltInPreset; firstBuiltInPreset.isDefault = YES; } @@ -324,8 +254,6 @@ NSString *HBPresetsChangedNotification = @"HBPresetsChangedNotification"; } defaultPreset.isDefault = YES; _defaultPreset = defaultPreset; - - [self nodeDidChange]; } } @@ -333,39 +261,43 @@ NSString *HBPresetsChangedNotification = @"HBPresetsChangedNotification"; /** * Built-in preset folders at the root of the hierarchy -* + * * Note: the built-in presets will *not* sort themselves alphabetically, * so they will appear in the order you create them. */ - (void)generateBuiltInPresets { - [self deleteBuiltInPresets]; + // Load the built-in presets from libhb. + const char *presets = hb_presets_builtin_get_json(); + NSData *presetsData = [NSData dataWithBytes:presets length:strlen(presets)]; - // Load the built-in presets from the app bundle Resources folder. - NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"presets" withExtension:@"plist"]; - NSArray *presetsArray = [[NSArray alloc] initWithContentsOfURL:fileURL]; + NSError *error = nil; + NSArray *presetsArray = [NSJSONSerialization JSONObjectWithData:presetsData options:NSJSONReadingAllowFragments error:&error]; - for (NSDictionary *child in presetsArray.reverseObjectEnumerator) + if (presetsArray.count == 0) { - HBPreset *preset = [self loadFromDict:child]; + [HBUtilities writeToActivityLog:"failed to update built-in presets"]; - [preset enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) + if (error) { - NSMutableDictionary *presetDict = [[obj content] mutableCopy]; - - // Set the current version in the built-in presets, to they won't be reupdated - // each time the app checks the version. - presetDict[@"PresetBuildNumber"] = [[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"]; - [obj setContent:presetDict]; - }]; - - [self.root insertObject:preset inChildrenAtIndex:0]; + [HBUtilities writeToActivityLog:"Error raised:\n%s", error.localizedFailureReason]; + } } + else + { + [self deleteBuiltInPresets]; - // set a new Default preset - [self selectNewDefault]; + for (NSDictionary *child in presetsArray.reverseObjectEnumerator) + { + HBPreset *preset = [[HBPreset alloc] initWithDictionary:child]; + [self.root insertObject:preset inChildrenAtIndex:0]; + } + + // set a new Default preset + [self selectNewDefault]; - [HBUtilities writeToActivityLog: "built in presets updated to build number: %d", [[[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"] intValue]]; + [HBUtilities writeToActivityLog: "built-in presets updated"]; + } } - (void)deleteBuiltInPresets |