gwenhywfar  5.10.1
gui.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Fri Feb 07 2003
3  copyright : (C) 2003-2010 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * *
8  * This library is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU Lesser General Public *
10  * License as published by the Free Software Foundation; either *
11  * version 2.1 of the License, or (at your option) any later version. *
12  * *
13  * This library is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16  * Lesser General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU Lesser General Public *
19  * License along with this library; if not, write to the Free Software *
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21  * MA 02111-1307 USA *
22  * *
23  ***************************************************************************/
24 
25 
26 #ifdef HAVE_CONFIG_H
27 # include <config.h>
28 #endif
29 
30 #define DISABLE_DEBUGLOG
31 
32 
33 #ifndef ICONV_CONST
34 # define ICONV_CONST
35 #endif
36 
37 
38 #include "gui_p.h"
39 #include "dlg_input_l.h"
40 #include "dlg_message_l.h"
41 #include "dlg_progress_l.h"
42 #include "dlg_showbox_l.h"
43 #include "i18n_l.h"
44 
45 #include <gwenhywfar/debug.h>
46 #include <gwenhywfar/dialog_be.h>
47 #include <gwenhywfar/mdigest.h>
48 #include <gwenhywfar/text.h>
49 #include <gwenhywfar/url.h>
50 #include <gwenhywfar/syncio_socket.h>
51 #include <gwenhywfar/syncio_buffered.h>
52 #include <gwenhywfar/syncio_tls.h>
53 #include <gwenhywfar/syncio_http.h>
54 #include <gwenhywfar/threadlocaldata.h>
55 
56 #include <stdarg.h>
57 #include <string.h>
58 #include <errno.h>
59 #include <ctype.h>
60 
61 #if defined (HAVE_LANGINFO_H)
62 # include <langinfo.h>
63 #elif defined (HAVE_LOCALCHARSET_H)
64 # include <localcharset.h>
65 #endif
66 #ifdef HAVE_ICONV_H
67 # include <iconv.h>
68 #endif
69 
70 
71 
73 
74 
76 
77 
78 
80 {
83  return GWEN_ERROR_GENERIC;
84  return 0;
85 }
86 
87 
88 
90 {
94  }
95 }
96 
97 
98 
100 {
101  GWEN_GUI *gui;
102 
105  gui->refCount=1;
106 
107  gui->checkCertFn=GWEN_Gui_CheckCertBuiltIn;
108  gui->getSyncIoFn=GWEN_Gui_Internal_GetSyncIo;
109 
110  gui->getPasswordFn=GWEN_Gui_Internal_GetPassword;
111  gui->setPasswordStatusFn=GWEN_Gui_Internal_SetPasswordStatus;
112 
113  gui->progressDataTree=GWEN_ProgressData_Tree_new();
114  gui->activeDialogs=GWEN_Dialog_List_new();
115  GWEN_Gui_SetCharSet(gui, "");
116 
117  gui->dbPasswords=GWEN_DB_Group_new("passwords");
118  gui->badPasswords=GWEN_StringList_new();
119 
120  gui->minProgressLogLevel=GWEN_LoggerLevel_Info;
121 
122  return gui;
123 }
124 
125 
126 
128 {
129  if (gui) {
130  assert(gui->refCount);
131  if ((--gui->refCount)==0) {
133 
134  GWEN_Dialog_List_free(gui->activeDialogs);
135  GWEN_ProgressData_Tree_free(gui->progressDataTree);
136  free(gui->name);
137  free(gui->charSet);
138 
139  GWEN_DB_Group_free(gui->dbPasswords);
140  if (gui->passwdStore)
141  GWEN_PasswordStore_free(gui->passwdStore);
142  GWEN_StringList_free(gui->badPasswords);
143 
144  GWEN_FREE_OBJECT(gui);
145  }
146  }
147 }
148 
149 
150 
152 {
153  assert(gui);
154  assert(gui->refCount);
155  gui->refCount++;
156 }
157 
158 
159 
161 {
164 
165  return NULL;
166 }
167 
168 
169 
171 {
172  GWEN_GUI *previousGui;
173  int rv;
174 
176  DBG_ERROR(GWEN_LOGDOMAIN, "No thread local data for GUI)");
177  return;
178  }
179 
180  if (gui)
181  GWEN_Gui_Attach(gui);
182 
184 
185  if (previousGui)
186  GWEN_Gui_free(previousGui);
188  if (rv<0) {
189  DBG_ERROR(GWEN_LOGDOMAIN, "Could not set GUI (%d)", rv);
190  }
191 }
192 
193 
194 
195 uint32_t GWEN_Gui_GetFlags(const GWEN_GUI *gui)
196 {
197  assert(gui);
198  return gui->flags;
199 }
200 
201 
202 
203 void GWEN_Gui_SetFlags(GWEN_GUI *gui, uint32_t fl)
204 {
205  assert(gui);
206  gui->flags=fl;
207 }
208 
209 
210 
211 void GWEN_Gui_AddFlags(GWEN_GUI *gui, uint32_t fl)
212 {
213  assert(gui);
214  gui->flags|=fl;
215 }
216 
217 
218 
219 void GWEN_Gui_SubFlags(GWEN_GUI *gui, uint32_t fl)
220 {
221  assert(gui);
222  gui->flags&=~fl;
223 }
224 
225 
226 
227 void GWEN_Gui_SetName(GWEN_GUI *gui, const char *name)
228 {
229  free(gui->name);
230  if (name)
231  gui->name=strdup(name);
232  else
233  gui->name=NULL;
234 }
235 
236 
237 
238 const char *GWEN_Gui_GetName(void)
239 {
240  GWEN_GUI *gui;
241 
242  gui=GWEN_Gui_GetGui();
243  if (gui)
244  return gui->name;
245  return NULL;
246 }
247 
248 
249 
250 const char *GWEN_Gui_GetCharSet(const GWEN_GUI *gui)
251 {
252  if (gui)
253  return gui->charSet;
254  return NULL;
255 }
256 
257 
258 
259 void GWEN_Gui_SetCharSet(GWEN_GUI *gui, const char *s)
260 {
261  const char *cs;
262 
263  assert(gui);
264 
265  if (s) {
266  if (!*s) {
267  /* determine charset according to current locale */
268 #if defined(HAVE_LANGINFO_H)
269  cs=nl_langinfo(CODESET);
270 #elif defined(HAVE_LOCALCHARSET_H)
271  cs=locale_charset();
272 #else
273  /* just pass "" on to libiconv and hope for the best */
274  cs=s;
275 #endif
276  }
277  else
278  cs=s;
279 
280  if (strcasecmp(cs, "UTF-8")==0)
281  cs=NULL;
282  }
283  else
284  cs=s;
285 
286 #ifndef HAVE_ICONV
287  if (cs) {
289  "Missing iconv, cannot convert between UTF-8 and \"%s\"", cs);
290  }
291 #else
292  if (cs) {
293  iconv_t ic;
294  size_t len;
295  char *p;
296 
297  /* Let iconv apply transliteration where necessary */
298  len=strlen(cs);
299  p=(char *)malloc(len+11);
300  assert(p);
301  sprintf(p, "%s//TRANSLIT", cs);
302  ic=iconv_open(p, "UTF-8");
303  if (ic==(iconv_t)-1) {
305  "Charset conversion from \"UTF-8\" to \"%s\" failed: %s (%d)",
306  p, strerror(errno), errno);
307  free(p);
308  return;
309  }
310  iconv_close(ic);
311  cs=p;
312  }
313 
314  if (gui->charSet)
315  free(gui->charSet);
316  gui->charSet=(char *)cs;
317 #endif
318 }
319 
320 
321 
323 {
324  if (gui)
325  return gui->passwdStore;
326  return NULL;
327 }
328 
329 
330 
332 {
333  if (gui) {
334  if (gui->passwdStore && gui->passwdStore!=sto)
335  GWEN_PasswordStore_free(gui->passwdStore);
336  gui->passwdStore=sto;
337  if (sto)
338  gui->flags|=GWEN_GUI_FLAGS_PERMPASSWORDS;
339  else
340  gui->flags&=~GWEN_GUI_FLAGS_PERMPASSWORDS;
341  }
342 }
343 
344 
345 
347  GWEN_DB_NODE *dbPasswords,
348  int persistent)
349 {
350  GWEN_DB_Group_free(gui->dbPasswords);
351  gui->dbPasswords=dbPasswords;
352  gui->persistentPasswords=persistent;
353 }
354 
355 
356 
358 {
359  return gui->dbPasswords;
360 }
361 
362 
363 
364 
365 
366 
367 
368 
369 
370 
371 
372 
373 void GWEN_Gui_ShowError(const char *title, const char *fmt, ...)
374 {
375  va_list list;
376  char msgbuffer[2048];
377  int rv;
378 
379  /* prepare list for va_arg */
380  va_start(list, fmt);
381  rv=vsnprintf(msgbuffer, sizeof(msgbuffer), fmt, list);
382  if (rv<0 || rv>=(int)(sizeof(msgbuffer))) {
383  DBG_WARN(GWEN_LOGDOMAIN, "Internal buffer too small for message, truncating (%d>%d)",
384  rv, (int)(sizeof(msgbuffer)));
385  }
386  va_end(list);
387 
391  title,
392  msgbuffer,
393  I18N("Dismiss"), NULL, NULL, 0);
394 }
395 
396 
397 
399 {
400  assert(gui);
401  return gui->minProgressLogLevel;
402 }
403 
404 
405 
407 {
408  assert(gui);
409  gui->minProgressLogLevel=ll;
410 }
411 
412 
413 
414 
415 #include "gui_cert.c"
416 #include "gui_dialogs.c"
417 #include "gui_passwd.c"
418 #include "gui_syncio.c"
419 #include "gui_utils.c"
420 #include "gui_virtual.c"
421 
422 
423 
GWENHYWFAR_API const char * fmt
Definition: buffer.h:283
void GWEN_Gui_SubFlags(GWEN_GUI *gui, uint32_t fl)
Definition: gui.c:219
#define I18N(m)
Definition: error.c:42
void GWEN_PasswordStore_free(GWEN_PASSWD_STORE *sto)
Definition: passwdstore.c:60
int GWENHYWFAR_CB GWEN_Gui_CheckCertBuiltIn(GWEN_UNUSED GWEN_GUI *gui, const GWEN_SSLCERTDESCR *cd, GWEN_UNUSED GWEN_SYNCIO *sio, uint32_t guiid)
Definition: gui_cert.c:43
void GWEN_Gui_SetFlags(GWEN_GUI *gui, uint32_t fl)
Definition: gui.c:203
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
Definition: db.c:421
GWEN_LOGGER_LEVEL
Definition: logger.h:64
void GWEN_Gui_SetCharSet(GWEN_GUI *gui, const char *s)
Definition: gui.c:259
void GWEN_Gui_SetMinProgressLogLevel(GWEN_GUI *gui, GWEN_LOGGER_LEVEL ll)
Definition: gui.c:406
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
#define GWEN_GUI_FLAGS_PERMPASSWORDS
Definition: gui.h:998
void GWEN_Gui_AddFlags(GWEN_GUI *gui, uint32_t fl)
Definition: gui.c:211
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:125
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWENHYWFAR_API int GWEN_Gui_MessageBox(uint32_t flags, const char *title, const char *text, const char *b1, const char *b2, const char *b3, uint32_t guiid)
Definition: gui_virtual.c:342
GWEN_LOGGER_LEVEL GWEN_Gui_GetMinProgressLogLevel(const GWEN_GUI *gui)
Definition: gui.c:398
GWENHYWFAR_API GWEN_THREADLOCAL_DATA * GWEN_ThreadLocalData_new()
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
const char * GWEN_Gui_GetName(void)
Definition: gui.c:238
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
static int GWENHYWFAR_CB GWEN_Gui_Internal_SetPasswordStatus(GWEN_GUI *gui, const char *token, const char *pin, GWEN_GUI_PASSWORD_STATUS status, GWEN_UNUSED uint32_t guiid)
Definition: gui_passwd.c:216
GWENHYWFAR_API int GWEN_ThreadLocalData_SetData(GWEN_THREADLOCAL_DATA *threadLocalData, void *pointer)
#define GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL
Definition: gui.h:331
GWEN_GUI * GWEN_Gui_GetGui(void)
Definition: gui.c:160
#define GWEN_ERROR_GENERIC
Definition: error.h:62
void GWEN_Gui_ModuleFini()
Definition: gui.c:89
void GWEN_Dialog_List_free(GWEN_DIALOG_LIST *l)
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
static GWEN_THREADLOCAL_DATA * _globalThreadLocalGuiContainer
Definition: gui.c:72
GWEN_PASSWD_STORE * GWEN_Gui_GetPasswdStore(const GWEN_GUI *gui)
Definition: gui.c:322
static int GWENHYWFAR_CB GWEN_Gui_Internal_GetPassword(GWEN_GUI *gui, uint32_t flags, const char *token, const char *title, const char *text, char *buffer, int minLen, int maxLen, GWEN_UNUSED GWEN_GUI_PASSWORD_METHOD methodId, GWEN_UNUSED GWEN_DB_NODE *methodParams, uint32_t guiid)
Definition: gui_passwd.c:60
#define GWEN_GUI_MSG_FLAGS_TYPE_ERROR
Definition: gui.h:293
GWEN_DIALOG_LIST * GWEN_Dialog_List_new()
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
struct GWEN_PASSWD_STORE GWEN_PASSWD_STORE
Definition: passwdstore.h:37
void GWEN_Gui_SetPasswordDb(GWEN_GUI *gui, GWEN_DB_NODE *dbPasswords, int persistent)
Definition: gui.c:346
GWEN_GUI * GWEN_Gui_new(void)
Definition: gui.c:99
void GWEN_Gui_SetPasswdStore(GWEN_GUI *gui, GWEN_PASSWD_STORE *sto)
Definition: gui.c:331
#define GWEN_GUI_MSG_FLAGS_CONFIRM_B1
Definition: gui.h:299
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
GWENHYWFAR_API void GWEN_ThreadLocalData_free(GWEN_THREADLOCAL_DATA *threadLocalData)
GWEN_DB_NODE * GWEN_Gui_GetPasswordDb(const GWEN_GUI *gui)
Definition: gui.c:357
void GWEN_Gui_Attach(GWEN_GUI *gui)
Definition: gui.c:151
struct GWEN_GUI GWEN_GUI
Definition: gui.h:176
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition: db.c:173
void GWEN_Gui_SetName(GWEN_GUI *gui, const char *name)
Definition: gui.c:227
void GWEN_Gui_free(GWEN_GUI *gui)
Definition: gui.c:127
void GWEN_Gui_SetGui(GWEN_GUI *gui)
Definition: gui.c:170
void GWEN_Gui_ShowError(const char *title, const char *fmt,...)
Definition: gui.c:373
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition: stringlist.c:50
uint32_t GWEN_Gui_GetFlags(const GWEN_GUI *gui)
Definition: gui.c:195
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
int GWENHYWFAR_CB GWEN_Gui_Internal_GetSyncIo(GWEN_UNUSED GWEN_GUI *gui, const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui_syncio.c:153
int GWEN_Gui_ModuleInit()
Definition: gui.c:79
const char * GWEN_Gui_GetCharSet(const GWEN_GUI *gui)
Definition: gui.c:250
GWENHYWFAR_API void * GWEN_ThreadLocalData_GetData(const GWEN_THREADLOCAL_DATA *threadLocalData)
struct GWEN_THREADLOCAL_DATA GWEN_THREADLOCAL_DATA