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