gwenhywfar 5.10.1
testgui.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Thu Jan 09 2020
3 copyright : (C) 2020 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10#ifdef HAVE_CONFIG_H
11# include <config.h>
12#endif
13
14#define DISABLE_DEBUGLOG
15
16
17#include "testgui_p.h"
18
19#include <gwenhywfar/fslock.h>
20#include <gwenhywfar/directory.h>
21#include <gwenhywfar/debug.h>
22
23
24
25
26static GWENHYWFAR_CB void _freeData(void *bp, void *p);
27static GWENHYWFAR_CB int _logHook(GWEN_GUI *gui, const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s);
28
29static void _addLogLineToList(GWEN_GUI *gui, const char *s);
30static void _addLogLineToFile(GWEN_GUI *gui, const char *s);
31static void _writeLinesToFile(GWEN_GUI *gui);
32
33
34
35
36GWEN_INHERIT(GWEN_GUI, GWEN_GUI_TEST)
37
38
39
40
42{
43 GWEN_GUI_TEST *xgui;
44
45 GWEN_NEW_OBJECT(GWEN_GUI_TEST, xgui);
46 GWEN_INHERIT_SETDATA(GWEN_GUI, GWEN_GUI_TEST, gui, xgui, _freeData);
47
48 xgui->logStrings=GWEN_StringList_new();
49 xgui->previousLogHook=GWEN_Gui_SetLogHookFn(gui, _logHook);
50 xgui->logHookIsActive=1;
51}
52
53
54
56{
57 GWEN_GUI_TEST *xgui;
58
59 assert(gui);
60 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_TEST, gui);
61 assert(xgui);
62
63 /* reset log hook */
64 GWEN_Gui_SetLogHookFn(gui, xgui->previousLogHook);
65
66 GWEN_INHERIT_UNLINK(GWEN_GUI, GWEN_GUI_TEST, gui);
67
68 free(xgui->logFile);
69 GWEN_StringList_free(xgui->logStrings);
70 GWEN_FREE_OBJECT(xgui);
71}
72
73
74
75static GWENHYWFAR_CB void _freeData(GWEN_UNUSED void *bp, void *p)
76{
77 GWEN_GUI_TEST *xgui;
78
79 xgui=(GWEN_GUI_TEST *)p;
80
81 free(xgui->logFile);
82 GWEN_StringList_free(xgui->logStrings);
83 GWEN_FREE_OBJECT(xgui);
84}
85
86
87
89{
90 GWEN_GUI_TEST *xgui;
91
92 assert(gui);
93 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_TEST, gui);
94 assert(xgui);
95
97 GWEN_StringList_Clear(xgui->logStrings);
98}
99
100
101
102
103static GWENHYWFAR_CB int _logHook(GWEN_GUI *gui, const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
104{
105 GWEN_GUI_TEST *xgui;
106
107 assert(gui);
108 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_TEST, gui);
109 assert(xgui);
110
111 if (xgui->logHookIsActive) {
112 GWEN_BUFFER *tbuf;
113 int rv;
114
115 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
116 rv=GWEN_Logger_CreateLogMessage(logDomain, priority, s, tbuf);
117 if (rv<0) {
118 fprintf(stderr, "Unable to generate log message, turning off logging.\n");
119 xgui->logHookIsActive=0;
120 GWEN_Buffer_free(tbuf);
121 return 0;
122 }
123
125 GWEN_Buffer_free(tbuf);
126 return 1;
127 }
128 return 0;
129}
130
131
132
133void TestGui_AddLogLine(GWEN_GUI *gui, const char *s)
134{
135 GWEN_GUI_TEST *xgui;
136
137 assert(gui);
138 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_TEST, gui);
139 assert(xgui);
140
141 if (xgui->logLastX)
142 _addLogLineToList(gui, s);
143 else
144 _addLogLineToFile(gui, s);
145}
146
147
148
149void TestGui_SetLogFile(GWEN_GUI *gui, const char *fname)
150{
151 GWEN_GUI_TEST *xgui;
152
153 assert(gui);
154 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_TEST, gui);
155 assert(xgui);
156
157 if (xgui->logFile)
158 free(xgui->logFile);
159 if (fname)
160 xgui->logFile=strdup(fname);
161 else
162 xgui->logFile=NULL;
163}
164
165
166
168{
169 GWEN_GUI_TEST *xgui;
170
171 assert(gui);
172 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_TEST, gui);
173 assert(xgui);
174
175 xgui->logLastX=i;
176}
177
178
179
180void _addLogLineToList(GWEN_GUI *gui, const char *s)
181{
182 GWEN_GUI_TEST *xgui;
183
184 assert(gui);
185 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_TEST, gui);
186 assert(xgui);
187
188 GWEN_StringList_AppendString(xgui->logStrings, s, 0, 0);
189 if (xgui->logLastX>0 && GWEN_StringList_Count(xgui->logStrings)>xgui->logLastX)
190 GWEN_StringList_RemoveFirstString(xgui->logStrings);
191}
192
193
194
195void _addLogLineToFile(GWEN_GUI *gui, const char *s)
196{
197 GWEN_GUI_TEST *xgui;
198
199 assert(gui);
200 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_TEST, gui);
201 assert(xgui);
202
203 if (xgui->logFile) {
204 GWEN_FSLOCK *lck;
206 FILE *f;
207
209 xgui->logHookIsActive=0;
210 fprintf(stderr, "Unable to get logfile, turning off logging.\n");
211 return;
212 }
213
214 lck=GWEN_FSLock_new(xgui->logFile, GWEN_FSLock_TypeFile);
215 res=GWEN_FSLock_Lock(lck, 30, 0);
216 if (res!=GWEN_FSLock_ResultOk) {
217 xgui->logHookIsActive=0;
218 fprintf(stderr, "Unable to lock logfile, turning off logging.\n");
219 GWEN_FSLock_free(lck);
220 return;
221 }
222
223 f=fopen(xgui->logFile, "a");
224 if (f==NULL) {
225 fprintf(stderr, "Unable to open logfile, turning off logging.\n");
226 xgui->logHookIsActive=0;
228 GWEN_FSLock_free(lck);
229 return;
230 }
231
232 /* write log message */
233 fprintf(f, "%s", s);
234
235 /* close log file */
236 if (fclose(f)) {
237 fprintf(stderr, "Unable to close logfile, turning off logging.\n");
238 xgui->logHookIsActive=0;
240 GWEN_FSLock_free(lck);
241 return;
242 }
243
244 /* unlock log file */
246 GWEN_FSLock_free(lck);
247 }
248 else {
249 fprintf(stderr, "%s\n", s);
250 }
251}
252
253
254
256{
257 GWEN_GUI_TEST *xgui;
258
259 assert(gui);
260 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_TEST, gui);
261 assert(xgui);
262
263 if (GWEN_StringList_Count(xgui->logStrings)) {
264 if (xgui->logFile) {
265 GWEN_FSLOCK *lck;
267 FILE *f;
269
271 xgui->logHookIsActive=0;
272 fprintf(stderr, "Unable to get logfile, turning off logging.\n");
273 return;
274 }
275
276 lck=GWEN_FSLock_new(xgui->logFile, GWEN_FSLock_TypeFile);
277 res=GWEN_FSLock_Lock(lck, 30, 0);
278 if (res!=GWEN_FSLock_ResultOk) {
279 xgui->logHookIsActive=0;
280 fprintf(stderr, "Unable to lock logfile, turning off logging.\n");
281 GWEN_FSLock_free(lck);
282 return;
283 }
284
285 f=fopen(xgui->logFile, "a");
286 if (f==NULL) {
287 fprintf(stderr, "Unable to open logfile, turning off logging.\n");
288 xgui->logHookIsActive=0;
290 GWEN_FSLock_free(lck);
291 return;
292 }
293
294 /* write log message */
295 se=GWEN_StringList_FirstEntry(xgui->logStrings);
296 while (se) {
297 const char *s;
298
300 if (s && *s)
301 fprintf(f, "%s", s);
303 }
304
305 /* close log file */
306 if (fclose(f)) {
307 fprintf(stderr, "Unable to close logfile, turning off logging.\n");
308 xgui->logHookIsActive=0;
310 GWEN_FSLock_free(lck);
311 return;
312 }
313
314 /* unlock log file */
316 GWEN_FSLock_free(lck);
317 }
318 else {
320
321 /* write log message */
322 se=GWEN_StringList_FirstEntry(xgui->logStrings);
323 while (se) {
324 const char *s;
325
327 if (s && *s)
328 fprintf(stderr, "%s", s);
330 }
331 }
332
333
334 }
335}
336
337
338
339
#define NULL
Definition: binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
GWENHYWFAR_API int GWEN_Directory_GetPath(const char *path, unsigned int flags)
GWENHYWFAR_API void GWEN_FSLock_free(GWEN_FSLOCK *fl)
struct GWEN_FSLOCK GWEN_FSLOCK
Definition: fslock.h:59
GWENHYWFAR_API GWEN_FSLOCK * GWEN_FSLock_new(const char *fname, GWEN_FSLOCK_TYPE t)
GWEN_FSLOCK_RESULT
Definition: fslock.h:71
@ GWEN_FSLock_ResultOk
Definition: fslock.h:72
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Lock(GWEN_FSLOCK *fl, int timeout, uint32_t gid)
@ GWEN_FSLock_TypeFile
Definition: fslock.h:66
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Unlock(GWEN_FSLOCK *fl)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
struct GWEN_GUI GWEN_GUI
Definition: gui.h:176
GWENHYWFAR_API GWEN_GUI_LOG_HOOK_FN GWEN_Gui_SetLogHookFn(GWEN_GUI *gui, GWEN_GUI_LOG_HOOK_FN f)
Definition: gui_virtual.c:180
#define GWEN_UNUSED
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
#define GWEN_INHERIT_UNLINK(bt, t, element)
Definition: inherit.h:318
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition: inherit.h:292
#define GWEN_INHERIT(bt, t)
Definition: inherit.h:264
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition: inherit.h:271
int GWEN_Logger_CreateLogMessage(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
Definition: logger.c:410
GWEN_LOGGER_LEVEL
Definition: logger.h:64
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
#define GWEN_PATH_FLAGS_VARIABLE
Definition: path.h:111
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:427
void GWEN_StringList_Clear(GWEN_STRINGLIST *sl)
Definition: stringlist.c:228
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition: stringlist.c:245
void GWEN_StringList_RemoveFirstString(GWEN_STRINGLIST *sl)
Definition: stringlist.c:369
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition: stringlist.c:50
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
void TestGui_Extend(GWEN_GUI *gui)
Definition: testgui.c:41
static void _addLogLineToFile(GWEN_GUI *gui, const char *s)
Definition: testgui.c:195
static GWENHYWFAR_CB void _freeData(void *bp, void *p)
static void _addLogLineToList(GWEN_GUI *gui, const char *s)
Definition: testgui.c:180
static void _writeLinesToFile(GWEN_GUI *gui)
Definition: testgui.c:255
void TestGui_AddLogLine(GWEN_GUI *gui, const char *s)
Definition: testgui.c:133
void TestGui_SetLogFile(GWEN_GUI *gui, const char *fname)
Definition: testgui.c:149
void Test_Gui_FlushLogs(GWEN_GUI *gui)
Definition: testgui.c:88
static GWENHYWFAR_CB int _logHook(GWEN_GUI *gui, const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
Definition: testgui.c:103
void TestGui_SetLogLastX(GWEN_GUI *gui, int i)
Definition: testgui.c:167
void TestGui_Unextend(GWEN_GUI *gui)
Definition: testgui.c:55