Created
July 21, 2014 08:22
-
-
Save squarefrog/08153aef35cc3c9d14d3 to your computer and use it in GitHub Desktop.
Background Parsing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// FolderViewController.m | |
// upnpxdemo | |
// | |
// Created by Bruno Keymolen on 02/07/11. | |
// Copyright 2011 Bruno Keymolen. All rights reserved. | |
// | |
#import "FolderViewController.h" | |
#import "MediaServerBasicObjectParser.h" | |
#import "MediaServer1ItemObject.h" | |
#import "MediaServer1ContainerObject.h" | |
#import "PlayBack.h" | |
@interface FolderViewController () | |
@property (strong, nonatomic) NSNumber *totalResults; | |
@end | |
@implementation FolderViewController | |
@synthesize titleLabel; | |
-(id)initWithMediaDevice:(MediaServer1Device*)device andHeader:(NSString*)header andRootId:(NSString*)rootId{ | |
self = [super init]; | |
if (self) { | |
/* TODO: Properties are not retained. Possible issue? */ | |
m_device = device; | |
m_rootId=rootId; | |
m_title=header; | |
m_playList = [[NSMutableArray alloc] init]; | |
} | |
return self; | |
} | |
#pragma mark - View lifecycle | |
- (void)viewDidLoad | |
{ | |
[super viewDidLoad]; | |
// Before we do anything, some devices do not support sorting and will fail if we try to sort on our request | |
NSString *sortCriteria = @""; | |
NSMutableString *outSortCaps = [[NSMutableString alloc] init]; | |
[[m_device contentDirectory] GetSortCapabilitiesWithOutSortCaps:outSortCaps]; | |
if ([outSortCaps rangeOfString:@"dc:title"].location != NSNotFound) | |
{ | |
sortCriteria = @"+dc:title"; | |
} | |
//Allocate NMSutableString's to read the results | |
NSMutableString *outResult = [[NSMutableString alloc] init]; | |
NSMutableString *outNumberReturned = [[NSMutableString alloc] init]; | |
NSMutableString *outTotalMatches = [[NSMutableString alloc] init]; | |
NSMutableString *outUpdateID = [[NSMutableString alloc] init]; | |
[[m_device contentDirectory] BrowseWithObjectID:m_rootId BrowseFlag:@"BrowseDirectChildren" Filter:@"*" StartingIndex:@"0" RequestedCount:@"20" SortCriteria:sortCriteria OutResult:outResult OutNumberReturned:outNumberReturned OutTotalMatches:outTotalMatches OutUpdateID:outUpdateID]; | |
// SoapActionsAVTransport1* _avTransport = [m_device avTransport]; | |
// SoapActionsConnectionManager1* _connectionManager = [m_device connectionManager]; | |
//The collections are returned as DIDL Xml in the string 'outResult' | |
//upnpx provide a helper class to parse the DIDL Xml in usable MediaServer1BasicObject object | |
//(MediaServer1ContainerObject and MediaServer1ItemObject) | |
//Parse the return DIDL and store all entries as objects in the 'mediaObjects' array | |
[m_playList removeAllObjects]; | |
NSData *didl = [outResult dataUsingEncoding:NSUTF8StringEncoding]; | |
MediaServerBasicObjectParser *parser = [[MediaServerBasicObjectParser alloc] initWithMediaObjectArray:m_playList itemsOnly:NO]; | |
[parser parseFromData:didl]; | |
self.totalResults = @([outTotalMatches integerValue]); | |
self.navigationController.toolbarHidden = NO; | |
self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0 , 11.0f, self.navigationController.view.frame.size.width, 21.0f)]; | |
[self.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:18]]; | |
[self.titleLabel setBackgroundColor:[UIColor clearColor]]; | |
[self.titleLabel setTextColor:[UIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:1.0]]; | |
if([[PlayBack GetInstance] renderer] == nil){ | |
[self.titleLabel setText:@"No Renderer Selected"]; | |
}else{ | |
[self.titleLabel setText:[[[PlayBack GetInstance] renderer] friendlyName] ]; | |
} | |
[self.titleLabel setTextAlignment:NSTextAlignmentLeft]; | |
UIBarButtonItem *ttitle = [[UIBarButtonItem alloc] initWithCustomView:self.titleLabel]; | |
NSArray *items = @[ttitle]; | |
self.toolbarItems = items; | |
self.title = m_title; | |
} | |
- (void)fetchMoreResults:(NSInteger)startingIndex | |
{ | |
if (m_playList.count >= [self.totalResults integerValue]) { | |
return; | |
} | |
NSLog(@"====== FETCHING OBJECTS (%@)", @(startingIndex)); | |
NSMutableArray *newObjects = [[NSMutableArray alloc] init]; | |
NSMutableString *outResult = [[NSMutableString alloc] init]; | |
NSMutableString *outNumberReturned = [[NSMutableString alloc] init]; | |
NSMutableString *outTotalMatches = [[NSMutableString alloc] init]; | |
NSMutableString *outUpdateID = [[NSMutableString alloc] init]; | |
NSString *sIndex = [NSString stringWithFormat:@"%@", @(startingIndex)]; | |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | |
[[m_device contentDirectory] BrowseWithObjectID:m_rootId BrowseFlag:@"BrowseDirectChildren" Filter:@"*" StartingIndex:sIndex RequestedCount:@"20" SortCriteria:@"+dc:title" OutResult:outResult OutNumberReturned:outNumberReturned OutTotalMatches:outTotalMatches OutUpdateID:outUpdateID]; | |
[newObjects removeAllObjects]; | |
NSData *didl = [outResult dataUsingEncoding:NSUTF8StringEncoding]; | |
MediaServerBasicObjectParser *parser = [[MediaServerBasicObjectParser alloc] initWithMediaObjectArray:newObjects itemsOnly:NO]; | |
[parser parseFromData:didl]; | |
[m_playList addObjectsFromArray:newObjects]; | |
dispatch_async(dispatch_get_main_queue(), ^{ | |
[self.tableView reloadData]; | |
}); | |
}); | |
} | |
#pragma mark - Table view data source | |
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath | |
{ | |
NSUInteger count = [tableView numberOfRowsInSection:indexPath.section]; | |
if (indexPath.row != count - 1) { | |
return; | |
} | |
if (count >= [self.totalResults integerValue]) { | |
return; | |
} | |
[self fetchMoreResults:count]; | |
} | |
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView | |
{ | |
return 1; | |
} | |
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section | |
{ | |
return [m_playList count]; | |
} | |
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath | |
{ | |
static NSString *CellIdentifier = @"Cell"; | |
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; | |
if (cell == nil) { | |
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; | |
} | |
// Configure the cell... | |
MediaServer1BasicObject *item = m_playList[indexPath.row]; | |
[[cell textLabel] setText:[item title]]; | |
// NSLog(@"[item title]:%@", [item title]); | |
cell.accessoryType = item.isContainer ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; | |
return cell; | |
} | |
#pragma mark - Table view delegate | |
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath | |
{ | |
MediaServer1BasicObject *item = m_playList[indexPath.row]; | |
if([item isContainer]){ | |
MediaServer1ContainerObject *container = m_playList[indexPath.row]; | |
FolderViewController *targetViewController = [[FolderViewController alloc] initWithMediaDevice:m_device andHeader:[container title] andRootId:[container objectID]]; | |
[[self navigationController] pushViewController:targetViewController animated:YES]; | |
}else{ | |
MediaServer1ItemObject *item = m_playList[indexPath.row]; | |
MediaServer1ItemRes *resource = nil; | |
NSEnumerator *e = [[item resources] objectEnumerator]; | |
while((resource = (MediaServer1ItemRes*)[e nextObject])){ | |
NSLog(@"%@ - %d, %@, %d, %lld, %d, %@", [item title], [resource bitrate], [resource duration], [resource nrAudioChannels], [resource size], [resource durationInSeconds], [resource protocolInfo] ); | |
} | |
[[PlayBack GetInstance] Play:m_playList position:indexPath.row]; | |
} | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment