From 167f02ab724ecf346c0805014986acedd3208609 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 26 Jun 2013 03:32:08 +1000 Subject: Do not fetch disco#info multiple times --- tools/xmpp_codec.erl | 77 +++++++++++++++++++++++++++------------------------ tools/xmpp_codec.hrl | 4 +-- tools/xmpp_codec.spec | 6 ++-- 3 files changed, 46 insertions(+), 41 deletions(-) (limited to 'tools') diff --git a/tools/xmpp_codec.erl b/tools/xmpp_codec.erl index fe091ed46..84537eb43 100644 --- a/tools/xmpp_codec.erl +++ b/tools/xmpp_codec.erl @@ -1038,7 +1038,8 @@ pp(block, 1) -> [items]; pp(unblock, 1) -> [items]; pp(block_list, 0) -> []; pp(identity, 4) -> [category, type, lang, name]; -pp(disco_info, 4) -> [node, identity, feature, xdata]; +pp(disco_info, 4) -> + [node, identities, features, xdata]; pp(disco_item, 3) -> [jid, name, node]; pp(disco_items, 2) -> [node, items]; pp(private, 1) -> [sub_els]; @@ -12856,54 +12857,56 @@ encode_disco_item_attr_node(_val, _acc) -> [{<<"node">>, _val} | _acc]. decode_disco_info({xmlel, <<"query">>, _attrs, _els}) -> - {Xdata, Feature, Identity} = decode_disco_info_els(_els, - [], [], []), + {Xdata, Features, Identities} = + decode_disco_info_els(_els, [], [], []), Node = decode_disco_info_attrs(_attrs, undefined), - {disco_info, Node, Identity, Feature, Xdata}. + {disco_info, Node, Identities, Features, Xdata}. -decode_disco_info_els([], Xdata, Feature, Identity) -> - {lists:reverse(Xdata), lists:reverse(Feature), - lists:reverse(Identity)}; +decode_disco_info_els([], Xdata, Features, + Identities) -> + {lists:reverse(Xdata), lists:reverse(Features), + lists:reverse(Identities)}; decode_disco_info_els([{xmlel, <<"identity">>, _attrs, _} = _el | _els], - Xdata, Feature, Identity) -> + Xdata, Features, Identities) -> _xmlns = xml:get_attr_s(<<"xmlns">>, _attrs), if _xmlns == <<>>; _xmlns == <<"http://jabber.org/protocol/disco#info">> -> - decode_disco_info_els(_els, Xdata, Feature, - [decode_disco_identity(_el) | Identity]); + decode_disco_info_els(_els, Xdata, Features, + [decode_disco_identity(_el) | Identities]); true -> - decode_disco_info_els(_els, Xdata, Feature, Identity) + decode_disco_info_els(_els, Xdata, Features, Identities) end; decode_disco_info_els([{xmlel, <<"feature">>, _attrs, _} = _el | _els], - Xdata, Feature, Identity) -> + Xdata, Features, Identities) -> _xmlns = xml:get_attr_s(<<"xmlns">>, _attrs), if _xmlns == <<>>; _xmlns == <<"http://jabber.org/protocol/disco#info">> -> decode_disco_info_els(_els, Xdata, - [decode_disco_feature(_el) | Feature], - Identity); + [decode_disco_feature(_el) | Features], + Identities); true -> - decode_disco_info_els(_els, Xdata, Feature, Identity) + decode_disco_info_els(_els, Xdata, Features, Identities) end; decode_disco_info_els([{xmlel, <<"x">>, _attrs, _} = _el | _els], - Xdata, Feature, Identity) -> + Xdata, Features, Identities) -> _xmlns = xml:get_attr_s(<<"xmlns">>, _attrs), if _xmlns == <<"jabber:x:data">> -> decode_disco_info_els(_els, [decode_xdata(_el) | Xdata], - Feature, Identity); + Features, Identities); true -> - decode_disco_info_els(_els, Xdata, Feature, Identity) + decode_disco_info_els(_els, Xdata, Features, Identities) end; -decode_disco_info_els([_ | _els], Xdata, Feature, - Identity) -> - decode_disco_info_els(_els, Xdata, Feature, Identity). +decode_disco_info_els([_ | _els], Xdata, Features, + Identities) -> + decode_disco_info_els(_els, Xdata, Features, + Identities). decode_disco_info_attrs([{<<"node">>, _val} | _attrs], _Node) -> @@ -12913,13 +12916,13 @@ decode_disco_info_attrs([_ | _attrs], Node) -> decode_disco_info_attrs([], Node) -> decode_disco_info_attr_node(Node). -encode_disco_info({disco_info, Node, Identity, Feature, - Xdata}, +encode_disco_info({disco_info, Node, Identities, + Features, Xdata}, _xmlns_attrs) -> - _els = 'encode_disco_info_$identity'(Identity, - 'encode_disco_info_$feature'(Feature, - 'encode_disco_info_$xdata'(Xdata, - []))), + _els = 'encode_disco_info_$identities'(Identities, + 'encode_disco_info_$features'(Features, + 'encode_disco_info_$xdata'(Xdata, + []))), _attrs = encode_disco_info_attr_node(Node, _xmlns_attrs), {xmlel, <<"query">>, _attrs, _els}. @@ -12932,16 +12935,18 @@ encode_disco_info({disco_info, Node, Identity, Feature, <<"jabber:x:data">>}]) | _acc]). -'encode_disco_info_$feature'([], _acc) -> _acc; -'encode_disco_info_$feature'([Feature | _els], _acc) -> - 'encode_disco_info_$feature'(_els, - [encode_disco_feature(Feature, []) | _acc]). - -'encode_disco_info_$identity'([], _acc) -> _acc; -'encode_disco_info_$identity'([Identity | _els], +'encode_disco_info_$features'([], _acc) -> _acc; +'encode_disco_info_$features'([Features | _els], _acc) -> - 'encode_disco_info_$identity'(_els, - [encode_disco_identity(Identity, []) | _acc]). + 'encode_disco_info_$features'(_els, + [encode_disco_feature(Features, []) | _acc]). + +'encode_disco_info_$identities'([], _acc) -> _acc; +'encode_disco_info_$identities'([Identities | _els], + _acc) -> + 'encode_disco_info_$identities'(_els, + [encode_disco_identity(Identities, []) + | _acc]). decode_disco_info_attr_node(undefined) -> undefined; decode_disco_info_attr_node(_val) -> _val. diff --git a/tools/xmpp_codec.hrl b/tools/xmpp_codec.hrl index 4e2bf3542..9ab129383 100644 --- a/tools/xmpp_codec.hrl +++ b/tools/xmpp_codec.hrl @@ -337,8 +337,8 @@ retract :: #pubsub_retract{}}). -record(disco_info, {node :: binary(), - identity = [] :: [#identity{}], - feature = [] :: [binary()], + identities = [] :: [#identity{}], + features = [] :: [binary()], xdata = [] :: [#xdata{}]}). -record(sasl_mechanisms, {list = [] :: [binary()]}). diff --git a/tools/xmpp_codec.spec b/tools/xmpp_codec.spec index bf224780f..6450c2b4b 100644 --- a/tools/xmpp_codec.spec +++ b/tools/xmpp_codec.spec @@ -196,12 +196,12 @@ {disco_info, #elem{name = <<"query">>, xmlns = <<"http://jabber.org/protocol/disco#info">>, - result = {disco_info, '$node', '$identity', '$feature', '$xdata'}, + result = {disco_info, '$node', '$identities', '$features', '$xdata'}, attrs = [#attr{name = <<"node">>}], refs = [#ref{name = disco_identity, - label = '$identity'}, + label = '$identities'}, #ref{name = disco_feature, - label = '$feature'}, + label = '$features'}, #ref{name = xdata, label = '$xdata'}]}}. -- cgit v1.2.3