ruby-exiv2 1.3 → 1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,369 +0,0 @@
1
- #include "exiv2.hpp"
2
-
3
- /*
4
- * First, I have to get out type by key. If such key is forbidden, I will refuse to marshall it.
5
- * Then, I will cast ruby VALUE to C++ value, according to type_id
6
- * then I will just set apropreciated hash entry to this casted value
7
- */
8
- static bool marshall_value(Exiv2::ExifData &data, const char* key, VALUE value) {
9
- Exiv2::TypeId type_id;
10
- try {
11
- Exiv2::ExifKey exif_key(key);
12
- type_id = Exiv2::ExifTags::tagType(exif_key.tag(), exif_key.ifdId());
13
- }
14
- catch(Exiv2::Error& e) {
15
- rb_raise(eError, "Cannot set tag %s because it doesn't exists. Look at http://www.exiv2.org/tags.html for list of supported tags", key);
16
- }
17
- switch(type_id) {
18
- case Exiv2::invalidTypeId:
19
- {
20
- rb_warn("Trying to marshall invalid type id");
21
- return Qnil;
22
- }
23
-
24
- case Exiv2::unsignedByte:
25
- case Exiv2::unsignedShort:
26
- case Exiv2::unsignedLong:
27
- case Exiv2::signedShort:
28
- case Exiv2::signedLong:
29
- {
30
- data[key] = NUM2INT(value);
31
- return true;
32
- }
33
-
34
- case Exiv2::asciiString:
35
- case Exiv2::string:
36
- case Exiv2::undefined:
37
- {
38
- data[key] = std::string(STR(value));
39
- return true;
40
- }
41
-
42
- case Exiv2::unsignedRational:
43
- case Exiv2::signedRational:
44
- {
45
- if(rb_respond_to(value, rb_intern("numerator"))) {
46
- int numerator = NUM2INT(rb_funcall(value, rb_intern("numerator"), 0));
47
- int denominator = NUM2INT(rb_funcall(value, rb_intern("denominator"), 0));
48
- data[key] = Exiv2::Rational(numerator, denominator);
49
- return true;
50
- }
51
- data[key] = Exiv2::Rational(NUM2INT(value), 1);
52
- return true;
53
- }
54
- case Exiv2::date: {
55
- int year = NUM2INT(rb_funcall(value, rb_intern("year"), 0));
56
- int month = NUM2INT(rb_funcall(value, rb_intern("month"), 0));
57
- int day = NUM2INT(rb_funcall(value, rb_intern("day"), 0));
58
- data[key] = Exiv2::DateValue(year, month, day);
59
- return true;
60
- }
61
- case Exiv2::time: {
62
- int hour = NUM2INT(rb_funcall(value, rb_intern("hour"), 0));
63
- int minute = NUM2INT(rb_funcall(value, rb_intern("min"), 0));
64
- int second = NUM2INT(rb_funcall(value, rb_intern("sec"), 0));
65
- data[key] = Exiv2::TimeValue(hour, minute, second);
66
- return true;
67
- }
68
-
69
- case Exiv2::invalid6:
70
- case Exiv2::comment:
71
- case Exiv2::directory:
72
- case Exiv2::lastTypeId:
73
- {
74
- data[key] = std::string(STR(value));
75
- return true;
76
- }
77
- }
78
- return false;
79
- }
80
-
81
-
82
-
83
-
84
- /*
85
- * Access exif tag by name
86
- *
87
- * <code>Exiv2::Image.new("a.jpg").exif["Exif.Image.Model"] => "FinePixS2Pro"</code>
88
- */
89
- static VALUE exiv2_exif_get(VALUE self, VALUE key) {
90
- __BEGIN
91
- rbImage* image;
92
- Data_Get_Struct(self, rbImage, image);
93
-
94
- VALUE strkey = rb_funcall(key, rb_intern("to_s"), 0);
95
- Exiv2::ExifData &exifData = image->image->exifData();
96
-
97
- if(exifData.empty()) {
98
- return Qnil;
99
- }
100
-
101
- Exiv2::ExifKey exifKey(STR(strkey));
102
- Exiv2::ExifData::const_iterator pos = exifData.findKey(exifKey);
103
- if (pos == exifData.end()) {
104
- return Qnil;
105
- }
106
-
107
- return unmarshall_value(pos->value());
108
- __NIL_END
109
- }
110
-
111
-
112
-
113
- /*
114
- * @exif["Exif.Photo.PixelXDimension"] = 3024
115
- * [] — is a universal accessor
116
- */
117
- static VALUE exiv2_exif_set(VALUE self, VALUE key, VALUE value) {
118
- __BEGIN
119
- rbImage* image;
120
- Data_Get_Struct(self, rbImage, image);
121
-
122
- VALUE strkey = rb_funcall(key, rb_intern("to_s"), 0);
123
-
124
- if(!marshall_value(image->image->exifData(), STR(strkey), value)) {
125
- THROW("Couldn't write %s", STR(strkey));
126
- }
127
-
128
- image->dirty = true;
129
- return value;
130
- __NIL_END
131
- }
132
-
133
- /*
134
- * Iterates through all exif tags in image
135
- */
136
- static VALUE exiv2_exif_each(int argc, VALUE *argv, VALUE self) {
137
- __BEGIN
138
- rbImage* image;
139
- Data_Get_Struct(self, rbImage, image);
140
-
141
- VALUE prefix;
142
- rb_scan_args(argc, argv, "01", &prefix);
143
-
144
- Exiv2::ExifData &exifData = image->image->exifData();
145
- if(exifData.empty()) {
146
- return Qnil;
147
- }
148
-
149
- Exiv2::ExifData::const_iterator end = exifData.end();
150
- for(Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i) {
151
- VALUE key = rb_str_new(i->key().c_str(), i->key().length());
152
- VALUE val = unmarshall_value(i->value());
153
- //VALUE val = rb_str_new(i->toString().c_str(), i->toString().length());
154
- if(prefix != Qnil && INT2FIX(0) != rb_funcall(key, rb_intern("index"), 1, prefix)) {
155
- continue;
156
- }
157
- rb_yield(rb_ary_new3(2, key, val));
158
- }
159
- return self;
160
- __END
161
- }
162
-
163
- /*
164
- * Delete exif value by it's name
165
- */
166
- static VALUE exiv2_exif_delete(VALUE self, VALUE key) {
167
- __BEGIN
168
- rbImage* image;
169
- Data_Get_Struct(self, rbImage, image);
170
-
171
- VALUE strkey = rb_funcall(key, rb_intern("to_s"), 0);
172
- Exiv2::ExifData &exifData = image->image->exifData();
173
-
174
- if(exifData.empty()) {
175
- return Qnil;
176
- }
177
-
178
- Exiv2::ExifKey exifKey(STR(strkey));
179
- Exiv2::ExifData::iterator pos = exifData.findKey(exifKey);
180
- if (pos == exifData.end()) {
181
- return Qnil;
182
- }
183
-
184
- std::string v = pos->toString();
185
- exifData.erase(pos);
186
- return rb_str_new(v.c_str(), v.length());
187
- __NIL_END
188
- }
189
-
190
- /*
191
- * Clear all exif data in image
192
- */
193
- static VALUE exiv2_exif_clear(VALUE self) {
194
- __BEGIN
195
- rbImage* image;
196
- Data_Get_Struct(self, rbImage, image);
197
-
198
- Exiv2::ExifData &exifData = image->image->exifData();
199
-
200
- if(exifData.empty()) {
201
- return Qnil;
202
- }
203
- exifData.clear();
204
- return self;
205
- __END
206
- }
207
-
208
- /*
209
- * Count of exif tags in image
210
- */
211
- static VALUE exiv2_exif_count(VALUE self) {
212
- __BEGIN
213
- rbImage* image;
214
- Data_Get_Struct(self, rbImage, image);
215
-
216
- Exiv2::ExifData &exifData = image->image->exifData();
217
-
218
- return INT2FIX(exifData.count());
219
- __END
220
- }
221
-
222
- /*
223
- * Predicate method. Is exif empty?
224
- */
225
- static VALUE exiv2_exif_empty(VALUE self) {
226
- __BEGIN
227
- rbImage* image;
228
- Data_Get_Struct(self, rbImage, image);
229
-
230
- Exiv2::ExifData &exifData = image->image->exifData();
231
-
232
- return exifData.empty() ? Qtrue : Qfalse;
233
- __NIL_END
234
- }
235
-
236
-
237
- #ifdef HAVE_IFDTAGLIST
238
- static void tag_leave(Exiv2::TagInfo* info) {
239
-
240
- }
241
-
242
- static VALUE create_exiv2_tag(Exiv2::TagInfo* info) {
243
- return Data_Wrap_Struct(cTag, 0, tag_leave, info);
244
- }
245
-
246
- static int iterate_tag_collection(const Exiv2::TagInfo* collection, bool to_yield = true) {
247
- Exiv2::TagInfo* _collection = const_cast<Exiv2::TagInfo *>(collection);
248
- int i;
249
- for (i=0; _collection[i].tag_ != 0xffff; ++i) {
250
- if(to_yield) {
251
- rb_yield(create_exiv2_tag(_collection + i));
252
- }
253
- }
254
- return i;
255
- }
256
-
257
- /*
258
- * Iterates through all available exif tags, that can be set in the image
259
- */
260
- static VALUE exiv2_tags_each(VALUE self) {
261
- __BEGIN
262
- iterate_tag_collection(Exiv2::ExifTags::ifdTagList());
263
- iterate_tag_collection(Exiv2::ExifTags::exifTagList());
264
- iterate_tag_collection(Exiv2::ExifTags::iopTagList());
265
- iterate_tag_collection(Exiv2::ExifTags::gpsTagList());
266
- return self;
267
- __END
268
- }
269
-
270
-
271
- /*
272
- * Count of all available exif tags
273
- */
274
- static VALUE exiv2_tags_count(VALUE self) {
275
- __BEGIN
276
- return INT2NUM(
277
- iterate_tag_collection(Exiv2::ExifTags::ifdTagList(), false) +
278
- iterate_tag_collection(Exiv2::ExifTags::exifTagList(), false) +
279
- iterate_tag_collection(Exiv2::ExifTags::iopTagList(), false) +
280
- iterate_tag_collection(Exiv2::ExifTags::gpsTagList(), false)
281
- );
282
- __END
283
- }
284
- #endif /* HAVE_IFDTAGLIST */
285
-
286
- /*
287
- * Name of exif tag
288
- */
289
- static VALUE exiv2_tag_name(VALUE self) {
290
- __BEGIN
291
- Exiv2::TagInfo* tag;
292
- Data_Get_Struct(self, Exiv2::TagInfo, tag);
293
-
294
- return tag->name_ ? rb_str_new2(tag->name_) : Qnil;
295
- __END
296
- }
297
-
298
- /*
299
- * title of exif tag
300
- */
301
- static VALUE exiv2_tag_title(VALUE self) {
302
- __BEGIN
303
- Exiv2::TagInfo* tag;
304
- Data_Get_Struct(self, Exiv2::TagInfo, tag);
305
-
306
- return tag->title_ ? rb_str_new2(tag->title_) : Qnil;
307
- __END
308
- }
309
-
310
- /*
311
- * description of exif tag
312
- */
313
- static VALUE exiv2_tag_desc(VALUE self) {
314
- __BEGIN
315
- Exiv2::TagInfo* tag;
316
- Data_Get_Struct(self, Exiv2::TagInfo, tag);
317
-
318
- return tag->desc_ ? rb_str_new2(tag->desc_) : Qnil;
319
- __END
320
- }
321
-
322
- /*
323
- * section of exif tag
324
- */
325
- static VALUE exiv2_tag_section(VALUE self) {
326
- __BEGIN
327
- Exiv2::TagInfo* tag;
328
- Data_Get_Struct(self, Exiv2::TagInfo, tag);
329
-
330
- return rb_str_new2(Exiv2::ExifTags::sectionName(tag->sectionId_));
331
- __END
332
- }
333
-
334
- /*
335
- * IFD of exif tag
336
- */
337
- static VALUE exiv2_tag_ifd(VALUE self) {
338
- __BEGIN
339
- Exiv2::TagInfo* tag;
340
- Data_Get_Struct(self, Exiv2::TagInfo, tag);
341
-
342
- return rb_str_new2(Exiv2::ExifTags::ifdName(tag->ifdId_));
343
- __END
344
- }
345
-
346
-
347
- void Init_exif() {
348
- cExif = rb_define_class_under(mExiv2, "Exif", rb_cObject);
349
- rb_define_method(cExif, "each", VALUEFUNC(exiv2_exif_each), -1);
350
- rb_define_method(cExif, "[]", VALUEFUNC(exiv2_exif_get), 1);
351
- rb_define_method(cExif, "[]=", VALUEFUNC(exiv2_exif_set), 2);
352
- rb_define_method(cExif, "delete", VALUEFUNC(exiv2_exif_delete), 1);
353
- rb_define_method(cExif, "clear", VALUEFUNC(exiv2_exif_clear), 0);
354
- rb_define_method(cExif, "count", VALUEFUNC(exiv2_exif_count), 0);
355
- rb_define_method(cExif, "empty?", VALUEFUNC(exiv2_exif_empty), 0);
356
- // rb_define_singleton_method(cExif, "iptc_tags_each", VALUEFUNC(exiv2_iptc_tags_each), 0);
357
-
358
- cTag = rb_define_class_under(mExiv2, "Tag", rb_cObject);
359
- #ifdef HAVE_IFDTAGLIST
360
- rb_define_singleton_method(cTag, "each", VALUEFUNC(exiv2_tags_each), 0);
361
- rb_define_singleton_method(cTag, "count", VALUEFUNC(exiv2_tags_count), 0);
362
- #endif /* HAVE_IFDTAGLIST */
363
-
364
- rb_define_method(cTag, "ifd", VALUEFUNC(exiv2_tag_ifd), 0);
365
- rb_define_method(cTag, "section", VALUEFUNC(exiv2_tag_section), 0);
366
- rb_define_method(cTag, "name", VALUEFUNC(exiv2_tag_name), 0);
367
- rb_define_method(cTag, "title", VALUEFUNC(exiv2_tag_title), 0);
368
- rb_define_method(cTag, "desc", VALUEFUNC(exiv2_tag_desc), 0);
369
- }
@@ -1,78 +0,0 @@
1
- // ***************************************************************** -*- C++ -*-
2
- /*
3
- * Copyright (C) 2006 Max Lapshin <max@maxidoors.ru>
4
- *
5
- * This program is part of the ruby-exiv2 distribution.
6
- *
7
- * This program is free software; you can redistribute it and/or
8
- * modify it under the terms of the GNU General Public License
9
- * as published by the Free Software Foundation; either version 2
10
- * of the License, or (at your option) any later version.
11
- *
12
- * This program is distributed in the hope that it will be useful,
13
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- * GNU General Public License for more details.
16
- *
17
- * You should have received a copy of the GNU General Public License
18
- * along with this program; if not, write to the Free Software
19
- * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
20
- */
21
- /*
22
- Abstract: Driver for using exiv2 library (http://www.exiv2.org/) in ruby language
23
-
24
- File: exiv2.cpp
25
- Version: $Rev: 1 $
26
- Author(s): Max Lapshin <max@maxidoors.ru>
27
- */
28
- // *****************************************************************************
29
- #include "exiv2.hpp"
30
-
31
-
32
- VALUE mExiv2, cImage, cExif, cTag, cIptc, cThumbnail, eError;
33
-
34
- void rb_exiv2_throw(const char *file, long unsigned int line, const char *fmt, ...) {
35
- char* message;
36
- va_list ap;
37
- va_start(ap, fmt);
38
- vasprintf(&message, fmt, ap);
39
- va_end(ap);
40
-
41
- char error_message[strlen(message) + 80];
42
- snprintf(error_message, sizeof(error_message), "%s. File: %s, line: %lu", message, file, line);
43
- free(message);
44
- rb_raise(eError, error_message);
45
- }
46
-
47
-
48
- #ifdef __cplusplus
49
- extern "C"
50
- #endif
51
-
52
- /*
53
- * Document-module: Exiv2
54
- *
55
- * Namespace for all exiv stuff
56
- */
57
-
58
- /*
59
- * Document-class: Exiv2::Error
60
- * error, thrown if anything goes wrong inside in exiv2
61
- */
62
-
63
- void Init_exiv2_bin() {
64
- mExiv2 = rb_define_module("Exiv2");
65
-
66
- eError = rb_define_class_under(mExiv2, "Error", rb_eStandardError);
67
-
68
- Init_image();
69
- Init_exif();
70
- Init_iptc();
71
- //cThumbnail = rb_define_class_under(mExiv2, "Thumbnail", rb_cObject);
72
- //rb_define_method(cThumbnail, "extension", VALUEFUNC(exiv2_thumb_ext), 0);
73
- //rb_define_method(cThumbnail, "format", VALUEFUNC(exiv2_thumb_format), 0);
74
- //rb_define_method(cThumbnail, "clear", VALUEFUNC(exiv2_thumb_clear), 0);
75
- //rb_define_method(cThumbnail, "to_s", VALUEFUNC(exiv2_thumb_read), 0);
76
- //rb_define_method(cThumbnail, "read", VALUEFUNC(exiv2_thumb_read), 0);
77
- //rb_define_method(cThumbnail, "write", VALUEFUNC(exiv2_thumb_write), 1);
78
- }
@@ -1,75 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "mkmf"
4
- require 'optparse'
5
- CONFIG["CPP"] = "g++ -E "
6
- CONFIG["CC"] = "g++ "
7
- CONFIG["LDSHARED"].gsub!(/^cc /,"g++ ")
8
-
9
-
10
- $CPPFLAGS << " -Wall -I/usr/include/exiv2 "
11
- $LDFLAGS << " -lstdc++ "
12
-
13
- OptionParser.new do |opts|
14
- opts.on("-E PATH", "--exiv2-dir=PATH", "Prefix, where libexiv2 is installed: /usr/local") do |path|
15
- $LDFLAGS << "-L" + path + "/lib "
16
- $CPPFLAGS << "-I" + path + "/include "
17
- $CPPFLAGS << "-I" + path + "/include/exiv2 "
18
- end
19
- opts.parse!(ARGV.include?("--") ? ARGV[ARGV.index("--")+1..-1] : ARGV.clone)
20
- end
21
-
22
-
23
- have_header "exif.hpp"
24
-
25
-
26
- image_factory_open = "Exiv2::ImageFactory::open"
27
- def image_factory_open.upcase
28
- "IMGFACTORYOPEN"
29
- end
30
- have_library "exiv2", image_factory_open do <<-SRC
31
- #include <image.hpp>
32
- #include <exif.hpp>
33
-
34
-
35
- #include <string>
36
- #include <vector>
37
- #include <iostream>
38
- #include <fstream>
39
- #include <iomanip>
40
- #include <cstring>
41
- #include <cassert>
42
-
43
- #include <stdarg.h>
44
- int main(void) {
45
- #{image_factory_open}("a");
46
- }
47
- SRC
48
- end
49
-
50
-
51
- ifd_tag_list = "Exiv2::ExifTags::ifdTagList"
52
- def ifd_tag_list.upcase
53
- "IFDTAGLIST"
54
- end
55
- have_func ifd_tag_list do <<-SRC
56
- #include <image.hpp>
57
- #include <exif.hpp>
58
-
59
-
60
- #include <string>
61
- #include <vector>
62
- #include <iostream>
63
- #include <fstream>
64
- #include <iomanip>
65
- #include <cstring>
66
- #include <cassert>
67
-
68
- #include <stdarg.h>
69
- int main(void) {
70
- #{ifd_tag_list}();
71
- }
72
- SRC
73
- end
74
- create_makefile 'exiv2_bin'
75
-