|
/***************************************************************************
|
|
$RCSfile$
|
|
-------------------
|
|
cvs : $Id$
|
|
begin : Mon Mar 01 2004
|
|
copyright : (C) 2004 by Martin Preuss
|
|
email : martin@libchipcard.de
|
|
|
|
***************************************************************************
|
|
* Please see toplevel file COPYING for license details *
|
|
***************************************************************************/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
#include "generic_p.h"
|
|
|
|
#include <aqbanking/banking_be.h>
|
|
#include <gwenhywfar/debug.h>
|
|
#include <gwenhywfar/text.h>
|
|
#include <gwenhywfar/waitcallback.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
|
|
#ifdef OS_WIN32
|
|
# define DIRSEP "\\"
|
|
#else
|
|
# define DIRSEP "/"
|
|
#endif
|
|
|
|
|
|
GWEN_INHERIT(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC)
|
|
|
|
|
|
|
|
AB_BANKINFO_PLUGIN *AB_BankInfoPluginGENERIC_new(AB_BANKING *ab,
|
|
GWEN_DB_NODE *db,
|
|
const char *country){
|
|
AB_BANKINFO_PLUGIN *bip;
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
|
|
assert(country);
|
|
bip=AB_BankInfoPlugin_new(country);
|
|
GWEN_NEW_OBJECT(AB_BANKINFO_PLUGIN_GENERIC, bde);
|
|
GWEN_INHERIT_SETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC,
|
|
bip, bde, AB_BankInfoPluginGENERIC_FreeData);
|
|
|
|
bde->banking=ab;
|
|
bde->dbData=db;
|
|
bde->country=strdup(country);
|
|
AB_BankInfoPlugin_SetGetBankInfoFn(bip, AB_BankInfoPluginGENERIC_GetBankInfo);
|
|
AB_BankInfoPlugin_SetGetBankInfoByTemplateFn(bip,
|
|
AB_BankInfoPluginGENERIC_SearchbyTemplate);
|
|
|
|
return bip;
|
|
}
|
|
|
|
|
|
|
|
void AB_BankInfoPluginGENERIC_FreeData(void *bp, void *p){
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
|
|
bde=(AB_BANKINFO_PLUGIN_GENERIC*)p;
|
|
free(bde->country);
|
|
GWEN_FREE_OBJECT(bde);
|
|
}
|
|
|
|
|
|
|
|
void AB_BankInfoPluginGENERIC__GetDataDir(AB_BANKINFO_PLUGIN *bip,
|
|
GWEN_BUFFER *pbuf) {
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
int gotit=0;
|
|
|
|
assert(pbuf);
|
|
|
|
assert(bip);
|
|
bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC,
|
|
bip);
|
|
assert(bde);
|
|
|
|
if (bde->dataDir) {
|
|
gotit=1;
|
|
GWEN_Buffer_AppendString(pbuf, bde->dataDir);
|
|
}
|
|
else {
|
|
GWEN_STRINGLIST *sl;
|
|
|
|
sl=AB_Banking_GetGlobalDataDirs();
|
|
if (sl) {
|
|
GWEN_STRINGLISTENTRY *se;
|
|
GWEN_BUFFER *buf;
|
|
|
|
buf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
se=GWEN_StringList_FirstEntry(sl);
|
|
while(se) {
|
|
FILE *f;
|
|
const char *s;
|
|
unsigned int pos;
|
|
|
|
s=GWEN_StringListEntry_Data(se);
|
|
GWEN_Buffer_AppendString(buf, s);
|
|
GWEN_Buffer_AppendString(buf, DIRSEP "bankinfo" DIRSEP);
|
|
GWEN_Buffer_AppendString(buf, bde->country);
|
|
DBG_ERROR(AQBANKING_LOGDOMAIN,
|
|
"Trying folder \"%s\"",
|
|
GWEN_Buffer_GetStart(buf));
|
|
pos=GWEN_Buffer_GetPos(buf);
|
|
GWEN_Buffer_AppendString(buf, DIRSEP);
|
|
GWEN_Buffer_AppendString(buf, "banks.data");
|
|
f=fopen(GWEN_Buffer_GetStart(buf), "r");
|
|
if (f) {
|
|
fclose(f);
|
|
GWEN_Buffer_Crop(buf, 0, pos);
|
|
bde->dataDir=strdup(GWEN_Buffer_GetStart(buf));
|
|
GWEN_Buffer_AppendBuffer(pbuf, buf);
|
|
gotit=1;
|
|
break;
|
|
}
|
|
GWEN_Buffer_Reset(buf);
|
|
se=GWEN_StringListEntry_Next(se);
|
|
}
|
|
}
|
|
GWEN_StringList_free(sl);
|
|
}
|
|
assert(gotit);
|
|
}
|
|
|
|
|
|
|
|
AB_BANKINFO *AB_BankInfoPluginGENERIC__ReadBankInfo(AB_BANKINFO_PLUGIN *bip,
|
|
const char *num){
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
GWEN_BUFFER *pbuf;
|
|
AB_BANKINFO *bi;
|
|
GWEN_BUFFEREDIO *bio;
|
|
int fd;
|
|
GWEN_DB_NODE *dbT;
|
|
GWEN_TYPE_UINT32 pos;
|
|
|
|
assert(bip);
|
|
bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC,
|
|
bip);
|
|
assert(bde);
|
|
|
|
/* get position */
|
|
assert(strlen(num)==8);
|
|
if (1!=sscanf(num, "%08x", &pos)) {
|
|
DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid index");
|
|
return 0;
|
|
}
|
|
|
|
/* get path */
|
|
pbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf);
|
|
GWEN_Buffer_AppendString(pbuf, "/banks.data");
|
|
|
|
/* open file */
|
|
fd=open(GWEN_Buffer_GetStart(pbuf), O_RDONLY | O_EXCL);
|
|
if (fd==-1) {
|
|
DBG_ERROR(AQBANKING_LOGDOMAIN, "open(%s): %s",
|
|
GWEN_Buffer_GetStart(pbuf), strerror(errno));
|
|
GWEN_Buffer_free(pbuf);
|
|
return 0;
|
|
}
|
|
/* seek position */
|
|
DBG_VERBOUS(0, "Seeking to %08x (%d)", pos, pos);
|
|
if ((off_t)-1==lseek(fd, pos, SEEK_SET)) {
|
|
DBG_ERROR(AQBANKING_LOGDOMAIN, "lseek(%s, "GWEN_TYPE_TMPL_UINT32"): %s",
|
|
GWEN_Buffer_GetStart(pbuf),
|
|
pos,
|
|
strerror(errno));
|
|
close(fd);
|
|
GWEN_Buffer_free(pbuf);
|
|
return 0;
|
|
}
|
|
|
|
bio=GWEN_BufferedIO_File_new(fd);
|
|
GWEN_BufferedIO_SetReadBuffer(bio, 0, 512);
|
|
|
|
/* read data */
|
|
dbT=GWEN_DB_Group_new("bank");
|
|
|
|
if (GWEN_DB_ReadFromStream(dbT, bio,
|
|
GWEN_DB_FLAGS_DEFAULT |
|
|
GWEN_DB_FLAGS_STOP_ON_EMPTY_LINE |
|
|
GWEN_PATH_FLAGS_CREATE_GROUP)) {
|
|
DBG_ERROR(0, "Could not load file \"%s\"",
|
|
GWEN_Buffer_GetStart(pbuf));
|
|
GWEN_DB_Group_free(dbT);
|
|
GWEN_BufferedIO_Abandon(bio);
|
|
GWEN_BufferedIO_free(bio);
|
|
GWEN_Buffer_free(pbuf);
|
|
return 0;
|
|
}
|
|
|
|
bi=AB_BankInfo_fromDb(dbT);
|
|
assert(bi);
|
|
GWEN_DB_Group_free(dbT);
|
|
GWEN_BufferedIO_Close(bio);
|
|
GWEN_BufferedIO_free(bio);
|
|
GWEN_Buffer_free(pbuf);
|
|
|
|
return bi;
|
|
}
|
|
|
|
|
|
|
|
AB_BANKINFO *AB_BankInfoPluginGENERIC_GetBankInfo(AB_BANKINFO_PLUGIN *bip,
|
|
const char *branchId,
|
|
const char *bankId){
|
|
return AB_BankInfoPluginGENERIC__SearchbyCode(bip, bankId);
|
|
}
|
|
|
|
|
|
|
|
AB_BANKINFO *AB_BankInfoPluginGENERIC__SearchbyCode(AB_BANKINFO_PLUGIN *bip,
|
|
const char *bankId){
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
GWEN_BUFFER *pbuf;
|
|
FILE *f;
|
|
char lbuf[512];
|
|
|
|
assert(bip);
|
|
bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC,
|
|
bip);
|
|
assert(bde);
|
|
|
|
pbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf);
|
|
GWEN_Buffer_AppendString(pbuf, "/blz.idx");
|
|
f=fopen(GWEN_Buffer_GetStart(pbuf), "r");
|
|
if (!f) {
|
|
DBG_INFO(AQBANKING_LOGDOMAIN, "fopen(%s): %s",
|
|
GWEN_Buffer_GetStart(pbuf),
|
|
strerror(errno));
|
|
GWEN_Buffer_free(pbuf);
|
|
return 0;
|
|
}
|
|
|
|
while(!feof(f)) {
|
|
unsigned char *p;
|
|
|
|
lbuf[0]=0;
|
|
p=(unsigned char*)fgets(lbuf, sizeof(lbuf), f);
|
|
if (p) {
|
|
char *blz=0;
|
|
char *num=0;
|
|
unsigned int i;
|
|
|
|
i=strlen(lbuf);
|
|
if (lbuf[i-1]==10)
|
|
lbuf[i-1]=0;
|
|
blz=(char*)p;
|
|
while(*p && *p!='\t')
|
|
p++;
|
|
assert(*p=='\t');
|
|
*p=0;
|
|
p++;
|
|
num=(char*)p;
|
|
if (strcasecmp(blz, bankId)==0) {
|
|
AB_BANKINFO *bi;
|
|
|
|
bi=AB_BankInfoPluginGENERIC__ReadBankInfo(bip, num);
|
|
fclose(f);
|
|
GWEN_Buffer_free(pbuf);
|
|
return bi;
|
|
}
|
|
}
|
|
}
|
|
fclose(f);
|
|
DBG_INFO(AQBANKING_LOGDOMAIN, "Bank %s not found", bankId);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int AB_BankInfoPluginGENERIC__AddById(AB_BANKINFO_PLUGIN *bip,
|
|
const char *bankId,
|
|
AB_BANKINFO_LIST2 *bl){
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
GWEN_BUFFER *pbuf;
|
|
FILE *f;
|
|
char lbuf[512];
|
|
GWEN_TYPE_UINT32 count=0;
|
|
|
|
assert(bip);
|
|
bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC,
|
|
bip);
|
|
assert(bde);
|
|
|
|
pbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf);
|
|
GWEN_Buffer_AppendString(pbuf, "/blz.idx");
|
|
f=fopen(GWEN_Buffer_GetStart(pbuf), "r");
|
|
if (!f) {
|
|
DBG_INFO(AQBANKING_LOGDOMAIN, "fopen(%s): %s",
|
|
GWEN_Buffer_GetStart(pbuf),
|
|
strerror(errno));
|
|
GWEN_Buffer_free(pbuf);
|
|
return AB_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
while(!feof(f)) {
|
|
unsigned char *p;
|
|
|
|
lbuf[0]=0;
|
|
p=(unsigned char*)fgets(lbuf, sizeof(lbuf), f);
|
|
if (p) {
|
|
char *blz=0;
|
|
char *num=0;
|
|
unsigned int i;
|
|
|
|
i=strlen(lbuf);
|
|
if (lbuf[i-1]==10)
|
|
lbuf[i-1]=0;
|
|
blz=(char*)p;
|
|
while(*p && *p!='\t')
|
|
p++;
|
|
assert(*p=='\t');
|
|
*p=0;
|
|
p++;
|
|
num=(char*)p;
|
|
i=strlen(lbuf);
|
|
if (GWEN_Text_ComparePattern(blz, bankId, 0)!=-1) {
|
|
AB_BANKINFO *bi;
|
|
|
|
bi=AB_BankInfoPluginGENERIC__ReadBankInfo(bip, num);
|
|
if (bi) {
|
|
AB_BankInfo_List2_PushBack(bl, bi);
|
|
count++;
|
|
}
|
|
}
|
|
}
|
|
} /* while ! feof */
|
|
fclose(f);
|
|
if (!count) {
|
|
DBG_INFO(AQBANKING_LOGDOMAIN, "Bank %s not found", bankId);
|
|
return AB_ERROR_NOT_FOUND;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int AB_BankInfoPluginGENERIC__AddByBic(AB_BANKINFO_PLUGIN *bip,
|
|
const char *bic,
|
|
AB_BANKINFO_LIST2 *bl){
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
GWEN_BUFFER *pbuf;
|
|
FILE *f;
|
|
char lbuf[512];
|
|
GWEN_TYPE_UINT32 count=0;
|
|
|
|
assert(bip);
|
|
bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC,
|
|
bip);
|
|
assert(bde);
|
|
|
|
pbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf);
|
|
GWEN_Buffer_AppendString(pbuf, "/bic.idx");
|
|
f=fopen(GWEN_Buffer_GetStart(pbuf), "r");
|
|
if (!f) {
|
|
DBG_INFO(AQBANKING_LOGDOMAIN, "fopen(%s): %s",
|
|
GWEN_Buffer_GetStart(pbuf),
|
|
strerror(errno));
|
|
GWEN_Buffer_free(pbuf);
|
|
return AB_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
while(!feof(f)) {
|
|
unsigned char *p;
|
|
|
|
lbuf[0]=0;
|
|
p=(unsigned char*)fgets(lbuf, sizeof(lbuf), f);
|
|
if (p) {
|
|
char *key=0;
|
|
char *num=0;
|
|
unsigned int i;
|
|
|
|
i=strlen(lbuf);
|
|
if (lbuf[i-1]==10)
|
|
lbuf[i-1]=0;
|
|
key=(char*)p;
|
|
while(*p && *p!='\t')
|
|
p++;
|
|
assert(*p=='\t');
|
|
*p=0;
|
|
p++;
|
|
num=(char*)p;
|
|
if (GWEN_Text_ComparePattern(key, bic, 0)!=-1) {
|
|
AB_BANKINFO *bi;
|
|
|
|
bi=AB_BankInfoPluginGENERIC__ReadBankInfo(bip, num);
|
|
if (bi) {
|
|
AB_BankInfo_List2_PushBack(bl, bi);
|
|
count++;
|
|
}
|
|
}
|
|
}
|
|
} /* while ! feof */
|
|
fclose(f);
|
|
if (!count) {
|
|
DBG_INFO(AQBANKING_LOGDOMAIN, "Bank %s not found", bic);
|
|
return AB_ERROR_NOT_FOUND;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int AB_BankInfoPluginGENERIC__AddByNameAndLoc(AB_BANKINFO_PLUGIN *bip,
|
|
const char *name,
|
|
const char *loc,
|
|
AB_BANKINFO_LIST2 *bl){
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
GWEN_BUFFER *pbuf;
|
|
FILE *f;
|
|
char lbuf[512];
|
|
GWEN_TYPE_UINT32 count=0;
|
|
|
|
assert(bip);
|
|
bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC,
|
|
bip);
|
|
assert(bde);
|
|
|
|
if (name==0)
|
|
name="*";
|
|
if (loc==0)
|
|
loc="*";
|
|
|
|
pbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf);
|
|
GWEN_Buffer_AppendString(pbuf, "/namloc.idx");
|
|
f=fopen(GWEN_Buffer_GetStart(pbuf), "r");
|
|
if (!f) {
|
|
DBG_INFO(AQBANKING_LOGDOMAIN, "fopen(%s): %s",
|
|
GWEN_Buffer_GetStart(pbuf),
|
|
strerror(errno));
|
|
GWEN_Buffer_free(pbuf);
|
|
DBG_ERROR(AQBANKING_LOGDOMAIN, "namloc index file not available");
|
|
return AB_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
while(!feof(f)) {
|
|
unsigned char *p;
|
|
|
|
lbuf[0]=0;
|
|
p=(unsigned char*)fgets(lbuf, sizeof(lbuf), f);
|
|
if (p) {
|
|
char *key1=0;
|
|
char *key2=0;
|
|
char *num=0;
|
|
unsigned int i;
|
|
|
|
i=strlen(lbuf);
|
|
if (lbuf[i-1]==10)
|
|
lbuf[i-1]=0;
|
|
key1=(char*)p;
|
|
while(*p && *p!='\t')
|
|
p++;
|
|
assert(*p=='\t');
|
|
*p=0;
|
|
p++;
|
|
key2=/* GCC4 pointer-signedness fix: */ (char*) p;
|
|
while(*p && *p!='\t')
|
|
p++;
|
|
assert(*p=='\t');
|
|
*p=0;
|
|
p++;
|
|
num=(char*)p;
|
|
if (GWEN_Text_ComparePattern(key1, name, 0)!=-1 &&
|
|
GWEN_Text_ComparePattern(key2, loc, 0)!=-1) {
|
|
AB_BANKINFO *bi;
|
|
|
|
bi=AB_BankInfoPluginGENERIC__ReadBankInfo(bip, num);
|
|
if (bi) {
|
|
AB_BankInfo_List2_PushBack(bl, bi);
|
|
count++;
|
|
}
|
|
}
|
|
}
|
|
} /* while ! feof */
|
|
fclose(f);
|
|
if (!count) {
|
|
DBG_INFO(AQBANKING_LOGDOMAIN, "Bank %s/%s not found", name, loc);
|
|
return AB_ERROR_NOT_FOUND;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int AB_BankInfoPluginGENERIC__CmpTemplate(AB_BANKINFO *bi,
|
|
const AB_BANKINFO *tbi,
|
|
GWEN_TYPE_UINT32 flags) {
|
|
const char *s;
|
|
const char *t;
|
|
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_BRANCHID) {
|
|
s=AB_BankInfo_GetBranchId(bi);
|
|
t=AB_BankInfo_GetBranchId(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_BANKID) {
|
|
s=AB_BankInfo_GetBankId(bi);
|
|
t=AB_BankInfo_GetBankId(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_BIC) {
|
|
s=AB_BankInfo_GetBic(bi);
|
|
t=AB_BankInfo_GetBic(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_BANKNAME) {
|
|
s=AB_BankInfo_GetBankName(bi);
|
|
t=AB_BankInfo_GetBankName(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_LOCATION) {
|
|
s=AB_BankInfo_GetLocation(bi);
|
|
t=AB_BankInfo_GetLocation(tbi);
|
|
if (!t || !*t)
|
|
t=AB_BankInfo_GetCity(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_ZIPCODE) {
|
|
s=AB_BankInfo_GetZipcode(bi);
|
|
t=AB_BankInfo_GetZipcode(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_REGION) {
|
|
s=AB_BankInfo_GetRegion(bi);
|
|
t=AB_BankInfo_GetRegion(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_PHONE) {
|
|
s=AB_BankInfo_GetPhone(bi);
|
|
t=AB_BankInfo_GetPhone(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_FAX) {
|
|
s=AB_BankInfo_GetFax(bi);
|
|
t=AB_BankInfo_GetFax(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_EMAIL) {
|
|
s=AB_BankInfo_GetEmail(bi);
|
|
t=AB_BankInfo_GetEmail(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
if (flags & AB_BANKINFO_GENERIC__FLAGS_WEBSITE) {
|
|
s=AB_BankInfo_GetWebsite(bi);
|
|
t=AB_BankInfo_GetWebsite(tbi);
|
|
if (s && *s)
|
|
if (GWEN_Text_ComparePattern(s, t, 0)==-1)
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
int AB_BankInfoPluginGENERIC_AddByTemplate(AB_BANKINFO_PLUGIN *bip,
|
|
AB_BANKINFO *tbi,
|
|
AB_BANKINFO_LIST2 *bl,
|
|
GWEN_TYPE_UINT32 flags){
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
GWEN_TYPE_UINT32 count=0;
|
|
GWEN_TYPE_UINT32 i=0;
|
|
GWEN_BUFFEREDIO *bio;
|
|
GWEN_BUFFER *pbuf;
|
|
int fd;
|
|
|
|
assert(bip);
|
|
bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC,
|
|
bip);
|
|
assert(bde);
|
|
|
|
/* get path */
|
|
pbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf);
|
|
GWEN_Buffer_AppendString(pbuf, "/banks.data");
|
|
/* open file */
|
|
fd=open(GWEN_Buffer_GetStart(pbuf), O_RDONLY | O_EXCL);
|
|
if (fd==-1) {
|
|
DBG_ERROR(AQBANKING_LOGDOMAIN,
|
|
"open(%s): %s",
|
|
GWEN_Buffer_GetStart(pbuf),
|
|
strerror(errno));
|
|
GWEN_Buffer_free(pbuf);
|
|
return AB_ERROR_NOT_FOUND;
|
|
}
|
|
bio=GWEN_BufferedIO_File_new(fd);
|
|
GWEN_BufferedIO_SetReadBuffer(bio, 0, 1024);
|
|
|
|
while(!GWEN_BufferedIO_CheckEOF(bio)) {
|
|
GWEN_DB_NODE *dbT;
|
|
AB_BANKINFO *bi;
|
|
int pos;
|
|
|
|
if (i & ~63) {
|
|
if (GWEN_WaitCallbackProgress(AB_BANKING_PROGRESS_NONE)==
|
|
GWEN_WaitCallbackResult_Abort) {
|
|
DBG_ERROR(AQBANKING_LOGDOMAIN,
|
|
"Aborted by user");
|
|
GWEN_BufferedIO_Abandon(bio);
|
|
GWEN_BufferedIO_free(bio);
|
|
GWEN_Buffer_free(pbuf);
|
|
return AB_ERROR_USER_ABORT;
|
|
}
|
|
}
|
|
|
|
dbT=GWEN_DB_Group_new("bank");
|
|
pos=GWEN_BufferedIO_GetBytesRead(bio);
|
|
if (GWEN_DB_ReadFromStream(dbT, bio,
|
|
GWEN_DB_FLAGS_DEFAULT |
|
|
GWEN_DB_FLAGS_STOP_ON_EMPTY_LINE |
|
|
GWEN_PATH_FLAGS_CREATE_GROUP)) {
|
|
DBG_ERROR(AQBANKING_LOGDOMAIN,
|
|
"Could not read from file \"%s\"",
|
|
GWEN_Buffer_GetStart(pbuf));
|
|
GWEN_DB_Group_free(dbT);
|
|
GWEN_BufferedIO_Abandon(bio);
|
|
GWEN_BufferedIO_free(bio);
|
|
GWEN_Buffer_free(pbuf);
|
|
return AB_ERROR_GENERIC;
|
|
}
|
|
|
|
bi=AB_BankInfo_fromDb(dbT);
|
|
assert(bi);
|
|
if (AB_BankInfoPluginGENERIC__CmpTemplate(bi, tbi, flags)==1) {
|
|
count++;
|
|
AB_BankInfo_List2_PushBack(bl, bi);
|
|
}
|
|
else {
|
|
AB_BankInfo_free(bi);
|
|
}
|
|
GWEN_DB_Group_free(dbT);
|
|
i++;
|
|
} /* while */
|
|
|
|
GWEN_BufferedIO_Close(bio);
|
|
GWEN_BufferedIO_free(bio);
|
|
GWEN_Buffer_free(pbuf);
|
|
|
|
if (count==0) {
|
|
DBG_INFO(AQBANKING_LOGDOMAIN, "No matching bank found");
|
|
return AB_ERROR_NOT_FOUND;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int AB_BankInfoPluginGENERIC_SearchbyTemplate(AB_BANKINFO_PLUGIN *bip,
|
|
AB_BANKINFO *tbi,
|
|
AB_BANKINFO_LIST2 *bl){
|
|
AB_BANKINFO_PLUGIN_GENERIC *bde;
|
|
GWEN_TYPE_UINT32 flags;
|
|
int rv;
|
|
const char *s;
|
|
|
|
assert(bip);
|
|
bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC,
|
|
bip);
|
|
assert(bde);
|
|
|
|
/* this is just to speed up often needed tests */
|
|
flags=0;
|
|
s=AB_BankInfo_GetBranchId(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_BRANCHID;
|
|
s=AB_BankInfo_GetBankId(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_BANKID;
|
|
s=AB_BankInfo_GetBic(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_BIC;
|
|
s=AB_BankInfo_GetBankName(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_BANKNAME;
|
|
s=AB_BankInfo_GetLocation(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_LOCATION;
|
|
s=AB_BankInfo_GetStreet(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_STREET;
|
|
s=AB_BankInfo_GetZipcode(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_ZIPCODE;
|
|
s=AB_BankInfo_GetCity(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_CITY;
|
|
s=AB_BankInfo_GetRegion(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_REGION;
|
|
s=AB_BankInfo_GetPhone(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_PHONE;
|
|
s=AB_BankInfo_GetFax(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_FAX;
|
|
s=AB_BankInfo_GetEmail(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_EMAIL;
|
|
s=AB_BankInfo_GetWebsite(tbi);
|
|
if (s && *s)
|
|
flags|=AB_BANKINFO_GENERIC__FLAGS_WEBSITE;
|
|
|
|
if (flags==AB_BANKINFO_GENERIC__FLAGS_BIC)
|
|
rv=AB_BankInfoPluginGENERIC__AddByBic(bip,
|
|
AB_BankInfo_GetBic(tbi),
|
|
bl);
|
|
else if ((flags & ~AB_BANKINFO_GENERIC__FLAGS_BRANCHID)==
|
|
AB_BANKINFO_GENERIC__FLAGS_BANKID)
|
|
rv=AB_BankInfoPluginGENERIC__AddById(bip,
|
|
AB_BankInfo_GetBankId(tbi),
|
|
bl);
|
|
else if (flags==(AB_BANKINFO_GENERIC__FLAGS_BANKNAME|
|
|
AB_BANKINFO_GENERIC__FLAGS_LOCATION) ||
|
|
flags==AB_BANKINFO_GENERIC__FLAGS_BANKNAME ||
|
|
flags==AB_BANKINFO_GENERIC__FLAGS_LOCATION) {
|
|
rv=AB_BankInfoPluginGENERIC__AddByNameAndLoc(bip,
|
|
AB_BankInfo_GetBankName(tbi),
|
|
AB_BankInfo_GetLocation(tbi),
|
|
bl);
|
|
}
|
|
else {
|
|
DBG_ERROR(AQBANKING_LOGDOMAIN,
|
|
"No quick search implemented for these flags (%08x)", flags);
|
|
rv=AB_ERROR_NOT_AVAILABLE;
|
|
}
|
|
if (rv==AB_ERROR_NOT_AVAILABLE) {
|
|
rv=AB_BankInfoPluginGENERIC_AddByTemplate(bip, tbi, bl, flags);
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|