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 {