1 /***************************************************************************
2  begin       : Mon Mar 01 2004
3  copyright   : (C) 2018 by Martin Preuss
4  email       : martin@libchipcard.de
5 
6  ***************************************************************************
7  * This file is part of the project "AqBanking".                           *
8  * Please see toplevel file COPYING of that project for license details.   *
9  ***************************************************************************/
10 
11 #ifdef HAVE_CONFIG_H
12 # include <config.h>
13 #endif
14 
15 #include "aqbanking/backendsupport/provider_p.h"
16 #include "aqbanking/backendsupport/provider_be.h"
17 #include "aqbanking/banking_l.h"
18 
19 #include <gwenhywfar/debug.h>
20 #include <gwenhywfar/misc.h>
21 #include <gwenhywfar/text.h>
22 
23 #include <assert.h>
24 #include <ctype.h>
25 
26 
27 GWEN_INHERIT_FUNCTIONS(AB_PROVIDER)
GWEN_LIST_FUNCTIONS(AB_PROVIDER,AB_Provider)28 GWEN_LIST_FUNCTIONS(AB_PROVIDER, AB_Provider)
29 GWEN_LIST2_FUNCTIONS(AB_PROVIDER, AB_Provider)
30 
31 GWEN_INHERIT(GWEN_PLUGIN, AB_PLUGIN_PROVIDER)
32 
33 
34 
35 
36 AB_PROVIDER *AB_Provider_new(AB_BANKING *ab, const char *name)
37 {
38   AB_PROVIDER *pro;
39   GWEN_BUFFER *nbuf;
40 
41   assert(ab);
42   assert(name);
43 
44   nbuf=GWEN_Buffer_new(0, 256, 0, 1);
45   if (GWEN_Text_EscapeToBufferTolerant(name, nbuf)) {
46     DBG_ERROR(AQBANKING_LOGDOMAIN,
47               "Bad backend name, aborting.");
48     GWEN_Buffer_free(nbuf);
49     abort();
50   }
51   else {
52     char *s;
53 
54     s=GWEN_Buffer_GetStart(nbuf);
55     while (*s) {
56       *s=tolower(*s);
57       s++;
58     }
59   }
60 
61   GWEN_NEW_OBJECT(AB_PROVIDER, pro);
62   pro->usage=1;
63   GWEN_INHERIT_INIT(AB_PROVIDER, pro);
64   GWEN_LIST_INIT(AB_PROVIDER, pro);
65 
66   pro->banking=ab;
67   pro->name=strdup(name);
68   pro->escName=strdup(GWEN_Buffer_GetStart(nbuf));
69   GWEN_Buffer_free(nbuf);
70 
71   return pro;
72 }
73 
74 
75 
AB_Provider_free(AB_PROVIDER * pro)76 void AB_Provider_free(AB_PROVIDER *pro)
77 {
78   if (pro) {
79     assert(pro->usage);
80     if (--(pro->usage)==0) {
81       DBG_VERBOUS(AQBANKING_LOGDOMAIN, "Destroying AB_PROVIDER (%s)",
82                   pro->name);
83       GWEN_INHERIT_FINI(AB_PROVIDER, pro);
84       GWEN_Plugin_free(pro->plugin);
85       free(pro->name);
86       free(pro->escName);
87       GWEN_LIST_FINI(AB_PROVIDER, pro);
88       GWEN_FREE_OBJECT(pro);
89     }
90   }
91 }
92 
93 
94 
AB_Provider_AddFlags(AB_PROVIDER * pro,uint32_t fl)95 void AB_Provider_AddFlags(AB_PROVIDER *pro, uint32_t fl)
96 {
97   assert(pro);
98   pro->flags|=fl;
99 }
100 
101 
102 
AB_Provider_SetPlugin(AB_PROVIDER * pro,GWEN_PLUGIN * pl)103 void AB_Provider_SetPlugin(AB_PROVIDER *pro, GWEN_PLUGIN *pl)
104 {
105   assert(pro);
106   pro->plugin=pl;
107 }
108 
109 
110 
AB_Provider_Init(AB_PROVIDER * pro,GWEN_DB_NODE * db)111 int AB_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *db)
112 {
113   assert(pro);
114   if (pro->initCounter==0) {
115     if (pro->initFn) {
116       int rv;
117 
118       rv=pro->initFn(pro, db);
119       if (!rv) {
120         pro->initCounter++;
121       }
122       return rv;
123     }
124     else {
125       DBG_ERROR(AQBANKING_LOGDOMAIN, "No init function set");
126       return GWEN_ERROR_NOT_IMPLEMENTED;
127     }
128   }
129   else {
130     pro->initCounter++;
131     DBG_INFO(AQBANKING_LOGDOMAIN, "Backend already initialised, increasing counter to %d", pro->initCounter);
132     return 0;
133   }
134 }
135 
136 
137 
AB_Provider_Fini(AB_PROVIDER * pro,GWEN_DB_NODE * db)138 int AB_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *db)
139 {
140   assert(pro);
141 
142   if (pro->initCounter==1) {
143     if (pro->finiFn) {
144       int rv;
145 
146       rv=pro->finiFn(pro, db);
147       pro->initCounter=0;
148       if (rv<0) {
149         DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
150         return rv;
151       }
152       return rv;
153     }
154     else {
155       DBG_ERROR(AQBANKING_LOGDOMAIN, "No fini function set");
156       pro->initCounter=0;
157       return GWEN_ERROR_NOT_IMPLEMENTED;
158     }
159   }
160   else if (pro->initCounter>0) {
161     pro->initCounter--;
162     DBG_INFO(AQBANKING_LOGDOMAIN, "Backend still initialised, decreasing counter to %d", pro->initCounter);
163     return 0;
164   }
165   else {
166     DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider is not initialized");
167     return GWEN_ERROR_INVALID;
168   }
169 }
170 
171 
172 
AB_Provider_GetName(const AB_PROVIDER * pro)173 const char *AB_Provider_GetName(const AB_PROVIDER *pro)
174 {
175   assert(pro);
176   return pro->name;
177 }
178 
179 
180 
AB_Provider_GetEscapedName(const AB_PROVIDER * pro)181 const char *AB_Provider_GetEscapedName(const AB_PROVIDER *pro)
182 {
183   assert(pro);
184   return pro->escName;
185 }
186 
187 
188 
AB_Provider_GetBanking(const AB_PROVIDER * pro)189 AB_BANKING *AB_Provider_GetBanking(const AB_PROVIDER *pro)
190 {
191   assert(pro);
192   return pro->banking;
193 }
194 
195 
196 
197 
AB_Provider_SetInitFn(AB_PROVIDER * pro,AB_PROVIDER_INIT_FN f)198 void AB_Provider_SetInitFn(AB_PROVIDER *pro, AB_PROVIDER_INIT_FN f)
199 {
200   assert(pro);
201   pro->initFn=f;
202 }
203 
204 
205 
AB_Provider_SetFiniFn(AB_PROVIDER * pro,AB_PROVIDER_FINI_FN f)206 void AB_Provider_SetFiniFn(AB_PROVIDER *pro, AB_PROVIDER_FINI_FN f)
207 {
208   assert(pro);
209   pro->finiFn=f;
210 }
211 
212 
213 
214 
AB_Provider_SetGetNewUserDialogFn(AB_PROVIDER * pro,AB_PROVIDER_GET_NEWUSER_DIALOG_FN f)215 void AB_Provider_SetGetNewUserDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_NEWUSER_DIALOG_FN f)
216 {
217   assert(pro);
218   pro->getNewUserDialogFn=f;
219 }
220 
221 
222 
AB_Provider_SetGetEditUserDialogFn(AB_PROVIDER * pro,AB_PROVIDER_GET_EDITUSER_DIALOG_FN f)223 void AB_Provider_SetGetEditUserDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_EDITUSER_DIALOG_FN f)
224 {
225   assert(pro);
226   pro->getEditUserDialogFn=f;
227 }
228 
229 
230 
AB_Provider_SetGetNewAccountDialogFn(AB_PROVIDER * pro,AB_PROVIDER_GET_NEWACCOUNT_DIALOG_FN f)231 void AB_Provider_SetGetNewAccountDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_NEWACCOUNT_DIALOG_FN f)
232 {
233   assert(pro);
234   pro->getNewAccountDialogFn=f;
235 }
236 
237 
238 
AB_Provider_SetGetEditAccountDialogFn(AB_PROVIDER * pro,AB_PROVIDER_GET_EDITACCOUNT_DIALOG_FN f)239 void AB_Provider_SetGetEditAccountDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_EDITACCOUNT_DIALOG_FN f)
240 {
241   assert(pro);
242   pro->getEditAccountDialogFn=f;
243 }
244 
245 
246 
AB_Provider_SetGetUserTypeDialogFn(AB_PROVIDER * pro,AB_PROVIDER_GET_USERTYPE_DIALOG_FN f)247 void AB_Provider_SetGetUserTypeDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_USERTYPE_DIALOG_FN f)
248 {
249   assert(pro);
250   pro->getUserTypeDialogFn=f;
251 }
252 
253 
254 
AB_Provider_SetSendCommandsFn(AB_PROVIDER * pro,AB_PROVIDER_SENDCOMMANDS_FN f)255 void AB_Provider_SetSendCommandsFn(AB_PROVIDER *pro, AB_PROVIDER_SENDCOMMANDS_FN f)
256 {
257   assert(pro);
258   pro->sendCommandsFn=f;
259 }
260 
261 
262 
AB_Provider_SetCreateAccountObjectsFn(AB_PROVIDER * pro,AB_PROVIDER_CREATEACCOUNTOBJECT_FN f)263 void AB_Provider_SetCreateAccountObjectsFn(AB_PROVIDER *pro, AB_PROVIDER_CREATEACCOUNTOBJECT_FN f)
264 {
265   assert(pro);
266   pro->createAccountObjectFn=f;
267 }
268 
269 
270 
AB_Provider_SetCreateUserObjectsFn(AB_PROVIDER * pro,AB_PROVIDER_CREATEUSEROBJECT_FN f)271 void AB_Provider_SetCreateUserObjectsFn(AB_PROVIDER *pro, AB_PROVIDER_CREATEUSEROBJECT_FN f)
272 {
273   assert(pro);
274   pro->createUserObjectFn=f;
275 }
276 
277 
278 
AB_Provider_SetUpdateAccountSpecFn(AB_PROVIDER * pro,AB_PROVIDER_UPDATEACCOUNTSPEC_FN f)279 void AB_Provider_SetUpdateAccountSpecFn(AB_PROVIDER *pro, AB_PROVIDER_UPDATEACCOUNTSPEC_FN f)
280 {
281   assert(pro);
282   pro->updateAccountSpecFn=f;
283 }
284 
285 
286 
AB_Provider_SetControlFn(AB_PROVIDER * pro,AB_PROVIDER_CONTROL_FN f)287 void AB_Provider_SetControlFn(AB_PROVIDER *pro, AB_PROVIDER_CONTROL_FN f)
288 {
289   assert(pro);
290   pro->controlFn=f;
291 }
292 
293 
294 
295 
296 
297 
AB_Provider_CreateAccountObject(AB_PROVIDER * pro)298 AB_ACCOUNT *AB_Provider_CreateAccountObject(AB_PROVIDER *pro)
299 {
300   assert(pro);
301   if (pro->createAccountObjectFn)
302     return pro->createAccountObjectFn(pro);
303   else
304     return NULL;
305 }
306 
307 
308 
AB_Provider_CreateUserObject(AB_PROVIDER * pro)309 AB_USER *AB_Provider_CreateUserObject(AB_PROVIDER *pro)
310 {
311   assert(pro);
312   if (pro->createUserObjectFn)
313     return pro->createUserObjectFn(pro);
314   else
315     return NULL;
316 }
317 
318 
319 
AB_Provider_UpdateAccountSpec(AB_PROVIDER * pro,AB_ACCOUNT_SPEC * as,int doLock)320 int AB_Provider_UpdateAccountSpec(AB_PROVIDER *pro, AB_ACCOUNT_SPEC *as, int doLock)
321 {
322   assert(pro);
323   if (pro->updateAccountSpecFn)
324     return pro->updateAccountSpecFn(pro, as, doLock);
325   else
326     return GWEN_ERROR_NOT_IMPLEMENTED;
327 }
328 
329 
330 
AB_Provider_Control(AB_PROVIDER * pro,int argc,char ** argv)331 int AB_Provider_Control(AB_PROVIDER *pro, int argc, char **argv)
332 {
333   assert(pro);
334   if (pro->controlFn)
335     return pro->controlFn(pro, argc, argv);
336   else
337     return GWEN_ERROR_NOT_IMPLEMENTED;
338 }
339 
340 
341 
342 
343 
344 
345 
346 
AB_Provider_GetNewUserDialog(AB_PROVIDER * pro,int i)347 GWEN_DIALOG *AB_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i)
348 {
349   assert(pro);
350   if (pro->getNewUserDialogFn)
351     return pro->getNewUserDialogFn(pro, i);
352   else
353     return NULL;
354 }
355 
356 
357 
AB_Provider_GetEditUserDialog(AB_PROVIDER * pro,AB_USER * u)358 GWEN_DIALOG *AB_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u)
359 {
360   assert(pro);
361   if (pro->getEditUserDialogFn) {
362     DBG_INFO(AQBANKING_LOGDOMAIN, "calling pro->getEditUserDialogFn");
363     return pro->getEditUserDialogFn(pro, u);
364   }
365   else {
366     DBG_INFO(AQBANKING_LOGDOMAIN, "No getEditUserDialogFn set");
367     return NULL;
368   }
369 }
370 
371 
372 
AB_Provider_GetNewAccountDialog(AB_PROVIDER * pro)373 GWEN_DIALOG *AB_Provider_GetNewAccountDialog(AB_PROVIDER *pro)
374 {
375   assert(pro);
376   if (pro->getNewAccountDialogFn)
377     return pro->getNewAccountDialogFn(pro);
378   else
379     return NULL;
380 }
381 
382 
383 
AB_Provider_GetEditAccountDialog(AB_PROVIDER * pro,AB_ACCOUNT * a)384 GWEN_DIALOG *AB_Provider_GetEditAccountDialog(AB_PROVIDER *pro, AB_ACCOUNT *a)
385 {
386   assert(pro);
387   if (pro->getEditAccountDialogFn)
388     return pro->getEditAccountDialogFn(pro, a);
389   else
390     return NULL;
391 }
392 
393 
394 
AB_Provider_GetUserTypeDialog(AB_PROVIDER * pro)395 GWEN_DIALOG *AB_Provider_GetUserTypeDialog(AB_PROVIDER *pro)
396 {
397   assert(pro);
398   if (pro->getUserTypeDialogFn)
399     return pro->getUserTypeDialogFn(pro);
400   else
401     return NULL;
402 }
403 
404 
405 
AB_Provider_SendCommands(AB_PROVIDER * pro,AB_PROVIDERQUEUE * pq,AB_IMEXPORTER_CONTEXT * ctx)406 int AB_Provider_SendCommands(AB_PROVIDER *pro, AB_PROVIDERQUEUE *pq, AB_IMEXPORTER_CONTEXT *ctx)
407 {
408   assert(pro);
409   if (pro->sendCommandsFn)
410     return pro->sendCommandsFn(pro, pq, ctx);
411   else
412     return GWEN_ERROR_NOT_SUPPORTED;
413 }
414 
415 
416 
417 
418 
419 
AB_Provider_IsInit(const AB_PROVIDER * pro)420 int AB_Provider_IsInit(const AB_PROVIDER *pro)
421 {
422   assert(pro);
423   return (pro->initCounter>0);
424 }
425 
426 
427 
AB_Provider_GetFlags(const AB_PROVIDER * pro)428 uint32_t AB_Provider_GetFlags(const AB_PROVIDER *pro)
429 {
430   assert(pro);
431   return pro->flags;
432 }
433 
434 
435 
AB_Provider_GetUserDataDir(const AB_PROVIDER * pro,GWEN_BUFFER * buf)436 int AB_Provider_GetUserDataDir(const AB_PROVIDER *pro, GWEN_BUFFER *buf)
437 {
438   assert(pro);
439   assert(buf);
440   assert(pro->banking);
441   assert(pro->escName);
442 
443   return AB_Banking_GetProviderUserDataDir(pro->banking,
444                                            pro->escName,
445                                            buf);
446 }
447 
448 
449 
AB_Plugin_Provider_new(GWEN_PLUGIN_MANAGER * pm,const char * name,const char * fileName)450 GWEN_PLUGIN *AB_Plugin_Provider_new(GWEN_PLUGIN_MANAGER *pm,
451                                     const char *name,
452                                     const char *fileName)
453 {
454   GWEN_PLUGIN *pl;
455   AB_PLUGIN_PROVIDER *xpl;
456 
457   pl=GWEN_Plugin_new(pm, name, fileName);
458   GWEN_NEW_OBJECT(AB_PLUGIN_PROVIDER, xpl);
459   GWEN_INHERIT_SETDATA(GWEN_PLUGIN, AB_PLUGIN_PROVIDER, pl, xpl,
460                        AB_Plugin_Provider_FreeData);
461 
462   return pl;
463 
464 }
465 
466 
467 
AB_Plugin_Provider_FreeData(void * bp,void * p)468 void GWENHYWFAR_CB AB_Plugin_Provider_FreeData(void *bp, void *p)
469 {
470   AB_PLUGIN_PROVIDER *xpl;
471 
472   xpl=(AB_PLUGIN_PROVIDER *)p;
473   GWEN_FREE_OBJECT(xpl);
474 }
475 
476 
477 
AB_Plugin_Provider_Factory(GWEN_PLUGIN * pl,AB_BANKING * ab)478 AB_PROVIDER *AB_Plugin_Provider_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab)
479 {
480   AB_PLUGIN_PROVIDER *xpl;
481 
482   assert(pl);
483   xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, AB_PLUGIN_PROVIDER, pl);
484   assert(xpl);
485 
486   assert(xpl->pluginFactoryFn);
487   return xpl->pluginFactoryFn(pl, ab);
488 }
489 
490 
491 
AB_Plugin_Provider_SetFactoryFn(GWEN_PLUGIN * pl,AB_PLUGIN_PROVIDER_FACTORY_FN fn)492 void AB_Plugin_Provider_SetFactoryFn(GWEN_PLUGIN *pl, AB_PLUGIN_PROVIDER_FACTORY_FN fn)
493 {
494   AB_PLUGIN_PROVIDER *xpl;
495 
496   assert(pl);
497   xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, AB_PLUGIN_PROVIDER, pl);
498   assert(xpl);
499 
500   xpl->pluginFactoryFn=fn;
501 }
502 
503 
504 
505 
506 
507 #include "provider_account.c"
508 #include "provider_accspec.c"
509 #include "provider_user.c"
510 #include "provider_queues.c"
511 
512 
513 
514 
515 
516 
517 
518