Skip to content
This repository has been archived by the owner on Jan 6, 2020. It is now read-only.

Commit

Permalink
added new /server-info endpoing for 4.3
Browse files Browse the repository at this point in the history
  • Loading branch information
maddox committed Mar 20, 2011
1 parent 4dd9416 commit 86e57d9
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 40 deletions.
8 changes: 4 additions & 4 deletions AirView.xcodeproj/project.pbxproj
Expand Up @@ -472,7 +472,7 @@
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
PREBINDING = NO;
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "7E41CF06-2727-44F8-BBA0-D7B4D11E39A6";
SDKROOT = iphoneos4.2;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = "App Store";
Expand Down Expand Up @@ -509,7 +509,7 @@
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 4.0;
PREBINDING = NO;
SDKROOT = iphoneos4.2;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
Expand All @@ -527,7 +527,7 @@
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
PREBINDING = NO;
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "D3DC2D31-675A-4D8C-8E19-50DB7B1164D3";
SDKROOT = iphoneos4.2;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
Expand Down Expand Up @@ -583,7 +583,7 @@
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
PREBINDING = NO;
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "D3DC2D31-675A-4D8C-8E19-50DB7B1164D3";
SDKROOT = iphoneos4.2;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = "Ad Hoc Distribution";
Expand Down
87 changes: 51 additions & 36 deletions Classes/AirPlayHTTPConnection.m
Expand Up @@ -22,27 +22,27 @@ @implementation AirPlayHTTPConfig
@synthesize airplay;

- (id)initWithServer:(HTTPServer *)aServer
documentRoot:(NSString *)aDocumentRoot
queue:(dispatch_queue_t)q
airplay:(AirPlayController *)airplayController
documentRoot:(NSString *)aDocumentRoot
queue:(dispatch_queue_t)q
airplay:(AirPlayController *)airplayController
{
if ((self = [super init]))
{
server = [aServer retain];

documentRoot = [aDocumentRoot stringByStandardizingPath];
if ([documentRoot hasSuffix:@"/"])
{
documentRoot = [documentRoot stringByAppendingString:@"/"];
}
[documentRoot retain];

if (q)
{
dispatch_retain(q);
queue = q;
}

airplay = [airplayController retain];
}
return self;
Expand All @@ -60,17 +60,21 @@ - (AirPlayController *)airplay
- (BOOL)supportsMethod:(NSString *)method atPath:(NSString *)path
{
HTTPLogTrace();

// Add support for GET

if ([method isEqualToString:@"GET"])
{
if ([path isEqualToString:@"/scrub"])
return YES;
}


if ([path isEqualToString:@"/server-info"])
return YES;

}

// Add support for POST

if ([method isEqualToString:@"POST"])
{
if ([path isEqualToString:@"/reverse"] ||
Expand All @@ -80,15 +84,15 @@ - (BOOL)supportsMethod:(NSString *)method atPath:(NSString *)path
[path hasPrefix:@"/rate?value="])
return YES;
}

// Add support for PUT

if ([method isEqualToString:@"PUT"])
{
if ([path isEqualToString:@"/photo"])
return YES;
}

return [super supportsMethod:method atPath:path];
}

Expand All @@ -98,20 +102,20 @@ - (BOOL)supportsMethod:(NSString *)method atPath:(NSString *)path
- (void)prepareForBodyWithSize:(UInt64)contentLength
{
HTTPLogTrace();

HTTPLogVerbose(@"prepareForBodyWithSize %qu", contentLength);
}


- (void)processDataChunk:(NSData *)postDataChunk
{
HTTPLogTrace();

// Remember: In order to support LARGE POST uploads, the data is read in chunks.
// This prevents a 50 MB upload from being stored in RAM.
// The size of the chunks are limited by the POST_CHUNKSIZE definition.
// Therefore, this method may be called multiple times for the same POST request.

BOOL result = [request appendData:postDataChunk];
if (!result)
HTTPLogError(@"%@[%p]: %@ - Couldn't append bytes!", THIS_FILE, self, THIS_METHOD);
Expand All @@ -121,30 +125,41 @@ - (void)processDataChunk:(NSData *)postDataChunk
{
HTTPLogTrace();
HTTPLogVerbose(@"%@[%p]: %@ (%qu) %@", THIS_FILE, self, method, requestContentLength, path);

AirPlayController *airplay = [self airplay];

if ([method isEqualToString:@"GET"] && [path isEqualToString:@"/scrub"])
{
NSString *str = [NSString stringWithFormat:@"duration: %f\nposition: %f\n",
airplay.duration, airplay.position];
airplay.duration, airplay.position];
NSData *response = [str dataUsingEncoding:NSUTF8StringEncoding];
HTTPDataResponse *res = [[HTTPDataResponse alloc] initWithData:response];
[res setHttpHeaderValue:@"text/parameters" forKey:@"Content-Type"];
return [res autorelease];
}


if ([method isEqualToString:@"GET"] && [path isEqualToString:@"/server-info"])
{
NSString *str = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"><plist version=\"1.0\"><dict><key>deviceid</key><string>58:55:CA:06:BD:9E</string><key>features</key><integer>119</integer><key>model</key><string>AppleTV2,1</string><key>protovers</key><string>1.0</string><key>srcvers</key><string>101.10</string></dict></plist>";

NSData *response = [str dataUsingEncoding:NSUTF8StringEncoding];
HTTPDataResponse *res = [[HTTPDataResponse alloc] initWithData:response];
[res setHttpHeaderValue:@"text/x-apple-plist+xml" forKey:@"Content-Type"];
return [res autorelease];
}


if ([method isEqualToString:@"PUT"] && [path isEqualToString:@"/photo"])
{
HTTPLogVerbose(@"%@[%p]: PUT (%qu) %@", THIS_FILE, self, requestContentLength, path);

return [[[HTTPDataResponse alloc] initWithData:nil] autorelease];
}


if (![method isEqualToString:@"POST"])
return [super httpResponseForMethod:method URI:path];

if ([path isEqualToString:@"/reverse"])
{
return [[[HTTPReverseResponse alloc] init] autorelease];
Expand All @@ -154,21 +169,21 @@ - (void)processDataChunk:(NSData *)postDataChunk
NSString *str = [path substringFromIndex:16];
float value = [str floatValue];
[airplay setPosition:value];

return [[[HTTPDataResponse alloc] initWithData:nil] autorelease];
}
else if ([path hasPrefix:@"/rate?value="])
{
NSString *str = [path substringFromIndex:12];
float value = [str floatValue];
[airplay setRate:value];

return [[[HTTPDataResponse alloc] initWithData:nil] autorelease];
}
else if ([path isEqualToString:@"/stop"])
{
[airplay stop];

return [[[HTTPDataResponse alloc] initWithData:nil] autorelease];
}
else if ([path isEqualToString:@"/play"])
Expand All @@ -178,32 +193,32 @@ - (void)processDataChunk:(NSData *)postDataChunk
NSArray *headers;
NSURL *url = nil;
float start_position = 0;

if (postData)
postStr = [[[NSString alloc] initWithData:postData encoding:NSUTF8StringEncoding] autorelease];

headers = [postStr componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

for (id h in headers) {
NSArray *a = [h componentsSeparatedByString:@": "];

if ([a count] >= 2) {
NSString *key = [a objectAtIndex:0];
NSString *value = [a objectAtIndex:1];

if ([key isEqualToString:@"Content-Location"])
url = [NSURL URLWithString:value];
else if ([key isEqualToString:@"Start-Position"])
start_position = [value floatValue];
}
}

if (url)
[airplay play:url atRelativePosition:start_position];

return [[[HTTPDataResponse alloc] initWithData:nil] autorelease];
}

return [super httpResponseForMethod:method URI:path];
}

Expand Down

0 comments on commit 86e57d9

Please sign in to comment.