diff --git a/ChangeLog b/ChangeLog index 623b870dbd..fc1ad1b60d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-10-21 Christian Stimming + + * src/import-export/hbci/gnc-hbci-utils.c: Refactor some GUI + code. Improve user messages. + 2003-10-20 Christian Stimming * src/import-export/hbci/hbci-interaction.c, diff --git a/src/import-export/hbci/druid-hbci-initial.c b/src/import-export/hbci/druid-hbci-initial.c index bc16d629c7..0565b75162 100644 --- a/src/import-export/hbci/druid-hbci-initial.c +++ b/src/import-export/hbci/druid-hbci-initial.c @@ -348,226 +348,6 @@ to_hexstring_hash (const char *str) -static const HBCI_Bank * -choose_one_bank (gncUIWidget parent, const list_HBCI_Bank *banklist) -{ - const HBCI_Bank *bank; - list_HBCI_Bank_iter *iter, *end; - int list_size; - g_assert (parent); - g_assert (banklist); - - /*printf("%d banks found.\n", list_HBCI_Bank_size (banklist));*/ - list_size = list_HBCI_Bank_size (banklist); - if (list_size == 0) - return NULL; - - if (list_size == 1) - { - /* Get bank. */ - iter = list_HBCI_Bank_begin (banklist); - bank = list_HBCI_Bank_iter_get (iter); - list_HBCI_Bank_iter_delete (iter); - return bank; - } - - /* More than one bank available. */ - { - int choice, i; - GList *node; - GList *radio_list = NULL; - - end = list_HBCI_Bank_end (banklist); - for (iter = list_HBCI_Bank_begin (banklist); - !list_HBCI_Bank_iter_equal(iter, end); - list_HBCI_Bank_iter_next(iter)) - { - bank = list_HBCI_Bank_iter_get (iter); - radio_list = g_list_append(radio_list, - g_strdup_printf ("%s (%s)", - HBCI_Bank_name (bank), - HBCI_Bank_bankCode (bank))); - } - list_HBCI_Bank_iter_delete (iter); - - choice = gnc_choose_radio_option_dialog - (parent, - _("Choose HBCI bank"), - _("More than one HBCI bank is available for \n" - "the requested operation. Please choose \n" - "the one that should be used."), - 0, - radio_list); - - for (node = radio_list; node; node = node->next) - g_free (node->data); - g_list_free (radio_list); - - i = 0; - for (iter = list_HBCI_Bank_begin (banklist); - !list_HBCI_Bank_iter_equal(iter, end); - list_HBCI_Bank_iter_next(iter)) - if (i == choice) - { - bank = list_HBCI_Bank_iter_get (iter); - list_HBCI_Bank_iter_delete (iter); - list_HBCI_Bank_iter_delete (end); - return bank; - } - else - ++i; - } - - g_assert_not_reached(); - return NULL; -} - -static const HBCI_Customer * -choose_one_customer (gncUIWidget parent, const list_HBCI_Customer *custlist) -{ - const HBCI_Customer *customer; - list_HBCI_Customer_iter *iter, *end; - g_assert(parent); - g_assert(custlist); - - if (list_HBCI_Customer_size (custlist) == 0) { - printf ("choose_one_customer: oops, no customer found.\n"); - return NULL; - } - if (list_HBCI_Customer_size (custlist) == 1) - { - /* Get one customer */ - iter = list_HBCI_Customer_begin (custlist); - customer = list_HBCI_Customer_iter_get (iter); - list_HBCI_Customer_iter_delete (iter); - - return customer; - } - - /* More than one customer available. */ - { - int choice, i; - GList *node; - GList *radio_list = NULL; - - end = list_HBCI_Customer_end (custlist); - for (iter = list_HBCI_Customer_begin (custlist); - !list_HBCI_Customer_iter_equal(iter, end); - list_HBCI_Customer_iter_next(iter)) - { - customer = list_HBCI_Customer_iter_get (iter); - radio_list = - g_list_append(radio_list, - g_strdup_printf ("%s (%s)", - HBCI_Customer_custName (customer), - HBCI_Customer_custId (customer))); - } - list_HBCI_Customer_iter_delete (iter); - - choice = gnc_choose_radio_option_dialog - (parent, - _("Choose HBCI customer"), - _("More than one HBCI customer is available for \n" - "the requested operation. Please choose \n" - "the one that should be used."), - 0, - radio_list); - - for (node = radio_list; node; node = node->next) - g_free (node->data); - g_list_free (radio_list); - - i = 0; - for (iter = list_HBCI_Customer_begin (custlist); - !list_HBCI_Customer_iter_equal(iter, end); - list_HBCI_Customer_iter_next(iter)) - if (i == choice) - { - customer = list_HBCI_Customer_iter_get (iter); - list_HBCI_Customer_iter_delete (iter); - list_HBCI_Customer_iter_delete (end); - return customer; - } - else - ++i; - } - - g_assert_not_reached(); - return NULL; -} - -static const HBCI_User * -choose_one_user (gncUIWidget parent, const list_HBCI_User *userlist) -{ - const HBCI_User *user; - list_HBCI_User_iter *iter, *end; - g_assert(parent); - g_assert(userlist); - - if (list_HBCI_User_size (userlist) == 0) { - printf("choose_one_user: oops, no user found.\n"); - return NULL; - } - if (list_HBCI_User_size (userlist) == 1) - { - /* Get one User */ - iter = list_HBCI_User_begin (userlist); - user = list_HBCI_User_iter_get (iter); - list_HBCI_User_iter_delete (iter); - - return user; - } - - /* More than one user available. */ - { - int choice, i; - GList *node; - GList *radio_list = NULL; - - end = list_HBCI_User_end (userlist); - for (iter = list_HBCI_User_begin (userlist); - !list_HBCI_User_iter_equal(iter, end); - list_HBCI_User_iter_next(iter)) - { - user = list_HBCI_User_iter_get (iter); - radio_list = g_list_append(radio_list, - g_strdup_printf ("%s (%s)", - HBCI_User_userName (user), - HBCI_User_userId (user))); - } - list_HBCI_User_iter_delete (iter); - - choice = gnc_choose_radio_option_dialog - (parent, - _("Choose HBCI user"), - _("More than one HBCI user is available for \n" - "the requested operation. Please choose \n" - "the one that should be used."), - 0, - radio_list); - - for (node = radio_list; node; node = node->next) - g_free (node->data); - g_list_free (radio_list); - - i = 0; - for (iter = list_HBCI_User_begin (userlist); - !list_HBCI_User_iter_equal(iter, end); - list_HBCI_User_iter_next(iter)) - if (i == choice) - { - user = list_HBCI_User_iter_get (iter); - list_HBCI_User_iter_delete (iter); - list_HBCI_User_iter_delete (end); - return user; - } - else - ++i; - } - - g_assert_not_reached(); - return NULL; -} static const HBCI_Customer * diff --git a/src/import-export/hbci/gnc-hbci-utils.c b/src/import-export/hbci/gnc-hbci-utils.c index 59d445bbfd..86c17ac5f6 100644 --- a/src/import-export/hbci/gnc-hbci-utils.c +++ b/src/import-export/hbci/gnc-hbci-utils.c @@ -545,24 +545,247 @@ gnc_hbci_get_first_customer(const HBCI_Account *h_acc) { /* Get one customer. */ const list_HBCI_Customer *custlist; - list_HBCI_Customer_iter *iter; - const HBCI_Customer *customer; custlist = HBCI_Account_authorizedCustomers (h_acc); g_assert (custlist); - switch (list_HBCI_Customer_size (custlist)) { - case 0: - printf("gnc_hbci_get_first_customer: No HBCI customer found.\n"); + return choose_one_customer(gnc_ui_get_toplevel (), custlist); +} + +const char *bank_to_str (const HBCI_Bank *bank) +{ + g_assert (bank); + return ((strlen(HBCI_Bank_name (bank)) > 0) ? + HBCI_Bank_name (bank) : + HBCI_Bank_bankCode(bank)); +} + + +const HBCI_Bank * +choose_one_bank (gncUIWidget parent, const list_HBCI_Bank *banklist) +{ + const HBCI_Bank *bank; + list_HBCI_Bank_iter *iter, *end; + int list_size; + g_assert (parent); + g_assert (banklist); + + /*printf("%d banks found.\n", list_HBCI_Bank_size (banklist));*/ + list_size = list_HBCI_Bank_size (banklist); + if (list_size == 0) return NULL; - case 1: - break; - default: - gnc_warning_dialog(gnc_ui_get_toplevel (), - "Sorry, Choosing one out of several HBCI Customers not yet implemented."); + + if (list_size == 1) + { + /* Get bank. */ + iter = list_HBCI_Bank_begin (banklist); + bank = list_HBCI_Bank_iter_get (iter); + list_HBCI_Bank_iter_delete (iter); + return bank; + } + + /* More than one bank available. */ + { + int choice, i; + GList *node; + GList *radio_list = NULL; + + end = list_HBCI_Bank_end (banklist); + for (iter = list_HBCI_Bank_begin (banklist); + !list_HBCI_Bank_iter_equal(iter, end); + list_HBCI_Bank_iter_next(iter)) + { + bank = list_HBCI_Bank_iter_get (iter); + radio_list = g_list_append(radio_list, + g_strdup_printf ("%s (%s)", + HBCI_Bank_name (bank), + HBCI_Bank_bankCode (bank))); + } + list_HBCI_Bank_iter_delete (iter); + + choice = gnc_choose_radio_option_dialog + (parent, + _("Choose HBCI bank"), + _("More than one HBCI bank is available for \n" + "the requested operation. Please choose \n" + "the one that should be used."), + 0, + radio_list); + + for (node = radio_list; node; node = node->next) + g_free (node->data); + g_list_free (radio_list); + + i = 0; + for (iter = list_HBCI_Bank_begin (banklist); + !list_HBCI_Bank_iter_equal(iter, end); + list_HBCI_Bank_iter_next(iter)) + if (i == choice) + { + bank = list_HBCI_Bank_iter_get (iter); + list_HBCI_Bank_iter_delete (iter); + list_HBCI_Bank_iter_delete (end); + return bank; + } + else + ++i; + } + + g_assert_not_reached(); + return NULL; +} + +const HBCI_Customer * +choose_one_customer (gncUIWidget parent, const list_HBCI_Customer *custlist) +{ + const HBCI_Customer *customer; + list_HBCI_Customer_iter *iter, *end; + g_assert(parent); + g_assert(custlist); + + if (list_HBCI_Customer_size (custlist) == 0) { + printf ("choose_one_customer: oops, no customer found.\n"); return NULL; } - iter = list_HBCI_Customer_begin (custlist); - customer = list_HBCI_Customer_iter_get (iter); - list_HBCI_Customer_iter_delete (iter); - return customer; + if (list_HBCI_Customer_size (custlist) == 1) + { + /* Get one customer */ + iter = list_HBCI_Customer_begin (custlist); + customer = list_HBCI_Customer_iter_get (iter); + list_HBCI_Customer_iter_delete (iter); + + return customer; + } + + /* More than one customer available. */ + { + int choice, i; + GList *node; + GList *radio_list = NULL; + + end = list_HBCI_Customer_end (custlist); + for (iter = list_HBCI_Customer_begin (custlist); + !list_HBCI_Customer_iter_equal(iter, end); + list_HBCI_Customer_iter_next(iter)) + { + customer = list_HBCI_Customer_iter_get (iter); + radio_list = + g_list_append(radio_list, + /* Translators: %s is the name of the + * customer. %s is the id of the customer. %s + * is the name of the bank. %s is the bank + * code. */ + g_strdup_printf (_("%s (%s) at bank %s (%s)"), + HBCI_Customer_custName (customer), + HBCI_Customer_custId (customer), + bank_to_str (HBCI_User_bank(HBCI_Customer_user(customer))), + HBCI_Bank_bankCode (HBCI_User_bank(HBCI_Customer_user(customer))))); + } + list_HBCI_Customer_iter_delete (iter); + + choice = gnc_choose_radio_option_dialog + (parent, + _("Choose HBCI customer"), + _("More than one HBCI customer is available for \n" + "the requested operation. Please choose \n" + "the one that should be used."), + 0, + radio_list); + + for (node = radio_list; node; node = node->next) + g_free (node->data); + g_list_free (radio_list); + + i = 0; + for (iter = list_HBCI_Customer_begin (custlist); + !list_HBCI_Customer_iter_equal(iter, end); + list_HBCI_Customer_iter_next(iter)) + if (i == choice) + { + customer = list_HBCI_Customer_iter_get (iter); + list_HBCI_Customer_iter_delete (iter); + list_HBCI_Customer_iter_delete (end); + return customer; + } + else + ++i; + } + + g_assert_not_reached(); + return NULL; +} + +const HBCI_User * +choose_one_user (gncUIWidget parent, const list_HBCI_User *userlist) +{ + const HBCI_User *user; + list_HBCI_User_iter *iter, *end; + g_assert(parent); + g_assert(userlist); + + if (list_HBCI_User_size (userlist) == 0) { + printf("choose_one_user: oops, no user found.\n"); + return NULL; + } + if (list_HBCI_User_size (userlist) == 1) + { + /* Get one User */ + iter = list_HBCI_User_begin (userlist); + user = list_HBCI_User_iter_get (iter); + list_HBCI_User_iter_delete (iter); + + return user; + } + + /* More than one user available. */ + { + int choice, i; + GList *node; + GList *radio_list = NULL; + + end = list_HBCI_User_end (userlist); + for (iter = list_HBCI_User_begin (userlist); + !list_HBCI_User_iter_equal(iter, end); + list_HBCI_User_iter_next(iter)) + { + user = list_HBCI_User_iter_get (iter); + radio_list = g_list_append + (radio_list, + g_strdup_printf (_("%s (%s) at bank %s (%s)"), + HBCI_User_userName (user), + HBCI_User_userId (user), + bank_to_str (HBCI_User_bank(user)), + HBCI_Bank_bankCode (HBCI_User_bank(user)))); + } + list_HBCI_User_iter_delete (iter); + + choice = gnc_choose_radio_option_dialog + (parent, + _("Choose HBCI user"), + _("More than one HBCI user is available for \n" + "the requested operation. Please choose \n" + "the one that should be used."), + 0, + radio_list); + + for (node = radio_list; node; node = node->next) + g_free (node->data); + g_list_free (radio_list); + + i = 0; + for (iter = list_HBCI_User_begin (userlist); + !list_HBCI_User_iter_equal(iter, end); + list_HBCI_User_iter_next(iter)) + if (i == choice) + { + user = list_HBCI_User_iter_get (iter); + list_HBCI_User_iter_delete (iter); + list_HBCI_User_iter_delete (end); + return user; + } + else + ++i; + } + + g_assert_not_reached(); + return NULL; } diff --git a/src/import-export/hbci/gnc-hbci-utils.h b/src/import-export/hbci/gnc-hbci-utils.h index 482e8e41b7..ea17532e9f 100644 --- a/src/import-export/hbci/gnc-hbci-utils.h +++ b/src/import-export/hbci/gnc-hbci-utils.h @@ -27,6 +27,7 @@ #include #include #include +#include "gnc-ui.h" #include "Account.h" #include "Transaction.h" #include "gnc-book.h" @@ -123,5 +124,38 @@ char *gnc_hbci_memo_tognc (const HBCI_Transaction *h_trans); const HBCI_Customer * gnc_hbci_get_first_customer(const HBCI_Account *h_acc); +/** Returns the name of this bank. This function is helpful because it + * always makes sure to return a valid const char pointer, even if no + * bankName is available. */ +const char *bank_to_str (const HBCI_Bank *bank); + +/** Chooses one bank out of the given list. + * + * If the list has more than one bank, this displays a multichoice + * dialog so that the user can choose one bank. If the list has only + * one bank, it returns it. If the list has zero banks, it returns + * NULL. */ +const HBCI_Bank * +choose_one_bank (gncUIWidget parent, const list_HBCI_Bank *banklist); + +/** Chooses one customer out of the given list. + * + * If the list has more than one customer, this displays a multichoice + * dialog so that the user can choose one customer. If the list has only + * one customer, it returns it. If the list has zero customers, it returns + * NULL. */ +const HBCI_Customer * +choose_one_customer (gncUIWidget parent, const list_HBCI_Customer *custlist); + +/** Chooses one user out of the given list. + * + * If the list has more than one user, this displays a multichoice + * dialog so that the user can choose one user. If the list has only + * one user, it returns it. If the list has zero users, it returns + * NULL. */ +const HBCI_User * +choose_one_user (gncUIWidget parent, const list_HBCI_User *userlist); + + #endif diff --git a/src/import-export/hbci/hbci-interaction.c b/src/import-export/hbci/hbci-interaction.c index 95d44fe4ea..15bfc4f4f9 100644 --- a/src/import-export/hbci/hbci-interaction.c +++ b/src/import-export/hbci/hbci-interaction.c @@ -37,6 +37,7 @@ #include "global-options.h" #include "dialog-pass.h" +#include "gnc-hbci-utils.h" #include @@ -145,15 +146,6 @@ void GNCInteractor_reparent (GNCInteractor *i, GtkWidget *new_parent) } } -/* Helper functions */ -static const char *bank_to_str (const HBCI_Bank *bank) -{ - g_assert (bank); - return ((strlen(HBCI_Bank_name (bank)) > 0) ? - HBCI_Bank_name (bank) : - HBCI_Bank_bankCode(bank)); -} - /******************************************************** * Now all the callback functions */