Mercurial > pidgin
comparison libpurple/protocols/jabber/jabber.c @ 21220:b1fa7765ca4b
propagate from branch 'im.pidgin.pidgin' (head d42511319051bcfa8adb3ed8e3f11a26cabc43f4)
to branch 'next.minor' (head 3526bc084159c5c57e580e9e9e190b6ff502fdbe)
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Fri, 12 Oct 2007 02:18:35 +0000 |
parents | 5f829728a1a5 6cc03752fe59 |
children | 0b67d509a305 fa3c4c5dea66 |
comparison
equal
deleted
inserted
replaced
21219:5f829728a1a5 | 21220:b1fa7765ca4b |
---|---|
1888 } else { | 1888 } else { |
1889 js->gc->wants_to_die = TRUE; | 1889 js->gc->wants_to_die = TRUE; |
1890 text = _("Authentication Failure"); | 1890 text = _("Authentication Failure"); |
1891 } | 1891 } |
1892 } else if(!strcmp(packet->name, "stream:error") || | 1892 } else if(!strcmp(packet->name, "stream:error") || |
1893 (!strcmp(packet->name, "error") && | 1893 (!strcmp(packet->name, "error") && xmlns && |
1894 !strcmp(xmlns, "http://etherx.jabber.org/streams"))) { | 1894 !strcmp(xmlns, "http://etherx.jabber.org/streams"))) { |
1895 if(xmlnode_get_child(packet, "bad-format")) { | 1895 if(xmlnode_get_child(packet, "bad-format")) { |
1896 text = _("Bad Format"); | 1896 text = _("Bad Format"); |
1897 } else if(xmlnode_get_child(packet, "bad-namespace-prefix")) { | 1897 } else if(xmlnode_get_child(packet, "bad-namespace-prefix")) { |
1898 text = _("Bad Namespace Prefix"); | 1898 text = _("Bad Namespace Prefix"); |
2163 } | 2163 } |
2164 | 2164 |
2165 return PURPLE_CMD_RET_OK; | 2165 return PURPLE_CMD_RET_OK; |
2166 } | 2166 } |
2167 | 2167 |
2168 static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) { | |
2169 | |
2170 JabberBuddy *jb; | |
2171 JabberBuddyResource *jbr; | |
2172 GList *iter; | |
2173 | |
2174 if(!username) | |
2175 return FALSE; | |
2176 | |
2177 jb = jabber_buddy_find(js, username, FALSE); | |
2178 if(!jb) { | |
2179 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); | |
2180 return FALSE; | |
2181 } | |
2182 | |
2183 jbr = jabber_buddy_find_resource(jb, NULL); | |
2184 if(!jbr) { | |
2185 *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), username); | |
2186 return FALSE; | |
2187 } | |
2188 | |
2189 if(!jbr->caps) { | |
2190 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); | |
2191 return FALSE; | |
2192 } | |
2193 | |
2194 for(iter = jbr->caps->features; iter; iter = g_list_next(iter)) { | |
2195 if(!strcmp(iter->data, "http://www.xmpp.org/extensions/xep-0224.html#ns")) { | |
2196 xmlnode *buzz, *msg = xmlnode_new("message"); | |
2197 gchar *to; | |
2198 | |
2199 to = g_strdup_printf("%s/%s", username, jbr->name); | |
2200 xmlnode_set_attrib(msg, "to", to); | |
2201 g_free(to); | |
2202 | |
2203 /* avoid offline storage */ | |
2204 xmlnode_set_attrib(msg, "type", "headline"); | |
2205 | |
2206 buzz = xmlnode_new_child(msg, "attention"); | |
2207 xmlnode_set_namespace(buzz, "http://www.xmpp.org/extensions/xep-0224.html#ns"); | |
2208 | |
2209 jabber_send(js, msg); | |
2210 xmlnode_free(msg); | |
2211 | |
2212 return TRUE; | |
2213 } | |
2214 } | |
2215 | |
2216 *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), username); | |
2217 return FALSE; | |
2218 } | |
2219 | |
2168 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, | 2220 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, |
2169 const char *cmd, char **args, char **error, void *data) | 2221 const char *cmd, char **args, char **error, void *data) |
2170 { | 2222 { |
2171 JabberStream *js = conv->account->gc->proto_data; | 2223 JabberStream *js = conv->account->gc->proto_data; |
2172 xmlnode *msg, *buzz; | |
2173 JabberBuddy *jb; | |
2174 JabberBuddyResource *jbr; | |
2175 char *to; | |
2176 GList *iter; | |
2177 | 2224 |
2178 if(!args || !args[0]) | 2225 if(!args || !args[0]) |
2179 return PURPLE_CMD_RET_FAILED; | 2226 return PURPLE_CMD_RET_FAILED; |
2180 | 2227 |
2181 jb = jabber_buddy_find(js, args[0], FALSE); | 2228 return _jabber_send_buzz(js, args[0], error) ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED; |
2182 if(!jb) { | |
2183 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), args[0]); | |
2184 return PURPLE_CMD_RET_FAILED; | |
2185 } | |
2186 | |
2187 jbr = jabber_buddy_find_resource(jb, NULL); | |
2188 if(!jbr) { | |
2189 *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), args[0]); | |
2190 return PURPLE_CMD_RET_FAILED; | |
2191 } | |
2192 if(!jbr->caps) { | |
2193 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), args[0]); | |
2194 return PURPLE_CMD_RET_FAILED; | |
2195 } | |
2196 for(iter = jbr->caps->features; iter; iter = g_list_next(iter)) { | |
2197 if(!strcmp(iter->data, "http://www.xmpp.org/extensions/xep-0224.html#ns")) { | |
2198 msg = xmlnode_new("message"); | |
2199 to = g_strdup_printf("%s/%s", args[0], jbr->name); | |
2200 xmlnode_set_attrib(msg,"to",to); | |
2201 g_free(to); | |
2202 | |
2203 /* avoid offline storage */ | |
2204 xmlnode_set_attrib(msg,"type","headline"); | |
2205 | |
2206 buzz = xmlnode_new_child(msg,"attention"); | |
2207 xmlnode_set_namespace(buzz,"http://www.xmpp.org/extensions/xep-0224.html#ns"); | |
2208 | |
2209 jabber_send(js,msg); | |
2210 xmlnode_free(msg); | |
2211 | |
2212 return PURPLE_CMD_RET_OK; | |
2213 } | |
2214 } | |
2215 *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), args[0]); | |
2216 return PURPLE_CMD_RET_FAILED; | |
2217 } | 2229 } |
2218 | 2230 |
2219 GList *jabber_attention_types(PurpleAccount *account) | 2231 GList *jabber_attention_types(PurpleAccount *account) |
2220 { | 2232 { |
2221 static GList *types = NULL; | 2233 static GList *types = NULL; |
2232 return types; | 2244 return types; |
2233 } | 2245 } |
2234 | 2246 |
2235 gboolean jabber_send_attention(PurpleConnection *gc, const char *username, guint code) | 2247 gboolean jabber_send_attention(PurpleConnection *gc, const char *username, guint code) |
2236 { | 2248 { |
2237 PurpleConversation *conv; | 2249 JabberStream *js = gc->proto_data; |
2238 char *error; | 2250 gchar *error = NULL; |
2239 char *args[1]; | 2251 |
2240 PurpleCmdRet ret; | 2252 if (!_jabber_send_buzz(js, username, &error)) { |
2241 | |
2242 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, username, gc->account); | |
2243 | |
2244 args[0] = (char *)username; | |
2245 | |
2246 ret = jabber_cmd_buzz(conv, "buzz", args, &error, NULL); | |
2247 | |
2248 if (ret == PURPLE_CMD_RET_FAILED) { | |
2249 purple_debug_error("jabber", "jabber_send_attention: jabber_cmd_buzz failed with error: %s\n", error ? error : "(NULL)"); | 2253 purple_debug_error("jabber", "jabber_send_attention: jabber_cmd_buzz failed with error: %s\n", error ? error : "(NULL)"); |
2254 g_free(error); | |
2250 return FALSE; | 2255 return FALSE; |
2251 } else { | 2256 } |
2252 return TRUE; | 2257 |
2253 } | 2258 return TRUE; |
2254 } | 2259 } |
2255 | 2260 |
2256 | 2261 |
2257 gboolean jabber_offline_message(const PurpleBuddy *buddy) | 2262 gboolean jabber_offline_message(const PurpleBuddy *buddy) |
2258 { | 2263 { |