blob: 8130a8b580df25f4a13dff5e83da054edaff9013 [file] [log] [blame]
#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