blob: 2db18e3e9bf67b4037e822452353fc6dbcb80873 [file] [log] [blame]
/* 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);
}