X-Git-Url: http://git.ithinksw.org/ITFoundation.git/blobdiff_plain/00792f13efcd8fcf9b175e564b153805b8fb1a23..d3f44a2b3aea054d2012e58b7d048dd6550a9a41:/ITByteStream.m diff --git a/ITByteStream.m b/ITByteStream.m index e868008..e4607b4 100755 --- a/ITByteStream.m +++ b/ITByteStream.m @@ -8,7 +8,7 @@ #import "ITByteStream.h" -// TODO: Add NSCopying/NSCoding support. Blocking reads (how would this work? I could hack it with socketpair(), i guess) +// TODO: Add NSCopying/NSCoding support. Blocking reads (how would this work? NSConditionLock?) @implementation ITByteStream -(id) init @@ -17,53 +17,109 @@ { data = [[NSMutableData alloc] init]; lock = [[NSLock alloc] init]; + delegate = nil; } return self; } --(id) initWithStream:(ITByteStream*)stream +-(id) initWithDelegate:(id)d +{ + if (self == [super init]) + { + data = [[NSMutableData alloc] init]; + lock = [[NSLock alloc] init]; + delegate = [d retain]; + } + return self; +} + +-(id) initWithStream:(ITByteStream*)stream delegate:(id)d { if (self == [super init]) { data = [stream->data copy]; lock = [[NSLock alloc] init]; + delegate = [d retain]; } return 0; } --(void) dealloc +-(oneway void) dealloc { + [lock lock]; [data release]; + [lock unlock]; [lock release]; [super dealloc]; } +-setDelegate:(id )d +{ + id old = delegate; + [delegate release]; + delegate = [d retain]; + return old; +} + -(int) availableDataLength { - return [data length]; + int len; + [lock lock]; + len = [data length]; + [lock unlock]; + return len; } -(NSData*) readDataOfLength:(int)length { - NSData *ret, *tmp; + NSData *ret; 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. -#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... -#endif + [data replaceBytesInRange:range withBytes:nil length:0]; [lock unlock]; return ret; } --(void) writeData:(NSData*)_data +-(NSData*) readAllData +{ + NSData *ret; + [lock lock]; + ret = [data autorelease]; + data = [[NSMutableData alloc] init]; + [lock unlock]; + return ret; +} + +-(void) writeData:(in NSData*)_data { [lock lock]; [data appendData:_data]; [lock unlock]; + [delegate newDataAdded:self]; +} + +-(void) writeBytes:(in char *)b len:(long)length +{ + [lock lock]; + [data appendBytes:b length:length]; + [lock unlock]; + [delegate newDataAdded:self]; +} + +-(void) lockStream +{ + [lock lock]; +} + +-(void) unlockStream +{ + [lock unlock]; +} + +-(void) shortenData:(long)length +{ + NSRange range = {0, length}; + [data replaceBytesInRange:range withBytes:nil length:0]; } @end