1/* exif-log.c 2 * 3 * Copyright (c) 2004 Lutz Mueller <lutz@users.sourceforge.net> 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the 17 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 * Boston, MA 02110-1301 USA. 19 */ 20 21#include <config.h> 22 23#include <libexif/exif-log.h> 24#include <libexif/i18n.h> 25 26#include <stdlib.h> 27#include <string.h> 28 29struct _ExifLog { 30 unsigned int ref_count; 31 32 ExifLogFunc func; 33 void *data; 34 35 ExifMem *mem; 36}; 37 38static const struct { 39 ExifLogCode code; 40 const char *title; 41 const char *message; 42} codes[] = { 43 { EXIF_LOG_CODE_DEBUG, N_("Debugging information"), 44 N_("Debugging information is available.") }, 45 { EXIF_LOG_CODE_NO_MEMORY, N_("Not enough memory"), 46 N_("The system cannot provide enough memory.") }, 47 { EXIF_LOG_CODE_CORRUPT_DATA, N_("Corrupt data"), 48 N_("The data provided does not follow the specification.") }, 49 { 0, NULL, NULL } 50}; 51 52const char * 53exif_log_code_get_title (ExifLogCode code) 54{ 55 unsigned int i; 56 57 for (i = 0; codes[i].title; i++) if (codes[i].code == code) break; 58 return _(codes[i].title); 59} 60 61const char * 62exif_log_code_get_message (ExifLogCode code) 63{ 64 unsigned int i; 65 66 for (i = 0; codes[i].message; i++) if (codes[i].code == code) break; 67 return _(codes[i].message); 68} 69 70ExifLog * 71exif_log_new_mem (ExifMem *mem) 72{ 73 ExifLog *log; 74 75 log = exif_mem_alloc (mem, sizeof (ExifLog)); 76 if (!log) return NULL; 77 log->ref_count = 1; 78 79 log->mem = mem; 80 exif_mem_ref (mem); 81 82 return log; 83} 84 85ExifLog * 86exif_log_new (void) 87{ 88 ExifMem *mem = exif_mem_new_default (); 89 ExifLog *log = exif_log_new_mem (mem); 90 91 exif_mem_unref (mem); 92 93 return log; 94} 95 96void 97exif_log_ref (ExifLog *log) 98{ 99 if (!log) return; 100 log->ref_count++; 101} 102 103void 104exif_log_unref (ExifLog *log) 105{ 106 if (!log) return; 107 if (log->ref_count > 0) log->ref_count--; 108 if (!log->ref_count) exif_log_free (log); 109} 110 111void 112exif_log_free (ExifLog *log) 113{ 114 ExifMem *mem = log ? log->mem : NULL; 115 116 if (!log) return; 117 118 exif_mem_free (mem, log); 119 exif_mem_unref (mem); 120} 121 122void 123exif_log_set_func (ExifLog *log, ExifLogFunc func, void *data) 124{ 125 if (!log) return; 126 log->func = func; 127 log->data = data; 128} 129 130#ifdef NO_VERBOSE_TAG_STRINGS 131/* exif_log forms part of the API and can't be commented away */ 132#undef exif_log 133#endif 134void 135exif_log (ExifLog *log, ExifLogCode code, const char *domain, 136 const char *format, ...) 137{ 138 va_list args; 139 140 va_start (args, format); 141 exif_logv (log, code, domain, format, args); 142 va_end (args); 143} 144 145void 146exif_logv (ExifLog *log, ExifLogCode code, const char *domain, 147 const char *format, va_list args) 148{ 149 if (!log) return; 150 if (!log->func) return; 151 log->func (log, code, domain, format, args, log->data); 152} 153