Browse Source

more service discovery refactoring
add VLCLocalNetworkServiceBrowser protocol
add VLCLocalNetworkServiceBrowser implementations for NSNetBrowser-based discovery

Tobias Conradi 9 years ago
parent
commit
b4cb5a44e1

+ 28 - 0
Sources/LocalNetworkConnectivity/VLCLocalNetworkService-Protocol.h

@@ -0,0 +1,28 @@
+/*****************************************************************************
+ * VLCLocalNetworkService-Protocol.h
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright (c) 2015 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Tobias Conradi <videolan # tobias-conradi.de>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+@protocol VLCLocalNetworkService <NSObject>
+
+@required
+@property (nonatomic, readonly, nullable) UIImage *icon;
+@property (nonatomic, readonly) NSString *title;
+
+@optional
+- (nullable UIViewController *)detailViewController;
+
+typedef void (^VLCLocalNetworkServiceActionBlock)(void);
+@property (nonatomic, readonly) VLCLocalNetworkServiceActionBlock action;
+@end
+
+NS_ASSUME_NONNULL_END

+ 1 - 14
Sources/LocalNetworkConnectivity/VLCLocalNetworkService.h

@@ -9,22 +9,9 @@
  *
  * Refer to the COPYING file of the official project for license.
  *****************************************************************************/
-#import <Foundation/Foundation.h>
+#import "VLCLocalNetworkService-Protocol.h"
 
 NS_ASSUME_NONNULL_BEGIN
-@protocol VLCLocalNetworkService <NSObject>
-
-@required
-@property (nonatomic, readonly, nullable) UIImage *icon;
-@property (nonatomic, readonly) NSString *title;
-
-@optional
-- (nullable UIViewController *)detailViewController;
-
-typedef void (^VLCLocalNetworkServiceActionBlock)(void);
-@property (nonatomic, readonly) VLCLocalNetworkServiceActionBlock action;
-@end
-
 #pragma mark - item
 
 @interface VLCLocalNetworkServiceItem : NSObject <VLCLocalNetworkService>

+ 31 - 0
Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowser-Protocol.h

@@ -0,0 +1,31 @@
+/*****************************************************************************
+ * VLCLocalNetworkServiceBrowser-Protocol.h
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright (c) 2015 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Tobias Conradi <videolan # tobias-conradi.de>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+#import <Foundation/Foundation.h>
+#import "VLCLocalNetworkService.h"
+
+@protocol VLCLocalNetworkServiceBrowserDelegate;
+@protocol VLCLocalNetworkServiceBrowser <NSObject>
+
+@property (nonatomic, weak) id <VLCLocalNetworkServiceBrowserDelegate> delegate;
+
+@property (nonatomic, readonly) NSString *name;
+@property (nonatomic, readonly) NSUInteger numberOfItems;
+- (id<VLCLocalNetworkService>)networkServiceForIndex:(NSUInteger)index;
+
+- (void)startDiscovery;
+- (void)stopDiscovery;
+@end
+
+@protocol VLCLocalNetworkServiceBrowserDelegate <NSObject>
+- (void) localNetworkServiceBrowserDidUpdateServices:(id<VLCLocalNetworkServiceBrowser>)serviceBrowser;
+@end

+ 51 - 0
Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserNetService.h

@@ -0,0 +1,51 @@
+/*****************************************************************************
+ * VLCLocalNetworkServiceBrowserNetService.h
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright (c) 2015 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Tobias Conradi <videolan # tobias-conradi.de>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+#import <Foundation/Foundation.h>
+#import "VLCLocalNetworkServiceBrowser-Protocol.h"
+
+@interface VLCLocalNetworkServiceBrowserNetService : NSObject <VLCLocalNetworkServiceBrowser>
+- (instancetype)initWithName:(NSString *)name serviceType:(NSString *)serviceType domain:(NSString *)domain NS_DESIGNATED_INITIALIZER;
+@property (nonatomic, weak) id<VLCLocalNetworkServiceBrowserDelegate> delegate;
+@end
+
+@interface VLCLocalNetworkServiceBrowserNetService() <NSNetServiceBrowserDelegate, NSNetServiceDelegate>
+@property (nonatomic, readonly) NSNetServiceBrowser *netServiceBrowser;
+@property (nonatomic, readonly) NSString *serviceType;
+@property (nonatomic, readonly) NSString *domain;
+
+@property (nonatomic, readonly) NSMutableArray<NSNetService*> *rawNetServices;
+@property (nonatomic, readonly) NSMutableArray<VLCLocalNetworkServiceNetService*> *resolvedLocalNetworkServices;
+
+// adds netservice and informs delegate
+- (void)addResolvedLocalNetworkService:(VLCLocalNetworkServiceNetService *)localNetworkService;
+
+// override in subclasses for different configurations
+- (VLCLocalNetworkServiceNetService *)localServiceForNetService:(NSNetService *)netService;
+- (void)netServiceDidResolveAddress:(NSNetService *)sender;
+@end
+
+#pragma mark - service specific subclasses
+@interface VLCLocalNetworkServiceBrowserFTP : VLCLocalNetworkServiceBrowserNetService
+- (instancetype)initWithName:(NSString *)name serviceType:(NSString *)serviceType domain:(NSString *)domain NS_UNAVAILABLE;
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+@end
+
+@interface VLCLocalNetworkServiceBrowserPlex : VLCLocalNetworkServiceBrowserNetService
+- (instancetype)initWithName:(NSString *)name serviceType:(NSString *)serviceType domain:(NSString *)domain NS_UNAVAILABLE;
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+@end
+
+@interface VLCLocalNetworkServiceBrowserHTTP : VLCLocalNetworkServiceBrowserNetService
+- (instancetype)initWithName:(NSString *)name serviceType:(NSString *)serviceType domain:(NSString *)domain NS_UNAVAILABLE;
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+@end

+ 173 - 0
Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserNetService.m

@@ -0,0 +1,173 @@
+/*****************************************************************************
+ * VLCLocalNetworkServiceBrowserNetService.m
+ * VLC for iOS
+ *****************************************************************************
+ * Copyright (c) 2015 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Tobias Conradi <videolan # tobias-conradi.de>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+#import "VLCLocalNetworkServiceBrowserNetService.h"
+
+@interface NSMutableArray(VLCLocalNetworkServiceNetService)
+-(NSUInteger)vlc_indexOfServiceWithNetService:(NSNetService*)netService;
+-(void)vlc_removeServiceWithNetService:(NSNetService*)netService;
+
+@end
+@implementation NSMutableArray (VLCLocalNetworkServiceNetService)
+
+- (NSUInteger)vlc_indexOfServiceWithNetService:(NSNetService *)netService {
+    NSUInteger index = [self indexOfObjectPassingTest:^BOOL(VLCLocalNetworkServiceNetService *obj, NSUInteger idx, BOOL * _Nonnull stop) {
+        if (![obj respondsToSelector:@selector(netService)]) return false;
+        BOOL equal = [obj.netService isEqual:netService];
+        if (equal) {
+            *stop = YES;
+        }
+        return equal;
+    }];
+    return index;
+}
+-(void)vlc_removeServiceWithNetService:(NSNetService *)netService {
+    NSUInteger index = [self vlc_indexOfServiceWithNetService:netService];
+    if (index != NSNotFound) {
+        [self removeObjectAtIndex:index];
+    }
+}
+@end
+
+#pragma mark - NetService based implementation
+
+@implementation VLCLocalNetworkServiceBrowserNetService
+@synthesize name = _name;
+
+- (instancetype)initWithName:(NSString *)name serviceType:(NSString *)serviceType domain:(NSString *)domain
+{
+    self = [super init];
+    if (self) {
+        _name = name;
+        _serviceType = serviceType;
+        _domain = domain;
+        _netServiceBrowser = [[NSNetServiceBrowser alloc] init];
+        _netServiceBrowser.delegate = self;
+        _rawNetServices = [[NSMutableArray alloc] init];
+        _resolvedLocalNetworkServices = [[NSMutableArray alloc] init];
+    }
+    return self;
+}
+- (instancetype)init {
+    return [self initWithName:@"" serviceType:@"" domain:@""];
+}
+
+- (NSUInteger)numberOfItems {
+    return self.resolvedLocalNetworkServices.count;
+}
+- (void)startDiscovery {
+    [self.netServiceBrowser searchForServicesOfType:self.serviceType inDomain:self.domain];
+}
+- (void)stopDiscovery {
+    [self.netServiceBrowser stop];
+}
+- (id<VLCLocalNetworkService>)networkServiceForIndex:(NSUInteger)index {
+    return self.resolvedLocalNetworkServices[index];
+}
+
+#pragma mark - NSNetServiceBrowserDelegate
+- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing {
+    APLog(@"found bonjour service: %@ (%@)", service.name, service.type);
+    [self.rawNetServices addObject:service];
+    service.delegate = self;
+    [service resolveWithTimeout:5.];
+}
+- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didRemoveService:(nonnull NSNetService *)service moreComing:(BOOL)moreComing {
+    APLog(@"bonjour service disappeared: %@ (%i)", service.name, moreComing);
+    [self.rawNetServices removeObject:service];
+    [self.resolvedLocalNetworkServices vlc_removeServiceWithNetService:service];
+
+    if (!moreComing) {
+        [self.delegate localNetworkServiceBrowserDidUpdateServices:self];
+    }
+}
+
+#pragma mark - NSNetServiceDelegate
+- (void)netServiceDidResolveAddress:(NSNetService *)sender {
+    VLCLocalNetworkServiceNetService *localNetworkService = [self localServiceForNetService:sender];
+    [self addResolvedLocalNetworkService:localNetworkService];
+}
+- (VLCLocalNetworkServiceNetService *)localServiceForNetService:(NSNetService *)netService {
+    return [[VLCLocalNetworkServiceNetService alloc] initWithNetService:netService];
+}
+
+#pragma mark -
+- (void)addResolvedLocalNetworkService:(VLCLocalNetworkServiceNetService *)localNetworkService {
+    if ([self.resolvedLocalNetworkServices vlc_indexOfServiceWithNetService:localNetworkService.netService] != NSNotFound) {
+        return;
+    }
+    [self.resolvedLocalNetworkServices addObject:localNetworkService];
+    [self.delegate localNetworkServiceBrowserDidUpdateServices:self];
+}
+@end
+
+#pragma mark - service specific subclasses
+
+@implementation VLCLocalNetworkServiceBrowserFTP
+- (instancetype)init {
+    return [super initWithName:@"File Transfer Protocol (FTP)"
+                   serviceType:@"_ftp._tcp."
+                        domain:@""];
+}
+- (VLCLocalNetworkServiceNetService *)localServiceForNetService:(NSNetService *)netService {
+    return [[VLCLocalNetworkServiceFTP alloc] initWithNetService:netService];
+}
+@end
+
+@implementation VLCLocalNetworkServiceBrowserPlex
+- (instancetype)init {
+    return [super initWithName:@"Plex Media Server (via Bonjour)"
+                   serviceType:@"_plexmediasvr._tcp."
+                        domain:@""];
+}
+- (VLCLocalNetworkServiceNetService *)localServiceForNetService:(NSNetService *)netService {
+    return [[VLCLocalNetworkServicePlex alloc] initWithNetService:netService];
+}
+@end
+
+#import "VLCSharedLibraryParser.h"
+@interface VLCLocalNetworkServiceBrowserHTTP()
+@property (nonatomic) VLCSharedLibraryParser *httpParser;
+@end
+@implementation VLCLocalNetworkServiceBrowserHTTP
+- (instancetype)init {
+    return [super initWithName:NSLocalizedString(@"SHARED_VLC_IOS_LIBRARY", nil)
+                   serviceType:@"_http._tcp."
+                        domain:@""];
+}
+- (void)dealloc {
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (VLCSharedLibraryParser *)httpParser {
+    if (!_httpParser) {
+        _httpParser = [[VLCSharedLibraryParser alloc] init];
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(sharedLibraryFound:)
+                                                     name:VLCSharedLibraryParserDeterminedNetserviceAsVLCInstance
+                                                   object:_httpParser];
+    }
+    return _httpParser;
+}
+- (void)netServiceDidResolveAddress:(NSNetService *)sender {
+    [self.httpParser checkNetserviceForVLCService:sender];
+}
+
+- (void)sharedLibraryFound:(NSNotification *)aNotification {
+    NSNetService *netService = [aNotification.userInfo objectForKey:@"aNetService"];
+    [self addResolvedLocalNetworkService:[self localServiceForNetService:netService]];
+}
+
+- (VLCLocalNetworkServiceNetService *)localServiceForNetService:(NSNetService *)netService {
+    return [[VLCLocalNetworkServiceHTTP alloc] initWithNetService:netService];
+}
+@end

+ 2 - 2
Sources/LocalNetworkConnectivity/VLCLocalServerDiscoveryController.h

@@ -16,13 +16,13 @@
 
 #import "VLCLocalNetworkService.h"
 
-@protocol VLCLocalServerDiscoveryControllerDelegate <NSObject>
 
-@required
+@protocol VLCLocalServerDiscoveryControllerDelegate <NSObject>
 - (void)discoveryFoundSomethingNew;
 
 @end
 
+
 @interface VLCLocalServerDiscoveryController : NSObject
 
 @property (nonatomic, readwrite, weak) id delegate;

+ 32 - 149
Sources/LocalNetworkConnectivity/VLCLocalServerDiscoveryController.m

@@ -31,8 +31,8 @@
 #import "VLCHTTPUploaderController.h"
 
 #import "Reachability.h"
+#import "VLCLocalNetworkServiceBrowserNetService.h"
 
-#define kPlexServiceType @"_plexmediasvr._tcp."
 
 typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
     VLCLocalServerSectionGeneric = 0,
@@ -44,46 +44,14 @@ typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
     VLCLocalServerSectionSAP
 };
 
-@interface NSMutableArray(VLCLocalNetworkServiceNetService)
--(NSUInteger)vlc_indexOfServiceWithNetService:(NSNetService*)netService;
--(void)vlc_removeServiceWithNetService:(NSNetService*)netService;
 
-@end
-@implementation NSMutableArray (VLCLocalNetworkServiceNetService)
-
-- (NSUInteger)vlc_indexOfServiceWithNetService:(NSNetService *)netService {
-    NSUInteger index = [self indexOfObjectPassingTest:^BOOL(VLCLocalNetworkServiceNetService *obj, NSUInteger idx, BOOL * _Nonnull stop) {
-        if (![obj respondsToSelector:@selector(netService)]) return false;
-
-        BOOL equal = [obj.netService isEqual:netService];
-        if (equal) {
-            *stop = YES;
-        }
-        return equal;
-    }];
-    return index;
-}
-
--(void)vlc_removeServiceWithNetService:(NSNetService *)netService {
-    NSUInteger index = [self vlc_indexOfServiceWithNetService:netService];
-    if (index != NSNotFound) {
-        [self removeObjectAtIndex:index];
-    }
-}
-@end
 
-
-@interface VLCLocalServerDiscoveryController () <NSNetServiceBrowserDelegate, NSNetServiceDelegate, VLCMediaListDelegate, UPnPDBObserver>
+@interface VLCLocalServerDiscoveryController () <VLCLocalNetworkServiceBrowserDelegate, VLCMediaListDelegate, UPnPDBObserver>
 {
-    NSNetServiceBrowser *_ftpNetServiceBrowser;
-    NSNetServiceBrowser *_PlexNetServiceBrowser;
-    NSNetServiceBrowser *_httpNetServiceBrowser;
-    NSMutableArray<VLCLocalNetworkServicePlex*> *_plexServices;
-    NSMutableArray<VLCLocalNetworkServiceHTTP*> *_httpVLCServices;
-    NSMutableArray<VLCLocalNetworkServiceFTP*> *_ftpServices;
 
-    // to keep strong references while resolving
-    NSMutableArray *_rawNetServices;
+    id<VLCLocalNetworkServiceBrowser> _plexBrowser;
+    id<VLCLocalNetworkServiceBrowser> _FTPBrowser;
+    id<VLCLocalNetworkServiceBrowser> _HTTPBrowser;
 
     NSArray<VLCLocalNetworkServiceUPnP*> *_filteredUPNPDevices;
     NSArray *_UPNPdevices;
@@ -111,9 +79,7 @@ typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
     [[NSNotificationCenter defaultCenter] removeObserver:self];
 
     [_reachability stopNotifier];
-    [_ftpNetServiceBrowser stop];
-    [_PlexNetServiceBrowser stop];
-    [_httpNetServiceBrowser stop];
+    [self stopDiscovery];
 }
 
 - (void)stopDiscovery
@@ -122,16 +88,17 @@ typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
     [self _stopSAPDiscovery];
     [self _stopDSMDiscovery];
 
-    [_ftpNetServiceBrowser stop];
-    [_PlexNetServiceBrowser stop];
-    [_httpNetServiceBrowser stop];
+    [_FTPBrowser stopDiscovery];
+    [_plexBrowser stopDiscovery];
+    [_HTTPBrowser stopDiscovery];
 }
 
 - (void)startDiscovery
 {
-    [_ftpNetServiceBrowser searchForServicesOfType:@"_ftp._tcp." inDomain:@""];
-    [_PlexNetServiceBrowser searchForServicesOfType:kPlexServiceType inDomain:@""];
-    [_httpNetServiceBrowser searchForServicesOfType:@"_http._tcp." inDomain:@""];
+
+    [_FTPBrowser startDiscovery];
+    [_plexBrowser startDiscovery];
+    [_HTTPBrowser startDiscovery];
 
     [self netReachabilityChanged];
 }
@@ -140,9 +107,9 @@ typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
 {
     return @[@"Generic",
              @"Universal Plug'n'Play (UPnP)",
-             @"Plex Media Server (via Bonjour)",
-             @"File Transfer Protocol (FTP)",
-             NSLocalizedString(@"SHARED_VLC_IOS_LIBRARY", nil),
+             _plexBrowser.name,
+             _FTPBrowser.name,
+             _HTTPBrowser.name,
              NSLocalizedString(@"SMB_CIFS_FILE_SERVERS", nil),
              @"SAP"];
 }
@@ -165,25 +132,13 @@ typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
                           name:UIApplicationDidBecomeActiveNotification
                         object:[UIApplication sharedApplication]];
 
-    [defaultCenter addObserver:self
-                      selector:@selector(sharedLibraryFound:)
-                          name:VLCSharedLibraryParserDeterminedNetserviceAsVLCInstance
-                        object:nil];
 
-    _ftpServices = [[NSMutableArray alloc] init];
-
-    _rawNetServices = [[NSMutableArray alloc] init];
-
-    _ftpNetServiceBrowser = [[NSNetServiceBrowser alloc] init];
-    _ftpNetServiceBrowser.delegate = self;
-
-    _plexServices = [[NSMutableArray alloc] init];
-    _PlexNetServiceBrowser = [[NSNetServiceBrowser alloc] init];
-    _PlexNetServiceBrowser.delegate = self;
-
-    _httpVLCServices = [[NSMutableArray alloc] init];
-    _httpNetServiceBrowser = [[NSNetServiceBrowser alloc] init];
-    _httpNetServiceBrowser.delegate = self;
+    _plexBrowser = [[VLCLocalNetworkServiceBrowserPlex alloc] init];
+    _plexBrowser.delegate = self;
+    _FTPBrowser = [[VLCLocalNetworkServiceBrowserFTP alloc] init];
+    _FTPBrowser.delegate = self;
+    _HTTPBrowser = [[VLCLocalNetworkServiceBrowserHTTP alloc] init];
+    _HTTPBrowser.delegate = self;
 
     _reachability = [Reachability reachabilityForLocalWiFi];
     [_reachability startNotifier];
@@ -250,17 +205,17 @@ typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
 
         case VLCLocalServerSectionPlex:
         {
-            return _plexServices[row];
+            return [_plexBrowser networkServiceForIndex:row];
         }
 
         case VLCLocalServerSectionFTP:
         {
-            return _ftpServices[row];
+            return [_FTPBrowser networkServiceForIndex:row];
         }
 
         case VLCLocalServerSectionVLCiOS:
         {
-            return _httpVLCServices[row];
+            return [_HTTPBrowser networkServiceForIndex:row];
         }
 
         case VLCLocalServerSectionSMB:
@@ -291,13 +246,13 @@ typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
             return _filteredUPNPDevices.count;
 
         case VLCLocalServerSectionPlex:
-            return _plexServices.count;
+            return _plexBrowser.numberOfItems;
 
         case VLCLocalServerSectionFTP:
-            return _ftpServices.count;
+            return _FTPBrowser.numberOfItems;
 
         case VLCLocalServerSectionVLCiOS:
-            return _httpVLCServices.count;
+            return _HTTPBrowser.numberOfItems;
 
         case VLCLocalServerSectionSMB:
             return _dsmDiscoverer.discoveredMedia.count;
@@ -327,82 +282,10 @@ typedef NS_ENUM(NSUInteger, VLCLocalServerSections) {
     return YES;
 }
 
-#pragma mark - bonjour discovery
-- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
-{
-    APLog(@"found bonjour service: %@ (%@)", aNetService.name, aNetService.type);
-    [_rawNetServices addObject:aNetService];
-    aNetService.delegate = self;
-    [aNetService resolveWithTimeout:5.];
-}
-
-- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didRemoveService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
-{
-    APLog(@"bonjour service disappeared: %@ (%i)", aNetService.name, moreComing);
-    if ([_rawNetServices containsObject:aNetService])
-        [_rawNetServices removeObject:aNetService];
-    if ([aNetService.type isEqualToString:@"_ftp._tcp."]) {
-        [_ftpServices vlc_removeServiceWithNetService:aNetService];
-    }
-    if ([aNetService.type isEqualToString:kPlexServiceType]) {
-        [_plexServices vlc_removeServiceWithNetService:aNetService];
-    }
-    if ([aNetService.type isEqualToString:@"_http._tcp."]) {
-        NSUInteger index = [_httpVLCServices vlc_indexOfServiceWithNetService:aNetService];
-        if (index != NSNotFound) {
-            [_httpVLCServices removeObjectAtIndex:index];
-        }
-    }
-    if (!moreComing) {
-        if (self.delegate) {
-            if ([self.delegate respondsToSelector:@selector(discoveryFoundSomethingNew)]) {
-                [self.delegate discoveryFoundSomethingNew];
-            }
-        }
-    }
-}
-
-- (void)netServiceDidResolveAddress:(NSNetService *)aNetService
-{
-    if ([aNetService.type isEqualToString:@"_ftp._tcp."]) {
-        NSUInteger index = [_ftpServices vlc_indexOfServiceWithNetService:aNetService];
-        if (index == NSNotFound) {
-            [_ftpServices addObject:[[VLCLocalNetworkServiceFTP alloc] initWithNetService:aNetService]];
-        }
-    } else if ([aNetService.type isEqualToString:kPlexServiceType]) {
-        if ([_plexServices vlc_indexOfServiceWithNetService:aNetService] == NSNotFound) {
-            [_plexServices addObject:[[VLCLocalNetworkServicePlex alloc] initWithNetService: aNetService]];
-        }
-    }  else if ([aNetService.type isEqualToString:@"_http._tcp."]) {
-        if ([[aNetService hostName] rangeOfString:_myHostName].location == NSNotFound) {
-            if (!_httpParser)
-                _httpParser = [[VLCSharedLibraryParser alloc] init];
-            [_httpParser checkNetserviceForVLCService:aNetService];
-        }
-    }
-    [_rawNetServices removeObject:aNetService];
-    if (self.delegate) {
-        if ([self.delegate respondsToSelector:@selector(discoveryFoundSomethingNew)]) {
-            [self.delegate discoveryFoundSomethingNew];
-        }
-    }
-}
-
-- (void)netService:(NSNetService *)aNetService didNotResolve:(NSDictionary *)errorDict
-{
-    APLog(@"failed to resolve: %@", aNetService.name);
-    [_rawNetServices removeObject:aNetService];
-}
-
-#pragma mark - shared library stuff
-
-- (void)sharedLibraryFound:(NSNotification *)aNotification
-{
-    NSNetService *aNetService = [aNotification.userInfo objectForKey:@"aNetService"];
-
-    NSUInteger index = [_httpVLCServices vlc_indexOfServiceWithNetService:aNetService];
-    if (index == NSNotFound) {
-        [_httpVLCServices addObject:[[VLCLocalNetworkServiceHTTP alloc] initWithNetService:aNetService]];
+#pragma mark - VLCLocalNetworkServiceBrowserDelegate
+- (void)localNetworkServiceBrowserDidUpdateServices:(id<VLCLocalNetworkServiceBrowser>)serviceBrowser {
+    if ([self.delegate respondsToSelector:@selector(discoveryFoundSomethingNew)]) {
+        [self.delegate discoveryFoundSomethingNew];
     }
 }
 

+ 12 - 2
VLC for iOS.xcodeproj/project.pbxproj

@@ -260,7 +260,8 @@
 		DDB7C6A41BAEB28200E6570E /* WKInterfaceController+VLCConnectionAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = DD9FBE761BAD6BB600FFE77A /* WKInterfaceController+VLCConnectionAlert.m */; };
 		DDB959421AFBB30500BB8CFF /* MappingModel_2_5_to_2_6.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = DDB959411AFBB30500BB8CFF /* MappingModel_2_5_to_2_6.xcmappingmodel */; };
 		DDC10BE41AEE8EA700890DC3 /* VLCTimeNavigationTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = DDC10BE31AEE8EA700890DC3 /* VLCTimeNavigationTitleView.m */; };
-		DDE3C8D01BD0246500C03B8B /* VLCLocalNetworkService.m in Sources */ = {isa = PBXBuildFile; fileRef = DDE3C8CF1BD0246500C03B8B /* VLCLocalNetworkService.m */; };
+		DDE3C8D91BD1322E00C03B8B /* VLCLocalNetworkServiceBrowserNetService.m in Sources */ = {isa = PBXBuildFile; fileRef = DDE3C8D51BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.m */; };
+		DDE3C8DA1BD1323800C03B8B /* VLCLocalNetworkService.m in Sources */ = {isa = PBXBuildFile; fileRef = DDE3C8CF1BD0246500C03B8B /* VLCLocalNetworkService.m */; };
 		E0C04F951A25B4410080331A /* VLCDocumentPickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C04F941A25B4410080331A /* VLCDocumentPickerController.m */; };
 /* End PBXBuildFile section */
 
@@ -807,6 +808,10 @@
 		DDE1BCE51B676B8800A4B9CE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
 		DDE3C8CE1BD0246500C03B8B /* VLCLocalNetworkService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLocalNetworkService.h; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkService.h; sourceTree = SOURCE_ROOT; };
 		DDE3C8CF1BD0246500C03B8B /* VLCLocalNetworkService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLocalNetworkService.m; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkService.m; sourceTree = SOURCE_ROOT; };
+		DDE3C8D11BD1103300C03B8B /* VLCLocalNetworkServiceBrowser-Protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "VLCLocalNetworkServiceBrowser-Protocol.h"; sourceTree = "<group>"; };
+		DDE3C8D41BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLocalNetworkServiceBrowserNetService.h; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserNetService.h; sourceTree = SOURCE_ROOT; };
+		DDE3C8D51BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLocalNetworkServiceBrowserNetService.m; path = Sources/LocalNetworkConnectivity/VLCLocalNetworkServiceBrowserNetService.m; sourceTree = SOURCE_ROOT; };
+		DDE3C8D71BD12F6800C03B8B /* VLCLocalNetworkService-Protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "VLCLocalNetworkService-Protocol.h"; sourceTree = "<group>"; };
 		DDF157B31ACB169B00AAFBC6 /* WatchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WatchKit.framework; path = System/Library/Frameworks/WatchKit.framework; sourceTree = SDKROOT; };
 		E09EACF57CDD22ABAE66CDD0 /* Pods-vlc-ios.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-vlc-ios.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-vlc-ios/Pods-vlc-ios.distribution.xcconfig"; sourceTree = "<group>"; };
 		E0C04F931A25B4410080331A /* VLCDocumentPickerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCDocumentPickerController.h; path = Sources/VLCDocumentPickerController.h; sourceTree = SOURCE_ROOT; };
@@ -1124,8 +1129,12 @@
 				7DBB78871B3028C400894467 /* Server browsing */,
 				7D30F3D5183AB2F100FFC021 /* VLCServerListViewController.h */,
 				7D30F3D6183AB2F100FFC021 /* VLCServerListViewController.m */,
+				DDE3C8D71BD12F6800C03B8B /* VLCLocalNetworkService-Protocol.h */,
 				DDE3C8CE1BD0246500C03B8B /* VLCLocalNetworkService.h */,
 				DDE3C8CF1BD0246500C03B8B /* VLCLocalNetworkService.m */,
+				DDE3C8D11BD1103300C03B8B /* VLCLocalNetworkServiceBrowser-Protocol.h */,
+				DDE3C8D41BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.h */,
+				DDE3C8D51BD12E6B00C03B8B /* VLCLocalNetworkServiceBrowserNetService.m */,
 				7D37E3981BC93F7500AFA70E /* VLCLocalServerDiscoveryController.h */,
 				7D37E3991BC93F7500AFA70E /* VLCLocalServerDiscoveryController.m */,
 				7D30F3DA183AB2F900FFC021 /* VLCNetworkLoginViewController.h */,
@@ -2172,12 +2181,12 @@
 				7D168F7418D4A33F003FAF59 /* UIImage+Blur.m in Sources */,
 				9B5BEF2917FBAEA50016F9CB /* GTLDrive_Sources.m in Sources */,
 				7DC19ADF1868C7BB00810BF7 /* VLCFirstStepsViewController.m in Sources */,
-				DDE3C8D01BD0246500C03B8B /* VLCLocalNetworkService.m in Sources */,
 				7DE56C1A1AD93F9100E8CA00 /* VLCPlaybackController.m in Sources */,
 				7DC72D6317B7ED24008A26D0 /* WhiteRaccoon.m in Sources */,
 				DD7110F01AF38B2B00854776 /* MLMediaLibrary+playlist.m in Sources */,
 				7D5CAA891A4AD763003F2CBC /* VLCTrackSelectorTableViewCell.m in Sources */,
 				7D63C19018774B1700BD5256 /* VLCFirstStepsSecondPageViewController.m in Sources */,
+				DDE3C8DA1BD1323800C03B8B /* VLCLocalNetworkService.m in Sources */,
 				8F91EC79195CEC7900F5BCBA /* VLCOpenInActivity.m in Sources */,
 				7D37848F183A98B6009EE944 /* VLCMovieViewController.m in Sources */,
 				7D378492183A98BF009EE944 /* VLCExternalDisplayController.m in Sources */,
@@ -2190,6 +2199,7 @@
 				7D3784A1183A98EB009EE944 /* VLCBugreporter.m in Sources */,
 				7D3784A6183A98F5009EE944 /* VLCAboutViewController.m in Sources */,
 				7D3784A7183A98F5009EE944 /* VLCSettingsController.m in Sources */,
+				DDE3C8D91BD1322E00C03B8B /* VLCLocalNetworkServiceBrowserNetService.m in Sources */,
 				7DC19AE41868C8EC00810BF7 /* VLCFirstStepsFirstPageViewController.m in Sources */,
 				7D3784AD183A9906009EE944 /* VLCDropboxController.m in Sources */,
 				7D3784AE183A9906009EE944 /* VLCDropboxTableViewController.m in Sources */,