Mercurial > pidgin.yaz
diff libpurple/account.c @ 15478:cb3800fabd76
The accounts request API now keeps track of a returned ui_handle for authorization requests, which can be closed on demand individually or all-at-once by account. When a connection is destroyed, its associated requests are closed.
author | Evan Schoenberg <evan.s@dreskin.net> |
---|---|
date | Wed, 31 Jan 2007 18:31:31 +0000 |
parents | 6d8728fd3dda |
children | f485c87e6546 |
line wrap: on
line diff
--- a/libpurple/account.c Wed Jan 31 05:47:22 2007 +0000 +++ b/libpurple/account.c Wed Jan 31 18:31:31 2007 +0000 @@ -57,6 +57,13 @@ } GaimAccountSetting; +typedef struct +{ + GaimAccountRequestType type; + GaimAccount *account; + void *ui_handle; + +} GaimAccountRequestInfo; static GaimAccountUiOps *account_ui_ops = NULL; @@ -64,6 +71,7 @@ static guint save_timer = 0; static gboolean accounts_loaded = FALSE; +static GList *handles = NULL; /********************************************************************* * Writing to disk * @@ -1053,21 +1061,82 @@ ui_ops->request_add(account, remote_user, id, alias, message); } -void +static void +gaim_account_request_close_info(GaimAccountRequestInfo *info) +{ + GaimAccountUiOps *ops; + + ops = gaim_accounts_get_ui_ops(); + + if (ops != NULL && ops->close_account_request != NULL) + ops->close_account_request(info->ui_handle); + + g_free(info); +} + +void +gaim_account_request_close_with_account(GaimAccount *account) +{ + GList *l, *l_next; + + g_return_if_fail(account != NULL); + + for (l = handles; l != NULL; l = l_next) { + GaimAccountRequestInfo *info = l->data; + + l_next = l->next; + + if (info->account == account) { + handles = g_list_remove(handles, info); + gaim_account_request_close_info(info); + } + } +} + +void +gaim_account_request_close(void *ui_handle) +{ + GList *l, *l_next; + + g_return_if_fail(ui_handle != NULL); + + for (l = handles; l != NULL; l = l_next) { + GaimAccountRequestInfo *info = l->data; + + l_next = l->next; + + if (info->ui_handle == ui_handle) { + handles = g_list_remove(handles, info); + gaim_account_request_close_info(info); + } + } +} + +void * gaim_account_request_authorization(GaimAccount *account, const char *remote_user, const char *id, const char *alias, const char *message, gboolean on_list, GCallback auth_cb, GCallback deny_cb, void *user_data) { - GaimAccountUiOps *ui_ops; - - g_return_if_fail(account != NULL); - g_return_if_fail(remote_user != NULL); - - ui_ops = gaim_accounts_get_ui_ops(); - - if (ui_ops != NULL && ui_ops->request_authorize != NULL) - ui_ops->request_authorize(account, remote_user, id, alias, message, on_list, auth_cb, deny_cb, user_data); - + GaimAccountUiOps *ui_ops; + GaimAccountRequestInfo *info; + + g_return_val_if_fail(account != NULL, NULL); + g_return_val_if_fail(remote_user != NULL, NULL); + + ui_ops = gaim_accounts_get_ui_ops(); + + if (ui_ops != NULL && ui_ops->request_authorize != NULL) { + info = g_new0(GaimAccountRequestInfo, 1); + info->type = GAIM_ACCOUNT_REQUEST_AUTHORIZATION; + info->account = account; + info->ui_handle = ui_ops->request_authorize(account, remote_user, id, alias, message, + on_list, auth_cb, deny_cb, user_data); + + handles = g_list_append(handles, info); + return info->ui_handle; + } + + return NULL; } static void