zipruby 0.2.9 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of zipruby might be problematic. Click here for more details.

data/ext/zipruby_file.c CHANGED
@@ -1,404 +1,398 @@
1
- #include <errno.h>
2
-
3
- #ifndef _WIN32
4
- #include <alloca.h>
5
- #else
6
- #include <malloc.h>
7
- #endif
8
-
9
- #include "zip.h"
10
- #include "zipint.h"
11
- #include "zipruby.h"
12
- #include "zipruby_archive.h"
13
- #include "zipruby_file.h"
14
- #include "zipruby_stat.h"
15
- #include "ruby.h"
16
-
17
- #define MIN(a, b) ((a) < (b) ? (a) : (b))
18
-
19
- static VALUE zipruby_file(VALUE klass);
20
- static VALUE zipruby_file_alloc(VALUE klass);
21
- static void zipruby_file_mark(struct zipruby_file *p);
22
- static void zipruby_file_free(struct zipruby_file *p);
23
- static VALUE zipruby_file_initialize(int argc, VALUE *argv, VALUE self);
24
- static VALUE zipruby_file_close(VALUE self);
25
- static VALUE zipruby_file_read(int argc, VALUE *argv, VALUE self);
26
- static VALUE zipruby_file_stat(VALUE self);
27
- static VALUE zipruby_file_get_comment(int argc, VALUE *argv, VALUE self);
28
- static VALUE zipruby_file_set_comment(VALUE self, VALUE comment);
29
- static VALUE zipruby_file_delete(VALUE self);
30
- static VALUE zipruby_file_rename(VALUE self, VALUE name);
31
- static VALUE zipruby_file_unchange(VALUE self);
32
- static VALUE zipruby_file_name(VALUE self);
33
- static VALUE zipruby_file_index(VALUE self);
34
- static VALUE zipruby_file_crc(VALUE self);
35
- static VALUE zipruby_file_size(VALUE self);
36
- static VALUE zipruby_file_mtime(VALUE self);
37
- static VALUE zipruby_file_comp_size(VALUE self);
38
- static VALUE zipruby_file_comp_method(VALUE self);
39
- static VALUE zipruby_file_encryption_method(VALUE self);
40
-
41
- extern VALUE Zip;
42
- extern VALUE Archive;
43
- VALUE File;
44
- extern VALUE Stat;
45
- extern VALUE Error;
46
-
47
- void Init_zipruby_file() {
48
- File = rb_define_class_under(Zip, "File", rb_cObject);
49
- rb_define_alloc_func(File, zipruby_file_alloc);
50
- rb_define_method(File, "initialize", zipruby_file_initialize, -1);
51
- rb_define_method(File, "close", zipruby_file_close, 0);
52
- rb_define_method(File, "read", zipruby_file_read, -1);
53
- rb_define_method(File, "stat", zipruby_file_stat, 0);
54
- rb_define_method(File, "get_comment", zipruby_file_get_comment, -1);
55
- rb_define_method(File, "comment", zipruby_file_get_comment, -1);
56
- rb_define_method(File, "comment=", zipruby_file_set_comment, 1);
57
- rb_define_method(File, "delete", zipruby_file_delete, 0);
58
- rb_define_method(File, "rename", zipruby_file_rename, 1);
59
- rb_define_method(File, "unchange", zipruby_file_unchange, 1);
60
- rb_define_method(File, "revert", zipruby_file_unchange, 1);
61
- rb_define_method(File, "name", zipruby_file_name, 0);
62
- rb_define_method(File, "index", zipruby_file_index, 0);
63
- rb_define_method(File, "crc", zipruby_file_crc, 0);
64
- rb_define_method(File, "size", zipruby_file_size, 0);
65
- rb_define_method(File, "mtime", zipruby_file_mtime, 0);
66
- rb_define_method(File, "comp_size", zipruby_file_comp_size, 0);
67
- rb_define_method(File, "comp_method", zipruby_file_comp_method, 0);
68
- rb_define_method(File, "encryption_method", zipruby_file_encryption_method, 0);
69
- }
70
-
71
- static VALUE zipruby_file_alloc(VALUE klass) {
72
- struct zipruby_file *p = ALLOC(struct zipruby_file);
73
-
74
- p->archive = NULL;
75
- p->file = NULL;
76
- p->sb = NULL;
77
-
78
- return Data_Wrap_Struct(klass, zipruby_file_mark, zipruby_file_free, p);
79
- }
80
-
81
- static void zipruby_file_mark(struct zipruby_file *p) {
82
- if (p->archive) { rb_gc_mark(p->v_archive); }
83
- if (p->sb) { rb_gc_mark(p->v_sb); }
84
- }
85
-
86
- static void zipruby_file_free(struct zipruby_file *p) {
87
- xfree(p);
88
- }
89
-
90
- /* */
91
- static VALUE zipruby_file_initialize(int argc, VALUE *argv, VALUE self) {
92
- VALUE archive, index, flags, stat_flags;
93
- struct zipruby_archive *p_archive;
94
- struct zipruby_file *p_file;
95
- struct zipruby_stat *p_stat;
96
- struct zip_file *fzip;
97
- char *fname = NULL;
98
- int i_index = -1, i_flags = 0;
99
-
100
- rb_scan_args(argc, argv, "22", &archive, &index, &flags, &stat_flags);
101
-
102
- if (!rb_obj_is_instance_of(archive, Archive)) {
103
- rb_raise(rb_eTypeError, "wrong argument type %s (expected Zip::Archive)", rb_class2name(CLASS_OF(archive)));
104
- }
105
-
106
- switch (TYPE(index)) {
107
- case T_STRING: fname = RSTRING_PTR(index); break;
108
- case T_FIXNUM: i_index = NUM2INT(index); break;
109
- default:
110
- rb_raise(rb_eTypeError, "wrong argument type %s (expected String or Fixnum)", rb_class2name(CLASS_OF(index)));
111
- }
112
-
113
- if (!NIL_P(flags)) {
114
- i_flags = NUM2INT(flags);
115
- }
116
-
117
- Data_Get_Struct(archive, struct zipruby_archive, p_archive);
118
- Check_Archive(p_archive);
119
-
120
- if (fname) {
121
- fzip = zip_fopen(p_archive->archive, fname, i_flags);
122
-
123
- if (fzip == NULL) {
124
- rb_raise(Error, "Open file failed - %s: %s", fname, zip_strerror(p_archive->archive));
125
- }
126
- } else {
127
- fzip = zip_fopen_index(p_archive->archive, i_index, i_flags);
128
-
129
- if (fzip == NULL) {
130
- rb_raise(Error, "Open file failed at %d: %s", i_index, zip_strerror(p_archive->archive));
131
- }
132
- }
133
-
134
- Data_Get_Struct(self, struct zipruby_file, p_file);
135
- p_file->v_archive = archive;
136
- p_file->archive = p_archive->archive;
137
- p_file->file = fzip;
138
- p_file->v_sb = rb_funcall(Stat, rb_intern("new"), 3, archive, index, stat_flags);
139
- Data_Get_Struct(p_file->v_sb, struct zipruby_stat, p_stat);
140
- p_file->sb = p_stat->sb;
141
-
142
- return Qnil;
143
- }
144
-
145
- /* */
146
- static VALUE zipruby_file_close(VALUE self) {
147
- struct zipruby_file *p_file;
148
- int error;
149
-
150
- Data_Get_Struct(self, struct zipruby_file, p_file);
151
- Check_File(p_file);
152
-
153
- if ((error = zip_fclose(p_file->file)) != 0) {
154
- char errstr[ERRSTR_BUFSIZE];
155
- zip_unchange(p_file->archive, p_file->sb->index);
156
- zip_error_to_str(errstr, ERRSTR_BUFSIZE, error, errno);
157
- rb_raise(Error, "Close file failed: %s", errstr);
158
- }
159
-
160
- p_file->archive = NULL;
161
- p_file->file = NULL;
162
- p_file->sb = NULL;
163
-
164
- return Qnil;
165
- }
166
-
167
- /* */
168
- static VALUE zipruby_file_read(int argc, VALUE *argv, VALUE self) {
169
- VALUE size, retval = Qnil;
170
- struct zipruby_file *p_file;
171
- struct zip_stat sb;
172
- int block_given;
173
- size_t bytes_left;
174
- char buf[DATA_BUFSIZE];
175
- ssize_t n;
176
-
177
- rb_scan_args(argc, argv, "01", &size);
178
- Data_Get_Struct(self, struct zipruby_file, p_file);
179
- Check_File(p_file);
180
- zip_stat_init(&sb);
181
-
182
- if (p_file->archive->cdir->entry[0].bitflags & ZIP_GPBF_ENCRYPTED) {
183
- rb_raise(Error, "Read file failed: File encrypted");
184
- }
185
-
186
- if (zip_stat_index(p_file->archive, p_file->sb->index, 0, &sb)) {
187
- rb_raise(Error, "Read file failed: %s", zip_strerror(p_file->archive));
188
- }
189
-
190
- if (NIL_P(size)) {
191
- bytes_left = sb.size;
192
- } else {
193
- bytes_left = NUM2LONG(size);
194
- }
195
-
196
- if (bytes_left <= 0) {
197
- return Qnil;
198
- }
199
-
200
- block_given = rb_block_given_p();
201
-
202
- while ((n = zip_fread(p_file->file, buf, MIN(bytes_left, sizeof(buf)))) > 0) {
203
- if (block_given) {
204
- rb_yield(rb_str_new(buf, n));
205
- } else {
206
- if (NIL_P(retval)) {
207
- retval = rb_str_new(buf, n);
208
- } else {
209
- rb_str_buf_cat(retval, buf, n);
210
- }
211
- }
212
-
213
- bytes_left -= n;
214
- }
215
-
216
- if (n == -1) {
217
- rb_raise(Error, "Read file failed: %s", zip_file_strerror(p_file->file));
218
- }
219
-
220
- return retval;
221
- }
222
-
223
- /* */
224
- static VALUE zipruby_file_stat(VALUE self) {
225
- struct zipruby_file *p_file;
226
-
227
- Data_Get_Struct(self, struct zipruby_file, p_file);
228
- Check_File(p_file);
229
-
230
- return p_file->v_sb;
231
- }
232
-
233
- /* */
234
- static VALUE zipruby_file_get_comment(int argc, VALUE *argv, VALUE self) {
235
- VALUE flags;
236
- struct zipruby_file *p_file;
237
- const char *comment;
238
- int lenp, i_flags = 0;
239
-
240
- rb_scan_args(argc, argv, "01", &flags);
241
-
242
- if (!NIL_P(flags)) {
243
- i_flags = NUM2INT(flags);
244
- }
245
-
246
- Data_Get_Struct(self, struct zipruby_file, p_file);
247
- Check_File(p_file);
248
-
249
- // XXX: How is the error checked?
250
- comment = zip_get_file_comment(p_file->archive, p_file->sb->index, &lenp, i_flags);
251
-
252
- return comment ? rb_str_new(comment, lenp) : Qnil;
253
- }
254
-
255
- /* */
256
- static VALUE zipruby_file_set_comment(VALUE self, VALUE comment) {
257
- struct zipruby_file *p_file;
258
- char *s_comment = NULL;
259
- int len = 0;
260
-
261
- if (!NIL_P(comment)) {
262
- Check_Type(comment, T_STRING);
263
- s_comment = RSTRING_PTR(comment);
264
- len = RSTRING_LEN(comment);
265
- }
266
-
267
- Data_Get_Struct(self, struct zipruby_file, p_file);
268
- Check_File(p_file);
269
-
270
- if (zip_set_file_comment(p_file->archive, p_file->sb->index, s_comment, len) == -1) {
271
- zip_unchange_all(p_file->archive);
272
- zip_unchange_archive(p_file->archive);
273
- rb_raise(Error, "Comment file failed - %s: %s", p_file->sb->name, zip_strerror(p_file->archive));
274
- }
275
-
276
- return Qnil;
277
- }
278
-
279
- /* */
280
- static VALUE zipruby_file_delete(VALUE self) {
281
- struct zipruby_file *p_file;
282
-
283
- Data_Get_Struct(self, struct zipruby_file, p_file);
284
- Check_File(p_file);
285
-
286
- if (zip_delete(p_file->archive, p_file->sb->index) == -1) {
287
- zip_unchange_all(p_file->archive);
288
- zip_unchange_archive(p_file->archive);
289
- rb_raise(Error, "Delete file failed - %s: %s", p_file->sb->name, zip_strerror(p_file->archive));
290
- }
291
-
292
- return Qnil;
293
- }
294
-
295
- /* */
296
- static VALUE zipruby_file_rename(VALUE self, VALUE name) {
297
- struct zipruby_file *p_file;
298
-
299
- Check_Type(name, T_STRING);
300
- Data_Get_Struct(self, struct zipruby_file, p_file);
301
- Check_File(p_file);
302
-
303
- if (zip_rename(p_file->archive, p_file->sb->index, RSTRING_PTR(name)) == -1) {
304
- zip_unchange_all(p_file->archive);
305
- zip_unchange_archive(p_file->archive);
306
- rb_raise(Error, "Rename file failed - %s: %s", p_file->sb->name, zip_strerror(p_file->archive));
307
- }
308
-
309
- return Qnil;
310
- }
311
-
312
- /* */
313
- static VALUE zipruby_file_unchange(VALUE self) {
314
- struct zipruby_file *p_file;
315
-
316
- Data_Get_Struct(self, struct zipruby_file, p_file);
317
- Check_File(p_file);
318
-
319
- if (zip_unchange(p_file->archive, p_file->sb->index) == -1) {
320
- rb_raise(Error, "Unchange file failed - %s: %s", p_file->sb->name, zip_strerror(p_file->archive));
321
- }
322
-
323
- return Qnil;
324
- }
325
-
326
- /* */
327
- static VALUE zipruby_file_name(VALUE self) {
328
- struct zipruby_file *p_file;
329
-
330
- Data_Get_Struct(self, struct zipruby_file, p_file);
331
- Check_File(p_file);
332
-
333
- return rb_funcall(p_file->v_sb, rb_intern("name"), 0);
334
- }
335
-
336
- /* */
337
- static VALUE zipruby_file_index(VALUE self) {
338
- struct zipruby_file *p_file;
339
-
340
- Data_Get_Struct(self, struct zipruby_file, p_file);
341
- Check_File(p_file);
342
-
343
- return rb_funcall(p_file->v_sb, rb_intern("index"), 0);
344
- }
345
-
346
- /* */
347
- static VALUE zipruby_file_crc(VALUE self) {
348
- struct zipruby_file *p_file;
349
-
350
- Data_Get_Struct(self, struct zipruby_file, p_file);
351
- Check_File(p_file);
352
-
353
- return rb_funcall(p_file->v_sb, rb_intern("crc"), 0);
354
- }
355
-
356
- /* */
357
- static VALUE zipruby_file_size(VALUE self) {
358
- struct zipruby_file *p_file;
359
-
360
- Data_Get_Struct(self, struct zipruby_file, p_file);
361
- Check_File(p_file);
362
-
363
- return rb_funcall(p_file->v_sb, rb_intern("size"), 0);
364
- }
365
-
366
- /* */
367
- static VALUE zipruby_file_mtime(VALUE self) {
368
- struct zipruby_file *p_file;
369
-
370
- Data_Get_Struct(self, struct zipruby_file, p_file);
371
- Check_File(p_file);
372
-
373
- return rb_funcall(p_file->v_sb, rb_intern("mtime"), 0);
374
- }
375
-
376
- /* */
377
- static VALUE zipruby_file_comp_size(VALUE self) {
378
- struct zipruby_file *p_file;
379
-
380
- Data_Get_Struct(self, struct zipruby_file, p_file);
381
- Check_File(p_file);
382
-
383
- return rb_funcall(p_file->v_sb, rb_intern("comp_size"), 0);
384
- }
385
-
386
- /* */
387
- static VALUE zipruby_file_comp_method(VALUE self) {
388
- struct zipruby_file *p_file;
389
-
390
- Data_Get_Struct(self, struct zipruby_file, p_file);
391
- Check_File(p_file);
392
-
393
- return rb_funcall(p_file->v_sb, rb_intern("comp_method"), 0);
394
- }
395
-
396
- /* */
397
- static VALUE zipruby_file_encryption_method(VALUE self) {
398
- struct zipruby_file *p_file;
399
-
400
- Data_Get_Struct(self, struct zipruby_file, p_file);
401
- Check_File(p_file);
402
-
403
- return rb_funcall(p_file->v_sb, rb_intern("encryption_method"), 0);
404
- }
1
+ #include <errno.h>
2
+
3
+ #include "zip.h"
4
+ #include "zipint.h"
5
+ #include "zipruby.h"
6
+ #include "zipruby_archive.h"
7
+ #include "zipruby_file.h"
8
+ #include "zipruby_stat.h"
9
+ #include "ruby.h"
10
+
11
+ #define MIN(a, b) ((a) < (b) ? (a) : (b))
12
+
13
+ static VALUE zipruby_file(VALUE klass);
14
+ static VALUE zipruby_file_alloc(VALUE klass);
15
+ static void zipruby_file_mark(struct zipruby_file *p);
16
+ static void zipruby_file_free(struct zipruby_file *p);
17
+ static VALUE zipruby_file_initialize(int argc, VALUE *argv, VALUE self);
18
+ static VALUE zipruby_file_close(VALUE self);
19
+ static VALUE zipruby_file_read(int argc, VALUE *argv, VALUE self);
20
+ static VALUE zipruby_file_stat(VALUE self);
21
+ static VALUE zipruby_file_get_comment(int argc, VALUE *argv, VALUE self);
22
+ static VALUE zipruby_file_set_comment(VALUE self, VALUE comment);
23
+ static VALUE zipruby_file_delete(VALUE self);
24
+ static VALUE zipruby_file_rename(VALUE self, VALUE name);
25
+ static VALUE zipruby_file_unchange(VALUE self);
26
+ static VALUE zipruby_file_name(VALUE self);
27
+ static VALUE zipruby_file_index(VALUE self);
28
+ static VALUE zipruby_file_crc(VALUE self);
29
+ static VALUE zipruby_file_size(VALUE self);
30
+ static VALUE zipruby_file_mtime(VALUE self);
31
+ static VALUE zipruby_file_comp_size(VALUE self);
32
+ static VALUE zipruby_file_comp_method(VALUE self);
33
+ static VALUE zipruby_file_encryption_method(VALUE self);
34
+
35
+ extern VALUE Zip;
36
+ extern VALUE Archive;
37
+ VALUE File;
38
+ extern VALUE Stat;
39
+ extern VALUE Error;
40
+
41
+ void Init_zipruby_file() {
42
+ File = rb_define_class_under(Zip, "File", rb_cObject);
43
+ rb_define_alloc_func(File, zipruby_file_alloc);
44
+ rb_define_method(File, "initialize", zipruby_file_initialize, -1);
45
+ rb_define_method(File, "close", zipruby_file_close, 0);
46
+ rb_define_method(File, "read", zipruby_file_read, -1);
47
+ rb_define_method(File, "stat", zipruby_file_stat, 0);
48
+ rb_define_method(File, "get_comment", zipruby_file_get_comment, -1);
49
+ rb_define_method(File, "comment", zipruby_file_get_comment, -1);
50
+ rb_define_method(File, "comment=", zipruby_file_set_comment, 1);
51
+ rb_define_method(File, "delete", zipruby_file_delete, 0);
52
+ rb_define_method(File, "rename", zipruby_file_rename, 1);
53
+ rb_define_method(File, "unchange", zipruby_file_unchange, 1);
54
+ rb_define_method(File, "revert", zipruby_file_unchange, 1);
55
+ rb_define_method(File, "name", zipruby_file_name, 0);
56
+ rb_define_method(File, "index", zipruby_file_index, 0);
57
+ rb_define_method(File, "crc", zipruby_file_crc, 0);
58
+ rb_define_method(File, "size", zipruby_file_size, 0);
59
+ rb_define_method(File, "mtime", zipruby_file_mtime, 0);
60
+ rb_define_method(File, "comp_size", zipruby_file_comp_size, 0);
61
+ rb_define_method(File, "comp_method", zipruby_file_comp_method, 0);
62
+ rb_define_method(File, "encryption_method", zipruby_file_encryption_method, 0);
63
+ }
64
+
65
+ static VALUE zipruby_file_alloc(VALUE klass) {
66
+ struct zipruby_file *p = ALLOC(struct zipruby_file);
67
+
68
+ p->archive = NULL;
69
+ p->file = NULL;
70
+ p->sb = NULL;
71
+
72
+ return Data_Wrap_Struct(klass, zipruby_file_mark, zipruby_file_free, p);
73
+ }
74
+
75
+ static void zipruby_file_mark(struct zipruby_file *p) {
76
+ if (p->archive) { rb_gc_mark(p->v_archive); }
77
+ if (p->sb) { rb_gc_mark(p->v_sb); }
78
+ }
79
+
80
+ static void zipruby_file_free(struct zipruby_file *p) {
81
+ xfree(p);
82
+ }
83
+
84
+ /* */
85
+ static VALUE zipruby_file_initialize(int argc, VALUE *argv, VALUE self) {
86
+ VALUE archive, index, flags, stat_flags;
87
+ struct zipruby_archive *p_archive;
88
+ struct zipruby_file *p_file;
89
+ struct zipruby_stat *p_stat;
90
+ struct zip_file *fzip;
91
+ char *fname = NULL;
92
+ int i_index = -1, i_flags = 0;
93
+
94
+ rb_scan_args(argc, argv, "22", &archive, &index, &flags, &stat_flags);
95
+
96
+ if (!rb_obj_is_instance_of(archive, Archive)) {
97
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected Zip::Archive)", rb_class2name(CLASS_OF(archive)));
98
+ }
99
+
100
+ switch (TYPE(index)) {
101
+ case T_STRING: fname = RSTRING_PTR(index); break;
102
+ case T_FIXNUM: i_index = NUM2INT(index); break;
103
+ default:
104
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected String or Fixnum)", rb_class2name(CLASS_OF(index)));
105
+ }
106
+
107
+ if (!NIL_P(flags)) {
108
+ i_flags = NUM2INT(flags);
109
+ }
110
+
111
+ Data_Get_Struct(archive, struct zipruby_archive, p_archive);
112
+ Check_Archive(p_archive);
113
+
114
+ if (fname) {
115
+ fzip = zip_fopen(p_archive->archive, fname, i_flags);
116
+
117
+ if (fzip == NULL) {
118
+ rb_raise(Error, "Open file failed - %s: %s", fname, zip_strerror(p_archive->archive));
119
+ }
120
+ } else {
121
+ fzip = zip_fopen_index(p_archive->archive, i_index, i_flags);
122
+
123
+ if (fzip == NULL) {
124
+ rb_raise(Error, "Open file failed at %d: %s", i_index, zip_strerror(p_archive->archive));
125
+ }
126
+ }
127
+
128
+ Data_Get_Struct(self, struct zipruby_file, p_file);
129
+ p_file->v_archive = archive;
130
+ p_file->archive = p_archive->archive;
131
+ p_file->file = fzip;
132
+ p_file->v_sb = rb_funcall(Stat, rb_intern("new"), 3, archive, index, stat_flags);
133
+ Data_Get_Struct(p_file->v_sb, struct zipruby_stat, p_stat);
134
+ p_file->sb = p_stat->sb;
135
+
136
+ return Qnil;
137
+ }
138
+
139
+ /* */
140
+ static VALUE zipruby_file_close(VALUE self) {
141
+ struct zipruby_file *p_file;
142
+ int error;
143
+
144
+ Data_Get_Struct(self, struct zipruby_file, p_file);
145
+ Check_File(p_file);
146
+
147
+ if ((error = zip_fclose(p_file->file)) != 0) {
148
+ char errstr[ERRSTR_BUFSIZE];
149
+ zip_unchange(p_file->archive, p_file->sb->index);
150
+ zip_error_to_str(errstr, ERRSTR_BUFSIZE, error, errno);
151
+ rb_raise(Error, "Close file failed: %s", errstr);
152
+ }
153
+
154
+ p_file->archive = NULL;
155
+ p_file->file = NULL;
156
+ p_file->sb = NULL;
157
+
158
+ return Qnil;
159
+ }
160
+
161
+ /* */
162
+ static VALUE zipruby_file_read(int argc, VALUE *argv, VALUE self) {
163
+ VALUE size, retval = Qnil;
164
+ struct zipruby_file *p_file;
165
+ struct zip_stat sb;
166
+ int block_given;
167
+ size_t bytes_left;
168
+ char buf[DATA_BUFSIZE];
169
+ ssize_t n;
170
+
171
+ rb_scan_args(argc, argv, "01", &size);
172
+ Data_Get_Struct(self, struct zipruby_file, p_file);
173
+ Check_File(p_file);
174
+ zip_stat_init(&sb);
175
+
176
+ if (p_file->archive->cdir->entry[0].bitflags & ZIP_GPBF_ENCRYPTED) {
177
+ rb_raise(Error, "Read file failed: File encrypted");
178
+ }
179
+
180
+ if (zip_stat_index(p_file->archive, p_file->sb->index, 0, &sb)) {
181
+ rb_raise(Error, "Read file failed: %s", zip_strerror(p_file->archive));
182
+ }
183
+
184
+ if (NIL_P(size)) {
185
+ bytes_left = sb.size;
186
+ } else {
187
+ bytes_left = NUM2LONG(size);
188
+ }
189
+
190
+ if (bytes_left <= 0) {
191
+ return Qnil;
192
+ }
193
+
194
+ block_given = rb_block_given_p();
195
+
196
+ while ((n = zip_fread(p_file->file, buf, MIN(bytes_left, sizeof(buf)))) > 0) {
197
+ if (block_given) {
198
+ rb_yield(rb_str_new(buf, n));
199
+ } else {
200
+ if (NIL_P(retval)) {
201
+ retval = rb_str_new(buf, n);
202
+ } else {
203
+ rb_str_buf_cat(retval, buf, n);
204
+ }
205
+ }
206
+
207
+ bytes_left -= n;
208
+ }
209
+
210
+ if (n == -1) {
211
+ rb_raise(Error, "Read file failed: %s", zip_file_strerror(p_file->file));
212
+ }
213
+
214
+ return retval;
215
+ }
216
+
217
+ /* */
218
+ static VALUE zipruby_file_stat(VALUE self) {
219
+ struct zipruby_file *p_file;
220
+
221
+ Data_Get_Struct(self, struct zipruby_file, p_file);
222
+ Check_File(p_file);
223
+
224
+ return p_file->v_sb;
225
+ }
226
+
227
+ /* */
228
+ static VALUE zipruby_file_get_comment(int argc, VALUE *argv, VALUE self) {
229
+ VALUE flags;
230
+ struct zipruby_file *p_file;
231
+ const char *comment;
232
+ int lenp, i_flags = 0;
233
+
234
+ rb_scan_args(argc, argv, "01", &flags);
235
+
236
+ if (!NIL_P(flags)) {
237
+ i_flags = NUM2INT(flags);
238
+ }
239
+
240
+ Data_Get_Struct(self, struct zipruby_file, p_file);
241
+ Check_File(p_file);
242
+
243
+ // XXX: How is the error checked?
244
+ comment = zip_get_file_comment(p_file->archive, p_file->sb->index, &lenp, i_flags);
245
+
246
+ return comment ? rb_str_new(comment, lenp) : Qnil;
247
+ }
248
+
249
+ /* */
250
+ static VALUE zipruby_file_set_comment(VALUE self, VALUE comment) {
251
+ struct zipruby_file *p_file;
252
+ char *s_comment = NULL;
253
+ int len = 0;
254
+
255
+ if (!NIL_P(comment)) {
256
+ Check_Type(comment, T_STRING);
257
+ s_comment = RSTRING_PTR(comment);
258
+ len = RSTRING_LEN(comment);
259
+ }
260
+
261
+ Data_Get_Struct(self, struct zipruby_file, p_file);
262
+ Check_File(p_file);
263
+
264
+ if (zip_set_file_comment(p_file->archive, p_file->sb->index, s_comment, len) == -1) {
265
+ zip_unchange_all(p_file->archive);
266
+ zip_unchange_archive(p_file->archive);
267
+ rb_raise(Error, "Comment file failed - %s: %s", p_file->sb->name, zip_strerror(p_file->archive));
268
+ }
269
+
270
+ return Qnil;
271
+ }
272
+
273
+ /* */
274
+ static VALUE zipruby_file_delete(VALUE self) {
275
+ struct zipruby_file *p_file;
276
+
277
+ Data_Get_Struct(self, struct zipruby_file, p_file);
278
+ Check_File(p_file);
279
+
280
+ if (zip_delete(p_file->archive, p_file->sb->index) == -1) {
281
+ zip_unchange_all(p_file->archive);
282
+ zip_unchange_archive(p_file->archive);
283
+ rb_raise(Error, "Delete file failed - %s: %s", p_file->sb->name, zip_strerror(p_file->archive));
284
+ }
285
+
286
+ return Qnil;
287
+ }
288
+
289
+ /* */
290
+ static VALUE zipruby_file_rename(VALUE self, VALUE name) {
291
+ struct zipruby_file *p_file;
292
+
293
+ Check_Type(name, T_STRING);
294
+ Data_Get_Struct(self, struct zipruby_file, p_file);
295
+ Check_File(p_file);
296
+
297
+ if (zip_rename(p_file->archive, p_file->sb->index, RSTRING_PTR(name)) == -1) {
298
+ zip_unchange_all(p_file->archive);
299
+ zip_unchange_archive(p_file->archive);
300
+ rb_raise(Error, "Rename file failed - %s: %s", p_file->sb->name, zip_strerror(p_file->archive));
301
+ }
302
+
303
+ return Qnil;
304
+ }
305
+
306
+ /* */
307
+ static VALUE zipruby_file_unchange(VALUE self) {
308
+ struct zipruby_file *p_file;
309
+
310
+ Data_Get_Struct(self, struct zipruby_file, p_file);
311
+ Check_File(p_file);
312
+
313
+ if (zip_unchange(p_file->archive, p_file->sb->index) == -1) {
314
+ rb_raise(Error, "Unchange file failed - %s: %s", p_file->sb->name, zip_strerror(p_file->archive));
315
+ }
316
+
317
+ return Qnil;
318
+ }
319
+
320
+ /* */
321
+ static VALUE zipruby_file_name(VALUE self) {
322
+ struct zipruby_file *p_file;
323
+
324
+ Data_Get_Struct(self, struct zipruby_file, p_file);
325
+ Check_File(p_file);
326
+
327
+ return rb_funcall(p_file->v_sb, rb_intern("name"), 0);
328
+ }
329
+
330
+ /* */
331
+ static VALUE zipruby_file_index(VALUE self) {
332
+ struct zipruby_file *p_file;
333
+
334
+ Data_Get_Struct(self, struct zipruby_file, p_file);
335
+ Check_File(p_file);
336
+
337
+ return rb_funcall(p_file->v_sb, rb_intern("index"), 0);
338
+ }
339
+
340
+ /* */
341
+ static VALUE zipruby_file_crc(VALUE self) {
342
+ struct zipruby_file *p_file;
343
+
344
+ Data_Get_Struct(self, struct zipruby_file, p_file);
345
+ Check_File(p_file);
346
+
347
+ return rb_funcall(p_file->v_sb, rb_intern("crc"), 0);
348
+ }
349
+
350
+ /* */
351
+ static VALUE zipruby_file_size(VALUE self) {
352
+ struct zipruby_file *p_file;
353
+
354
+ Data_Get_Struct(self, struct zipruby_file, p_file);
355
+ Check_File(p_file);
356
+
357
+ return rb_funcall(p_file->v_sb, rb_intern("size"), 0);
358
+ }
359
+
360
+ /* */
361
+ static VALUE zipruby_file_mtime(VALUE self) {
362
+ struct zipruby_file *p_file;
363
+
364
+ Data_Get_Struct(self, struct zipruby_file, p_file);
365
+ Check_File(p_file);
366
+
367
+ return rb_funcall(p_file->v_sb, rb_intern("mtime"), 0);
368
+ }
369
+
370
+ /* */
371
+ static VALUE zipruby_file_comp_size(VALUE self) {
372
+ struct zipruby_file *p_file;
373
+
374
+ Data_Get_Struct(self, struct zipruby_file, p_file);
375
+ Check_File(p_file);
376
+
377
+ return rb_funcall(p_file->v_sb, rb_intern("comp_size"), 0);
378
+ }
379
+
380
+ /* */
381
+ static VALUE zipruby_file_comp_method(VALUE self) {
382
+ struct zipruby_file *p_file;
383
+
384
+ Data_Get_Struct(self, struct zipruby_file, p_file);
385
+ Check_File(p_file);
386
+
387
+ return rb_funcall(p_file->v_sb, rb_intern("comp_method"), 0);
388
+ }
389
+
390
+ /* */
391
+ static VALUE zipruby_file_encryption_method(VALUE self) {
392
+ struct zipruby_file *p_file;
393
+
394
+ Data_Get_Struct(self, struct zipruby_file, p_file);
395
+ Check_File(p_file);
396
+
397
+ return rb_funcall(p_file->v_sb, rb_intern("encryption_method"), 0);
398
+ }