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