︙ | | | ︙ | |
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
{
self = [super init];
@try {
_stream = [stream retain];
if ([mode isEqual: @"r"])
_mode = OF_TAR_ARCHIVE_MODE_READ;
else if ([mode isEqual: @"w"])
_mode = OF_TAR_ARCHIVE_MODE_WRITE;
else if ([mode isEqual: @"a"])
_mode = OF_TAR_ARCHIVE_MODE_APPEND;
else
@throw [OFInvalidArgumentException exception];
if (_mode == OF_TAR_ARCHIVE_MODE_APPEND) {
uint32_t buffer[1024 / sizeof(uint32_t)];
bool empty = true;
if (![_stream isKindOfClass: [OFSeekableStream class]])
@throw [OFInvalidArgumentException exception];
[(OFSeekableStream *)_stream seekToOffset: -1024
|
|
|
|
|
|
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
{
self = [super init];
@try {
_stream = [stream retain];
if ([mode isEqual: @"r"])
_mode = OFTarArchiveModeRead;
else if ([mode isEqual: @"w"])
_mode = OFTarArchiveModeWrite;
else if ([mode isEqual: @"a"])
_mode = OFTarArchiveModeAppend;
else
@throw [OFInvalidArgumentException exception];
if (_mode == OFTarArchiveModeAppend) {
uint32_t buffer[1024 / sizeof(uint32_t)];
bool empty = true;
if (![_stream isKindOfClass: [OFSeekableStream class]])
@throw [OFInvalidArgumentException exception];
[(OFSeekableStream *)_stream seekToOffset: -1024
|
︙ | | | ︙ | |
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
if (!empty)
@throw [OFInvalidFormatException exception];
[(OFSeekableStream *)stream seekToOffset: -1024
whence: SEEK_END];
}
_encoding = OF_STRING_ENCODING_UTF_8;
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
|
|
|
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
if (!empty)
@throw [OFInvalidFormatException exception];
[(OFSeekableStream *)stream seekToOffset: -1024
whence: SEEK_END];
}
_encoding = OFStringEncodingUTF8;
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
|
︙ | | | ︙ | |
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
- (OFTarArchiveEntry *)nextEntry
{
OFTarArchiveEntry *entry;
uint32_t buffer[512 / sizeof(uint32_t)];
bool empty = true;
if (_mode != OF_TAR_ARCHIVE_MODE_READ)
@throw [OFInvalidArgumentException exception];
[(OFTarArchiveFileReadStream *)_lastReturnedStream of_skip];
@try {
[_lastReturnedStream close];
} @catch (OFNotOpenException *e) {
/* Might have already been closed by the user - that's fine. */
|
|
|
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
- (OFTarArchiveEntry *)nextEntry
{
OFTarArchiveEntry *entry;
uint32_t buffer[512 / sizeof(uint32_t)];
bool empty = true;
if (_mode != OFTarArchiveModeRead)
@throw [OFInvalidArgumentException exception];
[(OFTarArchiveFileReadStream *)_lastReturnedStream of_skip];
@try {
[_lastReturnedStream close];
} @catch (OFNotOpenException *e) {
/* Might have already been closed by the user - that's fine. */
|
︙ | | | ︙ | |
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
|
entry: entry];
return entry;
}
- (OFStream *)streamForReadingCurrentEntry
{
if (_mode != OF_TAR_ARCHIVE_MODE_READ)
@throw [OFInvalidArgumentException exception];
if (_lastReturnedStream == nil)
@throw [OFInvalidArgumentException exception];
return [[(OFTarArchiveFileReadStream *)_lastReturnedStream
retain] autorelease];
}
- (OFStream *)streamForWritingEntry: (OFTarArchiveEntry *)entry
{
void *pool;
if (_mode != OF_TAR_ARCHIVE_MODE_WRITE &&
_mode != OF_TAR_ARCHIVE_MODE_APPEND)
@throw [OFInvalidArgumentException exception];
pool = objc_autoreleasePoolPush();
@try {
[_lastReturnedStream close];
} @catch (OFNotOpenException *e) {
|
|
|
<
|
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
|
entry: entry];
return entry;
}
- (OFStream *)streamForReadingCurrentEntry
{
if (_mode != OFTarArchiveModeRead)
@throw [OFInvalidArgumentException exception];
if (_lastReturnedStream == nil)
@throw [OFInvalidArgumentException exception];
return [[(OFTarArchiveFileReadStream *)_lastReturnedStream
retain] autorelease];
}
- (OFStream *)streamForWritingEntry: (OFTarArchiveEntry *)entry
{
void *pool;
if (_mode != OFTarArchiveModeWrite && _mode != OFTarArchiveModeAppend)
@throw [OFInvalidArgumentException exception];
pool = objc_autoreleasePoolPush();
@try {
[_lastReturnedStream close];
} @catch (OFNotOpenException *e) {
|
︙ | | | ︙ | |
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
|
[_lastReturnedStream close];
} @catch (OFNotOpenException *e) {
/* Might have already been closed by the user - that's fine. */
}
[_lastReturnedStream release];
_lastReturnedStream = nil;
if (_mode == OF_TAR_ARCHIVE_MODE_WRITE ||
_mode == OF_TAR_ARCHIVE_MODE_APPEND) {
char buffer[1024];
memset(buffer, '\0', 1024);
[_stream writeBuffer: buffer
length: 1024];
}
[_stream release];
_stream = nil;
}
@end
|
|
<
|
<
|
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
|
[_lastReturnedStream close];
} @catch (OFNotOpenException *e) {
/* Might have already been closed by the user - that's fine. */
}
[_lastReturnedStream release];
_lastReturnedStream = nil;
if (_mode == OFTarArchiveModeWrite || _mode == OFTarArchiveModeAppend) {
char buffer[1024];
memset(buffer, '\0', 1024);
[_stream writeBuffer: buffer length: 1024];
}
[_stream release];
_stream = nil;
}
@end
|
︙ | | | ︙ | |
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
|
- (void)of_skip
{
if (_stream == nil || _skipped)
return;
if ([_stream isKindOfClass: [OFSeekableStream class]] &&
_toRead <= INT64_MAX && (of_offset_t)_toRead == (int64_t)_toRead) {
uint64_t size;
[(OFSeekableStream *)_stream seekToOffset: (of_offset_t)_toRead
whence: SEEK_CUR];
_toRead = 0;
size = _entry.size;
if (size % 512 != 0)
|
|
|
|
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
|
- (void)of_skip
{
if (_stream == nil || _skipped)
return;
if ([_stream isKindOfClass: [OFSeekableStream class]] &&
_toRead <= INT64_MAX && (OFFileOffset)_toRead == (int64_t)_toRead) {
uint64_t size;
[(OFSeekableStream *)_stream seekToOffset: (OFFileOffset)_toRead
whence: SEEK_CUR];
_toRead = 0;
size = _entry.size;
if (size % 512 != 0)
|
︙ | | | ︙ | |