소스 검색

Implement UPNP-based listing of local servers

Felix Paul Kühne 12 년 전
부모
커밋
83d942d944

+ 27 - 0
AspenProject/VLCLocalNetworkListCell.h

@@ -0,0 +1,27 @@
+//
+//  VLCLocalNetworkListCell.h
+//  VLC for iOS
+//
+//  Created by Felix Paul Kühne on 10.08.13.
+//  Copyright (c) 2013 VideoLAN. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface VLCLocalNetworkListCell : UITableViewCell
+
+@property (nonatomic, strong) IBOutlet UILabel *titleLabel;
+@property (nonatomic, strong) IBOutlet UILabel *folderTitleLabel;
+@property (nonatomic, strong) IBOutlet UILabel *subtitleLabel;
+@property (nonatomic, strong) IBOutlet UIImageView *thumbnailView;
+
+@property (nonatomic, readwrite) BOOL isDirectory;
+@property (nonatomic, retain) NSString *title;
+@property (nonatomic, retain) NSString *subtitle;
+
++ (VLCLocalNetworkListCell *)cellWithReuseIdentifier:(NSString *)ident;
++ (CGFloat)heightOfCell;
+
+@end

+ 50 - 0
AspenProject/VLCLocalNetworkListCell.m

@@ -0,0 +1,50 @@
+//
+//  VLCLocalNetworkListCell.m
+//  VLC for iOS
+//
+//  Created by Felix Paul Kühne on 10.08.13.
+//  Copyright (c) 2013 VideoLAN. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import "VLCLocalNetworkListCell.h"
+
+@implementation VLCLocalNetworkListCell
+
++ (VLCLocalNetworkListCell *)cellWithReuseIdentifier:(NSString *)ident
+{
+    NSArray *nibContentArray = [[NSBundle mainBundle] loadNibNamed:@"VLCLocalNetworkListCell" owner:nil options:nil];
+    NSAssert([nibContentArray count] == 1, @"meh");
+    NSAssert([[nibContentArray lastObject] isKindOfClass:[VLCLocalNetworkListCell class]], @"meh meh");
+    VLCLocalNetworkListCell *cell = (VLCLocalNetworkListCell *)[nibContentArray lastObject];
+
+    return cell;
+}
+
+- (void)setTitle:(NSString *)title
+{
+    BOOL isDir = self.isDirectory;
+    if (isDir)
+        self.folderTitleLabel.text = title;
+    else
+        self.titleLabel.text = title;
+
+    self.titleLabel.hidden = self.subtitleLabel.hidden = isDir;
+    self.folderTitleLabel.hidden = !isDir;
+}
+
+- (void)setSubtitle:(NSString *)subtitle
+{
+    self.subtitleLabel.text = subtitle;
+}
+
++ (CGFloat)heightOfCell
+{
+    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
+        return 80.;
+
+    return 48.;
+}
+
+@end

+ 17 - 0
AspenProject/VLCLocalServerListViewController.h

@@ -0,0 +1,17 @@
+//
+//  VLCLocalServerListViewController.h
+//  VLC for iOS
+//
+//  Created by Felix Paul Kühne on 10.08.13.
+//  Copyright (c) 2013 VideoLAN. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface VLCLocalServerListViewController : UIViewController
+
+@property (nonatomic, strong) UITableView *tableView;
+
+@end

+ 141 - 0
AspenProject/VLCLocalServerListViewController.m

@@ -0,0 +1,141 @@
+//
+//  VLCLocalServerListViewController.m
+//  VLC for iOS
+//
+//  Created by Felix Paul Kühne on 10.08.13.
+//  Copyright (c) 2013 VideoLAN. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import "VLCLocalServerListViewController.h"
+#import "UIBarButtonItem+Theme.h"
+#import "VLCAppDelegate.h"
+#import "UPnPManager.h"
+#import "VLCLocalNetworkListCell.h"
+
+@interface VLCLocalServerListViewController () <UITableViewDataSource, UITableViewDelegate>
+{
+    UIBarButtonItem *_backButton;
+    UIBarButtonItem *_backToMenuButton;
+    UILabel *_titleLabel;
+    NSArray *_devices;
+}
+
+@end
+
+@implementation VLCLocalServerListViewController
+
+- (void)loadView
+{
+    _tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
+    _tableView.backgroundColor = [UIColor colorWithWhite:.122 alpha:1.];
+    _tableView.delegate = self;
+    _tableView.dataSource = self;
+    self.view = _tableView;
+}
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+
+    UPnPDB* db = [[UPnPManager GetInstance] DB];
+
+    _devices = [db rootDevices]; //BasicUPnPDevice
+
+    [db addObserver:(UPnPDBObserver*)self];
+
+    //Optional; set User Agent
+    [[[UPnPManager GetInstance] SSDP] setUserAgentProduct:[NSString stringWithFormat:@"VLC for iOS/%@", [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]] andOS:@"iOS"];
+
+    //Search for UPnP Devices
+    [[[UPnPManager GetInstance] SSDP] searchSSDP];
+
+    _backButton = [UIBarButtonItem themedBackButtonWithTarget:self andSelector:@selector(goBack:)];
+    _backToMenuButton = [UIBarButtonItem themedRevealMenuButtonWithTarget:self andSelector:@selector(goBack:)];
+    self.navigationItem.leftBarButtonItem = _backToMenuButton;
+
+    self.tableView.separatorColor = [UIColor colorWithWhite:.122 alpha:1.];
+    self.view.backgroundColor = [UIColor colorWithWhite:.122 alpha:1.];
+
+    _titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0 , 11.0f, self.navigationController.view.frame.size.width, 21.0f)];
+    [_titleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:18]];
+    [_titleLabel setBackgroundColor:[UIColor clearColor]];
+    [_titleLabel setTextColor:[UIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:1.0]];
+    [_titleLabel setText:@"Local Servers"];
+    [_titleLabel setTextAlignment:UITextAlignmentCenter];
+
+    self.navigationItem.titleView = _titleLabel;
+}
+
+- (IBAction)goBack:(id)sender
+{
+    [[(VLCAppDelegate*)[UIApplication sharedApplication].delegate revealController] toggleSidebar:![(VLCAppDelegate*)[UIApplication sharedApplication].delegate revealController].sidebarShowing duration:kGHRevealSidebarDefaultAnimationDuration];
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
+{
+    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
+        return NO;
+    return YES;
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
+{
+    return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+    return _devices.count;
+}
+
+- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    cell.backgroundColor = (indexPath.row % 2 == 0)? [UIColor blackColor]: [UIColor colorWithWhite:.122 alpha:1.];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    static NSString *CellIdentifier = @"LocalNetworkCell";
+
+    VLCLocalNetworkListCell *cell = (VLCLocalNetworkListCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+    if (cell == nil)
+        cell = [VLCLocalNetworkListCell cellWithReuseIdentifier:CellIdentifier];
+
+    BasicUPnPDevice *device = _devices[indexPath.row];
+    [cell setTitle:[device friendlyName]];
+
+    if([[device urn] isEqualToString:@"urn:schemas-upnp-org:device:MediaServer:1"])
+        [cell setIsDirectory:YES];
+
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    /*
+    BasicUPnPDevice *device = _devices[indexPath.row];
+    if([[device urn] isEqualToString:@"urn:schemas-upnp-org:device:MediaServer:1"]){
+        MediaServer1Device *server = (MediaServer1Device*)device;
+        FolderViewController *targetViewController = [[FolderViewController alloc] initWithMediaDevice:server andHeader:@"root" andRootId:@"0"];
+        [[self navigationController] pushViewController:targetViewController animated:YES];
+        [[PlayBack GetInstance] setServer:server];
+    }else if([[device urn] isEqualToString:@"urn:schemas-upnp-org:device:MediaRenderer:1"]){
+        [self.titleLabel setText:[device friendlyName]];
+        MediaRenderer1Device *render = (MediaRenderer1Device*)device;
+        [[PlayBack GetInstance] setRenderer:render];
+    }*/
+}
+
+//protocol UPnPDBObserver
+-(void)UPnPDBWillUpdate:(UPnPDB*)sender{
+    APLog(@"UPnPDBWillUpdate %d", _devices.count);
+}
+
+-(void)UPnPDBUpdated:(UPnPDB*)sender{
+    APLog(@"UPnPDBUpdated %d", _devices.count);
+    [self.tableView performSelectorOnMainThread : @ selector(reloadData) withObject:nil waitUntilDone:YES];
+}
+
+@end

+ 2 - 0
AspenProject/VLCMenuViewController.h

@@ -19,6 +19,7 @@
 @property (strong, nonatomic) VLCSettingsController *settingsController;
 
 @property (strong, nonatomic) IBOutlet UIButton *allFilesButton;
+@property (strong, nonatomic) IBOutlet UIButton *localNetworkButton;
 @property (strong, nonatomic) IBOutlet UIButton *aboutButton;
 @property (strong, nonatomic) IBOutlet UIButton *openNetworkStreamButton;
 @property (strong, nonatomic) IBOutlet UIButton *downloadFromHTTPServerButton;
@@ -29,6 +30,7 @@
 @property (strong, nonatomic) IBOutlet UIButton *dropboxButton;
 
 - (IBAction)showAllFiles:(id)sender;
+- (IBAction)showLocalNetwork:(id)sender;
 - (IBAction)openAboutPanel:(id)sender;
 - (IBAction)openNetworkStream:(id)sender;
 - (IBAction)downloadFromHTTPServer:(id)sender;

+ 7 - 0
AspenProject/VLCMenuViewController.m

@@ -24,6 +24,7 @@
 #import "VLCOpenNetworkStreamViewController.h"
 #import "VLCHTTPDownloadViewController.h"
 #import "VLCBugreporter.h"
+#import "VLCLocalServerListViewController.h"
 
 @interface VLCMenuViewController () {
     VLCHTTPDownloadViewController *_downloadViewController;
@@ -94,6 +95,12 @@
     [self _presentViewController:[(VLCAppDelegate*)[UIApplication sharedApplication].delegate playlistViewController]];
 }
 
+- (IBAction)showLocalNetwork:(id)sender
+{
+    UIViewController *localNetworkController = [[VLCLocalServerListViewController alloc] init];
+    [self _presentViewController:localNetworkController];
+}
+
 - (IBAction)openAboutPanel:(id)sender
 {
     UIViewController *aboutController = [[VLCAboutViewController alloc] initWithNibName:nil bundle:nil];

+ 2 - 0
NEWS

@@ -3,7 +3,9 @@
 * Improved overall stability (#8989, #9031, #9089, #9092)
 * Add support for subtitles in non-western languages (#8991)
 * Improved Subtitles support with options to choose font, size, and color
+* Add UPNP discovery and streaming (#8880)
 * Add Bonjour announcement for the WiFi Uploader's website (#8741)
+* Redesigned menu and application flow (#9045)
 * Add Deinterlace option (off by default, #8813)
 * Device no longer goes to sleep during media downloads (#9062)
 * Improved video output on external screens (#9079)

+ 323 - 0
Resources/VLCLocalNetworkListCell~ipad.xib

@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+	<data>
+		<int key="IBDocument.SystemTarget">1296</int>
+		<string key="IBDocument.SystemVersion">12F33</string>
+		<string key="IBDocument.InterfaceBuilderVersion">3084</string>
+		<string key="IBDocument.AppKitVersion">1187.39</string>
+		<string key="IBDocument.HIToolboxVersion">626.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+			<string key="NS.object.0">2083</string>
+		</object>
+		<array key="IBDocument.IntegratedClassDependencies">
+			<string>IBProxyObject</string>
+			<string>IBUIImageView</string>
+			<string>IBUILabel</string>
+			<string>IBUITableViewCell</string>
+		</array>
+		<array key="IBDocument.PluginDependencies">
+			<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+		</array>
+		<object class="NSMutableDictionary" key="IBDocument.Metadata">
+			<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+			<integer value="1" key="NS.object.0"/>
+		</object>
+		<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+			<object class="IBProxyObject" id="372490531">
+				<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+			</object>
+			<object class="IBProxyObject" id="975951072">
+				<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+			</object>
+			<object class="IBUITableViewCell" id="962619467">
+				<reference key="NSNextResponder"/>
+				<int key="NSvFlags">292</int>
+				<array class="NSMutableArray" key="NSSubviews">
+					<object class="IBUIView" id="162418872">
+						<reference key="NSNextResponder" ref="962619467"/>
+						<int key="NSvFlags">256</int>
+						<array class="NSMutableArray" key="NSSubviews">
+							<object class="IBUIImageView" id="784253519">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">292</int>
+								<string key="NSFrame">{{5, 8}, {64, 64}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView" ref="207506414"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+							</object>
+							<object class="IBUILabel" id="207506414">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">290</int>
+								<string key="NSFrame">{{83, 21}, {232, 21}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView" ref="1019407525"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<bool key="IBUIClipsSubviews">YES</bool>
+								<int key="IBUIContentMode">7</int>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+								<string key="IBUIText">File Title</string>
+								<object class="NSColor" key="IBUITextColor" id="176165725">
+									<int key="NSColorSpace">3</int>
+									<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+								</object>
+								<object class="NSColor" key="IBUIHighlightedColor" id="654385816">
+									<int key="NSColorSpace">3</int>
+									<bytes key="NSWhite">MQA</bytes>
+								</object>
+								<int key="IBUILineBreakMode">0</int>
+								<object class="IBUIFontDescription" key="IBUIFontDescription" id="123705061">
+									<int key="type">1</int>
+									<double key="pointSize">17</double>
+								</object>
+								<object class="NSFont" key="IBUIFont" id="458645332">
+									<string key="NSName">Helvetica</string>
+									<double key="NSSize">17</double>
+									<int key="NSfFlags">16</int>
+								</object>
+								<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+							</object>
+							<object class="IBUILabel" id="1019407525">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">290</int>
+								<string key="NSFrame">{{83, 29}, {232, 21}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView" ref="625431089"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<bool key="IBUIClipsSubviews">YES</bool>
+								<int key="IBUIContentMode">7</int>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+								<string key="IBUIText">Folder Title</string>
+								<reference key="IBUITextColor" ref="176165725"/>
+								<reference key="IBUIHighlightedColor" ref="654385816"/>
+								<int key="IBUILineBreakMode">0</int>
+								<reference key="IBUIFontDescription" ref="123705061"/>
+								<reference key="IBUIFont" ref="458645332"/>
+								<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+							</object>
+							<object class="IBUILabel" id="625431089">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">290</int>
+								<string key="NSFrame">{{83, 44}, {232, 15}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<bool key="IBUIClipsSubviews">YES</bool>
+								<int key="IBUIContentMode">7</int>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+								<string key="IBUIText">Subtitle — Subtitle</string>
+								<object class="NSColor" key="IBUITextColor">
+									<int key="NSColorSpace">3</int>
+									<bytes key="NSWhite">MC4zMzMzMzMzMzMzAA</bytes>
+								</object>
+								<reference key="IBUIHighlightedColor" ref="654385816"/>
+								<int key="IBUIBaselineAdjustment">0</int>
+								<int key="IBUILineBreakMode">0</int>
+								<object class="IBUIFontDescription" key="IBUIFontDescription">
+									<int key="type">1</int>
+									<double key="pointSize">12</double>
+								</object>
+								<object class="NSFont" key="IBUIFont">
+									<string key="NSName">Helvetica</string>
+									<double key="NSSize">12</double>
+									<int key="NSfFlags">16</int>
+								</object>
+								<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+							</object>
+						</array>
+						<string key="NSFrameSize">{320, 79}</string>
+						<reference key="NSSuperview" ref="962619467"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="784253519"/>
+						<string key="NSReuseIdentifierKey">_NS:11</string>
+						<object class="NSColor" key="IBUIBackgroundColor">
+							<int key="NSColorSpace">3</int>
+							<bytes key="NSWhite">MCAwAA</bytes>
+						</object>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">4</int>
+						<bool key="IBUIMultipleTouchEnabled">YES</bool>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+					</object>
+				</array>
+				<string key="NSFrameSize">{320, 80}</string>
+				<reference key="NSSuperview"/>
+				<reference key="NSWindow"/>
+				<reference key="NSNextKeyView" ref="162418872"/>
+				<string key="NSReuseIdentifierKey">_NS:9</string>
+				<object class="NSColor" key="IBUIBackgroundColor">
+					<int key="NSColorSpace">3</int>
+					<bytes key="NSWhite">MAA</bytes>
+				</object>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+				<reference key="IBUIContentView" ref="162418872"/>
+				<string key="IBUIReuseIdentifier">LocalNetworkCell</string>
+				<real value="76" key="IBUIRowHeight"/>
+			</object>
+		</array>
+		<object class="IBObjectContainer" key="IBDocument.Objects">
+			<array class="NSMutableArray" key="connectionRecords">
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">subtitleLabel</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="625431089"/>
+					</object>
+					<int key="connectionID">8</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">thumbnailView</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="784253519"/>
+					</object>
+					<int key="connectionID">9</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">titleLabel</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="207506414"/>
+					</object>
+					<int key="connectionID">10</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">folderTitleLabel</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="1019407525"/>
+					</object>
+					<int key="connectionID">24</int>
+				</object>
+			</array>
+			<object class="IBMutableOrderedSet" key="objectRecords">
+				<array key="orderedObjects">
+					<object class="IBObjectRecord">
+						<int key="objectID">0</int>
+						<array key="object" id="0"/>
+						<reference key="children" ref="1000"/>
+						<nil key="parent"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-1</int>
+						<reference key="object" ref="372490531"/>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-2</int>
+						<reference key="object" ref="975951072"/>
+						<reference key="parent" ref="0"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">3</int>
+						<reference key="object" ref="962619467"/>
+						<array class="NSMutableArray" key="children">
+							<reference ref="784253519"/>
+							<reference ref="207506414"/>
+							<reference ref="625431089"/>
+							<reference ref="1019407525"/>
+						</array>
+						<reference key="parent" ref="0"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">4</int>
+						<reference key="object" ref="784253519"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">6</int>
+						<reference key="object" ref="207506414"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">7</int>
+						<reference key="object" ref="625431089"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">23</int>
+						<reference key="object" ref="1019407525"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+				</array>
+			</object>
+			<dictionary class="NSMutableDictionary" key="flattenedProperties">
+				<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="-2.CustomClassName">UIResponder</string>
+				<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="23.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="3.CustomClassName">VLCLocalNetworkListCell</string>
+				<string key="3.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="4.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="7.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+			</dictionary>
+			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+			<nil key="activeLocalization"/>
+			<dictionary class="NSMutableDictionary" key="localizations"/>
+			<nil key="sourceID"/>
+			<int key="maxID">24</int>
+		</object>
+		<object class="IBClassDescriber" key="IBDocument.Classes">
+			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
+				<object class="IBPartialClassDescription">
+					<string key="className">VLCLocalNetworkListCell</string>
+					<string key="superclassName">UITableViewCell</string>
+					<dictionary class="NSMutableDictionary" key="outlets">
+						<string key="folderTitleLabel">UILabel</string>
+						<string key="subtitleLabel">UILabel</string>
+						<string key="thumbnailView">UIImageView</string>
+						<string key="titleLabel">UILabel</string>
+					</dictionary>
+					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<object class="IBToOneOutletInfo" key="folderTitleLabel">
+							<string key="name">folderTitleLabel</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="subtitleLabel">
+							<string key="name">subtitleLabel</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="thumbnailView">
+							<string key="name">thumbnailView</string>
+							<string key="candidateClassName">UIImageView</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="titleLabel">
+							<string key="name">titleLabel</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+					</dictionary>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/VLCLocalNetworkListCell.h</string>
+					</object>
+				</object>
+			</array>
+		</object>
+		<int key="IBDocument.localizationMode">0</int>
+		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
+			<real value="1296" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
+		<string key="IBCocoaTouchPluginVersion">2083</string>
+	</data>
+</archive>

+ 323 - 0
Resources/VLCLocalNetworkListCell~iphone.xib

@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+	<data>
+		<int key="IBDocument.SystemTarget">1296</int>
+		<string key="IBDocument.SystemVersion">12F33</string>
+		<string key="IBDocument.InterfaceBuilderVersion">3084</string>
+		<string key="IBDocument.AppKitVersion">1187.39</string>
+		<string key="IBDocument.HIToolboxVersion">626.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+			<string key="NS.object.0">2083</string>
+		</object>
+		<array key="IBDocument.IntegratedClassDependencies">
+			<string>IBProxyObject</string>
+			<string>IBUIImageView</string>
+			<string>IBUILabel</string>
+			<string>IBUITableViewCell</string>
+		</array>
+		<array key="IBDocument.PluginDependencies">
+			<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+		</array>
+		<object class="NSMutableDictionary" key="IBDocument.Metadata">
+			<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+			<integer value="1" key="NS.object.0"/>
+		</object>
+		<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+			<object class="IBProxyObject" id="372490531">
+				<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+			</object>
+			<object class="IBProxyObject" id="975951072">
+				<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+			</object>
+			<object class="IBUITableViewCell" id="962619467">
+				<reference key="NSNextResponder"/>
+				<int key="NSvFlags">292</int>
+				<array class="NSMutableArray" key="NSSubviews">
+					<object class="IBUIView" id="162418872">
+						<reference key="NSNextResponder" ref="962619467"/>
+						<int key="NSvFlags">256</int>
+						<array class="NSMutableArray" key="NSSubviews">
+							<object class="IBUIImageView" id="784253519">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">292</int>
+								<string key="NSFrame">{{5, 8}, {32, 32}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView" ref="207506414"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+							</object>
+							<object class="IBUILabel" id="207506414">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">290</int>
+								<string key="NSFrame">{{45, 8}, {270, 18}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView" ref="816829197"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<bool key="IBUIClipsSubviews">YES</bool>
+								<int key="IBUIContentMode">7</int>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+								<string key="IBUIText">File Title</string>
+								<object class="NSColor" key="IBUITextColor" id="77889393">
+									<int key="NSColorSpace">3</int>
+									<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+								</object>
+								<object class="NSColor" key="IBUIHighlightedColor" id="654385816">
+									<int key="NSColorSpace">3</int>
+									<bytes key="NSWhite">MQA</bytes>
+								</object>
+								<int key="IBUILineBreakMode">0</int>
+								<object class="IBUIFontDescription" key="IBUIFontDescription" id="868609050">
+									<int key="type">1</int>
+									<double key="pointSize">14</double>
+								</object>
+								<object class="NSFont" key="IBUIFont" id="7653884">
+									<string key="NSName">Helvetica</string>
+									<double key="NSSize">14</double>
+									<int key="NSfFlags">16</int>
+								</object>
+								<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+							</object>
+							<object class="IBUILabel" id="816829197">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">290</int>
+								<string key="NSFrame">{{45, 15}, {270, 18}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView" ref="625431089"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<bool key="IBUIClipsSubviews">YES</bool>
+								<int key="IBUIContentMode">7</int>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+								<string key="IBUIText">Folder Title</string>
+								<reference key="IBUITextColor" ref="77889393"/>
+								<reference key="IBUIHighlightedColor" ref="654385816"/>
+								<int key="IBUILineBreakMode">0</int>
+								<reference key="IBUIFontDescription" ref="868609050"/>
+								<reference key="IBUIFont" ref="7653884"/>
+								<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+							</object>
+							<object class="IBUILabel" id="625431089">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">266</int>
+								<string key="NSFrame">{{45, 25}, {270, 15}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<bool key="IBUIClipsSubviews">YES</bool>
+								<int key="IBUIContentMode">7</int>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+								<string key="IBUIText">Subtitle — Subtitle</string>
+								<object class="NSColor" key="IBUITextColor">
+									<int key="NSColorSpace">3</int>
+									<bytes key="NSWhite">MC4zMzMzMzMzMzMzAA</bytes>
+								</object>
+								<reference key="IBUIHighlightedColor" ref="654385816"/>
+								<int key="IBUIBaselineAdjustment">0</int>
+								<int key="IBUILineBreakMode">0</int>
+								<object class="IBUIFontDescription" key="IBUIFontDescription">
+									<int key="type">1</int>
+									<double key="pointSize">12</double>
+								</object>
+								<object class="NSFont" key="IBUIFont">
+									<string key="NSName">Helvetica</string>
+									<double key="NSSize">12</double>
+									<int key="NSfFlags">16</int>
+								</object>
+								<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+							</object>
+						</array>
+						<string key="NSFrameSize">{320, 47}</string>
+						<reference key="NSSuperview" ref="962619467"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="784253519"/>
+						<string key="NSReuseIdentifierKey">_NS:11</string>
+						<object class="NSColor" key="IBUIBackgroundColor">
+							<int key="NSColorSpace">3</int>
+							<bytes key="NSWhite">MCAwAA</bytes>
+						</object>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">4</int>
+						<bool key="IBUIMultipleTouchEnabled">YES</bool>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+					</object>
+				</array>
+				<string key="NSFrameSize">{320, 48}</string>
+				<reference key="NSSuperview"/>
+				<reference key="NSWindow"/>
+				<reference key="NSNextKeyView" ref="162418872"/>
+				<string key="NSReuseIdentifierKey">_NS:9</string>
+				<object class="NSColor" key="IBUIBackgroundColor">
+					<int key="NSColorSpace">3</int>
+					<bytes key="NSWhite">MAA</bytes>
+				</object>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+				<reference key="IBUIContentView" ref="162418872"/>
+				<string key="IBUIReuseIdentifier">LocalNetworkCell</string>
+				<real value="44" key="IBUIRowHeight"/>
+			</object>
+		</array>
+		<object class="IBObjectContainer" key="IBDocument.Objects">
+			<array class="NSMutableArray" key="connectionRecords">
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">subtitleLabel</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="625431089"/>
+					</object>
+					<int key="connectionID">8</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">thumbnailView</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="784253519"/>
+					</object>
+					<int key="connectionID">9</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">titleLabel</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="207506414"/>
+					</object>
+					<int key="connectionID">10</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">folderTitleLabel</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="816829197"/>
+					</object>
+					<int key="connectionID">24</int>
+				</object>
+			</array>
+			<object class="IBMutableOrderedSet" key="objectRecords">
+				<array key="orderedObjects">
+					<object class="IBObjectRecord">
+						<int key="objectID">0</int>
+						<array key="object" id="0"/>
+						<reference key="children" ref="1000"/>
+						<nil key="parent"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-1</int>
+						<reference key="object" ref="372490531"/>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-2</int>
+						<reference key="object" ref="975951072"/>
+						<reference key="parent" ref="0"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">3</int>
+						<reference key="object" ref="962619467"/>
+						<array class="NSMutableArray" key="children">
+							<reference ref="207506414"/>
+							<reference ref="784253519"/>
+							<reference ref="625431089"/>
+							<reference ref="816829197"/>
+						</array>
+						<reference key="parent" ref="0"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">4</int>
+						<reference key="object" ref="784253519"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">6</int>
+						<reference key="object" ref="207506414"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">7</int>
+						<reference key="object" ref="625431089"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">23</int>
+						<reference key="object" ref="816829197"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+				</array>
+			</object>
+			<dictionary class="NSMutableDictionary" key="flattenedProperties">
+				<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="-2.CustomClassName">UIResponder</string>
+				<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="23.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="3.CustomClassName">VLCLocalNetworkListCell</string>
+				<string key="3.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="4.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="7.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+			</dictionary>
+			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+			<nil key="activeLocalization"/>
+			<dictionary class="NSMutableDictionary" key="localizations"/>
+			<nil key="sourceID"/>
+			<int key="maxID">24</int>
+		</object>
+		<object class="IBClassDescriber" key="IBDocument.Classes">
+			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
+				<object class="IBPartialClassDescription">
+					<string key="className">VLCLocalNetworkListCell</string>
+					<string key="superclassName">UITableViewCell</string>
+					<dictionary class="NSMutableDictionary" key="outlets">
+						<string key="folderTitleLabel">UILabel</string>
+						<string key="subtitleLabel">UILabel</string>
+						<string key="thumbnailView">UIImageView</string>
+						<string key="titleLabel">UILabel</string>
+					</dictionary>
+					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<object class="IBToOneOutletInfo" key="folderTitleLabel">
+							<string key="name">folderTitleLabel</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="subtitleLabel">
+							<string key="name">subtitleLabel</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="thumbnailView">
+							<string key="name">thumbnailView</string>
+							<string key="candidateClassName">UIImageView</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="titleLabel">
+							<string key="name">titleLabel</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+					</dictionary>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/VLCLocalNetworkListCell.h</string>
+					</object>
+				</object>
+			</array>
+		</object>
+		<int key="IBDocument.localizationMode">0</int>
+		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
+			<real value="1296" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
+		<string key="IBCocoaTouchPluginVersion">2083</string>
+	</data>
+</archive>

+ 57 - 10
Resources/VLCMenuViewController.xib

@@ -42,7 +42,7 @@
 					<object class="IBUIButton" id="233942944">
 						<reference key="NSNextResponder" ref="322809953"/>
 						<int key="NSvFlags">290</int>
-						<string key="NSFrame">{{0, 64}, {260, 60}}</string>
+						<string key="NSFrame">{{0, 128}, {260, 60}}</string>
 						<reference key="NSSuperview" ref="322809953"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="306241553"/>
@@ -79,10 +79,31 @@
 							<int key="NSfFlags">16</int>
 						</object>
 					</object>
+					<object class="IBUIButton" id="270820867">
+						<reference key="NSNextResponder" ref="322809953"/>
+						<int key="NSvFlags">290</int>
+						<string key="NSFrame">{{-30, 64}, {320, 60}}</string>
+						<reference key="NSSuperview" ref="322809953"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="233942944"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<reference key="IBUIBackgroundColor" ref="937037271"/>
+						<bool key="IBUIOpaque">NO</bool>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<int key="IBUIContentHorizontalAlignment">0</int>
+						<int key="IBUIContentVerticalAlignment">0</int>
+						<string key="IBUINormalTitle">Local Network</string>
+						<reference key="IBUIHighlightedTitleColor" ref="878206399"/>
+						<reference key="IBUINormalTitleColor" ref="937037271"/>
+						<reference key="IBUINormalTitleShadowColor" ref="1025413593"/>
+						<reference key="IBUINormalBackgroundImage" ref="181125913"/>
+						<reference key="IBUIFontDescription" ref="886215057"/>
+						<reference key="IBUIFont" ref="388488631"/>
+					</object>
 					<object class="IBUIButton" id="306241553">
 						<reference key="NSNextResponder" ref="322809953"/>
 						<int key="NSvFlags">290</int>
-						<string key="NSFrame">{{0, 128}, {260, 60}}</string>
+						<string key="NSFrame">{{0, 192}, {260, 60}}</string>
 						<reference key="NSSuperview" ref="322809953"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="136452396"/>
@@ -103,7 +124,7 @@
 					<object class="IBUIButton" id="665933893">
 						<reference key="NSNextResponder" ref="322809953"/>
 						<int key="NSvFlags">290</int>
-						<string key="NSFrame">{{0, 323}, {260, 60}}</string>
+						<string key="NSFrame">{{0, 387}, {260, 60}}</string>
 						<reference key="NSSuperview" ref="322809953"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="1021636329"/>
@@ -124,7 +145,7 @@
 					<object class="IBUIButton" id="1021636329">
 						<reference key="NSNextResponder" ref="322809953"/>
 						<int key="NSvFlags">290</int>
-						<string key="NSFrame">{{0, 387}, {260, 60}}</string>
+						<string key="NSFrame">{{0, 451}, {260, 60}}</string>
 						<reference key="NSSuperview" ref="322809953"/>
 						<reference key="NSWindow"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
@@ -144,7 +165,7 @@
 					<object class="IBUIButton" id="502729697">
 						<reference key="NSNextResponder" ref="322809953"/>
 						<int key="NSvFlags">290</int>
-						<string key="NSFrame">{{0, 259}, {260, 60}}</string>
+						<string key="NSFrame">{{0, 323}, {260, 60}}</string>
 						<reference key="NSSuperview" ref="322809953"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="665933893"/>
@@ -253,7 +274,7 @@
 								<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
 							</object>
 						</array>
-						<string key="NSFrame">{{0, 192}, {260, 63}}</string>
+						<string key="NSFrame">{{0, 256}, {260, 63}}</string>
 						<reference key="NSSuperview" ref="322809953"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="643865985"/>
@@ -267,7 +288,7 @@
 						<string key="NSFrameSize">{260, 60}</string>
 						<reference key="NSSuperview" ref="322809953"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView" ref="233942944"/>
+						<reference key="NSNextKeyView" ref="270820867"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<reference key="IBUIBackgroundColor" ref="937037271"/>
 						<bool key="IBUIOpaque">NO</bool>
@@ -283,7 +304,7 @@
 						<reference key="IBUIFont" ref="388488631"/>
 					</object>
 				</array>
-				<string key="NSFrameSize">{260, 447}</string>
+				<string key="NSFrameSize">{260, 511}</string>
 				<reference key="NSSuperview"/>
 				<reference key="NSWindow"/>
 				<reference key="NSNextKeyView" ref="197466448"/>
@@ -439,6 +460,15 @@
 					</object>
 					<int key="connectionID">86</int>
 				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchEventConnection" key="connection">
+						<string key="label">showLocalNetwork:</string>
+						<reference key="source" ref="270820867"/>
+						<reference key="destination" ref="372490531"/>
+						<int key="IBEventType">7</int>
+					</object>
+					<int key="connectionID">89</int>
+				</object>
 			</array>
 			<object class="IBMutableOrderedSet" key="objectRecords">
 				<array key="orderedObjects">
@@ -463,13 +493,14 @@
 						<int key="objectID">79</int>
 						<reference key="object" ref="322809953"/>
 						<array class="NSMutableArray" key="children">
+							<reference ref="197466448"/>
+							<reference ref="270820867"/>
 							<reference ref="233942944"/>
 							<reference ref="306241553"/>
 							<reference ref="665933893"/>
 							<reference ref="1021636329"/>
 							<reference ref="502729697"/>
 							<reference ref="136452396"/>
-							<reference ref="197466448"/>
 						</array>
 						<reference key="parent" ref="0"/>
 					</object>
@@ -534,6 +565,11 @@
 						<reference key="object" ref="197466448"/>
 						<reference key="parent" ref="322809953"/>
 					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">87</int>
+						<reference key="object" ref="270820867"/>
+						<reference key="parent" ref="322809953"/>
+					</object>
 				</array>
 			</object>
 			<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -553,12 +589,13 @@
 				<string key="77.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="79.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="84.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="87.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 			</dictionary>
 			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
 			<nil key="activeLocalization"/>
 			<dictionary class="NSMutableDictionary" key="localizations"/>
 			<nil key="sourceID"/>
-			<int key="maxID">86</int>
+			<int key="maxID">89</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -571,6 +608,7 @@
 						<string key="openNetworkStream:">id</string>
 						<string key="showAllFiles:">id</string>
 						<string key="showDropbox:">id</string>
+						<string key="showLocalNetwork:">id</string>
 						<string key="showSettings:">id</string>
 						<string key="toggleHTTPServer:">id</string>
 					</dictionary>
@@ -595,6 +633,10 @@
 							<string key="name">showDropbox:</string>
 							<string key="candidateClassName">id</string>
 						</object>
+						<object class="IBActionInfo" key="showLocalNetwork:">
+							<string key="name">showLocalNetwork:</string>
+							<string key="candidateClassName">id</string>
+						</object>
 						<object class="IBActionInfo" key="showSettings:">
 							<string key="name">showSettings:</string>
 							<string key="candidateClassName">id</string>
@@ -612,6 +654,7 @@
 						<string key="httpUploadLabel">UILabel</string>
 						<string key="httpUploadServerLocationLabel">UILabel</string>
 						<string key="httpUploadServerSwitch">UISwitch</string>
+						<string key="localNetworkButton">UIButton</string>
 						<string key="openNetworkStreamButton">UIButton</string>
 						<string key="settingsButton">UIButton</string>
 					</dictionary>
@@ -644,6 +687,10 @@
 							<string key="name">httpUploadServerSwitch</string>
 							<string key="candidateClassName">UISwitch</string>
 						</object>
+						<object class="IBToOneOutletInfo" key="localNetworkButton">
+							<string key="name">localNetworkButton</string>
+							<string key="candidateClassName">UIButton</string>
+						</object>
 						<object class="IBToOneOutletInfo" key="openNetworkStreamButton">
 							<string key="name">openNetworkStreamButton</string>
 							<string key="candidateClassName">UIButton</string>

+ 41 - 0
VLC for iOS.xcodeproj/project.pbxproj

@@ -78,6 +78,7 @@
 		7D2339AF176DE72E008D223C /* VLCOpenNetworkStreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D2339AD176DE72E008D223C /* VLCOpenNetworkStreamViewController.m */; };
 		7D2339B0176DE72E008D223C /* VLCOpenNetworkStreamViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D2339AE176DE72E008D223C /* VLCOpenNetworkStreamViewController.xib */; };
 		7D31001D17B64AE100E6516D /* GHRevealViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D31001C17B64AE100E6516D /* GHRevealViewController.m */; };
+		7D31002017B6768B00E6516D /* libupnpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D31001F17B6768B00E6516D /* libupnpx.a */; };
 		7D31CF091746AF09005997E0 /* VLCStatusLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D31CF081746AF09005997E0 /* VLCStatusLabel.m */; };
 		7D33D41617182615008AF0E0 /* VLCMovieViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D33D41517182615008AF0E0 /* VLCMovieViewController~ipad.xib */; };
 		7D3EB012174A3530002062C2 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D3EB011174A3530002062C2 /* Reachability.m */; };
@@ -171,6 +172,10 @@
 		7D6BD1851762026700AD311A /* thumbOverlay@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7D6BD1811762026700AD311A /* thumbOverlay@2x.png */; };
 		7D6BD1861762026700AD311A /* thumbOverlayPhone.png in Resources */ = {isa = PBXBuildFile; fileRef = 7D6BD1821762026700AD311A /* thumbOverlayPhone.png */; };
 		7D6BD1871762026700AD311A /* thumbOverlay.png in Resources */ = {isa = PBXBuildFile; fileRef = 7D6BD1831762026700AD311A /* thumbOverlay.png */; };
+		7D93044117B67C4F0054EAC6 /* VLCLocalServerListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D93043F17B67C4F0054EAC6 /* VLCLocalServerListViewController.m */; };
+		7D93044517B684CF0054EAC6 /* VLCLocalNetworkListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D93044417B684CF0054EAC6 /* VLCLocalNetworkListCell.m */; };
+		7D93044817B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D93044617B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib */; };
+		7D93044917B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D93044717B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib */; };
 		7D94FCDF16DE7D1000F2623B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D94FCDE16DE7D1000F2623B /* UIKit.framework */; };
 		7D94FCE116DE7D1000F2623B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D94FCE016DE7D1000F2623B /* Foundation.framework */; };
 		7D94FCE316DE7D1000F2623B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D94FCE216DE7D1000F2623B /* CoreGraphics.framework */; };
@@ -407,6 +412,7 @@
 		7D2339AE176DE72E008D223C /* VLCOpenNetworkStreamViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCOpenNetworkStreamViewController.xib; path = ../Resources/VLCOpenNetworkStreamViewController.xib; sourceTree = "<group>"; };
 		7D31001B17B64AE100E6516D /* GHRevealViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHRevealViewController.h; path = ImportedSources/GHSidebarNav/GHSidebarNav/GHRevealViewController.h; sourceTree = SOURCE_ROOT; };
 		7D31001C17B64AE100E6516D /* GHRevealViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHRevealViewController.m; path = ImportedSources/GHSidebarNav/GHSidebarNav/GHRevealViewController.m; sourceTree = SOURCE_ROOT; };
+		7D31001F17B6768B00E6516D /* libupnpx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libupnpx.a; path = External/upnpx/libupnpx.a; sourceTree = "<group>"; };
 		7D31CF071746AF09005997E0 /* VLCStatusLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCStatusLabel.h; sourceTree = "<group>"; };
 		7D31CF081746AF09005997E0 /* VLCStatusLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCStatusLabel.m; sourceTree = "<group>"; };
 		7D33D41517182615008AF0E0 /* VLCMovieViewController~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "VLCMovieViewController~ipad.xib"; path = "Resources/VLCMovieViewController~ipad.xib"; sourceTree = SOURCE_ROOT; };
@@ -561,6 +567,12 @@
 		7D7DA5311768A53200C7E95D /* id */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = id; path = "id.lproj/badgeUnread@2x~iphone.png"; sourceTree = "<group>"; };
 		7D7DA5321768A53200C7E95D /* id */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = id; path = "id.lproj/badgeUnread~ipad.png"; sourceTree = "<group>"; };
 		7D7DA5331768A53200C7E95D /* id */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = id; path = "id.lproj/badgeUnread~iphone.png"; sourceTree = "<group>"; };
+		7D93043E17B67C4F0054EAC6 /* VLCLocalServerListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLocalServerListViewController.h; sourceTree = "<group>"; };
+		7D93043F17B67C4F0054EAC6 /* VLCLocalServerListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalServerListViewController.m; sourceTree = "<group>"; };
+		7D93044317B684CE0054EAC6 /* VLCLocalNetworkListCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLocalNetworkListCell.h; sourceTree = "<group>"; };
+		7D93044417B684CF0054EAC6 /* VLCLocalNetworkListCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalNetworkListCell.m; sourceTree = "<group>"; };
+		7D93044617B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "VLCLocalNetworkListCell~ipad.xib"; path = "../Resources/VLCLocalNetworkListCell~ipad.xib"; sourceTree = "<group>"; };
+		7D93044717B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "VLCLocalNetworkListCell~iphone.xib"; path = "../Resources/VLCLocalNetworkListCell~iphone.xib"; sourceTree = "<group>"; };
 		7D94FCDB16DE7D1000F2623B /* VLC for iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "VLC for iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
 		7D94FCDE16DE7D1000F2623B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
 		7D94FCE016DE7D1000F2623B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -755,6 +767,7 @@
 				7D94FCE116DE7D1000F2623B /* Foundation.framework in Frameworks */,
 				7D94FCE316DE7D1000F2623B /* CoreGraphics.framework in Frameworks */,
 				A7924696170F0BA90036AAF2 /* libMediaLibraryKit.a in Frameworks */,
+				7D31002017B6768B00E6516D /* libupnpx.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -996,6 +1009,17 @@
 			name = GHSidebarNav;
 			sourceTree = "<group>";
 		};
+		7D31002117B676D500E6516D /* UPNP */ = {
+			isa = PBXGroup;
+			children = (
+				7D93043E17B67C4F0054EAC6 /* VLCLocalServerListViewController.h */,
+				7D93043F17B67C4F0054EAC6 /* VLCLocalServerListViewController.m */,
+				7D93044317B684CE0054EAC6 /* VLCLocalNetworkListCell.h */,
+				7D93044417B684CF0054EAC6 /* VLCLocalNetworkListCell.m */,
+			);
+			name = UPNP;
+			sourceTree = "<group>";
+		};
 		7D31CF061746AEF2005997E0 /* UI Elements */ = {
 			isa = PBXGroup;
 			children = (
@@ -1270,6 +1294,7 @@
 				CC1BBC53170493B800A20CBF /* AudioToolbox.framework */,
 				CC1BBC51170493B100A20CBF /* OpenGLES.framework */,
 				CC1BBC4F170493AA00A20CBF /* libxml2.dylib */,
+				7D31001F17B6768B00E6516D /* libupnpx.a */,
 				CC1BBC4D170493A300A20CBF /* libbz2.dylib */,
 				CC1BBC4B1704939B00A20CBF /* libsqlite3.dylib */,
 				CC1BBC491704939300A20CBF /* libz.dylib */,
@@ -1291,6 +1316,7 @@
 				A7D03A4817A4249F0022C16F /* MediaDiscovering */,
 				7D2339AB176DE70E008D223C /* Menu */,
 				7D5F7ABA175265CB006CCCFA /* HTTP Connectivity */,
+				7D31002117B676D500E6516D /* UPNP */,
 				7D5F7AB9175265B2006CCCFA /* Playback */,
 				7D5F7AB81752658E006CCCFA /* Everything Playlist */,
 				7D5F7AB717526573006CCCFA /* Accessory dialogs */,
@@ -1318,6 +1344,8 @@
 		7DADC55C1704FAA8001DAC63 /* XIBs */ = {
 			isa = PBXGroup;
 			children = (
+				7D93044617B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib */,
+				7D93044717B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib */,
 				7DB43834176E20CC00F460EE /* VLCHTTPDownloadViewController.xib */,
 				7D2339AE176DE72E008D223C /* VLCOpenNetworkStreamViewController.xib */,
 				7DBC3B431711FC6C00DCF688 /* VLCAboutViewController~iphone.xib */,
@@ -1687,6 +1715,8 @@
 				7DB43836176E20CC00F460EE /* VLCHTTPDownloadViewController.xib in Resources */,
 				A7990064176E9352009E8267 /* libraryBackground.png in Resources */,
 				7DD2A3A9179C04A7003EB537 /* OpenSans-Regular.ttf in Resources */,
+				7D93044817B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib in Resources */,
+				7D93044917B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1780,6 +1810,8 @@
 				7DD2A3A7179BFAFE003EB537 /* VLCBugreporter.m in Sources */,
 				A7D03A4717A41AD30022C16F /* VLCMediaFileDiscoverer.m in Sources */,
 				7D31001D17B64AE100E6516D /* GHRevealViewController.m in Sources */,
+				7D93044117B67C4F0054EAC6 /* VLCLocalServerListViewController.m in Sources */,
+				7D93044517B684CF0054EAC6 /* VLCLocalNetworkListCell.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2003,6 +2035,8 @@
 				HEADER_SEARCH_PATHS = (
 					"$(SRCROOT)/External/MobileVLCKit/include",
 					"$(SRCROOT)/External/MediaLibraryKit/include",
+					"$(SRCROOT)/ImportedSources/upnpx/src/api",
+					"$(SRCROOT)/ImportedSources/upnpx/src/port/ios",
 				);
 				INFOPLIST_FILE = "AspenProject/VLC for iOS-Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 5.1;
@@ -2010,6 +2044,7 @@
 					"$(inherited)",
 					"\"$(SRCROOT)/External/MediaLibraryKit\"",
 					"\"$(SRCROOT)/External/MobileVLCKit\"",
+					"\"$(SRCROOT)/External/upnpx\"",
 					"\"$(SDKROOT)/usr/lib/system\"",
 				);
 				ONLY_ACTIVE_ARCH = YES;
@@ -2037,6 +2072,8 @@
 				HEADER_SEARCH_PATHS = (
 					"$(SRCROOT)/External/MobileVLCKit/include",
 					"$(SRCROOT)/External/MediaLibraryKit/include",
+					"$(SRCROOT)/ImportedSources/upnpx/src/api",
+					"$(SRCROOT)/ImportedSources/upnpx/src/port/ios",
 				);
 				INFOPLIST_FILE = "AspenProject/VLC for iOS-Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 5.1;
@@ -2044,6 +2081,7 @@
 					"$(inherited)",
 					"\"$(SRCROOT)/External/MediaLibraryKit\"",
 					"\"$(SRCROOT)/External/MobileVLCKit\"",
+					"\"$(SRCROOT)/External/upnpx\"",
 					"\"$(SDKROOT)/usr/lib/system\"",
 				);
 				ONLY_ACTIVE_ARCH = NO;
@@ -2098,6 +2136,8 @@
 				HEADER_SEARCH_PATHS = (
 					"$(SRCROOT)/External/MobileVLCKit/include",
 					"$(SRCROOT)/External/MediaLibraryKit/include",
+					"$(SRCROOT)/ImportedSources/upnpx/src/api",
+					"$(SRCROOT)/ImportedSources/upnpx/src/port/ios",
 				);
 				INFOPLIST_FILE = "AspenProject/VLC for iOS-Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 5.1;
@@ -2105,6 +2145,7 @@
 					"$(inherited)",
 					"\"$(SRCROOT)/External/MediaLibraryKit\"",
 					"\"$(SRCROOT)/External/MobileVLCKit\"",
+					"\"$(SRCROOT)/External/upnpx\"",
 					"\"$(SDKROOT)/usr/lib/system\"",
 				);
 				ONLY_ACTIVE_ARCH = NO;