[vlc-commits] [Git][videolan/vlc][master] 3 commits: macosx: Return NSError if relevant from media source node parsing methods

Steve Lhomme (@robUx4) gitlab at videolan.org
Tue Jun 3 06:52:01 UTC 2025



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
e74d14db by Claudio Cambra at 2025-06-03T06:36:16+00:00
macosx: Return NSError if relevant from media source node parsing methods

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
b2deaee7 by Claudio Cambra at 2025-06-03T06:36:16+00:00
macosx: Handle returned error types from media source node parsing methods

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
0aaaf7ed by Claudio Cambra at 2025-06-03T06:36:16+00:00
macosx: Present error alerts when trying to access inaccessible input nodes

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -


5 changed files:

- modules/gui/macosx/library/VLCLibrarySegment.m
- modules/gui/macosx/library/media-source/VLCMediaSource.h
- modules/gui/macosx/library/media-source/VLCMediaSource.m
- modules/gui/macosx/library/media-source/VLCMediaSourceBaseDataSource.m
- modules/gui/macosx/library/media-source/VLCMediaSourceDataSource.m


Changes:

=====================================
modules/gui/macosx/library/VLCLibrarySegment.m
=====================================
@@ -69,7 +69,10 @@ NSArray<NSString *> *defaultBookmarkedLocations()
 
     for (VLCMediaSource * const mediaSource in localMediaSources) {
         VLCInputNode * const rootNode = mediaSource.rootNode;
-        [mediaSource preparseInputNodeWithinTree:rootNode];
+        NSError * const error = [mediaSource preparseInputNodeWithinTree:rootNode];
+        if (error)
+            continue;
+        
 
         if (rootNode.children != nil) {
             for (VLCInputNode * const node in rootNode.children) {


=====================================
modules/gui/macosx/library/media-source/VLCMediaSource.h
=====================================
@@ -45,10 +45,10 @@ extern NSString *VLCMediaSourcePreparsingEnded;
 - (instancetype)initWithLocalFolderMrl:(NSString *)mrl
                      andPreparser:(vlc_preparser_t *)p_preparser;
 
-- (void)preparseInputNodeWithinTree:(VLCInputNode *)inputNode;
+- (nullable NSError *)preparseInputNodeWithinTree:(VLCInputNode *)inputNode;
 - (void)clearChildNodesForNode:(input_item_node_t*)inputNode;
-- (void)generateChildNodesForDirectoryNode:(input_item_node_t*)directoryNode
-                                   withUrl:(NSURL*)directoryUrl;
+- (nullable NSError *)generateChildNodesForDirectoryNode:(input_item_node_t *)directoryNode
+                                                 withUrl:(NSURL *)directoryUrl;
 
 @property (nonatomic, readonly) NSString *mediaSourceDescription;
 @property (nonatomic, readonly) VLCInputNode *rootNode;


=====================================
modules/gui/macosx/library/media-source/VLCMediaSource.m
=====================================
@@ -290,19 +290,16 @@ static const char *const myFoldersDescription = "My Folders";
     }
 }
 
-- (void)preparseInputNodeWithinTree:(VLCInputNode *)inputNode
+- (NSError *)preparseInputNodeWithinTree:(VLCInputNode *)inputNode
 {
-    if(!inputNode) {
-        NSLog(@"Could not preparse input node, is null.");
-        return;
-    }
+    NSParameterAssert(inputNode != nil);
 
     if (_p_mediaSource->description == localDevicesDescription) {
         [self generateLocalDevicesTree];
     }
 
-    if (inputNode == nil || inputNode.inputItem == nil) {
-        return;
+    if (inputNode.inputItem == nil) {
+        return nil;
     }
 
     if (inputNode.inputItem.inputType == ITEM_TYPE_DIRECTORY &&
@@ -310,12 +307,12 @@ static const char *const myFoldersDescription = "My Folders";
         input_item_node_t *vlcInputNode = inputNode.vlcInputItemNode;
         NSURL *dirUrl = [NSURL URLWithString:inputNode.inputItem.MRL];
 
-        [self generateChildNodesForDirectoryNode:vlcInputNode withUrl:dirUrl];
-        return;
+        return [self generateChildNodesForDirectoryNode:vlcInputNode withUrl:dirUrl];
     }
 
     vlc_media_tree_Preparse(_p_mediaSource->tree, _p_preparser,
                             inputNode.inputItem.vlcInputItem);
+    return nil;
 }
 
 - (void)clearChildNodesForNode:(nonnull input_item_node_t*)inputNode
@@ -409,13 +406,10 @@ static const char *const myFoldersDescription = "My Folders";
     });
 }
 
-- (void)generateChildNodesForDirectoryNode:(input_item_node_t *)directoryNode
-                                   withUrl:(NSURL *)directoryUrl
+- (NSError *)generateChildNodesForDirectoryNode:(input_item_node_t *)directoryNode
+                                        withUrl:(NSURL *)directoryUrl
 {
-    if (directoryNode == NULL || directoryUrl == nil) {
-        return;
-    }
-
+    NSParameterAssert(directoryNode != NULL && directoryUrl != nil);
     if (self.willStartGeneratingChildNodesForNodeHandler) {
         self.willStartGeneratingChildNodesForNodeHandler(directoryNode);
     }
@@ -437,9 +431,9 @@ static const char *const myFoldersDescription = "My Folders";
                                                        options:options
                                                          error:&error];
 
-    if (children == nil || children.count == 0 || error) {
+    if (error) {
         NSLog(@"Failed to get directories: %@.", error);
-        return;
+        return error;
     }
 
     children = [children sortedArrayUsingComparator:^NSComparisonResult(NSURL *url1, NSURL *url2) {
@@ -491,6 +485,8 @@ static const char *const myFoldersDescription = "My Folders";
     if (self.didFinishGeneratingChildNodesForNodeHandler) {
         self.didFinishGeneratingChildNodesForNodeHandler(directoryNode);
     }
+
+    return nil;
 }
 
 - (NSString *)mediaSourceDescription


=====================================
modules/gui/macosx/library/media-source/VLCMediaSourceBaseDataSource.m
=====================================
@@ -21,6 +21,7 @@
  *****************************************************************************/
 
 #import "VLCMediaSourceBaseDataSource.h"
+#include <AppKit/AppKit.h>
 
 #import "VLCLibraryMediaSourceViewNavigationStack.h"
 #import "VLCMediaSourceProvider.h"
@@ -167,8 +168,11 @@ NSString * const VLCMediaSourceBaseDataSourceNodeChanged = @"VLCMediaSourceBaseD
 
     for (VLCMediaSource * const mediaSource in mediaSources) {
         VLCInputNode * const rootNode = [mediaSource rootNode];
-        [mediaSource preparseInputNodeWithinTree:rootNode];
-        [self.navigationStack installHandlersOnMediaSource:mediaSource];
+        if (rootNode == nil)
+            continue;
+        NSError * const error = [mediaSource preparseInputNodeWithinTree:rootNode];
+        if (error == nil)
+            [self.navigationStack installHandlersOnMediaSource:mediaSource];
     }
 
     _mediaSources = mediaSources;
@@ -476,7 +480,13 @@ referenceSizeForHeaderInSection:(NSInteger)section
         return;
     }
 
-    [mediaSource preparseInputNodeWithinTree:node];
+    NSError * const error = [mediaSource preparseInputNodeWithinTree:node];
+    if (error) {
+        NSAlert * const alert = [NSAlert alertWithError:error];
+        alert.alertStyle = NSAlertStyleCritical;
+        [alert runModal];
+        return;
+    }
     
     VLCMediaSourceDataSource * const newChildDataSource = [[VLCMediaSourceDataSource alloc] init];
     


=====================================
modules/gui/macosx/library/media-source/VLCMediaSourceDataSource.m
=====================================
@@ -94,7 +94,15 @@ NSString * const VLCMediaSourceDataSourceNodeChanged = @"VLCMediaSourceDataSourc
 
     if (self.parentBaseDataSource.mediaSourceMode == VLCMediaSourceModeLAN) {
         NSURL * const nodeUrl = [NSURL URLWithString:nodeToDisplay.inputItem.MRL];
-        [self.displayedMediaSource generateChildNodesForDirectoryNode:inputNode withUrl:nodeUrl];
+        NSError * const error =
+            [self.displayedMediaSource generateChildNodesForDirectoryNode:inputNode
+                                                                  withUrl:nodeUrl];
+        if (error) {
+            NSAlert * const alert = [NSAlert alertWithError:error];
+            alert.alertStyle = NSAlertStyleCritical;
+            [alert runModal];
+            return;
+        }
 
         const __weak typeof(self) weakSelf = self;
         self.observedPathDispatchSource = [self observeLocalUrl:nodeUrl
@@ -266,8 +274,12 @@ NSString * const VLCMediaSourceDataSourceNodeChanged = @"VLCMediaSourceDataSourc
             dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{
                 NSURL * const inputNodeUrl = [NSURL URLWithString:inputNode.inputItem.MRL];
                 input_item_node_t * const p_inputNode = inputNode.vlcInputItemNode;
-                [self.displayedMediaSource generateChildNodesForDirectoryNode:p_inputNode
-                                                                      withUrl:inputNodeUrl];
+                NSError * const error =
+                    [self.displayedMediaSource generateChildNodesForDirectoryNode:p_inputNode
+                                                                          withUrl:inputNodeUrl];
+                if (error)
+                    return;
+
                 dispatch_async(dispatch_get_main_queue(), ^{
                     cellView.textField.stringValue =
                         [NSString stringWithFormat:@"%i items", inputNode.numberOfChildren];
@@ -398,7 +410,13 @@ NSString * const VLCMediaSourceDataSourceNodeChanged = @"VLCMediaSourceDataSourc
         VLCInputNodePathControlItem *nodePathItem = [[VLCInputNodePathControlItem alloc] initWithInputNode:node];
         [self.pathControl appendInputNodePathControlItem:nodePathItem];
 
-        [self.displayedMediaSource preparseInputNodeWithinTree:node];
+        NSError * const error = [self.displayedMediaSource preparseInputNodeWithinTree:node];
+        if (error) {
+            NSAlert * const alert = [NSAlert alertWithError:error];
+            alert.alertStyle = NSAlertStyleCritical;
+            [alert runModal];
+            return;
+        }
         self.nodeToDisplay = node;
 
         [self.navigationStack appendCurrentLibraryState];



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1ef06f3349a66e9ec8c6c88dcfa71806d8d2067b...0aaaf7ed0f6d592bed6bfadca1e2eac203919e6e

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1ef06f3349a66e9ec8c6c88dcfa71806d8d2067b...0aaaf7ed0f6d592bed6bfadca1e2eac203919e6e
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list