]> granicus.if.org Git - handbrake/commitdiff
MacGui: recover when the xpc service crashes.
authorDamiano Galassi <damiog@gmail.com>
Sun, 11 Aug 2019 07:58:32 +0000 (09:58 +0200)
committerDamiano Galassi <damiog@gmail.com>
Sun, 11 Aug 2019 07:58:32 +0000 (09:58 +0200)
macosx/HBController.m
macosx/HBQueue.m
macosx/HBQueueController.h
macosx/HBQueueTableViewController.m
macosx/HBRemoteCore.h
macosx/HBRemoteCore.m

index 8f45ca51f6eea715b33e02de6832500b612f448c..f10d771f33c2714c7bdb4057df89ada8518f1ac9 100644 (file)
@@ -128,7 +128,7 @@ static void *HBControllerScanCoreContext = &HBControllerScanCoreContext;
 @property (nonatomic, strong) HBAppDelegate *delegate;
 
 /// The queue.
-@property (nonatomic, strong) HBQueue *queue;
+@property (nonatomic, weak) HBQueue *queue;
 
 /// Whether the window is visible or occluded,
 /// useful to avoid updating the UI needlessly
index 7e285c1851ab1e2d205069689bbade464430ed35..d85c662d433acfa26fb3df2ad23ee064cd160159 100644 (file)
@@ -94,6 +94,12 @@ NSString * const HBQueueItemNotificationItemKey = @"HBQueueItemNotificationItemK
     }
 }
 
+- (void)dealloc
+{
+    [self.core removeObserver:self forKeyPath:@"state"];
+    [self.core invalidate];
+}
+
 #pragma mark - Public methods
 
 - (void)addJob:(HBJob *)item
index 722416cd1a383cf828521c514056c2c2af2a5055..246a267f6065ae05ce44969a83873fc6ce8404d0 100644 (file)
@@ -16,7 +16,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (instancetype)initWithQueue:(HBQueue *)queue;
 
-@property (nonatomic, readonly) HBQueue *queue;
+@property (nonatomic, weak, readonly) HBQueue *queue;
 
 @property (nonatomic, weak, nullable) HBAppDelegate *delegate;
 
index 80521d165e48e42d3936e3eeec3626ffdca65006..2f3931c8e13cbffcdafa19c3ec36dd9ab421fd63 100644 (file)
@@ -14,7 +14,7 @@
 
 @interface HBQueueTableViewController () <NSTableViewDataSource, NSTableViewDelegate, HBQueueItemViewDelegate>
 
-@property (nonatomic, readonly) HBQueue *queue;
+@property (nonatomic, weak, readonly) HBQueue *queue;
 @property (nonatomic) NSArray<HBQueueItem *> *dragNodesArray;
 
 @property (strong) id<HBQueueTableViewControllerDelegate> delegate;
index 6bd43c1411dbf07990d960507230eaccefcb39af..0193743f67f634e87cdc5d715816c3db778f1133 100644 (file)
@@ -12,6 +12,7 @@ NS_ASSUME_NONNULL_BEGIN
 @interface HBRemoteCore : NSObject
 
 - (instancetype)initWithLogLevel:(NSInteger)level name:(NSString *)name;
+- (void)invalidate;
 
 @property (nonatomic, readonly) HBState state;
 
index b3db5b37bf9278eb127d95fbf5cb2142118a0c1f..7ed606ae2e9ebddf597ccff076257a47c147e035 100644 (file)
@@ -14,6 +14,8 @@
 @property (nonatomic, readonly) id<HBRemoteCoreProtocol> proxy;
 
 @property (nonatomic, readwrite) HBState state;
+@property (nonatomic, readonly) NSInteger level;
+@property (nonatomic, readonly, copy) NSString *name;
 
 @property (nonatomic, readwrite, copy) HBCoreProgressHandler progressHandler;
 @property (nonatomic, readwrite, copy) HBCoreCompletionHandler completionHandler;
     _connection.exportedInterface = [NSXPCInterface interfaceWithProtocol:@protocol(HBRemoteProgressProtocol)];
     _connection.exportedObject = self;
 
-    _proxy = [_connection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
-        
-    }];
+    __weak HBRemoteCore *weakSelf = self;
+
+    _connection.interruptionHandler = ^{
+        dispatch_sync(dispatch_get_main_queue(), ^{
+            [weakSelf handleInterruption];
+        });
+    };
+
+    _proxy = [_connection remoteObjectProxy];
 
     [_connection resume];
 }
 
+
+- (void)invalidate
+{
+    [[_connection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {}] tearDown];
+    [_connection invalidate];
+    _connection = nil;
+}
+
+- (void)handleInterruption
+{
+    if (self.state != HBStateIdle)
+    {
+        self.progressHandler = nil;
+        if (self.completionHandler)
+        {
+            self.completionHandler(HBCoreResultFailed);
+        }
+        self.completionHandler = nil;
+        self.state = HBStateIdle;
+    }
+    [_proxy setUpWithLogLevel:self.level name:self.name];
+}
+
 - (instancetype)initWithLogLevel:(NSInteger)level name:(NSString *)name
 {
     self = [self init];
     if (self)
     {
+        _level = level;
+        _name = name;
         [_proxy setUpWithLogLevel:level name:name];
     }
     return self;
 }
 
-- (void)dealloc
-{
-    [_connection.remoteObjectProxy tearDown];
-    [_connection invalidate];
-}
-
 - (void)updateState:(HBState)state {
     dispatch_sync(dispatch_get_main_queue(), ^{
         self.state = state;
     self.completionHandler = completionHandler;
 
     NSData *bookmark = [url bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
-    [_connection.remoteObjectProxy provideResourceAccessWithBookmarks:@[bookmark]];
+    [_proxy provideResourceAccessWithBookmarks:@[bookmark]];
 
     self.state = HBStateScanning;
 
-    [_connection.remoteObjectProxy scanURL:url titleIndex:index previews:previewsNum minDuration:seconds withReply:^(HBCoreResult result) {
+    __weak HBRemoteCore *weakSelf = self;
+
+    [_proxy scanURL:url titleIndex:index previews:previewsNum minDuration:seconds withReply:^(HBCoreResult result) {
         dispatch_sync(dispatch_get_main_queue(), ^{
-            self.progressHandler = nil;
-            self.completionHandler(result);
+            weakSelf.progressHandler = nil;
+            weakSelf.completionHandler(result);
         });
     }];
 }
 - (void)encodeJob:(HBJob *)job progressHandler:(HBCoreProgressHandler)progressHandler completionHandler:(HBCoreCompletionHandler)completionHandler
 {
     NSData *bookmark = [job.outputURL bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
-    [_connection.remoteObjectProxy provideResourceAccessWithBookmarks:@[bookmark]];
+    [_proxy provideResourceAccessWithBookmarks:@[bookmark]];
 
     self.progressHandler = progressHandler;
     self.completionHandler = completionHandler;
 
     self.state = HBStateWorking;
 
-    [_connection.remoteObjectProxy encodeJob:job withReply:^(HBCoreResult result) {
+    __weak HBRemoteCore *weakSelf = self;
+
+    [_proxy encodeJob:job withReply:^(HBCoreResult result) {
         dispatch_sync(dispatch_get_main_queue(), ^{
-            self.progressHandler = nil;
-            self.completionHandler(result);
+            weakSelf.progressHandler = nil;
+            weakSelf.completionHandler(result);
         });
     }];
 }
 }
 
 - (void)updateProgress:(double)currentProgress hours:(int)hours minutes:(int)minutes seconds:(int)seconds state:(HBState)state info:(NSString *)info {
+
+    __weak HBRemoteCore *weakSelf = self;
+
     dispatch_sync(dispatch_get_main_queue(), ^{
         HBProgress progress = {currentProgress , hours, minutes, seconds};
-        self.state = state;
-        self.progressHandler(state, progress, info);
+        weakSelf.state = state;
+        weakSelf.progressHandler(state, progress, info);
     });
 }