static gboolean xmpp_uri_handler(const char *proto, const char *user, GHashTable *params) { char *acct_id = params ? g_hash_table_lookup(params, "account") : NULL; PurpleAccount *acct; if (g_ascii_strcasecmp(proto, "xmpp")) return FALSE; acct = find_acct(purple_plugin_get_id(my_protocol), acct_id); if (!acct) return FALSE; /* xmpp:[email protected]?message;subject=Test%20Message;body=Here%27s%20a%20test%20message */ /* params is NULL if the URI has no '?' (or anything after it) */ if (!params || g_hash_table_lookup_extended(params, "message", NULL, NULL)) { char *body = g_hash_table_lookup(params, "body"); if (user && *user) { PurpleConversation *conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, user); purple_conversation_present(conv); if (body && *body) purple_conv_send_confirm(conv, body); } } else if (g_hash_table_lookup_extended(params, "roster", NULL, NULL)) { char *name = g_hash_table_lookup(params, "name"); if (user && *user) purple_blist_request_add_buddy(acct, user, NULL, name); } else if (g_hash_table_lookup_extended(params, "join", NULL, NULL)) { PurpleConnection *gc = purple_account_get_connection(acct); if (user && *user) { GHashTable *params = jabber_chat_info_defaults(gc, user); jabber_chat_join(gc, params); } return TRUE; } return FALSE; }
static gboolean yahoo_uri_handler(const char *proto, const char *cmd, GHashTable *params) { char *acct_id = g_hash_table_lookup(params, "account"); PurpleAccount *acct; if (g_ascii_strcasecmp(proto, "ymsgr")) return FALSE; acct = find_acct(purple_plugin_get_id(my_protocol), acct_id); if (!acct) return FALSE; /* ymsgr:SendIM?screename&m=The+Message */ if (!g_ascii_strcasecmp(cmd, "SendIM")) { char *sname = NULL; g_hash_table_foreach(params, yahoo_find_uri_novalue_param, &sname); if (sname) { char *message = g_hash_table_lookup(params, "m"); PurpleConversation *conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM, sname, acct); if (conv == NULL) conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, sname); purple_conversation_present(conv); if (message) { /* Spaces are encoded as '+' */ g_strdelimit(message, "+", ' '); purple_conv_send_confirm(conv, message); } } /* else **If pidgindialogs_im() was in the core, we could use it here. * It is all purple_request_* based, but I'm not sure it really belongs in the core pidgindialogs_im(); */ return TRUE; } /* ymsgr:Chat?roomname */ else if (!g_ascii_strcasecmp(cmd, "Chat")) { char *rname = NULL; g_hash_table_foreach(params, yahoo_find_uri_novalue_param, &rname); if (rname) { /* This is somewhat hacky, but the params aren't useful after this command */ g_hash_table_insert(params, g_strdup("room"), g_strdup(rname)); g_hash_table_insert(params, g_strdup("type"), g_strdup("Chat")); serv_join_chat(purple_account_get_connection(acct), params); } /* else ** Same as above (except that this would have to be re-written using purple_request_*) pidgin_blist_joinchat_show(); */ return TRUE; } /* ymsgr:AddFriend?name */ else if (!g_ascii_strcasecmp(cmd, "AddFriend")) { char *name = NULL; g_hash_table_foreach(params, yahoo_find_uri_novalue_param, &name); purple_blist_request_add_buddy(acct, name, NULL, NULL); return TRUE; } return FALSE; }
static gboolean skypeweb_uri_handler(const char *proto, const char *cmd, GHashTable *params) { PurpleAccount *account; PurpleConnection *pc; if (!g_str_equal(proto, "skype")) return FALSE; /*skype uri's: skype: //does nothing skype:{buddyname} //open im with {buddyname} skype:{buddynames}?chat //open multi-user chat with {buddynames} skype:?chat&blob={blob id} //open public multi-user chat with the blob id of {blob id} skype:?chat&id={chat id} //open multi-user chat with the id of {chat id} skype:{buddyname}?add //add user to buddy list skype:{buddyname}?userinfo //get buddy's info skype:{buddynames}?call //call {buddynames} skype:{buddyname}?voicemail //send a voice mail message skype:{buddyname}?sendfile //send a file */ account = find_acct(SKYPEWEB_PLUGIN_ID, g_hash_table_lookup(params, "account")); pc = purple_account_get_connection(account); if (g_hash_table_lookup(params, "chat")) { if (cmd && *cmd) { //there'll be a bunch of usernames, seperated by semi-colon if (strchr(cmd, ';')) { gchar **users = g_strsplit_set(cmd, ";", -1); skypeweb_initiate_chat(purple_connection_get_protocol_data(pc), users[0]); //TODO the other users g_strfreev(users); } else { PurpleIMConversation *imconv; imconv = purple_conversations_find_im_with_account(cmd, account); if (!imconv) { imconv = purple_im_conversation_new(account, cmd); } purple_conversation_present(PURPLE_CONVERSATION(imconv)); } } else { //probably a public multi-user chat? GHashTable *chatinfo = NULL; if (g_hash_table_lookup(params, "id")) { chatinfo = skypeweb_chat_info_defaults(pc, g_hash_table_lookup(params, "id")); } else if (g_hash_table_lookup(params, "blob")) { chatinfo = skypeweb_chat_info_defaults(pc, g_hash_table_lookup(params, "blob")); } if (chatinfo != NULL) { skypeweb_join_chat(pc, chatinfo); g_hash_table_destroy(chatinfo); } } } else if (g_hash_table_lookup(params, "add")) { purple_blist_request_add_buddy(account, cmd, "Skype", g_hash_table_lookup(params, "displayname")); return TRUE; } else if (g_hash_table_lookup(params, "call")) { } else if (g_hash_table_lookup(params, "userinfo")) { skypeweb_get_info(pc, cmd); return TRUE; } else if (g_hash_table_lookup(params, "voicemail")) { } else if (g_hash_table_lookup(params, "sendfile")) { } else if (strlen(cmd)) { //supposed to be the same as call? } //we don't know how to handle this return FALSE; }