Commit 79397cbb authored by Felix Paul Kühne's avatar Felix Paul Kühne

Add basic http download UI with the ability to schedule downloads

parent 1b1116c9
//
// VLCHTTPDownloadViewController.h
// VLC for iOS
//
// Created by Felix Paul Kühne on 16.06.13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
// Refer to the COPYING file of the official project for license.
//
#import "VLCHTTPFileDownloader.h"
@interface VLCHTTPDownloadViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, VLCHTTPFileDownloader>
@property (nonatomic, strong) IBOutlet UIButton *downloadButton;
@property (nonatomic, strong) IBOutlet UITextField *urlField;
@property (nonatomic, strong) IBOutlet UITableView *downloadsTable;
@property (nonatomic, strong) IBOutlet UIProgressView *progressView;
@property (nonatomic, strong) IBOutlet UIButton *cancelButton;
@property (nonatomic, strong) IBOutlet UILabel *currentDownloadLabel;
@property (nonatomic, strong) IBOutlet UIActivityIndicatorView *activityIndicator;
- (IBAction)downloadAction:(id)sender;
- (IBAction)cancelDownload:(id)sender;
@end
//
// VLCHTTPDownloadViewController.m
// VLC for iOS
//
// Created by Felix Paul Kühne on 16.06.13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
// Refer to the COPYING file of the official project for license.
//
#import "VLCHTTPDownloadViewController.h"
#import "VLCHTTPFileDownloader.h"
@interface VLCHTTPDownloadViewController ()
{
VLCHTTPFileDownloader *_httpDownloader;
NSMutableArray *_currentDownloads;
}
@end
@implementation VLCHTTPDownloadViewController
- (void)viewDidLoad
{
[self.downloadButton setTitle:@"Download" forState:UIControlStateNormal]; //FIXME l10n
_currentDownloads = [[NSMutableArray alloc] init];
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated
{
self.navigationController.navigationBarHidden = NO;
if ([[UIPasteboard generalPasteboard] containsPasteboardTypes:@[@"public.url", @"public.text"]]) {
NSURL *pasteURL = [[UIPasteboard generalPasteboard] valueForPasteboardType:@"public.url"];
if (!pasteURL || [[pasteURL absoluteString] isEqualToString:@""]) {
NSString *pasteString = [[UIPasteboard generalPasteboard] valueForPasteboardType:@"public.text"];
pasteURL = [NSURL URLWithString:pasteString];
}
if (pasteURL && ![[pasteURL scheme] isEqualToString:@""] && ![[pasteURL absoluteString] isEqualToString:@""])
self.urlField.text = [pasteURL absoluteString];
}
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
self.navigationController.navigationBarHidden = YES;
[super viewWillDisappear:animated];
}
#pragma mark - UI interaction
- (IBAction)downloadAction:(id)sender
{
if ([self.urlField.text length] > 0) {
NSURL *URLtoSave = [NSURL URLWithString:self.urlField.text];
if (([URLtoSave.scheme isEqualToString:@"http"] || [URLtoSave.scheme isEqualToString:@"https"]) && ![URLtoSave.lastPathComponent.pathExtension isEqualToString:@""]) {
if (!_httpDownloader) {
_httpDownloader = [[VLCHTTPFileDownloader alloc] init];
_httpDownloader.delegate = self;
}
[_currentDownloads addObject:URLtoSave];
self.urlField.text = @"";
[self _triggerNextDownload];
}
}
}
#pragma mark - download management
- (void)_triggerNextDownload
{
if (!_httpDownloader.downloadInProgress && _currentDownloads.count > 0) {
[_httpDownloader downloadFileFromURL:_currentDownloads[0]];
[self.activityIndicator startAnimating];
[_currentDownloads removeObjectAtIndex:0];
[self.downloadsTable reloadData];
}
}
- (IBAction)cancelDownload:(id)sender
{
if (_httpDownloader.downloadInProgress)
[_httpDownloader cancelDownload];
}
#pragma mark - VLC HTTP Downloader delegate
- (void)downloadStarted
{
[self.activityIndicator stopAnimating];
self.currentDownloadLabel.text = _httpDownloader.userReadableDownloadName;
self.progressView.progress = 0.;
self.currentDownloadLabel.hidden = NO;
self.progressView.hidden = NO;
self.cancelButton.hidden = NO;
APLog(@"download started");
}
- (void)downloadEnded
{
self.currentDownloadLabel.hidden = YES;
self.progressView.hidden = YES;
self.cancelButton.hidden = YES;
APLog(@"download ended");
[self _triggerNextDownload];
}
- (void)downloadFailedWithErrorDescription:(NSString *)description
{
APLog(@"download failed: %@", description);
}
- (void)progressUpdatedTo:(CGFloat)percentage
{
[self.progressView setProgress:percentage animated:YES];
}
#pragma mark - table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _currentDownloads.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ScheduledDownloadsCell";
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
cell.textLabel.textColor = [UIColor whiteColor];
cell.detailTextLabel.textColor = [UIColor colorWithWhite:.72 alpha:1.];
}
NSInteger row = indexPath.row;
cell.textLabel.text = [_currentDownloads[row] lastPathComponent];
cell.detailTextLabel.text = _currentDownloads[row];
return cell;
}
#pragma mark - table view delegate
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.backgroundColor = (indexPath.row % 2 == 0)? [UIColor blackColor]: [UIColor colorWithWhite:.122 alpha:1.];
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
[_currentDownloads removeObjectAtIndex:indexPath.row];
[tableView reloadData];
}
}
@end
......@@ -20,16 +20,16 @@
#import "VLCHTTPFileDownloader.h"
#import "IASKAppSettingsViewController.h"
#import "VLCOpenNetworkStreamViewController.h"
#import "VLCHTTPDownloadViewController.h"
#import <ifaddrs.h>
#import <arpa/inet.h>
@interface VLCMenuViewController () {
VLCHTTPUploaderController *_uploadController;
VLCHTTPDownloadViewController *_downloadViewController;
Reachability *_reachability;
VLCHTTPFileDownloader *_httpDownloader;
}
- (void)_presentOpenURLViewFromView:(UIView *)view forSelector:(SEL)selector;
@end
@implementation VLCMenuViewController
......@@ -142,27 +142,10 @@
- (IBAction)downloadFromHTTPServer:(id)sender
{
if (_httpDownloader) {
if (_httpDownloader.downloadInProgress)
return;
}
if (!_downloadViewController)
_downloadViewController = [[VLCHTTPDownloadViewController alloc] initWithNibName:nil bundle:nil];
if (sender == self.downloadFromHTTPServerButton) {
[self _presentOpenURLViewFromView:self.downloadFromHTTPServerButton forSelector:@selector(downloadFromHTTPServer:)];
} else {
NSURL *URLtoSave = [NSURL URLWithString:self.openURLField.text];
if (([URLtoSave.scheme isEqualToString:@"http"] || [URLtoSave.scheme isEqualToString:@"https"]) && ![URLtoSave.lastPathComponent.pathExtension isEqualToString:@""]) {
if (!_httpDownloader) {
_httpDownloader = [[VLCHTTPFileDownloader alloc] init];
_httpDownloader.mediaViewController = self;
}
[_httpDownloader downloadFileFromURL:URLtoSave];
[self.openURLView removeFromSuperview];
} else {
APLog(@"URL is not a file download");
[self _hideAnimated:YES];
}
}
[self.navigationController pushViewController:_downloadViewController animated:YES];
}
- (IBAction)showSettings:(id)sender
......@@ -243,25 +226,4 @@
[self presentModalViewController:navController animated:YES];
}
#pragma mark - Private methods
- (void)_presentOpenURLViewFromView:(UIView *)view forSelector:(SEL)selector
{
if ([[UIPasteboard generalPasteboard] containsPasteboardTypes:@[@"public.url", @"public.text"]]) {
NSURL *pasteURL = [[UIPasteboard generalPasteboard] valueForPasteboardType:@"public.url"];
if (!pasteURL || [[pasteURL absoluteString] isEqualToString:@""]) {
NSString *pasteString = [[UIPasteboard generalPasteboard] valueForPasteboardType:@"public.text"];
pasteURL = [NSURL URLWithString:pasteString];
}
if (pasteURL && ![[pasteURL scheme] isEqualToString:@""] && ![[pasteURL absoluteString] isEqualToString:@""])
self.openURLField.text = [pasteURL absoluteString];
}
if (self.openURLView.superview)
[self.openURLView removeFromSuperview];
[self.openURLButton removeTarget:nil action:NULL forControlEvents:UIControlEventTouchUpInside];
[self.openURLButton addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside];
[view addSubview:self.openURLView];
}
@end
<?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">12E55</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>IBUIActivityIndicatorView</string>
<string>IBUIButton</string>
<string>IBUIImageView</string>
<string>IBUILabel</string>
<string>IBUIProgressView</string>
<string>IBUITableView</string>
<string>IBUITextField</string>
<string>IBUIView</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="IBUIView" id="191373211">
<reference key="NSNextResponder"/>
<int key="NSvFlags">274</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIView" id="234033301">
<reference key="NSNextResponder" ref="191373211"/>
<int key="NSvFlags">293</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="433654949">
<reference key="NSNextResponder" ref="234033301"/>
<int key="NSvFlags">292</int>
<string key="NSFrameSize">{320, 60}</string>
<reference key="NSSuperview" ref="234033301"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="205664075"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<object class="NSCustomResource" key="IBUIImage" id="348971812">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">menuBtnBck.png</string>
</object>
</object>
<object class="IBUITextField" id="205664075">
<reference key="NSNextResponder" ref="234033301"/>
<int key="NSvFlags">290</int>
<string key="NSFrame">{{10, 15}, {182, 30}}</string>
<reference key="NSSuperview" ref="234033301"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="209774297"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentVerticalAlignment">0</int>
<string key="IBUIText"/>
<int key="IBUIBorderStyle">3</int>
<object class="NSColor" key="IBUITextColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MAA</bytes>
<object class="NSColorSpace" key="NSCustomColorSpace" id="913995005">
<int key="NSID">2</int>
</object>
</object>
<bool key="IBUIAdjustsFontSizeToFit">YES</bool>
<float key="IBUIMinimumFontSize">17</float>
<object class="IBUITextInputTraits" key="IBUITextInputTraits">
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="NSCustomResource" key="IBUIBackground">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">input.png</string>
</object>
<object class="IBUIFontDescription" key="IBUIFontDescription">
<int key="type">1</int>
<double key="pointSize">14</double>
</object>
<object class="NSFont" key="IBUIFont">
<string key="NSName">Helvetica</string>
<double key="NSSize">14</double>
<int key="NSfFlags">16</int>
</object>
</object>
<object class="IBUIButton" id="209774297">
<reference key="NSNextResponder" ref="234033301"/>
<int key="NSvFlags">289</int>
<string key="NSFrame">{{200, 11}, {110, 37}}</string>
<reference key="NSSuperview" ref="234033301"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1066205493"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
<int key="IBUIButtonType">1</int>
<string key="IBUINormalTitle">Télécharger</string>
<object class="NSColor" key="IBUIHighlightedTitleColor" id="1064176833">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
<object class="NSColor" key="IBUINormalTitleColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
<object class="NSColor" key="IBUINormalTitleShadowColor" id="433689442">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC41AA</bytes>
</object>
<object class="NSCustomResource" key="IBUINormalBackgroundImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">menuButton.png</string>
</object>
<object class="IBUIFontDescription" key="IBUIFontDescription" id="896947105">
<int key="type">2</int>
<double key="pointSize">15</double>
</object>
<object class="NSFont" key="IBUIFont" id="621582664">
<string key="NSName">Helvetica-Bold</string>
<double key="NSSize">15</double>
<int key="NSfFlags">16</int>
</object>
</object>
</array>
<string key="NSFrameSize">{320, 60}</string>
<reference key="NSSuperview" ref="191373211"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="433654949"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor" id="130677336">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
</object>
<object class="IBUISimulatedSizeMetrics" key="IBUISimulatedDestinationMetrics" id="211842947">
<string key="IBUISimulatedSizeMetricsClass">IBUISimulatedFreeformSizeMetricsSentinel</string>
<string key="IBUIDisplayName">Freeform</string>
</object>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="IBUIView" id="1066205493">
<reference key="NSNextResponder" ref="191373211"/>
<int key="NSvFlags">293</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIImageView" id="1005679980">
<reference key="NSNextResponder" ref="1066205493"/>
<int key="NSvFlags">292</int>
<string key="NSFrameSize">{320, 60}</string>
<reference key="NSSuperview" ref="1066205493"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="761747136"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<reference key="IBUIImage" ref="348971812"/>
</object>
<object class="IBUILabel" id="761747136">
<reference key="NSNextResponder" ref="1066205493"/>
<int key="NSvFlags">-2147483356</int>
<string key="NSFrame">{{11, 9}, {280, 21}}</string>
<reference key="NSSuperview" ref="1066205493"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="250280512"/>
<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">Current Download.mpg</string>
<object class="NSColor" key="IBUITextColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC43MgA</bytes>
</object>
<nil key="IBUIHighlightedColor"/>
<int key="IBUIBaselineAdjustment">0</int>
<object class="IBUIFontDescription" key="IBUIFontDescription">
<int key="type">1</int>
<double key="pointSize">17</double>
</object>
<object class="NSFont" key="IBUIFont">
<string key="NSName">Helvetica</string>
<double key="NSSize">17</double>
<int key="NSfFlags">16</int>
</object>
<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
</object>
<object class="IBUIProgressView" id="802027691">
<reference key="NSNextResponder" ref="1066205493"/>
<int key="NSvFlags">-2147483356</int>
<string key="NSFrame">{{11, 38}, {299, 9}}</string>
<reference key="NSSuperview" ref="1066205493"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="831264216"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<float key="IBUIProgress">0.5</float>
</object>
<object class="IBUIButton" id="250280512">
<reference key="NSNextResponder" ref="1066205493"/>
<int key="NSvFlags">-2147483356</int>
<string key="NSFrame">{{283, 5}, {29, 31}}</string>
<reference key="NSSuperview" ref="1066205493"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="802027691"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
<reference key="IBUIHighlightedTitleColor" ref="1064176833"/>
<object class="NSColor" key="IBUINormalTitleColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
<reference key="IBUINormalTitleShadowColor" ref="433689442"/>
<object class="NSCustomResource" key="IBUINormalImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">DeleteButton.png</string>
</object>
<reference key="IBUIFontDescription" ref="896947105"/>
<reference key="IBUIFont" ref="621582664"/>
</object>
<object class="IBUIActivityIndicatorView" id="277705480">
<reference key="NSNextResponder" ref="1066205493"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{142, 11}, {37, 37}}</string>
<reference key="NSSuperview" ref="1066205493"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIStyle">0</int>
</object>
</array>
<string key="NSFrame">{{0, 59}, {320, 60}}</string>
<reference key="NSSuperview" ref="191373211"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1005679980"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<reference key="IBUIBackgroundColor" ref="130677336"/>
<reference key="IBUISimulatedDestinationMetrics" ref="211842947"/>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="IBUITableView" id="831264216">
<reference key="NSNextResponder" ref="191373211"/>
<int key="NSvFlags">274</int>
<string key="NSFrame">{{0, 119}, {320, 264}}</string>
<reference key="NSSuperview" ref="191373211"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MCAwLjYxAA</bytes>
<reference key="NSCustomColorSpace" ref="913995005"/>
</object>
<bool key="IBUIClipsSubviews">YES</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<bool key="IBUIAlwaysBounceVertical">YES</bool>
<bool key="IBUIShowsVerticalScrollIndicator">NO</bool>
<int key="IBUISeparatorStyle">1</int>
<object class="NSColor" key="IBUISeparatorColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MCAwLjYxAA</bytes>
<reference key="NSCustomColorSpace" ref="913995005"/>
</object>
<int key="IBUISectionIndexMinimumDisplayRowCount">0</int>
<bool key="IBUIShowsSelectionImmediatelyOnTouchBegin">YES</bool>
<float key="IBUIRowHeight">44</float>
<float key="IBUISectionHeaderHeight">22</float>
<float key="IBUISectionFooterHeight">22</float>
</object>
</array>
<string key="NSFrameSize">{320, 383}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="234033301"/>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
<reference key="NSCustomColorSpace" ref="913995005"/>
</object>
<reference key="IBUISimulatedDestinationMetrics" ref="211842947"/>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">view</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="191373211"/>
</object>
<int key="connectionID">3</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">downloadsTable</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="831264216"/>
</object>
<int key="connectionID">75</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">downloadButton</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="209774297"/>
</object>
<int key="connectionID">76</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">urlField</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="205664075"/>
</object>
<int key="connectionID">77</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">progressView</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="802027691"/>
</object>
<int key="connectionID">87</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">currentDownloadLabel</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="761747136"/>
</object>
<int key="connectionID">88</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">cancelButton</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="250280512"/>
</object>
<int key="connectionID">89</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">activityIndicator</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="277705480"/>
</object>
<int key="connectionID">92</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">downloadAction:</string>
<reference key="source" ref="209774297"/>
<reference key="destination" ref="372490531"/>
<int key="IBEventType">7</int>
</object>
<int key="connectionID">78</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">cancelDownload:</string>
<reference key="source" ref="250280512"/>
<reference key="destination" ref="372490531"/>
<int key="IBEventType">7</int>
</object>
<int key="connectionID">90</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="191373211"/>
<array class="NSMutableArray" key="children">
<reference ref="234033301"/>
<reference ref="831264216"/>
<reference ref="1066205493"/>
</array>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">-1</int>
<reference key="object" ref="372490531"/>