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 /* This file is included by banking.c */
12 
13 #include "aqbanking/backendsupport/swiftdescr.h"
14 
15 
16 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_CSV
17 # include "src/libs/plugins/imexporters/csv/csv.h"
18 #endif
19 
20 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_ERI2
21 # include "src/libs/plugins/imexporters/eri2/eri2.h"
22 #endif
23 
24 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_OFX
25 # include "src/libs/plugins/imexporters/ofx/ofx.h"
26 #endif
27 
28 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_OPENHBCI1
29 # include "src/libs/plugins/imexporters/openhbci1/openhbci1.h"
30 #endif
31 
32 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_SWIFT
33 # include "src/libs/plugins/imexporters/swift/swift.h"
34 #endif
35 
36 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_XMLDB
37 # include "src/libs/plugins/imexporters/xmldb/xmldb.h"
38 #endif
39 
40 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_YELLOWNET
41 # include "src/libs/plugins/imexporters/yellownet/yellownet.h"
42 #endif
43 
44 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_SEPA
45 # include "src/libs/plugins/imexporters/sepa/sepa.h"
46 #endif
47 
48 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_CTXFILE
49 # include "src/libs/plugins/imexporters/ctxfile/ctxfile.h"
50 #endif
51 
52 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_Q43
53 # include "src/libs/plugins/imexporters/q43/q43.h"
54 #endif
55 
56 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_CAMT
57 # include "src/libs/plugins/imexporters/camt/camt.h"
58 #endif
59 
60 
61 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_XML
62 # include "src/libs/plugins/imexporters/xml/xml.h"
63 #endif
64 
65 
66 
67 
AB_Banking__CreateImExporterPlugin(AB_BANKING * ab,const char * modname)68 AB_IMEXPORTER *AB_Banking__CreateImExporterPlugin(AB_BANKING *ab, const char *modname)
69 {
70   if (modname && *modname) {
71 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_CSV
72     if (strcasecmp(modname, "csv")==0)
73       return AB_ImExporterCSV_new(ab);
74 #endif
75 
76 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_ERI2
77     if (strcasecmp(modname, "eri2")==0)
78       return AB_ImExporterERI2_new(ab);
79 #endif
80 
81 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_OFX
82     if (strcasecmp(modname, "ofx")==0)
83       return AB_ImExporterOFX_new(ab);
84 #endif
85 
86 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_OPENHBCI1
87     if (strcasecmp(modname, "ofx")==0)
88       return AB_ImExporterOpenHBCI1_new(ab);
89 #endif
90 
91 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_SWIFT
92     if (strcasecmp(modname, "swift")==0)
93       return AB_ImExporterSWIFT_new(ab);
94 #endif
95 
96 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_XMLDB
97     if (strcasecmp(modname, "xmldb")==0)
98       return AB_ImExporterXMLDB_new(ab);
99 #endif
100 
101 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_YELLOWNET
102     if (strcasecmp(modname, "yellownet")==0)
103       return AB_ImExporterYellowNet_new(ab);
104 #endif
105 
106 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_SEPA
107     if (strcasecmp(modname, "sepa")==0)
108       return AB_ImExporterSEPA_new(ab);
109 #endif
110 
111 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_CTXFILE
112     if (strcasecmp(modname, "ctxfile")==0)
113       return AB_ImExporterCtxFile_new(ab);
114 #endif
115 
116 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_Q43
117     if (strcasecmp(modname, "q43")==0)
118       return AB_ImExporterQ43_new(ab);
119 #endif
120 
121 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_CAMT
122     if (strcasecmp(modname, "camt")==0)
123       return AB_ImExporterCAMT_new(ab);
124 #endif
125 
126 #ifdef AQBANKING_WITH_PLUGIN_IMEXPORTER_XML
127     if (strcasecmp(modname, "xml")==0)
128       return AB_ImExporterXML_new(ab);
129 #endif
130 
131     DBG_ERROR(AQBANKING_LOGDOMAIN, "Plugin [%s] not compiled-in", modname);
132   }
133 
134   return NULL;
135 }
136 
137 
138 
AB_Banking_FindImExporter(AB_BANKING * ab,const char * name)139 AB_IMEXPORTER *AB_Banking_FindImExporter(AB_BANKING *ab, const char *name)
140 {
141   AB_IMEXPORTER *ie;
142 
143   assert(ab);
144   assert(name);
145   ie=AB_ImExporter_List_First(ab_imexporters);
146   while (ie) {
147     if (strcasecmp(AB_ImExporter_GetName(ie), name)==0)
148       break;
149     ie=AB_ImExporter_List_Next(ie);
150   } /* while */
151 
152   return ie;
153 }
154 
155 
156 
AB_Banking_GetImExporter(AB_BANKING * ab,const char * name)157 AB_IMEXPORTER *AB_Banking_GetImExporter(AB_BANKING *ab, const char *name)
158 {
159   AB_IMEXPORTER *ie;
160 
161   assert(ab);
162   assert(name);
163 
164   ie=AB_Banking_FindImExporter(ab, name);
165   if (ie)
166     return ie;
167   ie=AB_Banking__CreateImExporterPlugin(ab, name);
168   if (ie)
169     AB_ImExporter_List_Add(ie, ab_imexporters);
170 
171   return ie;
172 }
173 
174 
175 
AB_Banking_FillGapsInTransaction(AB_BANKING * ab,AB_ACCOUNT * a,AB_TRANSACTION * t)176 void AB_Banking_FillGapsInTransaction(AB_BANKING *ab, AB_ACCOUNT *a, AB_TRANSACTION *t)
177 {
178   assert(t);
179 
180   if (a) {
181     const char *s;
182 
183     /* local account */
184     s=AB_Account_GetCountry(a);
185     if (!s || !*s)
186       s="de";
187     AB_Transaction_SetLocalCountry(t, s);
188     AB_Transaction_SetRemoteCountry(t, s);
189 
190     s=AB_Account_GetBankCode(a);
191     if (s && *s)
192       AB_Transaction_SetLocalBankCode(t, s);
193 
194     s=AB_Account_GetAccountNumber(a);
195     if (s && *s)
196       AB_Transaction_SetLocalAccountNumber(t, s);
197 
198     s=AB_Account_GetOwnerName(a);
199     if (s && *s)
200       AB_Transaction_SetLocalName(t, s);
201 
202     s=AB_Account_GetBic(a);
203     if (s && *s)
204       AB_Transaction_SetLocalBic(t, s);
205 
206     s=AB_Account_GetIban(a);
207     if (s && *s)
208       AB_Transaction_SetLocalIban(t, s);
209   }
210 }
211 
212 
213 
AB_Banking_GetEditImExporterProfileDialog(AB_BANKING * ab,const char * imExporterName,GWEN_DB_NODE * dbProfile,const char * testFileName,GWEN_DIALOG ** pDlg)214 int AB_Banking_GetEditImExporterProfileDialog(AB_BANKING *ab,
215                                               const char *imExporterName,
216                                               GWEN_DB_NODE *dbProfile,
217                                               const char *testFileName,
218                                               GWEN_DIALOG **pDlg)
219 {
220   AB_IMEXPORTER *ie;
221   int rv;
222 
223   ie=AB_Banking_GetImExporter(ab, imExporterName);
224   if (ie==NULL) {
225     DBG_INFO(AQBANKING_LOGDOMAIN, "here");
226     return GWEN_ERROR_NO_DATA;
227   }
228 
229   if (AB_ImExporter_GetFlags(ie) & AB_IMEXPORTER_FLAGS_GETPROFILEEDITOR_SUPPORTED) {
230     GWEN_DIALOG *dlg=NULL;
231 
232     rv=AB_ImExporter_GetEditProfileDialog(ie, dbProfile, testFileName, &dlg);
233     if (rv<0) {
234       DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
235       return rv;
236     }
237 
238     *pDlg=dlg;
239     return 0;
240   }
241   else {
242     DBG_ERROR(AQBANKING_LOGDOMAIN, "EditProfileDialog not supported by imExporter \"%s\"", imExporterName);
243     return GWEN_ERROR_NOT_SUPPORTED;
244   }
245 }
246 
247 
248 
AB_Banking_Import(AB_BANKING * ab,const char * importerName,AB_IMEXPORTER_CONTEXT * ctx,GWEN_SYNCIO * sio,GWEN_DB_NODE * dbProfile)249 int AB_Banking_Import(AB_BANKING *ab,
250                       const char *importerName,
251                       AB_IMEXPORTER_CONTEXT *ctx,
252                       GWEN_SYNCIO *sio,
253                       GWEN_DB_NODE *dbProfile)
254 {
255   AB_IMEXPORTER *ie;
256   int rv;
257 
258   ie=AB_Banking_GetImExporter(ab, importerName);
259   if (ie==NULL) {
260     DBG_INFO(AQBANKING_LOGDOMAIN, "here");
261     return GWEN_ERROR_NO_DATA;
262   }
263 
264   rv=AB_ImExporter_Import(ie, ctx, sio, dbProfile);
265   if (rv<0) {
266     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
267     return rv;
268   }
269 
270   return 0;
271 }
272 
273 
274 
AB_Banking_Export(AB_BANKING * ab,const char * exporterName,AB_IMEXPORTER_CONTEXT * ctx,GWEN_SYNCIO * sio,GWEN_DB_NODE * dbProfile)275 int AB_Banking_Export(AB_BANKING *ab,
276                       const char *exporterName,
277                       AB_IMEXPORTER_CONTEXT *ctx,
278                       GWEN_SYNCIO *sio,
279                       GWEN_DB_NODE *dbProfile)
280 {
281   AB_IMEXPORTER *ie;
282   int rv;
283 
284   ie=AB_Banking_GetImExporter(ab, exporterName);
285   if (ie==NULL) {
286     DBG_INFO(AQBANKING_LOGDOMAIN, "here");
287     return GWEN_ERROR_NO_DATA;
288   }
289 
290   rv=AB_ImExporter_Export(ie, ctx, sio, dbProfile);
291   if (rv<0) {
292     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
293     return rv;
294   }
295 
296   return 0;
297 }
298 
299 
300 
AB_Banking_ImportLoadProfile(AB_BANKING * ab,const char * importerName,AB_IMEXPORTER_CONTEXT * ctx,GWEN_SYNCIO * sio,const char * profileName,const char * profileFile)301 int AB_Banking_ImportLoadProfile(AB_BANKING *ab,
302                                  const char *importerName,
303                                  AB_IMEXPORTER_CONTEXT *ctx,
304                                  GWEN_SYNCIO *sio,
305                                  const char *profileName,
306                                  const char *profileFile)
307 {
308   GWEN_DB_NODE *dbProfile;
309   int rv;
310 
311   if (profileName && *profileName)
312     dbProfile=AB_Banking_GetImExporterProfile(ab, importerName, profileName);
313   else
314     dbProfile=GWEN_DB_Group_new("profile");
315   if (dbProfile==NULL) {
316     DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] not found",
317               profileName?profileName:"(null)");
318     return GWEN_ERROR_NO_DATA;
319   }
320 
321   rv=AB_Banking_Import(ab, importerName, ctx, sio, dbProfile);
322   if (rv<0) {
323     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
324     GWEN_DB_Group_free(dbProfile);
325     return rv;
326   }
327   GWEN_DB_Group_free(dbProfile);
328 
329   return 0;
330 }
331 
332 
333 
AB_Banking_ExportLoadProfile(AB_BANKING * ab,const char * exporterName,AB_IMEXPORTER_CONTEXT * ctx,GWEN_SYNCIO * sio,const char * profileName,const char * profileFile)334 int AB_Banking_ExportLoadProfile(AB_BANKING *ab,
335                                  const char *exporterName,
336                                  AB_IMEXPORTER_CONTEXT *ctx,
337                                  GWEN_SYNCIO *sio,
338                                  const char *profileName,
339                                  const char *profileFile)
340 {
341   GWEN_DB_NODE *dbProfile;
342   int rv;
343 
344   if (profileName && *profileName)
345     dbProfile=AB_Banking_GetImExporterProfile(ab, exporterName, profileName);
346   else
347     dbProfile=GWEN_DB_Group_new("profile");
348   if (dbProfile==NULL) {
349     DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] not found",
350               profileName?profileName:"(null)");
351     return GWEN_ERROR_NO_DATA;
352   }
353 
354   rv=AB_Banking_Export(ab, exporterName, ctx, sio, dbProfile);
355   if (rv<0) {
356     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
357     GWEN_DB_Group_free(dbProfile);
358     return rv;
359   }
360   GWEN_DB_Group_free(dbProfile);
361 
362   return 0;
363 }
364 
365 
366 
367 
AB_Banking_ImportFromFile(AB_BANKING * ab,const char * importerName,AB_IMEXPORTER_CONTEXT * ctx,const char * inputFileName,GWEN_DB_NODE * dbProfile)368 int AB_Banking_ImportFromFile(AB_BANKING *ab,
369                               const char *importerName,
370                               AB_IMEXPORTER_CONTEXT *ctx,
371                               const char *inputFileName,
372                               GWEN_DB_NODE *dbProfile)
373 {
374   GWEN_SYNCIO *sio;
375   int rv;
376 
377   if (inputFileName) {
378     sio=GWEN_SyncIo_File_new(inputFileName, GWEN_SyncIo_File_CreationMode_OpenExisting);
379     GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ);
380     rv=GWEN_SyncIo_Connect(sio);
381     if (rv<0) {
382       DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
383       GWEN_SyncIo_free(sio);
384       return rv;
385     }
386   }
387   else {
388     sio=GWEN_SyncIo_File_fromStdin();
389     GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE);
390   }
391 
392   rv=AB_Banking_Import(ab, importerName, ctx, sio, dbProfile);
393   if (rv<0) {
394     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
395     GWEN_SyncIo_Disconnect(sio);
396     GWEN_SyncIo_free(sio);
397     return rv;
398   }
399 
400   GWEN_SyncIo_Disconnect(sio);
401   GWEN_SyncIo_free(sio);
402 
403   return 0;
404 }
405 
406 
407 
AB_Banking_ExportToFile(AB_BANKING * ab,const char * exporterName,AB_IMEXPORTER_CONTEXT * ctx,const char * outputFileName,GWEN_DB_NODE * dbProfile)408 int AB_Banking_ExportToFile(AB_BANKING *ab,
409                             const char *exporterName,
410                             AB_IMEXPORTER_CONTEXT *ctx,
411                             const char *outputFileName,
412                             GWEN_DB_NODE *dbProfile)
413 {
414   GWEN_SYNCIO *sio;
415   int rv;
416 
417   if (outputFileName) {
418     sio=GWEN_SyncIo_File_new(outputFileName, GWEN_SyncIo_File_CreationMode_CreateAlways);
419     GWEN_SyncIo_AddFlags(sio,
420                          GWEN_SYNCIO_FILE_FLAGS_READ |
421                          GWEN_SYNCIO_FILE_FLAGS_WRITE |
422                          GWEN_SYNCIO_FILE_FLAGS_UREAD |
423                          GWEN_SYNCIO_FILE_FLAGS_UWRITE |
424                          GWEN_SYNCIO_FILE_FLAGS_GREAD |
425                          GWEN_SYNCIO_FILE_FLAGS_GWRITE);
426     rv=GWEN_SyncIo_Connect(sio);
427     if (rv<0) {
428       DBG_WARN(AQBANKING_LOGDOMAIN, "Failed to Connect() syncio (%d)", rv);
429       GWEN_SyncIo_free(sio);
430       return rv;
431     }
432   }
433   else {
434     sio=GWEN_SyncIo_File_fromStdout();
435     GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE);
436   }
437 
438   rv=AB_Banking_Export(ab, exporterName, ctx, sio, dbProfile);
439   if (rv<0) {
440     DBG_WARN(AQBANKING_LOGDOMAIN, "Failed to export (%d)", rv);
441     GWEN_SyncIo_Disconnect(sio);
442     GWEN_SyncIo_free(sio);
443     return rv;
444   }
445 
446   rv=GWEN_SyncIo_Disconnect(sio);
447   if (rv<0) {
448     DBG_WARN(AQBANKING_LOGDOMAIN, "Failed to Disconnect() syncio (%d)", rv);
449     GWEN_SyncIo_free(sio);
450     return rv;
451   }
452   GWEN_SyncIo_free(sio);
453 
454   return 0;
455 }
456 
457 
458 
AB_Banking_ImportFromFileLoadProfile(AB_BANKING * ab,const char * importerName,AB_IMEXPORTER_CONTEXT * ctx,const char * profileName,const char * profileFile,const char * inputFileName)459 int AB_Banking_ImportFromFileLoadProfile(AB_BANKING *ab,
460                                          const char *importerName,
461                                          AB_IMEXPORTER_CONTEXT *ctx,
462                                          const char *profileName,
463                                          const char *profileFile,
464                                          const char *inputFileName)
465 {
466   GWEN_DB_NODE *dbProfile;
467   int rv;
468 
469   if (profileName && *profileName)
470     dbProfile=AB_Banking_GetImExporterProfile(ab, importerName, profileName);
471   else
472     dbProfile=GWEN_DB_Group_new("profile");
473   if (dbProfile==NULL) {
474     DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] not found",
475               profileName?profileName:"(null)");
476     return GWEN_ERROR_NO_DATA;
477   }
478 
479   rv=AB_Banking_ImportFromFile(ab, importerName, ctx, inputFileName, dbProfile);
480   if (rv<0) {
481     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
482     GWEN_DB_Group_free(dbProfile);
483     return rv;
484   }
485   GWEN_DB_Group_free(dbProfile);
486 
487   return 0;
488 }
489 
490 
491 
AB_Banking_ExportToFileLoadProfile(AB_BANKING * ab,const char * exporterName,AB_IMEXPORTER_CONTEXT * ctx,const char * outputFileName,const char * profileName,const char * profileFile)492 int AB_Banking_ExportToFileLoadProfile(AB_BANKING *ab,
493                                        const char *exporterName,
494                                        AB_IMEXPORTER_CONTEXT *ctx,
495                                        const char *outputFileName,
496                                        const char *profileName,
497                                        const char *profileFile)
498 {
499   GWEN_DB_NODE *dbProfile;
500   int rv;
501 
502   if (profileName && *profileName)
503     dbProfile=AB_Banking_GetImExporterProfile(ab, exporterName, profileName);
504   else
505     dbProfile=GWEN_DB_Group_new("profile");
506   if (dbProfile==NULL) {
507     DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] not found",
508               profileName?profileName:"(null)");
509     return GWEN_ERROR_NO_DATA;
510   }
511 
512   rv=AB_Banking_ExportToFile(ab, exporterName, ctx, outputFileName, dbProfile);
513   if (rv<0) {
514     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
515     GWEN_DB_Group_free(dbProfile);
516     return rv;
517   }
518   GWEN_DB_Group_free(dbProfile);
519 
520   return 0;
521 }
522 
523 
524 
AB_Banking_ImportFromBuffer(AB_BANKING * ab,const char * importerName,AB_IMEXPORTER_CONTEXT * ctx,const uint8_t * dataPtr,uint32_t dataLen,GWEN_DB_NODE * dbProfile)525 int AB_Banking_ImportFromBuffer(AB_BANKING *ab,
526                                 const char *importerName,
527                                 AB_IMEXPORTER_CONTEXT *ctx,
528                                 const uint8_t *dataPtr,
529                                 uint32_t dataLen,
530                                 GWEN_DB_NODE *dbProfile)
531 {
532   GWEN_BUFFER *buf;
533   GWEN_SYNCIO *sio;
534   int rv;
535 
536   buf=GWEN_Buffer_new((char *) dataPtr, dataLen, dataLen, 0);
537   GWEN_Buffer_SetMode(buf, GWEN_BUFFER_MODE_READONLY);
538 
539   sio=GWEN_SyncIo_Memory_new(buf, 0);
540 
541   rv=AB_Banking_Import(ab, importerName, ctx, sio, dbProfile);
542   if (rv<0) {
543     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
544     GWEN_SyncIo_free(sio);
545     GWEN_Buffer_free(buf);
546     return rv;
547   }
548 
549   GWEN_SyncIo_free(sio);
550   GWEN_Buffer_free(buf);
551 
552   return 0;
553 }
554 
555 
556 
AB_Banking_ExportToBuffer(AB_BANKING * ab,const char * exporterName,AB_IMEXPORTER_CONTEXT * ctx,GWEN_BUFFER * outputBuffer,GWEN_DB_NODE * dbProfile)557 int AB_Banking_ExportToBuffer(AB_BANKING *ab,
558                               const char *exporterName,
559                               AB_IMEXPORTER_CONTEXT *ctx,
560                               GWEN_BUFFER *outputBuffer,
561                               GWEN_DB_NODE *dbProfile)
562 {
563   int rv;
564   GWEN_SYNCIO *sio;
565 
566   sio=GWEN_SyncIo_Memory_new(outputBuffer, 0);
567   rv=AB_Banking_Export(ab, exporterName, ctx, sio, dbProfile);
568   if (rv<0) {
569     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
570     GWEN_SyncIo_free(sio);
571     return rv;
572   }
573   GWEN_SyncIo_free(sio);
574 
575   return 0;
576 }
577 
578 
579 
AB_Banking_ImportFromBufferLoadProfile(AB_BANKING * ab,const char * importerName,AB_IMEXPORTER_CONTEXT * ctx,const char * profileName,const char * profileFile,const uint8_t * dataPtr,uint32_t dataLen)580 int AB_Banking_ImportFromBufferLoadProfile(AB_BANKING *ab,
581                                            const char *importerName,
582                                            AB_IMEXPORTER_CONTEXT *ctx,
583                                            const char *profileName,
584                                            const char *profileFile,
585                                            const uint8_t *dataPtr,
586                                            uint32_t dataLen)
587 {
588   GWEN_DB_NODE *dbProfile;
589   int rv;
590 
591   if (profileName && *profileName)
592     dbProfile=AB_Banking_GetImExporterProfile(ab, importerName, profileName);
593   else
594     dbProfile=GWEN_DB_Group_new("profile");
595   if (dbProfile==NULL) {
596     DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] not found",
597               profileName?profileName:"(null)");
598     return GWEN_ERROR_NO_DATA;
599   }
600 
601   rv=AB_Banking_ImportFromBuffer(ab, importerName, ctx, dataPtr, dataLen, dbProfile);
602   if (rv<0) {
603     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
604     GWEN_DB_Group_free(dbProfile);
605     return rv;
606   }
607   GWEN_DB_Group_free(dbProfile);
608 
609   return 0;
610 }
611 
612 
613 
AB_Banking_ExportToBufferLoadProfile(AB_BANKING * ab,const char * exporterName,AB_IMEXPORTER_CONTEXT * ctx,GWEN_BUFFER * outputBuffer,const char * profileName,const char * profileFile)614 int AB_Banking_ExportToBufferLoadProfile(AB_BANKING *ab,
615                                          const char *exporterName,
616                                          AB_IMEXPORTER_CONTEXT *ctx,
617                                          GWEN_BUFFER *outputBuffer,
618                                          const char *profileName,
619                                          const char *profileFile)
620 {
621   GWEN_DB_NODE *dbProfile;
622   int rv;
623 
624   if (profileName && *profileName)
625     dbProfile=AB_Banking_GetImExporterProfile(ab, exporterName, profileName);
626   else
627     dbProfile=GWEN_DB_Group_new("profile");
628   if (dbProfile==NULL) {
629     DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] not found",
630               profileName?profileName:"(null)");
631     return GWEN_ERROR_NO_DATA;
632   }
633 
634   rv=AB_Banking_ExportToBuffer(ab, exporterName, ctx, outputBuffer, dbProfile);
635   if (rv<0) {
636     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
637     GWEN_DB_Group_free(dbProfile);
638     return rv;
639   }
640   GWEN_DB_Group_free(dbProfile);
641 
642   return 0;
643 }
644 
645 
646 
AB_Banking_GetImExporterDescrs(AB_BANKING * ab)647 GWEN_PLUGIN_DESCRIPTION_LIST2 *AB_Banking_GetImExporterDescrs(AB_BANKING *ab)
648 {
649   assert(ab);
650   if (ab_pluginManagerImExporter) {
651     GWEN_PLUGIN_DESCRIPTION_LIST2 *l;
652 
653     l=GWEN_PluginManager_GetPluginDescrs(ab_pluginManagerImExporter);
654     return l;
655   }
656   else {
657     DBG_ERROR(AQBANKING_LOGDOMAIN, "No plugin manager for imexporters");
658     return NULL;
659   }
660 }
661 
662 
663 
AB_Banking__ReadImExporterProfiles(AB_BANKING * ab,const char * path,GWEN_DB_NODE * db,int isGlobal)664 int AB_Banking__ReadImExporterProfiles(AB_BANKING *ab,
665                                        const char *path,
666                                        GWEN_DB_NODE *db,
667                                        int isGlobal)
668 {
669   GWEN_DIRECTORY *d;
670   GWEN_BUFFER *nbuf;
671   char nbuffer[64];
672   unsigned int pathLen;
673 
674   if (!path)
675     path="";
676 
677   /* create path */
678   nbuf=GWEN_Buffer_new(0, 256, 0, 1);
679   GWEN_Buffer_AppendString(nbuf, path);
680   pathLen=GWEN_Buffer_GetUsedBytes(nbuf);
681 
682   d=GWEN_Directory_new();
683   if (GWEN_Directory_Open(d, GWEN_Buffer_GetStart(nbuf))) {
684     DBG_INFO(AQBANKING_LOGDOMAIN,
685              "Path \"%s\" is not available",
686              GWEN_Buffer_GetStart(nbuf));
687     GWEN_Buffer_free(nbuf);
688     GWEN_Directory_free(d);
689     return GWEN_ERROR_NOT_FOUND;
690   }
691 
692   while (!GWEN_Directory_Read(d,
693                               nbuffer,
694                               sizeof(nbuffer))) {
695     if (strcmp(nbuffer, ".") &&
696         strcmp(nbuffer, "..")) {
697       int nlen;
698 
699       nlen=strlen(nbuffer);
700       if (nlen>4) {
701         if (strcasecmp(nbuffer+nlen-5, ".conf")==0) {
702           struct stat st;
703 
704           GWEN_Buffer_Crop(nbuf, 0, pathLen);
705           GWEN_Buffer_SetPos(nbuf, pathLen);
706           GWEN_Buffer_AppendString(nbuf, DIRSEP);
707           GWEN_Buffer_AppendString(nbuf, nbuffer);
708 
709           if (stat(GWEN_Buffer_GetStart(nbuf), &st)) {
710             DBG_ERROR(AQBANKING_LOGDOMAIN, "stat(%s): %s",
711                       GWEN_Buffer_GetStart(nbuf),
712                       strerror(errno));
713           }
714           else {
715             if (!S_ISDIR(st.st_mode)) {
716               GWEN_DB_NODE *dbT;
717 
718               dbT=GWEN_DB_Group_new("profile");
719               if (GWEN_DB_ReadFile(dbT,
720                                    GWEN_Buffer_GetStart(nbuf),
721                                    GWEN_DB_FLAGS_DEFAULT |
722                                    GWEN_PATH_FLAGS_CREATE_GROUP)) {
723                 DBG_ERROR(AQBANKING_LOGDOMAIN,
724                           "Could not read file \"%s\"",
725                           GWEN_Buffer_GetStart(nbuf));
726               }
727               else {
728                 const char *s;
729 
730                 s=GWEN_DB_GetCharValue(dbT, "name", 0, 0);
731                 if (!s) {
732                   DBG_ERROR(AQBANKING_LOGDOMAIN,
733                             "Bad file \"%s\" (no name)",
734                             GWEN_Buffer_GetStart(nbuf));
735                 }
736                 else {
737                   GWEN_DB_NODE *dbTarget;
738                   DBG_INFO(AQBANKING_LOGDOMAIN,
739                            "File \"%s\" contains profile \"%s\"",
740                            GWEN_Buffer_GetStart(nbuf), s);
741 
742                   dbTarget=GWEN_DB_GetGroup(db,
743                                             GWEN_DB_FLAGS_OVERWRITE_GROUPS,
744                                             s);
745                   assert(dbTarget);
746                   GWEN_DB_AddGroupChildren(dbTarget, dbT);
747                   GWEN_DB_SetIntValue(dbTarget, GWEN_DB_FLAGS_OVERWRITE_VARS, "isGlobal", isGlobal);
748                   GWEN_DB_SetCharValue(dbTarget, GWEN_DB_FLAGS_OVERWRITE_VARS, "fileName", nbuffer);
749                 } /* if name */
750               } /* if file successfully read */
751               GWEN_DB_Group_free(dbT);
752             } /* if !dir */
753           } /* if stat was ok */
754         } /* if conf */
755       } /* if name has more than 4 chars */
756     } /* if not "." and not ".." */
757   } /* while */
758   GWEN_Directory_Close(d);
759   GWEN_Directory_free(d);
760   GWEN_Buffer_free(nbuf);
761 
762   return 0;
763 }
764 
765 
766 
AB_Banking_GetImExporterProfiles(AB_BANKING * ab,const char * name)767 GWEN_DB_NODE *AB_Banking_GetImExporterProfiles(AB_BANKING *ab,
768                                                const char *name)
769 {
770   GWEN_BUFFER *buf;
771   GWEN_DB_NODE *db;
772   int rv;
773   GWEN_STRINGLIST *sl;
774   GWEN_STRINGLISTENTRY *sentry;
775 
776   buf=GWEN_Buffer_new(0, 256, 0, 1);
777   db=GWEN_DB_Group_new("profiles");
778 
779   sl=AB_Banking_GetGlobalDataDirs();
780   assert(sl);
781 
782   sentry=GWEN_StringList_FirstEntry(sl);
783   assert(sentry);
784 
785   while (sentry) {
786     const char *pkgdatadir;
787 
788     pkgdatadir = GWEN_StringListEntry_Data(sentry);
789     assert(pkgdatadir);
790 
791     /* read global profiles */
792     GWEN_Buffer_AppendString(buf, pkgdatadir);
793     GWEN_Buffer_AppendString(buf,
794                              DIRSEP
795                              "aqbanking"
796                              DIRSEP
797                              AB_IMEXPORTER_FOLDER
798                              DIRSEP);
799     if (GWEN_Text_EscapeToBufferTolerant(name, buf)) {
800       DBG_ERROR(AQBANKING_LOGDOMAIN,
801                 "Bad name for importer/exporter");
802       GWEN_StringList_free(sl);
803       GWEN_DB_Group_free(db);
804       GWEN_Buffer_free(buf);
805       return 0;
806     }
807     GWEN_Buffer_AppendString(buf, DIRSEP "profiles");
808     rv=AB_Banking__ReadImExporterProfiles(ab,
809                                           GWEN_Buffer_GetStart(buf),
810                                           db,
811                                           1);
812     if (rv && rv!=GWEN_ERROR_NOT_FOUND) {
813       DBG_ERROR(AQBANKING_LOGDOMAIN,
814                 "Error reading global profiles");
815       GWEN_StringList_free(sl);
816       GWEN_DB_Group_free(db);
817       GWEN_Buffer_free(buf);
818       return 0;
819     }
820     GWEN_Buffer_Reset(buf);
821     sentry=GWEN_StringListEntry_Next(sentry);
822   }
823   GWEN_StringList_free(sl);
824 
825   /* read local user profiles */
826   if (AB_Banking_GetUserDataDir(ab, buf)) {
827     DBG_ERROR(AQBANKING_LOGDOMAIN,
828               "Could not get user data dir");
829     GWEN_DB_Group_free(db);
830     GWEN_Buffer_free(buf);
831     return 0;
832   }
833   GWEN_Buffer_AppendString(buf, DIRSEP AB_IMEXPORTER_FOLDER DIRSEP);
834   if (GWEN_Text_EscapeToBufferTolerant(name, buf)) {
835     DBG_ERROR(AQBANKING_LOGDOMAIN,
836               "Bad name for importer/exporter");
837     GWEN_DB_Group_free(db);
838     GWEN_Buffer_free(buf);
839     return 0;
840   }
841   GWEN_Buffer_AppendString(buf, DIRSEP "profiles");
842 
843   rv=AB_Banking__ReadImExporterProfiles(ab,
844                                         GWEN_Buffer_GetStart(buf),
845                                         db,
846                                         0);
847   if (rv && rv!=GWEN_ERROR_NOT_FOUND) {
848     DBG_ERROR(AQBANKING_LOGDOMAIN,
849               "Error reading users profiles");
850     GWEN_DB_Group_free(db);
851     GWEN_Buffer_free(buf);
852     return 0;
853   }
854   GWEN_Buffer_free(buf);
855 
856   return db;
857 }
858 
859 
860 
AB_Banking_SaveLocalImExporterProfile(AB_BANKING * ab,const char * imexporterName,GWEN_DB_NODE * dbProfile,const char * fname)861 int AB_Banking_SaveLocalImExporterProfile(AB_BANKING *ab,
862                                           const char *imexporterName,
863                                           GWEN_DB_NODE *dbProfile,
864                                           const char *fname)
865 {
866   GWEN_BUFFER *buf;
867   int rv;
868 
869   buf=GWEN_Buffer_new(0, 256, 0, 1);
870 
871   /* get folder for local user profiles */
872   rv=AB_Banking_GetUserDataDir(ab, buf);
873   if (rv<0) {
874     DBG_ERROR(AQBANKING_LOGDOMAIN,
875               "Could not get user data dir");
876     GWEN_Buffer_free(buf);
877     return rv;
878   }
879   GWEN_Buffer_AppendString(buf, DIRSEP AB_IMEXPORTER_FOLDER DIRSEP);
880   rv=GWEN_Text_EscapeToBufferTolerant(imexporterName, buf);
881   if (rv<0) {
882     DBG_ERROR(AQBANKING_LOGDOMAIN,
883               "Bad name for importer/exporter (%d)", rv);
884     GWEN_Buffer_free(buf);
885     return rv;
886   }
887   GWEN_Buffer_AppendString(buf, DIRSEP "profiles");
888 
889   /* make sure the path exists */
890   rv=GWEN_Directory_GetPath(GWEN_Buffer_GetStart(buf), GWEN_PATH_FLAGS_CHECKROOT);
891   if (rv<0) {
892     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
893     GWEN_Buffer_free(buf);
894     return rv;
895   }
896 
897   GWEN_Buffer_AppendString(buf, DIRSEP);
898   if (fname && *fname)
899     GWEN_Buffer_AppendString(buf, fname);
900   else {
901     const char *s;
902 
903     s=GWEN_DB_GetCharValue(dbProfile, "name", 0, NULL);
904     if (s && *s) {
905       FILE *f;
906 
907       rv=GWEN_Text_EscapeToBufferTolerant(s, buf);
908       if (rv<0) {
909         DBG_ERROR(AQBANKING_LOGDOMAIN,
910                   "Bad profile name (%d)", rv);
911         GWEN_Buffer_free(buf);
912         return rv;
913       }
914       GWEN_Buffer_AppendString(buf, ".conf");
915 
916       f=fopen(GWEN_Buffer_GetStart(buf), "r");
917       if (f) {
918         DBG_ERROR(AQBANKING_LOGDOMAIN, "There already is a profile of that name");
919         GWEN_Buffer_free(buf);
920         fclose(f);
921         return GWEN_ERROR_INVALID;
922       }
923     }
924     else {
925       DBG_ERROR(AQBANKING_LOGDOMAIN,
926                 "Missing profile name");
927       GWEN_Buffer_free(buf);
928       return GWEN_ERROR_INVALID;
929     }
930   }
931 
932   rv=GWEN_DB_WriteFile(dbProfile,
933                        GWEN_Buffer_GetStart(buf),
934                        GWEN_DB_FLAGS_DEFAULT);
935   if (rv<0) {
936     DBG_ERROR(AQBANKING_LOGDOMAIN,
937               "Error writing users profile (%d)", rv);
938     GWEN_Buffer_free(buf);
939     return 0;
940   }
941   GWEN_Buffer_free(buf);
942 
943   return 0;
944 }
945 
946 
947 
AB_Banking_FindDataFileForImExporter(AB_BANKING * ab,const char * imExpName,const char * fileName,GWEN_BUFFER * fullPathBuffer)948 int AB_Banking_FindDataFileForImExporter(AB_BANKING *ab, const char *imExpName, const char *fileName,
949                                          GWEN_BUFFER *fullPathBuffer)
950 {
951   GWEN_BUFFER *buf;
952   int rv;
953   GWEN_STRINGLIST *sl;
954 
955   buf=GWEN_Buffer_new(0, 256, 0, 1);
956   GWEN_Buffer_AppendString(buf,
957                            DIRSEP
958                            "aqbanking"
959                            DIRSEP
960                            AB_IMEXPORTER_FOLDER
961                            DIRSEP);
962   GWEN_Buffer_AppendString(buf, imExpName);
963   GWEN_Buffer_AppendString(buf, DIRSEP "data" DIRSEP);
964   GWEN_Buffer_AppendString(buf, fileName);
965 
966 
967   sl=AB_Banking_GetGlobalDataDirs();
968   assert(sl);
969 
970   rv=GWEN_Directory_FindFileInPaths(sl, GWEN_Buffer_GetStart(buf), fullPathBuffer);
971   if (rv==0) {
972     GWEN_Buffer_free(buf);
973     return rv;
974   }
975   GWEN_Buffer_Reset(buf);
976 
977   /* try local storage */
978   if (AB_Banking_GetUserDataDir(ab, buf)) {
979     DBG_ERROR(AQBANKING_LOGDOMAIN,
980               "Could not get user data dir");
981     GWEN_Buffer_free(buf);
982     return GWEN_ERROR_NOT_FOUND;
983   }
984   GWEN_Buffer_AppendString(buf, DIRSEP AB_IMEXPORTER_FOLDER DIRSEP);
985   GWEN_Buffer_AppendString(buf, fileName);
986 
987   rv=GWEN_Directory_GetPath(GWEN_Buffer_GetStart(buf), GWEN_PATH_FLAGS_PATHMUSTEXIST);
988   if (rv==0) {
989     GWEN_Buffer_AppendString(fullPathBuffer, GWEN_Buffer_GetStart(buf));
990     GWEN_Buffer_free(buf);
991     return 0;
992   }
993 
994   GWEN_Buffer_free(buf);
995 
996   return GWEN_ERROR_NOT_FOUND;
997 }
998 
999 
1000 
AB_Banking_ListDataFilesForImExporter(AB_BANKING * ab,const char * imExpName,const char * fileMask)1001 GWEN_STRINGLIST *AB_Banking_ListDataFilesForImExporter(AB_BANKING *ab, const char *imExpName, const char *fileMask)
1002 {
1003   int rv;
1004   GWEN_BUFFER *pathBuffer;
1005   GWEN_STRINGLIST *slGlobalDataDirs;
1006   GWEN_STRINGLIST *slMatchingFiles;
1007   GWEN_STRINGLISTENTRY *seGlobalDataDir;
1008 
1009   slGlobalDataDirs=AB_Banking_GetGlobalDataDirs();
1010   assert(slGlobalDataDirs);
1011 
1012   slMatchingFiles=GWEN_StringList_new();
1013 
1014   pathBuffer=GWEN_Buffer_new(0, 256, 0, 1);
1015   seGlobalDataDir=GWEN_StringList_FirstEntry(slGlobalDataDirs);
1016   while (seGlobalDataDir) {
1017     GWEN_Buffer_AppendString(pathBuffer, GWEN_StringListEntry_Data(seGlobalDataDir));
1018     GWEN_Buffer_AppendString(pathBuffer,
1019                              DIRSEP
1020                              "aqbanking"
1021                              DIRSEP
1022                              AB_IMEXPORTER_FOLDER
1023                              DIRSEP);
1024     GWEN_Buffer_AppendString(pathBuffer, imExpName);
1025     GWEN_Buffer_AppendString(pathBuffer, DIRSEP "data");
1026 
1027     rv=GWEN_Directory_GetMatchingFilesRecursively(GWEN_Buffer_GetStart(pathBuffer), slMatchingFiles, fileMask);
1028     if (rv<0) {
1029       DBG_INFO(AQBANKING_LOGDOMAIN,
1030                "Error listing matching files in folder \"%s\", ignoring",
1031                GWEN_Buffer_GetStart(pathBuffer));
1032     }
1033     GWEN_Buffer_Reset(pathBuffer);
1034 
1035     seGlobalDataDir=GWEN_StringListEntry_Next(seGlobalDataDir);
1036   } /* while(seGlobalDataDir) */
1037   GWEN_Buffer_free(pathBuffer);
1038 
1039 
1040   if (GWEN_StringList_Count(slMatchingFiles)<1) {
1041     DBG_INFO(AQBANKING_LOGDOMAIN, "No matching data files");
1042     GWEN_StringList_free(slMatchingFiles);
1043     return NULL;
1044   }
1045 
1046   return slMatchingFiles;
1047 }
1048 
1049 
1050 
AB_Banking_GetImExporterProfile(AB_BANKING * ab,const char * imExporterName,const char * profileName)1051 GWEN_DB_NODE *AB_Banking_GetImExporterProfile(AB_BANKING *ab,
1052                                               const char *imExporterName,
1053                                               const char *profileName)
1054 {
1055   GWEN_DB_NODE *dbProfiles;
1056 
1057   dbProfiles=AB_Banking_GetImExporterProfiles(ab, imExporterName);
1058   if (dbProfiles) {
1059     GWEN_DB_NODE *dbProfile;
1060 
1061     dbProfile=GWEN_DB_GetFirstGroup(dbProfiles);
1062     while (dbProfile) {
1063       const char *name;
1064 
1065       name=GWEN_DB_GetCharValue(dbProfile, "name", 0, 0);
1066       assert(name);
1067       if (strcasecmp(name, profileName)==0)
1068         break;
1069       dbProfile=GWEN_DB_GetNextGroup(dbProfile);
1070     }
1071     if (!dbProfile) {
1072       DBG_ERROR(AQBANKING_LOGDOMAIN,
1073                 "Profile \"%s\" for exporter \"%s\" not found",
1074                 profileName, imExporterName);
1075       GWEN_DB_Group_free(dbProfiles);
1076       return NULL;
1077     }
1078 
1079     GWEN_DB_UnlinkGroup(dbProfile);
1080     GWEN_DB_Group_free(dbProfiles);
1081     return dbProfile;
1082   }
1083   else {
1084     DBG_ERROR(AQBANKING_LOGDOMAIN,
1085               "No profiles found for exporter \"%s\"",
1086               imExporterName);
1087     return NULL;
1088   }
1089 
1090   return NULL;
1091 }
1092 
1093 
1094 
AB_Banking_FindMatchingSwiftImExporterProfile(AB_BANKING * ab,const char * imExporterName,const char * family,int version1,int version2,int version3)1095 GWEN_DB_NODE *AB_Banking_FindMatchingSwiftImExporterProfile(AB_BANKING *ab,
1096                                                             const char *imExporterName,
1097                                                             const char *family,
1098                                                             int version1,
1099                                                             int version2,
1100                                                             int version3)
1101 {
1102   GWEN_DB_NODE *dbProfiles;
1103 
1104   dbProfiles=AB_Banking_GetImExporterProfiles(ab, imExporterName);
1105   if (dbProfiles) {
1106     GWEN_DB_NODE *dbProfile;
1107 
1108     dbProfile=GWEN_DB_GetFirstGroup(dbProfiles);
1109     while (dbProfile) {
1110       const char *name;
1111       AB_SWIFT_DESCR *swiftDescr;
1112 
1113       name=GWEN_DB_GetCharValue(dbProfile, "name", 0, 0);
1114       assert(name);
1115 
1116       swiftDescr=AB_SwiftDescr_FromString(name);
1117       if (swiftDescr) {
1118         if (AB_SwiftDescr_Matches(swiftDescr, family, version1, version2, version3)) {
1119           AB_SwiftDescr_free(swiftDescr);
1120           break;
1121         }
1122       }
1123       AB_SwiftDescr_free(swiftDescr);
1124 
1125       dbProfile=GWEN_DB_GetNextGroup(dbProfile);
1126     }
1127     if (!dbProfile) {
1128       DBG_ERROR(AQBANKING_LOGDOMAIN,
1129                 "Profile \"%s.%03d.%03d.%02d\" for exporter \"%s\" not found",
1130                 family, version1, version2, version3,
1131                 imExporterName);
1132       GWEN_DB_Group_free(dbProfiles);
1133       return NULL;
1134     }
1135 
1136     GWEN_DB_UnlinkGroup(dbProfile);
1137     GWEN_DB_Group_free(dbProfiles);
1138     return dbProfile;
1139   }
1140   else {
1141     DBG_ERROR(AQBANKING_LOGDOMAIN,
1142               "No profiles found for exporter \"%s\"",
1143               imExporterName);
1144     return NULL;
1145   }
1146 
1147   return NULL;
1148 }
1149 
1150 
1151 
AB_Banking_GetSwiftDescriptorsForImExporter(AB_BANKING * ab,const char * imExporterName)1152 AB_SWIFT_DESCR_LIST *AB_Banking_GetSwiftDescriptorsForImExporter(AB_BANKING *ab, const char *imExporterName)
1153 {
1154   GWEN_DB_NODE *dbProfiles;
1155 
1156   dbProfiles=AB_Banking_GetImExporterProfiles(ab, imExporterName);
1157   if (dbProfiles) {
1158     GWEN_DB_NODE *dbProfile;
1159     AB_SWIFT_DESCR_LIST *descrList;
1160 
1161     descrList=AB_SwiftDescr_List_new();
1162     dbProfile=GWEN_DB_GetFirstGroup(dbProfiles);
1163     while (dbProfile) {
1164       const char *name;
1165       AB_SWIFT_DESCR *descr;
1166 
1167       name=GWEN_DB_GetCharValue(dbProfile, "name", 0, 0);
1168       assert(name);
1169 
1170       descr=AB_SwiftDescr_FromString(name);
1171       if (descr) {
1172         DBG_ERROR(AQBANKING_LOGDOMAIN, "Adding matching profile [%s]", name);
1173         AB_SwiftDescr_SetAlias1(descr, name);
1174         AB_SwiftDescr_List_Add(descr, descrList);
1175       }
1176 
1177       dbProfile=GWEN_DB_GetNextGroup(dbProfile);
1178     }
1179 
1180     if (AB_SwiftDescr_List_GetCount(descrList)==0) {
1181       AB_SwiftDescr_List_free(descrList);
1182       return NULL;
1183     }
1184 
1185     return descrList;
1186   }
1187   else {
1188     DBG_ERROR(AQBANKING_LOGDOMAIN,
1189               "No profiles found for exporter \"%s\"",
1190               imExporterName);
1191     return NULL;
1192   }
1193 
1194   return NULL;
1195 }
1196 
1197 
1198 
1199 
1200