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
|
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
91
92
93
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
+
+
+
+
+
+
+
+
+
|
#import "OFZIPArchiveEntry.h"
OF_ASSUME_NONNULL_BEGIN
@class OFArray OF_GENERIC(ObjectType);
@class OFMutableArray OF_GENERIC(ObjectType);
@class OFMutableDictionary OF_GENERIC(KeyType, ObjectType);
@class OFSeekableStream;
@class OFStream;
@class OFZIPArchive;
/**
* @protocol OFZIPArchiveDelegate OFZIPArchive.h ObjFW/OFZIPArchive.h
*
* @brief A delegate for OFZIPArchive.
*/
@protocol OFZIPArchiveDelegate <OFObject>
@optional
/**
* @brief A callback that is called when an @ref OFZIPArchive wants to read a
* different archive part.
*
* @param archive The archive that wants to read another part
* @param partNumber The number of the part the archive wants to read
* @param lastPartNumber The number of the last archive part
* @return The stream to read the needed part, or `nil` if no such part exists
*/
- (nullable OFSeekableStream *)archive: (OFZIPArchive *)archive
wantsPartNumbered: (unsigned int)partNumber
lastPartNumber: (unsigned int)lastPartNumber;
@end
/**
* @class OFZIPArchive OFZIPArchive.h ObjFW/OFZIPArchive.h
*
* @brief A class for accessing and manipulating ZIP files.
*/
OF_SUBCLASSING_RESTRICTED
@interface OFZIPArchive: OFObject
{
OFStream *_stream;
#ifdef OF_ZIP_ARCHIVE_M
@public
#endif
OFObject <OFZIPArchiveDelegate> *_Nullable _delegate;
OF_KINDOF(OFStream *) _stream;
int64_t _offset;
@protected
uint_least8_t _mode;
uint32_t _diskNumber, _centralDirectoryDisk;
uint32_t _diskNumber, _lastDiskNumber;
@protected
uint32_t _centralDirectoryDisk;
uint64_t _centralDirectoryEntriesInDisk, _centralDirectoryEntries;
uint64_t _centralDirectorySize;
int64_t _centralDirectoryOffset;
OFString *_Nullable _archiveComment;
#ifdef OF_ZIP_ARCHIVE_M
@public
#endif
OFMutableArray OF_GENERIC(OFZIPArchiveEntry *) *_entries;
OFMutableDictionary OF_GENERIC(OFString *, OFZIPArchiveEntry *)
*_pathToEntryMap;
OFStream *_Nullable _lastReturnedStream;
}
/**
* @brief The delegate of the ZIP archive.
*/
@property OF_NULLABLE_PROPERTY (assign, nonatomic)
OFObject <OFZIPArchiveDelegate> *delegate;
/**
* @brief The archive comment.
*/
@property OF_NULLABLE_PROPERTY (copy, nonatomic) OFString *archiveComment;
/**
* @brief The entries in the central directory of the archive as an array of
|
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
-
+
-
+
-
-
+
+
-
-
+
+
-
+
|
* @throw OFInvalidFormatException The format is not that of a valid ZIP archive
*/
+ (instancetype)archiveWithStream: (OFStream *)stream mode: (OFString *)mode;
/**
* @brief Creates a new OFZIPArchive object with the specified file.
*
* @param URI The URI to the ZIP file
* @param IRI The IRI to the ZIP file
* @param mode The mode for the ZIP file. Valid modes are "r" for reading,
* "w" for creating a new file and "a" for appending to an existing
* archive.
* @return A new, autoreleased OFZIPArchive
* @throw OFInvalidFormatException The format is not that of a valid ZIP archive
*/
+ (instancetype)archiveWithURI: (OFURI *)URI mode: (OFString *)mode;
+ (instancetype)archiveWithIRI: (OFIRI *)IRI mode: (OFString *)mode;
/**
* @brief Creates a URI for accessing a the specified file within the specified
* ZIP archive.
* @brief Creates an IRI for accessing a the specified file within the
* specified ZIP archive.
*
* @param path The path of the file within the archive
* @param URI The URI of the archive
* @return A URI for accessing the specified file within the specified ZIP
* @param IRI The IRI of the archive
* @return An IRI for accessing the specified file within the specified ZIP
* archive
*/
+ (OFURI *)URIForFilePath: (OFString *)path inArchiveWithURI: (OFURI *)URI;
+ (OFIRI *)IRIForFilePath: (OFString *)path inArchiveWithIRI: (OFIRI *)IRI;
- (instancetype)init OF_UNAVAILABLE;
/**
* @brief Initializes an already allocated OFZIPArchive object with the
* specified stream.
*
|
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
-
+
-
+
|
- (instancetype)initWithStream: (OFStream *)stream
mode: (OFString *)mode OF_DESIGNATED_INITIALIZER;
/**
* @brief Initializes an already allocated OFZIPArchive object with the
* specified file.
*
* @param URI The URI to the ZIP file
* @param IRI The IRI to the ZIP file
* @param mode The mode for the ZIP file. Valid modes are "r" for reading,
* "w" for creating a new file and "a" for appending to an existing
* archive.
* @return An initialized OFZIPArchive
* @throw OFInvalidFormatException The format is not that of a valid ZIP archive
*/
- (instancetype)initWithURI: (OFURI *)URI mode: (OFString *)mode;
- (instancetype)initWithIRI: (OFIRI *)IRI mode: (OFString *)mode;
/**
* @brief Returns a stream for reading the specified file from the archive.
*
* @note This method is only available in read mode.
*
* @note The returned stream conforms to @ref OFReadyForReadingObserving if the
|
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
-
-
-
+
+
+
+
+
|
* * The uncompressed size.
* * The CRC32.
* * Bit 3 and 11 of the general purpose bit flag.
* @return A stream for writing the specified entry to the archive
* @throw OFNotOpenException The archive is not open
* @throw OFInvalidArgumentException The archive is not in write mode
* @throw OFOpenItemFailedException Opening the specified file within the
* archive failed. If @ref errNo is `EEXIST`,
* because there is already a file with the
* same name in the archive.
* archive failed. If
* @ref OFOpenItemFailedException#errNo is
* `EEXIST`, it failed because there is
* already a file with the same name in the
* archive.
* @throw OFNotImplementedException The desired compression method is not
* implemented
*/
- (OFStream *)streamForWritingEntry: (OFZIPArchiveEntry *)entry;
/**
* @brief Closes the OFZIPArchive.
|