X-Git-Url: http://git.ithinksw.org/ITFoundation.git/blobdiff_plain/c1dc61cc189c0eb83fe8027c70949b9c4dcdbd24..d0e2a23f6909335baea90af08491a5160026757b:/ITByteStream.m?ds=sidebyside diff --git a/ITByteStream.m b/ITByteStream.m index 301d851..4d34eb0 100755 --- a/ITByteStream.m +++ b/ITByteStream.m @@ -8,7 +8,7 @@ #import "ITByteStream.h" -// TODO: Add NSCopying/NSCoding support +// TODO: Add NSCopying/NSCoding support. Blocking reads (how would this work? NSConditionLock?) @implementation ITByteStream -(id) init @@ -16,6 +16,7 @@ if (self == [super init]) { data = [[NSMutableData alloc] init]; + lock = [[NSLock alloc] init]; } return self; } @@ -25,6 +26,7 @@ if (self == [super init]) { data = [stream->data copy]; + lock = [[NSLock alloc] init]; } return 0; } @@ -32,31 +34,50 @@ -(void) dealloc { [data release]; + [lock release]; [super dealloc]; } -(int) availableDataLength { - return [data length]; + int len; + [lock lock]; + len = [data length]; + [lock unlock]; + return len; } -(NSData*) readDataOfLength:(int)length { NSData *ret, *tmp; NSRange range = {0, length}; + [lock lock]; ret = [data subdataWithRange:range]; #if MAC_OS_X_VERSION_10_2 <= MAC_OS_X_VERSION_MAX_ALLOWED - [data replaceBytesInRange:range withBytes:nil length:0]; // this should delete off the end. should test. + [data replaceBytesInRange:range withBytes:nil length:0]; #else range = {length, [data length]}; tmp = [data subdataWithRange:range]; - [data setData:tmp]; // maybe i should add a lock to this? it would be bad if someone was writing when it was reading... + [data setData:tmp]; #endif + [lock unlock]; + return ret; +} + +-(NSData*) readAllData +{ + NSData *ret; + [lock lock]; + ret = [data autorelease]; + data = [[NSMutableData alloc] init]; + [lock unlock]; return ret; } -(void) writeData:(NSData*)_data { + [lock lock]; [data appendData:_data]; + [lock unlock]; } @end