Statistics
| Branch: | Tag: | Revision:

root / Classes / ASIInputStream.m @ 72744ed1

History | View | Annotate | Download (3 kB)

1 700184fb Miltiadis Vasilakis
//
2 700184fb Miltiadis Vasilakis
//  ASIInputStream.m
3 700184fb Miltiadis Vasilakis
//  Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest
4 700184fb Miltiadis Vasilakis
//
5 700184fb Miltiadis Vasilakis
//  Created by Ben Copsey on 10/08/2009.
6 700184fb Miltiadis Vasilakis
//  Copyright 2009 All-Seeing Interactive. All rights reserved.
7 700184fb Miltiadis Vasilakis
//
8 700184fb Miltiadis Vasilakis
9 700184fb Miltiadis Vasilakis
#import "ASIInputStream.h"
10 700184fb Miltiadis Vasilakis
#import "ASIHTTPRequest.h"
11 700184fb Miltiadis Vasilakis
12 700184fb Miltiadis Vasilakis
// Used to ensure only one request can read data at once
13 700184fb Miltiadis Vasilakis
static NSLock *readLock = nil;
14 700184fb Miltiadis Vasilakis
15 700184fb Miltiadis Vasilakis
@implementation ASIInputStream
16 700184fb Miltiadis Vasilakis
17 700184fb Miltiadis Vasilakis
+ (void)initialize
18 700184fb Miltiadis Vasilakis
{
19 700184fb Miltiadis Vasilakis
	if (self == [ASIInputStream class]) {
20 700184fb Miltiadis Vasilakis
		readLock = [[NSLock alloc] init];
21 700184fb Miltiadis Vasilakis
	}
22 700184fb Miltiadis Vasilakis
}
23 700184fb Miltiadis Vasilakis
24 700184fb Miltiadis Vasilakis
+ (id)inputStreamWithFileAtPath:(NSString *)path request:(ASIHTTPRequest *)theRequest
25 700184fb Miltiadis Vasilakis
{
26 700184fb Miltiadis Vasilakis
	ASIInputStream *theStream = [[[self alloc] init] autorelease];
27 700184fb Miltiadis Vasilakis
	[theStream setRequest:theRequest];
28 700184fb Miltiadis Vasilakis
	[theStream setStream:[NSInputStream inputStreamWithFileAtPath:path]];
29 700184fb Miltiadis Vasilakis
	return theStream;
30 700184fb Miltiadis Vasilakis
}
31 700184fb Miltiadis Vasilakis
32 700184fb Miltiadis Vasilakis
+ (id)inputStreamWithData:(NSData *)data request:(ASIHTTPRequest *)theRequest
33 700184fb Miltiadis Vasilakis
{
34 700184fb Miltiadis Vasilakis
	ASIInputStream *theStream = [[[self alloc] init] autorelease];
35 700184fb Miltiadis Vasilakis
	[theStream setRequest:theRequest];
36 700184fb Miltiadis Vasilakis
	[theStream setStream:[NSInputStream inputStreamWithData:data]];
37 700184fb Miltiadis Vasilakis
	return theStream;
38 700184fb Miltiadis Vasilakis
}
39 700184fb Miltiadis Vasilakis
40 700184fb Miltiadis Vasilakis
- (void)dealloc
41 700184fb Miltiadis Vasilakis
{
42 700184fb Miltiadis Vasilakis
	[stream release];
43 700184fb Miltiadis Vasilakis
	[super dealloc];
44 700184fb Miltiadis Vasilakis
}
45 700184fb Miltiadis Vasilakis
46 700184fb Miltiadis Vasilakis
// Called when CFNetwork wants to read more of our request body
47 700184fb Miltiadis Vasilakis
// When throttling is on, we ask ASIHTTPRequest for the maximum amount of data we can read
48 700184fb Miltiadis Vasilakis
- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len
49 700184fb Miltiadis Vasilakis
{
50 700184fb Miltiadis Vasilakis
	[readLock lock];
51 700184fb Miltiadis Vasilakis
	unsigned long toRead = len;
52 700184fb Miltiadis Vasilakis
	if ([ASIHTTPRequest isBandwidthThrottled]) {
53 700184fb Miltiadis Vasilakis
		toRead = [ASIHTTPRequest maxUploadReadLength];
54 700184fb Miltiadis Vasilakis
		if (toRead > len) {
55 700184fb Miltiadis Vasilakis
			toRead = len;
56 700184fb Miltiadis Vasilakis
		} else if (toRead == 0) {
57 700184fb Miltiadis Vasilakis
			toRead = 1;
58 700184fb Miltiadis Vasilakis
		}
59 700184fb Miltiadis Vasilakis
		[request performThrottling];
60 700184fb Miltiadis Vasilakis
	}
61 700184fb Miltiadis Vasilakis
	[ASIHTTPRequest incrementBandwidthUsedInLastSecond:toRead];
62 700184fb Miltiadis Vasilakis
	[readLock unlock];
63 700184fb Miltiadis Vasilakis
	return [stream read:buffer maxLength:toRead];
64 700184fb Miltiadis Vasilakis
}
65 700184fb Miltiadis Vasilakis
66 700184fb Miltiadis Vasilakis
/*
67 700184fb Miltiadis Vasilakis
 * Implement NSInputStream mandatory methods to make sure they are implemented
68 700184fb Miltiadis Vasilakis
 * (necessary for MacRuby for example) and avoid the overhead of method
69 700184fb Miltiadis Vasilakis
 * forwarding for these common methods.
70 700184fb Miltiadis Vasilakis
 */
71 700184fb Miltiadis Vasilakis
- (void)open
72 700184fb Miltiadis Vasilakis
{
73 700184fb Miltiadis Vasilakis
    [stream open];
74 700184fb Miltiadis Vasilakis
}
75 700184fb Miltiadis Vasilakis
76 700184fb Miltiadis Vasilakis
- (void)close
77 700184fb Miltiadis Vasilakis
{
78 700184fb Miltiadis Vasilakis
    [stream close];
79 700184fb Miltiadis Vasilakis
}
80 700184fb Miltiadis Vasilakis
81 700184fb Miltiadis Vasilakis
- (id)delegate
82 700184fb Miltiadis Vasilakis
{
83 700184fb Miltiadis Vasilakis
    return [stream delegate];
84 700184fb Miltiadis Vasilakis
}
85 700184fb Miltiadis Vasilakis
86 700184fb Miltiadis Vasilakis
- (void)setDelegate:(id)delegate
87 700184fb Miltiadis Vasilakis
{
88 700184fb Miltiadis Vasilakis
    [stream setDelegate:delegate];
89 700184fb Miltiadis Vasilakis
}
90 700184fb Miltiadis Vasilakis
91 700184fb Miltiadis Vasilakis
- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode
92 700184fb Miltiadis Vasilakis
{
93 700184fb Miltiadis Vasilakis
    [stream scheduleInRunLoop:aRunLoop forMode:mode];
94 700184fb Miltiadis Vasilakis
}
95 700184fb Miltiadis Vasilakis
96 700184fb Miltiadis Vasilakis
- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode
97 700184fb Miltiadis Vasilakis
{
98 700184fb Miltiadis Vasilakis
    [stream removeFromRunLoop:aRunLoop forMode:mode];
99 700184fb Miltiadis Vasilakis
}
100 700184fb Miltiadis Vasilakis
101 700184fb Miltiadis Vasilakis
- (id)propertyForKey:(NSString *)key
102 700184fb Miltiadis Vasilakis
{
103 700184fb Miltiadis Vasilakis
    return [stream propertyForKey:key];
104 700184fb Miltiadis Vasilakis
}
105 700184fb Miltiadis Vasilakis
106 700184fb Miltiadis Vasilakis
- (BOOL)setProperty:(id)property forKey:(NSString *)key
107 700184fb Miltiadis Vasilakis
{
108 700184fb Miltiadis Vasilakis
    return [stream setProperty:property forKey:key];
109 700184fb Miltiadis Vasilakis
}
110 700184fb Miltiadis Vasilakis
111 700184fb Miltiadis Vasilakis
- (NSStreamStatus)streamStatus
112 700184fb Miltiadis Vasilakis
{
113 700184fb Miltiadis Vasilakis
    return [stream streamStatus];
114 700184fb Miltiadis Vasilakis
}
115 700184fb Miltiadis Vasilakis
116 700184fb Miltiadis Vasilakis
- (NSError *)streamError
117 700184fb Miltiadis Vasilakis
{
118 700184fb Miltiadis Vasilakis
    return [stream streamError];
119 700184fb Miltiadis Vasilakis
}
120 700184fb Miltiadis Vasilakis
121 700184fb Miltiadis Vasilakis
// If we get asked to perform a method we don't have (probably internal ones),
122 700184fb Miltiadis Vasilakis
// we'll just forward the message to our stream
123 700184fb Miltiadis Vasilakis
124 700184fb Miltiadis Vasilakis
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
125 700184fb Miltiadis Vasilakis
{
126 700184fb Miltiadis Vasilakis
	return [stream methodSignatureForSelector:aSelector];
127 700184fb Miltiadis Vasilakis
}
128 700184fb Miltiadis Vasilakis
	 
129 700184fb Miltiadis Vasilakis
- (void)forwardInvocation:(NSInvocation *)anInvocation
130 700184fb Miltiadis Vasilakis
{
131 700184fb Miltiadis Vasilakis
	[anInvocation invokeWithTarget:stream];
132 700184fb Miltiadis Vasilakis
}
133 700184fb Miltiadis Vasilakis
134 700184fb Miltiadis Vasilakis
@synthesize stream;
135 700184fb Miltiadis Vasilakis
@synthesize request;
136 700184fb Miltiadis Vasilakis
@end