1 /***************************************************************************
2 begin : Sat Jun 30 2018
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 /* This file is included by banking.c */
12
13
14
15 /* ------------------------------------------------------------------------------------------------
16 * forward declarations
17 * ------------------------------------------------------------------------------------------------
18 */
19
20 static const char *_nonEmptyString(const char *s, const char *altstring);
21 static void _logAccountSpec(const AB_ACCOUNT_SPEC *a, const char *logMessage);
22
23
24 /* ------------------------------------------------------------------------------------------------
25 * implementations
26 * ------------------------------------------------------------------------------------------------
27 */
28
29
30
31
AB_Banking_ReadAccountSpec(const AB_BANKING * ab,uint32_t uniqueId,AB_ACCOUNT_SPEC ** pAccountSpec)32 int AB_Banking_ReadAccountSpec(const AB_BANKING *ab, uint32_t uniqueId, AB_ACCOUNT_SPEC **pAccountSpec)
33 {
34 AB_ACCOUNT_SPEC *accountSpec;
35 GWEN_DB_NODE *db=NULL;
36 int rv;
37
38 assert(ab);
39
40 rv=AB_Banking_ReadConfigGroup(ab, AB_CFG_GROUP_ACCOUNTSPECS, uniqueId, 1, 1, &db);
41 if (rv<0) {
42 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
43 return rv;
44 }
45
46 accountSpec=AB_AccountSpec_new();
47 AB_AccountSpec_ReadDb(accountSpec, db);
48 AB_AccountSpec_SetUniqueId(accountSpec, uniqueId);
49
50 if (1) {
51 int i;
52
53 i=AB_AccountSpec_GetType(accountSpec);
54 if (i==AB_AccountType_Unknown)
55 AB_AccountSpec_SetType(accountSpec, AB_AccountType_Unspecified);
56 }
57
58
59 GWEN_DB_Group_free(db);
60
61 if (pAccountSpec)
62 *pAccountSpec=accountSpec;
63 else
64 AB_AccountSpec_free(accountSpec);
65 return 0;
66 }
67
68
69
70
AB_Banking_WriteAccountSpec(AB_BANKING * ab,const AB_ACCOUNT_SPEC * accountSpec)71 int AB_Banking_WriteAccountSpec(AB_BANKING *ab, const AB_ACCOUNT_SPEC *accountSpec)
72 {
73 GWEN_DB_NODE *db=NULL;
74 int rv;
75 uint32_t uniqueId;
76
77 assert(ab);
78
79 uniqueId=AB_AccountSpec_GetUniqueId(accountSpec);
80
81 /* write account spec to DB */
82 db=GWEN_DB_Group_new("accountSpec");
83 AB_AccountSpec_toDb(accountSpec, db);
84
85 rv=AB_Banking_WriteConfigGroup(ab, AB_CFG_GROUP_ACCOUNTSPECS, uniqueId, 1, 1, db);
86 if (rv<0) {
87 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
88 GWEN_DB_Group_free(db);
89 return rv;
90 }
91 GWEN_DB_Group_free(db);
92
93 return 0;
94 }
95
96
97
AB_Banking_DeleteAccountSpec(AB_BANKING * ab,uint32_t uid)98 int AB_Banking_DeleteAccountSpec(AB_BANKING *ab, uint32_t uid)
99 {
100 int rv;
101
102 rv=AB_Banking_DeleteConfigGroup(ab, AB_CFG_GROUP_ACCOUNTSPECS, uid);
103 if (rv<0) {
104 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
105 return rv;
106 }
107
108 return 0;
109 }
110
111
112
113
114
115
AB_Banking_GetAccountSpecList(const AB_BANKING * ab,AB_ACCOUNT_SPEC_LIST ** pAccountSpecList)116 int AB_Banking_GetAccountSpecList(const AB_BANKING *ab, AB_ACCOUNT_SPEC_LIST **pAccountSpecList)
117 {
118 GWEN_DB_NODE *dbAll=NULL;
119 int rv;
120
121 DBG_INFO(AQBANKING_LOGDOMAIN, "Reading account spec list");
122
123 rv=AB_Banking_ReadConfigGroups(ab, AB_CFG_GROUP_ACCOUNTSPECS, "uniqueId", NULL, NULL, &dbAll);
124 if (rv<0) {
125 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
126 return rv;
127 }
128 else {
129 AB_ACCOUNT_SPEC_LIST *accountSpecList;
130 GWEN_DB_NODE *db;
131
132 accountSpecList=AB_AccountSpec_List_new();
133
134 db=GWEN_DB_GetFirstGroup(dbAll);
135 while (db) {
136 AB_ACCOUNT_SPEC *a=NULL;
137
138 assert(db);
139 a=AB_AccountSpec_fromDb(db);
140 if (a) {
141 _logAccountSpec(a, "Adding account spec");
142 if (1) {
143 int i;
144
145 i=AB_AccountSpec_GetType(a);
146 if (i==AB_AccountType_Unknown)
147 AB_AccountSpec_SetType(a, AB_AccountType_Unspecified);
148 }
149 AB_AccountSpec_List_Add(a, accountSpecList);
150 }
151
152 db=GWEN_DB_GetNextGroup(db);
153 }
154
155 if (AB_AccountSpec_List_GetCount(accountSpecList)) {
156 *pAccountSpecList=accountSpecList;
157 GWEN_DB_Group_free(dbAll);
158 return 0;
159 }
160 else {
161 DBG_WARN(AQBANKING_LOGDOMAIN, "No valid account specs found");
162 AB_AccountSpec_List_free(accountSpecList);
163 GWEN_DB_Group_free(dbAll);
164 return GWEN_ERROR_NOT_FOUND;
165 }
166 }
167 }
168
169
170
AB_Banking_GetAccountSpecByUniqueId(const AB_BANKING * ab,uint32_t uniqueAccountId,AB_ACCOUNT_SPEC ** pAccountSpec)171 int AB_Banking_GetAccountSpecByUniqueId(const AB_BANKING *ab, uint32_t uniqueAccountId, AB_ACCOUNT_SPEC **pAccountSpec)
172 {
173 int rv;
174
175 rv=AB_Banking_ReadAccountSpec(ab, uniqueAccountId, pAccountSpec);
176 if (rv<0) {
177 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
178 return rv;
179 }
180
181 return rv;
182 }
183
184
185
_logAccountSpec(const AB_ACCOUNT_SPEC * a,const char * logMessage)186 void _logAccountSpec(const AB_ACCOUNT_SPEC *a, const char *logMessage)
187 {
188 const char *sBankCode;
189 const char *sAccountNumber;
190 const char *sIban;
191 const char *sBic;
192
193 sBankCode=_nonEmptyString(AB_AccountSpec_GetBankCode(a), "<empty>");
194 sAccountNumber=_nonEmptyString(AB_AccountSpec_GetAccountNumber(a), "<empty>");
195 sIban=_nonEmptyString(AB_AccountSpec_GetIban(a), "<empty>");
196 sBic=_nonEmptyString(AB_AccountSpec_GetBic(a), "<empty>");
197
198 if (logMessage && *logMessage) {
199 DBG_INFO(AQBANKING_LOGDOMAIN, "%s (id=%u, bank code=%s, acc num=%s, bic=%s, iban=%s)",
200 logMessage,
201 AB_AccountSpec_GetUniqueId(a),
202 sBankCode, sAccountNumber, sBic, sIban);
203 }
204 else {
205 DBG_INFO(AQBANKING_LOGDOMAIN, "Account spec (id=%u, bank code=%s, acc num=%s, bic=%s, iban=%s)",
206 AB_AccountSpec_GetUniqueId(a),
207 sBankCode, sAccountNumber, sBic, sIban);
208 }
209 }
210
211
_nonEmptyString(const char * s,const char * altstring)212 const char *_nonEmptyString(const char *s, const char *altstring)
213 {
214 if (s && *s)
215 return s;
216 return altstring;
217 }
218
219
220
221
222
223
224
225
226
227