first exiv2 support that does not crash immediately
[geeqie.git] / src / exiv2.cc
1
2 #ifdef HAVE_CONFIG_H
3 #  include "config.h"
4 #endif
5
6 #ifdef HAVE_EXIV2
7
8 #include <exiv2/image.hpp>
9 #include <exiv2/exif.hpp>
10 #include <iostream>
11
12 extern "C" {
13
14 #include <glib.h> 
15 #include "exif.h"
16
17
18 struct _ExifData
19 {
20         Exiv2::ExifData exifData;
21         Exiv2::ExifData::const_iterator iter;
22 };
23
24
25 ExifData *exif_read(gchar *path, gint parse_color_profile)
26 {
27         try {
28                 ExifData *exif = g_new0(ExifData, 1);
29         
30                 Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(path);
31                 g_assert (image.get() != 0);
32                 image->readMetadata();
33                 exif->exifData = image->exifData();
34         }
35         catch (Exiv2::AnyError& e) {
36                 std::cout << "Caught Exiv2 exception '" << e << "'\n";
37         }
38 }
39
40 void exif_free(ExifData *exif)
41 {
42 }
43
44
45 gchar *exif_get_data_as_text(ExifData *exif, const gchar *key)
46 {
47         return g_strdup(exif->exifData[key].toString().c_str());
48 }
49
50 gint exif_get_integer(ExifData *exif, const gchar *key, gint *value)
51 {
52         return exif->exifData[key].toLong();
53 }
54
55 ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign)
56 {
57 /*      Exiv2::Rational v = exif->exifData[key];
58         ExifRational *ret = 
59         return exif->exifData[key];
60 */
61 }
62
63 double exif_rational_to_double(ExifRational *r, gint sign)
64 {
65         if (!r || r->den == 0.0) return 0.0;
66
67         if (sign) return (double)((int)r->num) / (double)((int)r->den);
68         return (double)r->num / r->den;
69 }
70
71 ExifItem *exif_get_item(ExifData *exif, const gchar *key)
72 {
73         Exiv2::Exifdatum *item = &exif->exifData[key];
74         return (ExifItem *)item;
75 }
76
77 ExifItem *exif_get_first_item(ExifData *exif)
78 {
79         exif->iter = exif->exifData.begin();
80         if (exif->iter == exif->exifData.end()) return NULL;
81         const Exiv2::Exifdatum *item = &*exif->iter;
82         return (ExifItem *)item;
83 }
84
85 ExifItem *exif_get_next_item(ExifData *exif)
86 {
87         exif->iter++;
88         if (exif->iter == exif->exifData.end()) return NULL;
89         const Exiv2::Exifdatum *item = &*exif->iter;
90         return (ExifItem *)item;
91 }
92
93 const char *exif_item_get_tag_name(ExifItem *item)
94 {
95         return ((Exiv2::Exifdatum *)item)->tagName().c_str();
96 }
97
98 guint exif_item_get_tag_id(ExifItem *item)
99 {
100         return ((Exiv2::Exifdatum *)item)->idx();
101 }
102
103 guint exif_item_get_elements(ExifItem *item)
104 {
105         return ((Exiv2::Exifdatum *)item)->count();
106 }
107
108 char *exif_item_get_data(ExifItem *item, guint *data_len)
109 {
110 }
111
112 const char *exif_item_get_description(ExifItem *item)
113 {
114         return ((Exiv2::Exifdatum *)item)->tagLabel().c_str();
115 }
116
117 /*
118 invalidTypeId, unsignedByte, asciiString, unsignedShort,
119   unsignedLong, unsignedRational, signedByte, undefined,
120   signedShort, signedLong, signedRational, string,
121   date, time, comment, directory,
122   xmpText, xmpAlt, xmpBag, xmpSeq,
123   langAlt, lastTypeId 
124
125         EXIF_FORMAT_UNKNOWN             = 0,
126         EXIF_FORMAT_BYTE_UNSIGNED       = 1,
127         EXIF_FORMAT_STRING              = 2,
128         EXIF_FORMAT_SHORT_UNSIGNED      = 3,
129         EXIF_FORMAT_LONG_UNSIGNED       = 4,
130         EXIF_FORMAT_RATIONAL_UNSIGNED   = 5,
131         EXIF_FORMAT_BYTE                = 6,
132         EXIF_FORMAT_UNDEFINED           = 7,
133         EXIF_FORMAT_SHORT               = 8,
134         EXIF_FORMAT_LONG                = 9,
135         EXIF_FORMAT_RATIONAL            = 10,
136         EXIF_FORMAT_FLOAT               = 11,
137         EXIF_FORMAT_DOUBLE              = 12
138 */
139
140
141 guint exif_item_get_format_id(ExifItem *item)
142 {
143         return ((Exiv2::Exifdatum *)item)->typeId();
144 }
145 const char *exif_item_get_format_name(ExifItem *item, gint brief)
146 {
147 /*
148         return exif_item_get_tag_name(item);
149 */
150 }
151
152
153 gchar *exif_item_get_data_as_text(ExifItem *item)
154 {
155         return g_strdup(((Exiv2::Exifdatum *)item)->toString().c_str());
156 }
157
158
159 gint exif_item_get_integer(ExifItem *item, gint *value)
160 {
161 }
162
163 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign)
164 {
165 }
166
167 const gchar *exif_get_description_by_key(const gchar *key)
168 {
169 }
170
171 gint format_raw_img_exif_offsets_fd(int fd, const gchar *path,
172                                     unsigned char *header_data, const guint header_len,
173                                     guint *image_offset, guint *exif_offset)
174 {
175         return 0;
176 }
177
178 }
179
180 #endif 
181 /* HAVE_EXIV2 */