home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Examples / Foundation / TCPTransport / DataStream.m < prev    next >
Text File  |  1996-04-17  |  2KB  |  87 lines

  1. /* DataStream.m created by blaine on Wed 03-Apr-1996 */
  2.  
  3. #import "DataStream.h"
  4.  
  5.  
  6. @implementation DataStream
  7.  
  8. - init {
  9.     array = [[NSMutableArray alloc] init];
  10.     return self;
  11. }
  12.  
  13. - (void)dealloc {
  14.     [array release];
  15.     [super dealloc];
  16. }
  17.  
  18. - (void)appendData:(NSData *)item {
  19.     if (!item) {
  20.     NSLog(@"***no data item to append!!!!");
  21.         return;
  22.     }
  23.     [array addObject:item];
  24.     length += [item length];
  25.     //NSLog(@"appended %u bytes, length now %u", [item length], length);
  26. }
  27.  
  28. - (unsigned int)length {
  29.     return length;
  30. }
  31.  
  32. - (BOOL)getBytes:(void *)bytes length:(unsigned)len {
  33.     //NSLog(@"getting %u bytes, length %u", len, length);
  34.     if (len > length) return NO;
  35.     while (len) {
  36.         NSData *first = [array objectAtIndex:0];
  37.     unsigned firstLen = [first length];
  38.     unsigned available = firstLen - offset;
  39.     
  40.     if (available < len) {
  41.         memmove(bytes, (void *)[first bytes] + offset, available);
  42.         offset = 0;
  43.         [array removeObjectAtIndex:0];
  44.         bytes += available;
  45.         length -= available;
  46.         len -= available;
  47.     }
  48.     else {
  49.         memmove(bytes, (void *)[first bytes] + offset, len);
  50.         length -= len;
  51.         offset += len;
  52.         len -= len;
  53.         if (offset == firstLen) {
  54.         offset = 0;
  55.         [array removeObjectAtIndex:0];
  56.         }
  57.     }
  58.     }
  59.     return YES;
  60. }
  61.  
  62. - (void)fillData:(NSMutableData *)data length:(unsigned)len {
  63.  
  64.     //NSLog(@"filling %u bytes, length %u", len, length);
  65.     if (len > length)
  66.         [NSException raise:NSInvalidArgumentException format:@"asking for too much data"];
  67.     while (len) {
  68.         NSData *first = [array objectAtIndex:0];
  69.         unsigned firstLen = [first length];
  70.         unsigned available = firstLen - offset;
  71.  
  72.         if (available > len)
  73.             available = len;
  74.         [data appendBytes:[first bytes] + offset length:available];
  75.         len -= available;
  76.         offset += available;
  77.         length -= available;
  78.         if (offset >= firstLen) {
  79.             [array removeObjectAtIndex:0];
  80.             offset = 0;
  81.         }
  82.     }
  83. }
  84.  
  85. @end
  86.         
  87.