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