2 * Wireshark's XMPP dissector.
6 * Copyright 2011, Mariusz Okroj <okrojmariusz[]gmail.com>
10 * Wireshark - Network traffic analyzer
11 * By Gerald Combs <gerald@wireshark.org>
12 * Copyright 1998 Gerald Combs
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
33 #include <epan/packet.h>
35 #include <epan/dissectors/packet-xml.h>
37 #include <packet-xmpp.h>
38 #include <packet-xmpp-utils.h>
39 #include <packet-xmpp-gtalk.h>
40 #include <packet-xmpp-conference.h>
43 static void xmpp_gtalk_session_desc(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
44 static void xmpp_gtalk_session_desc_payload(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
45 static void xmpp_gtalk_session_cand(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
46 static void xmpp_gtalk_session_reason(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
47 static void xmpp_gtalk_jingleinfo_stun(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
48 static void xmpp_gtalk_jingleinfo_server(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
49 static void xmpp_gtalk_jingleinfo_relay(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
50 static void xmpp_gtalk_jingleinfo_relay_serv(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
51 static void xmpp_gtalk_nosave_item(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
52 static void xmpp_gtalk_mail_mail_info(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
53 static void xmpp_gtalk_mail_senders(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
54 static void xmpp_gtalk_mail_sender(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
55 static void xmpp_gtalk_mail_snippet(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
56 static void xmpp_gtalk_status_status_list(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
57 static void xmpp_gtalk_transport_p2p_cand(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
);
60 xmpp_gtalk_session(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
62 proto_item
*session_item
;
63 proto_tree
*session_tree
;
65 xmpp_attr_info attrs_info
[] = {
66 {"xmlns", hf_xmpp_xmlns
, TRUE
, FALSE
, NULL
, NULL
},
67 {"type", hf_xmpp_gtalk_session_type
, TRUE
, TRUE
, NULL
, NULL
},
68 {"initiator", -1, FALSE
, TRUE
, NULL
, NULL
},
69 {"id", -1, TRUE
, TRUE
, NULL
, NULL
}
72 xmpp_elem_info elems_info
[] = {
73 {NAME
,"description", xmpp_gtalk_session_desc
, ONE
},
74 {NAME
, "candidate", xmpp_gtalk_session_cand
, MANY
},
75 {NAME
, "reason", xmpp_gtalk_session_reason
, ONE
},
76 {NAME_AND_ATTR
, xmpp_name_attr_struct("transport", "xmlns", "http://www.google.com/transport/p2p"), xmpp_gtalk_transport_p2p
, ONE
},
77 {NAME
, "conference-info", xmpp_conferece_info_advert
, ONE
}
80 xmpp_attr_t
*attr_type
= xmpp_get_attr(element
, "type");
82 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "GTALK-SESSION(%s) ", attr_type
?attr_type
->value
:"");
84 session_item
= proto_tree_add_item(tree
, hf_xmpp_gtalk_session
, tvb
, element
->offset
, element
->length
, ENC_BIG_ENDIAN
);
85 session_tree
= proto_item_add_subtree(session_item
, ett_xmpp_gtalk_session
);
87 xmpp_display_attrs(session_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
89 xmpp_display_elems(session_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
93 xmpp_gtalk_session_desc(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
95 proto_item
*desc_item
;
96 proto_tree
*desc_tree
;
98 xmpp_attr_info attrs_info
[] = {
99 {"xmlns", hf_xmpp_xmlns
, TRUE
, TRUE
, NULL
, NULL
},
100 {"xml:lang", -1, FALSE
, FALSE
, NULL
, NULL
}
103 xmpp_elem_info elems_info
[] = {
104 {NAME
, "payload-type", xmpp_gtalk_session_desc_payload
, MANY
}
107 desc_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "DESCRIPTION");
108 desc_tree
= proto_item_add_subtree(desc_item
, ett_xmpp_gtalk_session_desc
);
110 xmpp_display_attrs(desc_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
111 xmpp_display_elems(desc_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
115 xmpp_gtalk_session_desc_payload(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
117 proto_item
*payload_item
;
118 proto_tree
*payload_tree
;
120 xmpp_attr_info attrs_info
[] = {
121 {"xmlns", hf_xmpp_xmlns
, FALSE
, TRUE
, NULL
, NULL
},
122 {"id", -1, FALSE
, TRUE
, NULL
, NULL
},
123 {"name", -1, FALSE
, TRUE
, NULL
, NULL
},
124 {"channels", -1, FALSE
, FALSE
, NULL
, NULL
},
125 {"clockrate", -1, FALSE
, FALSE
, NULL
, NULL
},
126 {"bitrate", -1, FALSE
, FALSE
, NULL
, NULL
},
127 {"width", -1, FALSE
, FALSE
, NULL
, NULL
},
128 {"height", -1, FALSE
, FALSE
, NULL
, NULL
},
129 {"framerate", -1, FALSE
, FALSE
, NULL
, NULL
},
132 payload_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "PAYLOAD-TYPE");
133 payload_tree
= proto_item_add_subtree(payload_item
, ett_xmpp_gtalk_session_desc_payload
);
135 xmpp_display_attrs(payload_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
136 xmpp_display_elems(payload_tree
, element
, pinfo
, tvb
, NULL
, 0);
140 xmpp_gtalk_session_cand(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
142 proto_item
*cand_item
;
143 proto_tree
*cand_tree
;
145 xmpp_attr_info attrs_info
[] = {
146 {"name", -1, TRUE
, TRUE
, NULL
, NULL
},
147 {"address", -1, TRUE
, FALSE
, NULL
, NULL
},
148 {"port", -1, TRUE
, FALSE
, NULL
, NULL
},
149 {"preference", -1, TRUE
, FALSE
, NULL
, NULL
},
150 {"type", -1, TRUE
, TRUE
, NULL
, NULL
},
151 {"protocol", -1, TRUE
, TRUE
, NULL
, NULL
},
152 {"network", -1, TRUE
, FALSE
, NULL
, NULL
},
153 {"username", -1, TRUE
, FALSE
, NULL
, NULL
},
154 {"password", -1, TRUE
, FALSE
, NULL
, NULL
},
155 {"generation", -1, TRUE
, FALSE
, NULL
, NULL
},
156 {"foundation", -1, FALSE
, FALSE
, NULL
, NULL
},
157 {"component", -1, FALSE
, FALSE
, NULL
, NULL
}
160 cand_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "CANDIDATE");
161 cand_tree
= proto_item_add_subtree(cand_item
, ett_xmpp_gtalk_session_cand
);
163 xmpp_display_attrs(cand_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
164 xmpp_display_elems(cand_tree
, element
, pinfo
, tvb
, NULL
, 0);
168 xmpp_gtalk_session_reason(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
170 proto_item
*reason_item
;
171 proto_tree
*reason_tree
;
173 xmpp_attr_info attrs_info
[] = {
174 {"condition", -1, TRUE
, TRUE
, NULL
, NULL
},
175 {"text", -1, FALSE
, FALSE
, NULL
, NULL
}
178 xmpp_element_t
*condition
;
179 xmpp_element_t
*text
;
181 static const gchar
*reason_names
[] = { "success", "busy", "cancel"};
183 reason_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "REASON");
184 reason_tree
= proto_item_add_subtree(reason_item
, ett_xmpp_gtalk_session_reason
);
187 /*Looks for reason description.*/
188 if((condition
= xmpp_steal_element_by_names(element
, reason_names
, array_length(reason_names
)))!=NULL
)
190 xmpp_attr_t
*fake_cond
= xmpp_ep_init_attr_t(condition
->name
, condition
->offset
, condition
->length
);
191 g_hash_table_insert(element
->attrs
, (gpointer
)"condition", fake_cond
);
195 if((text
= xmpp_steal_element_by_name(element
, "text"))!=NULL
)
197 xmpp_attr_t
*fake_text
= xmpp_ep_init_attr_t(text
->data
?text
->data
->value
:"", text
->offset
, text
->length
);
198 g_hash_table_insert(element
->attrs
, (gpointer
)"text", fake_text
);
201 xmpp_display_attrs(reason_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
203 xmpp_unknown(reason_tree
, tvb
, pinfo
, element
);
207 xmpp_gtalk_jingleinfo_query(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
209 proto_item
*query_item
;
210 proto_tree
*query_tree
;
212 xmpp_attr_info attrs_info
[] = {
213 {"xmlns", hf_xmpp_xmlns
, TRUE
, TRUE
, NULL
, NULL
}
216 xmpp_elem_info elems_info
[] = {
217 {NAME
, "stun", xmpp_gtalk_jingleinfo_stun
, ONE
},
218 {NAME
, "relay", xmpp_gtalk_jingleinfo_relay
, ONE
}
221 col_append_str(pinfo
->cinfo
, COL_INFO
, "QUERY(google:jingleinfo) ");
223 query_item
= proto_tree_add_item(tree
, hf_xmpp_query
, tvb
, element
->offset
, element
->length
,
225 query_tree
= proto_item_add_subtree(query_item
, ett_xmpp_query
);
227 xmpp_display_attrs(query_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
228 xmpp_display_elems(query_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
232 xmpp_gtalk_jingleinfo_stun(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
234 proto_item
*stun_item
;
235 proto_tree
*stun_tree
;
237 xmpp_elem_info elems_info
[] = {
238 {NAME
, "server", xmpp_gtalk_jingleinfo_server
, MANY
},
241 stun_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "STUN");
242 stun_tree
= proto_item_add_subtree(stun_item
, ett_xmpp_gtalk_jingleinfo_stun
);
244 xmpp_display_attrs(stun_tree
, element
, pinfo
, tvb
, NULL
, 0);
245 xmpp_display_elems(stun_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
250 xmpp_gtalk_jingleinfo_server(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
252 proto_item
*serv_item
;
253 proto_tree
*serv_tree
;
255 xmpp_attr_info attrs_info
[] = {
256 {"host", -1, TRUE
, TRUE
, NULL
, NULL
},
257 {"udp", -1, TRUE
, TRUE
, NULL
, NULL
}
260 serv_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "SERVER");
261 serv_tree
= proto_item_add_subtree(serv_item
, ett_xmpp_gtalk_jingleinfo_server
);
263 xmpp_display_attrs(serv_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
264 xmpp_display_elems(serv_tree
, element
, pinfo
, tvb
, NULL
, 0);
268 xmpp_gtalk_jingleinfo_relay(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
270 proto_item
*relay_item
;
271 proto_tree
*relay_tree
;
273 xmpp_attr_info attrs_info
[] = {
274 {"token", -1, FALSE
, FALSE
, NULL
, NULL
}
277 xmpp_elem_info elems_info
[] = {
278 {NAME
, "server", xmpp_gtalk_jingleinfo_relay_serv
, ONE
}
281 xmpp_element_t
*token
;
283 relay_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "RELAY");
284 relay_tree
= proto_item_add_subtree(relay_item
, ett_xmpp_gtalk_jingleinfo_relay
);
286 if((token
= xmpp_steal_element_by_name(element
, "token"))!=NULL
)
288 xmpp_attr_t
*fake_token
= xmpp_ep_init_attr_t(token
->data
?token
->data
->value
:"", token
->offset
, token
->length
);
289 g_hash_table_insert(element
->attrs
, (gpointer
)"token", fake_token
);
292 xmpp_display_attrs(relay_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
293 xmpp_display_elems(relay_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
297 xmpp_gtalk_jingleinfo_relay_serv(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
299 proto_item
*serv_item
;
300 proto_tree
*serv_tree
;
302 xmpp_attr_info attrs_info
[] = {
303 {"host", -1, TRUE
, TRUE
, NULL
, NULL
},
304 {"udp", -1, FALSE
, TRUE
, NULL
, NULL
},
305 {"tcp", -1, FALSE
, TRUE
, NULL
, NULL
},
306 {"tcpssl", -1, FALSE
, TRUE
, NULL
, NULL
}
309 serv_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "SERVER");
310 serv_tree
= proto_item_add_subtree(serv_item
, ett_xmpp_gtalk_jingleinfo_relay_serv
);
312 xmpp_display_attrs(serv_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
313 xmpp_display_elems(serv_tree
, element
, pinfo
, tvb
, NULL
, 0);
317 xmpp_gtalk_usersetting(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
319 proto_item
*sett_item
;
320 proto_tree
*sett_tree
;
322 xmpp_attr_info attrs_info
[] = {
323 {"xmlns", hf_xmpp_xmlns
, TRUE
, TRUE
, NULL
, NULL
}
328 sett_item
= proto_tree_add_item(tree
, hf_xmpp_gtalk_setting
, tvb
, element
->offset
, element
->length
, ENC_BIG_ENDIAN
);
329 sett_tree
= proto_item_add_subtree(sett_item
, ett_xmpp_gtalk_setting
);
331 xmpp_display_attrs(sett_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
333 for(i
= 0; i
< g_list_length(element
->elements
); i
++)
335 GList
*elem_l
= g_list_nth(element
->elements
,i
);
336 xmpp_element_t
*elem
= (xmpp_element_t
*)(elem_l
?elem_l
->data
:NULL
);
340 xmpp_attr_t
*val
= xmpp_get_attr(elem
,"value");
341 proto_tree_add_text(sett_tree
, tvb
, elem
->offset
, elem
->length
, "%s [%s]",elem
->name
,val
?val
->value
:"");
347 xmpp_gtalk_nosave_query(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
) {
348 proto_item
*query_item
;
349 proto_tree
*query_tree
;
351 xmpp_attr_info attrs_info
[] = {
352 {"xmlns", hf_xmpp_xmlns
, TRUE
, TRUE
, NULL
, NULL
}
355 xmpp_elem_info elems_info
[] = {
356 {NAME
, "item", xmpp_gtalk_nosave_item
, MANY
},
359 col_append_str(pinfo
->cinfo
, COL_INFO
, "QUERY(google:nosave) ");
361 query_item
= proto_tree_add_item(tree
, hf_xmpp_query
, tvb
, element
->offset
, element
->length
,
363 query_tree
= proto_item_add_subtree(query_item
, ett_xmpp_query
);
365 xmpp_display_attrs(query_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
366 xmpp_display_elems(query_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
370 xmpp_gtalk_nosave_item(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
372 proto_item
*item_item
;
373 proto_tree
*item_tree
;
375 xmpp_attr_info attrs_info
[] = {
376 {"xmlns", hf_xmpp_xmlns
, TRUE
, FALSE
, NULL
,NULL
},
377 {"jid", -1, TRUE
, TRUE
, NULL
, NULL
},
378 {"source", -1, FALSE
, TRUE
, NULL
, NULL
},
379 {"value", -1, TRUE
, TRUE
, NULL
, NULL
}
382 item_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "ITEM");
383 item_tree
= proto_item_add_subtree(item_item
, ett_xmpp_query_item
);
385 xmpp_display_attrs(item_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
386 xmpp_display_elems(item_tree
, element
, pinfo
, tvb
, NULL
, 0);
390 xmpp_gtalk_nosave_x(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
395 xmpp_attr_info attrs_info
[] = {
396 {"xmlns", hf_xmpp_xmlns
, TRUE
, TRUE
, NULL
, NULL
},
397 {"value", -1, FALSE
, TRUE
, NULL
, NULL
}
400 x_item
= proto_tree_add_item(tree
, hf_xmpp_gtalk_nosave_x
, tvb
, element
->offset
, element
->length
,
402 x_tree
= proto_item_add_subtree(x_item
, ett_xmpp_gtalk_nosave_x
);
404 xmpp_display_attrs(x_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
405 xmpp_display_elems(x_tree
, element
, pinfo
, tvb
, NULL
, 0);
409 xmpp_gtalk_mail_query(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
411 proto_item
*query_item
;
412 proto_tree
*query_tree
;
414 xmpp_attr_info attrs_info
[] = {
415 {"xmlns", hf_xmpp_xmlns
, TRUE
, TRUE
, NULL
, NULL
},
416 {"newer-than-time", -1, FALSE
, TRUE
, NULL
, NULL
},
417 {"newer-than-tid", -1, FALSE
, TRUE
, NULL
, NULL
},
418 {"q", -1, FALSE
, TRUE
, NULL
, NULL
}
421 col_append_str(pinfo
->cinfo
, COL_INFO
, "QUERY(google:mail:notify) ");
423 query_item
= proto_tree_add_item(tree
, hf_xmpp_query
, tvb
, element
->offset
, element
->length
,
425 query_tree
= proto_item_add_subtree(query_item
, ett_xmpp_query
);
427 xmpp_display_attrs(query_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
428 xmpp_display_elems(query_tree
, element
, pinfo
, tvb
, NULL
, 0);
432 xmpp_gtalk_mail_mailbox(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
434 proto_item
*mail_item
;
435 proto_tree
*mail_tree
;
437 xmpp_attr_info attrs_info
[] = {
438 {"xmlns", hf_xmpp_xmlns
, FALSE
, TRUE
, NULL
, NULL
},
439 {"result-time", -1, FALSE
, TRUE
, NULL
, NULL
},
440 {"total-matched", -1, FALSE
, TRUE
, NULL
, NULL
},
441 {"total-estimate", -1, FALSE
, TRUE
, NULL
, NULL
},
442 {"url", -1, FALSE
, TRUE
, NULL
, NULL
}
445 xmpp_elem_info elems_info
[] = {
446 {NAME
,"mail-thread-info", xmpp_gtalk_mail_mail_info
, MANY
}
449 col_append_str(pinfo
->cinfo
, COL_INFO
, "MAILBOX ");
451 mail_item
= proto_tree_add_item(tree
, hf_xmpp_gtalk_mail_mailbox
, tvb
, element
->offset
, element
->length
, ENC_BIG_ENDIAN
);
452 mail_tree
= proto_item_add_subtree(mail_item
, ett_xmpp_gtalk_mail_mailbox
);
454 xmpp_display_attrs(mail_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
455 xmpp_display_elems(mail_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
459 xmpp_gtalk_mail_mail_info(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
461 proto_item
*mail_info_item
;
462 proto_tree
*mail_info_tree
;
464 xmpp_attr_info attrs_info
[] = {
465 {"tid", -1, FALSE
, FALSE
, NULL
, NULL
},
466 {"participation", -1, FALSE
, FALSE
, NULL
, NULL
},
467 {"messages", -1, FALSE
, TRUE
, NULL
, NULL
},
468 {"date", -1, FALSE
, TRUE
, NULL
, NULL
},
469 {"url", -1, FALSE
, FALSE
, NULL
, NULL
},
470 {"labels", -1, FALSE
, FALSE
, NULL
, NULL
},
471 {"subject", -1, FALSE
, TRUE
, NULL
, NULL
}
474 xmpp_elem_info elems_info
[] = {
475 {NAME
, "senders", xmpp_gtalk_mail_senders
, ONE
},
476 {NAME
, "snippet", xmpp_gtalk_mail_snippet
, ONE
}/*or MANY?*/
479 xmpp_element_t
*labels
, *subject
;
481 mail_info_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "MAIL-THREAD-INFO");
482 mail_info_tree
= proto_item_add_subtree(mail_info_item
,ett_xmpp_gtalk_mail_mail_info
);
484 if((labels
= xmpp_steal_element_by_name(element
,"labels"))!=NULL
)
486 xmpp_attr_t
*fake_labels
= xmpp_ep_init_attr_t(labels
->data
?labels
->data
->value
:"",labels
->offset
, labels
->length
);
487 g_hash_table_insert(element
->attrs
, (gpointer
)"labels", fake_labels
);
489 if((subject
= xmpp_steal_element_by_name(element
,"subject"))!=NULL
)
491 xmpp_attr_t
*fake_subject
= xmpp_ep_init_attr_t(subject
->data
?subject
->data
->value
:"",subject
->offset
, subject
->length
);
492 g_hash_table_insert(element
->attrs
, (gpointer
)"subject", fake_subject
);
495 xmpp_display_attrs(mail_info_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
496 xmpp_display_elems(mail_info_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
501 xmpp_gtalk_mail_senders(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
503 proto_item
*senders_item
;
504 proto_tree
*senders_tree
;
506 xmpp_elem_info elems_info
[] = {
507 {NAME
, "sender", xmpp_gtalk_mail_sender
, MANY
}
510 senders_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "SENDERS");
511 senders_tree
= proto_item_add_subtree(senders_item
, ett_xmpp_gtalk_mail_senders
);
513 xmpp_display_attrs(senders_tree
, element
, pinfo
, tvb
, NULL
, 0);
514 xmpp_display_elems(senders_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
518 xmpp_gtalk_mail_sender(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
520 proto_item
*sender_item
;
521 proto_tree
*sender_tree
;
523 xmpp_attr_info attrs_info
[] = {
524 {"name", -1, FALSE
, TRUE
, NULL
, NULL
},
525 {"address", -1, FALSE
, TRUE
, NULL
, NULL
},
526 {"originator", -1, FALSE
, TRUE
, NULL
, NULL
},
527 {"unread", -1, FALSE
, TRUE
, NULL
, NULL
}
530 sender_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "SENDER");
531 sender_tree
= proto_item_add_subtree(sender_item
, ett_xmpp_gtalk_mail_sender
);
533 xmpp_display_attrs(sender_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
534 xmpp_display_elems(sender_tree
, element
, pinfo
, tvb
, NULL
, 0);
538 xmpp_gtalk_mail_snippet(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
540 proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "SNIPPET: %s",element
->data
?element
->data
->value
:"");
541 xmpp_unknown(tree
, tvb
, pinfo
, element
);
545 xmpp_gtalk_mail_new_mail(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
547 col_append_str(pinfo
->cinfo
, COL_INFO
, "NEW-MAIL ");
548 proto_tree_add_item(tree
, hf_xmpp_gtalk_mail_new_mail
, tvb
, element
->offset
, element
->length
,
550 xmpp_unknown(tree
, tvb
, pinfo
, element
);
555 xmpp_gtalk_status_query(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
557 proto_item
*query_item
;
558 proto_tree
*query_tree
;
560 xmpp_attr_info attrs_info
[] = {
561 {"xmlns", hf_xmpp_xmlns
, TRUE
, TRUE
, NULL
, NULL
},
562 {"version", -1, FALSE
, TRUE
, NULL
, NULL
},
563 {"status-max", -1, FALSE
, FALSE
, NULL
, NULL
},
564 {"status-list-max", -1, FALSE
, FALSE
, NULL
, NULL
},
565 {"status-list-contents-max", -1, FALSE
, FALSE
, NULL
, NULL
},
566 {"status-min-ver", -1, FALSE
, TRUE
, NULL
, NULL
},
567 {"show", -1, FALSE
, TRUE
, NULL
, NULL
},
568 {"status", -1, FALSE
, TRUE
, NULL
, NULL
},
569 {"invisible", -1, FALSE
, TRUE
, NULL
, NULL
},
572 xmpp_elem_info elems_info
[] = {
573 {NAME
, "status-list", xmpp_gtalk_status_status_list
, MANY
}
576 xmpp_element_t
*status
, *show
, *invisible
;
578 col_append_str(pinfo
->cinfo
, COL_INFO
, "QUERY(google:shared-status) ");
580 query_item
= proto_tree_add_item(tree
, hf_xmpp_query
, tvb
, element
->offset
, element
->length
,
582 query_tree
= proto_item_add_subtree(query_item
, ett_xmpp_query
);
584 if((status
= xmpp_steal_element_by_name(element
,"status"))!=NULL
)
586 xmpp_attr_t
*fake_status
= xmpp_ep_init_attr_t(status
->data
?status
->data
->value
:"",status
->offset
, status
->length
);
587 g_hash_table_insert(element
->attrs
, (gpointer
)"status", fake_status
);
590 if((show
= xmpp_steal_element_by_name(element
,"show"))!=NULL
)
592 xmpp_attr_t
*fake_show
= xmpp_ep_init_attr_t(show
->data
?show
->data
->value
:"",show
->offset
, show
->length
);
593 g_hash_table_insert(element
->attrs
, (gpointer
)"show", fake_show
);
596 if((invisible
= xmpp_steal_element_by_name(element
,"invisible"))!=NULL
)
598 xmpp_attr_t
*value
= xmpp_get_attr(invisible
, "value");
599 xmpp_attr_t
*fake_invisible
= xmpp_ep_init_attr_t(value
?value
->value
:"",invisible
->offset
, invisible
->length
);
600 g_hash_table_insert(element
->attrs
, (gpointer
)"invisible", fake_invisible
);
603 xmpp_display_attrs(query_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
604 xmpp_display_elems(query_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
608 xmpp_gtalk_status_status_list(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
610 proto_item
*list_item
;
611 proto_tree
*list_tree
;
613 xmpp_attr_info attrs_info
[] = {
614 {"show", -1, TRUE
, TRUE
, NULL
, NULL
}
617 xmpp_element_t
*status
;
619 list_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "STATUS LIST");
620 list_tree
= proto_item_add_subtree(list_item
, ett_xmpp_gtalk_status_status_list
);
622 while((status
= xmpp_steal_element_by_name(element
, "status"))!=NULL
)
624 proto_tree_add_text(list_tree
, tvb
, status
->offset
, status
->length
, "STATUS: %s",status
->data
?status
->data
->value
:"");
627 xmpp_display_attrs(list_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
628 xmpp_display_elems(list_tree
, element
, pinfo
, tvb
, NULL
, 0);
631 /*http://www.google.com/transport/p2p*/
633 xmpp_gtalk_transport_p2p(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
)
635 proto_item
*trans_item
;
636 proto_tree
*trans_tree
;
638 xmpp_attr_info attrs_info
[] = {
639 {"xmlns", hf_xmpp_xmlns
, FALSE
, TRUE
, NULL
, NULL
}
642 xmpp_elem_info elems_info
[] = {
643 {NAME
, "candidate", xmpp_gtalk_transport_p2p_cand
, MANY
}
646 trans_item
= proto_tree_add_item(tree
, hf_xmpp_gtalk_transport_p2p
, tvb
, element
->offset
, element
->length
, ENC_BIG_ENDIAN
);
647 trans_tree
= proto_item_add_subtree(trans_item
, ett_xmpp_gtalk_transport_p2p
);
649 xmpp_display_attrs(trans_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
651 xmpp_display_elems(trans_tree
, element
, pinfo
, tvb
, elems_info
, array_length(elems_info
));
655 xmpp_gtalk_transport_p2p_cand(proto_tree
* tree
, tvbuff_t
* tvb
, packet_info
* pinfo
, xmpp_element_t
* element
) {
656 proto_item
*cand_item
;
657 proto_tree
*cand_tree
;
659 xmpp_attr_info attrs_info
[] = {
660 {"xmlns", hf_xmpp_xmlns
, FALSE
, FALSE
, NULL
, NULL
},
661 {"name", -1, FALSE
, TRUE
, NULL
, NULL
},
662 {"generation", -1, FALSE
, FALSE
, NULL
, NULL
},
663 {"network", -1, FALSE
, FALSE
, NULL
, NULL
},
664 {"component", -1, FALSE
, FALSE
, NULL
, NULL
},
665 {"type", -1, FALSE
, FALSE
, NULL
, NULL
},
666 {"protocol", -1, FALSE
, TRUE
, NULL
, NULL
},
667 {"preference", -1, FALSE
, FALSE
, NULL
, NULL
},
668 {"password", -1, FALSE
, FALSE
, NULL
, NULL
},
669 {"username", -1, FALSE
, FALSE
, NULL
, NULL
},
670 {"port", -1, FALSE
, TRUE
, NULL
, NULL
},
671 {"address", -1, FALSE
, TRUE
, NULL
, NULL
}
674 cand_item
= proto_tree_add_text(tree
, tvb
, element
->offset
, element
->length
, "CANDIDATE");
675 cand_tree
= proto_item_add_subtree(cand_item
, ett_xmpp_gtalk_transport_p2p_cand
);
677 xmpp_display_attrs(cand_tree
, element
, pinfo
, tvb
, attrs_info
, array_length(attrs_info
));
678 xmpp_display_elems(cand_tree
, element
, pinfo
, tvb
, NULL
, 0);
682 * Editor modelines - http://www.wireshark.org/tools/modelines.html
687 * indent-tabs-mode: nil
690 * ex: set shiftwidth=4 tabstop=8 expandtab:
691 * :indentSize=4:tabSize=8:noTabs=true: