| 101 g_simple_action_set_enabled(dialog->add_action, FALSE); |
101 g_simple_action_set_enabled(dialog->add_action, FALSE); |
| 102 */ |
102 */ |
| 103 } |
103 } |
| 104 } |
104 } |
| 105 |
105 |
| 106 static char * |
|
| 107 pidgin_disco_get_icon_name(XmppDiscoService *service) |
|
| 108 { |
|
| 109 char *icon_name = NULL; |
|
| 110 |
|
| 111 g_return_val_if_fail(service != NULL, NULL); |
|
| 112 |
|
| 113 if (service->type == XMPP_DISCO_SERVICE_TYPE_GATEWAY && service->gateway_type) { |
|
| 114 icon_name = g_strconcat("im-", service->gateway_type, NULL); |
|
| 115 #if 0 |
|
| 116 } else if (service->type == XMPP_DISCO_SERVICE_TYPE_USER) { |
|
| 117 icon_name = g_strdup("person"); |
|
| 118 #endif |
|
| 119 } else if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT) { |
|
| 120 icon_name = g_strdup("chat"); |
|
| 121 } |
|
| 122 |
|
| 123 return icon_name; |
|
| 124 } |
|
| 125 |
|
| 126 static void |
106 static void |
| 127 dialog_select_account_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec, |
107 dialog_select_account_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec, |
| 128 gpointer data) |
108 gpointer data) |
| 129 { |
109 { |
| 130 PidginDiscoDialog *dialog = data; |
110 PidginDiscoDialog *dialog = data; |
| 144 gpointer data) |
124 gpointer data) |
| 145 { |
125 { |
| 146 PidginDiscoDialog *dialog = data; |
126 PidginDiscoDialog *dialog = data; |
| 147 XmppDiscoService *service = dialog->selected; |
127 XmppDiscoService *service = dialog->selected; |
| 148 |
128 |
| 149 g_return_if_fail(service != NULL); |
129 g_return_if_fail(XMPP_DISCO_IS_SERVICE(service)); |
| 150 |
130 |
| 151 xmpp_disco_service_register(service); |
131 xmpp_disco_register_service(service); |
| 152 } |
132 } |
| 153 |
133 |
| 154 static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server) |
134 static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server) |
| 155 { |
135 { |
| 156 pdl->dialog->prompt_handle = NULL; |
136 pdl->dialog->prompt_handle = NULL; |
| 246 G_GNUC_UNUSED GVariant *parameter, |
226 G_GNUC_UNUSED GVariant *parameter, |
| 247 gpointer data) |
227 gpointer data) |
| 248 { |
228 { |
| 249 PidginDiscoDialog *dialog = data; |
229 PidginDiscoDialog *dialog = data; |
| 250 XmppDiscoService *service = dialog->selected; |
230 XmppDiscoService *service = dialog->selected; |
| |
231 PidginDiscoList *list = NULL; |
| 251 PurpleAccount *account; |
232 PurpleAccount *account; |
| 252 const char *jid; |
233 const char *jid; |
| 253 |
234 |
| 254 g_return_if_fail(service != NULL); |
235 g_return_if_fail(XMPP_DISCO_IS_SERVICE(service)); |
| 255 |
236 |
| 256 account = purple_connection_get_account(service->list->pc); |
237 list = xmpp_disco_service_get_list(service); |
| 257 jid = service->jid; |
238 account = purple_connection_get_account(list->pc); |
| 258 |
239 jid = xmpp_disco_service_get_jid(service); |
| 259 if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT) { |
240 |
| |
241 if(xmpp_disco_service_get_service_type(service) == XMPP_DISCO_SERVICE_TYPE_CHAT) { |
| 260 purple_blist_request_add_chat(account, NULL, NULL, jid); |
242 purple_blist_request_add_chat(account, NULL, NULL, jid); |
| 261 } else { |
243 } else { |
| 262 purple_blist_request_add_buddy(account, jid, NULL, NULL); |
244 purple_blist_request_add_buddy(account, jid, NULL, NULL); |
| 263 } |
245 } |
| 264 } |
246 } |
| 316 val.g_type = 0; |
298 val.g_type = 0; |
| 317 gtk_tree_model_get_value(GTK_TREE_MODEL(dialog->model), &iter, |
299 gtk_tree_model_get_value(GTK_TREE_MODEL(dialog->model), &iter, |
| 318 SERVICE_COLUMN, &val); |
300 SERVICE_COLUMN, &val); |
| 319 dialog->selected = g_value_get_pointer(&val); |
301 dialog->selected = g_value_get_pointer(&val); |
| 320 if (dialog->selected != NULL) { |
302 if (dialog->selected != NULL) { |
| 321 allow_add = (dialog->selected->flags & XMPP_DISCO_ADD); |
303 XmppDiscoServiceFlags flags = xmpp_disco_service_get_flags(dialog->selected); |
| 322 allow_register = (dialog->selected->flags & XMPP_DISCO_REGISTER); |
304 allow_add = (flags & XMPP_DISCO_ADD) != 0; |
| |
305 allow_register = (flags & XMPP_DISCO_REGISTER) != 0; |
| 323 } |
306 } |
| 324 } |
307 } |
| 325 |
308 |
| 326 g_simple_action_set_enabled(dialog->add_action, allow_add); |
309 g_simple_action_set_enabled(dialog->add_action, allow_add); |
| 327 g_simple_action_set_enabled(dialog->register_action, allow_register); |
310 g_simple_action_set_enabled(dialog->register_action, allow_register); |
| 360 val.g_type = 0; |
344 val.g_type = 0; |
| 361 gtk_tree_model_get_value(GTK_TREE_MODEL(dialog->model), &iter, |
345 gtk_tree_model_get_value(GTK_TREE_MODEL(dialog->model), &iter, |
| 362 SERVICE_COLUMN, &val); |
346 SERVICE_COLUMN, &val); |
| 363 service = g_value_get_pointer(&val); |
347 service = g_value_get_pointer(&val); |
| 364 |
348 |
| 365 if (service->flags & XMPP_DISCO_BROWSE) { |
349 flags = xmpp_disco_service_get_flags(service); |
| |
350 if((flags & XMPP_DISCO_BROWSE) != 0) { |
| 366 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(dialog->tree), path)) { |
351 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(dialog->tree), path)) { |
| 367 gtk_tree_view_collapse_row(GTK_TREE_VIEW(dialog->tree), path); |
352 gtk_tree_view_collapse_row(GTK_TREE_VIEW(dialog->tree), path); |
| 368 } else { |
353 } else { |
| 369 gtk_tree_view_expand_row(GTK_TREE_VIEW(dialog->tree), path, FALSE); |
354 gtk_tree_view_expand_row(GTK_TREE_VIEW(dialog->tree), path, FALSE); |
| 370 } |
355 } |
| 371 } else if (service->flags & XMPP_DISCO_REGISTER) { |
356 } else if((flags & XMPP_DISCO_REGISTER) != 0) { |
| 372 g_action_activate(G_ACTION(dialog->register_action), NULL); |
357 g_action_activate(G_ACTION(dialog->register_action), NULL); |
| 373 } else if (service->flags & XMPP_DISCO_ADD) { |
358 } else if((flags & XMPP_DISCO_ADD) != 0) { |
| 374 g_action_activate(G_ACTION(dialog->add_action), NULL); |
359 g_action_activate(G_ACTION(dialog->add_action), NULL); |
| 375 } |
360 } |
| 376 } |
361 } |
| 377 |
362 |
| 378 static void |
363 static void |
| 480 case XMPP_DISCO_SERVICE_TYPE_OTHER: |
465 case XMPP_DISCO_SERVICE_TYPE_OTHER: |
| 481 type = _("Other"); |
466 type = _("Other"); |
| 482 break; |
467 break; |
| 483 } |
468 } |
| 484 |
469 |
| 485 name = g_markup_escape_text(service->name, -1); |
470 name = g_markup_escape_text(xmpp_disco_service_get_name(service), -1); |
| 486 jid = g_markup_escape_text(service->jid, -1); |
471 jid = g_markup_escape_text(xmpp_disco_service_get_jid(service), -1); |
| 487 if (service->description != NULL) { |
472 if(xmpp_disco_service_get_description(service) != NULL) { |
| 488 desc = g_markup_escape_text(service->description, -1); |
473 desc = g_markup_escape_text(xmpp_disco_service_get_description(service), |
| |
474 -1); |
| 489 } |
475 } |
| 490 |
476 |
| 491 markup = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>\n<b>%s:</b> %s%s%s", |
477 markup = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>\n<b>%s:</b> %s%s%s", |
| 492 name, type, jid, |
478 name, type, jid, |
| 493 service->description ? _("\n<b>Description:</b> ") : "", |
479 desc != NULL ? _("\n<b>Description:</b> ") : "", |
| 494 service->description ? desc : ""); |
480 desc != NULL ? desc : ""); |
| 495 |
481 |
| 496 gtk_tooltip_set_markup(tooltip, markup); |
482 gtk_tooltip_set_markup(tooltip, markup); |
| 497 gtk_tree_view_set_tooltip_row(GTK_TREE_VIEW(widget), tooltip, path); |
483 gtk_tree_view_set_tooltip_row(GTK_TREE_VIEW(widget), tooltip, path); |
| 498 |
484 |
| 499 g_free(markup); |
485 g_free(markup); |
| 661 |
647 |
| 662 dialog = pdl->dialog; |
648 dialog = pdl->dialog; |
| 663 g_return_if_fail(dialog != NULL); |
649 g_return_if_fail(dialog != NULL); |
| 664 |
650 |
| 665 if (service != NULL) { |
651 if (service != NULL) { |
| 666 purple_debug_info("xmppdisco", "Adding service \"%s\"", service->name); |
652 purple_debug_info("xmppdisco", "Adding service \"%s\"", |
| |
653 xmpp_disco_service_get_name(service)); |
| 667 } else { |
654 } else { |
| 668 purple_debug_info("xmppdisco", "Service \"%s\" has no children", |
655 purple_debug_info("xmppdisco", "Service \"%s\" has no children", |
| 669 parent->name); |
656 xmpp_disco_service_get_name(parent)); |
| 670 } |
657 } |
| 671 |
658 |
| 672 gtk_progress_bar_pulse(GTK_PROGRESS_BAR(dialog->progress)); |
659 gtk_progress_bar_pulse(GTK_PROGRESS_BAR(dialog->progress)); |
| 673 |
660 |
| 674 if (parent) { |
661 if (parent) { |
| 708 (parent ? &parent_iter : NULL)); |
695 (parent ? &parent_iter : NULL)); |
| 709 } else { |
696 } else { |
| 710 iter = child; |
697 iter = child; |
| 711 } |
698 } |
| 712 |
699 |
| 713 if (service->flags & XMPP_DISCO_BROWSE) { |
700 if((xmpp_disco_service_get_flags(service) & XMPP_DISCO_BROWSE) != 0) { |
| 714 GtkTreeRowReference *rr; |
701 GtkTreeRowReference *rr; |
| 715 GtkTreePath *path; |
702 GtkTreePath *path; |
| 716 |
703 |
| 717 gtk_tree_store_append(dialog->model, &child, &iter); |
704 gtk_tree_store_append(dialog->model, &child, &iter); |
| 718 |
705 |
| 722 path); |
709 path); |
| 723 g_hash_table_insert(pdl->services, service, rr); |
710 g_hash_table_insert(pdl->services, service, rr); |
| 724 gtk_tree_path_free(path); |
711 gtk_tree_path_free(path); |
| 725 } |
712 } |
| 726 |
713 |
| 727 icon_name = pidgin_disco_get_icon_name(service); |
714 icon_name = xmpp_disco_service_get_icon_name(service); |
| 728 |
715 |
| 729 gtk_tree_store_set(dialog->model, &iter, ICON_NAME_COLUMN, icon_name, |
716 gtk_tree_store_set(dialog->model, &iter, ICON_NAME_COLUMN, icon_name, |
| 730 NAME_COLUMN, service->name, DESCRIPTION_COLUMN, |
717 NAME_COLUMN, xmpp_disco_service_get_name(service), |
| 731 service->description, SERVICE_COLUMN, service, -1); |
718 DESCRIPTION_COLUMN, xmpp_disco_service_get_description(service), |
| |
719 SERVICE_COLUMN, service, -1); |
| 732 |
720 |
| 733 g_free(icon_name); |
721 g_free(icon_name); |
| 734 } |
722 } |
| 735 |
723 |