Mercurial > ~mikael > mcabber > hg
comparison mcabber/mcabber/xmpp_iqrequest.c @ 2103:1210a22726d3
We can determine if the server supports carbons. By means of XEP-0030: Service
Discovery.
author | Roeland Jago Douma <roeland@famdouma.nl> |
---|---|
date | Fri, 01 Mar 2013 15:27:29 +0100 |
parents | 87049d55e34f |
children | c7e9950fa741 |
comparison
equal
deleted
inserted
replaced
2102:739f440e563b | 2103:1210a22726d3 |
---|---|
45 LmMessage *m, gpointer user_data); | 45 LmMessage *m, gpointer user_data); |
46 static LmHandlerResult cb_ping(LmMessageHandler *h, LmConnection *c, | 46 static LmHandlerResult cb_ping(LmMessageHandler *h, LmConnection *c, |
47 LmMessage *m, gpointer user_data); | 47 LmMessage *m, gpointer user_data); |
48 static LmHandlerResult cb_vcard(LmMessageHandler *h, LmConnection *c, | 48 static LmHandlerResult cb_vcard(LmMessageHandler *h, LmConnection *c, |
49 LmMessage *m, gpointer user_data); | 49 LmMessage *m, gpointer user_data); |
50 static LmHandlerResult cb_disco_info(LmMessageHandler *h, LmConnection *c, | |
51 LmMessage *m, gpointer user_data); | |
52 | |
50 | 53 |
51 static struct IqRequestHandlers | 54 static struct IqRequestHandlers |
52 { | 55 { |
53 const gchar *xmlns; | 56 const gchar *xmlns; |
54 const gchar *querytag; | 57 const gchar *querytag; |
58 {NS_VERSION, "query", &cb_version}, | 61 {NS_VERSION, "query", &cb_version}, |
59 {NS_XMPP_TIME,"time", &cb_time}, | 62 {NS_XMPP_TIME,"time", &cb_time}, |
60 {NS_LAST, "query", &cb_last}, | 63 {NS_LAST, "query", &cb_last}, |
61 {NS_PING, "ping", &cb_ping}, | 64 {NS_PING, "ping", &cb_ping}, |
62 {NS_VCARD, "vCard", &cb_vcard}, | 65 {NS_VCARD, "vCard", &cb_vcard}, |
66 {NS_DISCO_INFO, "query", &cb_disco_info}, | |
63 {NULL, NULL, NULL} | 67 {NULL, NULL, NULL} |
64 }; | 68 }; |
65 | 69 |
66 // Enum for vCard attributes | 70 // Enum for vCard attributes |
67 enum vcard_attr { | 71 enum vcard_attr { |
73 vcard_cell = 1<<5, | 77 vcard_cell = 1<<5, |
74 vcard_inet = 1<<6, | 78 vcard_inet = 1<<6, |
75 vcard_pref = 1<<7, | 79 vcard_pref = 1<<7, |
76 }; | 80 }; |
77 | 81 |
82 static LmHandlerResult cb_disco_info(LmMessageHandler *h, LmConnection *c, | |
83 LmMessage *m, gpointer user_data) | |
84 { | |
85 LmMessageNode *ansqry; | |
86 LmMessageNode *feature; | |
87 | |
88 ansqry = lm_message_node_get_child(m->node, "query"); | |
89 | |
90 feature = lm_message_node_get_child(ansqry, "feature"); | |
91 for(;feature;feature = feature->next) { | |
92 const char *v = lm_message_node_get_attribute(feature, "var"); | |
93 | |
94 if (!g_strcmp0(v, NS_CARBONS_2)) { | |
95 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "We have carbons!"); | |
96 } | |
97 } | |
98 | |
99 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
100 } | |
101 | |
78 static LmHandlerResult cb_ping(LmMessageHandler *h, LmConnection *c, | 102 static LmHandlerResult cb_ping(LmMessageHandler *h, LmConnection *c, |
79 LmMessage *m, gpointer user_data) | 103 LmMessage *m, gpointer user_data) |
80 { | 104 { |
81 struct timeval *timestamp = (struct timeval *)user_data; | 105 struct timeval *timestamp = (struct timeval *)user_data; |
82 struct timeval now; | 106 struct timeval now; |
157 if (!g_strcmp0(xmlns, NS_PING)) { // Create handler for ping queries | 181 if (!g_strcmp0(xmlns, NS_PING)) { // Create handler for ping queries |
158 struct timeval *now = g_new(struct timeval, 1); | 182 struct timeval *now = g_new(struct timeval, 1); |
159 gettimeofday(now, NULL); | 183 gettimeofday(now, NULL); |
160 data = (gpointer)now; | 184 data = (gpointer)now; |
161 notifier = g_free; | 185 notifier = g_free; |
186 } else if (!g_strcmp0(xmlns, NS_DISCO_INFO)) { | |
187 gchar *servername = get_servername(settings_opt_get("jid"), settings_opt_get("server")); | |
188 lm_message_node_set_attribute(iq->node, "to", servername); | |
189 g_free(servername); | |
162 } | 190 } |
163 | 191 |
164 handler = lm_message_handler_new(iq_request_handlers[i].handler, | 192 handler = lm_message_handler_new(iq_request_handlers[i].handler, |
165 data, notifier); | 193 data, notifier); |
166 | 194 |