1548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/* exif-log.c 2548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 3548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Copyright (c) 2004 Lutz Mueller <lutz@users.sourceforge.net> 4548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 5548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * This library is free software; you can redistribute it and/or 6548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * modify it under the terms of the GNU Lesser General Public 7548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * License as published by the Free Software Foundation; either 8548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * version 2 of the License, or (at your option) any later version. 9548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 10548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * This library is distributed in the hope that it will be useful, 11548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * but WITHOUT ANY WARRANTY; without even the implied warranty of 12548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Lesser General Public License for more details. 14548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 15548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * You should have received a copy of the GNU Lesser General Public 16548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * License along with this library; if not, write to the 17548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Boston, MA 02110-1301 USA. 19548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 20548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 21548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <config.h> 22548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 23548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-log.h> 24548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/i18n.h> 25548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 26548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <stdlib.h> 27548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <string.h> 28548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 29548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenstruct _ExifLog { 30548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen unsigned int ref_count; 31548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 32548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifLogFunc func; 33548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen void *data; 34548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 35548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifMem *mem; 36548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen}; 37548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 38548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenstatic const struct { 39548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifLogCode code; 40548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen const char *title; 41548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen const char *message; 42548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} codes[] = { 43548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { EXIF_LOG_CODE_DEBUG, N_("Debugging information"), 44548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen N_("Debugging information is available.") }, 45548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { EXIF_LOG_CODE_NO_MEMORY, N_("Not enough memory"), 46548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen N_("The system cannot provide enough memory.") }, 47548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { EXIF_LOG_CODE_CORRUPT_DATA, N_("Corrupt data"), 48548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen N_("The data provided does not follow the specification.") }, 49548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { 0, NULL, NULL } 50548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen}; 51548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 52548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenconst char * 53548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_log_code_get_title (ExifLogCode code) 54548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 55548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen unsigned int i; 56548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 57548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen for (i = 0; codes[i].title; i++) if (codes[i].code == code) break; 58548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen return _(codes[i].title); 59548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 60548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 61548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenconst char * 62548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_log_code_get_message (ExifLogCode code) 63548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 64548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen unsigned int i; 65548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 66548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen for (i = 0; codes[i].message; i++) if (codes[i].code == code) break; 67548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen return _(codes[i].message); 68548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 69548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 70548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenExifLog * 71548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_log_new_mem (ExifMem *mem) 72548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 73548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifLog *log; 74548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 75548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen log = exif_mem_alloc (mem, sizeof (ExifLog)); 76548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (!log) return NULL; 77548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen log->ref_count = 1; 78548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 79548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen log->mem = mem; 80548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_mem_ref (mem); 81548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 82548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen return log; 83548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 84548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 85548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenExifLog * 86548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_log_new (void) 87548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 88548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifMem *mem = exif_mem_new_default (); 89548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifLog *log = exif_log_new_mem (mem); 90548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 91548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_mem_unref (mem); 92548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 93548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen return log; 94548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 95548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 96548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid 97548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_log_ref (ExifLog *log) 98548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 99548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (!log) return; 100548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen log->ref_count++; 101548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 102548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 103548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid 104548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_log_unref (ExifLog *log) 105548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 106548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (!log) return; 107548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (log->ref_count > 0) log->ref_count--; 108548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (!log->ref_count) exif_log_free (log); 109548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 110548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 111548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid 112548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_log_free (ExifLog *log) 113548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 114548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifMem *mem = log ? log->mem : NULL; 115548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 116548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (!log) return; 117548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 118548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_mem_free (mem, log); 119548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_mem_unref (mem); 120548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 121548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 122548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid 123548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_log_set_func (ExifLog *log, ExifLogFunc func, void *data) 124548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 125548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (!log) return; 126548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen log->func = func; 127548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen log->data = data; 128548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 129548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 130548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#ifdef NO_VERBOSE_TAG_STRINGS 131548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/* exif_log forms part of the API and can't be commented away */ 132548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#undef exif_log 133548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#endif 134548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid 135548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_log (ExifLog *log, ExifLogCode code, const char *domain, 136548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen const char *format, ...) 137548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 138548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen va_list args; 139548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 140548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen va_start (args, format); 141548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_logv (log, code, domain, format, args); 142548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen va_end (args); 143548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 144548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 145548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid 146548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenexif_logv (ExifLog *log, ExifLogCode code, const char *domain, 147548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen const char *format, va_list args) 148548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 149548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (!log) return; 150548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (!log->func) return; 151548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen log->func (log, code, domain, format, args, log->data); 152548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 153