Home | History | Annotate | Download | only in libexif
      1 /* exif-log.c
      2  *
      3  * Copyright (c) 2004 Lutz Mueller <lutz (at) 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 
     29 struct _ExifLog {
     30 	unsigned int ref_count;
     31 
     32 	ExifLogFunc func;
     33 	void *data;
     34 
     35 	ExifMem *mem;
     36 };
     37 
     38 static 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 
     52 const char *
     53 exif_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 
     61 const char *
     62 exif_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 
     70 ExifLog *
     71 exif_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 
     85 ExifLog *
     86 exif_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 
     96 void
     97 exif_log_ref (ExifLog *log)
     98 {
     99 	if (!log) return;
    100 	log->ref_count++;
    101 }
    102 
    103 void
    104 exif_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 
    111 void
    112 exif_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 
    122 void
    123 exif_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
    134 void
    135 exif_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 
    145 void
    146 exif_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