Updated HTTPSource to use JNetLib.
parent
bbd2c6c7f6
commit
acf8f8f3be
|
@ -1,211 +0,0 @@
|
|||
//
|
||||
// HTTPSource.m
|
||||
// HTTPSource
|
||||
//
|
||||
// Created by Vincent Spader on 3/1/07.
|
||||
// Copyright 2007 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "HTTPSource.h"
|
||||
|
||||
|
||||
@implementation HTTPSource
|
||||
|
||||
- (BOOL)open:(NSURL *)url
|
||||
{
|
||||
_url = [url copy];
|
||||
|
||||
_responseReceived = NO;
|
||||
_connectionFinished = NO;
|
||||
_byteCount = 0;
|
||||
_data = [[NSMutableData alloc] init];
|
||||
_sem = [[Semaphore alloc] init];
|
||||
|
||||
[NSThread detachNewThreadSelector:@selector(doConnection) toTarget:self withObject:nil];
|
||||
|
||||
//Wait for a response.
|
||||
while (!_responseReceived && !_connectionFinished) {
|
||||
[_sem wait];
|
||||
}
|
||||
|
||||
NSLog(@"Connection opened!");
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)doConnection
|
||||
{
|
||||
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url];
|
||||
_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
|
||||
|
||||
[request release];
|
||||
|
||||
while (!_connectionFinished)
|
||||
{
|
||||
NSDate *date = [[NSDate alloc] init];
|
||||
|
||||
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:date];
|
||||
|
||||
[date release];
|
||||
}
|
||||
|
||||
NSLog(@"Thread exit");
|
||||
}
|
||||
|
||||
- (NSString *)mimeType
|
||||
{
|
||||
NSLog(@"Returning mimetype! %@", _mimeType);
|
||||
return _mimeType;
|
||||
}
|
||||
|
||||
- (BOOL)seekable
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)seek:(long)position whence:(int)whence
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (long)tell
|
||||
{
|
||||
return _byteCount;
|
||||
}
|
||||
|
||||
- (int)read:(void *)buffer amount:(int)amount
|
||||
{
|
||||
while (amount > [_data length] && !_connectionFinished) {
|
||||
[_sem timedWait: 2];
|
||||
}
|
||||
|
||||
NSLog(@"Read called!");
|
||||
|
||||
if (amount > [_data length])
|
||||
amount = [_data length];
|
||||
|
||||
@synchronized (_data) {
|
||||
[_data getBytes:buffer length:amount];
|
||||
|
||||
//Remove the bytes
|
||||
[_data replaceBytesInRange:NSMakeRange(0, amount) withBytes:NULL length:0];
|
||||
}
|
||||
|
||||
_byteCount += amount;
|
||||
|
||||
return amount;
|
||||
}
|
||||
|
||||
//Only called from thread.
|
||||
- (void)cancel
|
||||
{
|
||||
NSLog(@"CANCEL!");
|
||||
|
||||
[_connection cancel];
|
||||
_connectionFinished = YES;
|
||||
|
||||
[_sem signal];
|
||||
}
|
||||
|
||||
- (void)close
|
||||
{
|
||||
NSLog(@"CLOSING HTTPSource!");
|
||||
_connectionFinished = YES;
|
||||
|
||||
[_connection cancel];
|
||||
[_connection release];
|
||||
_connection = nil;
|
||||
|
||||
[_data release];
|
||||
_data = nil;
|
||||
|
||||
[_url release];
|
||||
_url = nil;
|
||||
|
||||
[_mimeType release];
|
||||
_mimeType = nil;
|
||||
|
||||
[_sem release];
|
||||
_sem = nil;
|
||||
}
|
||||
|
||||
- (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
|
||||
{
|
||||
NSLog(@"Authentication cancelled");
|
||||
[self cancel];
|
||||
}
|
||||
|
||||
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
|
||||
{
|
||||
NSLog(@"Connection failed: %@", error);
|
||||
[self cancel];
|
||||
}
|
||||
|
||||
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
|
||||
{
|
||||
NSLog(@"Received authentication challenge. Canceling.");
|
||||
[self cancel];
|
||||
}
|
||||
|
||||
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
|
||||
{
|
||||
_mimeType = [[response MIMEType] copy];
|
||||
_responseReceived = YES;
|
||||
|
||||
NSLog(@"Received response: %@", _mimeType);
|
||||
|
||||
[_sem signal];
|
||||
}
|
||||
|
||||
-(NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
|
||||
{
|
||||
NSLog(@"Received cache request");
|
||||
|
||||
//No caching an HTTP stream
|
||||
return nil;
|
||||
}
|
||||
|
||||
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse
|
||||
{
|
||||
NSLog(@"Received redirect");
|
||||
|
||||
//Redirect away
|
||||
return request;
|
||||
}
|
||||
|
||||
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
|
||||
{
|
||||
NSLog(@"Connection finished loading.");
|
||||
|
||||
_connectionFinished = YES;
|
||||
|
||||
[_sem signal];
|
||||
}
|
||||
|
||||
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
|
||||
{
|
||||
@synchronized (_data) {
|
||||
[_data appendData:data];
|
||||
}
|
||||
|
||||
[_sem signal];
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[self close];
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (NSURL *)url
|
||||
{
|
||||
return _url;
|
||||
}
|
||||
|
||||
+ (NSArray *)schemes
|
||||
{
|
||||
return [NSArray arrayWithObject:@"http"];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,124 @@
|
|||
//
|
||||
// HTTPSource.m
|
||||
// HTTPSource
|
||||
//
|
||||
// Created by Vincent Spader on 3/1/07.
|
||||
// Copyright 2007 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "HTTPSource.h"
|
||||
#include <JNetLib/jnetlib.h>
|
||||
|
||||
@implementation HTTPSource
|
||||
|
||||
- (BOOL)open:(NSURL *)url
|
||||
{
|
||||
_url = [url copy];
|
||||
|
||||
JNL::open_socketlib();
|
||||
|
||||
_get = new JNL_HTTPGet();
|
||||
|
||||
NSString *userAgent = [NSString stringWithFormat:@"User-Agent:Cog %@", [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]];
|
||||
_get->addheader([userAgent UTF8String]);
|
||||
_get->addheader("Connection:close");
|
||||
_get->addheader("Accept:*/*");
|
||||
|
||||
_get->connect([[url absoluteString] UTF8String]);
|
||||
for(;;)
|
||||
{
|
||||
int status = _get->get_status();
|
||||
if (status < 0 || status > 1) break;
|
||||
if (_get->run() < 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int st = _get->run();
|
||||
if (st < 0)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
// length = _get.content_length();
|
||||
|
||||
const char *mimeType = _get->getheader("content-type");
|
||||
if (NULL != mimeType) {
|
||||
_mimeType = [[NSString alloc] initWithUTF8String:mimeType];
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (NSString *)mimeType
|
||||
{
|
||||
NSLog(@"Returning mimetype! %@", _mimeType);
|
||||
return _mimeType;
|
||||
}
|
||||
|
||||
- (BOOL)seekable
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)seek:(long)position whence:(int)whence
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (long)tell
|
||||
{
|
||||
return _byteCount;
|
||||
}
|
||||
|
||||
- (int)read:(void *)buffer amount:(int)amount
|
||||
{
|
||||
int totalRead = 0;
|
||||
|
||||
while (totalRead < amount) {
|
||||
int status = _get->run();
|
||||
int amountRead = _get->get_bytes((char *)((uint8_t *)buffer) + totalRead, amount - totalRead);
|
||||
|
||||
totalRead += amountRead;
|
||||
|
||||
if (status && 0 == amountRead) break;
|
||||
}
|
||||
|
||||
_byteCount += totalRead;
|
||||
|
||||
return totalRead;
|
||||
}
|
||||
|
||||
- (void)close
|
||||
{
|
||||
if (NULL != _get) {
|
||||
delete _get;
|
||||
_get = NULL;
|
||||
}
|
||||
|
||||
[_url release];
|
||||
_url = nil;
|
||||
|
||||
[_mimeType release];
|
||||
_mimeType = nil;
|
||||
}
|
||||
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[self close];
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (NSURL *)url
|
||||
{
|
||||
return _url;
|
||||
}
|
||||
|
||||
+ (NSArray *)schemes
|
||||
{
|
||||
return [NSArray arrayWithObject:@"http"];
|
||||
}
|
||||
|
||||
@end
|
Loading…
Reference in New Issue