/*************************************************************************** begin : Fri Feb 07 2003 copyright : (C) 2003-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * * MA 02111-1307 USA * * * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #define DISABLE_DEBUGLOG #ifndef ICONV_CONST # define ICONV_CONST #endif #include "gui_p.h" #include "dlg_input_l.h" #include "dlg_message_l.h" #include "dlg_progress_l.h" #include "dlg_showbox_l.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined (HAVE_LANGINFO_H) # include #elif defined (HAVE_LOCALCHARSET_H) # include #endif #ifdef HAVE_ICONV_H # include #endif static GWEN_THREADLOCAL_DATA *_globalThreadLocalGuiContainer=NULL; GWEN_INHERIT_FUNCTIONS(GWEN_GUI) int GWEN_Gui_ModuleInit() { _globalThreadLocalGuiContainer=GWEN_ThreadLocalData_new(); if (_globalThreadLocalGuiContainer==NULL) return GWEN_ERROR_GENERIC; return 0; } void GWEN_Gui_ModuleFini() { if (_globalThreadLocalGuiContainer) { GWEN_ThreadLocalData_free(_globalThreadLocalGuiContainer); _globalThreadLocalGuiContainer=NULL; } } GWEN_GUI *GWEN_Gui_new(void) { GWEN_GUI *gui; GWEN_NEW_OBJECT(GWEN_GUI, gui); GWEN_INHERIT_INIT(GWEN_GUI, gui); gui->refCount=1; gui->checkCertFn=GWEN_Gui_CheckCertBuiltIn; gui->getSyncIoFn=GWEN_Gui_Internal_GetSyncIo; gui->getPasswordFn=GWEN_Gui_Internal_GetPassword; gui->setPasswordStatusFn=GWEN_Gui_Internal_SetPasswordStatus; gui->progressDataTree=GWEN_ProgressData_Tree_new(); gui->activeDialogs=GWEN_Dialog_List_new(); GWEN_Gui_SetCharSet(gui, ""); gui->dbPasswords=GWEN_DB_Group_new("passwords"); gui->badPasswords=GWEN_StringList_new(); gui->minProgressLogLevel=GWEN_LoggerLevel_Info; return gui; } void GWEN_Gui_free(GWEN_GUI *gui) { if (gui) { assert(gui->refCount); if ((--gui->refCount)==0) { GWEN_INHERIT_FINI(GWEN_GUI, gui); GWEN_Dialog_List_free(gui->activeDialogs); GWEN_ProgressData_Tree_free(gui->progressDataTree); free(gui->name); free(gui->charSet); GWEN_DB_Group_free(gui->dbPasswords); if (gui->passwdStore) GWEN_PasswordStore_free(gui->passwdStore); GWEN_StringList_free(gui->badPasswords); GWEN_FREE_OBJECT(gui); } } } void GWEN_Gui_Attach(GWEN_GUI *gui) { assert(gui); assert(gui->refCount); gui->refCount++; } GWEN_GUI *GWEN_Gui_GetGui(void) { if (_globalThreadLocalGuiContainer) return (GWEN_GUI*) GWEN_ThreadLocalData_GetData(_globalThreadLocalGuiContainer); return NULL; } void GWEN_Gui_SetGui(GWEN_GUI *gui) { GWEN_GUI *previousGui; int rv; if (_globalThreadLocalGuiContainer==NULL) { DBG_ERROR(GWEN_LOGDOMAIN, "No thread local data for GUI)"); return; } if (gui) GWEN_Gui_Attach(gui); previousGui=(GWEN_GUI*) GWEN_ThreadLocalData_GetData(_globalThreadLocalGuiContainer); if (previousGui) GWEN_Gui_free(previousGui); rv=GWEN_ThreadLocalData_SetData(_globalThreadLocalGuiContainer, (void*) gui); if (rv<0) { DBG_ERROR(GWEN_LOGDOMAIN, "Could not set GUI (%d)", rv); } } uint32_t GWEN_Gui_GetFlags(const GWEN_GUI *gui) { assert(gui); return gui->flags; } void GWEN_Gui_SetFlags(GWEN_GUI *gui, uint32_t fl) { assert(gui); gui->flags=fl; } void GWEN_Gui_AddFlags(GWEN_GUI *gui, uint32_t fl) { assert(gui); gui->flags|=fl; } void GWEN_Gui_SubFlags(GWEN_GUI *gui, uint32_t fl) { assert(gui); gui->flags&=~fl; } void GWEN_Gui_SetName(GWEN_GUI *gui, const char *name) { free(gui->name); if (name) gui->name=strdup(name); else gui->name=NULL; } const char *GWEN_Gui_GetName(void) { GWEN_GUI *gui; gui=GWEN_Gui_GetGui(); if (gui) return gui->name; return NULL; } const char *GWEN_Gui_GetCharSet(const GWEN_GUI *gui) { if (gui) return gui->charSet; return NULL; } void GWEN_Gui_SetCharSet(GWEN_GUI *gui, const char *s) { const char *cs; assert(gui); if (s) { if (!*s) { /* determine charset according to current locale */ #if defined(HAVE_LANGINFO_H) cs=nl_langinfo(CODESET); #elif defined(HAVE_LOCALCHARSET_H) cs=locale_charset(); #else /* just pass "" on to libiconv and hope for the best */ cs=s; #endif } else cs=s; if (strcasecmp(cs, "UTF-8")==0) cs=NULL; } else cs=s; #ifndef HAVE_ICONV if (cs) { DBG_INFO(GWEN_LOGDOMAIN, "Missing iconv, cannot convert between UTF-8 and \"%s\"", cs); } #else if (cs) { iconv_t ic; size_t len; char *p; /* Let iconv apply transliteration where necessary */ len=strlen(cs); p=(char *)malloc(len+11); assert(p); sprintf(p, "%s//TRANSLIT", cs); ic=iconv_open(p, "UTF-8"); if (ic==(iconv_t)-1) { DBG_ERROR(GWEN_LOGDOMAIN, "Charset conversion from \"UTF-8\" to \"%s\" failed: %s (%d)", p, strerror(errno), errno); free(p); return; } iconv_close(ic); cs=p; } if (gui->charSet) free(gui->charSet); gui->charSet=(char *)cs; #endif } GWEN_PASSWD_STORE *GWEN_Gui_GetPasswdStore(const GWEN_GUI *gui) { if (gui) return gui->passwdStore; return NULL; } void GWEN_Gui_SetPasswdStore(GWEN_GUI *gui, GWEN_PASSWD_STORE *sto) { if (gui) { if (gui->passwdStore && gui->passwdStore!=sto) GWEN_PasswordStore_free(gui->passwdStore); gui->passwdStore=sto; if (sto) gui->flags|=GWEN_GUI_FLAGS_PERMPASSWORDS; else gui->flags&=~GWEN_GUI_FLAGS_PERMPASSWORDS; } } void GWEN_Gui_SetPasswordDb(GWEN_GUI *gui, GWEN_DB_NODE *dbPasswords, int persistent) { GWEN_DB_Group_free(gui->dbPasswords); gui->dbPasswords=dbPasswords; gui->persistentPasswords=persistent; } GWEN_DB_NODE *GWEN_Gui_GetPasswordDb(const GWEN_GUI *gui) { return gui->dbPasswords; } void GWEN_Gui_ShowError(const char *title, const char *fmt, ...) { va_list list; char msgbuffer[2048]; int rv; /* prepare list for va_arg */ va_start(list, fmt); rv=vsnprintf(msgbuffer, sizeof(msgbuffer), fmt, list); if (rv<0 || rv>=(int)(sizeof(msgbuffer))) { DBG_WARN(GWEN_LOGDOMAIN, "Internal buffer too small for message, truncating (%d>%d)", rv, (int)(sizeof(msgbuffer))); } va_end(list); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, title, msgbuffer, I18N("Dismiss"), NULL, NULL, 0); } GWEN_LOGGER_LEVEL GWEN_Gui_GetMinProgressLogLevel(const GWEN_GUI *gui) { assert(gui); return gui->minProgressLogLevel; } void GWEN_Gui_SetMinProgressLogLevel(GWEN_GUI *gui, GWEN_LOGGER_LEVEL ll) { assert(gui); gui->minProgressLogLevel=ll; } #include "gui_cert.c" #include "gui_dialogs.c" #include "gui_passwd.c" #include "gui_syncio.c" #include "gui_utils.c" #include "gui_virtual.c"