static void save_kvp_acc_cb(gpointer key, gpointer value, gpointer user_data) { AB_ACCOUNT *ab_acc = key; Account *gnc_acc = value; guint32 ab_account_uid; const gchar *ab_accountid, *gnc_accountid; const gchar *ab_bankcode, *gnc_bankcode; g_return_if_fail(ab_acc && gnc_acc); ab_account_uid = AB_Account_GetUniqueId(ab_acc); if (gnc_ab_get_account_uid(gnc_acc) != ab_account_uid) gnc_ab_set_account_uid(gnc_acc, ab_account_uid); ab_accountid = AB_Account_GetAccountNumber(ab_acc); gnc_accountid = gnc_ab_get_account_accountid(gnc_acc); if (ab_accountid && (!gnc_accountid || (strcmp(ab_accountid, gnc_accountid) != 0))) gnc_ab_set_account_accountid(gnc_acc, ab_accountid); ab_bankcode = AB_Account_GetBankCode(ab_acc); gnc_bankcode = gnc_ab_get_account_bankcode(gnc_acc); if (ab_bankcode && (!gnc_bankcode || (strcmp(gnc_bankcode, ab_bankcode) != 0))) gnc_ab_set_account_bankcode(gnc_acc, ab_bankcode); }
int AB_Provider_AccountToAccountSpec(AB_PROVIDER *pro, const AB_ACCOUNT *acc, AB_ACCOUNT_SPEC *as, int doLock) { int rv; assert(acc); assert(as); AB_AccountSpec_SetType(as, AB_Account_GetAccountType(acc)); AB_AccountSpec_SetUniqueId(as, AB_Account_GetUniqueId(acc)); AB_AccountSpec_SetBackendName(as, AB_Account_GetBackendName(acc)); AB_AccountSpec_SetOwnerName(as, AB_Account_GetOwnerName(acc)); AB_AccountSpec_SetAccountName(as, AB_Account_GetAccountName(acc)); AB_AccountSpec_SetCurrency(as, AB_Account_GetCurrency(acc)); AB_AccountSpec_SetIban(as, AB_Account_GetIban(acc)); AB_AccountSpec_SetBic(as, AB_Account_GetBic(acc)); AB_AccountSpec_SetCountry(as, AB_Account_GetCountry(acc)); AB_AccountSpec_SetBankCode(as, AB_Account_GetBankCode(acc)); AB_AccountSpec_SetAccountNumber(as, AB_Account_GetAccountNumber(acc)); AB_AccountSpec_SetSubAccountNumber(as, AB_Account_GetSubAccountId(acc)); rv=AB_Provider_UpdateAccountSpec(pro, as, doLock); if (rv<0 && rv!=GWEN_ERROR_NOT_IMPLEMENTED) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; }
static void createAccountListBoxString(const AB_ACCOUNT *a, GWEN_BUFFER *tbuf) { const char *s; char numbuf[32]; uint32_t uid; /* column 1 */ uid=AB_Account_GetUniqueId(a); snprintf(numbuf, sizeof(numbuf)-1, "%06d", uid); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(tbuf, numbuf); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 2 */ s=AB_Account_GetBankCode(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 3 */ s=AB_Account_GetBankName(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 4 */ s=AB_Account_GetAccountNumber(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 5 */ s=AB_Account_GetAccountName(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 6 */ s=AB_Account_GetOwnerName(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 7 */ s=AB_Account_GetBackendName(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); }
int AO_NewUserDialog_UndoIt(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; AB_USER *u; DBG_ERROR(0, "UndoIt"); assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); u=xdlg->user; if (u) { AB_ACCOUNT_LIST *accountList; int rv; /* delete all accounts created for this user */ accountList=AB_Account_List_new(); rv=AB_Provider_ReadAccounts(xdlg->provider, accountList); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); } else { uint32_t uid; AB_ACCOUNT *a; uid=AB_User_GetUniqueId(u); a=AB_Account_List_First(accountList); while (a) { AB_Account_List_Del(a); if (AB_Account_GetUserId(a)==uid) AB_Provider_DeleteAccount(xdlg->provider, AB_Account_GetUniqueId(a)); a=AB_Account_List_Next(a); } /* while a */ } AB_Account_List_free(accountList); /* delete the user itself */ AB_Provider_DeleteUser(xdlg->provider, AB_User_GetUniqueId(u)); xdlg->user=NULL; } return GWEN_DialogEvent_ResultHandled; }
void KBAccountListViewItem::_populate() { QString tmp; int i; assert(_account); i = 0; // unique id setText(i++, QString::number(AB_Account_GetUniqueId(_account))); // bank code setText(i++, QString::fromUtf8(AB_Account_GetBankCode(_account))); // bank name tmp = AB_Account_GetBankName(_account); if (tmp.isEmpty()) tmp = i18nc("replacement for institution or account w/o name", "(unnamed)"); setText(i++, tmp); // account id setText(i++, QString::fromUtf8(AB_Account_GetAccountNumber(_account))); // account name tmp = QString::fromUtf8(AB_Account_GetAccountName(_account)); if (tmp.isEmpty()) tmp = i18nc("replacement for institution or account w/o name", "(unnamed)"); setText(i++, tmp); tmp = QString::fromUtf8(AB_Account_GetOwnerName(_account)); if (tmp.isEmpty()) tmp = ""; setText(i++, tmp); tmp = QString::fromUtf8(AB_Provider_GetName(AB_Account_GetProvider(_account))); if (tmp.isEmpty()) tmp = i18nc("replacement for institution or account w/o name", "(unnamed)"); setText(i++, tmp); }
int AB_SetupDialog_DelUser(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); if (xdlg->currentUserList) { uint32_t uid; uid=AB_SetupDialog_GetCurrentUserId(dlg); if (uid) { AB_USER *u; u=AB_User_List_GetByUniqueId(xdlg->currentUserList, uid); if (u) { AB_ACCOUNT *a; uint32_t aid; int rv; char nbuf[512]; snprintf(nbuf, sizeof(nbuf)-1, I18N("<html>" "<p>Do you really want to delete the user <i>%s</i>?" "</html>" "Do you really want to delete the user \"%s\"?"), AB_User_GetUserId(u), AB_User_GetUserId(u)); nbuf[sizeof(nbuf)-1]=0; rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_WARN | GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS, I18N("Delete User"), nbuf, I18N("Yes"), I18N("No"), NULL, 0); if (rv!=1) { DBG_INFO(AQBANKING_LOGDOMAIN, "Aborted by user"); return GWEN_DialogEvent_ResultHandled; } xdlg->currentAccountList=AB_Account_List_new(); AB_SetupDialog_LoadAccounts(dlg, xdlg->currentAccountList); if (AB_Account_List_GetCount(xdlg->currentAccountList)) { a=AB_Account_List_First(xdlg->currentAccountList); while (a) { if (AB_Account_GetUserId(a) == uid) { aid=AB_Account_GetUniqueId(a); rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS, I18N("Error"), I18N("<html>" "<p>There is at least one account assigned to the selected user.</p>" "<p>Do you want to remove the account(s) and continue removing the user?</p>" "</html>" "There is at least one account assigned to the selected user.\n" "Do you want to remove the account(s) and continue removing the user?"), I18N("Yes"), I18N("No"), NULL, 0); if (rv!=1) { DBG_INFO(AQBANKING_LOGDOMAIN, "Aborted by user"); return GWEN_DialogEvent_ResultHandled; } rv=AB_Provider_DeleteAccount(AB_Account_GetProvider(a), aid); if (rv<0) { GWEN_Gui_ShowError(I18N("Error"), I18N("Error deleting account: %d (%d deleted)"), rv, aid); AB_SetupDialog_Reload(dlg); return GWEN_DialogEvent_ResultHandled; } } a=AB_Account_List_Next(a); } } /* now delete the user */ rv=AB_Provider_DeleteUser(AB_User_GetProvider(u), uid); if (rv<0) { GWEN_Gui_ShowError(I18N("Error"), I18N("Error deleting user: %d"), rv); AB_SetupDialog_Reload(dlg); return GWEN_DialogEvent_ResultHandled; } } /* if u */ } /* if uid */ AB_SetupDialog_Reload(dlg); } /* if currentUserList */ return GWEN_DialogEvent_ResultHandled; }
int AB_SetupDialog_DelAccount(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); if (xdlg->currentAccountList) { uint32_t aid; aid=AB_SetupDialog_GetCurrentAccountId(dlg); if (aid) { AB_ACCOUNT *a; a=AB_Account_List_GetByUniqueId(xdlg->currentAccountList, aid); if (a) { int rv; char nbuf[512]; char ibuf[32]; const char *an; an=AB_Account_GetAccountName(a); if (!(an && *an)) an=AB_Account_GetAccountNumber(a); if (!(an && *an)) { snprintf(ibuf, sizeof(ibuf)-1, "%d", (int) AB_Account_GetUniqueId(a)); ibuf[sizeof(ibuf)-1]=0; an=ibuf; } snprintf(nbuf, sizeof(nbuf)-1, I18N("<html>" "<p>Do you really want to delete the account <i>%s</i>?" "</html>" "Do you really want to delete the account \"%s\"?"), an, an); nbuf[sizeof(nbuf)-1]=0; rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_WARN | GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS, I18N("Delete Account"), nbuf, I18N("Yes"), I18N("No"), NULL, 0); if (rv!=1) { DBG_INFO(AQBANKING_LOGDOMAIN, "Aborted by user"); return GWEN_DialogEvent_ResultHandled; } rv=AB_Provider_DeleteAccount(AB_Account_GetProvider(a), aid); if (rv<0) { GWEN_Gui_ShowError(I18N("Error"), I18N("Error deleting account: %d"), rv); AB_SetupDialog_Reload(dlg); return GWEN_DialogEvent_ResultHandled; } AB_SetupDialog_Reload(dlg); } /* if a */ } /* if aid */ } /* if xdlg->currentAccountList */ return GWEN_DialogEvent_ResultHandled; }
int AH_Job_GetTransactionsCreditCard_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx) { AH_JOB_GETTRANSACTIONS *aj; AB_ACCOUNT *a; AB_IMEXPORTER_ACCOUNTINFO *ai; AB_USER *u; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; GWEN_BUFFER *tbooked; GWEN_BUFFER *tnoted; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobGetTransactionsCreditCard"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETTRANSACTIONS, j); assert(aj); tbooked=GWEN_Buffer_new(0, 1024, 0, 1); tnoted=GWEN_Buffer_new(0, 1024, 0, 1); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); DBG_INFO(AQHBCI_LOGDOMAIN, "Response:"); GWEN_DB_Dump(dbResponses, 2); DBG_INFO(AQHBCI_LOGDOMAIN, "Response end"); a=AH_AccountJob_GetAccount(j); assert(a); ai=AB_ImExporterContext_GetOrAddAccountInfo(ctx, AB_Account_GetUniqueId(a), AB_Account_GetIban(a), AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), AB_Account_GetAccountType(a)); assert(ai); AB_ImExporterAccountInfo_SetAccountId(ai, AB_Account_GetUniqueId(a)); u=AH_Job_GetUser(j); assert(u); /* search for "Transactions" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while (dbCurr) { GWEN_DB_NODE *dbXA; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/transactionscreditcard"); if (dbXA) { GWEN_DB_NODE *dbT; GWEN_DB_NODE *dbV; GWEN_DATE *date; GWEN_DATE *valutaDate; const char *p; const char *ref; int i; dbT=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "entries"); while (dbT) { AB_VALUE *v1; AB_VALUE *v2; GWEN_STRINGLIST *purpose; AB_TRANSACTION *t; /* read date (Buchungsdatum) */ p=GWEN_DB_GetCharValue(dbT, "date", 0, 0); if (p) date=GWEN_Date_fromStringWithTemplate(p, "YYYYMMDD"); else date=NULL; /* read valutaData (Umsatzdatum) */ p=GWEN_DB_GetCharValue(dbT, "valutaDate", 0, 0); if (p) valutaDate=GWEN_Date_fromStringWithTemplate(p, "YYYYMMDD"); else valutaDate=NULL; /* read value */ dbV=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "value"); if (dbV) v1=AB_Value_fromDb(dbV); else v1=NULL; v2=0; if (!v1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing value from DB"); } else { p=GWEN_DB_GetCharValue(dbT, "debitMark", 0, 0); if (p) { if (strcasecmp(p, "D")==0 || strcasecmp(p, "RC")==0) { v2=AB_Value_dup(v1); AB_Value_Negate(v2); } else if (strcasecmp(p, "C")==0 || strcasecmp(p, "RD")==0) v2=AB_Value_dup(v1); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad debit mark \"%s\"", p); v2=0; } } AB_Value_free(v1); } /* read purpose */ purpose=GWEN_StringList_new(); for (i=0; i<10; i++) { p=GWEN_DB_GetCharValue(dbT, "purpose", i, 0); if (!p) break; GWEN_StringList_AppendString(purpose, p, 0, 0); } /* read reference */ ref=GWEN_DB_GetCharValue(dbT, "reference", 0, 0); if (ref) GWEN_StringList_AppendString(purpose, ref, 0, 0); t=AB_Transaction_new(); if (ref) AB_Transaction_SetFiId(t, ref); AB_Transaction_SetUniqueAccountId(t, AB_Account_GetUniqueId(a)); AB_Transaction_SetLocalBankCode(t, AB_User_GetBankCode(u)); AB_Transaction_SetLocalAccountNumber(t, AB_Account_GetAccountNumber(a)); AB_Transaction_SetValutaDate(t, valutaDate); AB_Transaction_SetDate(t, date); AB_Transaction_SetValue(t, v2); AB_Transaction_SetPurposeFromStringList(t, purpose); DBG_INFO(AQHBCI_LOGDOMAIN, "Adding transaction"); AB_ImExporterAccountInfo_AddTransaction(ai, t); GWEN_StringList_free(purpose); AB_Value_free(v2); GWEN_Date_free(date); GWEN_Date_free(valutaDate); dbT = GWEN_DB_FindNextGroup(dbT, "entries"); } //while (dbT) } //if (dbXA) dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; }
/* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetTransactions_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx) { AH_JOB_GETTRANSACTIONS *aj; AB_ACCOUNT *a; AB_IMEXPORTER_ACCOUNTINFO *ai; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; GWEN_BUFFER *tbooked; GWEN_BUFFER *tnoted; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobGetTransactions"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETTRANSACTIONS, j); assert(aj); tbooked=GWEN_Buffer_new(0, 1024, 0, 1); tnoted=GWEN_Buffer_new(0, 1024, 0, 1); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); /* search for "Transactions" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while (dbCurr) { GWEN_DB_NODE *dbXA; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/transactions"); if (dbXA) { const void *p; unsigned int bs; if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbXA, 2); p=GWEN_DB_GetBinValue(dbXA, "booked", 0, 0, 0, &bs); if (p && bs) GWEN_Buffer_AppendBytes(tbooked, p, bs); p=GWEN_DB_GetBinValue(dbXA, "noted", 0, 0, 0, &bs); if (p && bs) GWEN_Buffer_AppendBytes(tnoted, p, bs); } /* if "Transactions" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } GWEN_Buffer_Rewind(tbooked); GWEN_Buffer_Rewind(tnoted); /* now the buffers contain data to be parsed by DBIOs */ a=AH_AccountJob_GetAccount(j); assert(a); ai=AB_ImExporterContext_GetOrAddAccountInfo(ctx, AB_Account_GetUniqueId(a), AB_Account_GetIban(a), AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), AB_Account_GetAccountType(a)); assert(ai); /* read booked transactions */ if (GWEN_Buffer_GetUsedBytes(tbooked)) { if (getenv("AQHBCI_LOGBOOKED")) { FILE *f; f=fopen("/tmp/booked.mt", "w+"); if (f) { if (fwrite(GWEN_Buffer_GetStart(tbooked), GWEN_Buffer_GetUsedBytes(tbooked), 1, f)!=1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "fwrite: %s", strerror(errno)); } if (fclose(f)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "fclose: %s", strerror(errno)); } } } if (AH_Job_GetTransactions__ReadTransactions(j, ai, "SWIFT-MT940", AB_Transaction_TypeStatement, (const uint8_t *) GWEN_Buffer_GetStart(tbooked), GWEN_Buffer_GetUsedBytes(tbooked))) { GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); DBG_INFO(AQHBCI_LOGDOMAIN, "Error parsing booked transactions"); AH_Job_SetStatus(j, AH_JobStatusError); return -1; } } /* read noted transactions */ if (GWEN_Buffer_GetUsedBytes(tnoted)) { if (getenv("AQHBCI_LOGNOTED")) { FILE *f; f=fopen("/tmp/noted.mt", "w+"); if (f) { if (fwrite(GWEN_Buffer_GetStart(tnoted), GWEN_Buffer_GetUsedBytes(tnoted), 1, f)!=1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "fwrite: %s", strerror(errno)); } if (fclose(f)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "fclose: %s", strerror(errno)); } } } if (AH_Job_GetTransactions__ReadTransactions(j, ai, "SWIFT-MT942", AB_Transaction_TypeNotedStatement, (const uint8_t *) GWEN_Buffer_GetStart(tnoted), GWEN_Buffer_GetUsedBytes(tnoted))) { GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); DBG_INFO(AQHBCI_LOGDOMAIN, "Error parsing noted transactions"); AH_Job_SetStatus(j, AH_JobStatusError); return -1; } } if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) { GWEN_DB_NODE *gn; AB_TRANSACTION *ttmp; DBG_INFO(AQHBCI_LOGDOMAIN, "*** Dumping transactions *******************"); ttmp=AB_ImExporterAccountInfo_GetFirstTransaction(ai, 0, 0); while (ttmp) { DBG_INFO(AQHBCI_LOGDOMAIN, "*** --------------------------------------"); gn=GWEN_DB_Group_new("transaction"); AB_Transaction_toDb(ttmp, gn); GWEN_DB_Dump(gn, 2); GWEN_DB_Group_free(gn); ttmp=AB_Transaction_List_Next(ttmp); } DBG_INFO(AQHBCI_LOGDOMAIN, "*** End dumping transactions ***************"); } GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); return 0; }
int AB_Provider_WriteAccountSpecForAccount(AB_PROVIDER *pro, const AB_ACCOUNT *acc, int doLock) { AB_ACCOUNT_SPEC *as; int rv; DBG_NOTICE(AQBANKING_LOGDOMAIN, "Writing account spec for account %u", (unsigned int) AB_Account_GetUniqueId(acc)); as=AB_AccountSpec_new(); rv=AB_Provider_AccountToAccountSpec(pro, acc, as, doLock); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Banking_WriteAccountSpec(AB_Provider_GetBanking(pro), as); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_AccountSpec_free(as); return rv; } AB_AccountSpec_free(as); return 0; }