From a746be45c537a2e09ae386dd3dcf98ff93bda543 Mon Sep 17 00:00:00 2001 From: Igor Kravchenko Date: Wed, 3 Dec 2014 17:42:31 +0200 Subject: [PATCH] Adds HTTPHeaders for playing from http source --- .gitignore | 21 +++++++++++++++++++ .../contents.xcworkspacedata | 7 +++++++ OrigamiEngine/ORGMCommonProtocols.h | 11 ++++++++++ OrigamiEngine/ORGMEngine.h | 19 +++++++++++++++++ OrigamiEngine/ORGMEngine.m | 21 ++++++++++++++----- OrigamiEngine/ORGMInputUnit.h | 19 +++++++++++++---- OrigamiEngine/ORGMInputUnit.m | 10 +++++++-- OrigamiEngine/Plugins/CueSheetDecoder.m | 2 +- OrigamiEngine/Plugins/FileSource.m | 10 ++++++++- OrigamiEngine/Plugins/HTTPSource.m | 17 ++++++++++++++- 10 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 .gitignore create mode 100644 OrigamiEngine.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c4768e --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# Xcode +.DS_Store +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +profile +*.moved-aside +DerivedData +.idea/ + +Pods/ + +*.xccheckout +Podfile.lock diff --git a/OrigamiEngine.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/OrigamiEngine.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..cdc0900 --- /dev/null +++ b/OrigamiEngine.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/OrigamiEngine/ORGMCommonProtocols.h b/OrigamiEngine/ORGMCommonProtocols.h index 84bad8e..ea65224 100644 --- a/OrigamiEngine/ORGMCommonProtocols.h +++ b/OrigamiEngine/ORGMCommonProtocols.h @@ -77,6 +77,17 @@ typedef enum : NSInteger { */ - (BOOL)open:(NSURL *)url; +/** + Opens source file for `read`. + + @param url A source file url. + @param httpHeaders A dictionary representing HTTP header fields and values + + @return `YES` if success, otherwise `NO`. +*/ +- (BOOL)open:(NSURL *)url + httpHeaders:(NSDictionary *)httpHeaders; + /** Determines if source is seekable. diff --git a/OrigamiEngine/ORGMEngine.h b/OrigamiEngine/ORGMEngine.h index b364db8..02d5572 100644 --- a/OrigamiEngine/ORGMEngine.h +++ b/OrigamiEngine/ORGMEngine.h @@ -82,6 +82,25 @@ typedef enum : NSInteger { */ - (void)playUrl:(NSURL *)url; +/** +Starts new playback process from corresponding source. + +@param url The url object to be used as a source path during playback. +@param httpHeaders A dictionary representing HTTP header fields and values + +*/ +- (void)playUrl:(NSURL *)url httpHeaders:(NSDictionary *)httpHeaders; + +/** +Starts new playback process from corresponding source. + +@param url The url object to be used as a source path during playback. +@param httpHeaders A dictionary representing HTTP header fields and values +@param outputUnitClass Class that will be used during output unit initialisation. Must be subclass of ORGMOutputUnit. + +*/ +- (void)playUrl:(NSURL *)url httpHeaders:(NSDictionary *)httpHeaders withOutputUnitClass:(Class)outputUnitClass; + /** Pauses the playback. diff --git a/OrigamiEngine/ORGMEngine.m b/OrigamiEngine/ORGMEngine.m index 7c129d1..d3e7fb3 100644 --- a/OrigamiEngine/ORGMEngine.m +++ b/OrigamiEngine/ORGMEngine.m @@ -61,7 +61,8 @@ - (void)dealloc { #pragma mark - public -- (void)playUrl:(NSURL *)url withOutputUnitClass:(Class)outputUnitClass { +- (void)playUrl:(NSURL *)url httpHeaders:(NSDictionary *)httpHeaders withOutputUnitClass:(Class)outputUnitClass +{ if (!outputUnitClass || ![outputUnitClass isSubclassOfClass:[ORGMOutputUnit class]]) { @throw [NSException exceptionWithName:NSInternalInconsistencyException @@ -77,7 +78,7 @@ - (void)playUrl:(NSURL *)url withOutputUnitClass:(Class)outputUnitClass { self.input = input; [input release]; - if (![_input openWithUrl:url]) { + if (![_input openWithUrl:url httpHeaders:httpHeaders]) { self.currentState = ORGMEngineStateError; self.currentError = [NSError errorWithDomain:kErrorDomain code:ORGMEngineErrorCodesSourceFailed @@ -113,9 +114,19 @@ - (void)playUrl:(NSURL *)url withOutputUnitClass:(Class)outputUnitClass { }); } -- (void)playUrl:(NSURL *)url { +- (void)playUrl:(NSURL *)url withOutputUnitClass:(Class)outputUnitClass +{ + [self playUrl:url httpHeaders:nil withOutputUnitClass:outputUnitClass]; +} + +- (void)playUrl:(NSURL *)url httpHeaders:(NSDictionary *)httpHeaders +{ + [self playUrl:url httpHeaders:httpHeaders withOutputUnitClass:[ORGMOutputUnit class]]; +} - [self playUrl:url withOutputUnitClass:[ORGMOutputUnit class]]; +- (void)playUrl:(NSURL *)url +{ + [self playUrl:url httpHeaders:nil]; } - (void)pause { @@ -171,7 +182,7 @@ - (void)setNextUrl:(NSURL *)url withDataFlush:(BOOL)flush { [self stop]; } else { dispatch_async([ORGMQueues processing_queue], ^{ - if (![_input openWithUrl:url]) { + if (![_input openWithUrl:url httpHeaders:nil]) { [self stop]; } [_converter reinitWithNewInput:_input withDataFlush:flush]; diff --git a/OrigamiEngine/ORGMInputUnit.h b/OrigamiEngine/ORGMInputUnit.h index c26ac15..4cca773 100644 --- a/OrigamiEngine/ORGMInputUnit.h +++ b/OrigamiEngine/ORGMInputUnit.h @@ -39,14 +39,25 @@ @property (assign, nonatomic, readonly) BOOL endOfInput; /** - Open input source and initializes necessary resources. +Open input source and initializes necessary resources. - @param url A url object to be used as a source path during playback. +@param url A url object to be used as a source path during playback. - @return `YES` if success, otherwise `NO`. - */ +@return `YES` if success, otherwise `NO`. +*/ - (BOOL)openWithUrl:(NSURL *)url; +/** +Open input source and initializes necessary resources. + +@param url A url object to be used as a source path during playback. +@param httpHeaders A dictionary representing HTTP header fields and values + +@return `YES` if success, otherwise `NO`. +*/ +- (BOOL)openWithUrl:(NSURL *)url + httpHeaders:(NSDictionary *)httpHeaders; + /** Closes input unit and corresponding decoder, deallocates unnecessary resources. */ diff --git a/OrigamiEngine/ORGMInputUnit.m b/OrigamiEngine/ORGMInputUnit.m index 1a5a6c5..9d807b7 100644 --- a/OrigamiEngine/ORGMInputUnit.m +++ b/OrigamiEngine/ORGMInputUnit.m @@ -62,9 +62,10 @@ - (void)dealloc { #pragma mark - public -- (BOOL)openWithUrl:(NSURL *)url { +- (BOOL)openWithUrl:(NSURL *)url httpHeaders:(NSDictionary *)httpHeaders +{ self.source = [[ORGMPluginManager sharedManager] sourceForURL:url error:nil]; - if (!_source || ![_source open:url]) return NO; + if (!_source || ![_source open:url httpHeaders:httpHeaders]) return NO; self.decoder = [[ORGMPluginManager sharedManager] decoderForSource:_source error:nil]; if (!_decoder || ![_decoder open:_source]) return NO; @@ -75,6 +76,11 @@ - (BOOL)openWithUrl:(NSURL *)url { return YES; } +- (BOOL)openWithUrl:(NSURL *)url +{ + return [self openWithUrl:url httpHeaders:nil]; +} + - (void)close { [_decoder close]; } diff --git a/OrigamiEngine/Plugins/CueSheetDecoder.m b/OrigamiEngine/Plugins/CueSheetDecoder.m index 79da4ed..04533ab 100644 --- a/OrigamiEngine/Plugins/CueSheetDecoder.m +++ b/OrigamiEngine/Plugins/CueSheetDecoder.m @@ -102,7 +102,7 @@ - (BOOL)open:(id)s { if ([track.track isEqualToString:[url fragment]]) { self.source = [pluginManager sourceForURL:track.url error:nil]; - if (![_source open:track.url]) { + if (![_source open:track.url httpHeaders:nil]) { return NO; } diff --git a/OrigamiEngine/Plugins/FileSource.m b/OrigamiEngine/Plugins/FileSource.m index 5a53879..34fb7de 100644 --- a/OrigamiEngine/Plugins/FileSource.m +++ b/OrigamiEngine/Plugins/FileSource.m @@ -54,12 +54,20 @@ - (long)size { return size; } -- (BOOL)open:(NSURL *)url { +- (BOOL)open:(NSURL *)url + httpHeaders:(NSDictionary *)httpHeaders +{ [self setUrl:url]; _fd = fopen([[url path] UTF8String], "r"); return (_fd != NULL); } +- (BOOL)open:(NSURL *)url +{ + return [self open:url httpHeaders:nil]; +} + + - (BOOL)seekable { return YES; } diff --git a/OrigamiEngine/Plugins/HTTPSource.m b/OrigamiEngine/Plugins/HTTPSource.m index 57adb85..e5825b7 100644 --- a/OrigamiEngine/Plugins/HTTPSource.m +++ b/OrigamiEngine/Plugins/HTTPSource.m @@ -64,10 +64,20 @@ - (long)size { return (long)_bytesExpected; } -- (BOOL)open:(NSURL *)url { +- (BOOL)open:(NSURL *)url httpHeaders:(NSDictionary *)httpHeaders +{ self.request = [NSMutableURLRequest requestWithURL:url]; [self.request addValue:@"identity" forHTTPHeaderField:@"Accept-Encoding"]; + if(httpHeaders) + { + for (id headerField in httpHeaders) + { + [_request addValue:httpHeaders[headerField] + forHTTPHeaderField:headerField]; + } + } + NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:_request delegate:self startImmediately:NO]; @@ -97,6 +107,11 @@ - (BOOL)open:(NSURL *)url { return YES; } +- (BOOL)open:(NSURL *)url +{ + return [self open:url httpHeaders:nil]; +} + - (BOOL)seekable { return YES; }