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