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