/**
 * Autogenerated by Thrift
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 */

#import <Cocoa/Cocoa.h>

#import <TProtocol.h>
#import <TApplicationException.h>
#import <TProtocolUtil.h>


#import "hadoopfs.h"


@implementation hadoopfsConstants
+ (void) initialize {
}
@end

@implementation ThriftHandle
- (id) initWithId: (int64_t) id
{
  self = [super init];
  __id = id;
  __id_isset = YES;
  return self;
}

- (void) dealloc
{
  [super dealloc];
}

- (int64_t) id {
  return __id;
}

- (void) setId: (int64_t) id {
  __id = id;
  __id_isset = YES;
}

- (BOOL) idIsSet {
  return __id_isset;
}

- (void) unsetId {
  __id_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case -1:
        if (fieldType == TType_I64) {
          int64_t fieldValue = [inProtocol readI64];
          [self setId: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"ThriftHandle"];
  if (__id_isset) {
    [outProtocol writeFieldBeginWithName: @"id" type: TType_I64 fieldID: -1];
    [outProtocol writeI64: __id];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"ThriftHandle("];
  [ms appendString: @"id:"];
  [ms appendFormat: @"%qi", __id];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@implementation Pathname
- (id) initWithPathname: (NSString *) pathname
{
  self = [super init];
  __pathname = [pathname retain];
  __pathname_isset = YES;
  return self;
}

- (void) dealloc
{
  [__pathname release];
  [super dealloc];
}

- (NSString *) pathname {
  return [[__pathname retain] autorelease];
}

- (void) setPathname: (NSString *) pathname {
  [pathname retain];
  [__pathname release];
  __pathname = pathname;
  __pathname_isset = YES;
}

- (BOOL) pathnameIsSet {
  return __pathname_isset;
}

- (void) unsetPathname {
  [__pathname release];
  __pathname = nil;
  __pathname_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case -1:
        if (fieldType == TType_STRING) {
          NSString * fieldValue = [inProtocol readString];
          [self setPathname: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"Pathname"];
  if (__pathname_isset) {
    if (__pathname != nil) {
      [outProtocol writeFieldBeginWithName: @"pathname" type: TType_STRING fieldID: -1];
      [outProtocol writeString: __pathname];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"Pathname("];
  [ms appendString: @"pathname:"];
  [ms appendFormat: @"\"%@\"", __pathname];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@implementation FileStatus
- (id) initWithPath: (NSString *) path length: (int64_t) length isdir: (BOOL) isdir block_replication: (int16_t) block_replication blocksize: (int64_t) blocksize modification_time: (int64_t) modification_time permission: (NSString *) permission owner: (NSString *) owner group: (NSString *) group
{
  self = [super init];
  __path = [path retain];
  __path_isset = YES;
  __length = length;
  __length_isset = YES;
  __isdir = isdir;
  __isdir_isset = YES;
  __block_replication = block_replication;
  __block_replication_isset = YES;
  __blocksize = blocksize;
  __blocksize_isset = YES;
  __modification_time = modification_time;
  __modification_time_isset = YES;
  __permission = [permission retain];
  __permission_isset = YES;
  __owner = [owner retain];
  __owner_isset = YES;
  __group = [group retain];
  __group_isset = YES;
  return self;
}

- (void) dealloc
{
  [__path release];
  [__permission release];
  [__owner release];
  [__group release];
  [super dealloc];
}

- (NSString *) path {
  return [[__path retain] autorelease];
}

- (void) setPath: (NSString *) path {
  [path retain];
  [__path release];
  __path = path;
  __path_isset = YES;
}

- (BOOL) pathIsSet {
  return __path_isset;
}

- (void) unsetPath {
  [__path release];
  __path = nil;
  __path_isset = NO;
}

- (int64_t) length {
  return __length;
}

- (void) setLength: (int64_t) length {
  __length = length;
  __length_isset = YES;
}

- (BOOL) lengthIsSet {
  return __length_isset;
}

- (void) unsetLength {
  __length_isset = NO;
}

- (BOOL) isdir {
  return __isdir;
}

- (void) setIsdir: (BOOL) isdir {
  __isdir = isdir;
  __isdir_isset = YES;
}

- (BOOL) isdirIsSet {
  return __isdir_isset;
}

- (void) unsetIsdir {
  __isdir_isset = NO;
}

- (int16_t) block_replication {
  return __block_replication;
}

- (void) setBlock_replication: (int16_t) block_replication {
  __block_replication = block_replication;
  __block_replication_isset = YES;
}

- (BOOL) block_replicationIsSet {
  return __block_replication_isset;
}

- (void) unsetBlock_replication {
  __block_replication_isset = NO;
}

- (int64_t) blocksize {
  return __blocksize;
}

- (void) setBlocksize: (int64_t) blocksize {
  __blocksize = blocksize;
  __blocksize_isset = YES;
}

- (BOOL) blocksizeIsSet {
  return __blocksize_isset;
}

- (void) unsetBlocksize {
  __blocksize_isset = NO;
}

- (int64_t) modification_time {
  return __modification_time;
}

- (void) setModification_time: (int64_t) modification_time {
  __modification_time = modification_time;
  __modification_time_isset = YES;
}

- (BOOL) modification_timeIsSet {
  return __modification_time_isset;
}

- (void) unsetModification_time {
  __modification_time_isset = NO;
}

- (NSString *) permission {
  return [[__permission retain] autorelease];
}

- (void) setPermission: (NSString *) permission {
  [permission retain];
  [__permission release];
  __permission = permission;
  __permission_isset = YES;
}

- (BOOL) permissionIsSet {
  return __permission_isset;
}

- (void) unsetPermission {
  [__permission release];
  __permission = nil;
  __permission_isset = NO;
}

- (NSString *) owner {
  return [[__owner retain] autorelease];
}

- (void) setOwner: (NSString *) owner {
  [owner retain];
  [__owner release];
  __owner = owner;
  __owner_isset = YES;
}

- (BOOL) ownerIsSet {
  return __owner_isset;
}

- (void) unsetOwner {
  [__owner release];
  __owner = nil;
  __owner_isset = NO;
}

- (NSString *) group {
  return [[__group retain] autorelease];
}

- (void) setGroup: (NSString *) group {
  [group retain];
  [__group release];
  __group = group;
  __group_isset = YES;
}

- (BOOL) groupIsSet {
  return __group_isset;
}

- (void) unsetGroup {
  [__group release];
  __group = nil;
  __group_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 1:
        if (fieldType == TType_STRING) {
          NSString * fieldValue = [inProtocol readString];
          [self setPath: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 2:
        if (fieldType == TType_I64) {
          int64_t fieldValue = [inProtocol readI64];
          [self setLength: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 3:
        if (fieldType == TType_BOOL) {
          BOOL fieldValue = [inProtocol readBool];
          [self setIsdir: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 4:
        if (fieldType == TType_I16) {
          int16_t fieldValue = [inProtocol readI16];
          [self setBlock_replication: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 5:
        if (fieldType == TType_I64) {
          int64_t fieldValue = [inProtocol readI64];
          [self setBlocksize: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 6:
        if (fieldType == TType_I64) {
          int64_t fieldValue = [inProtocol readI64];
          [self setModification_time: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 7:
        if (fieldType == TType_STRING) {
          NSString * fieldValue = [inProtocol readString];
          [self setPermission: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 8:
        if (fieldType == TType_STRING) {
          NSString * fieldValue = [inProtocol readString];
          [self setOwner: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 9:
        if (fieldType == TType_STRING) {
          NSString * fieldValue = [inProtocol readString];
          [self setGroup: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"FileStatus"];
  if (__path_isset) {
    if (__path != nil) {
      [outProtocol writeFieldBeginWithName: @"path" type: TType_STRING fieldID: 1];
      [outProtocol writeString: __path];
      [outProtocol writeFieldEnd];
    }
  }
  if (__length_isset) {
    [outProtocol writeFieldBeginWithName: @"length" type: TType_I64 fieldID: 2];
    [outProtocol writeI64: __length];
    [outProtocol writeFieldEnd];
  }
  if (__isdir_isset) {
    [outProtocol writeFieldBeginWithName: @"isdir" type: TType_BOOL fieldID: 3];
    [outProtocol writeBool: __isdir];
    [outProtocol writeFieldEnd];
  }
  if (__block_replication_isset) {
    [outProtocol writeFieldBeginWithName: @"block_replication" type: TType_I16 fieldID: 4];
    [outProtocol writeI16: __block_replication];
    [outProtocol writeFieldEnd];
  }
  if (__blocksize_isset) {
    [outProtocol writeFieldBeginWithName: @"blocksize" type: TType_I64 fieldID: 5];
    [outProtocol writeI64: __blocksize];
    [outProtocol writeFieldEnd];
  }
  if (__modification_time_isset) {
    [outProtocol writeFieldBeginWithName: @"modification_time" type: TType_I64 fieldID: 6];
    [outProtocol writeI64: __modification_time];
    [outProtocol writeFieldEnd];
  }
  if (__permission_isset) {
    if (__permission != nil) {
      [outProtocol writeFieldBeginWithName: @"permission" type: TType_STRING fieldID: 7];
      [outProtocol writeString: __permission];
      [outProtocol writeFieldEnd];
    }
  }
  if (__owner_isset) {
    if (__owner != nil) {
      [outProtocol writeFieldBeginWithName: @"owner" type: TType_STRING fieldID: 8];
      [outProtocol writeString: __owner];
      [outProtocol writeFieldEnd];
    }
  }
  if (__group_isset) {
    if (__group != nil) {
      [outProtocol writeFieldBeginWithName: @"group" type: TType_STRING fieldID: 9];
      [outProtocol writeString: __group];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"FileStatus("];
  [ms appendString: @"path:"];
  [ms appendFormat: @"\"%@\"", __path];
  [ms appendString: @",length:"];
  [ms appendFormat: @"%qi", __length];
  [ms appendString: @",isdir:"];
  [ms appendFormat: @"%i", __isdir];
  [ms appendString: @",block_replication:"];
  [ms appendFormat: @"%hi", __block_replication];
  [ms appendString: @",blocksize:"];
  [ms appendFormat: @"%qi", __blocksize];
  [ms appendString: @",modification_time:"];
  [ms appendFormat: @"%qi", __modification_time];
  [ms appendString: @",permission:"];
  [ms appendFormat: @"\"%@\"", __permission];
  [ms appendString: @",owner:"];
  [ms appendFormat: @"\"%@\"", __owner];
  [ms appendString: @",group:"];
  [ms appendFormat: @"\"%@\"", __group];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@implementation BlockLocation
- (id) initWithHosts: (NSArray *) hosts names: (NSArray *) names offset: (int64_t) offset length: (int64_t) length
{
  self = [super init];
  __hosts = [hosts retain];
  __hosts_isset = YES;
  __names = [names retain];
  __names_isset = YES;
  __offset = offset;
  __offset_isset = YES;
  __length = length;
  __length_isset = YES;
  return self;
}

- (void) dealloc
{
  [__hosts release];
  [__names release];
  [super dealloc];
}

- (NSArray *) hosts {
  return [[__hosts retain] autorelease];
}

- (void) setHosts: (NSArray *) hosts {
  [hosts retain];
  [__hosts release];
  __hosts = hosts;
  __hosts_isset = YES;
}

- (BOOL) hostsIsSet {
  return __hosts_isset;
}

- (void) unsetHosts {
  [__hosts release];
  __hosts = nil;
  __hosts_isset = NO;
}

- (NSArray *) names {
  return [[__names retain] autorelease];
}

- (void) setNames: (NSArray *) names {
  [names retain];
  [__names release];
  __names = names;
  __names_isset = YES;
}

- (BOOL) namesIsSet {
  return __names_isset;
}

- (void) unsetNames {
  [__names release];
  __names = nil;
  __names_isset = NO;
}

- (int64_t) offset {
  return __offset;
}

- (void) setOffset: (int64_t) offset {
  __offset = offset;
  __offset_isset = YES;
}

- (BOOL) offsetIsSet {
  return __offset_isset;
}

- (void) unsetOffset {
  __offset_isset = NO;
}

- (int64_t) length {
  return __length;
}

- (void) setLength: (int64_t) length {
  __length = length;
  __length_isset = YES;
}

- (BOOL) lengthIsSet {
  return __length_isset;
}

- (void) unsetLength {
  __length_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 1:
        if (fieldType == TType_LIST) {
          int _size0;
          [inProtocol readListBeginReturningElementType: NULL size: &_size0];
          NSMutableArray * fieldValue = [[NSMutableArray alloc] initWithCapacity: _size0];
          int _i1;
          for (_i1 = 0; _i1 < _size0; ++_i1)
          {
            NSString * _elem2 = [inProtocol readString];
            [fieldValue addObject: _elem2];
          }
          [inProtocol readListEnd];
          [self setHosts: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 2:
        if (fieldType == TType_LIST) {
          int _size3;
          [inProtocol readListBeginReturningElementType: NULL size: &_size3];
          NSMutableArray * fieldValue = [[NSMutableArray alloc] initWithCapacity: _size3];
          int _i4;
          for (_i4 = 0; _i4 < _size3; ++_i4)
          {
            NSString * _elem5 = [inProtocol readString];
            [fieldValue addObject: _elem5];
          }
          [inProtocol readListEnd];
          [self setNames: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 3:
        if (fieldType == TType_I64) {
          int64_t fieldValue = [inProtocol readI64];
          [self setOffset: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 4:
        if (fieldType == TType_I64) {
          int64_t fieldValue = [inProtocol readI64];
          [self setLength: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"BlockLocation"];
  if (__hosts_isset) {
    if (__hosts != nil) {
      [outProtocol writeFieldBeginWithName: @"hosts" type: TType_LIST fieldID: 1];
      {
        [outProtocol writeListBeginWithElementType: TType_STRING size: [__hosts count]];
        int i7;
        for (i7 = 0; i7 < [__hosts count]; i7++)
        {
          [outProtocol writeString: [__hosts objectAtIndex: i7]];
        }
        [outProtocol writeListEnd];
      }
      [outProtocol writeFieldEnd];
    }
  }
  if (__names_isset) {
    if (__names != nil) {
      [outProtocol writeFieldBeginWithName: @"names" type: TType_LIST fieldID: 2];
      {
        [outProtocol writeListBeginWithElementType: TType_STRING size: [__names count]];
        int i9;
        for (i9 = 0; i9 < [__names count]; i9++)
        {
          [outProtocol writeString: [__names objectAtIndex: i9]];
        }
        [outProtocol writeListEnd];
      }
      [outProtocol writeFieldEnd];
    }
  }
  if (__offset_isset) {
    [outProtocol writeFieldBeginWithName: @"offset" type: TType_I64 fieldID: 3];
    [outProtocol writeI64: __offset];
    [outProtocol writeFieldEnd];
  }
  if (__length_isset) {
    [outProtocol writeFieldBeginWithName: @"length" type: TType_I64 fieldID: 4];
    [outProtocol writeI64: __length];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"BlockLocation("];
  [ms appendString: @"hosts:"];
  [ms appendFormat: @"%@", __hosts];
  [ms appendString: @",names:"];
  [ms appendFormat: @"%@", __names];
  [ms appendString: @",offset:"];
  [ms appendFormat: @"%qi", __offset];
  [ms appendString: @",length:"];
  [ms appendFormat: @"%qi", __length];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@implementation MalformedInputException
- (id) init
{
  return [super initWithName: @"MalformedInputException" reason: @"unknown" userInfo: nil];
}
- (id) initWithMessage: (NSString *) message
{
  self = [self init];
  __message = [message retain];
  __message_isset = YES;
  return self;
}

- (void) dealloc
{
  [__message release];
  [super dealloc];
}

- (NSString *) message {
  return [[__message retain] autorelease];
}

- (void) setMessage: (NSString *) message {
  [message retain];
  [__message release];
  __message = message;
  __message_isset = YES;
}

- (BOOL) messageIsSet {
  return __message_isset;
}

- (void) unsetMessage {
  [__message release];
  __message = nil;
  __message_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case -1:
        if (fieldType == TType_STRING) {
          NSString * fieldValue = [inProtocol readString];
          [self setMessage: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"MalformedInputException"];
  if (__message_isset) {
    if (__message != nil) {
      [outProtocol writeFieldBeginWithName: @"message" type: TType_STRING fieldID: -1];
      [outProtocol writeString: __message];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"MalformedInputException("];
  [ms appendString: @"message:"];
  [ms appendFormat: @"\"%@\"", __message];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@implementation ThriftIOException
- (id) init
{
  return [super initWithName: @"ThriftIOException" reason: @"unknown" userInfo: nil];
}
- (id) initWithMessage: (NSString *) message
{
  self = [self init];
  __message = [message retain];
  __message_isset = YES;
  return self;
}

- (void) dealloc
{
  [__message release];
  [super dealloc];
}

- (NSString *) message {
  return [[__message retain] autorelease];
}

- (void) setMessage: (NSString *) message {
  [message retain];
  [__message release];
  __message = message;
  __message_isset = YES;
}

- (BOOL) messageIsSet {
  return __message_isset;
}

- (void) unsetMessage {
  [__message release];
  __message = nil;
  __message_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case -1:
        if (fieldType == TType_STRING) {
          NSString * fieldValue = [inProtocol readString];
          [self setMessage: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"ThriftIOException"];
  if (__message_isset) {
    if (__message != nil) {
      [outProtocol writeFieldBeginWithName: @"message" type: TType_STRING fieldID: -1];
      [outProtocol writeString: __message];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"ThriftIOException("];
  [ms appendString: @"message:"];
  [ms appendFormat: @"\"%@\"", __message];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface SetInactivityTimeoutPeriodResult_ : NSObject {
}


- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

@end

@implementation SetInactivityTimeoutPeriodResult_
- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"SetInactivityTimeoutPeriodResult_"];

  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"SetInactivityTimeoutPeriodResult_("];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface ShutdownResult_ : NSObject {
}


- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

@end

@implementation ShutdownResult_
- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"ShutdownResult_"];

  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"ShutdownResult_("];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface CreateResult_ : NSObject {
  ThriftHandle * __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (ThriftHandle *) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (ThriftHandle *) success;
- (void) setSuccess: (ThriftHandle *) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation CreateResult_
- (id) initWithSuccess: (ThriftHandle *) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = [success retain];
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__success release];
  [__ouch release];
  [super dealloc];
}

- (ThriftHandle *) success {
  return [[__success retain] autorelease];
}

- (void) setSuccess: (ThriftHandle *) success {
  [success retain];
  [__success release];
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  [__success release];
  __success = nil;
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_STRUCT) {
          ThriftHandle *fieldValue = [[ThriftHandle alloc] init];
          [fieldValue read: inProtocol];
          [self setSuccess: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"CreateResult_"];

  if (__success_isset) {
    if (__success != nil) {
      [outProtocol writeFieldBeginWithName: @"success" type: TType_STRUCT fieldID: 0];
      [__success write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"CreateResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%@", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface CreateFileResult_ : NSObject {
  ThriftHandle * __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (ThriftHandle *) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (ThriftHandle *) success;
- (void) setSuccess: (ThriftHandle *) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation CreateFileResult_
- (id) initWithSuccess: (ThriftHandle *) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = [success retain];
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__success release];
  [__ouch release];
  [super dealloc];
}

- (ThriftHandle *) success {
  return [[__success retain] autorelease];
}

- (void) setSuccess: (ThriftHandle *) success {
  [success retain];
  [__success release];
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  [__success release];
  __success = nil;
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_STRUCT) {
          ThriftHandle *fieldValue = [[ThriftHandle alloc] init];
          [fieldValue read: inProtocol];
          [self setSuccess: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"CreateFileResult_"];

  if (__success_isset) {
    if (__success != nil) {
      [outProtocol writeFieldBeginWithName: @"success" type: TType_STRUCT fieldID: 0];
      [__success write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"CreateFileResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%@", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface OpenResult_ : NSObject {
  ThriftHandle * __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (ThriftHandle *) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (ThriftHandle *) success;
- (void) setSuccess: (ThriftHandle *) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation OpenResult_
- (id) initWithSuccess: (ThriftHandle *) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = [success retain];
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__success release];
  [__ouch release];
  [super dealloc];
}

- (ThriftHandle *) success {
  return [[__success retain] autorelease];
}

- (void) setSuccess: (ThriftHandle *) success {
  [success retain];
  [__success release];
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  [__success release];
  __success = nil;
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_STRUCT) {
          ThriftHandle *fieldValue = [[ThriftHandle alloc] init];
          [fieldValue read: inProtocol];
          [self setSuccess: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"OpenResult_"];

  if (__success_isset) {
    if (__success != nil) {
      [outProtocol writeFieldBeginWithName: @"success" type: TType_STRUCT fieldID: 0];
      [__success write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"OpenResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%@", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface AppendResult_ : NSObject {
  ThriftHandle * __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (ThriftHandle *) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (ThriftHandle *) success;
- (void) setSuccess: (ThriftHandle *) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation AppendResult_
- (id) initWithSuccess: (ThriftHandle *) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = [success retain];
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__success release];
  [__ouch release];
  [super dealloc];
}

- (ThriftHandle *) success {
  return [[__success retain] autorelease];
}

- (void) setSuccess: (ThriftHandle *) success {
  [success retain];
  [__success release];
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  [__success release];
  __success = nil;
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_STRUCT) {
          ThriftHandle *fieldValue = [[ThriftHandle alloc] init];
          [fieldValue read: inProtocol];
          [self setSuccess: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"AppendResult_"];

  if (__success_isset) {
    if (__success != nil) {
      [outProtocol writeFieldBeginWithName: @"success" type: TType_STRUCT fieldID: 0];
      [__success write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"AppendResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%@", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface WriteResult_ : NSObject {
  BOOL __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (BOOL) success;
- (void) setSuccess: (BOOL) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation WriteResult_
- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = success;
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__ouch release];
  [super dealloc];
}

- (BOOL) success {
  return __success;
}

- (void) setSuccess: (BOOL) success {
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_BOOL) {
          BOOL fieldValue = [inProtocol readBool];
          [self setSuccess: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"WriteResult_"];

  if (__success_isset) {
    [outProtocol writeFieldBeginWithName: @"success" type: TType_BOOL fieldID: 0];
    [outProtocol writeBool: __success];
    [outProtocol writeFieldEnd];
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"WriteResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%i", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface ReadResult_ : NSObject {
  NSString * __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (NSString *) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (NSString *) success;
- (void) setSuccess: (NSString *) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation ReadResult_
- (id) initWithSuccess: (NSString *) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = [success retain];
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__success release];
  [__ouch release];
  [super dealloc];
}

- (NSString *) success {
  return [[__success retain] autorelease];
}

- (void) setSuccess: (NSString *) success {
  [success retain];
  [__success release];
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  [__success release];
  __success = nil;
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_STRING) {
          NSString * fieldValue = [inProtocol readString];
          [self setSuccess: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"ReadResult_"];

  if (__success_isset) {
    if (__success != nil) {
      [outProtocol writeFieldBeginWithName: @"success" type: TType_STRING fieldID: 0];
      [outProtocol writeString: __success];
      [outProtocol writeFieldEnd];
    }
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"ReadResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"\"%@\"", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface CloseResult_ : NSObject {
  BOOL __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (BOOL) success;
- (void) setSuccess: (BOOL) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation CloseResult_
- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = success;
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__ouch release];
  [super dealloc];
}

- (BOOL) success {
  return __success;
}

- (void) setSuccess: (BOOL) success {
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_BOOL) {
          BOOL fieldValue = [inProtocol readBool];
          [self setSuccess: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"CloseResult_"];

  if (__success_isset) {
    [outProtocol writeFieldBeginWithName: @"success" type: TType_BOOL fieldID: 0];
    [outProtocol writeBool: __success];
    [outProtocol writeFieldEnd];
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"CloseResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%i", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface RmResult_ : NSObject {
  BOOL __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (BOOL) success;
- (void) setSuccess: (BOOL) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation RmResult_
- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = success;
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__ouch release];
  [super dealloc];
}

- (BOOL) success {
  return __success;
}

- (void) setSuccess: (BOOL) success {
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_BOOL) {
          BOOL fieldValue = [inProtocol readBool];
          [self setSuccess: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"RmResult_"];

  if (__success_isset) {
    [outProtocol writeFieldBeginWithName: @"success" type: TType_BOOL fieldID: 0];
    [outProtocol writeBool: __success];
    [outProtocol writeFieldEnd];
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"RmResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%i", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface RenameResult_ : NSObject {
  BOOL __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (BOOL) success;
- (void) setSuccess: (BOOL) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation RenameResult_
- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = success;
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__ouch release];
  [super dealloc];
}

- (BOOL) success {
  return __success;
}

- (void) setSuccess: (BOOL) success {
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_BOOL) {
          BOOL fieldValue = [inProtocol readBool];
          [self setSuccess: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"RenameResult_"];

  if (__success_isset) {
    [outProtocol writeFieldBeginWithName: @"success" type: TType_BOOL fieldID: 0];
    [outProtocol writeBool: __success];
    [outProtocol writeFieldEnd];
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"RenameResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%i", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface MkdirsResult_ : NSObject {
  BOOL __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (BOOL) success;
- (void) setSuccess: (BOOL) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation MkdirsResult_
- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = success;
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__ouch release];
  [super dealloc];
}

- (BOOL) success {
  return __success;
}

- (void) setSuccess: (BOOL) success {
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_BOOL) {
          BOOL fieldValue = [inProtocol readBool];
          [self setSuccess: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"MkdirsResult_"];

  if (__success_isset) {
    [outProtocol writeFieldBeginWithName: @"success" type: TType_BOOL fieldID: 0];
    [outProtocol writeBool: __success];
    [outProtocol writeFieldEnd];
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"MkdirsResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%i", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface ExistsResult_ : NSObject {
  BOOL __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (BOOL) success;
- (void) setSuccess: (BOOL) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation ExistsResult_
- (id) initWithSuccess: (BOOL) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = success;
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__ouch release];
  [super dealloc];
}

- (BOOL) success {
  return __success;
}

- (void) setSuccess: (BOOL) success {
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_BOOL) {
          BOOL fieldValue = [inProtocol readBool];
          [self setSuccess: fieldValue];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"ExistsResult_"];

  if (__success_isset) {
    [outProtocol writeFieldBeginWithName: @"success" type: TType_BOOL fieldID: 0];
    [outProtocol writeBool: __success];
    [outProtocol writeFieldEnd];
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"ExistsResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%i", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface StatResult_ : NSObject {
  FileStatus * __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (FileStatus *) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (FileStatus *) success;
- (void) setSuccess: (FileStatus *) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation StatResult_
- (id) initWithSuccess: (FileStatus *) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = [success retain];
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__success release];
  [__ouch release];
  [super dealloc];
}

- (FileStatus *) success {
  return [[__success retain] autorelease];
}

- (void) setSuccess: (FileStatus *) success {
  [success retain];
  [__success release];
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  [__success release];
  __success = nil;
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_STRUCT) {
          FileStatus *fieldValue = [[FileStatus alloc] init];
          [fieldValue read: inProtocol];
          [self setSuccess: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"StatResult_"];

  if (__success_isset) {
    if (__success != nil) {
      [outProtocol writeFieldBeginWithName: @"success" type: TType_STRUCT fieldID: 0];
      [__success write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"StatResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%@", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface ListStatusResult_ : NSObject {
  NSArray * __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (NSArray *) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (NSArray *) success;
- (void) setSuccess: (NSArray *) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation ListStatusResult_
- (id) initWithSuccess: (NSArray *) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = [success retain];
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__success release];
  [__ouch release];
  [super dealloc];
}

- (NSArray *) success {
  return [[__success retain] autorelease];
}

- (void) setSuccess: (NSArray *) success {
  [success retain];
  [__success release];
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  [__success release];
  __success = nil;
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_LIST) {
          int _size10;
          [inProtocol readListBeginReturningElementType: NULL size: &_size10];
          NSMutableArray * fieldValue = [[NSMutableArray alloc] initWithCapacity: _size10];
          int _i11;
          for (_i11 = 0; _i11 < _size10; ++_i11)
          {
            FileStatus *_elem12 = [[FileStatus alloc] init];
            [_elem12 read: inProtocol];
            [fieldValue addObject: _elem12];
          }
          [inProtocol readListEnd];
          [self setSuccess: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"ListStatusResult_"];

  if (__success_isset) {
    if (__success != nil) {
      [outProtocol writeFieldBeginWithName: @"success" type: TType_LIST fieldID: 0];
      {
        [outProtocol writeListBeginWithElementType: TType_STRUCT size: [__success count]];
        int i14;
        for (i14 = 0; i14 < [__success count]; i14++)
        {
          [[__success objectAtIndex: i14] write: outProtocol];
        }
        [outProtocol writeListEnd];
      }
      [outProtocol writeFieldEnd];
    }
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"ListStatusResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%@", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface ChmodResult_ : NSObject {
  ThriftIOException * __ouch;

  BOOL __ouch_isset;
}

- (id) initWithOuch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation ChmodResult_
- (id) initWithOuch: (ThriftIOException *) ouch
{
  self = [super init];
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__ouch release];
  [super dealloc];
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"ChmodResult_"];

  if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"ChmodResult_("];
  [ms appendString: @"ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface ChownResult_ : NSObject {
  ThriftIOException * __ouch;

  BOOL __ouch_isset;
}

- (id) initWithOuch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation ChownResult_
- (id) initWithOuch: (ThriftIOException *) ouch
{
  self = [super init];
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__ouch release];
  [super dealloc];
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"ChownResult_"];

  if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"ChownResult_("];
  [ms appendString: @"ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface SetReplicationResult_ : NSObject {
  ThriftIOException * __ouch;

  BOOL __ouch_isset;
}

- (id) initWithOuch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation SetReplicationResult_
- (id) initWithOuch: (ThriftIOException *) ouch
{
  self = [super init];
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__ouch release];
  [super dealloc];
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"SetReplicationResult_"];

  if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"SetReplicationResult_("];
  [ms appendString: @"ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@interface GetFileBlockLocationsResult_ : NSObject {
  NSArray * __success;
  ThriftIOException * __ouch;

  BOOL __success_isset;
  BOOL __ouch_isset;
}

- (id) initWithSuccess: (NSArray *) success ouch: (ThriftIOException *) ouch;

- (void) read: (id <TProtocol>) inProtocol;
- (void) write: (id <TProtocol>) outProtocol;

- (NSArray *) success;
- (void) setSuccess: (NSArray *) success;
- (BOOL) successIsSet;

- (ThriftIOException *) ouch;
- (void) setOuch: (ThriftIOException *) ouch;
- (BOOL) ouchIsSet;

@end

@implementation GetFileBlockLocationsResult_
- (id) initWithSuccess: (NSArray *) success ouch: (ThriftIOException *) ouch
{
  self = [super init];
  __success = [success retain];
  __success_isset = YES;
  __ouch = [ouch retain];
  __ouch_isset = YES;
  return self;
}

- (void) dealloc
{
  [__success release];
  [__ouch release];
  [super dealloc];
}

- (NSArray *) success {
  return [[__success retain] autorelease];
}

- (void) setSuccess: (NSArray *) success {
  [success retain];
  [__success release];
  __success = success;
  __success_isset = YES;
}

- (BOOL) successIsSet {
  return __success_isset;
}

- (void) unsetSuccess {
  [__success release];
  __success = nil;
  __success_isset = NO;
}

- (ThriftIOException *) ouch {
  return [[__ouch retain] autorelease];
}

- (void) setOuch: (ThriftIOException *) ouch {
  [ouch retain];
  [__ouch release];
  __ouch = ouch;
  __ouch_isset = YES;
}

- (BOOL) ouchIsSet {
  return __ouch_isset;
}

- (void) unsetOuch {
  [__ouch release];
  __ouch = nil;
  __ouch_isset = NO;
}

- (void) read: (id <TProtocol>) inProtocol
{
  NSString * fieldName;
  int fieldType;
  int fieldID;

  [inProtocol readStructBeginReturningName: NULL];
  while (true)
  {
    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];
    if (fieldType == TType_STOP) { 
      break;
    }
    switch (fieldID)
    {
      case 0:
        if (fieldType == TType_LIST) {
          int _size15;
          [inProtocol readListBeginReturningElementType: NULL size: &_size15];
          NSMutableArray * fieldValue = [[NSMutableArray alloc] initWithCapacity: _size15];
          int _i16;
          for (_i16 = 0; _i16 < _size15; ++_i16)
          {
            BlockLocation *_elem17 = [[BlockLocation alloc] init];
            [_elem17 read: inProtocol];
            [fieldValue addObject: _elem17];
          }
          [inProtocol readListEnd];
          [self setSuccess: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      case 1:
        if (fieldType == TType_STRUCT) {
          ThriftIOException *fieldValue = [[ThriftIOException alloc] init];
          [fieldValue read: inProtocol];
          [self setOuch: fieldValue];
          [fieldValue release];
        } else { 
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
      default:
        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        break;
    }
    [inProtocol readFieldEnd];
  }
  [inProtocol readStructEnd];
}

- (void) write: (id <TProtocol>) outProtocol {
  [outProtocol writeStructBeginWithName: @"GetFileBlockLocationsResult_"];

  if (__success_isset) {
    if (__success != nil) {
      [outProtocol writeFieldBeginWithName: @"success" type: TType_LIST fieldID: 0];
      {
        [outProtocol writeListBeginWithElementType: TType_STRUCT size: [__success count]];
        int i19;
        for (i19 = 0; i19 < [__success count]; i19++)
        {
          [[__success objectAtIndex: i19] write: outProtocol];
        }
        [outProtocol writeListEnd];
      }
      [outProtocol writeFieldEnd];
    }
  } else if (__ouch_isset) {
    if (__ouch != nil) {
      [outProtocol writeFieldBeginWithName: @"ouch" type: TType_STRUCT fieldID: 1];
      [__ouch write: outProtocol];
      [outProtocol writeFieldEnd];
    }
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
}

- (NSString *) description {
  NSMutableString * ms = [NSMutableString stringWithString: @"GetFileBlockLocationsResult_("];
  [ms appendString: @"success:"];
  [ms appendFormat: @"%@", __success];
  [ms appendString: @",ouch:"];
  [ms appendFormat: @"%@", __ouch];
  [ms appendString: @")"];
  return [ms copy];
}

@end

@implementation ThriftHadoopFileSystemClient
- (id) initWithProtocol: (id <TProtocol>) protocol
{
  return [self initWithInProtocol: protocol outProtocol: protocol];
}

- (id) initWithInProtocol: (id <TProtocol>) anInProtocol outProtocol: (id <TProtocol>) anOutProtocol
{
  [super init];
  inProtocol = [anInProtocol retain];
  outProtocol = [anOutProtocol retain];
  return self;
}

- (void) dealloc
{
  [inProtocol release];
  [outProtocol release];
  [super dealloc];
}

- (void) send_setInactivityTimeoutPeriod: (int64_t) periodInSeconds
{
  [outProtocol writeMessageBeginWithName: @"setInactivityTimeoutPeriod" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"setInactivityTimeoutPeriod_args"];
  [outProtocol writeFieldBeginWithName: @"periodInSeconds" type: TType_I64 fieldID: 1];
  [outProtocol writeI64: periodInSeconds];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (void) recv_setInactivityTimeoutPeriod
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  SetInactivityTimeoutPeriodResult_ * result = [[[SetInactivityTimeoutPeriodResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  return;
}

- (void) setInactivityTimeoutPeriod: (int64_t) periodInSeconds
{
  [self send_setInactivityTimeoutPeriod: periodInSeconds];
  [self recv_setInactivityTimeoutPeriod];
}

- (void) send_shutdown: (int32_t) status
{
  [outProtocol writeMessageBeginWithName: @"shutdown" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"shutdown_args"];
  [outProtocol writeFieldBeginWithName: @"status" type: TType_I32 fieldID: 1];
  [outProtocol writeI32: status];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (void) recv_shutdown
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  ShutdownResult_ * result = [[[ShutdownResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  return;
}

- (void) shutdown: (int32_t) status
{
  [self send_shutdown: status];
  [self recv_shutdown];
}

- (void) send_create: (Pathname *) path
{
  [outProtocol writeMessageBeginWithName: @"create" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"create_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (ThriftHandle *) recv_create
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  CreateResult_ * result = [[[CreateResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"create failed: unknown result"];
}

- (ThriftHandle *) create: (Pathname *) path
{
  [self send_create: path];
  return [self recv_create];
}

- (void) send_createFile: (Pathname *) path : (int16_t) mode : (BOOL) overwrite : (int32_t) bufferSize : (int16_t) block_replication : (int64_t) blocksize
{
  [outProtocol writeMessageBeginWithName: @"createFile" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"createFile_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldBeginWithName: @"mode" type: TType_I16 fieldID: 2];
  [outProtocol writeI16: mode];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldBeginWithName: @"overwrite" type: TType_BOOL fieldID: 3];
  [outProtocol writeBool: overwrite];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldBeginWithName: @"bufferSize" type: TType_I32 fieldID: 4];
  [outProtocol writeI32: bufferSize];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldBeginWithName: @"block_replication" type: TType_I16 fieldID: 5];
  [outProtocol writeI16: block_replication];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldBeginWithName: @"blocksize" type: TType_I64 fieldID: 6];
  [outProtocol writeI64: blocksize];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (ThriftHandle *) recv_createFile
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  CreateFileResult_ * result = [[[CreateFileResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"createFile failed: unknown result"];
}

- (ThriftHandle *) createFile: (Pathname *) path : (int16_t) mode : (BOOL) overwrite : (int32_t) bufferSize : (int16_t) block_replication : (int64_t) blocksize
{
  [self send_createFile: path : mode : overwrite : bufferSize : block_replication : blocksize];
  return [self recv_createFile];
}

- (void) send_open: (Pathname *) path
{
  [outProtocol writeMessageBeginWithName: @"open" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"open_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (ThriftHandle *) recv_open
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  OpenResult_ * result = [[[OpenResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"open failed: unknown result"];
}

- (ThriftHandle *) open: (Pathname *) path
{
  [self send_open: path];
  return [self recv_open];
}

- (void) send_append: (Pathname *) path
{
  [outProtocol writeMessageBeginWithName: @"append" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"append_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (ThriftHandle *) recv_append
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  AppendResult_ * result = [[[AppendResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"append failed: unknown result"];
}

- (ThriftHandle *) append: (Pathname *) path
{
  [self send_append: path];
  return [self recv_append];
}

- (void) send_write: (ThriftHandle *) handle : (NSString *) data
{
  [outProtocol writeMessageBeginWithName: @"write" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"write_args"];
  if (handle != nil)  {
    [outProtocol writeFieldBeginWithName: @"handle" type: TType_STRUCT fieldID: 1];
    [handle write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  if (data != nil)  {
    [outProtocol writeFieldBeginWithName: @"data" type: TType_STRING fieldID: -1];
    [outProtocol writeString: data];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (BOOL) recv_write
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  WriteResult_ * result = [[[WriteResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"write failed: unknown result"];
}

- (BOOL) write: (ThriftHandle *) handle : (NSString *) data
{
  [self send_write: handle : data];
  return [self recv_write];
}

- (void) send_read: (ThriftHandle *) handle : (int64_t) offset : (int32_t) size
{
  [outProtocol writeMessageBeginWithName: @"read" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"read_args"];
  if (handle != nil)  {
    [outProtocol writeFieldBeginWithName: @"handle" type: TType_STRUCT fieldID: 1];
    [handle write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldBeginWithName: @"offset" type: TType_I64 fieldID: -1];
  [outProtocol writeI64: offset];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldBeginWithName: @"size" type: TType_I32 fieldID: -2];
  [outProtocol writeI32: size];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (NSString *) recv_read
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  ReadResult_ * result = [[[ReadResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"read failed: unknown result"];
}

- (NSString *) read: (ThriftHandle *) handle : (int64_t) offset : (int32_t) size
{
  [self send_read: handle : offset : size];
  return [self recv_read];
}

- (void) send_close: (ThriftHandle *) out
{
  [outProtocol writeMessageBeginWithName: @"close" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"close_args"];
  if (out != nil)  {
    [outProtocol writeFieldBeginWithName: @"out" type: TType_STRUCT fieldID: 1];
    [out write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (BOOL) recv_close
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  CloseResult_ * result = [[[CloseResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"close failed: unknown result"];
}

- (BOOL) close: (ThriftHandle *) out
{
  [self send_close: out];
  return [self recv_close];
}

- (void) send_rm: (Pathname *) path : (BOOL) recursive
{
  [outProtocol writeMessageBeginWithName: @"rm" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"rm_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldBeginWithName: @"recursive" type: TType_BOOL fieldID: 2];
  [outProtocol writeBool: recursive];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (BOOL) recv_rm
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  RmResult_ * result = [[[RmResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"rm failed: unknown result"];
}

- (BOOL) rm: (Pathname *) path : (BOOL) recursive
{
  [self send_rm: path : recursive];
  return [self recv_rm];
}

- (void) send_rename: (Pathname *) path : (Pathname *) dest
{
  [outProtocol writeMessageBeginWithName: @"rename" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"rename_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  if (dest != nil)  {
    [outProtocol writeFieldBeginWithName: @"dest" type: TType_STRUCT fieldID: 2];
    [dest write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (BOOL) recv_rename
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  RenameResult_ * result = [[[RenameResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"rename failed: unknown result"];
}

- (BOOL) rename: (Pathname *) path : (Pathname *) dest
{
  [self send_rename: path : dest];
  return [self recv_rename];
}

- (void) send_mkdirs: (Pathname *) path
{
  [outProtocol writeMessageBeginWithName: @"mkdirs" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"mkdirs_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (BOOL) recv_mkdirs
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  MkdirsResult_ * result = [[[MkdirsResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"mkdirs failed: unknown result"];
}

- (BOOL) mkdirs: (Pathname *) path
{
  [self send_mkdirs: path];
  return [self recv_mkdirs];
}

- (void) send_exists: (Pathname *) path
{
  [outProtocol writeMessageBeginWithName: @"exists" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"exists_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (BOOL) recv_exists
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  ExistsResult_ * result = [[[ExistsResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"exists failed: unknown result"];
}

- (BOOL) exists: (Pathname *) path
{
  [self send_exists: path];
  return [self recv_exists];
}

- (void) send_stat: (Pathname *) path
{
  [outProtocol writeMessageBeginWithName: @"stat" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"stat_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (FileStatus *) recv_stat
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  StatResult_ * result = [[[StatResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"stat failed: unknown result"];
}

- (FileStatus *) stat: (Pathname *) path
{
  [self send_stat: path];
  return [self recv_stat];
}

- (void) send_listStatus: (Pathname *) path
{
  [outProtocol writeMessageBeginWithName: @"listStatus" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"listStatus_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (NSArray *) recv_listStatus
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  ListStatusResult_ * result = [[[ListStatusResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"listStatus failed: unknown result"];
}

- (NSArray *) listStatus: (Pathname *) path
{
  [self send_listStatus: path];
  return [self recv_listStatus];
}

- (void) send_chmod: (Pathname *) path : (int16_t) mode
{
  [outProtocol writeMessageBeginWithName: @"chmod" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"chmod_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldBeginWithName: @"mode" type: TType_I16 fieldID: 2];
  [outProtocol writeI16: mode];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (void) recv_chmod
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  ChmodResult_ * result = [[[ChmodResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  return;
}

- (void) chmod: (Pathname *) path : (int16_t) mode
{
  [self send_chmod: path : mode];
  [self recv_chmod];
}

- (void) send_chown: (Pathname *) path : (NSString *) owner : (NSString *) group
{
  [outProtocol writeMessageBeginWithName: @"chown" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"chown_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  if (owner != nil)  {
    [outProtocol writeFieldBeginWithName: @"owner" type: TType_STRING fieldID: 2];
    [outProtocol writeString: owner];
    [outProtocol writeFieldEnd];
  }
  if (group != nil)  {
    [outProtocol writeFieldBeginWithName: @"group" type: TType_STRING fieldID: 3];
    [outProtocol writeString: group];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (void) recv_chown
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  ChownResult_ * result = [[[ChownResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  return;
}

- (void) chown: (Pathname *) path : (NSString *) owner : (NSString *) group
{
  [self send_chown: path : owner : group];
  [self recv_chown];
}

- (void) send_setReplication: (Pathname *) path : (int16_t) replication
{
  [outProtocol writeMessageBeginWithName: @"setReplication" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"setReplication_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldBeginWithName: @"replication" type: TType_I16 fieldID: 2];
  [outProtocol writeI16: replication];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (void) recv_setReplication
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  SetReplicationResult_ * result = [[[SetReplicationResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  return;
}

- (void) setReplication: (Pathname *) path : (int16_t) replication
{
  [self send_setReplication: path : replication];
  [self recv_setReplication];
}

- (void) send_getFileBlockLocations: (Pathname *) path : (int64_t) start : (int64_t) length
{
  [outProtocol writeMessageBeginWithName: @"getFileBlockLocations" type: TMessageType_CALL sequenceID: 0];
  [outProtocol writeStructBeginWithName: @"getFileBlockLocations_args"];
  if (path != nil)  {
    [outProtocol writeFieldBeginWithName: @"path" type: TType_STRUCT fieldID: 1];
    [path write: outProtocol];
    [outProtocol writeFieldEnd];
  }
  [outProtocol writeFieldBeginWithName: @"start" type: TType_I64 fieldID: 2];
  [outProtocol writeI64: start];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldBeginWithName: @"length" type: TType_I64 fieldID: 3];
  [outProtocol writeI64: length];
  [outProtocol writeFieldEnd];
  [outProtocol writeFieldStop];
  [outProtocol writeStructEnd];
  [outProtocol writeMessageEnd];
  [[outProtocol transport] flush];
}

- (NSArray *) recv_getFileBlockLocations
{
  int msgType = 0;
  [inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];
  if (msgType == TMessageType_EXCEPTION) {
    TApplicationException * x = [TApplicationException read: inProtocol];
    [inProtocol readMessageEnd];
    @throw x;
  }
  GetFileBlockLocationsResult_ * result = [[[GetFileBlockLocationsResult_ alloc] init] autorelease];
  [result read: inProtocol];
  [inProtocol readMessageEnd];
  if ([result successIsSet]) {
    return [result success];
  }
  if ([result ouchIsSet]) {
    @throw [result ouch];
  }
  @throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT
                                           reason: @"getFileBlockLocations failed: unknown result"];
}

- (NSArray *) getFileBlockLocations: (Pathname *) path : (int64_t) start : (int64_t) length
{
  [self send_getFileBlockLocations: path : start : length];
  return [self recv_getFileBlockLocations];
}

@end

