From: Lutz M?l. <lu...@us...> - 2003-08-26 20:51:46
|
Update of /cvsroot/libexif/libmnote/libmnote/canon In directory sc8-pr-cvs1:/tmp/cvs-serv31473/libmnote/canon Modified Files: mnote-canon-data.c mnote-canon-entry.c mnote-canon-entry.h mnote-canon-tag.c Log Message: 2003-08-26 Lutz Mueller <lu...@us...> * libmnote/canon/*: Lots of improvements from matthieu <ma...@if...> (without ChangeLog entry). Index: mnote-canon-entry.c =================================================================== RCS file: /cvsroot/libexif/libmnote/libmnote/canon/mnote-canon-entry.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mnote-canon-entry.c 15 Dec 2002 11:44:18 -0000 1.3 +++ mnote-canon-entry.c 26 Aug 2003 20:51:34 -0000 1.4 @@ -1,6 +1,7 @@ /* mnote-canon-entry.c * * Copyright © 2002 Lutz Müller <lu...@us...> + * Copyright © 2003 Matthieu Castet <ma...@us...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,11 +20,19 @@ */ #include "config.h" +#include "i18n.h" + #include "mnote-canon-entry.h" +#include <stdio.h> #include <stdlib.h> #include <string.h> +#include <libexif/exif-format.h> +#include <libexif/exif-utils.h> + +//#define DEBUG + struct _MNoteCanonEntryPrivate { unsigned int ref_count; }; @@ -87,4 +96,597 @@ } free (entry); +} + +void +mnote_canon_entry_dump (MNoteEntry *e, unsigned int indent) +{ + MNoteCanonEntry *entry = (MNoteCanonEntry *)e; + + char buf[1024]; + unsigned int i; + + for (i = 0; i < 2 * indent; i++) + buf[i] = ' '; + buf[i] = '\0'; + + if (!e) + return; +#ifndef DEBUG + if (mnote_canon_tag_get_name (entry->tag)!=NULL) + { +#endif + printf ("%sTag: 0x%x ('%s')\n", buf, entry->tag, + mnote_canon_tag_get_name (entry->tag)); +#ifdef DEBUG + printf ("%s Format: %i ('%s')\n", buf, entry->format, + exif_format_get_name (entry->format)); + printf ("%s Components: %i\n", buf, (int) entry->components); + printf ("%s Size: %i\n", buf, entry->size); +#endif + printf ("%s Value: %s\n", buf, mnote_canon_entry_get_value (entry)); +#ifndef DEBUG + } +#endif +} + +#define CF(format,target,v) \ +{ \ + if (format != target) { \ + snprintf (v, sizeof (v), \ + _("Invalid format '%s', " \ + "expected '%s'."), \ + exif_format_get_name (format), \ + exif_format_get_name (target)); \ + break; \ + } \ +} + +#define CC(number,target,v) \ +{ \ + if (number != target) { \ + snprintf (v, sizeof (v), \ + _("Invalid number of components (%i, " \ + "expected %i)."), (int) number, (int) target); \ + break; \ + } \ +} + +char * +mnote_canon_entry_get_value (const MNoteCanonEntry *entry) +{ + char v[1024], buf[1024]; + ExifByteOrder order; + ExifLong vl; + ExifShort vs,n; + int i; + unsigned char *data = entry->data; + + if (!entry) + return (NULL); + if (!entry->parent) + return (NULL); + + memset (v, 0, sizeof (v)); + order = mnote_data_get_byte_order ((MNoteData *) &entry->parent->parent); +#ifdef DEBUG + printf ("Processing Tag %x\n",entry->tag); +#endif + switch (entry->tag) { + case MNOTE_CANON_TAG_SETTINGS_1: + CF (entry->format, EXIF_FORMAT_SHORT, v); + n = exif_get_short (data, order); + data+=2; +#ifdef DEBUG + printf ("Setting1 size %d %d\n",n,entry->size); +#endif + n=((entry->size>n)?n:entry->size)/2;//sanity check + + for (i=1;i<n;i++) + { + vs = exif_get_short (data, order); + data+=2; + switch(i) { + case 1: + strncpy (v, _("Macro mode : "), sizeof (v) - 1); + switch (vs) { + case 1: + strncat (v, _("Macro"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 2: + if (vs) + { + snprintf (buf, sizeof (buf), _(" / Self Timer : %i (ms)"), vs*100); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 4: + strncat (v,_(" / Flash mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("Flash not fired"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("auto"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("on"), sizeof (v) - 1 - strlen(v)); + break; + case 3: + strncat (v, _("red eyes reduction"), sizeof (v) - 1 - strlen(v)); + break; + case 4: + strncat (v, _("slow synchro"), sizeof (v) - 1 - strlen(v)); + break; + case 5: + strncat (v, _("auto + red eyes reduction"), sizeof (v) - 1 - strlen(v)); + break; + case 6: + strncat (v, _("on + red eyes reduction"), sizeof (v) - 1 - strlen(v)); + break; + case 16: + strncat (v, _("external"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 5: + strncat (v, _(" / Continuous drive mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("single or timer"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("continuous"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v, buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 7: + strncat (v, _(" / Focus mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("One-Shot"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("AI Servo"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("AI Focus"), sizeof (v) - 1 - strlen(v)); + break; + case 3: + strncat (v, _("MF"), sizeof (v) - 1 - strlen(v)); + break; + case 4: + strncat (v, _("Single"), sizeof (v) - 1 - strlen(v)); + break; + case 5: + strncat (v, _("Continuous"), sizeof (v) - 1 - strlen(v)); + break; + case 6: + strncat (v, _("MF"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 10: + strncat (v, _(" / Image size : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("Large"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("Medium"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("Small"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 11: + strncat (v, _(" / Easy shooting mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("Full Auto"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("Manual"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("Landscape"), sizeof (v) - 1 - strlen(v)); + break; + case 3: + strncat (v, _("Fast Shutter"), sizeof (v) - 1 - strlen(v)); + break; + case 4: + strncat (v, _("Slow Shutter"), sizeof (v) - 1 - strlen(v)); + break; + case 5: + strncat (v, _("Night"), sizeof (v) - 1 - strlen(v)); + break; + case 6: + strncat (v, _("Black & White"), sizeof (v) - 1 - strlen(v)); + break; + case 7: + strncat (v, _("Sepia"), sizeof (v) - 1 - strlen(v)); + break; + case 8: + strncat (v, _("Portrait"), sizeof (v) - 1 - strlen(v)); + break; + case 9: + strncat (v, _("Sports"), sizeof (v) - 1 - strlen(v)); + break; + case 10: + strncat (v, _("Macro / Close-Up"), sizeof (v) - 1 - strlen(v)); + break; + case 11: + strncat (v, _("Pan Focus"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 13: + strncat (v, _(" / Contrast : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0xffff: + strncat (v, _("Low"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0000: + strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0001: + strncat (v, _("High"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 14: + strncat (v, _(" / Saturation : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0xffff: + strncat (v, _("Low"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0000: + strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0001: + strncat (v, _("High"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 15: + strncat (v, _(" / Sharpness : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0xffff: + strncat (v, _("Low"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0000: + strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0001: + strncat (v, _("High"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 16: + if (vs) + { + strncat (v, _(" / ISO : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 15: + strncat (v, _("auto"), sizeof (v) - 1 - strlen(v)); + break; + case 16: + strncat (v, _("50"), sizeof (v) - 1 - strlen(v)); + break; + case 17: + strncat (v, _("100"), sizeof (v) - 1 - strlen(v)); + break; + case 18: + strncat (v, _("200"), sizeof (v) - 1 - strlen(v)); + break; + case 19: + strncat (v, _("400"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + } + case 17: + strncat (v, _(" / Metering mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 3: + strncat (v, _("Evaluative"), sizeof (v) - 1 - strlen(v)); + break; + case 4: + strncat (v, _("Partial"), sizeof (v) - 1 - strlen(v)); + break; + case 5: + strncat (v, _("Center-weighted"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 19: + strncat (v, _(" / AF point selected : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0x3000: + strncat (v, _("none (MF)"), sizeof (v) - 1 - strlen(v)); + break; + case 0x3001: + strncat (v, _("auto-selected"), sizeof (v) - 1 - strlen(v)); + break; + case 0x3002: + strncat (v, _("right"), sizeof (v) - 1 - strlen(v)); + break; + case 0x3003: + strncat (v, _("center"), sizeof (v) - 1 - strlen(v)); + break; + case 0x3004: + strncat (v, _("left"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "0x%x???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 20: + strncat (v, _(" / Exposure mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("Easy shooting"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("Program"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("Tv-priority"), sizeof (v) - 1 - strlen(v)); + break; + case 3: + strncat (v, _("Av-priority"), sizeof (v) - 1 - strlen(v)); + break; + case 4: + strncat (v, _("Manual"), sizeof (v) - 1 - strlen(v)); + break; + case 5: + strncat (v, _("A-DEP"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 23: + snprintf (buf, sizeof (buf), " / %s : %u", _("long focal length of lens (in focal units)"), vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + break; + case 24: + snprintf (buf, sizeof (buf), " / %s : %u", _("short focal length of lens (in focal units)"), vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + break; + case 25: + snprintf (buf, sizeof (buf), " / %s : %u", _("focal units per mm"), vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + break; + case 29: + strncat (v, _(" / Flash details : "), sizeof (v) - 1 - strlen(v)); + if ((vs>>14)&1) + strncat (v, _("External E-TTL"), sizeof (v) - 1 - strlen(v)); + if ((vs>>13)&1) + strncat (v, _("Internal flash"), sizeof (v) - 1 - strlen(v)); + if ((vs>>11)&1) + strncat (v, _("FP sync used"), sizeof (v) - 1 - strlen(v)); + if ((vs>>4)&1) + strncat (v, _("FP sync enabled"), sizeof (v) - 1 - strlen(v)); +#ifdef DEBUG + printf ("Value29=0x%08x\n", vs); +#endif + break; + case 32: + snprintf (buf, sizeof (buf), " / %s : ", _("Focus mode2")); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("Single"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("Continuous"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; +#ifdef DEBUG + default: + printf ("Value%d=%d\n", i, vs); +#endif + } + } + + break; + + case MNOTE_CANON_TAG_SETTINGS_2: + CF (entry->format, EXIF_FORMAT_SHORT, v); + n = exif_get_short (data, order); + data += 2; +#ifdef DEBUG + printf ("Setting2 size %d %d\n",n,entry->size); +#endif + n=((entry->size>n)?n:entry->size)/2;//sanity check + + for (i=1;i<n;i++) + { + vs = exif_get_short (data, order); + data+=2; + switch(i) { + case 7: + strncpy (v, _("White balance : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("Auto"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("Sunny"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("Cloudy"), sizeof (v) - 1 - strlen(v)); + break; + case 3: + strncat (v, _("Tungsten"), sizeof (v) - 1 - strlen(v)); + break; + case 4: + strncat (v, _("Flourescent"), sizeof (v) - 1 - strlen(v)); + break; + case 5: + strncat (v, _("Flash"), sizeof (v) - 1 - strlen(v)); + break; + case 6: + strncat (v, _("Custom"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 9: + snprintf (buf, sizeof (buf), " / %s : %u", _("Sequence number"), vs); + strncat (v, buf, sizeof (v) - 1 - strlen(v)); + + break; + case 14: + if (vs>>12) + { + strncat (v, _(" / AF point used : "), sizeof (v) - 1 - strlen(v)); + if (vs&1) + strncat (v, _("Right"), sizeof (v) - 1 - strlen(v)); + if ((vs>>1)&1) + strncat (v, _("Center"), sizeof (v) - 1 - strlen(v)); + if ((vs>>2)&1) + strncat (v, _("Left"), sizeof (v) - 1 - strlen(v)); + snprintf (buf, sizeof (buf), " (%u %s)", vs>>12, _("available focus point")); + strncat (v, buf, sizeof (v) - 1 - strlen(v)); + } +#ifdef DEBUG + printf ("0x%08x\n", vs); +#endif + break; + case 15: + snprintf (buf, sizeof (buf), " / %s : %.2f EV", _("Flash bias"), vs/32.0); + strncat (v, buf, sizeof (v) - 1 - strlen(v)); + + break; + case 19: + snprintf (buf, sizeof (buf), " / %s : %u", _("Subject Distance (mm)"), vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + break; +#ifdef DEBUG + default: + printf ("Value%d=%d\n", i, vs); +#endif + } + } + + break; + + case MNOTE_CANON_TAG_IMAGE_TYPE: + CF (entry->format, EXIF_FORMAT_ASCII, v); + CC (entry->components, 32, v); + strncpy (v,data,sizeof (v)); + break; + + case MNOTE_CANON_TAG_FIRMWARE: + CF (entry->format, EXIF_FORMAT_ASCII, v); + CC (entry->components, 24, v); + strncpy (v,data,sizeof (v)); + break; + + case MNOTE_CANON_TAG_IMAGE_NUMBER: + CF (entry->format, EXIF_FORMAT_LONG, v); + CC (entry->components, 1, v); + vl = exif_get_long (data, order); + snprintf (v, sizeof (v), "%03lu-%04lu", vl/10000,vl%10000); + break; + + case MNOTE_CANON_TAG_OWNER: + CF (entry->format, EXIF_FORMAT_ASCII, v); + CC (entry->components, 32, v); + strncpy (v,data,sizeof (v)); + break; + + case MNOTE_CANON_TAG_SERIAL_NUMBER: + CF (entry->format, EXIF_FORMAT_LONG, v); + CC (entry->components, 1, v); + vl = exif_get_long (data, order); + snprintf (v, sizeof (v), "%04X-%05d", (int)vl>>16,(int)vl&0xffff); + break; + + case MNOTE_CANON_TAG_CUSTOM_FUNCS: + CF (entry->format, EXIF_FORMAT_SHORT, v); + n = exif_get_short (data, order); + data+=2; +#ifdef DEBUG + printf ("Custom Function size %d %d\n",n,entry->size); +#endif + n=((entry->size>n)?n:entry->size)/2;//sanity check + for (i=1;i<n;i++) + { + vs = exif_get_short (data, order); + data += 2; + snprintf (buf, sizeof(buf), "C.F%d : %u", i, vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + + default: +#ifdef DEBUG + if (entry->format == EXIF_FORMAT_SHORT) + for(i=0;i<entry->components;i++) { + vs = exif_get_short (data, order); + data+=2; + printf ("Value%d=%d\n", i, vs); + } + else if (entry->format == EXIF_FORMAT_LONG) + for(i=0;i<entry->components;i++) { + vl = exif_get_long (data, order); + data+=4; + printf ("Value%d=%d\n", i, vs); + } + else if (entry->format == EXIF_FORMAT_ASCII) + strncpy (v, data, sizeof (v)); +#endif + } + + return strdup (v); } Index: mnote-canon-entry.h =================================================================== RCS file: /cvsroot/libexif/libmnote/libmnote/canon/mnote-canon-entry.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- mnote-canon-entry.h 15 Dec 2002 11:44:18 -0000 1.2 +++ mnote-canon-entry.h 26 Aug 2003 20:51:34 -0000 1.3 @@ -49,4 +49,8 @@ void mnote_canon_entry_unref (MNoteCanonEntry *entry); void mnote_canon_entry_free (MNoteCanonEntry *entry); +char *mnote_canon_entry_get_value (const MNoteCanonEntry *entry); + +void mnote_canon_entry_dump (MNoteEntry *entry, unsigned int indent); + #endif /* __MNOTE_CANON_ENTRY_H__ */ Index: mnote-canon-data.c =================================================================== RCS file: /cvsroot/libexif/libmnote/libmnote/canon/mnote-canon-data.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- mnote-canon-data.c 15 Dec 2002 11:44:18 -0000 1.4 +++ mnote-canon-data.c 26 Aug 2003 20:51:33 -0000 1.5 @@ -1,6 +1,7 @@ /* mnote-canon-data.c * * Copyright © 2002 Lutz Müller <lu...@us...> + * Copyright © 2003 Matthieu Castet <ma...@us...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,24 +23,47 @@ #include "mnote-canon-data.h" #include <stdlib.h> +#include <stdio.h> #include <string.h> +#include <libexif/exif-byte-order.h> +#include <libexif/exif-utils.h> +#include <libexif/exif-data.h> + +//#define DEBUG + static void mnote_canon_data_free (MNoteData *n) { - MNoteCanonData *note = (MNoteCanonData *) n; - - note = NULL; + MNoteCanonData *note = (MNoteCanonData *) n; + unsigned int i; + + if (note->entries) { + for (i = 0; i < note->count; i++) + mnote_canon_entry_unref (note->entries[i]); + free (note->entries); + note->entries = NULL; + note->count = 0; + } } static char * mnote_canon_data_get_value (MNoteData *n, MNoteTag t) { - MNoteCanonData *note = (MNoteCanonData *) n; + + char *value = NULL; + unsigned int i, count; - note = NULL; + MNoteCanonData *note = (MNoteCanonData *) n; + MNoteCanonTag tag = (MNoteCanonTag) t; - return (NULL); + for (count = i = 0; !value && i < note->count; i++) { + if (note->entries[i]->tag == tag) { + value = mnote_canon_entry_get_value (note->entries[i]); + } + } + + return (value); } static void @@ -52,12 +76,174 @@ } static void -mnote_canon_data_load_data (MNoteData *n, const unsigned char *data, - unsigned int size) +mnote_canon_data_add_entry (MNoteCanonData *note, MNoteCanonEntry *entry) +{ + if (!note || !entry) + return; + + entry->parent = note; + note->entries = realloc (note->entries, + sizeof (MNoteCanonEntry) * (note->count + 1)); + note->entries[note->count] = entry; + mnote_canon_entry_ref (entry); + note->count++; +} + +static void +mnote_canon_data_load_data_entry (MNoteCanonData *note, + MNoteCanonEntry *entry, + const unsigned char *d, + unsigned int size, unsigned int offset, + const unsigned char *exifdata, unsigned int exifsize) { - MNoteCanonData *note = (MNoteCanonData *) n; + unsigned int s, doff, sizetmp = size; + const unsigned char *temp=d; + ExifByteOrder order = mnote_data_get_byte_order ((MNoteData *) note); + + entry->tag = exif_get_short (d + offset + 0, order); + entry->format = exif_get_short (d + offset + 2, order); + entry->components = exif_get_long (d + offset + 4, order); - note = NULL; + /* + * Size? If bigger than 4 bytes, the actual data is not + * in the entry but somewhere else (offset). + */ + s = exif_format_get_size (entry->format) * entry->components; + if (!s) + return; + if (s > 4) + { + doff = exif_get_long (d + offset + 8, order) + 0xC; + sizetmp = exifsize; + temp = exifdata; + } + else + doff = offset + 8; + +#ifdef DEBUG + printf ("Comp %x %d %d %x %x\n",doff, s, sizetmp,temp[doff],temp[doff+1]); +#endif + /* Sanity check */ + if (sizetmp < doff + s) + return; + entry->data = malloc (sizeof (char) * s); + if (!entry->data) + return; + entry->size = s; + memcpy (entry->data, temp + doff, s); + +} + +static void +mnote_canon_data_load_data (MNoteData *ne, const unsigned char *d_exif, + unsigned int size_exif) +{ + MNoteCanonData *data = (MNoteCanonData *) ne; + + const unsigned char *d = d_exif; + ExifData *ed = NULL; + ExifEntry *e = NULL; + ExifByteOrder order = EXIF_BYTE_ORDER_INTEL; + ExifShort n; + unsigned int i; + unsigned int size = size_exif; + MNoteCanonEntry *entry; + MNoteCanonTag tag; + + if (!data) + return; + if (!d_exif || !size_exif) + return; + + /* If we got EXIF data, go to the MakerNote tag. */ + ed = exif_data_new_from_data (d_exif, size); + if (ed) { + e = exif_content_get_entry (ed->ifd[EXIF_IFD_EXIF], + EXIF_TAG_MAKER_NOTE); + order = exif_data_get_byte_order (ed); + if (e) + { + d = e->data; + size = e->size; + } + } + + mnote_data_set_byte_order (ne,order); + +#ifdef DEBUG + printf ("Parsing %i byte(s) Mnote data...\n", size); +#endif + + + /* Read the number of entries */ + n = exif_get_short (d ,order); +#ifdef DEBUG + printf ("Loading %i entries...\n", n); +#endif + d+=2; + size-=2; + for (i = 0; i < n; i++) { + + tag = exif_get_short (d + 12 * i, order); +#ifdef DEBUG + printf ("Loading entry '%s' (%i of %i)...\n", + mnote_canon_tag_get_name (tag), i + 1, n); +#endif + entry = mnote_canon_entry_new (); + mnote_canon_data_add_entry (data, entry); + mnote_canon_data_load_data_entry (data, entry, d, size, + 12 * i, d_exif, size_exif); + mnote_canon_entry_unref (entry); + } + exif_data_unref (ed); +#ifdef DEBUG + int j; + for (j=0;j<size;j++) + { + if (!(j%16)) printf("\n"); + printf("%02X ",d[j]);} + + printf("\n%d\n",size); + printf("%d",order); +#endif +} + +static unsigned int +mnote_canon_get_count (MNoteData *n) +{ + MNoteCanonData *note = (MNoteCanonData *) n; + + return (note->count); +} + +static MNoteEntry * +mnote_canon_get_entry (MNoteData *n, MNoteTag t) +{ + MNoteCanonData *note = (MNoteCanonData *) n; + MNoteCanonTag tag = (MNoteCanonTag) t; + unsigned int i; + MNoteEntry *entry = NULL; + + for (i = 0; !entry && i < note->count; i++) { + if (note->entries[i]->tag == tag) { + entry = note->entries[i]; + } + } + + return (entry); +} + +static void +mnote_canon_foreach_entry (MNoteData *n, MNoteDataForeachEntryFunc func, void *data) +{ + MNoteCanonData *note = (MNoteCanonData *) n; + unsigned int i; + + if (!note || !func) + return; + + for (i = 0; i < note->count; i++) + func (n, (MNoteTag)note->entries[i]->tag, data); } MNoteData * @@ -72,8 +258,16 @@ ((MNoteData *) note)->methods.free = mnote_canon_data_free; ((MNoteData *) note)->methods.load_data = mnote_canon_data_load_data; ((MNoteData *) note)->methods.save_data = mnote_canon_data_save_data; + ((MNoteData *) note)->methods.set_order = NULL; + ((MNoteData *) note)->methods.get_order = NULL; + ((MNoteData *) note)->methods.get_count = mnote_canon_get_count; + ((MNoteData *) note)->methods.get_entry = mnote_canon_get_entry; + ((MNoteData *) note)->methods.foreach_entry = mnote_canon_foreach_entry; ((MNoteData *) note)->methods.get_tag_name = mnote_canon_tag_get_name; + ((MNoteData *) note)->methods.get_tag_title = mnote_canon_tag_get_title; + ((MNoteData *) note)->methods.get_tag_description = mnote_canon_tag_get_description; ((MNoteData *) note)->methods.get_value = mnote_canon_data_get_value; - + ((MNoteData *) note)->methods.dump_entry = mnote_canon_entry_dump; + return ((MNoteData *) note); } Index: mnote-canon-tag.c =================================================================== RCS file: /cvsroot/libexif/libmnote/libmnote/canon/mnote-canon-tag.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- mnote-canon-tag.c 15 Dec 2002 11:44:18 -0000 1.4 +++ mnote-canon-tag.c 26 Aug 2003 20:51:34 -0000 1.5 @@ -59,7 +59,6 @@ mnote_canon_tag_get_title (MNoteTag t) { MNoteCanonTag tag = (MNoteCanonTag) t; - unsigned int i; bindtextdomain (GETTEXT_PACKAGE, LIBMNOTE_LOCALEDIR); |