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 
26 static GWENHYWFAR_CB void _freeData(void *bp, void *p);
27 static GWENHYWFAR_CB int _logHook(GWEN_GUI *gui, const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s);
28 
29 static void _addLogLineToList(GWEN_GUI *gui, const char *s);
30 static void _addLogLineToFile(GWEN_GUI *gui, const char *s);
31 static void _writeLinesToFile(GWEN_GUI *gui);
32 
33 
34 
35 
36 GWEN_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 
75 static 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 
96  _writeLinesToFile(gui);
97  GWEN_StringList_Clear(xgui->logStrings);
98 }
99 
100 
101 
102 
103 static 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 
133 void 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 
149 void 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 
167 void TestGui_SetLogLastX(GWEN_GUI *gui, int i)
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 
180 void _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 
195 void _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;
205  GWEN_FSLOCK_RESULT res;
206  FILE *f;
207 
208  if (GWEN_Directory_GetPath(xgui->logFile, GWEN_PATH_FLAGS_VARIABLE)) {
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;
227  GWEN_FSLock_Unlock(lck);
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;
239  GWEN_FSLock_Unlock(lck);
240  GWEN_FSLock_free(lck);
241  return;
242  }
243 
244  /* unlock log file */
245  GWEN_FSLock_Unlock(lck);
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;
266  GWEN_FSLOCK_RESULT res;
267  FILE *f;
269 
270  if (GWEN_Directory_GetPath(xgui->logFile, GWEN_PATH_FLAGS_VARIABLE)) {
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;
289  GWEN_FSLock_Unlock(lck);
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;
309  GWEN_FSLock_Unlock(lck);
310  GWEN_FSLock_free(lck);
311  return;
312  }
313 
314  /* unlock log file */
315  GWEN_FSLock_Unlock(lck);
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 
GWENHYWFAR_API void GWEN_FSLock_free(GWEN_FSLOCK *fl)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
void GWEN_StringList_Clear(GWEN_STRINGLIST *sl)
Definition: stringlist.c:228
GWEN_LOGGER_LEVEL
Definition: logger.h:64
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
void TestGui_Extend(GWEN_GUI *gui)
Definition: testgui.c:41
int GWEN_Logger_CreateLogMessage(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
Definition: logger.c:410
void TestGui_Unextend(GWEN_GUI *gui)
Definition: testgui.c:55
void TestGui_SetLogFile(GWEN_GUI *gui, const char *fname)
Definition: testgui.c:149
static GWENHYWFAR_CB int _logHook(GWEN_GUI *gui, const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
Definition: testgui.c:103
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
static void _writeLinesToFile(GWEN_GUI *gui)
Definition: testgui.c:255
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
static void _addLogLineToFile(GWEN_GUI *gui, const char *s)
Definition: testgui.c:195
GWENHYWFAR_API GWEN_FSLOCK * GWEN_FSLock_new(const char *fname, GWEN_FSLOCK_TYPE t)
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition: stringlist.c:245
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
#define GWEN_INHERIT_UNLINK(bt, t, element)
Definition: inherit.h:318
#define GWEN_PATH_FLAGS_VARIABLE
Definition: path.h:111
void Test_Gui_FlushLogs(GWEN_GUI *gui)
Definition: testgui.c:88
GWEN_FSLOCK_RESULT
Definition: fslock.h:71
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Lock(GWEN_FSLOCK *fl, int timeout, uint32_t gid)
GWENHYWFAR_API GWEN_GUI_LOG_HOOK_FN GWEN_Gui_SetLogHookFn(GWEN_GUI *gui, GWEN_GUI_LOG_HOOK_FN f)
Definition: gui_virtual.c:180
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:427
void TestGui_AddLogLine(GWEN_GUI *gui, const char *s)
Definition: testgui.c:133
void TestGui_SetLogLastX(GWEN_GUI *gui, int i)
Definition: testgui.c:167
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
GWENHYWFAR_API int GWEN_Directory_GetPath(const char *path, unsigned int flags)
static GWENHYWFAR_CB void _freeData(void *bp, void *p)
struct GWEN_GUI GWEN_GUI
Definition: gui.h:176
struct GWEN_FSLOCK GWEN_FSLOCK
Definition: fslock.h:59
#define GWEN_INHERIT(bt, t)
Definition: inherit.h:264
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Unlock(GWEN_FSLOCK *fl)
void GWEN_StringList_RemoveFirstString(GWEN_STRINGLIST *sl)
Definition: stringlist.c:369
static void _addLogLineToList(GWEN_GUI *gui, const char *s)
Definition: testgui.c:180
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition: inherit.h:292
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition: stringlist.c:50
#define GWEN_UNUSED
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition: inherit.h:271