Mercurial > pidgin
comparison libpurple/protocols/jabber/jabber.c @ 29557: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
29556:342ed5917f56 | 29557: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 } |