diff options
| -rw-r--r-- | protocols/purple/bpurple.h | 5 | ||||
| -rw-r--r-- | protocols/purple/purple.c | 62 | 
2 files changed, 66 insertions, 1 deletions
| diff --git a/protocols/purple/bpurple.h b/protocols/purple/bpurple.h index 364aef49..39677b86 100644 --- a/protocols/purple/bpurple.h +++ b/protocols/purple/bpurple.h @@ -4,9 +4,14 @@  #include <purple.h>  #include <glib.h> +#define PURPLE_REQUEST_HANDLE "purple_request" +  struct purple_data  {      PurpleAccount *account; + +    GHashTable *input_requests; +    guint next_request_id;  };  #endif /* !BPURPLE_H */ diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c index 004032c4..524313e6 100644 --- a/protocols/purple/purple.c +++ b/protocols/purple/purple.c @@ -39,6 +39,17 @@ static bee_t *local_bee;  static char *set_eval_display_name(set_t *set, char *value); +void purple_request_input_callback(guint id, struct im_connection *ic, +                                   const char *message, const char *who); + +/* purple_request_input specific stuff */ +typedef void (*ri_callback_t)(gpointer, const gchar *); + +struct request_input_data { +	ri_callback_t data_callback; +	void *user_data; +}; +  struct im_connection *purple_ic_by_pa(PurpleAccount *pa)  {  	GSList *i; @@ -310,6 +321,9 @@ static void purple_login(account_t *acc)  	ic->proto_data = pd = g_new0(struct purple_data, 1);  	pd->account = purple_account_new(acc->user, (char *) acc->prpl->data); +	pd->input_requests = g_hash_table_new_full(g_direct_hash, g_direct_equal, +	                                           NULL, g_free); +	pd->next_request_id = 0;  	purple_account_set_password(pd->account, acc->pass);  	purple_sync_settings(acc, pd->account); @@ -323,6 +337,7 @@ static void purple_logout(struct im_connection *ic)  	purple_account_set_enabled(pd->account, "BitlBee", FALSE);  	purple_connections = g_slist_remove(purple_connections, ic);  	purple_accounts_remove(pd->account); +	g_hash_table_destroy(pd->input_requests);  	g_free(pd);  } @@ -331,6 +346,12 @@ static int purple_buddy_msg(struct im_connection *ic, char *who, char *message,  	PurpleConversation *conv;  	struct purple_data *pd = ic->proto_data; +	if (!strncmp(who, PURPLE_REQUEST_HANDLE, sizeof(PURPLE_REQUEST_HANDLE) - 1)) { +		guint request_id = atoi(who + sizeof(PURPLE_REQUEST_HANDLE)); +		purple_request_input_callback(request_id, ic, message, who); +		return 1; +	} +  	if ((conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,  	                                                  who, pd->account)) == NULL) {  		conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, @@ -1067,9 +1088,48 @@ static void prplcb_request_test()  }  */ +void* prplcb_request_input(const char *title, const char *primary, +        const char *secondary, const char *default_value, gboolean multiline, +        gboolean masked, gchar *hint, const char *ok_text, GCallback ok_cb, +        const char *cancel_text, GCallback cancel_cb, PurpleAccount *account, +        const char *who, PurpleConversation *conv, void *user_data) +{ +	struct im_connection *ic = purple_ic_by_pa(account); +	struct purple_data *pd = ic->proto_data; +	struct request_input_data *ri = g_new0(struct request_input_data, 1); +	guint id = pd->next_request_id++; +	gchar *buddy = g_strdup_printf("%s_%u", PURPLE_REQUEST_HANDLE, id); + +	ri->data_callback = (ri_callback_t) ok_cb; +	ri->user_data = user_data; +	g_hash_table_insert(pd->input_requests, GUINT_TO_POINTER(id), ri); + +	imcb_add_buddy(ic, buddy, NULL); +	imcb_buddy_msg(ic, buddy, secondary, 0, 0); + +	g_free(buddy); +	return 0; +} + +void purple_request_input_callback(guint id, struct im_connection *ic, +                                   const char *message, const char *who) +{ +	struct purple_data *pd = ic->proto_data; +	struct request_input_data *ri = g_hash_table_lookup(pd->input_requests, +	                                                    GUINT_TO_POINTER(id)); + +	if (ri) { +		ri->data_callback(ri->user_data, message); +	} + +	imcb_remove_buddy(ic, who, NULL); +	g_hash_table_remove(pd->input_requests, GUINT_TO_POINTER(id)); +} + +  static PurpleRequestUiOps bee_request_uiops =  { -	NULL, +	prplcb_request_input,  	NULL,  	prplcb_request_action,  	NULL, | 
