make libexif 'gcc-4.0 -Wall -Werror' clean
[platform/upstream/libexif.git] / libexif / canon / mnote-canon-entry.c
1 /* mnote-canon-entry.c
2  *
3  * Copyright © 2002 Lutz Müller <lutz@users.sourceforge.net>
4  * Copyright © 2003 Matthieu Castet <mat-c@users.sourceforge.net>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22 #include "config.h"
23 #include "mnote-canon-entry.h"
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28
29 #include <libexif/exif-format.h>
30 #include <libexif/exif-utils.h>
31 #include <libexif/i18n.h>
32
33 /* #define DEBUG */
34
35 #undef  MIN
36 #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
37
38 #define CF(format,target,v,maxlen)                              \
39 {                                                               \
40         if (format != target) {                                 \
41                 snprintf (v, maxlen,                            \
42                         _("Invalid format '%s', "               \
43                         "expected '%s'."),                      \
44                         exif_format_get_name (format),          \
45                         exif_format_get_name (target));         \
46                 break;                                          \
47         }                                                       \
48 }
49
50 #define CC(number,target,v,maxlen)                                      \
51 {                                                                       \
52         if (number != target) {                                         \
53                 snprintf (v, maxlen,                                    \
54                         _("Invalid number of components (%i, "          \
55                         "expected %i)."), (int) number, (int) target);  \
56                 break;                                                  \
57         }                                                               \
58 }
59 #define CC2(number,t1,t2,v,maxlen)                                      \
60 {                                                                       \
61         if ((number != t1) && (number != t2)) {                         \
62                 snprintf (v, maxlen,                                    \
63                         _("Invalid number of components (%i, "          \
64                         "expected %i or %i)."), (int) number,           \
65                         (int) t1, (int) t2);                            \
66                 break;                                                  \
67         }                                                               \
68 }
69
70 char *
71 mnote_canon_entry_get_value (const MnoteCanonEntry *entry, char *val, unsigned int maxlen)
72 {
73     char buf[128];
74     ExifLong vl;
75     ExifShort vs, n;
76     int i;
77     unsigned char *data = entry->data;
78
79     if (!entry) return NULL;
80
81     memset (val, 0, maxlen);
82     maxlen--;
83
84         switch (entry->tag) {
85         case MNOTE_CANON_TAG_SETTINGS_1:
86                 CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen);
87                 n = exif_get_short (data, entry->order) / 2;
88                 data += 2;
89                 CC (entry->components, n, val, maxlen);
90                 for (i = 1; i < n; i++) {
91                     vs = exif_get_short (data, entry->order);
92                     data += 2;
93                     switch (i) {
94                     case 1:
95                         strncpy (val, _("Macro mode : "), maxlen);
96                         switch (vs) {
97                         case 1:
98                             strncat (val, _("Macro"), maxlen - strlen(val));
99                             break;
100                         case 2:
101                             strncat (val, _("Normal"), maxlen - strlen(val));
102                             break;
103                         default:
104                             snprintf (buf, sizeof (buf), _("%i???"), vs);
105                             strncat (val, buf, maxlen - strlen(val));
106                         }
107                         break;
108                     case 2:
109                         if (vs) {
110                                 snprintf (buf, sizeof (buf),
111                                         _(" / Self Timer : %i (ms)"), vs*100);
112                                 strncat (val, buf, maxlen - strlen(val));
113                         }
114                         break;
115                     case 4:
116                         strncat (val, _(" / Flash mode : "), maxlen - strlen(val));
117                         switch (vs) {
118                         case 0:
119                             strncat (val, _("Flash not fired"), maxlen - strlen(val));
120                             break;
121                         case 1:
122                             strncat (val, _("auto"), maxlen - strlen(val));
123                             break;
124                         case 2:
125                             strncat (val, _("on"), maxlen - strlen(val));
126                             break;
127                         case 3:
128                             strncat (val, _("red eyes reduction"), maxlen - strlen(val));
129                             break;
130                         case 4:
131                             strncat (val, _("slow synchro"), maxlen - strlen(val));
132                             break;
133                         case 5:
134                             strncat (val, _("auto + red eyes reduction"), maxlen - strlen(val));
135                             break;
136                         case 6:
137                             strncat (val, _("on + red eyes reduction"), maxlen - strlen(val));
138                             break;
139                         case 16:
140                             strncat (val, _("external"), maxlen - strlen(val));
141                             break;
142                         default:
143                             snprintf (buf, sizeof (buf), _("%i???"), vs);
144                             strncat (val, buf, maxlen - strlen(val));
145                         }
146                         break;
147                     case 5:
148                         strncat (val, _(" / Continuous drive mode : "), maxlen - strlen(val));
149                         switch (vs) {
150                         case 0:
151                             strncat (val, _("single or timer"), maxlen - strlen(val));
152                             break;
153                         case 1:
154                             strncat (val, _("continuous"), maxlen - strlen(val));
155                             break;
156                         default:
157                             snprintf (buf, sizeof (buf), _("%i???"), vs);
158                             strncat (val, buf, maxlen - strlen(val));
159                         }
160                         break;
161                     case 7:
162                         strncat (val, _(" / Focus mode : "), maxlen - strlen(val));
163                         switch (vs) {
164                         case 0:
165                             strncat (val, _("One-Shot"), maxlen - strlen(val));
166                             break;
167                         case 1:
168                             strncat (val, _("AI Servo"), maxlen - strlen(val));
169                             break;
170                         case 2:
171                             strncat (val, _("AI Focus"), maxlen - strlen(val));
172                             break;
173                         case 3:
174                             strncat (val, _("MF"), maxlen - strlen(val));
175                             break;
176                         case 4:
177                             strncat (val, _("Single"), maxlen - strlen(val));
178                             break;
179                         case 5:
180                             strncat (val, _("Continuous"), maxlen - strlen(val));
181                             break;
182                         case 6:
183                             strncat (val, _("MF"), maxlen - strlen(val));
184                             break;
185                         default:
186                             snprintf (buf, sizeof (buf), _("%i???"), vs);
187                             strncat (val, buf, maxlen - strlen(val));
188                         }
189                         break;
190                     case 10:
191                         strncat (val, _(" / Image size : "), maxlen - strlen(val));
192                         switch (vs) {
193                         case 0:
194                             strncat (val, _("Large"), maxlen - strlen(val));
195                             break;
196                         case 1:
197                             strncat (val, _("Medium"), maxlen - strlen(val));
198                             break;
199                         case 2:
200                             strncat (val, _("Small"), maxlen - strlen(val));
201                             break;
202                         default:
203                             snprintf (buf, sizeof (buf), _("%i???"), vs);
204                             strncat (val, buf, maxlen - strlen(val));
205                         }
206                         break;
207                     case 11:
208                         strncat (val, _(" / Easy shooting mode : "), maxlen - strlen(val));
209                         switch (vs) {
210                         case 0:
211                             strncat (val, _("Full Auto"), maxlen - strlen(val));
212                             break;
213                         case 1:
214                             strncat (val, _("Manual"), maxlen - strlen(val));
215                             break;
216                         case 2:
217                             strncat (val, _("Landscape"), maxlen - strlen(val));
218                             break;
219                         case 3:
220                             strncat (val, _("Fast Shutter"), maxlen - strlen(val));
221                             break;
222                         case 4:
223                             strncat (val, _("Slow Shutter"), maxlen - strlen(val));
224                             break;
225                         case 5:
226                             strncat (val, _("Night"), maxlen - strlen(val));
227                             break;
228                         case 6:
229                             strncat (val, _("Black & White"), maxlen - strlen(val));
230                             break;
231                         case 7:
232                             strncat (val, _("Sepia"), maxlen - strlen(val));
233                             break;
234                         case 8:
235                             strncat (val, _("Portrait"), maxlen - strlen(val));
236                             break;
237                         case 9:
238                             strncat (val, _("Sports"), maxlen - strlen(val));
239                             break;
240                         case 10:
241                             strncat (val, _("Macro / Close-Up"), maxlen - strlen(val));
242                             break;
243                         case 11:
244                             strncat (val, _("Pan Focus"), maxlen - strlen(val));
245                             break;
246                         default:
247                             snprintf (buf, sizeof (buf), _("%i???"), vs);
248                             strncat (val, buf, maxlen - strlen(val));
249                         }
250                         break;
251                     case 13:
252                         strncat (val, _(" / Contrast : "), maxlen - strlen(val));
253                         switch (vs) {
254                         case 0xffff:
255                             strncat (val, _("Low"), maxlen - strlen(val));
256                             break;
257                         case 0x0000:
258                             strncat (val, _("Normal"), maxlen - strlen(val));
259                             break;
260                         case 0x0001:
261                             strncat (val, _("High"), maxlen - strlen(val));
262                             break;
263                         default:
264                             snprintf (buf, sizeof (buf), _("%i???"), vs);
265                             strncat (val, buf, maxlen - strlen(val));
266                         }
267                         break;
268                     case 14:
269                         strncat (val, _(" / Saturation : "), maxlen - strlen(val));
270                         switch (vs) {
271                         case 0xffff:
272                             strncat (val, _("Low"), maxlen - strlen(val));
273                             break;
274                         case 0x0000:
275                             strncat (val, _("Normal"), maxlen - strlen(val));
276                             break;
277                         case 0x0001:
278                             strncat (val, _("High"), maxlen - strlen(val));
279                             break;
280                         default:
281                             snprintf (buf, sizeof (buf), _("%i???"), vs);
282                             strncat (val, buf, maxlen - strlen(val));
283                         }
284                         break;
285                     case 15:
286                         strncat (val, _(" / Sharpness : "), maxlen - strlen(val));
287                         switch (vs) {
288                         case 0xffff:
289                             strncat (val, _("Low"), maxlen - strlen(val));
290                             break;
291                         case 0x0000:
292                             strncat (val, _("Normal"), maxlen - strlen(val));
293                             break;
294                         case 0x0001:
295                             strncat (val, _("High"), maxlen - strlen(val));
296                             break;
297                         default:
298                             snprintf (buf, sizeof (buf), _("%i???"), vs);
299                             strncat (val, buf, maxlen - strlen(val));
300                         }
301                         break;
302                     case 16:
303                         if (vs) {
304                             strncat (val, _(" / ISO : "), maxlen - strlen(val));
305                             switch (vs) {
306                             case 15:
307                                 strncat (val, _("auto"), maxlen - strlen(val));
308                                 break;
309                             case 16:
310                                 strncat (val, _("50"), maxlen - strlen(val));
311                                 break;
312                             case 17:
313                                 strncat (val, _("100"), maxlen - strlen(val));
314                                 break;
315                             case 18:
316                                 strncat (val, _("200"), maxlen - strlen(val));
317                                 break;
318                             case 19:
319                                 strncat (val, _("400"), maxlen - strlen(val));
320                                 break;
321                             default:
322                                 snprintf (buf, sizeof (buf), _("%i???"), vs);
323                                 strncat (val, buf, maxlen - strlen(val));
324                             }
325                             break;
326                         }
327                     case 17:
328                         strncat (val, _(" / Metering mode : "), maxlen - strlen(val));
329                         switch (vs) {
330                         case 3:
331                             strncat (val, _("Evaluative"), maxlen - strlen(val));
332                             break;
333                         case 4:
334                             strncat (val, _("Partial"), maxlen - strlen(val));
335                             break;
336                         case 5:
337                             strncat (val, _("Center-weighted"), maxlen - strlen(val));
338                             break;
339                         default:
340                             snprintf (buf, sizeof (buf), _("%i???"), vs);
341                             strncat (val, buf, maxlen - strlen(val));
342                         }
343                         break;
344                     case 19:
345                         strncat (val, _(" / AF point selected : "), maxlen - strlen(val));
346                         switch (vs) {
347                         case 0x3000:
348                             strncat (val, _("none (MF)"), maxlen - strlen(val));
349                             break;
350                         case 0x3001:
351                             strncat (val, _("auto-selected"), maxlen - strlen(val));
352                             break;
353                         case 0x3002:
354                             strncat (val, _("right"), maxlen - strlen(val));
355                             break;
356                         case 0x3003:
357                             strncat (val, _("center"), maxlen - strlen(val));
358                             break;
359                         case 0x3004:
360                             strncat (val, _("left"), maxlen - strlen(val));
361                             break;
362                         default:
363                             snprintf (buf, sizeof (buf), _("0x%x???"), vs);
364                             strncat (val, buf, maxlen - strlen(val));
365                         }
366                         break;
367                     case 20:
368                                 strncat (val, _(" / Exposure mode : "), maxlen - strlen(val));
369                                 switch (vs) {
370                         case 0:
371                                         strncat (val, _("Easy shooting"), maxlen - strlen(val));
372                     break;
373                 case 1:
374                                         strncat (val, _("Program"), maxlen - strlen(val));
375                                         break;
376                                 case 2:
377                                         strncat (val, _("Tv-priority"), maxlen - strlen(val));
378                                         break;
379                                 case 3:
380                                         strncat (val, _("Av-priority"), maxlen - strlen(val));
381                                         break;
382                                 case 4:
383                                         strncat (val, _("Manual"), maxlen - strlen(val));
384                                         break;
385                                 case 5:
386                                         strncat (val, _("A-DEP"), maxlen - strlen(val));
387                                         break;
388                                 default:
389                                         snprintf (buf, sizeof (buf), _("%i???"), vs);
390                                         strncat (val, buf, maxlen - strlen(val));
391                 }
392                                 break;
393                         case 23:
394                                 snprintf (buf, sizeof (buf), _(" / long focal length of lens (in focal units) : %u"), vs);
395                                 strncat (val, buf, maxlen - strlen(val));
396                                 break;
397                         case 24:
398                                 snprintf (buf, sizeof (buf), _(" / short focal length of lens (in focal units) : %u"), vs);
399                                 strncat (val, buf, maxlen - strlen(val));
400                                 break;
401                         case 25:
402                                 snprintf (buf, sizeof (buf), _(" / focal units per mm : %u"), vs);
403                                 strncat (val, buf, maxlen - strlen(val));
404                                 break;
405                         case 29:
406                                 strncat (val, _(" / Flash details : "), maxlen - strlen(val));
407                                 if ((vs>>14)&1)
408                                         strncat (val, _("External E-TTL"), maxlen - strlen(val));
409                                 if ((vs>>13)&1)
410                                         strncat (val, _("Internal flash"), maxlen - strlen(val));
411                                 if ((vs>>11)&1)
412                                         strncat (val, _("FP sync used"), maxlen - strlen(val));
413                                 if ((vs>>4)&1)
414                                         strncat (val, _("FP sync enabled"), maxlen - strlen(val));
415 #ifdef DEBUG
416                                 printf ("Value29=0x%08x\n", vs);
417 #endif
418                                 break;
419                         case 32:
420                                 strncat (val, _(" / Focus mode2 : "), maxlen - strlen(val));
421                                 switch (vs) {
422                                 case 0:
423                                         strncat (val, _("Single"), maxlen - strlen(val));
424                                         break;
425                                 case 1:
426                                         strncat (val, _("Continuous"), maxlen - strlen(val));
427                                         break;
428                                 default:
429                                         snprintf (buf, sizeof (buf), _("%i???"), vs);
430                                         strncat (val, buf, maxlen - strlen(val));
431                                 }
432                                 break;
433 #ifdef DEBUG
434                         default:
435                                 printf ("Value%d=%d\n", i, vs);
436 #endif
437                         }
438                 }
439
440                 break;
441
442         case MNOTE_CANON_TAG_SETTINGS_2:
443                 CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen);
444                 n = exif_get_short (data, entry->order)/2;
445                 data += 2;
446                 CC (entry->components, n, val, maxlen);
447 #ifdef DEBUG
448                 printf ("Setting2 size %d %d\n",n,entry->size);
449 #endif
450                 for (i=1;i<n;i++)
451                 {
452                         vs = exif_get_short (data, entry->order);
453                         data+=2;
454                         switch(i) {
455                         case 7:
456                                 strncpy (val, _("White balance : "), maxlen - strlen(val));
457                                 switch (vs) {
458                                 case 0:
459                                         strncat (val, _("Auto"), maxlen - strlen(val));
460                                         break;
461                                 case 1:
462                                         strncat (val, _("Sunny"), maxlen - strlen(val));
463                                         break;
464                                 case 2:
465                                         strncat (val, _("Cloudy"), maxlen - strlen(val));
466                                         break;
467                                 case 3:
468                                         strncat (val, _("Tungsten"), maxlen - strlen(val));
469                                         break;
470                                 case 4:
471                                         strncat (val, _("Flourescent"), maxlen - strlen(val));
472                                         break;
473                                 case 5:
474                                         strncat (val, _("Flash"), maxlen - strlen(val));
475                                         break;
476                                 case 6:
477                                         strncat (val, _("Custom"), maxlen - strlen(val));
478                                         break;
479                                 default:
480                                         snprintf (buf, sizeof (buf), _("%i???"), vs);
481                                         strncat (val, buf, maxlen - strlen(val));
482                                 }
483                                 break;
484                         case 9:
485                                 snprintf (buf, sizeof (buf), _(" / Sequence number : %u"), vs);
486                                 strncat (val, buf, maxlen - strlen(val));
487                                 break;
488                         case 14:
489                                 if (vs>>12)
490                                 {
491                                         strncat (val, _(" / AF point used : "), maxlen - strlen(val));
492                                         if (vs&1)
493                                                 strncat (val, _("Right"), maxlen - strlen(val));
494                                         if ((vs>>1)&1)
495                                                 strncat (val, _("Center"), maxlen - strlen(val));
496                                         if ((vs>>2)&1)
497                                                 strncat (val, _("Left"), maxlen - strlen(val));
498                                         snprintf (buf, sizeof (buf), _(" (%u available focus point)"), vs>>12);
499                                         strncat (val, buf, maxlen - strlen(val));
500                                 }
501 #ifdef DEBUG
502                                         printf ("0x%08x\n", vs);
503 #endif
504                                 break;
505                         case 15:
506                                 snprintf (buf, sizeof (buf), _(" / Flash bias : %.2f EV"), vs/32.0);
507                                 strncat (val, buf, maxlen - strlen(val));
508
509                                 break;
510                         case 19:
511                                 snprintf (buf, sizeof (buf), _(" / Subject Distance (mm) : %u"), vs);
512                                 strncat (val, buf, maxlen - strlen(val));
513                                 break;
514 #ifdef DEBUG
515                         default:
516                                 printf ("Value%d=%d\n", i, vs);
517 #endif
518                         }
519                 }
520
521                 break;
522
523         case MNOTE_CANON_TAG_IMAGE_TYPE:
524         case MNOTE_CANON_TAG_OWNER:
525                 CF (entry->format, EXIF_FORMAT_ASCII, val, maxlen);
526                 CC (entry->components, 32, val, maxlen);
527                 strncpy (val, (char *)data, MIN (entry->size, maxlen));
528                 break;
529
530         case MNOTE_CANON_TAG_FIRMWARE:
531                 CF (entry->format, EXIF_FORMAT_ASCII, val, maxlen);
532                 CC2 (entry->components, 24, 32, val, maxlen);
533                 strncpy (val, (char *)data, MIN (entry->size, maxlen));
534                 break;
535
536         case MNOTE_CANON_TAG_IMAGE_NUMBER:
537                 CF (entry->format, EXIF_FORMAT_LONG, val, maxlen);
538                 CC (entry->components, 1, val, maxlen);
539                 vl = exif_get_long (data, entry->order);
540                 snprintf (val, maxlen, "%03lu-%04lu",
541                                 (unsigned long) vl/10000,
542                                 (unsigned long) vl%10000);
543                 break;
544
545         case MNOTE_CANON_TAG_SERIAL_NUMBER:
546                 CF (entry->format, EXIF_FORMAT_LONG, val, maxlen);
547                 CC (entry->components, 1, val, maxlen);
548                 vl = exif_get_long (data, entry->order);
549                 snprintf (val, maxlen, "%04X-%05d", (int)vl>>16,(int)vl&0xffff);
550                 break;
551
552         case MNOTE_CANON_TAG_CUSTOM_FUNCS:
553                 CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen);
554                 n = exif_get_short (data, entry->order)/2;
555                 data+=2;
556                 CC (entry->components, n, val, maxlen);
557 #ifdef DEBUG
558                 printf ("Custom Function size %d %d\n",n,entry->size);
559 #endif
560                 for (i=1;i<n;i++)
561                 {
562                         vs = exif_get_short (data, entry->order);
563                         data += 2;
564                         snprintf (buf, sizeof(buf), _("C.F%d : %u"), i, vs);
565                         strncat (val, buf, maxlen - strlen(val));
566                 }
567                 break;
568
569         default:
570 #ifdef DEBUG
571                 if (entry->format == EXIF_FORMAT_SHORT)
572                 for(i=0;i<entry->components;i++) {
573                         vs = exif_get_short (data, entry->order);
574                         data+=2;
575                         printf ("Value%d=%d\n", i, vs);
576                 }
577                 else if (entry->format == EXIF_FORMAT_LONG)
578                 for(i=0;i<entry->components;i++) {
579                         vl = exif_get_long (data, entry->order);
580                         data+=4;
581                         printf ("Value%d=%d\n", i, vs);
582                 }
583                 else if (entry->format == EXIF_FORMAT_ASCII)
584                     strncpy (val, data, MIN (entry->size, maxlen));
585 #endif
586                 break;
587         }
588
589         return val;
590 }