HACK: pinfo->private_data points to smb_info again
[wireshark-wip.git] / epan / dissectors / packet-xmpp-gtalk.c
blobe2b706ddb07c0dd58953e70989ccf1f23b1b02e7
1 /* xmpp-gtalk.c
2 * Wireshark's XMPP dissector.
4 * GTalk extensions.
6 * Copyright 2011, Mariusz Okroj <okrojmariusz[]gmail.com>
8 * $Id$
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.
29 #include "config.h"
31 #include <glib.h>
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);
59 void
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));
92 static void
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));
114 static void
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);
139 static void
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);
167 static void
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);
206 void
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,
224 ENC_BIG_ENDIAN);
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));
231 static void
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));
249 static void
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);
267 static void
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));
296 static void
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);
316 void
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}
326 guint i;
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);
338 if(elem)
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:"");
346 void
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,
362 ENC_BIG_ENDIAN);
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));
369 static void
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);
389 void
390 xmpp_gtalk_nosave_x(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
392 proto_item *x_item;
393 proto_tree *x_tree;
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,
401 ENC_BIG_ENDIAN);
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);
408 void
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,
424 ENC_BIG_ENDIAN);
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);
431 void
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));
458 static void
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));
500 static void
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));
517 static void
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);
537 static void
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);
544 void
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,
549 ENC_BIG_ENDIAN);
550 xmpp_unknown(tree, tvb, pinfo, element);
554 void
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,
581 ENC_BIG_ENDIAN);
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));
607 static void
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*/
632 void
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));
654 static void
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
684 * Local variables:
685 * c-basic-offset: 4
686 * tab-width: 8
687 * indent-tabs-mode: nil
688 * End:
690 * ex: set shiftwidth=4 tabstop=8 expandtab:
691 * :indentSize=4:tabSize=8:noTabs=true: