resetting manifest requested domain to floor
[platform/upstream/libexif.git] / libexif / exif-log.c
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
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 }