153 lines
3.2 KiB
C
153 lines
3.2 KiB
C
|
/* exif-log.c
|
||
|
*
|
||
|
* Copyright (c) 2004 Lutz Mueller <lutz@users.sourceforge.net>
|
||
|
*
|
||
|
* This library is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU Lesser General Public
|
||
|
* License as published by the Free Software Foundation; either
|
||
|
* version 2 of the License, or (at your option) any later version.
|
||
|
*
|
||
|
* This library is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
* Lesser General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Lesser General Public
|
||
|
* License along with this library; if not, write to the
|
||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
|
* Boston, MA 02110-1301 USA.
|
||
|
*/
|
||
|
|
||
|
#include <config.h>
|
||
|
|
||
|
#include <libexif/exif-log.h>
|
||
|
#include <libexif/i18n.h>
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
struct _ExifLog {
|
||
|
unsigned int ref_count;
|
||
|
|
||
|
ExifLogFunc func;
|
||
|
void *data;
|
||
|
|
||
|
ExifMem *mem;
|
||
|
};
|
||
|
|
||
|
static const struct {
|
||
|
ExifLogCode code;
|
||
|
const char *title;
|
||
|
const char *message;
|
||
|
} codes[] = {
|
||
|
{ EXIF_LOG_CODE_DEBUG, N_("Debugging information"),
|
||
|
N_("Debugging information is available.") },
|
||
|
{ EXIF_LOG_CODE_NO_MEMORY, N_("Not enough memory"),
|
||
|
N_("The system cannot provide enough memory.") },
|
||
|
{ EXIF_LOG_CODE_CORRUPT_DATA, N_("Corrupt data"),
|
||
|
N_("The data provided does not follow the specification.") },
|
||
|
{ 0, NULL, NULL }
|
||
|
};
|
||
|
|
||
|
const char *
|
||
|
exif_log_code_get_title (ExifLogCode code)
|
||
|
{
|
||
|
unsigned int i;
|
||
|
|
||
|
for (i = 0; codes[i].title; i++) if (codes[i].code == code) break;
|
||
|
return _(codes[i].title);
|
||
|
}
|
||
|
|
||
|
const char *
|
||
|
exif_log_code_get_message (ExifLogCode code)
|
||
|
{
|
||
|
unsigned int i;
|
||
|
|
||
|
for (i = 0; codes[i].message; i++) if (codes[i].code == code) break;
|
||
|
return _(codes[i].message);
|
||
|
}
|
||
|
|
||
|
ExifLog *
|
||
|
exif_log_new_mem (ExifMem *mem)
|
||
|
{
|
||
|
ExifLog *log;
|
||
|
|
||
|
log = exif_mem_alloc (mem, sizeof (ExifLog));
|
||
|
if (!log) return NULL;
|
||
|
log->ref_count = 1;
|
||
|
|
||
|
log->mem = mem;
|
||
|
exif_mem_ref (mem);
|
||
|
|
||
|
return log;
|
||
|
}
|
||
|
|
||
|
ExifLog *
|
||
|
exif_log_new (void)
|
||
|
{
|
||
|
ExifMem *mem = exif_mem_new_default ();
|
||
|
ExifLog *log = exif_log_new_mem (mem);
|
||
|
|
||
|
exif_mem_unref (mem);
|
||
|
|
||
|
return log;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
exif_log_ref (ExifLog *log)
|
||
|
{
|
||
|
if (!log) return;
|
||
|
log->ref_count++;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
exif_log_unref (ExifLog *log)
|
||
|
{
|
||
|
if (!log) return;
|
||
|
if (log->ref_count > 0) log->ref_count--;
|
||
|
if (!log->ref_count) exif_log_free (log);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
exif_log_free (ExifLog *log)
|
||
|
{
|
||
|
ExifMem *mem = log ? log->mem : NULL;
|
||
|
|
||
|
if (!log) return;
|
||
|
|
||
|
exif_mem_free (mem, log);
|
||
|
exif_mem_unref (mem);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
exif_log_set_func (ExifLog *log, ExifLogFunc func, void *data)
|
||
|
{
|
||
|
if (!log) return;
|
||
|
log->func = func;
|
||
|
log->data = data;
|
||
|
}
|
||
|
|
||
|
#ifdef NO_VERBOSE_TAG_STRINGS
|
||
|
/* exif_log forms part of the API and can't be commented away */
|
||
|
#undef exif_log
|
||
|
#endif
|
||
|
void
|
||
|
exif_log (ExifLog *log, ExifLogCode code, const char *domain,
|
||
|
const char *format, ...)
|
||
|
{
|
||
|
va_list args;
|
||
|
|
||
|
va_start (args, format);
|
||
|
exif_logv (log, code, domain, format, args);
|
||
|
va_end (args);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
exif_logv (ExifLog *log, ExifLogCode code, const char *domain,
|
||
|
const char *format, va_list args)
|
||
|
{
|
||
|
if (!log) return;
|
||
|
if (!log->func) return;
|
||
|
log->func (log, code, domain, format, args, log->data);
|
||
|
}
|