1 /***************************************************************************
2  begin       : Fri Feb 07 2003
3  copyright   : (C) 2021 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 /* included from gui.c */
26 
27 
28 
GWEN_Gui_SetMessageBoxFn(GWEN_GUI * gui,GWEN_GUI_MESSAGEBOX_FN f)29 GWEN_GUI_MESSAGEBOX_FN GWEN_Gui_SetMessageBoxFn(GWEN_GUI *gui,
30                                                 GWEN_GUI_MESSAGEBOX_FN f)
31 {
32   GWEN_GUI_MESSAGEBOX_FN of;
33 
34   assert(gui);
35   of=gui->messageBoxFn;
36   gui->messageBoxFn=f;
37   return of;
38 }
39 
40 
41 
GWEN_Gui_SetInputBoxFn(GWEN_GUI * gui,GWEN_GUI_INPUTBOX_FN f)42 GWEN_GUI_INPUTBOX_FN GWEN_Gui_SetInputBoxFn(GWEN_GUI *gui,
43                                             GWEN_GUI_INPUTBOX_FN f)
44 {
45   GWEN_GUI_INPUTBOX_FN of;
46 
47   assert(gui);
48   of=gui->inputBoxFn;
49   gui->inputBoxFn=f;
50   return of;
51 }
52 
53 
54 
GWEN_Gui_SetShowBoxFn(GWEN_GUI * gui,GWEN_GUI_SHOWBOX_FN f)55 GWEN_GUI_SHOWBOX_FN GWEN_Gui_SetShowBoxFn(GWEN_GUI *gui,
56                                           GWEN_GUI_SHOWBOX_FN f)
57 {
58   GWEN_GUI_SHOWBOX_FN of;
59 
60   assert(gui);
61   of=gui->showBoxFn;
62   gui->showBoxFn=f;
63   return of;
64 }
65 
66 
67 
GWEN_Gui_SetHideBoxFn(GWEN_GUI * gui,GWEN_GUI_HIDEBOX_FN f)68 GWEN_GUI_HIDEBOX_FN GWEN_Gui_SetHideBoxFn(GWEN_GUI *gui,
69                                           GWEN_GUI_HIDEBOX_FN f)
70 {
71   GWEN_GUI_HIDEBOX_FN of;
72 
73   assert(gui);
74   of=gui->hideBoxFn;
75   gui->hideBoxFn=f;
76   return of;
77 }
78 
79 
80 
GWEN_Gui_SetProgressStartFn(GWEN_GUI * gui,GWEN_GUI_PROGRESS_START_FN f)81 GWEN_GUI_PROGRESS_START_FN GWEN_Gui_SetProgressStartFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_START_FN f)
82 {
83   GWEN_GUI_PROGRESS_START_FN of;
84 
85   assert(gui);
86   of=gui->progressStartFn;
87   gui->progressStartFn=f;
88   return of;
89 }
90 
91 
92 
GWEN_Gui_SetProgressAdvanceFn(GWEN_GUI * gui,GWEN_GUI_PROGRESS_ADVANCE_FN f)93 GWEN_GUI_PROGRESS_ADVANCE_FN GWEN_Gui_SetProgressAdvanceFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_ADVANCE_FN f)
94 {
95   GWEN_GUI_PROGRESS_ADVANCE_FN of;
96 
97   assert(gui);
98   of=gui->progressAdvanceFn;
99   gui->progressAdvanceFn=f;
100   return of;
101 }
102 
103 
104 
GWEN_Gui_SetProgressSetTotalFn(GWEN_GUI * gui,GWEN_GUI_PROGRESS_SETTOTAL_FN f)105 GWEN_GUI_PROGRESS_SETTOTAL_FN GWEN_Gui_SetProgressSetTotalFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_SETTOTAL_FN f)
106 {
107   GWEN_GUI_PROGRESS_SETTOTAL_FN of;
108 
109   assert(gui);
110   of=gui->progressSetTotalFn;
111   gui->progressSetTotalFn=f;
112   return of;
113 }
114 
115 
116 
GWEN_Gui_SetProgressLogFn(GWEN_GUI * gui,GWEN_GUI_PROGRESS_LOG_FN f)117 GWEN_GUI_PROGRESS_LOG_FN GWEN_Gui_SetProgressLogFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_LOG_FN f)
118 {
119   GWEN_GUI_PROGRESS_LOG_FN of;
120 
121   assert(gui);
122   of=gui->progressLogFn;
123   gui->progressLogFn=f;
124   return of;
125 }
126 
127 
128 
GWEN_Gui_SetProgressEndFn(GWEN_GUI * gui,GWEN_GUI_PROGRESS_END_FN f)129 GWEN_GUI_PROGRESS_END_FN GWEN_Gui_SetProgressEndFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_END_FN f)
130 {
131   GWEN_GUI_PROGRESS_END_FN of;
132 
133   assert(gui);
134   of=gui->progressEndFn;
135   gui->progressEndFn=f;
136   return of;
137 }
138 
139 
140 
GWEN_Gui_SetPrintFn(GWEN_GUI * gui,GWEN_GUI_PRINT_FN f)141 GWEN_GUI_PRINT_FN GWEN_Gui_SetPrintFn(GWEN_GUI *gui,
142                                       GWEN_GUI_PRINT_FN f)
143 {
144   GWEN_GUI_PRINT_FN of;
145 
146   assert(gui);
147   of=gui->printFn;
148   gui->printFn=f;
149   return of;
150 }
151 
152 
153 
GWEN_Gui_SetGetPasswordFn(GWEN_GUI * gui,GWEN_GUI_GETPASSWORD_FN f)154 GWEN_GUI_GETPASSWORD_FN GWEN_Gui_SetGetPasswordFn(GWEN_GUI *gui,
155                                                   GWEN_GUI_GETPASSWORD_FN f)
156 {
157   GWEN_GUI_GETPASSWORD_FN of;
158 
159   assert(gui);
160   of=gui->getPasswordFn;
161   gui->getPasswordFn=f;
162   return of;
163 }
164 
165 
166 
GWEN_Gui_SetSetPasswordStatusFn(GWEN_GUI * gui,GWEN_GUI_SETPASSWORDSTATUS_FN f)167 GWEN_GUI_SETPASSWORDSTATUS_FN GWEN_Gui_SetSetPasswordStatusFn(GWEN_GUI *gui,
168                                                               GWEN_GUI_SETPASSWORDSTATUS_FN f)
169 {
170   GWEN_GUI_SETPASSWORDSTATUS_FN of;
171 
172   assert(gui);
173   of=gui->setPasswordStatusFn;
174   gui->setPasswordStatusFn=f;
175   return of;
176 }
177 
178 
179 
GWEN_Gui_SetLogHookFn(GWEN_GUI * gui,GWEN_GUI_LOG_HOOK_FN f)180 GWEN_GUI_LOG_HOOK_FN GWEN_Gui_SetLogHookFn(GWEN_GUI *gui,
181                                            GWEN_GUI_LOG_HOOK_FN f)
182 {
183   GWEN_GUI_LOG_HOOK_FN of;
184 
185   assert(gui);
186   of=gui->logHookFn;
187   gui->logHookFn=f;
188 
189   return of;
190 }
191 
192 
193 
GWEN_Gui_SetWaitForSocketsFn(GWEN_GUI * gui,GWEN_GUI_WAITFORSOCKETS_FN f)194 GWEN_GUI_WAITFORSOCKETS_FN GWEN_Gui_SetWaitForSocketsFn(GWEN_GUI *gui,
195                                                         GWEN_GUI_WAITFORSOCKETS_FN f)
196 {
197   GWEN_GUI_WAITFORSOCKETS_FN of;
198 
199   assert(gui);
200   of=gui->waitForSocketsFn;
201   gui->waitForSocketsFn=f;
202 
203   return of;
204 }
205 
206 
207 
GWEN_Gui_SetCheckCertFn(GWEN_GUI * gui,GWEN_GUI_CHECKCERT_FN f)208 GWEN_GUI_CHECKCERT_FN GWEN_Gui_SetCheckCertFn(GWEN_GUI *gui, GWEN_GUI_CHECKCERT_FN f)
209 {
210   GWEN_GUI_CHECKCERT_FN of;
211 
212   assert(gui);
213   of=gui->checkCertFn;
214   gui->checkCertFn=f;
215 
216   return of;
217 }
218 
219 
220 
GWEN_Gui_SetExecDialogFn(GWEN_GUI * gui,GWEN_GUI_EXEC_DIALOG_FN f)221 GWEN_GUI_EXEC_DIALOG_FN GWEN_Gui_SetExecDialogFn(GWEN_GUI *gui, GWEN_GUI_EXEC_DIALOG_FN f)
222 {
223   GWEN_GUI_EXEC_DIALOG_FN of;
224 
225   assert(gui);
226   of=gui->execDialogFn;
227   gui->execDialogFn=f;
228 
229   return of;
230 }
231 
232 
233 
GWEN_Gui_SetOpenDialogFn(GWEN_GUI * gui,GWEN_GUI_OPEN_DIALOG_FN f)234 GWEN_GUI_OPEN_DIALOG_FN GWEN_Gui_SetOpenDialogFn(GWEN_GUI *gui, GWEN_GUI_OPEN_DIALOG_FN f)
235 {
236   GWEN_GUI_OPEN_DIALOG_FN of;
237 
238   assert(gui);
239   of=gui->openDialogFn;
240   gui->openDialogFn=f;
241 
242   return of;
243 }
244 
245 
246 
GWEN_Gui_SetCloseDialogFn(GWEN_GUI * gui,GWEN_GUI_CLOSE_DIALOG_FN f)247 GWEN_GUI_CLOSE_DIALOG_FN GWEN_Gui_SetCloseDialogFn(GWEN_GUI *gui, GWEN_GUI_CLOSE_DIALOG_FN f)
248 {
249   GWEN_GUI_CLOSE_DIALOG_FN of;
250 
251   assert(gui);
252   of=gui->closeDialogFn;
253   gui->closeDialogFn=f;
254 
255   return of;
256 }
257 
258 
259 
GWEN_Gui_SetRunDialogFn(GWEN_GUI * gui,GWEN_GUI_RUN_DIALOG_FN f)260 GWEN_GUI_RUN_DIALOG_FN GWEN_Gui_SetRunDialogFn(GWEN_GUI *gui, GWEN_GUI_RUN_DIALOG_FN f)
261 {
262   GWEN_GUI_RUN_DIALOG_FN of;
263 
264   assert(gui);
265   of=gui->runDialogFn;
266   gui->runDialogFn=f;
267 
268   return of;
269 }
270 
271 
272 
GWEN_Gui_SetReadDialogPrefsFn(GWEN_GUI * gui,GWEN_GUI_READ_DIALOG_PREFS_FN f)273 GWEN_GUI_READ_DIALOG_PREFS_FN GWEN_Gui_SetReadDialogPrefsFn(GWEN_GUI *gui, GWEN_GUI_READ_DIALOG_PREFS_FN f)
274 {
275   GWEN_GUI_READ_DIALOG_PREFS_FN of;
276 
277   assert(gui);
278   of=gui->readDialogPrefsFn;
279   gui->readDialogPrefsFn=f;
280 
281   return of;
282 }
283 
284 
285 
GWEN_Gui_SetWriteDialogPrefsFn(GWEN_GUI * gui,GWEN_GUI_WRITE_DIALOG_PREFS_FN f)286 GWEN_GUI_WRITE_DIALOG_PREFS_FN GWEN_Gui_SetWriteDialogPrefsFn(GWEN_GUI *gui, GWEN_GUI_WRITE_DIALOG_PREFS_FN f)
287 {
288   GWEN_GUI_WRITE_DIALOG_PREFS_FN of;
289 
290   assert(gui);
291   of=gui->writeDialogPrefsFn;
292   gui->writeDialogPrefsFn=f;
293 
294   return of;
295 }
296 
297 
298 
GWEN_Gui_SetGetFileNameFn(GWEN_GUI * gui,GWEN_GUI_GET_FILENAME_FN f)299 GWEN_GUI_GET_FILENAME_FN GWEN_Gui_SetGetFileNameFn(GWEN_GUI *gui, GWEN_GUI_GET_FILENAME_FN f)
300 {
301   GWEN_GUI_GET_FILENAME_FN of;
302 
303   assert(gui);
304   of=gui->getFileNameFn;
305   gui->getFileNameFn=f;
306 
307   return of;
308 }
309 
310 
311 
GWEN_Gui_SetGetSyncIoFn(GWEN_GUI * gui,GWEN_GUI_GETSYNCIO_FN f)312 GWEN_GUI_GETSYNCIO_FN GWEN_Gui_SetGetSyncIoFn(GWEN_GUI *gui, GWEN_GUI_GETSYNCIO_FN f)
313 {
314   GWEN_GUI_GETSYNCIO_FN of;
315 
316   assert(gui);
317   of=gui->getSyncIoFn;
318   gui->getSyncIoFn=f;
319 
320   return of;
321 }
322 
323 
324 
GWEN_Gui_SetKeyDataFromTextOpenSslFn(GWEN_GUI * gui,GWEN_GUI_KEYDATAFROMTEXT_OPENSSL_FN f)325 GWEN_GUI_KEYDATAFROMTEXT_OPENSSL_FN GWEN_Gui_SetKeyDataFromTextOpenSslFn(GWEN_GUI *gui,
326                                                                          GWEN_GUI_KEYDATAFROMTEXT_OPENSSL_FN f)
327 {
328   GWEN_GUI_KEYDATAFROMTEXT_OPENSSL_FN of;
329 
330   assert(gui);
331   of=gui->keyDataFromTextOpenSslFn;
332   gui->keyDataFromTextOpenSslFn=f;
333 
334   return of;
335 
336 }
337 
338 
339 
340 
341 
GWEN_Gui_MessageBox(uint32_t flags,const char * title,const char * text,const char * b1,const char * b2,const char * b3,uint32_t guiid)342 int GWEN_Gui_MessageBox(uint32_t flags,
343                         const char *title,
344                         const char *text,
345                         const char *b1,
346                         const char *b2,
347                         const char *b3,
348                         uint32_t guiid)
349 {
350   GWEN_GUI *gui;
351 
352   gui=GWEN_Gui_GetGui();
353   if (gui && gui->messageBoxFn)
354     return gui->messageBoxFn(gui, flags, title, text, b1, b2, b3, guiid);
355   return GWEN_ERROR_NOT_IMPLEMENTED;
356 }
357 
358 
359 
GWEN_Gui_InputBox(uint32_t flags,const char * title,const char * text,char * buffer,int minLen,int maxLen,uint32_t guiid)360 int GWEN_Gui_InputBox(uint32_t flags,
361                       const char *title,
362                       const char *text,
363                       char *buffer,
364                       int minLen,
365                       int maxLen,
366                       uint32_t guiid)
367 {
368   GWEN_GUI *gui;
369 
370   gui=GWEN_Gui_GetGui();
371   if (gui && gui->inputBoxFn)
372     return gui->inputBoxFn(gui, flags, title, text, buffer, minLen, maxLen, guiid);
373   return GWEN_ERROR_NOT_IMPLEMENTED;
374 }
375 
376 
377 
GWEN_Gui_ShowBox(uint32_t flags,const char * title,const char * text,uint32_t guiid)378 uint32_t GWEN_Gui_ShowBox(uint32_t flags,
379                           const char *title,
380                           const char *text,
381                           uint32_t guiid)
382 {
383   GWEN_GUI *gui;
384 
385   gui=GWEN_Gui_GetGui();
386   if (gui && gui->showBoxFn)
387     return gui->showBoxFn(gui, flags, title, text, guiid);
388   return 0;
389 }
390 
391 
392 
GWEN_Gui_HideBox(uint32_t id)393 void GWEN_Gui_HideBox(uint32_t id)
394 {
395   GWEN_GUI *gui;
396 
397   gui=GWEN_Gui_GetGui();
398   if (gui && gui->hideBoxFn)
399     return gui->hideBoxFn(gui, id);
400 }
401 
402 
403 
GWEN_Gui_ProgressStart(uint32_t progressFlags,const char * title,const char * text,uint64_t total,uint32_t guiid)404 uint32_t GWEN_Gui_ProgressStart(uint32_t progressFlags,
405                                 const char *title,
406                                 const char *text,
407                                 uint64_t total,
408                                 uint32_t guiid)
409 {
410   GWEN_GUI *gui;
411 
412   gui=GWEN_Gui_GetGui();
413   if (gui && gui->progressStartFn)
414     return gui->progressStartFn(gui, progressFlags, title, text, total, guiid);
415   return 0;
416 }
417 
418 
419 
GWEN_Gui_ProgressAdvance(uint32_t id,uint32_t progress)420 int GWEN_Gui_ProgressAdvance(uint32_t id, uint32_t progress)
421 {
422   GWEN_GUI *gui;
423 
424   gui=GWEN_Gui_GetGui();
425   if (gui && gui->progressAdvanceFn)
426     return gui->progressAdvanceFn(gui, id, progress);
427   return 0;
428 }
429 
430 
431 
GWEN_Gui_ProgressSetTotal(uint32_t id,uint64_t total)432 int GWEN_Gui_ProgressSetTotal(uint32_t id, uint64_t total)
433 {
434   GWEN_GUI *gui;
435 
436   gui=GWEN_Gui_GetGui();
437   if (gui && gui->progressSetTotalFn)
438     return gui->progressSetTotalFn(gui, id, total);
439   return 0;
440 }
441 
442 
443 
GWEN_Gui_ProgressLog(uint32_t id,GWEN_LOGGER_LEVEL level,const char * text)444 int GWEN_Gui_ProgressLog(uint32_t id,
445                          GWEN_LOGGER_LEVEL level,
446                          const char *text)
447 {
448   GWEN_GUI *gui;
449 
450   gui=GWEN_Gui_GetGui();
451   if (gui && gui->progressLogFn)
452     return gui->progressLogFn(gui, id, level, text);
453   return 0;
454 }
455 
456 
457 
GWEN_Gui_ProgressLog2(uint32_t id,GWEN_LOGGER_LEVEL level,const char * fmt,...)458 int GWEN_Gui_ProgressLog2(uint32_t id,
459                           GWEN_LOGGER_LEVEL level,
460                           const char *fmt, ...)
461 {
462   va_list list;
463   char msgbuffer[2048];
464   int rv;
465 
466   /* prepare list for va_arg */
467   va_start(list, fmt);
468   rv=vsnprintf(msgbuffer, sizeof(msgbuffer), fmt, list);
469   if (rv<0 || rv>=(int)(sizeof(msgbuffer))) {
470     DBG_WARN(GWEN_LOGDOMAIN, "Internal buffer too small for message, truncating (%d>%d)",
471              rv, (int)(sizeof(msgbuffer)));
472   }
473   va_end(list);
474 
475   return GWEN_Gui_ProgressLog(id, level, msgbuffer);
476 }
477 
478 
479 
GWEN_Gui_ProgressEnd(uint32_t id)480 int GWEN_Gui_ProgressEnd(uint32_t id)
481 {
482   GWEN_GUI *gui;
483 
484   gui=GWEN_Gui_GetGui();
485   if (gui && gui->progressEndFn)
486     return gui->progressEndFn(gui, id);
487   return GWEN_ERROR_NOT_IMPLEMENTED;
488 }
489 
490 
491 
GWEN_Gui_Print(const char * docTitle,const char * docType,const char * descr,const char * text,uint32_t guiid)492 int GWEN_Gui_Print(const char *docTitle,
493                    const char *docType,
494                    const char *descr,
495                    const char *text,
496                    uint32_t guiid)
497 {
498   GWEN_GUI *gui;
499 
500   gui=GWEN_Gui_GetGui();
501   if (gui && gui->printFn)
502     return gui->printFn(gui, docTitle, docType, descr, text, guiid);
503   return GWEN_ERROR_NOT_IMPLEMENTED;
504 }
505 
506 
507 
GWEN_Gui_LogHook(const char * logDomain,GWEN_LOGGER_LEVEL priority,const char * s)508 int GWEN_Gui_LogHook(const char *logDomain,
509                      GWEN_LOGGER_LEVEL priority, const char *s)
510 {
511   GWEN_GUI *gui;
512 
513   gui=GWEN_Gui_GetGui();
514   if (gui && gui->logHookFn) {
515     if (priority>=GWEN_LoggerLevel_Debug &&
516         logDomain &&
517         strcasecmp(logDomain, "gwenhywfar")==0)
518       /* don't send possibly sensitive data to the log function because
519        * some application tend to store the messages indiscriminately.
520        * In some cases sensitive information can be send to this function
521        * which we don't want the application to store */
522       return 0;
523     else {
524       int rv;
525 
526       if (gui->inLogHook==0) {
527         /* otherwise the log message seems to be uncritical, convey it */
528         gui->inLogHook++;
529         rv=gui->logHookFn(gui, logDomain, priority, s);
530         gui->inLogHook--;
531         return rv;
532       }
533       else
534         /* loghook recursion, don't convey */
535         return 0;
536     }
537   }
538   else
539     /* handle as usual */
540     return 0;
541 }
542 
543 
544 
GWEN_Gui_KeyDataFromText_OpenSSL(const char * text,unsigned char * buffer,unsigned int bufLength)545 int GWEN_Gui_KeyDataFromText_OpenSSL(const char *text,
546                                      unsigned char *buffer,
547                                      unsigned int bufLength)
548 {
549   GWEN_GUI *gui;
550 
551   gui=GWEN_Gui_GetGui();
552   if (gui && gui->keyDataFromTextOpenSslFn)
553     return gui->keyDataFromTextOpenSslFn(gui, text, buffer, bufLength);
554   return GWEN_ERROR_NOT_IMPLEMENTED;
555 }
556 
557 
558 
GWEN_Gui_ExecDialog(GWEN_DIALOG * dlg,uint32_t guiid)559 int GWEN_Gui_ExecDialog(GWEN_DIALOG *dlg, uint32_t guiid)
560 {
561   GWEN_GUI *gui;
562 
563   gui=GWEN_Gui_GetGui();
564   if (gui && gui->execDialogFn)
565     return gui->execDialogFn(gui, dlg, guiid);
566   return GWEN_ERROR_NOT_IMPLEMENTED;
567 }
568 
569 
570 
GWEN_Gui_OpenDialog(GWEN_DIALOG * dlg,uint32_t guiid)571 int GWEN_Gui_OpenDialog(GWEN_DIALOG *dlg, uint32_t guiid)
572 {
573   GWEN_GUI *gui;
574 
575   gui=GWEN_Gui_GetGui();
576   if (gui && gui->openDialogFn)
577     return gui->openDialogFn(gui, dlg, guiid);
578   return GWEN_ERROR_NOT_IMPLEMENTED;
579 }
580 
581 
582 
GWEN_Gui_CloseDialog(GWEN_DIALOG * dlg)583 int GWEN_Gui_CloseDialog(GWEN_DIALOG *dlg)
584 {
585   GWEN_GUI *gui;
586 
587   gui=GWEN_Gui_GetGui();
588   if (gui && gui->closeDialogFn)
589     return gui->closeDialogFn(gui, dlg);
590   return GWEN_ERROR_NOT_IMPLEMENTED;
591 }
592 
593 
594 
GWEN_Gui_RunDialog(GWEN_DIALOG * dlg,int untilEnd)595 int GWEN_Gui_RunDialog(GWEN_DIALOG *dlg, int untilEnd)
596 {
597   GWEN_GUI *gui;
598 
599   gui=GWEN_Gui_GetGui();
600   if (gui && gui->runDialogFn)
601     return gui->runDialogFn(gui, dlg, untilEnd);
602   return GWEN_ERROR_NOT_IMPLEMENTED;
603 }
604 
605 
606 
607 
GWEN_Gui_GetFileName(const char * caption,GWEN_GUI_FILENAME_TYPE fnt,uint32_t flags,const char * patterns,GWEN_BUFFER * pathBuffer,uint32_t guiid)608 int GWEN_Gui_GetFileName(const char *caption,
609                          GWEN_GUI_FILENAME_TYPE fnt,
610                          uint32_t flags,
611                          const char *patterns,
612                          GWEN_BUFFER *pathBuffer,
613                          uint32_t guiid)
614 {
615   GWEN_GUI *gui;
616 
617   gui=GWEN_Gui_GetGui();
618   if (gui && gui->getFileNameFn)
619     return gui->getFileNameFn(gui, caption, fnt, flags, patterns, pathBuffer, guiid);
620   return GWEN_ERROR_NOT_IMPLEMENTED;
621 }
622 
623 
624 
GWEN_Gui_ReadDialogPrefs(const char * groupName,const char * altName,GWEN_DB_NODE ** pDb)625 int GWEN_Gui_ReadDialogPrefs(const char *groupName,
626                              const char *altName,
627                              GWEN_DB_NODE **pDb)
628 {
629   GWEN_GUI *gui;
630 
631   gui=GWEN_Gui_GetGui();
632   if (gui && gui->readDialogPrefsFn)
633     return gui->readDialogPrefsFn(gui, groupName, altName, pDb);
634   return GWEN_ERROR_NOT_IMPLEMENTED;
635 }
636 
637 
638 
GWEN_Gui_WriteDialogPrefs(const char * groupName,GWEN_DB_NODE * db)639 int GWEN_Gui_WriteDialogPrefs(const char *groupName,
640                               GWEN_DB_NODE *db)
641 {
642   GWEN_GUI *gui;
643 
644   gui=GWEN_Gui_GetGui();
645   if (gui && gui->writeDialogPrefsFn)
646     return gui->writeDialogPrefsFn(gui, groupName, db);
647   return GWEN_ERROR_NOT_IMPLEMENTED;
648 }
649 
650 
651 
GWEN_Gui_GetSyncIo(const char * url,const char * defaultProto,int defaultPort,GWEN_SYNCIO ** pSio)652 int GWEN_Gui_GetSyncIo(const char *url,
653                        const char *defaultProto,
654                        int defaultPort,
655                        GWEN_SYNCIO **pSio)
656 {
657   GWEN_GUI *gui;
658 
659   gui=GWEN_Gui_GetGui();
660   if (gui && gui->getSyncIoFn)
661     return gui->getSyncIoFn(gui, url, defaultProto, defaultPort, pSio);
662   return GWEN_ERROR_NOT_IMPLEMENTED;
663 }
664 
665 
666 
GWEN_Gui_WaitForSockets(GWEN_SOCKET_LIST2 * readSockets,GWEN_SOCKET_LIST2 * writeSockets,uint32_t guiid,int msecs)667 int GWEN_Gui_WaitForSockets(GWEN_SOCKET_LIST2 *readSockets,
668                             GWEN_SOCKET_LIST2 *writeSockets,
669                             uint32_t guiid,
670                             int msecs)
671 {
672   GWEN_GUI *gui;
673 
674   gui=GWEN_Gui_GetGui();
675   if (gui && gui->waitForSocketsFn)
676     return gui->waitForSocketsFn(gui, readSockets, writeSockets, guiid, msecs);
677   else {
678     uint32_t pid;
679     time_t t0;
680     int wt;
681     int dist;
682 
683     t0=time(0);
684     if (msecs==GWEN_TIMEOUT_NONE) {
685       wt=0;
686       dist=0;
687     }
688     else if (msecs==GWEN_TIMEOUT_FOREVER) {
689       wt=0;
690       dist=500;
691     }
692     else {
693       wt=msecs/1000;
694       dist=500;
695     }
696 
697     pid=GWEN_Gui_ProgressStart(((wt!=0)?GWEN_GUI_PROGRESS_SHOW_PROGRESS:0) |
698                                GWEN_GUI_PROGRESS_SHOW_ABORT |
699                                GWEN_GUI_PROGRESS_DELAY |
700                                GWEN_GUI_PROGRESS_ALLOW_EMBED,
701                                I18N("Waiting for Data"),
702                                "Waiting for data to become available",
703                                wt,
704                                0);
705     while (1) {
706       GWEN_SOCKETSET *rset;
707       GWEN_SOCKETSET *wset;
708       GWEN_SOCKET_LIST2_ITERATOR *sit;
709 
710       rset=GWEN_SocketSet_new();
711       wset=GWEN_SocketSet_new();
712 
713       /* fill read socket set */
714       if (readSockets) {
715         sit=GWEN_Socket_List2_First(readSockets);
716         if (sit) {
717           GWEN_SOCKET *s;
718 
719           s=GWEN_Socket_List2Iterator_Data(sit);
720           assert(s);
721 
722           while (s) {
723             GWEN_SocketSet_AddSocket(rset, s);
724             s=GWEN_Socket_List2Iterator_Next(sit);
725           }
726           GWEN_Socket_List2Iterator_free(sit);
727         }
728       }
729 
730       /* fill write socket set */
731       if (writeSockets) {
732         sit=GWEN_Socket_List2_First(writeSockets);
733         if (sit) {
734           GWEN_SOCKET *s;
735 
736           s=GWEN_Socket_List2Iterator_Data(sit);
737           assert(s);
738 
739           while (s) {
740             GWEN_SocketSet_AddSocket(wset, s);
741             s=GWEN_Socket_List2Iterator_Next(sit);
742           }
743           GWEN_Socket_List2Iterator_free(sit);
744         }
745       }
746 
747       if (GWEN_SocketSet_GetSocketCount(rset)==0 &&
748           GWEN_SocketSet_GetSocketCount(wset)==0) {
749         /* no sockets to wait for, sleep for a few ms to keep cpu load down */
750         GWEN_SocketSet_free(wset);
751         GWEN_SocketSet_free(rset);
752 
753         if (msecs) {
754           /* only sleep if a timeout was given */
755           DBG_DEBUG(GWEN_LOGDOMAIN, "Sleeping (no socket)");
756           GWEN_Socket_Select(NULL, NULL, NULL, GWEN_GUI_CPU_TIMEOUT);
757         }
758         GWEN_Gui_ProgressEnd(pid);
759         return GWEN_ERROR_TIMEOUT;
760       }
761       else {
762         int rv;
763         int v=0;
764 
765         rv=GWEN_Socket_Select(rset, wset, NULL, dist);
766         GWEN_SocketSet_free(wset);
767         GWEN_SocketSet_free(rset);
768 
769         if (rv!=GWEN_ERROR_TIMEOUT) {
770           GWEN_Gui_ProgressEnd(pid);
771           return rv;
772         }
773 
774         if (wt) {
775           time_t t1;
776 
777           t1=time(0);
778           v=difftime(t1, t0);
779           if (v>wt) {
780             GWEN_Gui_ProgressEnd(pid);
781             return GWEN_ERROR_TIMEOUT;
782           }
783         }
784         rv=GWEN_Gui_ProgressAdvance(pid, v);
785         if (rv==GWEN_ERROR_USER_ABORTED) {
786           GWEN_Gui_ProgressEnd(pid);
787           return rv;
788         }
789       }
790     } /* loop */
791   }
792 }
793 
794 
795