aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-aim-buddylist.c
diff options
context:
space:
mode:
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2004-09-21 08:01:29 +0000
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2004-09-21 08:01:29 +0000
commita78e66cfbb93402071031337c5ee5972827a39fb (patch)
treeb1fa0013f96edec2436ff6962ce8eef4053910b5 /epan/dissectors/packet-aim-buddylist.c
parent2a33a6e285e2e035b5f469efc69b6bf2ed06ecde (diff)
From Jelmer Vernooij:
Remove some code duplication from the Oscar dissector (reduces the number of lines by 500) by providing a custom registration function for oscar families (aim_init_family). This also fixes a number of issues with column names. Add minor updates such as adding support for the Capability Info TLV on users. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@12060 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-aim-buddylist.c')
-rw-r--r--epan/dissectors/packet-aim-buddylist.c255
1 files changed, 99 insertions, 156 deletions
diff --git a/epan/dissectors/packet-aim-buddylist.c b/epan/dissectors/packet-aim-buddylist.c
index 2a2cbe2bda..e7b5f49a5b 100644
--- a/epan/dissectors/packet-aim-buddylist.c
+++ b/epan/dissectors/packet-aim-buddylist.c
@@ -42,31 +42,6 @@
#define FAMILY_BUDDYLIST 0x0003
-/* Family Buddy List */
-#define FAMILY_BUDDYLIST_ERROR 0x0001
-#define FAMILY_BUDDYLIST_REQRIGHTS 0x0002
-#define FAMILY_BUDDYLIST_RIGHTSINFO 0x0003
-#define FAMILY_BUDDYLIST_ADDBUDDY 0x0004
-#define FAMILY_BUDDYLIST_REMBUDDY 0x0005
-#define FAMILY_BUDDYLIST_WATCHERS_REQ 0x0006
-#define FAMILY_BUDDYLIST_WATCHERS_REP 0x0007
-#define FAMILY_BUDDYLIST_REJECT 0x000a
-#define FAMILY_BUDDYLIST_ONCOMING 0x000b
-#define FAMILY_BUDDYLIST_OFFGOING 0x000c
-#define FAMILY_BUDDYLIST_DEFAULT 0xffff
-
-static const value_string aim_fnac_family_buddylist[] = {
- { FAMILY_BUDDYLIST_ERROR, "Error" },
- { FAMILY_BUDDYLIST_REQRIGHTS, "Request Rights" },
- { FAMILY_BUDDYLIST_RIGHTSINFO, "Rights Info" },
- { FAMILY_BUDDYLIST_ADDBUDDY, "Add Buddy" },
- { FAMILY_BUDDYLIST_REMBUDDY, "Remove Buddy" },
- { FAMILY_BUDDYLIST_REJECT, "Reject Buddy" },
- { FAMILY_BUDDYLIST_ONCOMING, "Oncoming Buddy" },
- { FAMILY_BUDDYLIST_OFFGOING, "Offgoing Buddy" },
- { FAMILY_BUDDYLIST_DEFAULT, "Buddy Default" },
- { 0, NULL }
-};
#define AIM_BUDDYLIST_TLV_MAX_CONTACT_ENTRIES 0x0001
#define AIM_BUDDYLIST_TLV_MAX_WATCHER_ENTRIES 0x0002
@@ -82,154 +57,122 @@ const aim_tlv buddylist_tlvs[] = {
/* Initialize the protocol and registered fields */
static int proto_aim_buddylist = -1;
-static int hf_aim_buddyname_len = -1;
-static int hf_aim_buddyname = -1;
static int hf_aim_userinfo_warninglevel = -1;
-static int hf_aim_userinfo_tlvcount = -1;
/* Initialize the subtree pointers */
static gint ett_aim_buddylist = -1;
-static int dissect_aim_snac_buddylist(tvbuff_t *tvb, packet_info *pinfo,
- proto_tree *tree)
+static int dissect_aim_buddylist_buddylist(tvbuff_t *tvb, packet_info *pinfo, proto_tree *buddy_tree)
+{
+ int offset = 0;
+ while(tvb_length_remaining(tvb, offset) > 0) {
+ offset = dissect_aim_buddyname( tvb, pinfo, offset, buddy_tree);
+ }
+ return offset;
+}
+
+static int dissect_aim_buddylist_rights_repl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *buddy_tree)
+{
+ int offset = 0;
+ while(tvb_length_remaining(tvb, offset) > 0) {
+ offset = dissect_aim_tlv( tvb, pinfo, offset, buddy_tree, buddylist_tlvs);
+ }
+ return offset;
+}
+
+static int dissect_aim_buddylist_reject(tvbuff_t *tvb, packet_info *pinfo, proto_tree *buddy_tree)
+{
+ return dissect_aim_buddyname(tvb, pinfo, 0, buddy_tree);
+}
+
+static int dissect_aim_buddylist_oncoming(tvbuff_t *tvb, packet_info *pinfo, proto_tree *buddy_tree)
+{
+ char buddyname[MAX_BUDDYNAME_LENGTH+1];
+ int offset = 0;
+ int buddyname_length = aim_get_buddyname( buddyname, tvb, offset, offset + 1 );
+
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_add_fstr(pinfo->cinfo, COL_INFO, "Oncoming Buddy");
+ col_append_fstr(pinfo->cinfo, COL_INFO, ": %s",
+ format_text(buddyname, buddyname_length));
+ }
+
+ offset += dissect_aim_buddyname(tvb, pinfo, offset, buddy_tree);
+
+ /* Warning level */
+ proto_tree_add_item(buddy_tree, hf_aim_userinfo_warninglevel, tvb, offset,
+ 2, FALSE);
+ offset += 2;
+
+ offset = dissect_aim_tlv_list(tvb, pinfo, offset, buddy_tree, onlinebuddy_tlvs);
+
+ return offset;
+}
+
+static int dissect_aim_buddylist_offgoing(tvbuff_t *tvb, packet_info *pinfo, proto_tree *buddy_tree)
{
- guint8 buddyname_length = 0;
- char buddyname[MAX_BUDDYNAME_LENGTH + 1];
- guint16 tlv_count = 0;
- struct aiminfo *aiminfo = pinfo->private_data;
- int offset = 0;
- proto_item *ti;
- proto_tree *buddy_tree = NULL;
-
- if(tree) {
- ti = proto_tree_add_text(tree, tvb, 0, -1, "Buddy List Service");
- buddy_tree = proto_item_add_subtree(ti, ett_aim_buddylist);
- }
-
-
- switch(aiminfo->subtype)
- {
- case FAMILY_BUDDYLIST_REQRIGHTS:
- case FAMILY_BUDDYLIST_WATCHERS_REQ:
- /* No data */
- return 0;
- case FAMILY_BUDDYLIST_REMBUDDY:
- case FAMILY_BUDDYLIST_ADDBUDDY:
- case FAMILY_BUDDYLIST_WATCHERS_REP:
- while(tvb_length_remaining(tvb, offset) > 0) {
- offset = dissect_aim_buddyname( tvb, pinfo, offset, buddy_tree);
- }
- return offset;
- case FAMILY_BUDDYLIST_ERROR:
- return dissect_aim_snac_error(tvb, pinfo, offset, buddy_tree);
- case FAMILY_BUDDYLIST_RIGHTSINFO:
- while(tvb_length_remaining(tvb, offset) > 0) {
- offset = dissect_aim_tlv( tvb, pinfo, offset, buddy_tree, buddylist_tlvs);
- }
- return offset;
- case FAMILY_BUDDYLIST_REJECT:
- return dissect_aim_buddyname(tvb, pinfo, offset, buddy_tree);
- case FAMILY_BUDDYLIST_ONCOMING:
- buddyname_length = aim_get_buddyname( buddyname, tvb, offset, offset + 1 );
-
- if (check_col(pinfo->cinfo, COL_INFO)) {
- col_add_fstr(pinfo->cinfo, COL_INFO, "Oncoming Buddy");
- col_append_fstr(pinfo->cinfo, COL_INFO, ": %s",
- format_text(buddyname, buddyname_length));
- }
-
- if (buddy_tree) {
- proto_tree_add_text(buddy_tree, tvb, offset + 1, buddyname_length,
- "Screen Name: %s",
- format_text(buddyname, buddyname_length));
- }
- offset += buddyname_length + 1;
-
- /* Warning level */
- proto_tree_add_item(buddy_tree, hf_aim_userinfo_warninglevel, tvb, offset,
- 2, FALSE);
- offset += 2;
-
- /* TLV Count */
- tlv_count = tvb_get_ntohs(tvb, offset);
- proto_tree_add_item(buddy_tree, hf_aim_userinfo_tlvcount, tvb, offset,
- 2, FALSE);
- offset += 2;
-
- while (tvb_length_remaining(tvb, offset) > 0) {
- offset = dissect_aim_tlv(tvb, pinfo, offset, buddy_tree, onlinebuddy_tlvs);
- }
-
- return offset;
-
- case FAMILY_BUDDYLIST_OFFGOING:
- buddyname_length = aim_get_buddyname( buddyname, tvb, offset, offset + 1 );
-
- if (check_col(pinfo->cinfo, COL_INFO)) {
- col_add_fstr(pinfo->cinfo, COL_INFO, "Offgoing Buddy");
- col_append_fstr(pinfo->cinfo, COL_INFO, ": %s",
- format_text(buddyname, buddyname_length));
- }
-
- if (buddy_tree) {
- proto_tree_add_text(buddy_tree, tvb, offset + 1, buddyname_length,
- "Screen Name: %s",
- format_text(buddyname, buddyname_length));
- }
- offset += buddyname_length + 1;
-
- /* Warning level */
- proto_tree_add_item(buddy_tree, hf_aim_userinfo_warninglevel, tvb, offset,
- 2, FALSE);
- offset += 2;
-
- return dissect_aim_tlv_list(tvb, pinfo, offset, buddy_tree, onlinebuddy_tlvs);
- default:
- return 0;
- }
+
+ char buddyname[MAX_BUDDYNAME_LENGTH+1];
+ int offset = 0;
+ int buddyname_length = aim_get_buddyname( buddyname, tvb, offset, offset + 1 );
+
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_add_fstr(pinfo->cinfo, COL_INFO, "Offgoing Buddy");
+ col_append_fstr(pinfo->cinfo, COL_INFO, ": %s",
+ format_text(buddyname, buddyname_length));
+ }
+
+ offset += dissect_aim_buddyname(tvb, pinfo, offset, buddy_tree);
+
+ /* Warning level */
+ proto_tree_add_item(buddy_tree, hf_aim_userinfo_warninglevel, tvb, offset,
+ 2, FALSE);
+ offset += 2;
+
+ return dissect_aim_tlv_list(tvb, pinfo, offset, buddy_tree, onlinebuddy_tlvs);
}
+static const aim_subtype aim_fnac_family_buddylist[] = {
+ { 0x0001, "Error", dissect_aim_snac_error },
+ { 0x0002, "Rights Request", NULL },
+ { 0x0003, "Rights Reply", dissect_aim_buddylist_rights_repl },
+ { 0x0004, "Add Buddy", dissect_aim_buddylist_buddylist },
+ { 0x0005, "Remove Buddy", dissect_aim_buddylist_buddylist },
+ { 0x0006, "Watchers List Request", NULL },
+ { 0x0007, "Watchers List Reply", dissect_aim_buddylist_buddylist },
+ { 0x000a, "Reject Buddy", dissect_aim_buddylist_reject },
+ { 0x000b, "Oncoming Buddy", dissect_aim_buddylist_oncoming },
+ { 0x000c, "Offgoing Buddy", dissect_aim_buddylist_offgoing },
+ { 0, NULL, NULL }
+};
/* Register the protocol with Ethereal */
void
proto_register_aim_buddylist(void)
{
-/* Setup list of header fields */
- static hf_register_info hf[] = {
- { &hf_aim_buddyname_len,
- { "Buddyname len", "aim.buddynamelen", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }
- },
- { &hf_aim_buddyname,
- { "Buddy Name", "aim.buddyname", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }
- },
- { &hf_aim_userinfo_warninglevel,
- { "Warning Level", "aim.userinfo.warninglevel", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL },
- },
- { &hf_aim_userinfo_tlvcount,
- { "TLV Count", "aim.userinfo.tlvcount", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL },
- },
- };
-
-/* Setup protocol subtree array */
- static gint *ett[] = {
- &ett_aim_buddylist,
- };
-
-/* Register the protocol name and description */
- proto_aim_buddylist = proto_register_protocol("AIM Buddylist Service", "AIM Buddylist", "aim_buddylist");
-
-/* Required function calls to register the header fields and subtrees used */
- proto_register_field_array(proto_aim_buddylist, hf, array_length(hf));
- proto_register_subtree_array(ett, array_length(ett));
+ /* Setup list of header fields */
+ static hf_register_info hf[] = {
+ { &hf_aim_userinfo_warninglevel,
+ { "Warning Level", "aim.userinfo.warninglevel", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL },
+ },
+ };
+
+ /* Setup protocol subtree array */
+ static gint *ett[] = {
+ &ett_aim_buddylist,
+ };
+
+ /* Register the protocol name and description */
+ proto_aim_buddylist = proto_register_protocol("AIM Buddylist Service", "AIM Buddylist", "aim_buddylist");
+
+ /* Required function calls to register the header fields and subtrees used */
+ proto_register_field_array(proto_aim_buddylist, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
}
void
proto_reg_handoff_aim_buddylist(void)
{
- dissector_handle_t aim_handle;
-
- aim_handle = new_create_dissector_handle(dissect_aim_snac_buddylist, proto_aim_buddylist);
- dissector_add("aim.family", FAMILY_BUDDYLIST, aim_handle);
- aim_init_family(FAMILY_BUDDYLIST, "Buddylist", aim_fnac_family_buddylist);
+ aim_init_family(proto_aim_buddylist, ett_aim_buddylist, FAMILY_BUDDYLIST, aim_fnac_family_buddylist);
}