More work on ITAppleEventTools and also fix a compiler warning
[ITFoundation.git] / ITByteStream.m
index e868008..664e1a0 100755 (executable)
@@ -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
           {
           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 <DataReciever>)d
+{
+    id old = delegate;
+    [delegate release];
+    delegate = [d retain];
+    return old;
+}
+
+-delegate
+{
+    return delegate;
+}
+
 -(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;
+}
+
+-(NSData*) readAllData
+{
+    NSData *ret;
+    [lock lock];
+    ret = [data autorelease];
+    data = [[NSMutableData alloc] init];
     [lock unlock];
     return ret;
 }
 
--(void) writeData:(NSData*)_data
+-(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