@@ -35,13 +35,13 @@ #import "OFChecksumFailedException.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFNotImplementedException.h" +#import "OFNotOpenException.h" #import "OFOpenItemFailedException.h" #import "OFOutOfRangeException.h" -#import "OFReadFailedException.h" #import "OFSeekFailedException.h" #import "OFUnsupportedVersionException.h" /* * FIXME: Current limitations: @@ -75,11 +75,11 @@ OFStream *_stream, *_decompressedStream; OFZIPArchive_LocalFileHeader *_localFileHeader; bool _hasDataDescriptor; uint64_t _size; uint32_t _CRC32; - bool _atEndOfStream, _closed; + bool _atEndOfStream; } - initWithStream: (OFStream *)path localFileHeader: (OFZIPArchive_LocalFileHeader *)localFileHeader; @end @@ -491,11 +491,12 @@ return self; } - (void)dealloc { - [_stream release]; + [self close]; + [_decompressedStream release]; [_localFileHeader release]; [super dealloc]; } @@ -508,13 +509,15 @@ - (size_t)lowlevelReadIntoBuffer: (void *)buffer length: (size_t)length { size_t min, ret; - if (_atEndOfStream || _closed) - @throw [OFReadFailedException exceptionWithObject: self - requestedLength: length]; + if (_stream == nil) + @throw [OFNotOpenException exceptionWithObject: self]; + + if (_atEndOfStream) + return 0; if (_hasDataDescriptor) { if ([_decompressedStream isAtEndOfStream]) { uint32_t CRC32; @@ -558,10 +561,11 @@ return ret; } - (void)close { - _closed = true; + [_stream release]; + _stream = nil; [super close]; } @end