diff options
-rw-r--r-- | e-util/ChangeLog | 11 | ||||
-rw-r--r-- | e-util/e-account-list.c | 166 | ||||
-rw-r--r-- | e-util/e-account-list.h | 25 |
3 files changed, 197 insertions, 5 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog index 1601851dde..9c1e4b9296 100644 --- a/e-util/ChangeLog +++ b/e-util/ChangeLog @@ -1,3 +1,14 @@ +2003-02-20 Not Zed <NotZed@Ximian.com> + + * e-account-list.c (e_account_list_get_default): helper to get the + dfault account. + (e_account_list_set_default): helper to set the default account. + (e_account_list_find): Helper to find accounts based on differnet + key types. + (e_account_list_add): helper to add account + emit added event. + (e_account_list_change): helper to emit changed event. + (e_account_list_remove): herlper to remove account + emit changed event. + 2003-02-22 Hans Petter Jansson <hpj@ximian.com> * e-categories-config.c (e_categories_config_open_dialog_for_entry): diff --git a/e-util/e-account-list.c b/e-util/e-account-list.c index e7d2b2f66b..32d44451e7 100644 --- a/e-util/e-account-list.c +++ b/e-util/e-account-list.c @@ -286,3 +286,169 @@ e_account_list_save (EAccountList *account_list) gconf_client_suggest_sync (account_list->priv->gconf, NULL); } + +/** + * e_account_list_add: + * @accounts: + * @account: + * + * Add an account to the account list. Will emit the account-changed + * event. + **/ +void +e_account_list_add(EAccountList *accounts, EAccount *account) +{ + /* FIXME: should we check for duplicate accounts? */ + + e_list_append ((EList *)accounts, account); + g_signal_emit(accounts, signals[ACCOUNT_ADDED], 0, account); +} + +/** + * e_account_list_change: + * @accounts: + * @account: + * + * Signal that the details of an account have changed. + **/ +void +e_account_list_change(EAccountList *accounts, EAccount *account) +{ + /* maybe the account should do this itself ... */ + g_signal_emit(accounts, signals[ACCOUNT_CHANGED], 0, account); +} + +/** + * e_account_list_remove: + * @accounts: + * @account: + * + * Remove an account from the account list, and emit the + * account-removed signal. If the account was the default account, + * then reset the default to the first account. + **/ +void +e_account_list_remove(EAccountList *accounts, EAccount *account) +{ + if (account == e_account_list_get_default(accounts)) + gconf_client_unset (accounts->priv->gconf, "/apps/evolution/mail/default_account", NULL); + + /* not sure if need to ref but no harm */ + g_object_ref (account); + e_list_remove ((EList *) accounts, account); + g_signal_emit(accounts, signals[ACCOUNT_REMOVED], 0, account); + g_object_unref (account); +} + +/** + * e_account_list_get_default: + * @accounts: + * + * Get the default account. If no default is specified, or the default + * has become stale, then the first account is made the default. + * + * Return value: The account or NULL if no accounts are defined. + **/ +const EAccount * +e_account_list_get_default(EAccountList *accounts) +{ + char *uid; + EIterator *it; + const EAccount *account = NULL; + + uid = gconf_client_get_string (accounts->priv->gconf, "/apps/evolution/mail/default_account", NULL); + it = e_list_get_iterator ((EList *)accounts); + + if (uid) { + for (;e_iterator_is_valid (it);e_iterator_next (it)) { + account = (const EAccount *)e_iterator_get (it); + + if (!strcmp(uid, account->uid)) + break; + account = NULL; + } + e_iterator_reset(it); + } + + /* no uid or uid not found, @it will be at the first account */ + if (account == NULL && e_iterator_is_valid(it)) { + account = (const EAccount *) e_iterator_get (it); + gconf_client_set_string (accounts->priv->gconf, "/apps/evolution/mail/default_account", account->uid, NULL); + } + + g_object_unref(it); + g_free(uid); + + return account; +} + +/** + * e_account_list_set_default: + * @accounts: + * @account: + * + * Set the account @account to be the default account. + **/ +void +e_account_list_set_default(EAccountList *accounts, EAccount *account) +{ + gconf_client_set_string (accounts->priv->gconf, "/apps/evolution/mail/default_account", account->uid, NULL); +} + +/** + * e_account_list_find: + * @accounts: + * @type: Type of search. + * @key: Search key. + * + * Perform a search of the account list on a single key. + * + * @type must be set from one of the following search types: + * E_ACCOUNT_FIND_NAME - Find an account by account name. + * E_ACCOUNT_FIND_ID_NAME - Find an account by the owner's identity name. + * E_ACCOUNT_FIND_ID_ADDRESS - Find an account by the owner's identity address. + * + * Return value: The account or NULL if it doesn't exist. + **/ +const EAccount * +e_account_list_find(EAccountList *accounts, e_account_find_t type, const char *key) +{ + char *val; + EIterator *it; + const EAccount *account = NULL; + + /* this could use a callback for more flexibility ... + ... but this makes the common cases easier */ + + for (it = e_list_get_iterator ((EList *)accounts); + e_iterator_is_valid (it); + e_iterator_next (it)) { + int found = 0; + + account = (const EAccount *)e_iterator_get (it); + + val = NULL; + switch(type) { + case E_ACCOUNT_FIND_NAME: + found = strcmp(account->name, key) == 0; + break; + case E_ACCOUNT_FIND_ID_NAME: + if (account->id) + found = strcmp(account->id->name, key) == 0; + break; + case E_ACCOUNT_FIND_ID_ADDRESS: + if (account->id) + found = g_ascii_strcasecmp(account->id->address, key) == 0; + break; + } + + if (found) + break; + + account = NULL; + } + g_object_unref(it); + + return account; +} + diff --git a/e-util/e-account-list.h b/e-util/e-account-list.h index 6a8a1c7505..2ad0896307 100644 --- a/e-util/e-account-list.h +++ b/e-util/e-account-list.h @@ -32,6 +32,13 @@ typedef struct EAccountListPrivate EAccountListPrivate; +/* search options for the find command */ +typedef enum _e_account_find_t { + E_ACCOUNT_FIND_NAME, + E_ACCOUNT_FIND_ID_NAME, + E_ACCOUNT_FIND_ID_ADDRESS, +} e_account_find_t; + typedef struct { EList parent_object; @@ -48,12 +55,20 @@ typedef struct { } EAccountListClass; -GType e_account_list_get_type (void); +GType e_account_list_get_type (void); + +EAccountList *e_account_list_new (GConfClient *gconf); +void e_account_list_construct (EAccountList *account_list, + GConfClient *gconf); + +void e_account_list_save (EAccountList *account_list); -EAccountList *e_account_list_new (GConfClient *gconf); -void e_account_list_construct (EAccountList *account_list, - GConfClient *gconf); +void e_account_list_add (EAccountList *, EAccount *); +void e_account_list_change (EAccountList *, EAccount *); +void e_account_list_remove (EAccountList *, EAccount *); -void e_account_list_save (EAccountList *account_list); +const EAccount *e_account_list_get_default(EAccountList *); +void e_account_list_set_default(EAccountList *, EAccount *); +const EAccount *e_account_list_find (EAccountList *, e_account_find_t type, const char *key); #endif /* __E_ACCOUNT_LIST__ */ |