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 |