1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#import "CSSubHandle.h"
@implementation CSSubHandle
-(id)initWithHandle:(CSHandle *)handle from:(off_t)from length:(off_t)length
{
if((self=[super initWithName:[NSString stringWithFormat:@"%@ (Subrange from %qd, length %qd)",[handle name],from,length]]))
{
parent=[handle retain];
start=from;
end=from+length;
[parent seekToFileOffset:start];
if(parent) return self;
[self release];
}
return nil;
}
-(id)initAsCopyOf:(CSSubHandle *)other
{
if((self=[super initAsCopyOf:other]))
{
parent=[other->parent copy];
start=other->start;
end=other->end;
}
return self;
}
-(void)dealloc
{
[parent release];
[super dealloc];
}
-(CSHandle *)parentHandle { return parent; }
-(off_t)startOffsetInParent { return start; }
-(off_t)fileSize
{
return end-start;
/* off_t parentsize=[parent fileSize];
if(parentsize>end) return end-start;
else if(parentsize<start) return 0;
else return parentsize-start;*/
}
-(off_t)offsetInFile
{
return [parent offsetInFile]-start;
}
-(BOOL)atEndOfFile
{
return [parent offsetInFile]==end||[parent atEndOfFile];
}
-(void)seekToFileOffset:(off_t)offs
{
if(offs<0) [self _raiseNotSupported:_cmd];
if(offs>end) [self _raiseEOF];
[parent seekToFileOffset:offs+start];
}
-(void)seekToEndOfFile
{
// @try
{
[parent seekToFileOffset:end];
}
/* @catch(NSException *e)
{
if([[e name] isEqual:@"CSEndOfFileException"]) [parent seekToEndOfFile];
else @throw;
}*/
}
-(int)readAtMost:(int)num toBuffer:(void *)buffer
{
off_t curr=[parent offsetInFile];
if(curr+num>end) num=end-curr;
if(num<=0) return 0;
else return [parent readAtMost:num toBuffer:buffer];
}
@end
|