comparison libpurple/protocols/jabber/jabber.c @ 29957:a694731e8b3f

jabber: Move the initialization into the jabber plugin, and only initialize some things once. This would allow multiple plugins to use the jabber plugin /properly/ (and ref-counted!). Commands still need to be fixed.
author Paul Aurich <paul@darkrain42.org>
date Tue, 09 Mar 2010 18:59:08 +0000
parents 342ed5917f56
children d93676b59db1
comparison
equal deleted inserted replaced
29956:342ed5917f56 29957:a694731e8b3f
73 #define PING_TIMEOUT 60 73 #define PING_TIMEOUT 60
74 74
75 GList *jabber_features = NULL; 75 GList *jabber_features = NULL;
76 GList *jabber_identities = NULL; 76 GList *jabber_identities = NULL;
77 static GSList *jabber_cmds = NULL; 77 static GSList *jabber_cmds = NULL;
78
79 static gint plugin_ref = 0;
78 80
79 static void jabber_unregister_account_cb(JabberStream *js); 81 static void jabber_unregister_account_cb(JabberStream *js);
80 static void try_srv_connect(JabberStream *js); 82 static void try_srv_connect(JabberStream *js);
81 83
82 static void jabber_stream_init(JabberStream *js) 84 static void jabber_stream_init(JabberStream *js)
3517 3519
3518 /* send presence with new caps info for all connected accounts */ 3520 /* send presence with new caps info for all connected accounts */
3519 jabber_caps_broadcast_change(); 3521 jabber_caps_broadcast_change();
3520 } 3522 }
3521 3523
3522 void 3524 static void
3523 jabber_init_plugin(PurplePlugin *plugin) 3525 jabber_do_init(void)
3524 { 3526 {
3525 GHashTable *ui_info = purple_core_get_ui_info(); 3527 GHashTable *ui_info = purple_core_get_ui_info();
3526 const gchar *ui_type; 3528 const gchar *ui_type;
3527 const gchar *type = "pc"; /* default client type, if unknown or 3529 const gchar *type = "pc"; /* default client type, if unknown or
3528 unspecified */ 3530 unspecified */
3588 3590
3589 g_signal_connect(G_OBJECT(purple_media_manager_get()), "ui-caps-changed", 3591 g_signal_connect(G_OBJECT(purple_media_manager_get()), "ui-caps-changed",
3590 G_CALLBACK(jabber_caps_broadcast_change), NULL); 3592 G_CALLBACK(jabber_caps_broadcast_change), NULL);
3591 #endif 3593 #endif
3592 3594
3595 /* TODO: This needs to be per-plugin */
3596 jabber_register_commands();
3597
3598 /* reverse order of unload_plugin */
3599 jabber_iq_init();
3600 jabber_caps_init();
3601 /* PEP things should be init via jabber_pep_init, not here */
3602 jabber_pep_init();
3603 jabber_data_init();
3604 jabber_bosh_init();
3605
3606 /* TODO: Implement adding and retrieving own features via IPC API */
3607
3608 jabber_ibb_init();
3609 jabber_si_init();
3610
3593 jabber_auth_init(); 3611 jabber_auth_init();
3612 }
3613
3614 static void
3615 jabber_do_uninit(void)
3616 {
3617 /* reverse order of jabber_do_init */
3618 jabber_bosh_uninit();
3619 jabber_data_uninit();
3620 jabber_si_uninit();
3621 jabber_ibb_uninit();
3622 /* PEP things should be uninit via jabber_pep_uninit, not here */
3623 jabber_pep_uninit();
3624 jabber_caps_uninit();
3625 jabber_presence_uninit();
3626 jabber_iq_uninit();
3627
3628 /* TODO: This needs to be per-main plugin */
3629 jabber_unregister_commands();
3630
3631 jabber_auth_uninit();
3632 jabber_features_destroy();
3633 jabber_identities_destroy();
3634 }
3635
3636 void jabber_plugin_init(PurplePlugin *plugin)
3637 {
3638 ++plugin_ref;
3639
3640 if (plugin_ref == 1)
3641 jabber_do_init();
3594 3642
3595 /* IPC functions */ 3643 /* IPC functions */
3596 purple_plugin_ipc_register(plugin, "contact_has_feature", PURPLE_CALLBACK(jabber_ipc_contact_has_feature), 3644 purple_plugin_ipc_register(plugin, "contact_has_feature", PURPLE_CALLBACK(jabber_ipc_contact_has_feature),
3597 purple_marshal_BOOLEAN__POINTER_POINTER_POINTER, 3645 purple_marshal_BOOLEAN__POINTER_POINTER_POINTER,
3598 purple_value_new(PURPLE_TYPE_BOOLEAN), 3, 3646 purple_value_new(PURPLE_TYPE_BOOLEAN), 3,
3603 purple_plugin_ipc_register(plugin, "add_feature", PURPLE_CALLBACK(jabber_ipc_add_feature), 3651 purple_plugin_ipc_register(plugin, "add_feature", PURPLE_CALLBACK(jabber_ipc_add_feature),
3604 purple_marshal_VOID__POINTER, 3652 purple_marshal_VOID__POINTER,
3605 NULL, 1, 3653 NULL, 1,
3606 purple_value_new(PURPLE_TYPE_STRING)); 3654 purple_value_new(PURPLE_TYPE_STRING));
3607 3655
3608 /* Modifying these? Look at libxmpp.c:load_plugin for the signal versions */
3609 purple_plugin_ipc_register(plugin, "register_namespace_watcher", 3656 purple_plugin_ipc_register(plugin, "register_namespace_watcher",
3610 PURPLE_CALLBACK(jabber_iq_signal_register), 3657 PURPLE_CALLBACK(jabber_iq_signal_register),
3611 purple_marshal_VOID__POINTER_POINTER, 3658 purple_marshal_VOID__POINTER_POINTER,
3612 NULL, 2, 3659 NULL, 2,
3613 purple_value_new(PURPLE_TYPE_STRING), /* node */ 3660 purple_value_new(PURPLE_TYPE_STRING), /* node */
3617 PURPLE_CALLBACK(jabber_iq_signal_unregister), 3664 PURPLE_CALLBACK(jabber_iq_signal_unregister),
3618 purple_marshal_VOID__POINTER_POINTER, 3665 purple_marshal_VOID__POINTER_POINTER,
3619 NULL, 2, 3666 NULL, 2,
3620 purple_value_new(PURPLE_TYPE_STRING), /* node */ 3667 purple_value_new(PURPLE_TYPE_STRING), /* node */
3621 purple_value_new(PURPLE_TYPE_STRING)); /* namespace */ 3668 purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
3622 } 3669
3623 3670 purple_signal_register(plugin, "jabber-register-namespace-watcher",
3624 void 3671 purple_marshal_VOID__POINTER_POINTER,
3625 jabber_uninit_plugin(PurplePlugin *plugin) 3672 NULL, 2,
3626 { 3673 purple_value_new(PURPLE_TYPE_STRING), /* node */
3674 purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
3675
3676 purple_signal_register(plugin, "jabber-unregister-namespace-watcher",
3677 purple_marshal_VOID__POINTER_POINTER,
3678 NULL, 2,
3679 purple_value_new(PURPLE_TYPE_STRING), /* node */
3680 purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
3681
3682 purple_signal_connect(plugin, "jabber-register-namespace-watcher",
3683 plugin, PURPLE_CALLBACK(jabber_iq_signal_register), NULL);
3684 purple_signal_connect(plugin, "jabber-unregister-namespace-watcher",
3685 plugin, PURPLE_CALLBACK(jabber_iq_signal_unregister), NULL);
3686
3687
3688 purple_signal_register(plugin, "jabber-receiving-xmlnode",
3689 purple_marshal_VOID__POINTER_POINTER, NULL, 2,
3690 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
3691 purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
3692
3693 purple_signal_register(plugin, "jabber-sending-xmlnode",
3694 purple_marshal_VOID__POINTER_POINTER, NULL, 2,
3695 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
3696 purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
3697
3698 /*
3699 * Do not remove this or the plugin will fail. Completely. You have been
3700 * warned!
3701 */
3702 purple_signal_connect_priority(plugin, "jabber-sending-xmlnode",
3703 plugin, PURPLE_CALLBACK(jabber_send_signal_cb),
3704 NULL, PURPLE_SIGNAL_PRIORITY_HIGHEST);
3705
3706 purple_signal_register(plugin, "jabber-sending-text",
3707 purple_marshal_VOID__POINTER_POINTER, NULL, 2,
3708 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
3709 purple_value_new_outgoing(PURPLE_TYPE_STRING));
3710
3711 purple_signal_register(plugin, "jabber-receiving-message",
3712 purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER,
3713 purple_value_new(PURPLE_TYPE_BOOLEAN), 6,
3714 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
3715 purple_value_new(PURPLE_TYPE_STRING), /* type */
3716 purple_value_new(PURPLE_TYPE_STRING), /* id */
3717 purple_value_new(PURPLE_TYPE_STRING), /* from */
3718 purple_value_new(PURPLE_TYPE_STRING), /* to */
3719 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
3720
3721 purple_signal_register(plugin, "jabber-receiving-iq",
3722 purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
3723 purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
3724 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
3725 purple_value_new(PURPLE_TYPE_STRING), /* type */
3726 purple_value_new(PURPLE_TYPE_STRING), /* id */
3727 purple_value_new(PURPLE_TYPE_STRING), /* from */
3728 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
3729
3730 purple_signal_register(plugin, "jabber-watched-iq",
3731 purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
3732 purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
3733 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
3734 purple_value_new(PURPLE_TYPE_STRING), /* type */
3735 purple_value_new(PURPLE_TYPE_STRING), /* id */
3736 purple_value_new(PURPLE_TYPE_STRING), /* from */
3737 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); /* child */
3738
3739 purple_signal_register(plugin, "jabber-receiving-presence",
3740 purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER,
3741 purple_value_new(PURPLE_TYPE_BOOLEAN), 4,
3742 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
3743 purple_value_new(PURPLE_TYPE_STRING), /* type */
3744 purple_value_new(PURPLE_TYPE_STRING), /* from */
3745 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
3746 }
3747
3748 void jabber_plugin_uninit(PurplePlugin *plugin)
3749 {
3750 g_return_if_fail(plugin_ref > 0);
3751
3752 purple_signals_unregister_by_instance(plugin);
3627 purple_plugin_ipc_unregister_all(plugin); 3753 purple_plugin_ipc_unregister_all(plugin);
3628 3754
3629 jabber_auth_uninit(); 3755 --plugin_ref;
3630 jabber_features_destroy(); 3756 if (plugin_ref == 0)
3631 jabber_identities_destroy(); 3757 jabber_do_uninit();
3632 } 3758 }