@@ -23,12 +23,12 @@ #import "OFTarArchiveEntry.h" #import "OFTarArchiveEntry+Private.h" #import "OFStream.h" #import "OFDate.h" +#import "OFNotOpenException.h" #import "OFOutOfRangeException.h" -#import "OFReadFailedException.h" static OFString * stringFromBuffer(const char *buffer, size_t length) { for (size_t i = 0; i < length; i++) @@ -113,11 +113,12 @@ return self; } - (void)dealloc { - [_stream release]; + [self close]; + [_fileName release]; [_modificationDate release]; [_targetFileName release]; [_owner release]; [_group release]; @@ -128,13 +129,15 @@ - (size_t)lowlevelReadIntoBuffer: (void *)buffer length: (size_t)length { size_t ret; + if (_stream == nil) + @throw [OFNotOpenException exceptionWithObject: self]; + if (_atEndOfStream) - @throw [OFReadFailedException exceptionWithObject: self - requestedLength: length]; + return 0; if ((uint64_t)length > _toRead) length = (size_t)_toRead; ret = [_stream readIntoBuffer: buffer @@ -148,10 +151,13 @@ return ret; } - (bool)lowlevelIsAtEndOfStream { + if (_stream == nil) + @throw [OFNotOpenException exceptionWithObject: self]; + return _atEndOfStream; } - (bool)hasDataInReadBuffer { @@ -158,11 +164,12 @@ return ([super hasDataInReadBuffer] || [_stream hasDataInReadBuffer]); } - (void)close { - _atEndOfStream = true; + [_stream release]; + _stream = nil; [super close]; } - (void)of_skip