Mercurial > pidgin
comparison libpurple/protocols/jabber/adhoccommands.c @ 26694:83e6e710cbf3
Add a new signal which is emitted (after the account is connected) if the
associated account actions are changed. This is necessary since XMPP's
account actions are not known when setting the account to connected. Also
added support for push updates as specified in XEP-0050 2.3.
Refs #7233.
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sun, 26 Apr 2009 06:45:55 +0000 |
parents | ae41d8e827e3 |
children | 8c991e09efcb |
comparison
equal
deleted
inserted
replaced
26693:46b1d6eca6ef | 26694:83e6e710cbf3 |
---|---|
37 char *who; | 37 char *who; |
38 char *node; | 38 char *node; |
39 GList *actionslist; | 39 GList *actionslist; |
40 } JabberAdHocActionInfo; | 40 } JabberAdHocActionInfo; |
41 | 41 |
42 void jabber_adhoc_disco_result_cb(JabberStream *js, const char *from, | 42 static void |
43 JabberIqType type, const char *id, | 43 jabber_adhoc_got_buddy_list(JabberStream *js, const char *from, xmlnode *query) |
44 xmlnode *packet, gpointer data) | 44 { |
45 { | 45 JabberID *jid; |
46 const char *node; | |
47 xmlnode *query, *item; | |
48 JabberID *jabberid; | |
49 JabberBuddy *jb; | 46 JabberBuddy *jb; |
50 JabberBuddyResource *jbr = NULL; | 47 JabberBuddyResource *jbr = NULL; |
51 | 48 xmlnode *item; |
52 if (type == JABBER_IQ_ERROR) | 49 |
53 return; | 50 if ((jid = jabber_id_new(from))) { |
54 | 51 if (jid->resource && (jb = jabber_buddy_find(js, from, TRUE))) |
55 query = xmlnode_get_child_with_namespace(packet,"query","http://jabber.org/protocol/disco#items"); | 52 jbr = jabber_buddy_find_resource(jb, jid->resource); |
56 if(!query) | 53 jabber_id_free(jid); |
57 return; | |
58 node = xmlnode_get_attrib(query,"node"); | |
59 if(!node || strcmp(node, "http://jabber.org/protocol/commands")) | |
60 return; | |
61 | |
62 if((jabberid = jabber_id_new(from))) { | |
63 if(jabberid->resource && (jb = jabber_buddy_find(js, from, TRUE))) | |
64 jbr = jabber_buddy_find_resource(jb, jabberid->resource); | |
65 jabber_id_free(jabberid); | |
66 } | 54 } |
67 | 55 |
68 if(!jbr) | 56 if(!jbr) |
69 return; | 57 return; |
70 | 58 |
94 | 82 |
95 jbr->commands = g_list_append(jbr->commands,cmd); | 83 jbr->commands = g_list_append(jbr->commands,cmd); |
96 } | 84 } |
97 } | 85 } |
98 | 86 |
87 void | |
88 jabber_adhoc_disco_result_cb(JabberStream *js, const char *from, | |
89 JabberIqType type, const char *id, | |
90 xmlnode *packet, gpointer data) | |
91 { | |
92 xmlnode *query; | |
93 const char *node; | |
94 | |
95 if (type == JABBER_IQ_ERROR) | |
96 return; | |
97 | |
98 query = xmlnode_get_child_with_namespace(packet, "query", "http://jabber.org/protocol/disco#items"); | |
99 if (!query) | |
100 return; | |
101 node = xmlnode_get_attrib(query, "node"); | |
102 if (!purple_strequal(node, "http://jabber.org/protocol/commands")) | |
103 return; | |
104 | |
105 jabber_adhoc_got_buddy_list(js, from, query); | |
106 } | |
107 | |
99 static void jabber_adhoc_parse(JabberStream *js, const char *from, | 108 static void jabber_adhoc_parse(JabberStream *js, const char *from, |
100 JabberIqType type, const char *id, | 109 JabberIqType type, const char *id, |
101 xmlnode *packet, gpointer data); | 110 xmlnode *packet, gpointer data); |
102 | |
103 | 111 |
104 static void do_adhoc_action_cb(JabberStream *js, xmlnode *result, const char *actionhandle, gpointer user_data) { | 112 static void do_adhoc_action_cb(JabberStream *js, xmlnode *result, const char *actionhandle, gpointer user_data) { |
105 xmlnode *command; | 113 xmlnode *command; |
106 GList *action; | 114 GList *action; |
107 JabberAdHocActionInfo *actionInfo = user_data; | 115 JabberAdHocActionInfo *actionInfo = user_data; |
222 jabber_adhoc_execute(js, cmd); | 230 jabber_adhoc_execute(js, cmd); |
223 } | 231 } |
224 } | 232 } |
225 | 233 |
226 static void | 234 static void |
227 jabber_adhoc_server_got_list_cb(JabberStream *js, const char *from, | 235 jabber_adhoc_got_server_list(JabberStream *js, const char *from, xmlnode *query) |
228 JabberIqType type, const char *id, | 236 { |
229 xmlnode *packet, gpointer data) | |
230 { | |
231 xmlnode *query = xmlnode_get_child_with_namespace(packet, "query", "http://jabber.org/protocol/disco#items"); | |
232 xmlnode *item; | 237 xmlnode *item; |
233 | 238 |
234 if(!query) | 239 if(!query) |
235 return; | 240 return; |
236 | 241 |
255 cmd->jid = g_strdup(xmlnode_get_attrib(item,"jid")); | 260 cmd->jid = g_strdup(xmlnode_get_attrib(item,"jid")); |
256 cmd->node = g_strdup(xmlnode_get_attrib(item,"node")); | 261 cmd->node = g_strdup(xmlnode_get_attrib(item,"node")); |
257 cmd->name = g_strdup(xmlnode_get_attrib(item,"name")); | 262 cmd->name = g_strdup(xmlnode_get_attrib(item,"name")); |
258 | 263 |
259 js->commands = g_list_append(js->commands,cmd); | 264 js->commands = g_list_append(js->commands,cmd); |
265 } | |
266 | |
267 if (js->state == JABBER_STREAM_CONNECTED) | |
268 purple_prpl_got_account_actions(purple_connection_get_account(js->gc)); | |
269 } | |
270 | |
271 static void | |
272 jabber_adhoc_server_got_list_cb(JabberStream *js, const char *from, | |
273 JabberIqType type, const char *id, | |
274 xmlnode *packet, gpointer data) | |
275 { | |
276 xmlnode *query = xmlnode_get_child_with_namespace(packet, "query", "http://jabber.org/protocol/disco#items"); | |
277 | |
278 jabber_adhoc_got_server_list(js, from, query); | |
279 | |
280 } | |
281 | |
282 void jabber_adhoc_got_list(JabberStream *js, const char *from, xmlnode *query) | |
283 { | |
284 if (purple_strequal(from, js->user->domain)) { | |
285 jabber_adhoc_got_server_list(js, from, query); | |
286 } else { | |
287 jabber_adhoc_got_buddy_list(js, from, query); | |
260 } | 288 } |
261 } | 289 } |
262 | 290 |
263 void jabber_adhoc_server_get_list(JabberStream *js) { | 291 void jabber_adhoc_server_get_list(JabberStream *js) { |
264 JabberIq *iq = jabber_iq_new_query(js,JABBER_IQ_GET,"http://jabber.org/protocol/disco#items"); | 292 JabberIq *iq = jabber_iq_new_query(js,JABBER_IQ_GET,"http://jabber.org/protocol/disco#items"); |