1 /***************************************************************************
2 begin : Mon Mar 01 2004
3 copyright : (C) 2018 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13
14
15 #include "account_p.h"
16 #include "aqhbci_l.h"
17 #include "provider_l.h"
18 #include "hbci-updates_l.h"
19 #include "aqhbci/banking/provider.h"
20
21 #include <aqbanking/banking_be.h>
22 #include <aqbanking/backendsupport/account.h>
23
24 #include <gwenhywfar/debug.h>
25 #include <gwenhywfar/misc.h>
26
27 #include <assert.h>
28
29
GWEN_INHERIT(AB_ACCOUNT,AH_ACCOUNT)30 GWEN_INHERIT(AB_ACCOUNT, AH_ACCOUNT)
31
32
33 AB_ACCOUNT *AH_Account_new(AB_PROVIDER *pro)
34 {
35 AB_ACCOUNT *a;
36 AH_ACCOUNT *ae;
37
38 a=AB_Account_new();
39 assert(a);
40 AB_Account_SetProvider(a, pro);
41 AB_Account_SetBackendName(a, "aqhbci");
42
43 GWEN_NEW_OBJECT(AH_ACCOUNT, ae);
44 GWEN_INHERIT_SETDATA(AB_ACCOUNT, AH_ACCOUNT, a, ae, AH_Account_freeData);
45 ae->flags=AH_BANK_FLAGS_DEFAULT;
46 ae->hbci=AH_Provider_GetHbci(pro);
47
48 ae->readFromDbFn=AB_Account_SetReadFromDbFn(a, AH_Account_ReadFromDb);
49 ae->writeToDbFn=AB_Account_SetWriteToDbFn(a, AH_Account_WriteToDb);
50
51 return a;
52 }
53
54
55
AH_Account_ReadFromDb(AB_ACCOUNT * a,GWEN_DB_NODE * db)56 int AH_Account_ReadFromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db)
57 {
58 AH_ACCOUNT *ae;
59 GWEN_DB_NODE *dbP;
60 int rv;
61 const char *s;
62 AB_PROVIDER *pro;
63
64 assert(a);
65 ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a);
66 assert(ae);
67
68 /* save provider, because AB_Account_ReadFromDb clears it */
69 pro=AB_Account_GetProvider(a);
70
71 /* read data for base class */
72 rv=(ae->readFromDbFn)(a, db);
73 if (rv<0) {
74 DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv);
75 return rv;
76 }
77
78 /* set provider again */
79 AB_Account_SetProvider(a, pro);
80
81 /* read data for provider */
82 dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend");
83
84 ae->flags=AH_Account_Flags_fromDb(dbP, "accountFlags");
85
86 s=GWEN_DB_GetCharValue(dbP, "suffix", 0, NULL);
87 if (s && *s) {
88 ae->flags|=AH_BANK_FLAGS_KTV2;
89 if (strcasecmp(s, "<empty>")!=0)
90 AB_Account_SetSubAccountId(a, s);
91 }
92
93 return 0;
94 }
95
96
97
AH_Account_WriteToDb(const AB_ACCOUNT * a,GWEN_DB_NODE * db)98 int AH_Account_WriteToDb(const AB_ACCOUNT *a, GWEN_DB_NODE *db)
99 {
100 AH_ACCOUNT *ae;
101 GWEN_DB_NODE *dbP;
102 int rv;
103
104 assert(a);
105 ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a);
106 assert(ae);
107
108 rv=(ae->writeToDbFn)(a, db);
109 if (rv<0) {
110 DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv);
111 return rv;
112 }
113
114 /* write data for provider */
115 dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend");
116
117 AH_Account_Flags_toDb(dbP, "accountFlags", ae->flags);
118 GWEN_DB_DeleteVar(dbP, "suffix");
119
120 return 0;
121 }
122
123
124
AH_Account_freeData(void * bp,void * p)125 void GWENHYWFAR_CB AH_Account_freeData(void *bp, void *p)
126 {
127 AH_ACCOUNT *ae;
128
129 ae=(AH_ACCOUNT *) p;
130
131 if (ae->dbTempUpd)
132 GWEN_DB_Group_free(ae->dbTempUpd);
133
134 GWEN_FREE_OBJECT(ae);
135 }
136
137
138
AH_Account_GetHbci(const AB_ACCOUNT * a)139 AH_HBCI *AH_Account_GetHbci(const AB_ACCOUNT *a)
140 {
141 AH_ACCOUNT *ae;
142
143 assert(a);
144 ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a);
145 assert(ae);
146 return ae->hbci;
147 }
148
149
150
AH_Account_Flags_toDb(GWEN_DB_NODE * db,const char * name,uint32_t flags)151 void AH_Account_Flags_toDb(GWEN_DB_NODE *db, const char *name,
152 uint32_t flags)
153 {
154 GWEN_DB_DeleteVar(db, name);
155 if (flags & AH_BANK_FLAGS_PREFER_SINGLE_TRANSFER)
156 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "preferSingleTransfer");
157 if (flags & AH_BANK_FLAGS_PREFER_SINGLE_DEBITNOTE)
158 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "preferSingleDebitNote");
159 if (flags & AH_BANK_FLAGS_KTV2)
160 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "ktv2");
161 if (flags & AH_BANK_FLAGS_SEPA)
162 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "sepa");
163 if (flags & AH_BANK_FLAGS_SEPA_PREFER_SINGLE_TRANSFER)
164 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "sepaPreferSingleTransfer");
165 if (flags & AH_BANK_FLAGS_SEPA_PREFER_SINGLE_DEBITNOTE)
166 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "sepaPreferSingleDebitNote");
167 if (flags & AH_BANK_FLAGS_PREFER_CAMT_DOWNLOAD)
168 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "preferCamtDownload");
169 }
170
171
172
AH_Account_Flags_fromDb(GWEN_DB_NODE * db,const char * name)173 uint32_t AH_Account_Flags_fromDb(GWEN_DB_NODE *db, const char *name)
174 {
175 uint32_t fl=0;
176 int i;
177
178 for (i=0; ; i++) {
179 const char *s;
180
181 s=GWEN_DB_GetCharValue(db, name, i, 0);
182 if (!s)
183 break;
184 if (strcasecmp(s, "preferSingleTransfer")==0)
185 fl|=AH_BANK_FLAGS_PREFER_SINGLE_TRANSFER;
186 else if (strcasecmp(s, "preferSingleDebitNote")==0)
187 fl|=AH_BANK_FLAGS_PREFER_SINGLE_DEBITNOTE;
188 else if (strcasecmp(s, "ktv2")==0)
189 fl|=AH_BANK_FLAGS_KTV2;
190 else if (strcasecmp(s, "sepa")==0)
191 fl|=AH_BANK_FLAGS_SEPA;
192 else if (strcasecmp(s, "sepaPreferSingleTransfer")==0)
193 fl|=AH_BANK_FLAGS_SEPA_PREFER_SINGLE_TRANSFER;
194 else if (strcasecmp(s, "sepaPreferSingleDebitNote")==0)
195 fl|=AH_BANK_FLAGS_SEPA_PREFER_SINGLE_DEBITNOTE;
196 else if (strcasecmp(s, "preferCamtDownload")==0)
197 fl|=AH_BANK_FLAGS_PREFER_CAMT_DOWNLOAD;
198 else {
199 DBG_WARN(AQHBCI_LOGDOMAIN, "Unknown account flag \"%s\"", s);
200 }
201 }
202
203 return fl;
204 }
205
206
207
AH_Account_GetFlags(const AB_ACCOUNT * a)208 uint32_t AH_Account_GetFlags(const AB_ACCOUNT *a)
209 {
210 AH_ACCOUNT *ae;
211
212 assert(a);
213 ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a);
214 assert(ae);
215
216 return ae->flags;
217 }
218
219
220
AH_Account_SetFlags(AB_ACCOUNT * a,uint32_t flags)221 void AH_Account_SetFlags(AB_ACCOUNT *a, uint32_t flags)
222 {
223 AH_ACCOUNT *ae;
224
225 assert(a);
226 ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a);
227 assert(ae);
228
229 ae->flags=flags;
230 }
231
232
233
AH_Account_AddFlags(AB_ACCOUNT * a,uint32_t flags)234 void AH_Account_AddFlags(AB_ACCOUNT *a, uint32_t flags)
235 {
236 AH_ACCOUNT *ae;
237
238 assert(a);
239 ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a);
240 assert(ae);
241
242 ae->flags|=flags;
243 }
244
245
246
AH_Account_SubFlags(AB_ACCOUNT * a,uint32_t flags)247 void AH_Account_SubFlags(AB_ACCOUNT *a, uint32_t flags)
248 {
249 AH_ACCOUNT *ae;
250
251 assert(a);
252 ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a);
253 assert(ae);
254
255 ae->flags&=~flags;
256 }
257
258
259
AH_Account_GetDbTempUpd(const AB_ACCOUNT * a)260 GWEN_DB_NODE *AH_Account_GetDbTempUpd(const AB_ACCOUNT *a)
261 {
262 AH_ACCOUNT *ae;
263
264 assert(a);
265 ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a);
266 assert(ae);
267
268 return ae->dbTempUpd;
269 }
270
271
272
AH_Account_SetDbTempUpd(AB_ACCOUNT * a,GWEN_DB_NODE * db)273 void AH_Account_SetDbTempUpd(AB_ACCOUNT *a, GWEN_DB_NODE *db)
274 {
275 AH_ACCOUNT *ae;
276
277 assert(a);
278 ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a);
279 assert(ae);
280
281 if (ae->dbTempUpd)
282 GWEN_DB_Group_free(ae->dbTempUpd);
283 ae->dbTempUpd=db;
284 }
285
286
287
288
289