|  | #import "TNSStreamTransport.h" | 
|  |  | 
|  | @implementation TNSStreamTransport | 
|  |  | 
|  | - (id) initWithInputStream: (NSInputStream *) input | 
|  | outputStream: (NSOutputStream *) output | 
|  | { | 
|  | [super init]; | 
|  | mInput = [input retain]; | 
|  | mOutput = [output retain]; | 
|  | return self; | 
|  | } | 
|  |  | 
|  | - (id) initWithInputStream: (NSInputStream *) input | 
|  | { | 
|  | return [self initWithInputStream: input outputStream: nil]; | 
|  | } | 
|  |  | 
|  | - (id) initWithOutputStream: (NSOutputStream *) output | 
|  | { | 
|  | return [self initWithInputStream: nil outputStream: output]; | 
|  | } | 
|  |  | 
|  |  | 
|  | - (int) readAll: (uint8_t *) buf offset: (int) off length: (int) len | 
|  | { | 
|  | int got = 0; | 
|  | int ret = 0; | 
|  | while (got < len) { | 
|  | ret = [mInput read: buf+off+got maxLength: len-got]; | 
|  | if (ret <= 0) { | 
|  | @throw [NSException exceptionWithName: @"TTransportException" | 
|  | reason: @"Cannot read. Remote side has closed." | 
|  | userInfo: nil]; | 
|  | } | 
|  | got += ret; | 
|  | } | 
|  | return got; | 
|  | } | 
|  |  | 
|  |  | 
|  | - (void) write: (uint8_t *) data offset: (unsigned int) offset length: (unsigned int) length | 
|  | { | 
|  | int result = [mOutput write: data+offset maxLength: length]; | 
|  | if (result == -1) { | 
|  | NSDictionary * errorInfo = [NSDictionary dictionaryWithObject: [mOutput streamError] | 
|  | forKey: @"error"]; | 
|  | @throw [NSException exceptionWithName: @"TTransportException" | 
|  | reason: [NSString stringWithFormat: @"Error writing to transport output stream (%@).", [mOutput streamError]] | 
|  | userInfo: errorInfo]; | 
|  | } else if (result == 0) { | 
|  | @throw [NSException exceptionWithName: @"TTransportException" | 
|  | reason: @"End of output stream." | 
|  | userInfo: nil]; | 
|  | } else if (result != length) { | 
|  | @throw [NSException exceptionWithName: @"TTransportException" | 
|  | reason: @"Output stream did not write all of our data." | 
|  | userInfo: nil]; | 
|  | } | 
|  | } | 
|  |  | 
|  | - (void) flush | 
|  | { | 
|  | // no flush for you! | 
|  | } | 
|  |  | 
|  | @end |