gwenhywfar 5.14.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
86
87
88
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
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
195uint32_t GWEN_Gui_GetFlags(const GWEN_GUI *gui)
196{
197 assert(gui);
198 return gui->flags;
199}
200
201
202
203void GWEN_Gui_SetFlags(GWEN_GUI *gui, uint32_t fl)
204{
205 assert(gui);
206 gui->flags=fl;
207}
208
209
210
211void GWEN_Gui_AddFlags(GWEN_GUI *gui, uint32_t fl)
212{
213 assert(gui);
214 gui->flags|=fl;
215}
216
217
218
219void GWEN_Gui_SubFlags(GWEN_GUI *gui, uint32_t fl)
220{
221 assert(gui);
222 gui->flags&=~fl;
223}
224
225
226
227void 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
238const 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
250const char *GWEN_Gui_GetCharSet(const GWEN_GUI *gui)
251{
252 if (gui)
253 return gui->charSet;
254 return NULL;
255}
256
257
258
259void 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)
339 else
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
373void 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
#define NULL
Definition binreloc.c:300
GWENHYWFAR_API const char * fmt
Definition buffer.h:283
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition db.c:173
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
Definition db.c:421
struct GWEN_DB_NODE GWEN_DB_NODE
Definition db.h:228
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define DBG_WARN(dbg_logger, format,...)
Definition debug.h:125
#define I18N(m)
Definition error.c:42
#define GWEN_ERROR_GENERIC
Definition error.h:62
void GWEN_Gui_SetName(GWEN_GUI *gui, const char *name)
Definition gui.c:227
void GWEN_Gui_SetMinProgressLogLevel(GWEN_GUI *gui, GWEN_LOGGER_LEVEL ll)
Definition gui.c:406
void GWEN_Gui_SubFlags(GWEN_GUI *gui, uint32_t fl)
Definition gui.c:219
void GWEN_Gui_SetCharSet(GWEN_GUI *gui, const char *s)
Definition gui.c:259
const char * GWEN_Gui_GetCharSet(const GWEN_GUI *gui)
Definition gui.c:250
GWEN_GUI * GWEN_Gui_GetGui(void)
Definition gui.c:160
void GWEN_Gui_ShowError(const char *title, const char *fmt,...)
Definition gui.c:373
void GWEN_Gui_SetGui(GWEN_GUI *gui)
Definition gui.c:170
void GWEN_Gui_SetPasswordDb(GWEN_GUI *gui, GWEN_DB_NODE *dbPasswords, int persistent)
Definition gui.c:346
int GWEN_Gui_ModuleInit()
Definition gui.c:79
GWEN_GUI * GWEN_Gui_new(void)
Definition gui.c:99
const char * GWEN_Gui_GetName(void)
Definition gui.c:238
GWEN_PASSWD_STORE * GWEN_Gui_GetPasswdStore(const GWEN_GUI *gui)
Definition gui.c:322
static GWEN_THREADLOCAL_DATA * _globalThreadLocalGuiContainer
Definition gui.c:72
void GWEN_Gui_ModuleFini()
Definition gui.c:89
void GWEN_Gui_Attach(GWEN_GUI *gui)
Definition gui.c:151
GWEN_DB_NODE * GWEN_Gui_GetPasswordDb(const GWEN_GUI *gui)
Definition gui.c:357
void GWEN_Gui_SetPasswdStore(GWEN_GUI *gui, GWEN_PASSWD_STORE *sto)
Definition gui.c:331
void GWEN_Gui_SetFlags(GWEN_GUI *gui, uint32_t fl)
Definition gui.c:203
GWEN_LOGGER_LEVEL GWEN_Gui_GetMinProgressLogLevel(const GWEN_GUI *gui)
Definition gui.c:398
uint32_t GWEN_Gui_GetFlags(const GWEN_GUI *gui)
Definition gui.c:195
void GWEN_Gui_free(GWEN_GUI *gui)
Definition gui.c:127
void GWEN_Gui_AddFlags(GWEN_GUI *gui, uint32_t fl)
Definition gui.c:211
#define GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL
Definition gui.h:331
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)
#define GWEN_GUI_MSG_FLAGS_CONFIRM_B1
Definition gui.h:299
#define GWEN_GUI_MSG_FLAGS_TYPE_ERROR
Definition gui.h:293
#define GWEN_GUI_FLAGS_PERMPASSWORDS
Definition gui.h:998
struct GWEN_GUI GWEN_GUI
Definition gui.h:176
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
static int GWENHYWFAR_CB GWEN_Gui_Internal_GetPassword(GWEN_GUI *gui, uint32_t flags, const char *token, const char *title, const char *text, char *pwBuffer, int minLen, int maxLen, GWEN_UNUSED GWEN_GUI_PASSWORD_METHOD methodId, GWEN_UNUSED GWEN_DB_NODE *methodParams, uint32_t guiid)
Definition gui_passwd.c:84
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:292
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
#define GWEN_INHERIT_FUNCTIONS(t)
Definition inherit.h:163
#define GWEN_INHERIT_INIT(t, element)
Definition inherit.h:223
#define GWEN_INHERIT_FINI(t, element)
Definition inherit.h:238
GWEN_DIALOG_LIST * GWEN_Dialog_List_new()
void GWEN_Dialog_List_free(GWEN_DIALOG_LIST *l)
#define GWEN_LOGDOMAIN
Definition logger.h:32
GWEN_LOGGER_LEVEL
Definition logger.h:61
@ GWEN_LoggerLevel_Info
Definition logger.h:68
#define GWEN_FREE_OBJECT(varname)
Definition memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55
void GWEN_PasswordStore_free(GWEN_PASSWD_STORE *sto)
Definition passwdstore.c:60
struct GWEN_PASSWD_STORE GWEN_PASSWD_STORE
Definition passwdstore.h:37
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition stringlist.c:62
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition stringlist.c:50
GWENHYWFAR_API int GWEN_ThreadLocalData_SetData(GWEN_THREADLOCAL_DATA *threadLocalData, void *pointer)
GWENHYWFAR_API GWEN_THREADLOCAL_DATA * GWEN_ThreadLocalData_new()
GWENHYWFAR_API void * GWEN_ThreadLocalData_GetData(const GWEN_THREADLOCAL_DATA *threadLocalData)
struct GWEN_THREADLOCAL_DATA GWEN_THREADLOCAL_DATA
GWENHYWFAR_API void GWEN_ThreadLocalData_free(GWEN_THREADLOCAL_DATA *threadLocalData)