133
140
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
134
141
purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
144
* Do not remove this or the plugin will fail. Completely. You have been
147
purple_signal_connect_priority(plugin, "jabber-sending-xmlnode",
148
plugin, PURPLE_CALLBACK(jabber_send_signal_cb),
149
NULL, PURPLE_SIGNAL_PRIORITY_HIGHEST);
136
151
purple_signal_register(plugin, "jabber-sending-text",
137
152
purple_marshal_VOID__POINTER_POINTER, NULL, 2,
138
153
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
139
154
purple_value_new_outgoing(PURPLE_TYPE_STRING));
156
purple_signal_register(plugin, "jabber-receiving-message",
157
purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER,
158
purple_value_new(PURPLE_TYPE_BOOLEAN), 6,
159
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
160
purple_value_new(PURPLE_TYPE_STRING), /* type */
161
purple_value_new(PURPLE_TYPE_STRING), /* id */
162
purple_value_new(PURPLE_TYPE_STRING), /* from */
163
purple_value_new(PURPLE_TYPE_STRING), /* to */
164
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
166
purple_signal_register(plugin, "jabber-receiving-iq",
167
purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
168
purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
169
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
170
purple_value_new(PURPLE_TYPE_STRING), /* type */
171
purple_value_new(PURPLE_TYPE_STRING), /* id */
172
purple_value_new(PURPLE_TYPE_STRING), /* from */
173
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
175
purple_signal_register(plugin, "jabber-watched-iq",
176
purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
177
purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
178
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
179
purple_value_new(PURPLE_TYPE_STRING), /* type */
180
purple_value_new(PURPLE_TYPE_STRING), /* id */
181
purple_value_new(PURPLE_TYPE_STRING), /* from */
182
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); /* child */
184
/* Modifying these? Look at jabber_init_plugin for the ipc versions */
185
purple_signal_register(plugin, "jabber-register-namespace-watcher",
186
purple_marshal_VOID__POINTER_POINTER,
188
purple_value_new(PURPLE_TYPE_STRING), /* node */
189
purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
191
purple_signal_register(plugin, "jabber-unregister-namespace-watcher",
192
purple_marshal_VOID__POINTER_POINTER,
194
purple_value_new(PURPLE_TYPE_STRING), /* node */
195
purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
197
purple_signal_connect(plugin, "jabber-register-namespace-watcher",
198
plugin, PURPLE_CALLBACK(jabber_iq_signal_register), NULL);
199
purple_signal_connect(plugin, "jabber-unregister-namespace-watcher",
200
plugin, PURPLE_CALLBACK(jabber_iq_signal_unregister), NULL);
202
purple_signal_register(plugin, "jabber-receiving-presence",
203
purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER,
204
purple_value_new(PURPLE_TYPE_BOOLEAN), 4,
205
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
206
purple_value_new(PURPLE_TYPE_STRING), /* type */
207
purple_value_new(PURPLE_TYPE_STRING), /* from */
208
purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
144
213
static gboolean unload_plugin(PurplePlugin *plugin)
146
purple_signal_unregister(plugin, "jabber-receiving-xmlnode");
215
purple_signals_unregister_by_instance(plugin);
148
purple_signal_unregister(plugin, "jabber-sending-xmlnode");
150
purple_signal_unregister(plugin, "jabber-sending-text");
217
/* reverse order of init_plugin */
218
jabber_bosh_uninit();
152
219
jabber_data_uninit();
222
/* PEP things should be uninit via jabber_pep_uninit, not here */
224
jabber_caps_uninit();
227
jabber_unregister_commands();
229
/* Stay on target...stay on target... Almost there... */
230
jabber_uninit_plugin();
272
static PurpleAccount *find_acct(const char *prpl, const char *acct_id)
274
PurpleAccount *acct = NULL;
276
/* If we have a specific acct, use it */
278
acct = purple_accounts_find(acct_id, prpl);
279
if (acct && !purple_account_is_connected(acct))
281
} else { /* Otherwise find an active account for the protocol */
282
GList *l = purple_accounts_get_all();
284
if (!strcmp(prpl, purple_account_get_protocol_id(l->data))
285
&& purple_account_is_connected(l->data)) {
296
static gboolean xmpp_uri_handler(const char *proto, const char *user, GHashTable *params)
298
char *acct_id = g_hash_table_lookup(params, "account");
301
if (g_ascii_strcasecmp(proto, "xmpp"))
304
acct = find_acct(purple_plugin_get_id(my_protocol), acct_id);
309
/* xmpp:romeo@montague.net?message;subject=Test%20Message;body=Here%27s%20a%20test%20message */
310
if (g_hash_table_lookup_extended(params, "message", NULL, NULL)) {
311
char *body = g_hash_table_lookup(params, "body");
313
PurpleConversation *conv =
314
purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, user);
315
purple_conversation_present(conv);
317
purple_conv_send_confirm(conv, body);
319
} else if (g_hash_table_lookup_extended(params, "roster", NULL, NULL)) {
320
char *name = g_hash_table_lookup(params, "name");
322
purple_blist_request_add_buddy(acct, user, NULL, name);
323
} else if (g_hash_table_lookup_extended(params, "join", NULL, NULL)) {
324
PurpleConnection *gc = purple_account_get_connection(acct);
326
GHashTable *params = jabber_chat_info_defaults(gc, user);
327
jabber_chat_join(gc, params);
195
337
init_plugin(PurplePlugin *plugin)
204
346
PurpleAccountUserSplit *split;
205
347
PurpleAccountOption *option;
207
349
/* Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im */
208
350
split = purple_account_user_split_new(_("Domain"), NULL, '@');
209
351
purple_account_user_split_set_reverse(split, FALSE);
210
352
prpl_info.user_splits = g_list_append(prpl_info.user_splits, split);
212
354
split = purple_account_user_split_new(_("Resource"), NULL, '/');
213
355
purple_account_user_split_set_reverse(split, FALSE);
214
356
prpl_info.user_splits = g_list_append(prpl_info.user_splits, split);
216
option = purple_account_option_bool_new(_("Require SSL/TLS"), "require_tls", FALSE);
358
option = purple_account_option_bool_new(_("Require SSL/TLS"), "require_tls", TRUE);
217
359
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
220
362
option = purple_account_option_bool_new(_("Force old (port 5223) SSL"), "old_ssl", FALSE);
221
363
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
224
366
option = purple_account_option_bool_new(
225
367
_("Allow plaintext auth over unencrypted streams"),
226
368
"auth_plain_in_clear", FALSE);
227
369
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
230
372
option = purple_account_option_int_new(_("Connect port"), "port", 5222);
231
373
prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
274
423
jabber_register_commands();
425
/* reverse order of unload_plugin */
276
426
jabber_iq_init();
428
/* PEP things should be init via jabber_pep_init, not here */
277
429
jabber_pep_init();
282
430
jabber_data_init();
284
jabber_add_feature("avatarmeta", AVATARNAMESPACEMETA, jabber_pep_namespace_only_when_pep_enabled_cb);
285
jabber_add_feature("avatardata", AVATARNAMESPACEDATA, jabber_pep_namespace_only_when_pep_enabled_cb);
286
jabber_add_feature("buzz", "http://www.xmpp.org/extensions/xep-0224.html#ns",
287
jabber_buzz_isenabled);
288
jabber_add_feature("bob", XEP_0231_NAMESPACE,
289
jabber_custom_smileys_isenabled);
291
jabber_pep_register_handler("avatar", AVATARNAMESPACEMETA, jabber_buddy_avatar_update_metadata);
433
#warning implement adding and retrieving own features via IPC API
438
purple_signal_connect(purple_get_core(), "uri-handler", plugin,
439
PURPLE_CALLBACK(xmpp_uri_handler), NULL);