self = [super init];
decodeInt(_container);
- decodeObject(_sourceTracks, NSMutableArray);
- decodeObject(_tracks, NSMutableArray);
+ decodeCollectionOfObjects(_sourceTracks, NSArray, NSDictionary);
+ decodeCollectionOfObjects(_tracks, NSMutableArray, HBAudioTrack);
for (HBAudioTrack *track in _tracks)
{
decodeInteger(_trackSelectionBehavior);
decodeObject(_trackSelectionLanguages, NSMutableArray);
- decodeObject(_tracksArray, NSMutableArray);
+ decodeCollectionOfObjects(_tracksArray, NSMutableArray, HBAudioTrackPreset);
decodeBool(_allowAACPassthru);
decodeBool(_allowAC3Passthru);
- (instancetype)initWithTitle:(NSString *)title index:(NSUInteger)idx duration:(uint64_t)duration NS_DESIGNATED_INITIALIZER;
-@property (nonatomic, readwrite) NSString *title;
+@property (nonatomic, readwrite, copy) NSString *title;
@property (nonatomic, readonly) NSString *duration;
@property (nonatomic, readonly) NSUInteger index;
#define decodeDouble(x) x = [decoder decodeDoubleForKey:OBJC_STRINGIFY(x)]
#define decodeObject(x, cl) x = [HBCodingUtilities decodeObjectOfClass:[cl class] forKey:OBJC_STRINGIFY(x) decoder:decoder];
+#define decodeCollectionOfObjects(x, cl, objectcl) x = [HBCodingUtilities decodeObjectOfClasses:[NSSet setWithObjects:[cl class], [objectcl class], nil] forKey:OBJC_STRINGIFY(x) decoder:decoder];
+
#define decodeObjectOrFail(x, class) x = [HBCodingUtilities decodeObjectOfClass:class forKey:OBJC_STRINGIFY(x) decoder:decoder]; if (x == nil) {NSLog(@"Failed to decode: %@", OBJC_STRINGIFY(x)); goto fail;}
NS_ASSUME_NONNULL_BEGIN
*/
+ (nullable id)decodeObjectOfClass:(Class)aClass forKey:(NSString *)key decoder:(NSCoder *)decoder;
+
++ (nullable id)decodeObjectOfClasses:(NSSet *)classes forKey:(NSString *)key decoder:(NSCoder *)decoder;
+
@end
NS_ASSUME_NONNULL_END
}
}
++ (id)decodeObjectOfClasses:(NSSet *)classes forKey:(NSString *)key decoder:(NSCoder *)decoder
+{
+ if (useSecureCoding)
+ {
+ return [decoder decodeObjectOfClasses:classes forKey:key];
+ }
+ else
+ {
+ id obj = [decoder decodeObjectForKey:key];
+ return obj;
+ }
+}
+
@end
*/
@interface HBDistributedArray<ObjectType> : NSMutableArray
-- (instancetype)initWithURL:(NSURL *)fileURL;
+- (instancetype)initWithURL:(NSURL *)fileURL class:(Class)objectClass;
/**
* Begins a transaction on the array
@property (nonatomic, readonly) NSURL *fileURL;
@property (nonatomic, readwrite) NSTimeInterval modifiedTime;
+@property (nonatomic, readonly) NSSet *objectClasses;
+
@property (nonatomic, readonly) sem_t *mutex;
@property (nonatomic, readwrite) uint32_t mutexCount;
@implementation HBDistributedArray
-- (instancetype)initWithURL:(NSURL *)fileURL
+- (instancetype)initWithURL:(NSURL *)fileURL class:(Class)objectClass
{
self = [super init];
if (self)
{
_fileURL = [fileURL copy];
_array = [[NSMutableArray alloc] init];
+ _objectClasses = [NSSet setWithObjects:[NSMutableArray class], objectClass, nil];
NSArray *runningInstances = [NSRunningApplication runningApplicationsWithBundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]];
const char *name = [NSString stringWithFormat:@"/%@.hblock", _fileURL.lastPathComponent].UTF8String;
NSMutableArray *jobsArray = nil;
@try
{
- jobsArray = [NSKeyedUnarchiver unarchiveObjectWithFile:self.fileURL.path];
+ NSData *queue = [NSData dataWithContentsOfURL:self.fileURL];
+ NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:queue];
+ if ([unarchiver respondsToSelector:@selector(requiresSecureCoding)])
+ {
+ unarchiver.requiresSecureCoding = YES;
+ }
+ jobsArray = [unarchiver decodeObjectOfClasses:self.objectClasses forKey:NSKeyedArchiveRootObjectKey];
+ [unarchiver finishDecoding];
}
@catch (NSException *exception)
{
- (void)encodeWithCoder:(NSCoder *)coder
{
- [coder encodeInt:1 forKey:@"HBJobVersion"];
+ [coder encodeInt:2 forKey:@"HBJobVersion"];
encodeInt(_state);
encodeObject(_name);
{
int version = [decoder decodeIntForKey:@"HBJobVersion"];
- if (version == 1 && (self = [super init]))
+ if (version == 2 && (self = [super init]))
{
decodeInt(_state);
decodeObject(_name, NSString);
_video.job = self;
decodeBool(_chaptersEnabled);
- decodeObject(_chapterTitles, NSArray);
+ decodeCollectionOfObjects(_chapterTitles, NSArray, HBChapter);
return self;
}
#import <Cocoa/Cocoa.h>
#import "HBHUD.h"
+NS_ASSUME_NONNULL_BEGIN
+
@protocol HBPictureHUDControllerDelegate <NSObject>
- (void)displayPreviewAtIndex:(NSUInteger)idx;
@property (nonatomic, nullable, assign) id<HBPictureHUDControllerDelegate> delegate;
-@property (nonatomic, nonnull) NSString *info;
-@property (nonatomic, nonnull) NSString *scale;
+@property (nonatomic, copy) NSString *info;
+@property (nonatomic, copy) NSString *scale;
@property (nonatomic) NSUInteger pictureCount;
@property (nonatomic) NSUInteger selectedIndex;
@end
+
+NS_ASSUME_NONNULL_END
_core = [[HBCore alloc] initWithLogLevel:loggingLevel name:@"QueueCore"];
// Load the queue from disk.
- _jobs = [[HBDistributedArray alloc] initWithURL:queueURL];
+ _jobs = [[HBDistributedArray alloc] initWithURL:queueURL class:[HBJob class]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadQueue) name:HBDistributedArrayChanged object:_jobs];
}
NSDictionary *none = @{ keySubTrackName: NSLocalizedString(@"None", nil)};
[sourceTracks insertObject:none atIndex:0];
- NSDictionary *foreign = @{ keySubTrackName: foreignAudioSearchTrackName,
+ NSDictionary *foreign = @{ keySubTrackName: [foreignAudioSearchTrackName copy],
keySubTrackType: @(foreignAudioType) };
[sourceTracks insertObject:foreign atIndex:1];
self = [super init];
decodeInt(_container);
- decodeObject(_sourceTracks, NSMutableArray);
- decodeObject(_tracks, NSMutableArray);
+ decodeCollectionOfObjects(_sourceTracks, NSArray, NSDictionary);
+ decodeCollectionOfObjects(_tracks, NSMutableArray, HBSubtitlesTrack);
for (HBSubtitlesTrack *track in _tracks)
{
@property (nonatomic, readonly) hb_title_t *hb_title;
@property (nonatomic, readonly) hb_handle_t *hb_handle;
-@property (nonatomic, readwrite, strong) NSString *name;
+@property (nonatomic, readwrite, copy) NSString *name;
@property (nonatomic, readwrite) NSArray *audioTracks;
@property (nonatomic, readwrite) NSArray *subtitlesTracks;
[string appendString:@"fastdecode"];
}
- return string;
+ return [string copy];
}
- (void)applyPreset:(HBPreset *)preset jobSettings:(NSDictionary *)settings