Thread safety in byte streams
[ITFoundation.git] / ITByteStream.m
1 //
2 //  ITByteStream.h
3 //  ITFoundation
4 //
5 //  Created by Alexander Strange on Thu Feb 27 2003.
6 //  Copyright (c) 2003 __MyCompanyName__. All rights reserved.
7 //
8
9 #import "ITByteStream.h"
10
11 // TODO: Add NSCopying/NSCoding support. Blocking reads (how would this work? I could hack it with socketpair(), i guess)
12
13 @implementation ITByteStream
14 -(id) init
15 {
16     if (self == [super init])
17            {
18            data = [[NSMutableData alloc] init];
19            lock = [[NSLock alloc] init];
20            }
21     return self;
22 }
23
24 -(id) initWithStream:(ITByteStream*)stream
25 {
26     if (self == [super init])
27            {
28            data = [stream->data copy];
29            lock = [[NSLock alloc] init];
30            }
31     return 0;
32 }
33
34 -(void) dealloc
35 {
36     [data release];
37     [lock release];
38     [super dealloc];
39 }
40
41 -(int) availableDataLength
42 {
43     return [data length];
44 }
45
46 -(NSData*) readDataOfLength:(int)length
47 {
48     NSData *ret, *tmp;
49     NSRange range = {0, length};
50     [lock lock];
51     ret = [data subdataWithRange:range];
52 #if MAC_OS_X_VERSION_10_2 <= MAC_OS_X_VERSION_MAX_ALLOWED
53     [data replaceBytesInRange:range withBytes:nil length:0]; // this should delete off the end. should test.
54 #else
55     range = {length, [data length]};
56     tmp = [data subdataWithRange:range];
57     [data setData:tmp]; // maybe i should add a lock to this? it would be bad if someone was writing when it was reading...
58 #endif
59     [lock unlock];
60     return ret;
61 }
62
63 -(void) writeData:(NSData*)_data
64 {
65     [lock lock];
66     [data appendData:_data];
67     [lock unlock];
68 }
69 @end