Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2013-04-08 13:12:54 +0400
committerChristophe Romain <christophe.romain@process-one.net>2013-06-13 13:11:02 +0400
commit4d8f7706240a1603468968f47fc7b150b788d62f (patch)
tree92d55d789cc7ac979b3c9e161ffb7f908eba043a /tools
parent4f77348255a16982ffb494b684b061d34db27608 (diff)
Switch to rebar build tool
Use dynamic Rebar configuration Make iconv dependency optional Disable transient_supervisors compile option Add hipe compilation support Only compile ibrowse and lhttpc when needed Make it possible to generate an OTP application release Add --enable-debug compile option Add --enable-all compiler option Add --enable-tools configure option Add --with-erlang configure option. Add --enable-erlang-version-check configure option. Add lager support Improve the test suite
Diffstat (limited to 'tools')
-rw-r--r--tools/p1_prof.erl328
-rw-r--r--tools/xmpp_codec.erl10301
-rw-r--r--tools/xmpp_codec.hrl168
-rw-r--r--tools/xmpp_codec.spec1244
4 files changed, 12041 insertions, 0 deletions
diff --git a/tools/p1_prof.erl b/tools/p1_prof.erl
new file mode 100644
index 000000000..cec73d506
--- /dev/null
+++ b/tools/p1_prof.erl
@@ -0,0 +1,328 @@
+%%%-------------------------------------------------------------------
+%%% File : p1_prof.erl
+%%% Author : Evgeniy Khramtsov <ekhramtsov@process-one.net>
+%%% Description : Handy wrapper around eprof and fprof
+%%%
+%%% Created : 23 Jan 2010 by Evgeniy Khramtsov <ekhramtsov@process-one.net>
+%%%
+%%%
+%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
+%%%
+%%% This program is free software; you can redistribute it and/or
+%%% modify it under the terms of the GNU General Public License as
+%%% published by the Free Software Foundation; either version 2 of the
+%%% License, or (at your option) any later version.
+%%%
+%%% This program is distributed in the hope that it will be useful,
+%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%%% General Public License for more details.
+%%%
+%%% You should have received a copy of the GNU General Public License
+%%% along with this program; if not, write to the Free Software
+%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+%%% 02111-1307 USA
+%%%
+%%%-------------------------------------------------------------------
+-module(p1_prof).
+
+%% API
+-export([eprof_start/0, eprof_stop/0,
+ fprof_start/0, fprof_start/1,
+ fprof_stop/0, fprof_analyze/0,
+ queue/0, queue/1, memory/0, memory/1,
+ reds/0, reds/1, trace/1, help/0,
+ q/0, m/0, r/0, q/1, m/1, r/1]).
+
+-define(TRACE_FILE, "/tmp/fprof.trace").
+-define(ANALYSIS_FILE, "/tmp/fprof.analysis").
+
+%%====================================================================
+%% API
+%%====================================================================
+eprof_start() ->
+ eprof:start(),
+ case get_procs() of
+ [] ->
+ {error, no_procs_found};
+ Procs ->
+ eprof:start_profiling(Procs)
+ end.
+
+fprof_start() ->
+ fprof_start(0).
+
+fprof_start(Duration) ->
+ case get_procs() of
+ [] ->
+ {error, no_procs_found};
+ Procs ->
+ case fprof:trace([start, {procs, Procs}, {file, ?TRACE_FILE}]) of
+ ok ->
+ io:format("Profiling started, writing trace data to ~s~n",
+ [?TRACE_FILE]),
+ if Duration > 0 ->
+ timer:sleep(Duration*1000),
+ fprof:trace([stop]),
+ fprof:stop();
+ true->
+ ok
+ end;
+ Err ->
+ io:format("Couldn't start profiling: ~p~n", [Err]),
+ Err
+ end
+ end.
+
+fprof_stop() ->
+ fprof:trace([stop]),
+ case fprof:profile([{file, ?TRACE_FILE}]) of
+ ok ->
+ case fprof:analyse([totals, no_details, {sort, own},
+ no_callers, {dest, ?ANALYSIS_FILE}]) of
+ ok ->
+ fprof:stop(),
+ format_fprof_analyze();
+ Err ->
+ io:format("Couldn't analyze: ~p~n", [Err]),
+ Err
+ end;
+ Err ->
+ io:format("Couldn't compile a trace into profile data: ~p~n",
+ [Err]),
+ Err
+ end.
+
+fprof_analyze() ->
+ fprof_stop().
+
+eprof_stop() ->
+ eprof:stop_profiling(),
+ case erlang:function_exported(eprof, analyse, 0) of
+ true ->
+ eprof:analyse();
+ false ->
+ eprof:analyze()
+ end.
+
+help() ->
+ M = ?MODULE,
+ io:format("Brief help:~n"
+ "~p:queue(N) - show top N pids sorted by queue length~n"
+ "~p:queue() - shorthand for ~p:queue(10)~n"
+ "~p:memory(N) - show top N pids sorted by memory usage~n"
+ "~p:memory() - shorthand for ~p:memory(10)~n"
+ "~p:reds(N) - show top N pids sorted by reductions~n"
+ "~p:reds() - shorthand for ~p:reds(10)~n"
+ "~p:q(N)|~p:q() - same as ~p:queue(N)|~p:queue()~n"
+ "~p:m(N)|~p:m() - same as ~p:memory(N)|~p:memory()~n"
+ "~p:r(N)|~p:r() - same as ~p:reds(N)|~p:reds()~n"
+ "~p:trace(Pid) - trace Pid; to stop tracing close "
+ "Erlang shell with Ctrl+C~n"
+ "~p:eprof_start() - start eprof on all available pids; "
+ "DO NOT use on production system!~n"
+ "~p:eprof_stop() - stop eprof and print result~n"
+ "~p:fprof_start() - start fprof on all available pids; "
+ "DO NOT use on production system!~n"
+ "~p:fprof_stop() - stop eprof and print formatted result~n"
+ "~p:fprof_start(N) - start and run fprof for N seconds; "
+ "use ~p:fprof_analyze() to analyze collected statistics and "
+ "print formatted result; use on production system with CARE~n"
+ "~p:fprof_analyze() - analyze previously collected statistics "
+ "using ~p:fprof_start(N) and print formatted result~n"
+ "~p:help() - print this help~n",
+ lists:duplicate(31, M)).
+
+q() ->
+ queue().
+
+q(N) ->
+ queue(N).
+
+m() ->
+ memory().
+
+m(N) ->
+ memory(N).
+
+r() ->
+ reds().
+
+r(N) ->
+ reds(N).
+
+queue() ->
+ queue(10).
+
+memory() ->
+ memory(10).
+
+reds() ->
+ reds(10).
+
+queue(N) ->
+ dump(N, lists:reverse(lists:ukeysort(1, all_pids(queue)))).
+
+memory(N) ->
+ dump(N, lists:reverse(lists:ukeysort(3, all_pids(memory)))).
+
+reds(N) ->
+ dump(N, lists:reverse(lists:ukeysort(4, all_pids(reductions)))).
+
+trace(Pid) ->
+ erlang:trace(Pid, true, [send, 'receive']),
+ trace_loop().
+
+trace_loop() ->
+ receive
+ M ->
+ io:format("~p~n", [M]),
+ trace_loop()
+ end.
+
+%%====================================================================
+%% Internal functions
+%%====================================================================
+get_procs() ->
+ processes().
+
+format_fprof_analyze() ->
+ case file:consult(?ANALYSIS_FILE) of
+ {ok, [_, [{totals, _, _, TotalOWN}] | Rest]} ->
+ OWNs = lists:flatmap(
+ fun({MFA, _, _, OWN}) ->
+ Percent = OWN*100/TotalOWN,
+ case round(Percent) of
+ 0 ->
+ [];
+ _ ->
+ [{mfa_to_list(MFA), Percent}]
+ end
+ end, Rest),
+ ACCs = collect_accs(Rest),
+ MaxACC = find_max(ACCs),
+ MaxOWN = find_max(OWNs),
+ io:format("=== Sorted by OWN:~n"),
+ lists:foreach(
+ fun({MFA, Per}) ->
+ L = length(MFA),
+ S = lists:duplicate(MaxOWN - L + 2, $ ),
+ io:format("~s~s~.2f%~n", [MFA, S, Per])
+ end, lists:reverse(lists:keysort(2, OWNs))),
+ io:format("~n=== Sorted by ACC:~n"),
+ lists:foreach(
+ fun({MFA, Per}) ->
+ L = length(MFA),
+ S = lists:duplicate(MaxACC - L + 2, $ ),
+ io:format("~s~s~.2f%~n", [MFA, S, Per])
+ end, lists:reverse(lists:keysort(2, ACCs)));
+ Err ->
+ Err
+ end.
+
+mfa_to_list({M, F, A}) ->
+ atom_to_list(M) ++ ":" ++ atom_to_list(F) ++ "/" ++ integer_to_list(A);
+mfa_to_list(F) when is_atom(F) ->
+ atom_to_list(F).
+
+find_max(List) ->
+ find_max(List, 0).
+
+find_max([{V, _}|Tail], Acc) ->
+ find_max(Tail, lists:max([length(V), Acc]));
+find_max([], Acc) ->
+ Acc.
+
+collect_accs(List) ->
+ List1 = lists:filter(
+ fun({MFA, _, _, _}) ->
+ case MFA of
+ {sys, _, _} ->
+ false;
+ suspend ->
+ false;
+ {gen_fsm, _, _} ->
+ false;
+ {p1_fsm, _, _} ->
+ false;
+ {gen, _, _} ->
+ false;
+ {gen_server, _, _} ->
+ false;
+ {proc_lib, _, _} ->
+ false;
+ _ ->
+ true
+ end
+ end, List),
+ TotalACC = lists:sum([A || {_, _, A, _} <- List1]),
+ lists:flatmap(
+ fun({MFA, _, ACC, _}) ->
+ Percent = ACC*100/TotalACC,
+ case round(Percent) of
+ 0 ->
+ [];
+ _ ->
+ [{mfa_to_list(MFA), Percent}]
+ end
+ end, List1).
+
+all_pids(Type) ->
+ lists:foldl(
+ fun(P, Acc) when P == self() ->
+ %% exclude ourself from statistics
+ Acc;
+ (P, Acc) ->
+ case catch process_info(
+ P,
+ [message_queue_len,
+ memory,
+ reductions,
+ dictionary,
+ current_function,
+ registered_name]) of
+ [{_, Len}, {_, Memory}, {_, Reds},
+ {_, Dict}, {_, CurFun}, {_, RegName}] ->
+ IntQLen = case lists:keysearch('$internal_queue_len', 1, Dict) of
+ {value, {_, N}} ->
+ N;
+ _ ->
+ 0
+ end,
+ if Type == queue andalso Len == 0 andalso IntQLen == 0 ->
+ Acc;
+ true ->
+ MaxLen = lists:max([Len, IntQLen]),
+ [{MaxLen, Len, Memory, Reds, Dict, CurFun, P, RegName}|Acc]
+ end;
+ _ ->
+ Acc
+ end
+ end, [], processes()).
+
+dump(N, Rs) ->
+ lists:foreach(
+ fun({_, MsgQLen, Memory, Reds, Dict, CurFun, Pid, RegName}) ->
+ PidStr = pid_to_list(Pid),
+ [_, Maj, Min] = string:tokens(
+ string:substr(
+ PidStr, 2, length(PidStr) - 2), "."),
+ io:format("** pid(0,~s,~s)~n"
+ "** registered name: ~p~n"
+ "** memory: ~p~n"
+ "** reductions: ~p~n"
+ "** message queue len: ~p~n"
+ "** current_function: ~p~n"
+ "** dictionary: ~p~n~n",
+ [Maj, Min, RegName, Memory, Reds, MsgQLen, CurFun, Dict])
+ end, nthhead(N, Rs)).
+
+nthhead(N, L) ->
+ lists:reverse(nthhead(N, L, [])).
+
+nthhead(0, _L, Acc) ->
+ Acc;
+nthhead(N, [H|T], Acc) ->
+ nthhead(N-1, T, [H|Acc]);
+nthhead(_N, [], Acc) ->
+ Acc.
diff --git a/tools/xmpp_codec.erl b/tools/xmpp_codec.erl
new file mode 100644
index 000000000..37ea49dd8
--- /dev/null
+++ b/tools/xmpp_codec.erl
@@ -0,0 +1,10301 @@
+-module(xmpp_codec).
+
+-export([decode/1, encode/1]).
+
+decode({xmlel, _name, _attrs, _} = _el) ->
+ case {_name, xml:get_attr_s(<<"xmlns">>, _attrs)} of
+ {<<"delay">>, <<"urn:xmpp:delay">>} ->
+ decode_delay_delay(_el);
+ {<<"pubsub">>,
+ <<"http://jabber.org/protocol/pubsub">>} ->
+ decode_pubsub_pubsub(_el);
+ {<<"event">>,
+ <<"http://jabber.org/protocol/pubsub#event">>} ->
+ decode_pubsub_event_event(_el);
+ {<<"items">>, <<>>} -> decode_pubsub_items_items(_el);
+ {<<"item">>, <<>>} -> decode_pubsub_item_item(_el);
+ {<<"affiliation">>, <<>>} ->
+ decode_pubsub_affiliation_affiliation(_el);
+ {<<"subscription">>, <<>>} ->
+ decode_pubsub_subscription_subscription(_el);
+ {<<"x">>, <<"jabber:x:data">>} -> decode_xdata_x(_el);
+ {<<"field">>, <<>>} -> decode_xfield_field(_el);
+ {<<"vCard">>, <<"vcard-temp">>} ->
+ decode_vcard_vCard(_el);
+ {<<"KEY">>, <<>>} -> decode_vcard_key_KEY(_el);
+ {<<"SOUND">>, <<>>} -> decode_vcard_sound_SOUND(_el);
+ {<<"ORG">>, <<>>} -> decode_vcard_org_ORG(_el);
+ {<<"PHOTO">>, <<>>} -> decode_vcard_photo_PHOTO(_el);
+ {<<"LOGO">>, <<>>} -> decode_vcard_logo_LOGO(_el);
+ {<<"EXTVAL">>, <<>>} -> decode_vcard_extval_EXTVAL(_el);
+ {<<"BINVAL">>, <<>>} -> decode_vcard_binval_BINVAL(_el);
+ {<<"TYPE">>, <<>>} -> decode_vcard_type_TYPE(_el);
+ {<<"GEO">>, <<>>} -> decode_vcard_geo_GEO(_el);
+ {<<"EMAIL">>, <<>>} -> decode_vcard_email_EMAIL(_el);
+ {<<"TEL">>, <<>>} -> decode_vcard_tel_TEL(_el);
+ {<<"LABEL">>, <<>>} -> decode_vcard_label_LABEL(_el);
+ {<<"ADR">>, <<>>} -> decode_vcard_adr_ADR(_el);
+ {<<"N">>, <<>>} -> decode_vcard_name_N(_el);
+ {<<"stream:error">>, <<>>} ->
+ 'decode_stream_error_stream:error'(_el);
+ {<<"time">>, <<"urn:xmpp:time">>} ->
+ decode_time_time(_el);
+ {<<"ping">>, <<"urn:xmpp:ping">>} ->
+ decode_ping_ping(_el);
+ {<<"session">>,
+ <<"urn:ietf:params:xml:ns:xmpp-session">>} ->
+ decode_session_session(_el);
+ {<<"register">>,
+ <<"http://jabber.org/features/iq-register">>} ->
+ decode_register_register(_el);
+ {<<"c">>, <<"http://jabber.org/protocol/caps">>} ->
+ decode_caps_c(_el);
+ {<<"ack">>, <<"p1:ack">>} -> decode_p1_ack_ack(_el);
+ {<<"rebind">>, <<"p1:rebind">>} ->
+ decode_p1_rebind_rebind(_el);
+ {<<"push">>, <<"p1:push">>} -> decode_p1_push_push(_el);
+ {<<"stream:features">>, <<>>} ->
+ 'decode_stream_features_stream:features'(_el);
+ {<<"failure">>,
+ <<"urn:ietf:params:xml:ns:xmpp-tls">>} ->
+ decode_starttls_failure_failure(_el);
+ {<<"proceed">>,
+ <<"urn:ietf:params:xml:ns:xmpp-tls">>} ->
+ decode_starttls_proceed_proceed(_el);
+ {<<"starttls">>,
+ <<"urn:ietf:params:xml:ns:xmpp-tls">>} ->
+ decode_starttls_starttls(_el);
+ {<<"mechanisms">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>} ->
+ decode_sasl_mechanisms_mechanisms(_el);
+ {<<"mechanism">>, <<>>} ->
+ decode_sasl_mechanism_mechanism(_el);
+ {<<"failure">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>} ->
+ decode_sasl_failure_failure(_el);
+ {<<"success">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>} ->
+ decode_sasl_success_success(_el);
+ {<<"response">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>} ->
+ decode_sasl_response_response(_el);
+ {<<"challenge">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>} ->
+ decode_sasl_challenge_challenge(_el);
+ {<<"abort">>, <<"urn:ietf:params:xml:ns:xmpp-sasl">>} ->
+ decode_sasl_abort_abort(_el);
+ {<<"auth">>, <<"urn:ietf:params:xml:ns:xmpp-sasl">>} ->
+ decode_sasl_auth_auth(_el);
+ {<<"bind">>, <<"urn:ietf:params:xml:ns:xmpp-bind">>} ->
+ decode_bind_bind(_el);
+ {<<"error">>, <<>>} -> decode_error_error(_el);
+ {<<"presence">>, <<>>} -> decode_presence_presence(_el);
+ {<<"message">>, <<>>} -> decode_message_message(_el);
+ {<<"iq">>, <<>>} -> decode_iq_iq(_el);
+ {<<"query">>, <<"http://jabber.org/protocol/stats">>} ->
+ decode_stats_query(_el);
+ {<<"storage">>, <<"storage:bookmarks">>} ->
+ decode_storage_bookmarks_storage(_el);
+ {<<"conference">>, <<>>} ->
+ decode_bookmark_conference_conference(_el);
+ {<<"query">>, <<"jabber:iq:private">>} ->
+ decode_private_query(_el);
+ {<<"query">>,
+ <<"http://jabber.org/protocol/disco#items">>} ->
+ decode_disco_items_query(_el);
+ {<<"query">>,
+ <<"http://jabber.org/protocol/disco#info">>} ->
+ decode_disco_info_query(_el);
+ {<<"blocklist">>, <<"urn:xmpp:blocking">>} ->
+ decode_block_list_blocklist(_el);
+ {<<"unblock">>, <<"urn:xmpp:blocking">>} ->
+ decode_unblock_unblock(_el);
+ {<<"block">>, <<"urn:xmpp:blocking">>} ->
+ decode_block_block(_el);
+ {<<"item">>, <<>>} -> decode_block_item_item(_el);
+ {<<"query">>, <<"jabber:iq:privacy">>} ->
+ decode_privacy_query(_el);
+ {<<"item">>, <<>>} -> decode_privacy_item_item(_el);
+ {<<"query">>, <<"jabber:iq:roster">>} ->
+ decode_roster_query(_el);
+ {<<"query">>, <<"jabber:iq:version">>} ->
+ decode_version_query(_el);
+ {<<"query">>, <<"jabber:iq:last">>} ->
+ decode_last_query(_el);
+ {_name, _xmlns} ->
+ erlang:error({unknown_tag, _name, _xmlns})
+ end.
+
+encode({delay, _, _} = _r) ->
+ hd(encode_delay_delay(_r, []));
+encode({pubsub, _, _, _, _} = _r) ->
+ hd(encode_pubsub_pubsub(_r, []));
+encode({pubsub_event, _} = _r) ->
+ hd(encode_pubsub_event_event(_r, []));
+encode({pubsub_items, _, _, _, _} = _r) ->
+ hd(encode_pubsub_items_items(_r, []));
+encode({pubsub_item, _, _} = _r) ->
+ hd(encode_pubsub_item_item(_r, []));
+encode({pubsub_affiliation, _, _} = _r) ->
+ hd(encode_pubsub_affiliation_affiliation(_r, []));
+encode({pubsub_subscription, _, _, _, _} = _r) ->
+ hd(encode_pubsub_subscription_subscription(_r, []));
+encode({xdata, _, _, _, _, _, _} = _r) ->
+ hd(encode_xdata_x(_r, []));
+encode({xfield, _, _, _, _, _, _, _} = _r) ->
+ hd(encode_xfield_field(_r, []));
+encode({vcard, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
+ _, _, _, _, _, _, _, _, _, _, _, _, _, _, _} =
+ _r) ->
+ hd(encode_vcard_vCard(_r, []));
+encode({vcard_key, _, _} = _r) ->
+ hd(encode_vcard_key_KEY(_r, []));
+encode({vcard_sound, _, _, _} = _r) ->
+ hd(encode_vcard_sound_SOUND(_r, []));
+encode({vcard_org, _, _} = _r) ->
+ hd(encode_vcard_org_ORG(_r, []));
+encode({vcard_photo, _, _, _} = _r) ->
+ hd(encode_vcard_photo_PHOTO(_r, []));
+encode({vcard_logo, _, _, _} = _r) ->
+ hd(encode_vcard_logo_LOGO(_r, []));
+encode({vcard_geo, _, _} = _r) ->
+ hd(encode_vcard_geo_GEO(_r, []));
+encode({vcard_email, _, _, _, _, _, _} = _r) ->
+ hd(encode_vcard_email_EMAIL(_r, []));
+encode({vcard_tel, _, _, _, _, _, _, _, _, _, _, _, _,
+ _, _} =
+ _r) ->
+ hd(encode_vcard_tel_TEL(_r, []));
+encode({vcard_label, _, _, _, _, _, _, _, _} = _r) ->
+ hd(encode_vcard_label_LABEL(_r, []));
+encode({vcard_adr, _, _, _, _, _, _, _, _, _, _, _, _,
+ _, _} =
+ _r) ->
+ hd(encode_vcard_adr_ADR(_r, []));
+encode({vcard_name, _, _, _, _, _} = _r) ->
+ hd(encode_vcard_name_N(_r, []));
+encode({stream_error, _, _} = _r) ->
+ hd('encode_stream_error_stream:error'(_r, []));
+encode({time, _, _} = _r) ->
+ hd(encode_time_time(_r, []));
+encode({ping} = _r) -> hd(encode_ping_ping(_r, []));
+encode({session} = _r) ->
+ hd(encode_session_session(_r, []));
+encode({register} = _r) ->
+ hd(encode_register_register(_r, []));
+encode({caps, _, _, _} = _r) ->
+ hd(encode_caps_c(_r, []));
+encode({p1_ack} = _r) -> hd(encode_p1_ack_ack(_r, []));
+encode({p1_rebind} = _r) ->
+ hd(encode_p1_rebind_rebind(_r, []));
+encode({p1_push} = _r) ->
+ hd(encode_p1_push_push(_r, []));
+encode({stream_features, _} = _r) ->
+ hd('encode_stream_features_stream:features'(_r, []));
+encode({starttls_failure} = _r) ->
+ hd(encode_starttls_failure_failure(_r, []));
+encode({starttls_proceed} = _r) ->
+ hd(encode_starttls_proceed_proceed(_r, []));
+encode({starttls, _} = _r) ->
+ hd(encode_starttls_starttls(_r, []));
+encode({sasl_mechanisms, _} = _r) ->
+ hd(encode_sasl_mechanisms_mechanisms(_r, []));
+encode({sasl_failure, _, _} = _r) ->
+ hd(encode_sasl_failure_failure(_r, []));
+encode({sasl_success, _} = _r) ->
+ hd(encode_sasl_success_success(_r, []));
+encode({sasl_response, _} = _r) ->
+ hd(encode_sasl_response_response(_r, []));
+encode({sasl_challenge, _} = _r) ->
+ hd(encode_sasl_challenge_challenge(_r, []));
+encode({sasl_abort} = _r) ->
+ hd(encode_sasl_abort_abort(_r, []));
+encode({sasl_auth, _, _} = _r) ->
+ hd(encode_sasl_auth_auth(_r, []));
+encode({bind, _, _} = _r) ->
+ hd(encode_bind_bind(_r, []));
+encode({error, _, _, _, _} = _r) ->
+ hd(encode_error_error(_r, []));
+encode({presence, _, _, _, _, _, _, _, _, _, _} = _r) ->
+ hd(encode_presence_presence(_r, []));
+encode({message, _, _, _, _, _, _, _, _, _, _} = _r) ->
+ hd(encode_message_message(_r, []));
+encode({iq, _, _, _, _, _, _, _} = _r) ->
+ hd(encode_iq_iq(_r, []));
+encode({stats, _} = _r) ->
+ hd(encode_stats_query(_r, []));
+encode({bookmark_storage, _, _} = _r) ->
+ hd(encode_storage_bookmarks_storage(_r, []));
+encode({bookmark_conference, _, _, _, _, _} = _r) ->
+ hd(encode_bookmark_conference_conference(_r, []));
+encode({private, _} = _r) ->
+ hd(encode_private_query(_r, []));
+encode({disco_items, _, _} = _r) ->
+ hd(encode_disco_items_query(_r, []));
+encode({disco_info, _, _, _, _} = _r) ->
+ hd(encode_disco_info_query(_r, []));
+encode({block_list} = _r) ->
+ hd(encode_block_list_blocklist(_r, []));
+encode({unblock, _} = _r) ->
+ hd(encode_unblock_unblock(_r, []));
+encode({block, _} = _r) ->
+ hd(encode_block_block(_r, []));
+encode({privacy, _, _, _} = _r) ->
+ hd(encode_privacy_query(_r, []));
+encode({privacy_item, _, _, _, _, _} = _r) ->
+ hd(encode_privacy_item_item(_r, []));
+encode({roster, _, _} = _r) ->
+ hd(encode_roster_query(_r, []));
+encode({version, _, _, _} = _r) ->
+ hd(encode_version_query(_r, []));
+encode({last, _, _} = _r) ->
+ hd(encode_last_query(_r, [])).
+
+enc_bool(false) -> <<"false">>;
+enc_bool(true) -> <<"true">>.
+
+dec_bool(<<"false">>) -> false;
+dec_bool(<<"true">>) -> true.
+
+resourceprep(R) ->
+ case jlib:resourceprep(R) of
+ error -> erlang:error(badarg);
+ R1 -> R1
+ end.
+
+enc_jid(J) -> jlib:jid_to_string(J).
+
+dec_jid(Val) ->
+ case jlib:string_to_jid(Val) of
+ error -> erlang:error(badarg);
+ J -> J
+ end.
+
+enc_utc(Val) -> jlib:now_to_utc_string(Val).
+
+dec_utc(Val) ->
+ {_, _, _} = jlib:datetime_string_to_timestamp(Val).
+
+enc_tzo({H, M}) ->
+ Sign = if H >= 0 -> <<>>;
+ true -> <<"-">>
+ end,
+ list_to_binary([Sign,
+ io_lib:format("~2..0w:~2..0w", [H, M])]).
+
+dec_tzo(Val) ->
+ [H1, M1] = str:tokens(Val, <<":">>),
+ H = erlang:binary_to_integer(H1),
+ M = erlang:binary_to_integer(M1),
+ if H >= -12, H =< 12, M >= 0, M < 60 -> {H, M} end.
+
+decode_last_query({xmlel, _, _attrs, _els}) ->
+ Seconds = decode_last_query_attrs(_attrs, undefined),
+ Text = decode_last_query_els(_els, <<>>),
+ {last, Seconds, Text}.
+
+decode_last_query_els([{xmlcdata, _data} | _els],
+ Text) ->
+ decode_last_query_els(_els,
+ <<Text/binary, _data/binary>>);
+decode_last_query_els([_ | _els], Text) ->
+ decode_last_query_els(_els, Text);
+decode_last_query_els([], Text) ->
+ decode_last_query_cdata(Text).
+
+decode_last_query_attrs([{<<"seconds">>, _val}
+ | _attrs],
+ _Seconds) ->
+ decode_last_query_attrs(_attrs, _val);
+decode_last_query_attrs([_ | _attrs], Seconds) ->
+ decode_last_query_attrs(_attrs, Seconds);
+decode_last_query_attrs([], Seconds) ->
+ decode_last_query_seconds(Seconds).
+
+encode_last_query(undefined, _acc) -> _acc;
+encode_last_query({last, Seconds, Text}, _acc) ->
+ _els = encode_last_query_cdata(Text, []),
+ _attrs = encode_last_query_seconds(Seconds,
+ [{<<"xmlns">>, <<"jabber:iq:last">>}]),
+ [{xmlel, <<"query">>, _attrs, _els} | _acc].
+
+decode_last_query_seconds(undefined) -> undefined;
+decode_last_query_seconds(_val) ->
+ case catch xml_gen:dec_int(_val, 0, infinity) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"seconds">>,
+ <<"query">>, <<"jabber:iq:last">>});
+ _res -> _res
+ end.
+
+encode_last_query_seconds(undefined, _acc) -> _acc;
+encode_last_query_seconds(_val, _acc) ->
+ [{<<"seconds">>, xml_gen:enc_int(_val)} | _acc].
+
+decode_last_query_cdata(<<>>) -> undefined;
+decode_last_query_cdata(_val) -> _val.
+
+encode_last_query_cdata(undefined, _acc) -> _acc;
+encode_last_query_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_version_query({xmlel, _, _attrs, _els}) ->
+ {Os, Version, Name} = decode_version_query_els(_els,
+ undefined, undefined,
+ undefined),
+ {version, Name, Version, Os}.
+
+decode_version_query_els([{xmlel, <<"os">>, _attrs, _} =
+ _el
+ | _els],
+ Os, Version, Name) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_version_query_els(_els,
+ decode_version_query_os(_el), Version, Name);
+ _ -> decode_version_query_els(_els, Os, Version, Name)
+ end;
+decode_version_query_els([{xmlel, <<"version">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Os, Version, Name) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_version_query_els(_els, Os,
+ decode_version_query_version(_el), Name);
+ _ -> decode_version_query_els(_els, Os, Version, Name)
+ end;
+decode_version_query_els([{xmlel, <<"name">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Os, Version, Name) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_version_query_els(_els, Os, Version,
+ decode_version_query_name(_el));
+ _ -> decode_version_query_els(_els, Os, Version, Name)
+ end;
+decode_version_query_els([_ | _els], Os, Version,
+ Name) ->
+ decode_version_query_els(_els, Os, Version, Name);
+decode_version_query_els([], Os, Version, Name) ->
+ {Os, Version, Name}.
+
+encode_version_query(undefined, _acc) -> _acc;
+encode_version_query({version, Name, Version, Os},
+ _acc) ->
+ _els = encode_version_query_name(Name,
+ encode_version_query_version(Version,
+ encode_version_query_os(Os,
+ []))),
+ _attrs = [{<<"xmlns">>, <<"jabber:iq:version">>}],
+ [{xmlel, <<"query">>, _attrs, _els} | _acc].
+
+decode_version_query_os({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_version_query_os_els(_els, <<>>), Cdata.
+
+decode_version_query_os_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_version_query_os_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_version_query_os_els([_ | _els], Cdata) ->
+ decode_version_query_os_els(_els, Cdata);
+decode_version_query_os_els([], Cdata) ->
+ decode_version_query_os_cdata(Cdata).
+
+encode_version_query_os(undefined, _acc) -> _acc;
+encode_version_query_os(Cdata, _acc) ->
+ _els = encode_version_query_os_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"os">>, _attrs, _els} | _acc].
+
+decode_version_query_os_cdata(<<>>) ->
+ erlang:error({missing_cdata, <<>>, <<"os">>, <<>>});
+decode_version_query_os_cdata(_val) -> _val.
+
+encode_version_query_os_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_version_query_version({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_version_query_version_els(_els, <<>>),
+ Cdata.
+
+decode_version_query_version_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_version_query_version_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_version_query_version_els([_ | _els], Cdata) ->
+ decode_version_query_version_els(_els, Cdata);
+decode_version_query_version_els([], Cdata) ->
+ decode_version_query_version_cdata(Cdata).
+
+encode_version_query_version(undefined, _acc) -> _acc;
+encode_version_query_version(Cdata, _acc) ->
+ _els = encode_version_query_version_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"version">>, _attrs, _els} | _acc].
+
+decode_version_query_version_cdata(<<>>) ->
+ erlang:error({missing_cdata, <<>>, <<"version">>,
+ <<>>});
+decode_version_query_version_cdata(_val) -> _val.
+
+encode_version_query_version_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_version_query_name({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_version_query_name_els(_els, <<>>),
+ Cdata.
+
+decode_version_query_name_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_version_query_name_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_version_query_name_els([_ | _els], Cdata) ->
+ decode_version_query_name_els(_els, Cdata);
+decode_version_query_name_els([], Cdata) ->
+ decode_version_query_name_cdata(Cdata).
+
+encode_version_query_name(undefined, _acc) -> _acc;
+encode_version_query_name(Cdata, _acc) ->
+ _els = encode_version_query_name_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"name">>, _attrs, _els} | _acc].
+
+decode_version_query_name_cdata(<<>>) ->
+ erlang:error({missing_cdata, <<>>, <<"name">>, <<>>});
+decode_version_query_name_cdata(_val) -> _val.
+
+encode_version_query_name_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_roster_query({xmlel, _, _attrs, _els}) ->
+ Ver = decode_roster_query_attrs(_attrs, undefined),
+ Item = decode_roster_query_els(_els, []),
+ {roster, Item, Ver}.
+
+decode_roster_query_els([{xmlel, <<"item">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Item) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_roster_query_els(_els,
+ [decode_roster_query_item(_el) | Item]);
+ _ -> decode_roster_query_els(_els, Item)
+ end;
+decode_roster_query_els([_ | _els], Item) ->
+ decode_roster_query_els(_els, Item);
+decode_roster_query_els([], Item) ->
+ lists:reverse(Item).
+
+decode_roster_query_attrs([{<<"ver">>, _val} | _attrs],
+ _Ver) ->
+ decode_roster_query_attrs(_attrs, _val);
+decode_roster_query_attrs([_ | _attrs], Ver) ->
+ decode_roster_query_attrs(_attrs, Ver);
+decode_roster_query_attrs([], Ver) ->
+ decode_roster_query_ver(Ver).
+
+encode_roster_query(undefined, _acc) -> _acc;
+encode_roster_query({roster, Item, Ver}, _acc) ->
+ _els = encode_roster_query_item(Item, []),
+ _attrs = encode_roster_query_ver(Ver,
+ [{<<"xmlns">>, <<"jabber:iq:roster">>}]),
+ [{xmlel, <<"query">>, _attrs, _els} | _acc].
+
+decode_roster_query_ver(undefined) -> undefined;
+decode_roster_query_ver(_val) -> _val.
+
+encode_roster_query_ver(undefined, _acc) -> _acc;
+encode_roster_query_ver(_val, _acc) ->
+ [{<<"ver">>, _val} | _acc].
+
+decode_roster_query_item({xmlel, _, _attrs, _els}) ->
+ {Ask, Subscription, Name, Jid} =
+ decode_roster_query_item_attrs(_attrs, undefined,
+ undefined, undefined, undefined),
+ Groups = decode_roster_query_item_els(_els, []),
+ {roster_item, Jid, Name, Groups, Subscription, Ask}.
+
+decode_roster_query_item_els([{xmlel, <<"group">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Groups) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_roster_query_item_els(_els,
+ [decode_roster_query_item_group(_el)
+ | Groups]);
+ _ -> decode_roster_query_item_els(_els, Groups)
+ end;
+decode_roster_query_item_els([_ | _els], Groups) ->
+ decode_roster_query_item_els(_els, Groups);
+decode_roster_query_item_els([], Groups) ->
+ lists:reverse(Groups).
+
+decode_roster_query_item_attrs([{<<"ask">>, _val}
+ | _attrs],
+ _Ask, Subscription, Name, Jid) ->
+ decode_roster_query_item_attrs(_attrs, _val,
+ Subscription, Name, Jid);
+decode_roster_query_item_attrs([{<<"subscription">>,
+ _val}
+ | _attrs],
+ Ask, _Subscription, Name, Jid) ->
+ decode_roster_query_item_attrs(_attrs, Ask, _val, Name,
+ Jid);
+decode_roster_query_item_attrs([{<<"name">>, _val}
+ | _attrs],
+ Ask, Subscription, _Name, Jid) ->
+ decode_roster_query_item_attrs(_attrs, Ask,
+ Subscription, _val, Jid);
+decode_roster_query_item_attrs([{<<"jid">>, _val}
+ | _attrs],
+ Ask, Subscription, Name, _Jid) ->
+ decode_roster_query_item_attrs(_attrs, Ask,
+ Subscription, Name, _val);
+decode_roster_query_item_attrs([_ | _attrs], Ask,
+ Subscription, Name, Jid) ->
+ decode_roster_query_item_attrs(_attrs, Ask,
+ Subscription, Name, Jid);
+decode_roster_query_item_attrs([], Ask, Subscription,
+ Name, Jid) ->
+ {decode_roster_query_item_ask(Ask),
+ decode_roster_query_item_subscription(Subscription),
+ decode_roster_query_item_name(Name),
+ decode_roster_query_item_jid(Jid)}.
+
+encode_roster_query_item([], _acc) -> _acc;
+encode_roster_query_item([{roster_item, Jid, Name,
+ Groups, Subscription, Ask}
+ | _tail],
+ _acc) ->
+ _els = encode_roster_query_item_group(Groups, []),
+ _attrs = encode_roster_query_item_jid(Jid,
+ encode_roster_query_item_name(Name,
+ encode_roster_query_item_subscription(Subscription,
+ encode_roster_query_item_ask(Ask,
+ [])))),
+ encode_roster_query_item(_tail,
+ [{xmlel, <<"item">>, _attrs, _els} | _acc]).
+
+decode_roster_query_item_jid(undefined) ->
+ erlang:error({missing_attr, <<"jid">>, <<"item">>,
+ <<>>});
+decode_roster_query_item_jid(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"jid">>, <<"item">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_roster_query_item_jid(_val, _acc) ->
+ [{<<"jid">>, enc_jid(_val)} | _acc].
+
+decode_roster_query_item_name(undefined) -> undefined;
+decode_roster_query_item_name(_val) -> _val.
+
+encode_roster_query_item_name(undefined, _acc) -> _acc;
+encode_roster_query_item_name(_val, _acc) ->
+ [{<<"name">>, _val} | _acc].
+
+decode_roster_query_item_subscription(undefined) ->
+ none;
+decode_roster_query_item_subscription(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [none, to, from, both, remove])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"subscription">>,
+ <<"item">>, <<>>});
+ _res -> _res
+ end.
+
+encode_roster_query_item_subscription(none, _acc) ->
+ _acc;
+encode_roster_query_item_subscription(_val, _acc) ->
+ [{<<"subscription">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_roster_query_item_ask(undefined) -> undefined;
+decode_roster_query_item_ask(_val) ->
+ case catch xml_gen:dec_enum(_val, [subscribe]) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"ask">>, <<"item">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_roster_query_item_ask(undefined, _acc) -> _acc;
+encode_roster_query_item_ask(_val, _acc) ->
+ [{<<"ask">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_roster_query_item_group({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_roster_query_item_group_els(_els, <<>>),
+ Cdata.
+
+decode_roster_query_item_group_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_roster_query_item_group_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_roster_query_item_group_els([_ | _els], Cdata) ->
+ decode_roster_query_item_group_els(_els, Cdata);
+decode_roster_query_item_group_els([], Cdata) ->
+ decode_roster_query_item_group_cdata(Cdata).
+
+encode_roster_query_item_group([], _acc) -> _acc;
+encode_roster_query_item_group([Cdata | _tail], _acc) ->
+ _els = encode_roster_query_item_group_cdata(Cdata, []),
+ _attrs = [],
+ encode_roster_query_item_group(_tail,
+ [{xmlel, <<"group">>, _attrs, _els} | _acc]).
+
+decode_roster_query_item_group_cdata(<<>>) ->
+ erlang:error({missing_cdata, <<>>, <<"group">>, <<>>});
+decode_roster_query_item_group_cdata(_val) -> _val.
+
+encode_roster_query_item_group_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_privacy_item_item({xmlel, _, _attrs, _els}) ->
+ {Value, Type, Action, Order} =
+ decode_privacy_item_item_attrs(_attrs, undefined,
+ undefined, undefined, undefined),
+ Stanza = decode_privacy_item_item_els(_els, undefined),
+ {privacy_item, Order, Action, Type, Value, Stanza}.
+
+decode_privacy_item_item_els([{xmlel,
+ <<"presence-out">>, _attrs, _} =
+ _el
+ | _els],
+ Stanza) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_privacy_item_item_els(_els,
+ 'decode_privacy_item_item_presence-out'(_el));
+ _ -> decode_privacy_item_item_els(_els, Stanza)
+ end;
+decode_privacy_item_item_els([{xmlel, <<"presence-in">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Stanza) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_privacy_item_item_els(_els,
+ 'decode_privacy_item_item_presence-in'(_el));
+ _ -> decode_privacy_item_item_els(_els, Stanza)
+ end;
+decode_privacy_item_item_els([{xmlel, <<"iq">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Stanza) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_privacy_item_item_els(_els,
+ decode_privacy_item_item_iq(_el));
+ _ -> decode_privacy_item_item_els(_els, Stanza)
+ end;
+decode_privacy_item_item_els([{xmlel, <<"message">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Stanza) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_privacy_item_item_els(_els,
+ decode_privacy_item_item_message(_el));
+ _ -> decode_privacy_item_item_els(_els, Stanza)
+ end;
+decode_privacy_item_item_els([_ | _els], Stanza) ->
+ decode_privacy_item_item_els(_els, Stanza);
+decode_privacy_item_item_els([], Stanza) -> Stanza.
+
+decode_privacy_item_item_attrs([{<<"value">>, _val}
+ | _attrs],
+ _Value, Type, Action, Order) ->
+ decode_privacy_item_item_attrs(_attrs, _val, Type,
+ Action, Order);
+decode_privacy_item_item_attrs([{<<"type">>, _val}
+ | _attrs],
+ Value, _Type, Action, Order) ->
+ decode_privacy_item_item_attrs(_attrs, Value, _val,
+ Action, Order);
+decode_privacy_item_item_attrs([{<<"action">>, _val}
+ | _attrs],
+ Value, Type, _Action, Order) ->
+ decode_privacy_item_item_attrs(_attrs, Value, Type,
+ _val, Order);
+decode_privacy_item_item_attrs([{<<"order">>, _val}
+ | _attrs],
+ Value, Type, Action, _Order) ->
+ decode_privacy_item_item_attrs(_attrs, Value, Type,
+ Action, _val);
+decode_privacy_item_item_attrs([_ | _attrs], Value,
+ Type, Action, Order) ->
+ decode_privacy_item_item_attrs(_attrs, Value, Type,
+ Action, Order);
+decode_privacy_item_item_attrs([], Value, Type, Action,
+ Order) ->
+ {decode_privacy_item_item_value(Value),
+ decode_privacy_item_item_type(Type),
+ decode_privacy_item_item_action(Action),
+ decode_privacy_item_item_order(Order)}.
+
+'encode_privacy_item_item_$stanza'(undefined, _acc) ->
+ _acc;
+'encode_privacy_item_item_$stanza'('presence-out' = _r,
+ _acc) ->
+ 'encode_privacy_item_item_presence-out'(_r, _acc);
+'encode_privacy_item_item_$stanza'('presence-in' = _r,
+ _acc) ->
+ 'encode_privacy_item_item_presence-in'(_r, _acc);
+'encode_privacy_item_item_$stanza'(iq = _r, _acc) ->
+ encode_privacy_item_item_iq(_r, _acc);
+'encode_privacy_item_item_$stanza'(message = _r,
+ _acc) ->
+ encode_privacy_item_item_message(_r, _acc).
+
+encode_privacy_item_item([], _acc) -> _acc;
+encode_privacy_item_item([{privacy_item, Order, Action,
+ Type, Value, Stanza}
+ | _tail],
+ _acc) ->
+ _els = 'encode_privacy_item_item_$stanza'(Stanza, []),
+ _attrs = encode_privacy_item_item_order(Order,
+ encode_privacy_item_item_action(Action,
+ encode_privacy_item_item_type(Type,
+ encode_privacy_item_item_value(Value,
+ [])))),
+ encode_privacy_item_item(_tail,
+ [{xmlel, <<"item">>, _attrs, _els} | _acc]).
+
+decode_privacy_item_item_action(undefined) ->
+ erlang:error({missing_attr, <<"action">>, <<"item">>,
+ <<>>});
+decode_privacy_item_item_action(_val) ->
+ case catch xml_gen:dec_enum(_val, [allow, deny]) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"action">>, <<"item">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_privacy_item_item_action(_val, _acc) ->
+ [{<<"action">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_privacy_item_item_order(undefined) ->
+ erlang:error({missing_attr, <<"order">>, <<"item">>,
+ <<>>});
+decode_privacy_item_item_order(_val) ->
+ case catch xml_gen:dec_int(_val, 0, infinity) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"order">>, <<"item">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_privacy_item_item_order(_val, _acc) ->
+ [{<<"order">>, xml_gen:enc_int(_val)} | _acc].
+
+decode_privacy_item_item_type(undefined) -> undefined;
+decode_privacy_item_item_type(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [group, jid, subscription])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"type">>, <<"item">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_privacy_item_item_type(undefined, _acc) -> _acc;
+encode_privacy_item_item_type(_val, _acc) ->
+ [{<<"type">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_privacy_item_item_value(undefined) -> undefined;
+decode_privacy_item_item_value(_val) -> _val.
+
+encode_privacy_item_item_value(undefined, _acc) -> _acc;
+encode_privacy_item_item_value(_val, _acc) ->
+ [{<<"value">>, _val} | _acc].
+
+'decode_privacy_item_item_presence-out'({xmlel, _,
+ _attrs, _els}) ->
+ 'presence-out'.
+
+'encode_privacy_item_item_presence-out'(undefined,
+ _acc) ->
+ _acc;
+'encode_privacy_item_item_presence-out'('presence-out',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"presence-out">>, _attrs, _els} | _acc].
+
+'decode_privacy_item_item_presence-in'({xmlel, _,
+ _attrs, _els}) ->
+ 'presence-in'.
+
+'encode_privacy_item_item_presence-in'(undefined,
+ _acc) ->
+ _acc;
+'encode_privacy_item_item_presence-in'('presence-in',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"presence-in">>, _attrs, _els} | _acc].
+
+decode_privacy_item_item_iq({xmlel, _, _attrs, _els}) ->
+ iq.
+
+encode_privacy_item_item_iq(undefined, _acc) -> _acc;
+encode_privacy_item_item_iq(iq, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"iq">>, _attrs, _els} | _acc].
+
+decode_privacy_item_item_message({xmlel, _, _attrs,
+ _els}) ->
+ message.
+
+encode_privacy_item_item_message(undefined, _acc) ->
+ _acc;
+encode_privacy_item_item_message(message, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"message">>, _attrs, _els} | _acc].
+
+decode_privacy_query({xmlel, _, _attrs, _els}) ->
+ {Active, Default, List} = decode_privacy_query_els(_els,
+ undefined, undefined,
+ []),
+ {privacy, List, Default, Active}.
+
+decode_privacy_query_els([{xmlel, <<"active">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Active, Default, List) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_privacy_query_els(_els,
+ decode_privacy_query_active(_el), Default,
+ List);
+ _ ->
+ decode_privacy_query_els(_els, Active, Default, List)
+ end;
+decode_privacy_query_els([{xmlel, <<"default">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Active, Default, List) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_privacy_query_els(_els, Active,
+ decode_privacy_query_default(_el), List);
+ _ ->
+ decode_privacy_query_els(_els, Active, Default, List)
+ end;
+decode_privacy_query_els([{xmlel, <<"list">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Active, Default, List) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_privacy_query_els(_els, Active, Default,
+ [decode_privacy_query_list(_el) | List]);
+ _ ->
+ decode_privacy_query_els(_els, Active, Default, List)
+ end;
+decode_privacy_query_els([_ | _els], Active, Default,
+ List) ->
+ decode_privacy_query_els(_els, Active, Default, List);
+decode_privacy_query_els([], Active, Default, List) ->
+ {Active, Default, lists:reverse(List)}.
+
+encode_privacy_query(undefined, _acc) -> _acc;
+encode_privacy_query({privacy, List, Default, Active},
+ _acc) ->
+ _els = encode_privacy_query_list(List,
+ encode_privacy_query_default(Default,
+ encode_privacy_query_active(Active,
+ []))),
+ _attrs = [{<<"xmlns">>, <<"jabber:iq:privacy">>}],
+ [{xmlel, <<"query">>, _attrs, _els} | _acc].
+
+decode_privacy_query_active({xmlel, _, _attrs, _els}) ->
+ Name = decode_privacy_query_active_attrs(_attrs,
+ undefined),
+ Name.
+
+decode_privacy_query_active_attrs([{<<"name">>, _val}
+ | _attrs],
+ _Name) ->
+ decode_privacy_query_active_attrs(_attrs, _val);
+decode_privacy_query_active_attrs([_ | _attrs], Name) ->
+ decode_privacy_query_active_attrs(_attrs, Name);
+decode_privacy_query_active_attrs([], Name) ->
+ decode_privacy_query_active_name(Name).
+
+encode_privacy_query_active(undefined, _acc) -> _acc;
+encode_privacy_query_active(Name, _acc) ->
+ _els = [],
+ _attrs = encode_privacy_query_active_name(Name, []),
+ [{xmlel, <<"active">>, _attrs, _els} | _acc].
+
+decode_privacy_query_active_name(undefined) -> none;
+decode_privacy_query_active_name(_val) -> _val.
+
+encode_privacy_query_active_name(none, _acc) -> _acc;
+encode_privacy_query_active_name(_val, _acc) ->
+ [{<<"name">>, _val} | _acc].
+
+decode_privacy_query_default({xmlel, _, _attrs,
+ _els}) ->
+ Name = decode_privacy_query_default_attrs(_attrs,
+ undefined),
+ Name.
+
+decode_privacy_query_default_attrs([{<<"name">>, _val}
+ | _attrs],
+ _Name) ->
+ decode_privacy_query_default_attrs(_attrs, _val);
+decode_privacy_query_default_attrs([_ | _attrs],
+ Name) ->
+ decode_privacy_query_default_attrs(_attrs, Name);
+decode_privacy_query_default_attrs([], Name) ->
+ decode_privacy_query_default_name(Name).
+
+encode_privacy_query_default(undefined, _acc) -> _acc;
+encode_privacy_query_default(Name, _acc) ->
+ _els = [],
+ _attrs = encode_privacy_query_default_name(Name, []),
+ [{xmlel, <<"default">>, _attrs, _els} | _acc].
+
+decode_privacy_query_default_name(undefined) -> none;
+decode_privacy_query_default_name(_val) -> _val.
+
+encode_privacy_query_default_name(none, _acc) -> _acc;
+encode_privacy_query_default_name(_val, _acc) ->
+ [{<<"name">>, _val} | _acc].
+
+decode_privacy_query_list({xmlel, _, _attrs, _els}) ->
+ Name = decode_privacy_query_list_attrs(_attrs,
+ undefined),
+ Privacy_item = decode_privacy_query_list_els(_els, []),
+ {privacy_list, Name, Privacy_item}.
+
+decode_privacy_query_list_els([{xmlel, <<"item">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Privacy_item) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_privacy_query_list_els(_els,
+ [decode_privacy_item_item(_el)
+ | Privacy_item]);
+ _ -> decode_privacy_query_list_els(_els, Privacy_item)
+ end;
+decode_privacy_query_list_els([_ | _els],
+ Privacy_item) ->
+ decode_privacy_query_list_els(_els, Privacy_item);
+decode_privacy_query_list_els([], Privacy_item) ->
+ lists:reverse(Privacy_item).
+
+decode_privacy_query_list_attrs([{<<"name">>, _val}
+ | _attrs],
+ _Name) ->
+ decode_privacy_query_list_attrs(_attrs, _val);
+decode_privacy_query_list_attrs([_ | _attrs], Name) ->
+ decode_privacy_query_list_attrs(_attrs, Name);
+decode_privacy_query_list_attrs([], Name) ->
+ decode_privacy_query_list_name(Name).
+
+encode_privacy_query_list([], _acc) -> _acc;
+encode_privacy_query_list([{privacy_list, Name,
+ Privacy_item}
+ | _tail],
+ _acc) ->
+ _els = encode_privacy_item_item(Privacy_item, []),
+ _attrs = encode_privacy_query_list_name(Name, []),
+ encode_privacy_query_list(_tail,
+ [{xmlel, <<"list">>, _attrs, _els} | _acc]).
+
+decode_privacy_query_list_name(undefined) ->
+ erlang:error({missing_attr, <<"name">>, <<"list">>,
+ <<>>});
+decode_privacy_query_list_name(_val) -> _val.
+
+encode_privacy_query_list_name(_val, _acc) ->
+ [{<<"name">>, _val} | _acc].
+
+decode_block_item_item({xmlel, _, _attrs, _els}) ->
+ Jid = decode_block_item_item_attrs(_attrs, undefined),
+ Jid.
+
+decode_block_item_item_attrs([{<<"jid">>, _val}
+ | _attrs],
+ _Jid) ->
+ decode_block_item_item_attrs(_attrs, _val);
+decode_block_item_item_attrs([_ | _attrs], Jid) ->
+ decode_block_item_item_attrs(_attrs, Jid);
+decode_block_item_item_attrs([], Jid) ->
+ decode_block_item_item_jid(Jid).
+
+encode_block_item_item([], _acc) -> _acc;
+encode_block_item_item([Jid | _tail], _acc) ->
+ _els = [],
+ _attrs = encode_block_item_item_jid(Jid, []),
+ encode_block_item_item(_tail,
+ [{xmlel, <<"item">>, _attrs, _els} | _acc]).
+
+decode_block_item_item_jid(undefined) ->
+ erlang:error({missing_attr, <<"jid">>, <<"item">>,
+ <<>>});
+decode_block_item_item_jid(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"jid">>, <<"item">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_block_item_item_jid(_val, _acc) ->
+ [{<<"jid">>, enc_jid(_val)} | _acc].
+
+decode_block_block({xmlel, _, _attrs, _els}) ->
+ Block_item = decode_block_block_els(_els, []),
+ {block, Block_item}.
+
+decode_block_block_els([{xmlel, <<"item">>, _attrs, _} =
+ _el
+ | _els],
+ Block_item) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_block_block_els(_els,
+ [decode_block_item_item(_el) | Block_item]);
+ _ -> decode_block_block_els(_els, Block_item)
+ end;
+decode_block_block_els([_ | _els], Block_item) ->
+ decode_block_block_els(_els, Block_item);
+decode_block_block_els([], Block_item) ->
+ lists:reverse(Block_item).
+
+encode_block_block(undefined, _acc) -> _acc;
+encode_block_block({block, Block_item}, _acc) ->
+ _els = encode_block_item_item(Block_item, []),
+ _attrs = [{<<"xmlns">>, <<"urn:xmpp:blocking">>}],
+ [{xmlel, <<"block">>, _attrs, _els} | _acc].
+
+decode_unblock_unblock({xmlel, _, _attrs, _els}) ->
+ Block_item = decode_unblock_unblock_els(_els, []),
+ {unblock, Block_item}.
+
+decode_unblock_unblock_els([{xmlel, <<"item">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Block_item) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_unblock_unblock_els(_els,
+ [decode_block_item_item(_el)
+ | Block_item]);
+ _ -> decode_unblock_unblock_els(_els, Block_item)
+ end;
+decode_unblock_unblock_els([_ | _els], Block_item) ->
+ decode_unblock_unblock_els(_els, Block_item);
+decode_unblock_unblock_els([], Block_item) ->
+ lists:reverse(Block_item).
+
+encode_unblock_unblock(undefined, _acc) -> _acc;
+encode_unblock_unblock({unblock, Block_item}, _acc) ->
+ _els = encode_block_item_item(Block_item, []),
+ _attrs = [{<<"xmlns">>, <<"urn:xmpp:blocking">>}],
+ [{xmlel, <<"unblock">>, _attrs, _els} | _acc].
+
+decode_block_list_blocklist({xmlel, _, _attrs, _els}) ->
+ {block_list}.
+
+encode_block_list_blocklist(undefined, _acc) -> _acc;
+encode_block_list_blocklist({block_list}, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>, <<"urn:xmpp:blocking">>}],
+ [{xmlel, <<"blocklist">>, _attrs, _els} | _acc].
+
+decode_disco_info_query({xmlel, _, _attrs, _els}) ->
+ Node = decode_disco_info_query_attrs(_attrs, undefined),
+ {Xdata, Feature, Identity} =
+ decode_disco_info_query_els(_els, [], [], []),
+ {disco_info, Node, Identity, Feature, Xdata}.
+
+decode_disco_info_query_els([{xmlel, <<"x">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Xdata, Feature, Identity) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"jabber:x:data">> ->
+ decode_disco_info_query_els(_els,
+ [decode_xdata_x(_el) | Xdata], Feature,
+ Identity);
+ _ ->
+ decode_disco_info_query_els(_els, Xdata, Feature,
+ Identity)
+ end;
+decode_disco_info_query_els([{xmlel, <<"feature">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Xdata, Feature, Identity) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_disco_info_query_els(_els, Xdata,
+ [decode_disco_info_query_feature(_el)
+ | Feature],
+ Identity);
+ _ ->
+ decode_disco_info_query_els(_els, Xdata, Feature,
+ Identity)
+ end;
+decode_disco_info_query_els([{xmlel, <<"identity">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Xdata, Feature, Identity) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_disco_info_query_els(_els, Xdata, Feature,
+ [decode_disco_info_query_identity(_el)
+ | Identity]);
+ _ ->
+ decode_disco_info_query_els(_els, Xdata, Feature,
+ Identity)
+ end;
+decode_disco_info_query_els([_ | _els], Xdata, Feature,
+ Identity) ->
+ decode_disco_info_query_els(_els, Xdata, Feature,
+ Identity);
+decode_disco_info_query_els([], Xdata, Feature,
+ Identity) ->
+ {lists:reverse(Xdata), lists:reverse(Feature),
+ lists:reverse(Identity)}.
+
+decode_disco_info_query_attrs([{<<"node">>, _val}
+ | _attrs],
+ _Node) ->
+ decode_disco_info_query_attrs(_attrs, _val);
+decode_disco_info_query_attrs([_ | _attrs], Node) ->
+ decode_disco_info_query_attrs(_attrs, Node);
+decode_disco_info_query_attrs([], Node) ->
+ decode_disco_info_query_node(Node).
+
+encode_disco_info_query(undefined, _acc) -> _acc;
+encode_disco_info_query({disco_info, Node, Identity,
+ Feature, Xdata},
+ _acc) ->
+ _els = encode_disco_info_query_identity(Identity,
+ encode_disco_info_query_feature(Feature,
+ encode_xdata_x(Xdata,
+ []))),
+ _attrs = encode_disco_info_query_node(Node,
+ [{<<"xmlns">>,
+ <<"http://jabber.org/protocol/disco#info">>}]),
+ [{xmlel, <<"query">>, _attrs, _els} | _acc].
+
+decode_disco_info_query_node(undefined) -> undefined;
+decode_disco_info_query_node(_val) -> _val.
+
+encode_disco_info_query_node(undefined, _acc) -> _acc;
+encode_disco_info_query_node(_val, _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_disco_info_query_feature({xmlel, _, _attrs,
+ _els}) ->
+ Var = decode_disco_info_query_feature_attrs(_attrs,
+ undefined),
+ Var.
+
+decode_disco_info_query_feature_attrs([{<<"var">>, _val}
+ | _attrs],
+ _Var) ->
+ decode_disco_info_query_feature_attrs(_attrs, _val);
+decode_disco_info_query_feature_attrs([_ | _attrs],
+ Var) ->
+ decode_disco_info_query_feature_attrs(_attrs, Var);
+decode_disco_info_query_feature_attrs([], Var) ->
+ decode_disco_info_query_feature_var(Var).
+
+encode_disco_info_query_feature([], _acc) -> _acc;
+encode_disco_info_query_feature([Var | _tail], _acc) ->
+ _els = [],
+ _attrs = encode_disco_info_query_feature_var(Var, []),
+ encode_disco_info_query_feature(_tail,
+ [{xmlel, <<"feature">>, _attrs, _els}
+ | _acc]).
+
+decode_disco_info_query_feature_var(undefined) ->
+ erlang:error({missing_attr, <<"var">>, <<"feature">>,
+ <<>>});
+decode_disco_info_query_feature_var(_val) -> _val.
+
+encode_disco_info_query_feature_var(_val, _acc) ->
+ [{<<"var">>, _val} | _acc].
+
+decode_disco_info_query_identity({xmlel, _, _attrs,
+ _els}) ->
+ {Name, Type, Category} =
+ decode_disco_info_query_identity_attrs(_attrs,
+ undefined, undefined, undefined),
+ {Category, Type, Name}.
+
+decode_disco_info_query_identity_attrs([{<<"name">>,
+ _val}
+ | _attrs],
+ _Name, Type, Category) ->
+ decode_disco_info_query_identity_attrs(_attrs, _val,
+ Type, Category);
+decode_disco_info_query_identity_attrs([{<<"type">>,
+ _val}
+ | _attrs],
+ Name, _Type, Category) ->
+ decode_disco_info_query_identity_attrs(_attrs, Name,
+ _val, Category);
+decode_disco_info_query_identity_attrs([{<<"category">>,
+ _val}
+ | _attrs],
+ Name, Type, _Category) ->
+ decode_disco_info_query_identity_attrs(_attrs, Name,
+ Type, _val);
+decode_disco_info_query_identity_attrs([_ | _attrs],
+ Name, Type, Category) ->
+ decode_disco_info_query_identity_attrs(_attrs, Name,
+ Type, Category);
+decode_disco_info_query_identity_attrs([], Name, Type,
+ Category) ->
+ {decode_disco_info_query_identity_name(Name),
+ decode_disco_info_query_identity_type(Type),
+ decode_disco_info_query_identity_category(Category)}.
+
+encode_disco_info_query_identity([], _acc) -> _acc;
+encode_disco_info_query_identity([{Category, Type, Name}
+ | _tail],
+ _acc) ->
+ _els = [],
+ _attrs =
+ encode_disco_info_query_identity_category(Category,
+ encode_disco_info_query_identity_type(Type,
+ encode_disco_info_query_identity_name(Name,
+ []))),
+ encode_disco_info_query_identity(_tail,
+ [{xmlel, <<"identity">>, _attrs, _els}
+ | _acc]).
+
+decode_disco_info_query_identity_category(undefined) ->
+ erlang:error({missing_attr, <<"category">>,
+ <<"identity">>, <<>>});
+decode_disco_info_query_identity_category(_val) -> _val.
+
+encode_disco_info_query_identity_category(_val, _acc) ->
+ [{<<"category">>, _val} | _acc].
+
+decode_disco_info_query_identity_type(undefined) ->
+ erlang:error({missing_attr, <<"type">>, <<"identity">>,
+ <<>>});
+decode_disco_info_query_identity_type(_val) -> _val.
+
+encode_disco_info_query_identity_type(_val, _acc) ->
+ [{<<"type">>, _val} | _acc].
+
+decode_disco_info_query_identity_name(undefined) ->
+ undefined;
+decode_disco_info_query_identity_name(_val) -> _val.
+
+encode_disco_info_query_identity_name(undefined,
+ _acc) ->
+ _acc;
+encode_disco_info_query_identity_name(_val, _acc) ->
+ [{<<"name">>, _val} | _acc].
+
+decode_disco_items_query({xmlel, _, _attrs, _els}) ->
+ Node = decode_disco_items_query_attrs(_attrs,
+ undefined),
+ Items = decode_disco_items_query_els(_els, []),
+ {disco_items, Node, Items}.
+
+decode_disco_items_query_els([{xmlel, <<"item">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Items) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_disco_items_query_els(_els,
+ [decode_disco_items_query_item(_el)
+ | Items]);
+ _ -> decode_disco_items_query_els(_els, Items)
+ end;
+decode_disco_items_query_els([_ | _els], Items) ->
+ decode_disco_items_query_els(_els, Items);
+decode_disco_items_query_els([], Items) ->
+ lists:reverse(Items).
+
+decode_disco_items_query_attrs([{<<"node">>, _val}
+ | _attrs],
+ _Node) ->
+ decode_disco_items_query_attrs(_attrs, _val);
+decode_disco_items_query_attrs([_ | _attrs], Node) ->
+ decode_disco_items_query_attrs(_attrs, Node);
+decode_disco_items_query_attrs([], Node) ->
+ decode_disco_items_query_node(Node).
+
+encode_disco_items_query(undefined, _acc) -> _acc;
+encode_disco_items_query({disco_items, Node, Items},
+ _acc) ->
+ _els = encode_disco_items_query_item(Items, []),
+ _attrs = encode_disco_items_query_node(Node,
+ [{<<"xmlns">>,
+ <<"http://jabber.org/protocol/disco#items">>}]),
+ [{xmlel, <<"query">>, _attrs, _els} | _acc].
+
+decode_disco_items_query_node(undefined) -> undefined;
+decode_disco_items_query_node(_val) -> _val.
+
+encode_disco_items_query_node(undefined, _acc) -> _acc;
+encode_disco_items_query_node(_val, _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_disco_items_query_item({xmlel, _, _attrs,
+ _els}) ->
+ {Node, Name, Jid} =
+ decode_disco_items_query_item_attrs(_attrs, undefined,
+ undefined, undefined),
+ {disco_item, Jid, Name, Node}.
+
+decode_disco_items_query_item_attrs([{<<"node">>, _val}
+ | _attrs],
+ _Node, Name, Jid) ->
+ decode_disco_items_query_item_attrs(_attrs, _val, Name,
+ Jid);
+decode_disco_items_query_item_attrs([{<<"name">>, _val}
+ | _attrs],
+ Node, _Name, Jid) ->
+ decode_disco_items_query_item_attrs(_attrs, Node, _val,
+ Jid);
+decode_disco_items_query_item_attrs([{<<"jid">>, _val}
+ | _attrs],
+ Node, Name, _Jid) ->
+ decode_disco_items_query_item_attrs(_attrs, Node, Name,
+ _val);
+decode_disco_items_query_item_attrs([_ | _attrs], Node,
+ Name, Jid) ->
+ decode_disco_items_query_item_attrs(_attrs, Node, Name,
+ Jid);
+decode_disco_items_query_item_attrs([], Node, Name,
+ Jid) ->
+ {decode_disco_items_query_item_node(Node),
+ decode_disco_items_query_item_name(Name),
+ decode_disco_items_query_item_jid(Jid)}.
+
+encode_disco_items_query_item([], _acc) -> _acc;
+encode_disco_items_query_item([{disco_item, Jid, Name,
+ Node}
+ | _tail],
+ _acc) ->
+ _els = [],
+ _attrs = encode_disco_items_query_item_jid(Jid,
+ encode_disco_items_query_item_name(Name,
+ encode_disco_items_query_item_node(Node,
+ []))),
+ encode_disco_items_query_item(_tail,
+ [{xmlel, <<"item">>, _attrs, _els} | _acc]).
+
+decode_disco_items_query_item_jid(undefined) ->
+ erlang:error({missing_attr, <<"jid">>, <<"item">>,
+ <<>>});
+decode_disco_items_query_item_jid(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"jid">>, <<"item">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_disco_items_query_item_jid(_val, _acc) ->
+ [{<<"jid">>, enc_jid(_val)} | _acc].
+
+decode_disco_items_query_item_name(undefined) ->
+ undefined;
+decode_disco_items_query_item_name(_val) -> _val.
+
+encode_disco_items_query_item_name(undefined, _acc) ->
+ _acc;
+encode_disco_items_query_item_name(_val, _acc) ->
+ [{<<"name">>, _val} | _acc].
+
+decode_disco_items_query_item_node(undefined) ->
+ undefined;
+decode_disco_items_query_item_node(_val) -> _val.
+
+encode_disco_items_query_item_node(undefined, _acc) ->
+ _acc;
+encode_disco_items_query_item_node(_val, _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_private_query({xmlel, _, _attrs, _els}) ->
+ __Els = decode_private_query_els(_els, []),
+ {private, __Els}.
+
+decode_private_query_els([{xmlel, _, _, _} = _el
+ | _els],
+ __Els) ->
+ decode_private_query_els(_els, [decode(_el) | __Els]);
+decode_private_query_els([_ | _els], __Els) ->
+ decode_private_query_els(_els, __Els);
+decode_private_query_els([], __Els) ->
+ lists:reverse(__Els).
+
+encode_private_query(undefined, _acc) -> _acc;
+encode_private_query({private, __Els}, _acc) ->
+ _els = [encode(_subel) || _subel <- __Els] ++ [],
+ _attrs = [{<<"xmlns">>, <<"jabber:iq:private">>}],
+ [{xmlel, <<"query">>, _attrs, _els} | _acc].
+
+decode_bookmark_conference_conference({xmlel, _, _attrs,
+ _els}) ->
+ {Autojoin, Jid, Name} =
+ decode_bookmark_conference_conference_attrs(_attrs,
+ undefined, undefined,
+ undefined),
+ {Password, Nick} =
+ decode_bookmark_conference_conference_els(_els,
+ undefined, undefined),
+ {bookmark_conference, Name, Jid, Autojoin, Nick,
+ Password}.
+
+decode_bookmark_conference_conference_els([{xmlel,
+ <<"password">>, _attrs, _} =
+ _el
+ | _els],
+ Password, Nick) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_bookmark_conference_conference_els(_els,
+ decode_bookmark_conference_conference_password(_el),
+ Nick);
+ _ ->
+ decode_bookmark_conference_conference_els(_els,
+ Password, Nick)
+ end;
+decode_bookmark_conference_conference_els([{xmlel,
+ <<"nick">>, _attrs, _} =
+ _el
+ | _els],
+ Password, Nick) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_bookmark_conference_conference_els(_els,
+ Password,
+ decode_bookmark_conference_conference_nick(_el));
+ _ ->
+ decode_bookmark_conference_conference_els(_els,
+ Password, Nick)
+ end;
+decode_bookmark_conference_conference_els([_ | _els],
+ Password, Nick) ->
+ decode_bookmark_conference_conference_els(_els,
+ Password, Nick);
+decode_bookmark_conference_conference_els([], Password,
+ Nick) ->
+ {Password, Nick}.
+
+decode_bookmark_conference_conference_attrs([{<<"autojoin">>,
+ _val}
+ | _attrs],
+ _Autojoin, Jid, Name) ->
+ decode_bookmark_conference_conference_attrs(_attrs,
+ _val, Jid, Name);
+decode_bookmark_conference_conference_attrs([{<<"jid">>,
+ _val}
+ | _attrs],
+ Autojoin, _Jid, Name) ->
+ decode_bookmark_conference_conference_attrs(_attrs,
+ Autojoin, _val, Name);
+decode_bookmark_conference_conference_attrs([{<<"name">>,
+ _val}
+ | _attrs],
+ Autojoin, Jid, _Name) ->
+ decode_bookmark_conference_conference_attrs(_attrs,
+ Autojoin, Jid, _val);
+decode_bookmark_conference_conference_attrs([_
+ | _attrs],
+ Autojoin, Jid, Name) ->
+ decode_bookmark_conference_conference_attrs(_attrs,
+ Autojoin, Jid, Name);
+decode_bookmark_conference_conference_attrs([],
+ Autojoin, Jid, Name) ->
+ {decode_bookmark_conference_conference_autojoin(Autojoin),
+ decode_bookmark_conference_conference_jid(Jid),
+ decode_bookmark_conference_conference_name(Name)}.
+
+encode_bookmark_conference_conference([], _acc) -> _acc;
+encode_bookmark_conference_conference([{bookmark_conference,
+ Name, Jid, Autojoin, Nick, Password}
+ | _tail],
+ _acc) ->
+ _els = encode_bookmark_conference_conference_nick(Nick,
+ encode_bookmark_conference_conference_password(Password,
+ [])),
+ _attrs =
+ encode_bookmark_conference_conference_name(Name,
+ encode_bookmark_conference_conference_jid(Jid,
+ encode_bookmark_conference_conference_autojoin(Autojoin,
+ []))),
+ encode_bookmark_conference_conference(_tail,
+ [{xmlel, <<"conference">>, _attrs,
+ _els}
+ | _acc]).
+
+decode_bookmark_conference_conference_name(undefined) ->
+ erlang:error({missing_attr, <<"name">>,
+ <<"conference">>, <<>>});
+decode_bookmark_conference_conference_name(_val) ->
+ _val.
+
+encode_bookmark_conference_conference_name(_val,
+ _acc) ->
+ [{<<"name">>, _val} | _acc].
+
+decode_bookmark_conference_conference_jid(undefined) ->
+ erlang:error({missing_attr, <<"jid">>, <<"conference">>,
+ <<>>});
+decode_bookmark_conference_conference_jid(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"jid">>,
+ <<"conference">>, <<>>});
+ _res -> _res
+ end.
+
+encode_bookmark_conference_conference_jid(_val, _acc) ->
+ [{<<"jid">>, enc_jid(_val)} | _acc].
+
+decode_bookmark_conference_conference_autojoin(undefined) ->
+ false;
+decode_bookmark_conference_conference_autojoin(_val) ->
+ case catch dec_bool(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"autojoin">>,
+ <<"conference">>, <<>>});
+ _res -> _res
+ end.
+
+encode_bookmark_conference_conference_autojoin(false,
+ _acc) ->
+ _acc;
+encode_bookmark_conference_conference_autojoin(_val,
+ _acc) ->
+ [{<<"autojoin">>, enc_bool(_val)} | _acc].
+
+decode_bookmark_conference_conference_password({xmlel,
+ _, _attrs, _els}) ->
+ Cdata =
+ decode_bookmark_conference_conference_password_els(_els,
+ <<>>),
+ Cdata.
+
+decode_bookmark_conference_conference_password_els([{xmlcdata,
+ _data}
+ | _els],
+ Cdata) ->
+ decode_bookmark_conference_conference_password_els(_els,
+ <<Cdata/binary,
+ _data/binary>>);
+decode_bookmark_conference_conference_password_els([_
+ | _els],
+ Cdata) ->
+ decode_bookmark_conference_conference_password_els(_els,
+ Cdata);
+decode_bookmark_conference_conference_password_els([],
+ Cdata) ->
+ decode_bookmark_conference_conference_password_cdata(Cdata).
+
+encode_bookmark_conference_conference_password(undefined,
+ _acc) ->
+ _acc;
+encode_bookmark_conference_conference_password(Cdata,
+ _acc) ->
+ _els =
+ encode_bookmark_conference_conference_password_cdata(Cdata,
+ []),
+ _attrs = [],
+ [{xmlel, <<"password">>, _attrs, _els} | _acc].
+
+decode_bookmark_conference_conference_password_cdata(<<>>) ->
+ undefined;
+decode_bookmark_conference_conference_password_cdata(_val) ->
+ _val.
+
+encode_bookmark_conference_conference_password_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_bookmark_conference_conference_password_cdata(_val,
+ _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_bookmark_conference_conference_nick({xmlel, _,
+ _attrs, _els}) ->
+ Cdata =
+ decode_bookmark_conference_conference_nick_els(_els,
+ <<>>),
+ Cdata.
+
+decode_bookmark_conference_conference_nick_els([{xmlcdata,
+ _data}
+ | _els],
+ Cdata) ->
+ decode_bookmark_conference_conference_nick_els(_els,
+ <<Cdata/binary,
+ _data/binary>>);
+decode_bookmark_conference_conference_nick_els([_
+ | _els],
+ Cdata) ->
+ decode_bookmark_conference_conference_nick_els(_els,
+ Cdata);
+decode_bookmark_conference_conference_nick_els([],
+ Cdata) ->
+ decode_bookmark_conference_conference_nick_cdata(Cdata).
+
+encode_bookmark_conference_conference_nick(undefined,
+ _acc) ->
+ _acc;
+encode_bookmark_conference_conference_nick(Cdata,
+ _acc) ->
+ _els =
+ encode_bookmark_conference_conference_nick_cdata(Cdata,
+ []),
+ _attrs = [],
+ [{xmlel, <<"nick">>, _attrs, _els} | _acc].
+
+decode_bookmark_conference_conference_nick_cdata(<<>>) ->
+ undefined;
+decode_bookmark_conference_conference_nick_cdata(_val) ->
+ _val.
+
+encode_bookmark_conference_conference_nick_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_bookmark_conference_conference_nick_cdata(_val,
+ _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_storage_bookmarks_storage({xmlel, _, _attrs,
+ _els}) ->
+ {Url, Conference} =
+ decode_storage_bookmarks_storage_els(_els, [], []),
+ {bookmark_storage, Conference, Url}.
+
+decode_storage_bookmarks_storage_els([{xmlel, <<"url">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Url, Conference) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_storage_bookmarks_storage_els(_els,
+ [decode_storage_bookmarks_storage_url(_el)
+ | Url],
+ Conference);
+ _ ->
+ decode_storage_bookmarks_storage_els(_els, Url,
+ Conference)
+ end;
+decode_storage_bookmarks_storage_els([{xmlel,
+ <<"conference">>, _attrs, _} =
+ _el
+ | _els],
+ Url, Conference) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_storage_bookmarks_storage_els(_els, Url,
+ [decode_bookmark_conference_conference(_el)
+ | Conference]);
+ _ ->
+ decode_storage_bookmarks_storage_els(_els, Url,
+ Conference)
+ end;
+decode_storage_bookmarks_storage_els([_ | _els], Url,
+ Conference) ->
+ decode_storage_bookmarks_storage_els(_els, Url,
+ Conference);
+decode_storage_bookmarks_storage_els([], Url,
+ Conference) ->
+ {lists:reverse(Url), lists:reverse(Conference)}.
+
+encode_storage_bookmarks_storage(undefined, _acc) ->
+ _acc;
+encode_storage_bookmarks_storage({bookmark_storage,
+ Conference, Url},
+ _acc) ->
+ _els = encode_bookmark_conference_conference(Conference,
+ encode_storage_bookmarks_storage_url(Url,
+ [])),
+ _attrs = [{<<"xmlns">>, <<"storage:bookmarks">>}],
+ [{xmlel, <<"storage">>, _attrs, _els} | _acc].
+
+decode_storage_bookmarks_storage_url({xmlel, _, _attrs,
+ _els}) ->
+ {Url, Name} =
+ decode_storage_bookmarks_storage_url_attrs(_attrs,
+ undefined, undefined),
+ {bookmark_url, Name, Url}.
+
+decode_storage_bookmarks_storage_url_attrs([{<<"url">>,
+ _val}
+ | _attrs],
+ _Url, Name) ->
+ decode_storage_bookmarks_storage_url_attrs(_attrs, _val,
+ Name);
+decode_storage_bookmarks_storage_url_attrs([{<<"name">>,
+ _val}
+ | _attrs],
+ Url, _Name) ->
+ decode_storage_bookmarks_storage_url_attrs(_attrs, Url,
+ _val);
+decode_storage_bookmarks_storage_url_attrs([_ | _attrs],
+ Url, Name) ->
+ decode_storage_bookmarks_storage_url_attrs(_attrs, Url,
+ Name);
+decode_storage_bookmarks_storage_url_attrs([], Url,
+ Name) ->
+ {decode_storage_bookmarks_storage_url_url(Url),
+ decode_storage_bookmarks_storage_url_name(Name)}.
+
+encode_storage_bookmarks_storage_url([], _acc) -> _acc;
+encode_storage_bookmarks_storage_url([{bookmark_url,
+ Name, Url}
+ | _tail],
+ _acc) ->
+ _els = [],
+ _attrs = encode_storage_bookmarks_storage_url_name(Name,
+ encode_storage_bookmarks_storage_url_url(Url,
+ [])),
+ encode_storage_bookmarks_storage_url(_tail,
+ [{xmlel, <<"url">>, _attrs, _els}
+ | _acc]).
+
+decode_storage_bookmarks_storage_url_name(undefined) ->
+ erlang:error({missing_attr, <<"name">>, <<"url">>,
+ <<>>});
+decode_storage_bookmarks_storage_url_name(_val) -> _val.
+
+encode_storage_bookmarks_storage_url_name(_val, _acc) ->
+ [{<<"name">>, _val} | _acc].
+
+decode_storage_bookmarks_storage_url_url(undefined) ->
+ erlang:error({missing_attr, <<"url">>, <<"url">>,
+ <<>>});
+decode_storage_bookmarks_storage_url_url(_val) -> _val.
+
+encode_storage_bookmarks_storage_url_url(_val, _acc) ->
+ [{<<"url">>, _val} | _acc].
+
+decode_stats_query({xmlel, _, _attrs, _els}) ->
+ Stat = decode_stats_query_els(_els, []), {stats, Stat}.
+
+decode_stats_query_els([{xmlel, <<"stat">>, _attrs, _} =
+ _el
+ | _els],
+ Stat) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_stats_query_els(_els,
+ [decode_stats_query_stat(_el) | Stat]);
+ _ -> decode_stats_query_els(_els, Stat)
+ end;
+decode_stats_query_els([_ | _els], Stat) ->
+ decode_stats_query_els(_els, Stat);
+decode_stats_query_els([], Stat) -> lists:reverse(Stat).
+
+encode_stats_query(undefined, _acc) -> _acc;
+encode_stats_query({stats, Stat}, _acc) ->
+ _els = encode_stats_query_stat(Stat, []),
+ _attrs = [{<<"xmlns">>,
+ <<"http://jabber.org/protocol/stats">>}],
+ [{xmlel, <<"query">>, _attrs, _els} | _acc].
+
+decode_stats_query_stat({xmlel, _, _attrs, _els}) ->
+ {Value, Units, Name} =
+ decode_stats_query_stat_attrs(_attrs, undefined,
+ undefined, undefined),
+ Error = decode_stats_query_stat_els(_els, []),
+ {stat, Name, Units, Value, Error}.
+
+decode_stats_query_stat_els([{xmlel, <<"error">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Error) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_stats_query_stat_els(_els,
+ [decode_stats_query_stat_error(_el)
+ | Error]);
+ _ -> decode_stats_query_stat_els(_els, Error)
+ end;
+decode_stats_query_stat_els([_ | _els], Error) ->
+ decode_stats_query_stat_els(_els, Error);
+decode_stats_query_stat_els([], Error) ->
+ lists:reverse(Error).
+
+decode_stats_query_stat_attrs([{<<"value">>, _val}
+ | _attrs],
+ _Value, Units, Name) ->
+ decode_stats_query_stat_attrs(_attrs, _val, Units,
+ Name);
+decode_stats_query_stat_attrs([{<<"units">>, _val}
+ | _attrs],
+ Value, _Units, Name) ->
+ decode_stats_query_stat_attrs(_attrs, Value, _val,
+ Name);
+decode_stats_query_stat_attrs([{<<"name">>, _val}
+ | _attrs],
+ Value, Units, _Name) ->
+ decode_stats_query_stat_attrs(_attrs, Value, Units,
+ _val);
+decode_stats_query_stat_attrs([_ | _attrs], Value,
+ Units, Name) ->
+ decode_stats_query_stat_attrs(_attrs, Value, Units,
+ Name);
+decode_stats_query_stat_attrs([], Value, Units, Name) ->
+ {decode_stats_query_stat_value(Value),
+ decode_stats_query_stat_units(Units),
+ decode_stats_query_stat_name(Name)}.
+
+encode_stats_query_stat([], _acc) -> _acc;
+encode_stats_query_stat([{stat, Name, Units, Value,
+ Error}
+ | _tail],
+ _acc) ->
+ _els = encode_stats_query_stat_error(Error, []),
+ _attrs = encode_stats_query_stat_name(Name,
+ encode_stats_query_stat_units(Units,
+ encode_stats_query_stat_value(Value,
+ []))),
+ encode_stats_query_stat(_tail,
+ [{xmlel, <<"stat">>, _attrs, _els} | _acc]).
+
+decode_stats_query_stat_name(undefined) ->
+ erlang:error({missing_attr, <<"name">>, <<"stat">>,
+ <<>>});
+decode_stats_query_stat_name(_val) -> _val.
+
+encode_stats_query_stat_name(_val, _acc) ->
+ [{<<"name">>, _val} | _acc].
+
+decode_stats_query_stat_units(undefined) -> undefined;
+decode_stats_query_stat_units(_val) -> _val.
+
+encode_stats_query_stat_units(undefined, _acc) -> _acc;
+encode_stats_query_stat_units(_val, _acc) ->
+ [{<<"units">>, _val} | _acc].
+
+decode_stats_query_stat_value(undefined) -> undefined;
+decode_stats_query_stat_value(_val) -> _val.
+
+encode_stats_query_stat_value(undefined, _acc) -> _acc;
+encode_stats_query_stat_value(_val, _acc) ->
+ [{<<"value">>, _val} | _acc].
+
+decode_stats_query_stat_error({xmlel, _, _attrs,
+ _els}) ->
+ Code = decode_stats_query_stat_error_attrs(_attrs,
+ undefined),
+ Cdata = decode_stats_query_stat_error_els(_els, <<>>),
+ {Code, Cdata}.
+
+decode_stats_query_stat_error_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_stats_query_stat_error_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_stats_query_stat_error_els([_ | _els], Cdata) ->
+ decode_stats_query_stat_error_els(_els, Cdata);
+decode_stats_query_stat_error_els([], Cdata) ->
+ decode_stats_query_stat_error_cdata(Cdata).
+
+decode_stats_query_stat_error_attrs([{<<"code">>, _val}
+ | _attrs],
+ _Code) ->
+ decode_stats_query_stat_error_attrs(_attrs, _val);
+decode_stats_query_stat_error_attrs([_ | _attrs],
+ Code) ->
+ decode_stats_query_stat_error_attrs(_attrs, Code);
+decode_stats_query_stat_error_attrs([], Code) ->
+ decode_stats_query_stat_error_code(Code).
+
+encode_stats_query_stat_error([], _acc) -> _acc;
+encode_stats_query_stat_error([{Code, Cdata} | _tail],
+ _acc) ->
+ _els = encode_stats_query_stat_error_cdata(Cdata, []),
+ _attrs = encode_stats_query_stat_error_code(Code, []),
+ encode_stats_query_stat_error(_tail,
+ [{xmlel, <<"error">>, _attrs, _els} | _acc]).
+
+decode_stats_query_stat_error_code(undefined) ->
+ erlang:error({missing_attr, <<"code">>, <<"error">>,
+ <<>>});
+decode_stats_query_stat_error_code(_val) ->
+ case catch xml_gen:dec_int(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"code">>, <<"error">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_stats_query_stat_error_code(_val, _acc) ->
+ [{<<"code">>, xml_gen:enc_int(_val)} | _acc].
+
+decode_stats_query_stat_error_cdata(<<>>) -> undefined;
+decode_stats_query_stat_error_cdata(_val) -> _val.
+
+encode_stats_query_stat_error_cdata(undefined, _acc) ->
+ _acc;
+encode_stats_query_stat_error_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_iq_iq({xmlel, _, _attrs, _els}) ->
+ {To, From, Lang, Type, Id} = decode_iq_iq_attrs(_attrs,
+ undefined, undefined,
+ undefined, undefined,
+ undefined),
+ {__Els, Error} = decode_iq_iq_els(_els, [], undefined),
+ {iq, Id, Type, Lang, From, To, Error, __Els}.
+
+decode_iq_iq_els([{xmlel, <<"error">>, _attrs, _} = _el
+ | _els],
+ __Els, Error) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_iq_iq_els(_els, __Els, decode_error_error(_el));
+ _ ->
+ decode_iq_iq_els(_els, [decode(_el) | __Els], Error)
+ end;
+decode_iq_iq_els([{xmlel, _, _, _} = _el | _els], __Els,
+ Error) ->
+ decode_iq_iq_els(_els, [decode(_el) | __Els], Error);
+decode_iq_iq_els([_ | _els], __Els, Error) ->
+ decode_iq_iq_els(_els, __Els, Error);
+decode_iq_iq_els([], __Els, Error) ->
+ {lists:reverse(__Els), Error}.
+
+decode_iq_iq_attrs([{<<"to">>, _val} | _attrs], _To,
+ From, Lang, Type, Id) ->
+ decode_iq_iq_attrs(_attrs, _val, From, Lang, Type, Id);
+decode_iq_iq_attrs([{<<"from">>, _val} | _attrs], To,
+ _From, Lang, Type, Id) ->
+ decode_iq_iq_attrs(_attrs, To, _val, Lang, Type, Id);
+decode_iq_iq_attrs([{<<"xml:lang">>, _val} | _attrs],
+ To, From, _Lang, Type, Id) ->
+ decode_iq_iq_attrs(_attrs, To, From, _val, Type, Id);
+decode_iq_iq_attrs([{<<"type">>, _val} | _attrs], To,
+ From, Lang, _Type, Id) ->
+ decode_iq_iq_attrs(_attrs, To, From, Lang, _val, Id);
+decode_iq_iq_attrs([{<<"id">>, _val} | _attrs], To,
+ From, Lang, Type, _Id) ->
+ decode_iq_iq_attrs(_attrs, To, From, Lang, Type, _val);
+decode_iq_iq_attrs([_ | _attrs], To, From, Lang, Type,
+ Id) ->
+ decode_iq_iq_attrs(_attrs, To, From, Lang, Type, Id);
+decode_iq_iq_attrs([], To, From, Lang, Type, Id) ->
+ {decode_iq_iq_to(To), decode_iq_iq_from(From),
+ 'decode_iq_iq_xml:lang'(Lang), decode_iq_iq_type(Type),
+ decode_iq_iq_id(Id)}.
+
+encode_iq_iq(undefined, _acc) -> _acc;
+encode_iq_iq({iq, Id, Type, Lang, From, To, Error,
+ __Els},
+ _acc) ->
+ _els = encode_error_error(Error,
+ [encode(_subel) || _subel <- __Els] ++ []),
+ _attrs = encode_iq_iq_id(Id,
+ encode_iq_iq_type(Type,
+ 'encode_iq_iq_xml:lang'(Lang,
+ encode_iq_iq_from(From,
+ encode_iq_iq_to(To,
+ []))))),
+ [{xmlel, <<"iq">>, _attrs, _els} | _acc].
+
+decode_iq_iq_id(undefined) ->
+ erlang:error({missing_attr, <<"id">>, <<"iq">>, <<>>});
+decode_iq_iq_id(_val) -> _val.
+
+encode_iq_iq_id(_val, _acc) ->
+ [{<<"id">>, _val} | _acc].
+
+decode_iq_iq_type(undefined) ->
+ erlang:error({missing_attr, <<"type">>, <<"iq">>,
+ <<>>});
+decode_iq_iq_type(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [get, set, result, error])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"type">>, <<"iq">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_iq_iq_type(_val, _acc) ->
+ [{<<"type">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_iq_iq_from(undefined) -> undefined;
+decode_iq_iq_from(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"from">>, <<"iq">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_iq_iq_from(undefined, _acc) -> _acc;
+encode_iq_iq_from(_val, _acc) ->
+ [{<<"from">>, enc_jid(_val)} | _acc].
+
+decode_iq_iq_to(undefined) -> undefined;
+decode_iq_iq_to(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"to">>, <<"iq">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_iq_iq_to(undefined, _acc) -> _acc;
+encode_iq_iq_to(_val, _acc) ->
+ [{<<"to">>, enc_jid(_val)} | _acc].
+
+'decode_iq_iq_xml:lang'(undefined) -> undefined;
+'decode_iq_iq_xml:lang'(_val) -> _val.
+
+'encode_iq_iq_xml:lang'(undefined, _acc) -> _acc;
+'encode_iq_iq_xml:lang'(_val, _acc) ->
+ [{<<"xml:lang">>, _val} | _acc].
+
+decode_message_message({xmlel, _, _attrs, _els}) ->
+ {To, From, Lang, Type, Id} =
+ decode_message_message_attrs(_attrs, undefined,
+ undefined, undefined, undefined,
+ undefined),
+ {__Els, Error, Thread, Body, Subject} =
+ decode_message_message_els(_els, [], undefined,
+ undefined, [], []),
+ {message, Id, Type, Lang, From, To, Subject, Body,
+ Thread, Error, __Els}.
+
+decode_message_message_els([{xmlel, <<"error">>, _attrs,
+ _} =
+ _el
+ | _els],
+ __Els, Error, Thread, Body, Subject) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_message_message_els(_els, __Els,
+ decode_error_error(_el), Thread, Body,
+ Subject);
+ _ ->
+ decode_message_message_els(_els, [decode(_el) | __Els],
+ Error, Thread, Body, Subject)
+ end;
+decode_message_message_els([{xmlel, <<"thread">>,
+ _attrs, _} =
+ _el
+ | _els],
+ __Els, Error, Thread, Body, Subject) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_message_message_els(_els, __Els, Error,
+ decode_message_message_thread(_el), Body,
+ Subject);
+ _ ->
+ decode_message_message_els(_els, [decode(_el) | __Els],
+ Error, Thread, Body, Subject)
+ end;
+decode_message_message_els([{xmlel, <<"body">>, _attrs,
+ _} =
+ _el
+ | _els],
+ __Els, Error, Thread, Body, Subject) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_message_message_els(_els, __Els, Error, Thread,
+ [decode_message_message_body(_el) | Body],
+ Subject);
+ _ ->
+ decode_message_message_els(_els, [decode(_el) | __Els],
+ Error, Thread, Body, Subject)
+ end;
+decode_message_message_els([{xmlel, <<"subject">>,
+ _attrs, _} =
+ _el
+ | _els],
+ __Els, Error, Thread, Body, Subject) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_message_message_els(_els, __Els, Error, Thread,
+ Body,
+ [decode_message_message_subject(_el)
+ | Subject]);
+ _ ->
+ decode_message_message_els(_els, [decode(_el) | __Els],
+ Error, Thread, Body, Subject)
+ end;
+decode_message_message_els([{xmlel, _, _, _} = _el
+ | _els],
+ __Els, Error, Thread, Body, Subject) ->
+ decode_message_message_els(_els, [decode(_el) | __Els],
+ Error, Thread, Body, Subject);
+decode_message_message_els([_ | _els], __Els, Error,
+ Thread, Body, Subject) ->
+ decode_message_message_els(_els, __Els, Error, Thread,
+ Body, Subject);
+decode_message_message_els([], __Els, Error, Thread,
+ Body, Subject) ->
+ {lists:reverse(__Els), Error, Thread,
+ lists:reverse(Body), lists:reverse(Subject)}.
+
+decode_message_message_attrs([{<<"to">>, _val}
+ | _attrs],
+ _To, From, Lang, Type, Id) ->
+ decode_message_message_attrs(_attrs, _val, From, Lang,
+ Type, Id);
+decode_message_message_attrs([{<<"from">>, _val}
+ | _attrs],
+ To, _From, Lang, Type, Id) ->
+ decode_message_message_attrs(_attrs, To, _val, Lang,
+ Type, Id);
+decode_message_message_attrs([{<<"xml:lang">>, _val}
+ | _attrs],
+ To, From, _Lang, Type, Id) ->
+ decode_message_message_attrs(_attrs, To, From, _val,
+ Type, Id);
+decode_message_message_attrs([{<<"type">>, _val}
+ | _attrs],
+ To, From, Lang, _Type, Id) ->
+ decode_message_message_attrs(_attrs, To, From, Lang,
+ _val, Id);
+decode_message_message_attrs([{<<"id">>, _val}
+ | _attrs],
+ To, From, Lang, Type, _Id) ->
+ decode_message_message_attrs(_attrs, To, From, Lang,
+ Type, _val);
+decode_message_message_attrs([_ | _attrs], To, From,
+ Lang, Type, Id) ->
+ decode_message_message_attrs(_attrs, To, From, Lang,
+ Type, Id);
+decode_message_message_attrs([], To, From, Lang, Type,
+ Id) ->
+ {decode_message_message_to(To),
+ decode_message_message_from(From),
+ 'decode_message_message_xml:lang'(Lang),
+ decode_message_message_type(Type),
+ decode_message_message_id(Id)}.
+
+encode_message_message(undefined, _acc) -> _acc;
+encode_message_message({message, Id, Type, Lang, From,
+ To, Subject, Body, Thread, Error, __Els},
+ _acc) ->
+ _els = encode_message_message_subject(Subject,
+ encode_message_message_body(Body,
+ encode_message_message_thread(Thread,
+ encode_error_error(Error,
+ [encode(_subel)
+ || _subel
+ <- __Els]
+ ++
+ [])))),
+ _attrs = encode_message_message_id(Id,
+ encode_message_message_type(Type,
+ 'encode_message_message_xml:lang'(Lang,
+ encode_message_message_from(From,
+ encode_message_message_to(To,
+ []))))),
+ [{xmlel, <<"message">>, _attrs, _els} | _acc].
+
+decode_message_message_id(undefined) -> undefined;
+decode_message_message_id(_val) -> _val.
+
+encode_message_message_id(undefined, _acc) -> _acc;
+encode_message_message_id(_val, _acc) ->
+ [{<<"id">>, _val} | _acc].
+
+decode_message_message_type(undefined) -> normal;
+decode_message_message_type(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [chat, normal, groupchat, headline, error])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"type">>, <<"message">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_message_message_type(normal, _acc) -> _acc;
+encode_message_message_type(_val, _acc) ->
+ [{<<"type">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_message_message_from(undefined) -> undefined;
+decode_message_message_from(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"from">>, <<"message">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_message_message_from(undefined, _acc) -> _acc;
+encode_message_message_from(_val, _acc) ->
+ [{<<"from">>, enc_jid(_val)} | _acc].
+
+decode_message_message_to(undefined) -> undefined;
+decode_message_message_to(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"to">>, <<"message">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_message_message_to(undefined, _acc) -> _acc;
+encode_message_message_to(_val, _acc) ->
+ [{<<"to">>, enc_jid(_val)} | _acc].
+
+'decode_message_message_xml:lang'(undefined) ->
+ undefined;
+'decode_message_message_xml:lang'(_val) -> _val.
+
+'encode_message_message_xml:lang'(undefined, _acc) ->
+ _acc;
+'encode_message_message_xml:lang'(_val, _acc) ->
+ [{<<"xml:lang">>, _val} | _acc].
+
+decode_message_message_thread({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_message_message_thread_els(_els, <<>>),
+ Cdata.
+
+decode_message_message_thread_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_message_message_thread_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_message_message_thread_els([_ | _els], Cdata) ->
+ decode_message_message_thread_els(_els, Cdata);
+decode_message_message_thread_els([], Cdata) ->
+ decode_message_message_thread_cdata(Cdata).
+
+encode_message_message_thread(undefined, _acc) -> _acc;
+encode_message_message_thread(Cdata, _acc) ->
+ _els = encode_message_message_thread_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"thread">>, _attrs, _els} | _acc].
+
+decode_message_message_thread_cdata(<<>>) -> undefined;
+decode_message_message_thread_cdata(_val) -> _val.
+
+encode_message_message_thread_cdata(undefined, _acc) ->
+ _acc;
+encode_message_message_thread_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_message_message_body({xmlel, _, _attrs, _els}) ->
+ Body_lang = decode_message_message_body_attrs(_attrs,
+ undefined),
+ Cdata = decode_message_message_body_els(_els, <<>>),
+ {Body_lang, Cdata}.
+
+decode_message_message_body_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_message_message_body_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_message_message_body_els([_ | _els], Cdata) ->
+ decode_message_message_body_els(_els, Cdata);
+decode_message_message_body_els([], Cdata) ->
+ decode_message_message_body_cdata(Cdata).
+
+decode_message_message_body_attrs([{<<"xml:lang">>,
+ _val}
+ | _attrs],
+ _Body_lang) ->
+ decode_message_message_body_attrs(_attrs, _val);
+decode_message_message_body_attrs([_ | _attrs],
+ Body_lang) ->
+ decode_message_message_body_attrs(_attrs, Body_lang);
+decode_message_message_body_attrs([], Body_lang) ->
+ 'decode_message_message_body_xml:lang'(Body_lang).
+
+encode_message_message_body([], _acc) -> _acc;
+encode_message_message_body([{Body_lang, Cdata}
+ | _tail],
+ _acc) ->
+ _els = encode_message_message_body_cdata(Cdata, []),
+ _attrs =
+ 'encode_message_message_body_xml:lang'(Body_lang, []),
+ encode_message_message_body(_tail,
+ [{xmlel, <<"body">>, _attrs, _els} | _acc]).
+
+'decode_message_message_body_xml:lang'(undefined) ->
+ undefined;
+'decode_message_message_body_xml:lang'(_val) -> _val.
+
+'encode_message_message_body_xml:lang'(undefined,
+ _acc) ->
+ _acc;
+'encode_message_message_body_xml:lang'(_val, _acc) ->
+ [{<<"xml:lang">>, _val} | _acc].
+
+decode_message_message_body_cdata(<<>>) -> undefined;
+decode_message_message_body_cdata(_val) -> _val.
+
+encode_message_message_body_cdata(undefined, _acc) ->
+ _acc;
+encode_message_message_body_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_message_message_subject({xmlel, _, _attrs,
+ _els}) ->
+ Subject_lang =
+ decode_message_message_subject_attrs(_attrs, undefined),
+ Cdata = decode_message_message_subject_els(_els, <<>>),
+ {Subject_lang, Cdata}.
+
+decode_message_message_subject_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_message_message_subject_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_message_message_subject_els([_ | _els], Cdata) ->
+ decode_message_message_subject_els(_els, Cdata);
+decode_message_message_subject_els([], Cdata) ->
+ decode_message_message_subject_cdata(Cdata).
+
+decode_message_message_subject_attrs([{<<"xml:lang">>,
+ _val}
+ | _attrs],
+ _Subject_lang) ->
+ decode_message_message_subject_attrs(_attrs, _val);
+decode_message_message_subject_attrs([_ | _attrs],
+ Subject_lang) ->
+ decode_message_message_subject_attrs(_attrs,
+ Subject_lang);
+decode_message_message_subject_attrs([],
+ Subject_lang) ->
+ 'decode_message_message_subject_xml:lang'(Subject_lang).
+
+encode_message_message_subject([], _acc) -> _acc;
+encode_message_message_subject([{Subject_lang, Cdata}
+ | _tail],
+ _acc) ->
+ _els = encode_message_message_subject_cdata(Cdata, []),
+ _attrs =
+ 'encode_message_message_subject_xml:lang'(Subject_lang,
+ []),
+ encode_message_message_subject(_tail,
+ [{xmlel, <<"subject">>, _attrs, _els}
+ | _acc]).
+
+'decode_message_message_subject_xml:lang'(undefined) ->
+ undefined;
+'decode_message_message_subject_xml:lang'(_val) -> _val.
+
+'encode_message_message_subject_xml:lang'(undefined,
+ _acc) ->
+ _acc;
+'encode_message_message_subject_xml:lang'(_val, _acc) ->
+ [{<<"xml:lang">>, _val} | _acc].
+
+decode_message_message_subject_cdata(<<>>) -> undefined;
+decode_message_message_subject_cdata(_val) -> _val.
+
+encode_message_message_subject_cdata(undefined, _acc) ->
+ _acc;
+encode_message_message_subject_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_presence_presence({xmlel, _, _attrs, _els}) ->
+ {To, From, Lang, Type, Id} =
+ decode_presence_presence_attrs(_attrs, undefined,
+ undefined, undefined, undefined,
+ undefined),
+ {__Els, Error, Priority, Status, Show} =
+ decode_presence_presence_els(_els, [], undefined,
+ undefined, [], undefined),
+ {presence, Id, Type, Lang, From, To, Show, Status,
+ Priority, Error, __Els}.
+
+decode_presence_presence_els([{xmlel, <<"error">>,
+ _attrs, _} =
+ _el
+ | _els],
+ __Els, Error, Priority, Status, Show) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_presence_presence_els(_els, __Els,
+ decode_error_error(_el), Priority,
+ Status, Show);
+ _ ->
+ decode_presence_presence_els(_els,
+ [decode(_el) | __Els], Error, Priority,
+ Status, Show)
+ end;
+decode_presence_presence_els([{xmlel, <<"priority">>,
+ _attrs, _} =
+ _el
+ | _els],
+ __Els, Error, Priority, Status, Show) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_presence_presence_els(_els, __Els, Error,
+ decode_presence_presence_priority(_el),
+ Status, Show);
+ _ ->
+ decode_presence_presence_els(_els,
+ [decode(_el) | __Els], Error, Priority,
+ Status, Show)
+ end;
+decode_presence_presence_els([{xmlel, <<"status">>,
+ _attrs, _} =
+ _el
+ | _els],
+ __Els, Error, Priority, Status, Show) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_presence_presence_els(_els, __Els, Error,
+ Priority,
+ [decode_presence_presence_status(_el)
+ | Status],
+ Show);
+ _ ->
+ decode_presence_presence_els(_els,
+ [decode(_el) | __Els], Error, Priority,
+ Status, Show)
+ end;
+decode_presence_presence_els([{xmlel, <<"show">>,
+ _attrs, _} =
+ _el
+ | _els],
+ __Els, Error, Priority, Status, Show) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_presence_presence_els(_els, __Els, Error,
+ Priority, Status,
+ decode_presence_presence_show(_el));
+ _ ->
+ decode_presence_presence_els(_els,
+ [decode(_el) | __Els], Error, Priority,
+ Status, Show)
+ end;
+decode_presence_presence_els([{xmlel, _, _, _} = _el
+ | _els],
+ __Els, Error, Priority, Status, Show) ->
+ decode_presence_presence_els(_els,
+ [decode(_el) | __Els], Error, Priority, Status,
+ Show);
+decode_presence_presence_els([_ | _els], __Els, Error,
+ Priority, Status, Show) ->
+ decode_presence_presence_els(_els, __Els, Error,
+ Priority, Status, Show);
+decode_presence_presence_els([], __Els, Error, Priority,
+ Status, Show) ->
+ {lists:reverse(__Els), Error, Priority,
+ lists:reverse(Status), Show}.
+
+decode_presence_presence_attrs([{<<"to">>, _val}
+ | _attrs],
+ _To, From, Lang, Type, Id) ->
+ decode_presence_presence_attrs(_attrs, _val, From, Lang,
+ Type, Id);
+decode_presence_presence_attrs([{<<"from">>, _val}
+ | _attrs],
+ To, _From, Lang, Type, Id) ->
+ decode_presence_presence_attrs(_attrs, To, _val, Lang,
+ Type, Id);
+decode_presence_presence_attrs([{<<"xml:lang">>, _val}
+ | _attrs],
+ To, From, _Lang, Type, Id) ->
+ decode_presence_presence_attrs(_attrs, To, From, _val,
+ Type, Id);
+decode_presence_presence_attrs([{<<"type">>, _val}
+ | _attrs],
+ To, From, Lang, _Type, Id) ->
+ decode_presence_presence_attrs(_attrs, To, From, Lang,
+ _val, Id);
+decode_presence_presence_attrs([{<<"id">>, _val}
+ | _attrs],
+ To, From, Lang, Type, _Id) ->
+ decode_presence_presence_attrs(_attrs, To, From, Lang,
+ Type, _val);
+decode_presence_presence_attrs([_ | _attrs], To, From,
+ Lang, Type, Id) ->
+ decode_presence_presence_attrs(_attrs, To, From, Lang,
+ Type, Id);
+decode_presence_presence_attrs([], To, From, Lang, Type,
+ Id) ->
+ {decode_presence_presence_to(To),
+ decode_presence_presence_from(From),
+ 'decode_presence_presence_xml:lang'(Lang),
+ decode_presence_presence_type(Type),
+ decode_presence_presence_id(Id)}.
+
+encode_presence_presence(undefined, _acc) -> _acc;
+encode_presence_presence({presence, Id, Type, Lang,
+ From, To, Show, Status, Priority, Error, __Els},
+ _acc) ->
+ _els = encode_presence_presence_show(Show,
+ encode_presence_presence_status(Status,
+ encode_presence_presence_priority(Priority,
+ encode_error_error(Error,
+ [encode(_subel)
+ || _subel
+ <- __Els]
+ ++
+ [])))),
+ _attrs = encode_presence_presence_id(Id,
+ encode_presence_presence_type(Type,
+ 'encode_presence_presence_xml:lang'(Lang,
+ encode_presence_presence_from(From,
+ encode_presence_presence_to(To,
+ []))))),
+ [{xmlel, <<"presence">>, _attrs, _els} | _acc].
+
+decode_presence_presence_id(undefined) -> undefined;
+decode_presence_presence_id(_val) -> _val.
+
+encode_presence_presence_id(undefined, _acc) -> _acc;
+encode_presence_presence_id(_val, _acc) ->
+ [{<<"id">>, _val} | _acc].
+
+decode_presence_presence_type(undefined) -> undefined;
+decode_presence_presence_type(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [unavailable, subscribe, subscribed,
+ unsubscribe, unsubscribed, probe, error])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"type">>,
+ <<"presence">>, <<>>});
+ _res -> _res
+ end.
+
+encode_presence_presence_type(undefined, _acc) -> _acc;
+encode_presence_presence_type(_val, _acc) ->
+ [{<<"type">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_presence_presence_from(undefined) -> undefined;
+decode_presence_presence_from(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"from">>,
+ <<"presence">>, <<>>});
+ _res -> _res
+ end.
+
+encode_presence_presence_from(undefined, _acc) -> _acc;
+encode_presence_presence_from(_val, _acc) ->
+ [{<<"from">>, enc_jid(_val)} | _acc].
+
+decode_presence_presence_to(undefined) -> undefined;
+decode_presence_presence_to(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"to">>, <<"presence">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_presence_presence_to(undefined, _acc) -> _acc;
+encode_presence_presence_to(_val, _acc) ->
+ [{<<"to">>, enc_jid(_val)} | _acc].
+
+'decode_presence_presence_xml:lang'(undefined) ->
+ undefined;
+'decode_presence_presence_xml:lang'(_val) -> _val.
+
+'encode_presence_presence_xml:lang'(undefined, _acc) ->
+ _acc;
+'encode_presence_presence_xml:lang'(_val, _acc) ->
+ [{<<"xml:lang">>, _val} | _acc].
+
+decode_presence_presence_priority({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_presence_presence_priority_els(_els,
+ <<>>),
+ Cdata.
+
+decode_presence_presence_priority_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_presence_presence_priority_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_presence_presence_priority_els([_ | _els],
+ Cdata) ->
+ decode_presence_presence_priority_els(_els, Cdata);
+decode_presence_presence_priority_els([], Cdata) ->
+ decode_presence_presence_priority_cdata(Cdata).
+
+encode_presence_presence_priority(undefined, _acc) ->
+ _acc;
+encode_presence_presence_priority(Cdata, _acc) ->
+ _els = encode_presence_presence_priority_cdata(Cdata,
+ []),
+ _attrs = [],
+ [{xmlel, <<"priority">>, _attrs, _els} | _acc].
+
+decode_presence_presence_priority_cdata(<<>>) ->
+ undefined;
+decode_presence_presence_priority_cdata(_val) ->
+ case catch xml_gen:dec_int(_val, -128, 127) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"priority">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_presence_presence_priority_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_presence_presence_priority_cdata(_val, _acc) ->
+ [{xmlcdata, xml_gen:enc_int(_val)} | _acc].
+
+decode_presence_presence_status({xmlel, _, _attrs,
+ _els}) ->
+ Status_lang =
+ decode_presence_presence_status_attrs(_attrs,
+ undefined),
+ Cdata = decode_presence_presence_status_els(_els, <<>>),
+ {Status_lang, Cdata}.
+
+decode_presence_presence_status_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_presence_presence_status_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_presence_presence_status_els([_ | _els],
+ Cdata) ->
+ decode_presence_presence_status_els(_els, Cdata);
+decode_presence_presence_status_els([], Cdata) ->
+ decode_presence_presence_status_cdata(Cdata).
+
+decode_presence_presence_status_attrs([{<<"xml:lang">>,
+ _val}
+ | _attrs],
+ _Status_lang) ->
+ decode_presence_presence_status_attrs(_attrs, _val);
+decode_presence_presence_status_attrs([_ | _attrs],
+ Status_lang) ->
+ decode_presence_presence_status_attrs(_attrs,
+ Status_lang);
+decode_presence_presence_status_attrs([],
+ Status_lang) ->
+ 'decode_presence_presence_status_xml:lang'(Status_lang).
+
+encode_presence_presence_status([], _acc) -> _acc;
+encode_presence_presence_status([{Status_lang, Cdata}
+ | _tail],
+ _acc) ->
+ _els = encode_presence_presence_status_cdata(Cdata, []),
+ _attrs =
+ 'encode_presence_presence_status_xml:lang'(Status_lang,
+ []),
+ encode_presence_presence_status(_tail,
+ [{xmlel, <<"status">>, _attrs, _els}
+ | _acc]).
+
+'decode_presence_presence_status_xml:lang'(undefined) ->
+ undefined;
+'decode_presence_presence_status_xml:lang'(_val) ->
+ _val.
+
+'encode_presence_presence_status_xml:lang'(undefined,
+ _acc) ->
+ _acc;
+'encode_presence_presence_status_xml:lang'(_val,
+ _acc) ->
+ [{<<"xml:lang">>, _val} | _acc].
+
+decode_presence_presence_status_cdata(<<>>) ->
+ undefined;
+decode_presence_presence_status_cdata(_val) -> _val.
+
+encode_presence_presence_status_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_presence_presence_status_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_presence_presence_show({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_presence_presence_show_els(_els, <<>>),
+ Cdata.
+
+decode_presence_presence_show_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_presence_presence_show_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_presence_presence_show_els([_ | _els], Cdata) ->
+ decode_presence_presence_show_els(_els, Cdata);
+decode_presence_presence_show_els([], Cdata) ->
+ decode_presence_presence_show_cdata(Cdata).
+
+encode_presence_presence_show(undefined, _acc) -> _acc;
+encode_presence_presence_show(Cdata, _acc) ->
+ _els = encode_presence_presence_show_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"show">>, _attrs, _els} | _acc].
+
+decode_presence_presence_show_cdata(<<>>) -> undefined;
+decode_presence_presence_show_cdata(_val) ->
+ case catch xml_gen:dec_enum(_val, [away, chat, dnd, xa])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"show">>, <<>>});
+ _res -> _res
+ end.
+
+encode_presence_presence_show_cdata(undefined, _acc) ->
+ _acc;
+encode_presence_presence_show_cdata(_val, _acc) ->
+ [{xmlcdata, xml_gen:enc_enum(_val)} | _acc].
+
+decode_error_error({xmlel, _, _attrs, _els}) ->
+ {By, Error_type} = decode_error_error_attrs(_attrs,
+ undefined, undefined),
+ {Text, Reason} = decode_error_error_els(_els, undefined,
+ undefined),
+ {error, Error_type, By, Reason, Text}.
+
+decode_error_error_els([{xmlel, <<"text">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els,
+ decode_error_error_text(_el), Reason);
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"unexpected-request">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_unexpected-request'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"undefined-condition">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_undefined-condition'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"subscription-required">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_subscription-required'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"service-unavailable">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_service-unavailable'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"resource-constraint">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_resource-constraint'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"remote-server-timeout">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_remote-server-timeout'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"remote-server-not-found">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_remote-server-not-found'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"registration-required">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_registration-required'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"redirect">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ decode_error_error_redirect(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"recipient-unavailable">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_recipient-unavailable'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"policy-violation">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_policy-violation'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"not-authorized">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_not-authorized'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"not-allowed">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_not-allowed'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"not-acceptable">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_not-acceptable'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"jid-malformed">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_jid-malformed'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"item-not-found">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_item-not-found'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"internal-server-error">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_internal-server-error'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"gone">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ decode_error_error_gone(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"forbidden">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ decode_error_error_forbidden(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel,
+ <<"feature-not-implemented">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_feature-not-implemented'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"conflict">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ decode_error_error_conflict(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([{xmlel, <<"bad-request">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">> ->
+ decode_error_error_els(_els, Text,
+ 'decode_error_error_bad-request'(_el));
+ _ -> decode_error_error_els(_els, Text, Reason)
+ end;
+decode_error_error_els([_ | _els], Text, Reason) ->
+ decode_error_error_els(_els, Text, Reason);
+decode_error_error_els([], Text, Reason) ->
+ {Text, Reason}.
+
+decode_error_error_attrs([{<<"by">>, _val} | _attrs],
+ _By, Error_type) ->
+ decode_error_error_attrs(_attrs, _val, Error_type);
+decode_error_error_attrs([{<<"type">>, _val} | _attrs],
+ By, _Error_type) ->
+ decode_error_error_attrs(_attrs, By, _val);
+decode_error_error_attrs([_ | _attrs], By,
+ Error_type) ->
+ decode_error_error_attrs(_attrs, By, Error_type);
+decode_error_error_attrs([], By, Error_type) ->
+ {decode_error_error_by(By),
+ decode_error_error_type(Error_type)}.
+
+'encode_error_error_$reason'(undefined, _acc) -> _acc;
+'encode_error_error_$reason'('unexpected-request' = _r,
+ _acc) ->
+ 'encode_error_error_unexpected-request'(_r, _acc);
+'encode_error_error_$reason'('undefined-condition' = _r,
+ _acc) ->
+ 'encode_error_error_undefined-condition'(_r, _acc);
+'encode_error_error_$reason'('subscription-required' =
+ _r,
+ _acc) ->
+ 'encode_error_error_subscription-required'(_r, _acc);
+'encode_error_error_$reason'('service-unavailable' = _r,
+ _acc) ->
+ 'encode_error_error_service-unavailable'(_r, _acc);
+'encode_error_error_$reason'('resource-constraint' = _r,
+ _acc) ->
+ 'encode_error_error_resource-constraint'(_r, _acc);
+'encode_error_error_$reason'('remote-server-timeout' =
+ _r,
+ _acc) ->
+ 'encode_error_error_remote-server-timeout'(_r, _acc);
+'encode_error_error_$reason'('remote-server-not-found' =
+ _r,
+ _acc) ->
+ 'encode_error_error_remote-server-not-found'(_r, _acc);
+'encode_error_error_$reason'('registration-required' =
+ _r,
+ _acc) ->
+ 'encode_error_error_registration-required'(_r, _acc);
+'encode_error_error_$reason'({redirect, _} = _r,
+ _acc) ->
+ encode_error_error_redirect(_r, _acc);
+'encode_error_error_$reason'('recipient-unavailable' =
+ _r,
+ _acc) ->
+ 'encode_error_error_recipient-unavailable'(_r, _acc);
+'encode_error_error_$reason'('policy-violation' = _r,
+ _acc) ->
+ 'encode_error_error_policy-violation'(_r, _acc);
+'encode_error_error_$reason'('not-authorized' = _r,
+ _acc) ->
+ 'encode_error_error_not-authorized'(_r, _acc);
+'encode_error_error_$reason'('not-allowed' = _r,
+ _acc) ->
+ 'encode_error_error_not-allowed'(_r, _acc);
+'encode_error_error_$reason'('not-acceptable' = _r,
+ _acc) ->
+ 'encode_error_error_not-acceptable'(_r, _acc);
+'encode_error_error_$reason'('jid-malformed' = _r,
+ _acc) ->
+ 'encode_error_error_jid-malformed'(_r, _acc);
+'encode_error_error_$reason'('item-not-found' = _r,
+ _acc) ->
+ 'encode_error_error_item-not-found'(_r, _acc);
+'encode_error_error_$reason'('internal-server-error' =
+ _r,
+ _acc) ->
+ 'encode_error_error_internal-server-error'(_r, _acc);
+'encode_error_error_$reason'({gone, _} = _r, _acc) ->
+ encode_error_error_gone(_r, _acc);
+'encode_error_error_$reason'(forbidden = _r, _acc) ->
+ encode_error_error_forbidden(_r, _acc);
+'encode_error_error_$reason'('feature-not-implemented' =
+ _r,
+ _acc) ->
+ 'encode_error_error_feature-not-implemented'(_r, _acc);
+'encode_error_error_$reason'(conflict = _r, _acc) ->
+ encode_error_error_conflict(_r, _acc);
+'encode_error_error_$reason'('bad-request' = _r,
+ _acc) ->
+ 'encode_error_error_bad-request'(_r, _acc).
+
+encode_error_error(undefined, _acc) -> _acc;
+encode_error_error({error, Error_type, By, Reason,
+ Text},
+ _acc) ->
+ _els = 'encode_error_error_$reason'(Reason,
+ encode_error_error_text(Text, [])),
+ _attrs = encode_error_error_type(Error_type,
+ encode_error_error_by(By, [])),
+ [{xmlel, <<"error">>, _attrs, _els} | _acc].
+
+decode_error_error_type(undefined) ->
+ erlang:error({missing_attr, <<"type">>, <<"error">>,
+ <<>>});
+decode_error_error_type(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [auth, cancel, continue, modify, wait])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"type">>, <<"error">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_error_error_type(_val, _acc) ->
+ [{<<"type">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_error_error_by(undefined) -> undefined;
+decode_error_error_by(_val) -> _val.
+
+encode_error_error_by(undefined, _acc) -> _acc;
+encode_error_error_by(_val, _acc) ->
+ [{<<"by">>, _val} | _acc].
+
+'decode_error_error_unexpected-request'({xmlel, _,
+ _attrs, _els}) ->
+ 'unexpected-request'.
+
+'encode_error_error_unexpected-request'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_unexpected-request'('unexpected-request',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"unexpected-request">>, _attrs, _els}
+ | _acc].
+
+'decode_error_error_undefined-condition'({xmlel, _,
+ _attrs, _els}) ->
+ 'undefined-condition'.
+
+'encode_error_error_undefined-condition'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_undefined-condition'('undefined-condition',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"undefined-condition">>, _attrs, _els}
+ | _acc].
+
+'decode_error_error_subscription-required'({xmlel, _,
+ _attrs, _els}) ->
+ 'subscription-required'.
+
+'encode_error_error_subscription-required'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_subscription-required'('subscription-required',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"subscription-required">>, _attrs, _els}
+ | _acc].
+
+'decode_error_error_service-unavailable'({xmlel, _,
+ _attrs, _els}) ->
+ 'service-unavailable'.
+
+'encode_error_error_service-unavailable'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_service-unavailable'('service-unavailable',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"service-unavailable">>, _attrs, _els}
+ | _acc].
+
+'decode_error_error_resource-constraint'({xmlel, _,
+ _attrs, _els}) ->
+ 'resource-constraint'.
+
+'encode_error_error_resource-constraint'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_resource-constraint'('resource-constraint',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"resource-constraint">>, _attrs, _els}
+ | _acc].
+
+'decode_error_error_remote-server-timeout'({xmlel, _,
+ _attrs, _els}) ->
+ 'remote-server-timeout'.
+
+'encode_error_error_remote-server-timeout'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_remote-server-timeout'('remote-server-timeout',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"remote-server-timeout">>, _attrs, _els}
+ | _acc].
+
+'decode_error_error_remote-server-not-found'({xmlel, _,
+ _attrs, _els}) ->
+ 'remote-server-not-found'.
+
+'encode_error_error_remote-server-not-found'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_remote-server-not-found'('remote-server-not-found',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"remote-server-not-found">>, _attrs, _els}
+ | _acc].
+
+'decode_error_error_registration-required'({xmlel, _,
+ _attrs, _els}) ->
+ 'registration-required'.
+
+'encode_error_error_registration-required'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_registration-required'('registration-required',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"registration-required">>, _attrs, _els}
+ | _acc].
+
+decode_error_error_redirect({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_error_error_redirect_els(_els, <<>>),
+ {redirect, Cdata}.
+
+decode_error_error_redirect_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_error_error_redirect_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_error_error_redirect_els([_ | _els], Cdata) ->
+ decode_error_error_redirect_els(_els, Cdata);
+decode_error_error_redirect_els([], Cdata) ->
+ decode_error_error_redirect_cdata(Cdata).
+
+encode_error_error_redirect(undefined, _acc) -> _acc;
+encode_error_error_redirect({redirect, Cdata}, _acc) ->
+ _els = encode_error_error_redirect_cdata(Cdata, []),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"redirect">>, _attrs, _els} | _acc].
+
+decode_error_error_redirect_cdata(<<>>) -> undefined;
+decode_error_error_redirect_cdata(_val) -> _val.
+
+encode_error_error_redirect_cdata(undefined, _acc) ->
+ _acc;
+encode_error_error_redirect_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+'decode_error_error_recipient-unavailable'({xmlel, _,
+ _attrs, _els}) ->
+ 'recipient-unavailable'.
+
+'encode_error_error_recipient-unavailable'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_recipient-unavailable'('recipient-unavailable',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"recipient-unavailable">>, _attrs, _els}
+ | _acc].
+
+'decode_error_error_policy-violation'({xmlel, _, _attrs,
+ _els}) ->
+ 'policy-violation'.
+
+'encode_error_error_policy-violation'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_policy-violation'('policy-violation',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"policy-violation">>, _attrs, _els} | _acc].
+
+'decode_error_error_not-authorized'({xmlel, _, _attrs,
+ _els}) ->
+ 'not-authorized'.
+
+'encode_error_error_not-authorized'(undefined, _acc) ->
+ _acc;
+'encode_error_error_not-authorized'('not-authorized',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"not-authorized">>, _attrs, _els} | _acc].
+
+'decode_error_error_not-allowed'({xmlel, _, _attrs,
+ _els}) ->
+ 'not-allowed'.
+
+'encode_error_error_not-allowed'(undefined, _acc) ->
+ _acc;
+'encode_error_error_not-allowed'('not-allowed', _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"not-allowed">>, _attrs, _els} | _acc].
+
+'decode_error_error_not-acceptable'({xmlel, _, _attrs,
+ _els}) ->
+ 'not-acceptable'.
+
+'encode_error_error_not-acceptable'(undefined, _acc) ->
+ _acc;
+'encode_error_error_not-acceptable'('not-acceptable',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"not-acceptable">>, _attrs, _els} | _acc].
+
+'decode_error_error_jid-malformed'({xmlel, _, _attrs,
+ _els}) ->
+ 'jid-malformed'.
+
+'encode_error_error_jid-malformed'(undefined, _acc) ->
+ _acc;
+'encode_error_error_jid-malformed'('jid-malformed',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"jid-malformed">>, _attrs, _els} | _acc].
+
+'decode_error_error_item-not-found'({xmlel, _, _attrs,
+ _els}) ->
+ 'item-not-found'.
+
+'encode_error_error_item-not-found'(undefined, _acc) ->
+ _acc;
+'encode_error_error_item-not-found'('item-not-found',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"item-not-found">>, _attrs, _els} | _acc].
+
+'decode_error_error_internal-server-error'({xmlel, _,
+ _attrs, _els}) ->
+ 'internal-server-error'.
+
+'encode_error_error_internal-server-error'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_internal-server-error'('internal-server-error',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"internal-server-error">>, _attrs, _els}
+ | _acc].
+
+decode_error_error_gone({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_error_error_gone_els(_els, <<>>),
+ {gone, Cdata}.
+
+decode_error_error_gone_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_error_error_gone_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_error_error_gone_els([_ | _els], Cdata) ->
+ decode_error_error_gone_els(_els, Cdata);
+decode_error_error_gone_els([], Cdata) ->
+ decode_error_error_gone_cdata(Cdata).
+
+encode_error_error_gone(undefined, _acc) -> _acc;
+encode_error_error_gone({gone, Cdata}, _acc) ->
+ _els = encode_error_error_gone_cdata(Cdata, []),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"gone">>, _attrs, _els} | _acc].
+
+decode_error_error_gone_cdata(<<>>) -> undefined;
+decode_error_error_gone_cdata(_val) -> _val.
+
+encode_error_error_gone_cdata(undefined, _acc) -> _acc;
+encode_error_error_gone_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_error_error_forbidden({xmlel, _, _attrs,
+ _els}) ->
+ forbidden.
+
+encode_error_error_forbidden(undefined, _acc) -> _acc;
+encode_error_error_forbidden(forbidden, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"forbidden">>, _attrs, _els} | _acc].
+
+'decode_error_error_feature-not-implemented'({xmlel, _,
+ _attrs, _els}) ->
+ 'feature-not-implemented'.
+
+'encode_error_error_feature-not-implemented'(undefined,
+ _acc) ->
+ _acc;
+'encode_error_error_feature-not-implemented'('feature-not-implemented',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"feature-not-implemented">>, _attrs, _els}
+ | _acc].
+
+decode_error_error_conflict({xmlel, _, _attrs, _els}) ->
+ conflict.
+
+encode_error_error_conflict(undefined, _acc) -> _acc;
+encode_error_error_conflict(conflict, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"conflict">>, _attrs, _els} | _acc].
+
+'decode_error_error_bad-request'({xmlel, _, _attrs,
+ _els}) ->
+ 'bad-request'.
+
+'encode_error_error_bad-request'(undefined, _acc) ->
+ _acc;
+'encode_error_error_bad-request'('bad-request', _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}],
+ [{xmlel, <<"bad-request">>, _attrs, _els} | _acc].
+
+decode_error_error_text({xmlel, _, _attrs, _els}) ->
+ Text_lang = decode_error_error_text_attrs(_attrs,
+ undefined),
+ Cdata = decode_error_error_text_els(_els, <<>>),
+ {Text_lang, Cdata}.
+
+decode_error_error_text_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_error_error_text_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_error_error_text_els([_ | _els], Cdata) ->
+ decode_error_error_text_els(_els, Cdata);
+decode_error_error_text_els([], Cdata) ->
+ decode_error_error_text_cdata(Cdata).
+
+decode_error_error_text_attrs([{<<"xml:lang">>, _val}
+ | _attrs],
+ _Text_lang) ->
+ decode_error_error_text_attrs(_attrs, _val);
+decode_error_error_text_attrs([_ | _attrs],
+ Text_lang) ->
+ decode_error_error_text_attrs(_attrs, Text_lang);
+decode_error_error_text_attrs([], Text_lang) ->
+ 'decode_error_error_text_xml:lang'(Text_lang).
+
+encode_error_error_text(undefined, _acc) -> _acc;
+encode_error_error_text({Text_lang, Cdata}, _acc) ->
+ _els = encode_error_error_text_cdata(Cdata, []),
+ _attrs = 'encode_error_error_text_xml:lang'(Text_lang,
+ [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-stanzas">>}]),
+ [{xmlel, <<"text">>, _attrs, _els} | _acc].
+
+'decode_error_error_text_xml:lang'(undefined) ->
+ undefined;
+'decode_error_error_text_xml:lang'(_val) -> _val.
+
+'encode_error_error_text_xml:lang'(undefined, _acc) ->
+ _acc;
+'encode_error_error_text_xml:lang'(_val, _acc) ->
+ [{<<"xml:lang">>, _val} | _acc].
+
+decode_error_error_text_cdata(<<>>) -> undefined;
+decode_error_error_text_cdata(_val) -> _val.
+
+encode_error_error_text_cdata(undefined, _acc) -> _acc;
+encode_error_error_text_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_bind_bind({xmlel, _, _attrs, _els}) ->
+ {Resource, Jid} = decode_bind_bind_els(_els, undefined,
+ undefined),
+ {bind, Jid, Resource}.
+
+decode_bind_bind_els([{xmlel, <<"resource">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Resource, Jid) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_bind_bind_els(_els,
+ decode_bind_bind_resource(_el), Jid);
+ _ -> decode_bind_bind_els(_els, Resource, Jid)
+ end;
+decode_bind_bind_els([{xmlel, <<"jid">>, _attrs, _} =
+ _el
+ | _els],
+ Resource, Jid) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_bind_bind_els(_els, Resource,
+ decode_bind_bind_jid(_el));
+ _ -> decode_bind_bind_els(_els, Resource, Jid)
+ end;
+decode_bind_bind_els([_ | _els], Resource, Jid) ->
+ decode_bind_bind_els(_els, Resource, Jid);
+decode_bind_bind_els([], Resource, Jid) ->
+ {Resource, Jid}.
+
+encode_bind_bind(undefined, _acc) -> _acc;
+encode_bind_bind({bind, Jid, Resource}, _acc) ->
+ _els = encode_bind_bind_jid(Jid,
+ encode_bind_bind_resource(Resource, [])),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-bind">>}],
+ [{xmlel, <<"bind">>, _attrs, _els} | _acc].
+
+decode_bind_bind_resource({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_bind_bind_resource_els(_els, <<>>),
+ Cdata.
+
+decode_bind_bind_resource_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_bind_bind_resource_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_bind_bind_resource_els([_ | _els], Cdata) ->
+ decode_bind_bind_resource_els(_els, Cdata);
+decode_bind_bind_resource_els([], Cdata) ->
+ decode_bind_bind_resource_cdata(Cdata).
+
+encode_bind_bind_resource(undefined, _acc) -> _acc;
+encode_bind_bind_resource(Cdata, _acc) ->
+ _els = encode_bind_bind_resource_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"resource">>, _attrs, _els} | _acc].
+
+decode_bind_bind_resource_cdata(<<>>) -> undefined;
+decode_bind_bind_resource_cdata(_val) ->
+ case catch resourceprep(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"resource">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_bind_bind_resource_cdata(undefined, _acc) ->
+ _acc;
+encode_bind_bind_resource_cdata(_val, _acc) ->
+ [{xmlcdata, resourceprep(_val)} | _acc].
+
+decode_bind_bind_jid({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_bind_bind_jid_els(_els, <<>>), Cdata.
+
+decode_bind_bind_jid_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_bind_bind_jid_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_bind_bind_jid_els([_ | _els], Cdata) ->
+ decode_bind_bind_jid_els(_els, Cdata);
+decode_bind_bind_jid_els([], Cdata) ->
+ decode_bind_bind_jid_cdata(Cdata).
+
+encode_bind_bind_jid(undefined, _acc) -> _acc;
+encode_bind_bind_jid(Cdata, _acc) ->
+ _els = encode_bind_bind_jid_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"jid">>, _attrs, _els} | _acc].
+
+decode_bind_bind_jid_cdata(<<>>) -> undefined;
+decode_bind_bind_jid_cdata(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"jid">>, <<>>});
+ _res -> _res
+ end.
+
+encode_bind_bind_jid_cdata(undefined, _acc) -> _acc;
+encode_bind_bind_jid_cdata(_val, _acc) ->
+ [{xmlcdata, enc_jid(_val)} | _acc].
+
+decode_sasl_auth_auth({xmlel, _, _attrs, _els}) ->
+ Mechanism = decode_sasl_auth_auth_attrs(_attrs,
+ undefined),
+ Cdata = decode_sasl_auth_auth_els(_els, <<>>),
+ {sasl_auth, Mechanism, Cdata}.
+
+decode_sasl_auth_auth_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_sasl_auth_auth_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_sasl_auth_auth_els([_ | _els], Cdata) ->
+ decode_sasl_auth_auth_els(_els, Cdata);
+decode_sasl_auth_auth_els([], Cdata) ->
+ decode_sasl_auth_auth_cdata(Cdata).
+
+decode_sasl_auth_auth_attrs([{<<"mechanism">>, _val}
+ | _attrs],
+ _Mechanism) ->
+ decode_sasl_auth_auth_attrs(_attrs, _val);
+decode_sasl_auth_auth_attrs([_ | _attrs], Mechanism) ->
+ decode_sasl_auth_auth_attrs(_attrs, Mechanism);
+decode_sasl_auth_auth_attrs([], Mechanism) ->
+ decode_sasl_auth_auth_mechanism(Mechanism).
+
+encode_sasl_auth_auth(undefined, _acc) -> _acc;
+encode_sasl_auth_auth({sasl_auth, Mechanism, Cdata},
+ _acc) ->
+ _els = encode_sasl_auth_auth_cdata(Cdata, []),
+ _attrs = encode_sasl_auth_auth_mechanism(Mechanism,
+ [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>}]),
+ [{xmlel, <<"auth">>, _attrs, _els} | _acc].
+
+decode_sasl_auth_auth_mechanism(undefined) ->
+ erlang:error({missing_attr, <<"mechanism">>, <<"auth">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>});
+decode_sasl_auth_auth_mechanism(_val) -> _val.
+
+encode_sasl_auth_auth_mechanism(_val, _acc) ->
+ [{<<"mechanism">>, _val} | _acc].
+
+decode_sasl_auth_auth_cdata(<<>>) -> undefined;
+decode_sasl_auth_auth_cdata(_val) ->
+ case catch base64:decode(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"auth">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>});
+ _res -> _res
+ end.
+
+encode_sasl_auth_auth_cdata(undefined, _acc) -> _acc;
+encode_sasl_auth_auth_cdata(_val, _acc) ->
+ [{xmlcdata, base64:encode(_val)} | _acc].
+
+decode_sasl_abort_abort({xmlel, _, _attrs, _els}) ->
+ {sasl_abort}.
+
+encode_sasl_abort_abort(undefined, _acc) -> _acc;
+encode_sasl_abort_abort({sasl_abort}, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>}],
+ [{xmlel, <<"abort">>, _attrs, _els} | _acc].
+
+decode_sasl_challenge_challenge({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_sasl_challenge_challenge_els(_els, <<>>),
+ {sasl_challenge, Cdata}.
+
+decode_sasl_challenge_challenge_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_sasl_challenge_challenge_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_sasl_challenge_challenge_els([_ | _els],
+ Cdata) ->
+ decode_sasl_challenge_challenge_els(_els, Cdata);
+decode_sasl_challenge_challenge_els([], Cdata) ->
+ decode_sasl_challenge_challenge_cdata(Cdata).
+
+encode_sasl_challenge_challenge(undefined, _acc) ->
+ _acc;
+encode_sasl_challenge_challenge({sasl_challenge, Cdata},
+ _acc) ->
+ _els = encode_sasl_challenge_challenge_cdata(Cdata, []),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>}],
+ [{xmlel, <<"challenge">>, _attrs, _els} | _acc].
+
+decode_sasl_challenge_challenge_cdata(<<>>) ->
+ undefined;
+decode_sasl_challenge_challenge_cdata(_val) ->
+ case catch base64:decode(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"challenge">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>});
+ _res -> _res
+ end.
+
+encode_sasl_challenge_challenge_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_sasl_challenge_challenge_cdata(_val, _acc) ->
+ [{xmlcdata, base64:encode(_val)} | _acc].
+
+decode_sasl_response_response({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_sasl_response_response_els(_els, <<>>),
+ {sasl_response, Cdata}.
+
+decode_sasl_response_response_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_sasl_response_response_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_sasl_response_response_els([_ | _els], Cdata) ->
+ decode_sasl_response_response_els(_els, Cdata);
+decode_sasl_response_response_els([], Cdata) ->
+ decode_sasl_response_response_cdata(Cdata).
+
+encode_sasl_response_response(undefined, _acc) -> _acc;
+encode_sasl_response_response({sasl_response, Cdata},
+ _acc) ->
+ _els = encode_sasl_response_response_cdata(Cdata, []),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>}],
+ [{xmlel, <<"response">>, _attrs, _els} | _acc].
+
+decode_sasl_response_response_cdata(<<>>) -> undefined;
+decode_sasl_response_response_cdata(_val) ->
+ case catch base64:decode(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"response">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>});
+ _res -> _res
+ end.
+
+encode_sasl_response_response_cdata(undefined, _acc) ->
+ _acc;
+encode_sasl_response_response_cdata(_val, _acc) ->
+ [{xmlcdata, base64:encode(_val)} | _acc].
+
+decode_sasl_success_success({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_sasl_success_success_els(_els, <<>>),
+ {sasl_success, Cdata}.
+
+decode_sasl_success_success_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_sasl_success_success_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_sasl_success_success_els([_ | _els], Cdata) ->
+ decode_sasl_success_success_els(_els, Cdata);
+decode_sasl_success_success_els([], Cdata) ->
+ decode_sasl_success_success_cdata(Cdata).
+
+encode_sasl_success_success(undefined, _acc) -> _acc;
+encode_sasl_success_success({sasl_success, Cdata},
+ _acc) ->
+ _els = encode_sasl_success_success_cdata(Cdata, []),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>}],
+ [{xmlel, <<"success">>, _attrs, _els} | _acc].
+
+decode_sasl_success_success_cdata(<<>>) -> undefined;
+decode_sasl_success_success_cdata(_val) ->
+ case catch base64:decode(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"success">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>});
+ _res -> _res
+ end.
+
+encode_sasl_success_success_cdata(undefined, _acc) ->
+ _acc;
+encode_sasl_success_success_cdata(_val, _acc) ->
+ [{xmlcdata, base64:encode(_val)} | _acc].
+
+decode_sasl_failure_failure({xmlel, _, _attrs, _els}) ->
+ {Text, Reason} = decode_sasl_failure_failure_els(_els,
+ undefined, undefined),
+ {sasl_failure, Reason, Text}.
+
+decode_sasl_failure_failure_els([{xmlel, <<"text">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els,
+ decode_sasl_failure_failure_text(_el),
+ Reason);
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"temporary-auth-failure">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_temporary-auth-failure'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"not-authorized">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_not-authorized'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"mechanism-too-weak">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_mechanism-too-weak'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"malformed-request">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_malformed-request'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"invalid-mechanism">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_invalid-mechanism'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"invalid-authzid">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_invalid-authzid'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"incorrect-encoding">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_incorrect-encoding'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"encryption-required">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_encryption-required'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"credentials-expired">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_credentials-expired'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel,
+ <<"account-disabled">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ 'decode_sasl_failure_failure_account-disabled'(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([{xmlel, <<"aborted">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_failure_failure_els(_els, Text,
+ decode_sasl_failure_failure_aborted(_el));
+ _ -> decode_sasl_failure_failure_els(_els, Text, Reason)
+ end;
+decode_sasl_failure_failure_els([_ | _els], Text,
+ Reason) ->
+ decode_sasl_failure_failure_els(_els, Text, Reason);
+decode_sasl_failure_failure_els([], Text, Reason) ->
+ {Text, Reason}.
+
+'encode_sasl_failure_failure_$reason'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_$reason'('temporary-auth-failure' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_temporary-auth-failure'(_r,
+ _acc);
+'encode_sasl_failure_failure_$reason'('not-authorized' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_not-authorized'(_r, _acc);
+'encode_sasl_failure_failure_$reason'('mechanism-too-weak' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_mechanism-too-weak'(_r,
+ _acc);
+'encode_sasl_failure_failure_$reason'('malformed-request' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_malformed-request'(_r,
+ _acc);
+'encode_sasl_failure_failure_$reason'('invalid-mechanism' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_invalid-mechanism'(_r,
+ _acc);
+'encode_sasl_failure_failure_$reason'('invalid-authzid' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_invalid-authzid'(_r, _acc);
+'encode_sasl_failure_failure_$reason'('incorrect-encoding' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_incorrect-encoding'(_r,
+ _acc);
+'encode_sasl_failure_failure_$reason'('encryption-required' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_encryption-required'(_r,
+ _acc);
+'encode_sasl_failure_failure_$reason'('credentials-expired' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_credentials-expired'(_r,
+ _acc);
+'encode_sasl_failure_failure_$reason'('account-disabled' =
+ _r,
+ _acc) ->
+ 'encode_sasl_failure_failure_account-disabled'(_r,
+ _acc);
+'encode_sasl_failure_failure_$reason'(aborted = _r,
+ _acc) ->
+ encode_sasl_failure_failure_aborted(_r, _acc).
+
+encode_sasl_failure_failure(undefined, _acc) -> _acc;
+encode_sasl_failure_failure({sasl_failure, Reason,
+ Text},
+ _acc) ->
+ _els = 'encode_sasl_failure_failure_$reason'(Reason,
+ encode_sasl_failure_failure_text(Text,
+ [])),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>}],
+ [{xmlel, <<"failure">>, _attrs, _els} | _acc].
+
+'decode_sasl_failure_failure_temporary-auth-failure'({xmlel,
+ _, _attrs, _els}) ->
+ 'temporary-auth-failure'.
+
+'encode_sasl_failure_failure_temporary-auth-failure'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_temporary-auth-failure'('temporary-auth-failure',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"temporary-auth-failure">>, _attrs, _els}
+ | _acc].
+
+'decode_sasl_failure_failure_not-authorized'({xmlel, _,
+ _attrs, _els}) ->
+ 'not-authorized'.
+
+'encode_sasl_failure_failure_not-authorized'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_not-authorized'('not-authorized',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"not-authorized">>, _attrs, _els} | _acc].
+
+'decode_sasl_failure_failure_mechanism-too-weak'({xmlel,
+ _, _attrs, _els}) ->
+ 'mechanism-too-weak'.
+
+'encode_sasl_failure_failure_mechanism-too-weak'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_mechanism-too-weak'('mechanism-too-weak',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"mechanism-too-weak">>, _attrs, _els}
+ | _acc].
+
+'decode_sasl_failure_failure_malformed-request'({xmlel,
+ _, _attrs, _els}) ->
+ 'malformed-request'.
+
+'encode_sasl_failure_failure_malformed-request'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_malformed-request'('malformed-request',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"malformed-request">>, _attrs, _els} | _acc].
+
+'decode_sasl_failure_failure_invalid-mechanism'({xmlel,
+ _, _attrs, _els}) ->
+ 'invalid-mechanism'.
+
+'encode_sasl_failure_failure_invalid-mechanism'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_invalid-mechanism'('invalid-mechanism',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"invalid-mechanism">>, _attrs, _els} | _acc].
+
+'decode_sasl_failure_failure_invalid-authzid'({xmlel, _,
+ _attrs, _els}) ->
+ 'invalid-authzid'.
+
+'encode_sasl_failure_failure_invalid-authzid'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_invalid-authzid'('invalid-authzid',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"invalid-authzid">>, _attrs, _els} | _acc].
+
+'decode_sasl_failure_failure_incorrect-encoding'({xmlel,
+ _, _attrs, _els}) ->
+ 'incorrect-encoding'.
+
+'encode_sasl_failure_failure_incorrect-encoding'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_incorrect-encoding'('incorrect-encoding',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"incorrect-encoding">>, _attrs, _els}
+ | _acc].
+
+'decode_sasl_failure_failure_encryption-required'({xmlel,
+ _, _attrs, _els}) ->
+ 'encryption-required'.
+
+'encode_sasl_failure_failure_encryption-required'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_encryption-required'('encryption-required',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"encryption-required">>, _attrs, _els}
+ | _acc].
+
+'decode_sasl_failure_failure_credentials-expired'({xmlel,
+ _, _attrs, _els}) ->
+ 'credentials-expired'.
+
+'encode_sasl_failure_failure_credentials-expired'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_credentials-expired'('credentials-expired',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"credentials-expired">>, _attrs, _els}
+ | _acc].
+
+'decode_sasl_failure_failure_account-disabled'({xmlel,
+ _, _attrs, _els}) ->
+ 'account-disabled'.
+
+'encode_sasl_failure_failure_account-disabled'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_account-disabled'('account-disabled',
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"account-disabled">>, _attrs, _els} | _acc].
+
+decode_sasl_failure_failure_aborted({xmlel, _, _attrs,
+ _els}) ->
+ aborted.
+
+encode_sasl_failure_failure_aborted(undefined, _acc) ->
+ _acc;
+encode_sasl_failure_failure_aborted(aborted, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"aborted">>, _attrs, _els} | _acc].
+
+decode_sasl_failure_failure_text({xmlel, _, _attrs,
+ _els}) ->
+ Text_lang =
+ decode_sasl_failure_failure_text_attrs(_attrs,
+ undefined),
+ Cdata = decode_sasl_failure_failure_text_els(_els,
+ <<>>),
+ {Text_lang, Cdata}.
+
+decode_sasl_failure_failure_text_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_sasl_failure_failure_text_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_sasl_failure_failure_text_els([_ | _els],
+ Cdata) ->
+ decode_sasl_failure_failure_text_els(_els, Cdata);
+decode_sasl_failure_failure_text_els([], Cdata) ->
+ decode_sasl_failure_failure_text_cdata(Cdata).
+
+decode_sasl_failure_failure_text_attrs([{<<"xml:lang">>,
+ _val}
+ | _attrs],
+ _Text_lang) ->
+ decode_sasl_failure_failure_text_attrs(_attrs, _val);
+decode_sasl_failure_failure_text_attrs([_ | _attrs],
+ Text_lang) ->
+ decode_sasl_failure_failure_text_attrs(_attrs,
+ Text_lang);
+decode_sasl_failure_failure_text_attrs([], Text_lang) ->
+ 'decode_sasl_failure_failure_text_xml:lang'(Text_lang).
+
+encode_sasl_failure_failure_text(undefined, _acc) ->
+ _acc;
+encode_sasl_failure_failure_text({Text_lang, Cdata},
+ _acc) ->
+ _els = encode_sasl_failure_failure_text_cdata(Cdata,
+ []),
+ _attrs =
+ 'encode_sasl_failure_failure_text_xml:lang'(Text_lang,
+ []),
+ [{xmlel, <<"text">>, _attrs, _els} | _acc].
+
+'decode_sasl_failure_failure_text_xml:lang'(undefined) ->
+ undefined;
+'decode_sasl_failure_failure_text_xml:lang'(_val) ->
+ _val.
+
+'encode_sasl_failure_failure_text_xml:lang'(undefined,
+ _acc) ->
+ _acc;
+'encode_sasl_failure_failure_text_xml:lang'(_val,
+ _acc) ->
+ [{<<"xml:lang">>, _val} | _acc].
+
+decode_sasl_failure_failure_text_cdata(<<>>) ->
+ undefined;
+decode_sasl_failure_failure_text_cdata(_val) -> _val.
+
+encode_sasl_failure_failure_text_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_sasl_failure_failure_text_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_sasl_mechanism_mechanism({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_sasl_mechanism_mechanism_els(_els, <<>>),
+ Cdata.
+
+decode_sasl_mechanism_mechanism_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_sasl_mechanism_mechanism_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_sasl_mechanism_mechanism_els([_ | _els],
+ Cdata) ->
+ decode_sasl_mechanism_mechanism_els(_els, Cdata);
+decode_sasl_mechanism_mechanism_els([], Cdata) ->
+ decode_sasl_mechanism_mechanism_cdata(Cdata).
+
+encode_sasl_mechanism_mechanism([], _acc) -> _acc;
+encode_sasl_mechanism_mechanism([Cdata | _tail],
+ _acc) ->
+ _els = encode_sasl_mechanism_mechanism_cdata(Cdata, []),
+ _attrs = [],
+ encode_sasl_mechanism_mechanism(_tail,
+ [{xmlel, <<"mechanism">>, _attrs, _els}
+ | _acc]).
+
+decode_sasl_mechanism_mechanism_cdata(<<>>) ->
+ undefined;
+decode_sasl_mechanism_mechanism_cdata(_val) -> _val.
+
+encode_sasl_mechanism_mechanism_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_sasl_mechanism_mechanism_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_sasl_mechanisms_mechanisms({xmlel, _, _attrs,
+ _els}) ->
+ Mechanism = decode_sasl_mechanisms_mechanisms_els(_els,
+ []),
+ {sasl_mechanisms, Mechanism}.
+
+decode_sasl_mechanisms_mechanisms_els([{xmlel,
+ <<"mechanism">>, _attrs, _} =
+ _el
+ | _els],
+ Mechanism) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_sasl_mechanisms_mechanisms_els(_els,
+ [decode_sasl_mechanism_mechanism(_el)
+ | Mechanism]);
+ _ ->
+ decode_sasl_mechanisms_mechanisms_els(_els, Mechanism)
+ end;
+decode_sasl_mechanisms_mechanisms_els([_ | _els],
+ Mechanism) ->
+ decode_sasl_mechanisms_mechanisms_els(_els, Mechanism);
+decode_sasl_mechanisms_mechanisms_els([], Mechanism) ->
+ xml_gen:reverse(Mechanism, 1, infinity).
+
+encode_sasl_mechanisms_mechanisms(undefined, _acc) ->
+ _acc;
+encode_sasl_mechanisms_mechanisms({sasl_mechanisms,
+ Mechanism},
+ _acc) ->
+ _els = encode_sasl_mechanism_mechanism(Mechanism, []),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-sasl">>}],
+ [{xmlel, <<"mechanisms">>, _attrs, _els} | _acc].
+
+decode_starttls_starttls({xmlel, _, _attrs, _els}) ->
+ Required = decode_starttls_starttls_els(_els, false),
+ {starttls, Required}.
+
+decode_starttls_starttls_els([{xmlel, <<"required">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Required) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_starttls_starttls_els(_els,
+ decode_starttls_starttls_required(_el));
+ _ -> decode_starttls_starttls_els(_els, Required)
+ end;
+decode_starttls_starttls_els([_ | _els], Required) ->
+ decode_starttls_starttls_els(_els, Required);
+decode_starttls_starttls_els([], Required) -> Required.
+
+encode_starttls_starttls(undefined, _acc) -> _acc;
+encode_starttls_starttls({starttls, Required}, _acc) ->
+ _els = encode_starttls_starttls_required(Required, []),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-tls">>}],
+ [{xmlel, <<"starttls">>, _attrs, _els} | _acc].
+
+decode_starttls_starttls_required({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_starttls_starttls_required(false, _acc) -> _acc;
+encode_starttls_starttls_required(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"required">>, _attrs, _els} | _acc].
+
+decode_starttls_proceed_proceed({xmlel, _, _attrs,
+ _els}) ->
+ {starttls_proceed}.
+
+encode_starttls_proceed_proceed(undefined, _acc) ->
+ _acc;
+encode_starttls_proceed_proceed({starttls_proceed},
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-tls">>}],
+ [{xmlel, <<"proceed">>, _attrs, _els} | _acc].
+
+decode_starttls_failure_failure({xmlel, _, _attrs,
+ _els}) ->
+ {starttls_failure}.
+
+encode_starttls_failure_failure(undefined, _acc) ->
+ _acc;
+encode_starttls_failure_failure({starttls_failure},
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-tls">>}],
+ [{xmlel, <<"failure">>, _attrs, _els} | _acc].
+
+'decode_stream_features_stream:features'({xmlel, _,
+ _attrs, _els}) ->
+ __Els =
+ 'decode_stream_features_stream:features_els'(_els, []),
+ {stream_features, __Els}.
+
+'decode_stream_features_stream:features_els'([{xmlel, _,
+ _, _} =
+ _el
+ | _els],
+ __Els) ->
+ 'decode_stream_features_stream:features_els'(_els,
+ [decode(_el) | __Els]);
+'decode_stream_features_stream:features_els'([_ | _els],
+ __Els) ->
+ 'decode_stream_features_stream:features_els'(_els,
+ __Els);
+'decode_stream_features_stream:features_els'([],
+ __Els) ->
+ lists:reverse(__Els).
+
+'encode_stream_features_stream:features'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_features_stream:features'({stream_features,
+ __Els},
+ _acc) ->
+ _els = [encode(_subel) || _subel <- __Els] ++ [],
+ _attrs = [],
+ [{xmlel, <<"stream:features">>, _attrs, _els} | _acc].
+
+decode_p1_push_push({xmlel, _, _attrs, _els}) ->
+ {p1_push}.
+
+encode_p1_push_push(undefined, _acc) -> _acc;
+encode_p1_push_push({p1_push}, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>, <<"p1:push">>}],
+ [{xmlel, <<"push">>, _attrs, _els} | _acc].
+
+decode_p1_rebind_rebind({xmlel, _, _attrs, _els}) ->
+ {p1_rebind}.
+
+encode_p1_rebind_rebind(undefined, _acc) -> _acc;
+encode_p1_rebind_rebind({p1_rebind}, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>, <<"p1:rebind">>}],
+ [{xmlel, <<"rebind">>, _attrs, _els} | _acc].
+
+decode_p1_ack_ack({xmlel, _, _attrs, _els}) -> {p1_ack}.
+
+encode_p1_ack_ack(undefined, _acc) -> _acc;
+encode_p1_ack_ack({p1_ack}, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>, <<"p1:ack">>}],
+ [{xmlel, <<"ack">>, _attrs, _els} | _acc].
+
+decode_caps_c({xmlel, _, _attrs, _els}) ->
+ {Ver, Node, Hash} = decode_caps_c_attrs(_attrs,
+ undefined, undefined, undefined),
+ {caps, Hash, Node, Ver}.
+
+decode_caps_c_attrs([{<<"ver">>, _val} | _attrs], _Ver,
+ Node, Hash) ->
+ decode_caps_c_attrs(_attrs, _val, Node, Hash);
+decode_caps_c_attrs([{<<"node">>, _val} | _attrs], Ver,
+ _Node, Hash) ->
+ decode_caps_c_attrs(_attrs, Ver, _val, Hash);
+decode_caps_c_attrs([{<<"hash">>, _val} | _attrs], Ver,
+ Node, _Hash) ->
+ decode_caps_c_attrs(_attrs, Ver, Node, _val);
+decode_caps_c_attrs([_ | _attrs], Ver, Node, Hash) ->
+ decode_caps_c_attrs(_attrs, Ver, Node, Hash);
+decode_caps_c_attrs([], Ver, Node, Hash) ->
+ {decode_caps_c_ver(Ver), decode_caps_c_node(Node),
+ decode_caps_c_hash(Hash)}.
+
+encode_caps_c(undefined, _acc) -> _acc;
+encode_caps_c({caps, Hash, Node, Ver}, _acc) ->
+ _els = [],
+ _attrs = encode_caps_c_hash(Hash,
+ encode_caps_c_node(Node,
+ encode_caps_c_ver(Ver,
+ [{<<"xmlns">>,
+ <<"http://jabber.org/protocol/caps">>}]))),
+ [{xmlel, <<"c">>, _attrs, _els} | _acc].
+
+decode_caps_c_hash(undefined) -> undefined;
+decode_caps_c_hash(_val) -> _val.
+
+encode_caps_c_hash(undefined, _acc) -> _acc;
+encode_caps_c_hash(_val, _acc) ->
+ [{<<"hash">>, _val} | _acc].
+
+decode_caps_c_node(undefined) -> undefined;
+decode_caps_c_node(_val) -> _val.
+
+encode_caps_c_node(undefined, _acc) -> _acc;
+encode_caps_c_node(_val, _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_caps_c_ver(undefined) -> undefined;
+decode_caps_c_ver(_val) ->
+ case catch base64:decode(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"ver">>, <<"c">>,
+ <<"http://jabber.org/protocol/caps">>});
+ _res -> _res
+ end.
+
+encode_caps_c_ver(undefined, _acc) -> _acc;
+encode_caps_c_ver(_val, _acc) ->
+ [{<<"ver">>, base64:encode(_val)} | _acc].
+
+decode_register_register({xmlel, _, _attrs, _els}) ->
+ {register}.
+
+encode_register_register(undefined, _acc) -> _acc;
+encode_register_register({register}, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"http://jabber.org/features/iq-register">>}],
+ [{xmlel, <<"register">>, _attrs, _els} | _acc].
+
+decode_session_session({xmlel, _, _attrs, _els}) ->
+ {session}.
+
+encode_session_session(undefined, _acc) -> _acc;
+encode_session_session({session}, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-session">>}],
+ [{xmlel, <<"session">>, _attrs, _els} | _acc].
+
+decode_ping_ping({xmlel, _, _attrs, _els}) -> {ping}.
+
+encode_ping_ping(undefined, _acc) -> _acc;
+encode_ping_ping({ping}, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>, <<"urn:xmpp:ping">>}],
+ [{xmlel, <<"ping">>, _attrs, _els} | _acc].
+
+decode_time_time({xmlel, _, _attrs, _els}) ->
+ {Utc, Tzo} = decode_time_time_els(_els, undefined,
+ undefined),
+ {time, Tzo, Utc}.
+
+decode_time_time_els([{xmlel, <<"utc">>, _attrs, _} =
+ _el
+ | _els],
+ Utc, Tzo) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_time_time_els(_els, decode_time_time_utc(_el),
+ Tzo);
+ _ -> decode_time_time_els(_els, Utc, Tzo)
+ end;
+decode_time_time_els([{xmlel, <<"tzo">>, _attrs, _} =
+ _el
+ | _els],
+ Utc, Tzo) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_time_time_els(_els, Utc,
+ decode_time_time_tzo(_el));
+ _ -> decode_time_time_els(_els, Utc, Tzo)
+ end;
+decode_time_time_els([_ | _els], Utc, Tzo) ->
+ decode_time_time_els(_els, Utc, Tzo);
+decode_time_time_els([], Utc, Tzo) -> {Utc, Tzo}.
+
+encode_time_time(undefined, _acc) -> _acc;
+encode_time_time({time, Tzo, Utc}, _acc) ->
+ _els = encode_time_time_tzo(Tzo,
+ encode_time_time_utc(Utc, [])),
+ _attrs = [{<<"xmlns">>, <<"urn:xmpp:time">>}],
+ [{xmlel, <<"time">>, _attrs, _els} | _acc].
+
+decode_time_time_utc({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_time_time_utc_els(_els, <<>>), Cdata.
+
+decode_time_time_utc_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_time_time_utc_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_time_time_utc_els([_ | _els], Cdata) ->
+ decode_time_time_utc_els(_els, Cdata);
+decode_time_time_utc_els([], Cdata) ->
+ decode_time_time_utc_cdata(Cdata).
+
+encode_time_time_utc(undefined, _acc) -> _acc;
+encode_time_time_utc(Cdata, _acc) ->
+ _els = encode_time_time_utc_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"utc">>, _attrs, _els} | _acc].
+
+decode_time_time_utc_cdata(<<>>) -> undefined;
+decode_time_time_utc_cdata(_val) ->
+ case catch dec_utc(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"utc">>, <<>>});
+ _res -> _res
+ end.
+
+encode_time_time_utc_cdata(undefined, _acc) -> _acc;
+encode_time_time_utc_cdata(_val, _acc) ->
+ [{xmlcdata, enc_utc(_val)} | _acc].
+
+decode_time_time_tzo({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_time_time_tzo_els(_els, <<>>), Cdata.
+
+decode_time_time_tzo_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_time_time_tzo_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_time_time_tzo_els([_ | _els], Cdata) ->
+ decode_time_time_tzo_els(_els, Cdata);
+decode_time_time_tzo_els([], Cdata) ->
+ decode_time_time_tzo_cdata(Cdata).
+
+encode_time_time_tzo(undefined, _acc) -> _acc;
+encode_time_time_tzo(Cdata, _acc) ->
+ _els = encode_time_time_tzo_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"tzo">>, _attrs, _els} | _acc].
+
+decode_time_time_tzo_cdata(<<>>) -> undefined;
+decode_time_time_tzo_cdata(_val) ->
+ case catch dec_tzo(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"tzo">>, <<>>});
+ _res -> _res
+ end.
+
+encode_time_time_tzo_cdata(undefined, _acc) -> _acc;
+encode_time_time_tzo_cdata(_val, _acc) ->
+ [{xmlcdata, enc_tzo(_val)} | _acc].
+
+'decode_stream_error_stream:error'({xmlel, _, _attrs,
+ _els}) ->
+ {Text, Reason} =
+ 'decode_stream_error_stream:error_els'(_els, undefined,
+ undefined),
+ {stream_error, Reason, Text}.
+
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"text">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els,
+ 'decode_stream_error_stream:error_text'(_el),
+ Reason);
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"unsupported-version">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_unsupported-version'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"unsupported-stanza-type">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_unsupported-stanza-type'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"unsupported-encoding">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_unsupported-encoding'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"undefined-condition">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_undefined-condition'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"system-shutdown">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_system-shutdown'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"see-other-host">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_see-other-host'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"restricted-xml">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_restricted-xml'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"resource-constraint">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_resource-constraint'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"reset">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_reset'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"remote-connection-failed">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_remote-connection-failed'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"policy-violation">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_policy-violation'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"not-well-formed">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_not-well-formed'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"not-authorized">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_not-authorized'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"invalid-xml">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_invalid-xml'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"invalid-namespace">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_invalid-namespace'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"invalid-id">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_invalid-id'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"invalid-from">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_invalid-from'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"internal-server-error">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_internal-server-error'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"improper-addressing">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_improper-addressing'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"host-unknown">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_host-unknown'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"host-gone">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_host-gone'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"connection-timeout">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_connection-timeout'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"conflict">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_conflict'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"bad-namespace-prefix">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_bad-namespace-prefix'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([{xmlel,
+ <<"bad-format">>, _attrs, _} =
+ _el
+ | _els],
+ Text, Reason) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<"urn:ietf:params:xml:ns:xmpp-streams">> ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ 'decode_stream_error_stream:error_bad-format'(_el));
+ _ ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason)
+ end;
+'decode_stream_error_stream:error_els'([_ | _els], Text,
+ Reason) ->
+ 'decode_stream_error_stream:error_els'(_els, Text,
+ Reason);
+'decode_stream_error_stream:error_els'([], Text,
+ Reason) ->
+ {Text, Reason}.
+
+'encode_stream_error_stream:error_$reason'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_$reason'('unsupported-version' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_unsupported-version'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('unsupported-stanza-type' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_unsupported-stanza-type'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('unsupported-encoding' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_unsupported-encoding'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('undefined-condition' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_undefined-condition'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('system-shutdown' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_system-shutdown'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'({'see-other-host',
+ _} =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_see-other-host'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('restricted-xml' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_restricted-xml'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('resource-constraint' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_resource-constraint'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'(reset = _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_reset'(_r, _acc);
+'encode_stream_error_stream:error_$reason'('remote-connection-failed' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_remote-connection-failed'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('policy-violation' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_policy-violation'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('not-well-formed' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_not-well-formed'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('not-authorized' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_not-authorized'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('invalid-xml' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_invalid-xml'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('invalid-namespace' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_invalid-namespace'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('invalid-id' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_invalid-id'(_r, _acc);
+'encode_stream_error_stream:error_$reason'('invalid-from' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_invalid-from'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('internal-server-error' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_internal-server-error'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('improper-addressing' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_improper-addressing'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('host-unknown' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_host-unknown'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('host-gone' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_host-gone'(_r, _acc);
+'encode_stream_error_stream:error_$reason'('connection-timeout' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_connection-timeout'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'(conflict =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_conflict'(_r, _acc);
+'encode_stream_error_stream:error_$reason'('bad-namespace-prefix' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_bad-namespace-prefix'(_r,
+ _acc);
+'encode_stream_error_stream:error_$reason'('bad-format' =
+ _r,
+ _acc) ->
+ 'encode_stream_error_stream:error_bad-format'(_r, _acc).
+
+'encode_stream_error_stream:error'(undefined, _acc) ->
+ _acc;
+'encode_stream_error_stream:error'({stream_error,
+ Reason, Text},
+ _acc) ->
+ _els =
+ 'encode_stream_error_stream:error_$reason'(Reason,
+ 'encode_stream_error_stream:error_text'(Text,
+ [])),
+ _attrs = [],
+ [{xmlel, <<"stream:error">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_unsupported-version'({xmlel,
+ _, _attrs, _els}) ->
+ 'unsupported-version'.
+
+'encode_stream_error_stream:error_unsupported-version'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_unsupported-version'('unsupported-version',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"unsupported-version">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_unsupported-stanza-type'({xmlel,
+ _, _attrs, _els}) ->
+ 'unsupported-stanza-type'.
+
+'encode_stream_error_stream:error_unsupported-stanza-type'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_unsupported-stanza-type'('unsupported-stanza-type',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"unsupported-stanza-type">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_unsupported-encoding'({xmlel,
+ _, _attrs, _els}) ->
+ 'unsupported-encoding'.
+
+'encode_stream_error_stream:error_unsupported-encoding'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_unsupported-encoding'('unsupported-encoding',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"unsupported-encoding">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_undefined-condition'({xmlel,
+ _, _attrs, _els}) ->
+ 'undefined-condition'.
+
+'encode_stream_error_stream:error_undefined-condition'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_undefined-condition'('undefined-condition',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"undefined-condition">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_system-shutdown'({xmlel,
+ _, _attrs, _els}) ->
+ 'system-shutdown'.
+
+'encode_stream_error_stream:error_system-shutdown'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_system-shutdown'('system-shutdown',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"system-shutdown">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_see-other-host'({xmlel,
+ _, _attrs, _els}) ->
+ Cdata =
+ 'decode_stream_error_stream:error_see-other-host_els'(_els,
+ <<>>),
+ {'see-other-host', Cdata}.
+
+'decode_stream_error_stream:error_see-other-host_els'([{xmlcdata,
+ _data}
+ | _els],
+ Cdata) ->
+ 'decode_stream_error_stream:error_see-other-host_els'(_els,
+ <<Cdata/binary,
+ _data/binary>>);
+'decode_stream_error_stream:error_see-other-host_els'([_
+ | _els],
+ Cdata) ->
+ 'decode_stream_error_stream:error_see-other-host_els'(_els,
+ Cdata);
+'decode_stream_error_stream:error_see-other-host_els'([],
+ Cdata) ->
+ 'decode_stream_error_stream:error_see-other-host_cdata'(Cdata).
+
+'encode_stream_error_stream:error_see-other-host'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_see-other-host'({'see-other-host',
+ Cdata},
+ _acc) ->
+ _els =
+ 'encode_stream_error_stream:error_see-other-host_cdata'(Cdata,
+ []),
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"see-other-host">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_see-other-host_cdata'(<<>>) ->
+ undefined;
+'decode_stream_error_stream:error_see-other-host_cdata'(_val) ->
+ _val.
+
+'encode_stream_error_stream:error_see-other-host_cdata'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_see-other-host_cdata'(_val,
+ _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+'decode_stream_error_stream:error_restricted-xml'({xmlel,
+ _, _attrs, _els}) ->
+ 'restricted-xml'.
+
+'encode_stream_error_stream:error_restricted-xml'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_restricted-xml'('restricted-xml',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"restricted-xml">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_resource-constraint'({xmlel,
+ _, _attrs, _els}) ->
+ 'resource-constraint'.
+
+'encode_stream_error_stream:error_resource-constraint'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_resource-constraint'('resource-constraint',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"resource-constraint">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_reset'({xmlel, _,
+ _attrs, _els}) ->
+ reset.
+
+'encode_stream_error_stream:error_reset'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_reset'(reset, _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"reset">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_remote-connection-failed'({xmlel,
+ _, _attrs,
+ _els}) ->
+ 'remote-connection-failed'.
+
+'encode_stream_error_stream:error_remote-connection-failed'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_remote-connection-failed'('remote-connection-failed',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"remote-connection-failed">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_policy-violation'({xmlel,
+ _, _attrs, _els}) ->
+ 'policy-violation'.
+
+'encode_stream_error_stream:error_policy-violation'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_policy-violation'('policy-violation',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"policy-violation">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_not-well-formed'({xmlel,
+ _, _attrs, _els}) ->
+ 'not-well-formed'.
+
+'encode_stream_error_stream:error_not-well-formed'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_not-well-formed'('not-well-formed',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"not-well-formed">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_not-authorized'({xmlel,
+ _, _attrs, _els}) ->
+ 'not-authorized'.
+
+'encode_stream_error_stream:error_not-authorized'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_not-authorized'('not-authorized',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"not-authorized">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_invalid-xml'({xmlel,
+ _, _attrs, _els}) ->
+ 'invalid-xml'.
+
+'encode_stream_error_stream:error_invalid-xml'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_invalid-xml'('invalid-xml',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"invalid-xml">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_invalid-namespace'({xmlel,
+ _, _attrs, _els}) ->
+ 'invalid-namespace'.
+
+'encode_stream_error_stream:error_invalid-namespace'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_invalid-namespace'('invalid-namespace',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"invalid-namespace">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_invalid-id'({xmlel, _,
+ _attrs, _els}) ->
+ 'invalid-id'.
+
+'encode_stream_error_stream:error_invalid-id'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_invalid-id'('invalid-id',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"invalid-id">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_invalid-from'({xmlel,
+ _, _attrs, _els}) ->
+ 'invalid-from'.
+
+'encode_stream_error_stream:error_invalid-from'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_invalid-from'('invalid-from',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"invalid-from">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_internal-server-error'({xmlel,
+ _, _attrs, _els}) ->
+ 'internal-server-error'.
+
+'encode_stream_error_stream:error_internal-server-error'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_internal-server-error'('internal-server-error',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"internal-server-error">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_improper-addressing'({xmlel,
+ _, _attrs, _els}) ->
+ 'improper-addressing'.
+
+'encode_stream_error_stream:error_improper-addressing'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_improper-addressing'('improper-addressing',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"improper-addressing">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_host-unknown'({xmlel,
+ _, _attrs, _els}) ->
+ 'host-unknown'.
+
+'encode_stream_error_stream:error_host-unknown'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_host-unknown'('host-unknown',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"host-unknown">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_host-gone'({xmlel, _,
+ _attrs, _els}) ->
+ 'host-gone'.
+
+'encode_stream_error_stream:error_host-gone'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_host-gone'('host-gone',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"host-gone">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_connection-timeout'({xmlel,
+ _, _attrs, _els}) ->
+ 'connection-timeout'.
+
+'encode_stream_error_stream:error_connection-timeout'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_connection-timeout'('connection-timeout',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"connection-timeout">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_conflict'({xmlel, _,
+ _attrs, _els}) ->
+ conflict.
+
+'encode_stream_error_stream:error_conflict'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_conflict'(conflict,
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"conflict">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_bad-namespace-prefix'({xmlel,
+ _, _attrs, _els}) ->
+ 'bad-namespace-prefix'.
+
+'encode_stream_error_stream:error_bad-namespace-prefix'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_bad-namespace-prefix'('bad-namespace-prefix',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"bad-namespace-prefix">>, _attrs, _els}
+ | _acc].
+
+'decode_stream_error_stream:error_bad-format'({xmlel, _,
+ _attrs, _els}) ->
+ 'bad-format'.
+
+'encode_stream_error_stream:error_bad-format'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_bad-format'('bad-format',
+ _acc) ->
+ _els = [],
+ _attrs = [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}],
+ [{xmlel, <<"bad-format">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_text'({xmlel, _,
+ _attrs, _els}) ->
+ Text_lang =
+ 'decode_stream_error_stream:error_text_attrs'(_attrs,
+ undefined),
+ Cdata =
+ 'decode_stream_error_stream:error_text_els'(_els, <<>>),
+ {Text_lang, Cdata}.
+
+'decode_stream_error_stream:error_text_els'([{xmlcdata,
+ _data}
+ | _els],
+ Cdata) ->
+ 'decode_stream_error_stream:error_text_els'(_els,
+ <<Cdata/binary, _data/binary>>);
+'decode_stream_error_stream:error_text_els'([_ | _els],
+ Cdata) ->
+ 'decode_stream_error_stream:error_text_els'(_els,
+ Cdata);
+'decode_stream_error_stream:error_text_els'([],
+ Cdata) ->
+ 'decode_stream_error_stream:error_text_cdata'(Cdata).
+
+'decode_stream_error_stream:error_text_attrs'([{<<"xml:lang">>,
+ _val}
+ | _attrs],
+ _Text_lang) ->
+ 'decode_stream_error_stream:error_text_attrs'(_attrs,
+ _val);
+'decode_stream_error_stream:error_text_attrs'([_
+ | _attrs],
+ Text_lang) ->
+ 'decode_stream_error_stream:error_text_attrs'(_attrs,
+ Text_lang);
+'decode_stream_error_stream:error_text_attrs'([],
+ Text_lang) ->
+ 'decode_stream_error_stream:error_text_xml:lang'(Text_lang).
+
+'encode_stream_error_stream:error_text'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_text'({Text_lang,
+ Cdata},
+ _acc) ->
+ _els =
+ 'encode_stream_error_stream:error_text_cdata'(Cdata,
+ []),
+ _attrs =
+ 'encode_stream_error_stream:error_text_xml:lang'(Text_lang,
+ [{<<"xmlns">>,
+ <<"urn:ietf:params:xml:ns:xmpp-streams">>}]),
+ [{xmlel, <<"text">>, _attrs, _els} | _acc].
+
+'decode_stream_error_stream:error_text_xml:lang'(undefined) ->
+ undefined;
+'decode_stream_error_stream:error_text_xml:lang'(_val) ->
+ _val.
+
+'encode_stream_error_stream:error_text_xml:lang'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_text_xml:lang'(_val,
+ _acc) ->
+ [{<<"xml:lang">>, _val} | _acc].
+
+'decode_stream_error_stream:error_text_cdata'(<<>>) ->
+ undefined;
+'decode_stream_error_stream:error_text_cdata'(_val) ->
+ _val.
+
+'encode_stream_error_stream:error_text_cdata'(undefined,
+ _acc) ->
+ _acc;
+'encode_stream_error_stream:error_text_cdata'(_val,
+ _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_name_N({xmlel, _, _attrs, _els}) ->
+ {Suffix, Prefix, Middle, Given, Family} =
+ decode_vcard_name_N_els(_els, undefined, undefined,
+ undefined, undefined, undefined),
+ {vcard_name, Family, Given, Middle, Prefix, Suffix}.
+
+decode_vcard_name_N_els([{xmlel, <<"SUFFIX">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Suffix, Prefix, Middle, Given, Family) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_name_N_els(_els,
+ decode_vcard_name_N_SUFFIX(_el), Prefix,
+ Middle, Given, Family);
+ _ ->
+ decode_vcard_name_N_els(_els, Suffix, Prefix, Middle,
+ Given, Family)
+ end;
+decode_vcard_name_N_els([{xmlel, <<"PREFIX">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Suffix, Prefix, Middle, Given, Family) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_name_N_els(_els, Suffix,
+ decode_vcard_name_N_PREFIX(_el), Middle,
+ Given, Family);
+ _ ->
+ decode_vcard_name_N_els(_els, Suffix, Prefix, Middle,
+ Given, Family)
+ end;
+decode_vcard_name_N_els([{xmlel, <<"MIDDLE">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Suffix, Prefix, Middle, Given, Family) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_name_N_els(_els, Suffix, Prefix,
+ decode_vcard_name_N_MIDDLE(_el), Given,
+ Family);
+ _ ->
+ decode_vcard_name_N_els(_els, Suffix, Prefix, Middle,
+ Given, Family)
+ end;
+decode_vcard_name_N_els([{xmlel, <<"GIVEN">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Suffix, Prefix, Middle, Given, Family) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_name_N_els(_els, Suffix, Prefix, Middle,
+ decode_vcard_name_N_GIVEN(_el), Family);
+ _ ->
+ decode_vcard_name_N_els(_els, Suffix, Prefix, Middle,
+ Given, Family)
+ end;
+decode_vcard_name_N_els([{xmlel, <<"FAMILY">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Suffix, Prefix, Middle, Given, Family) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_name_N_els(_els, Suffix, Prefix, Middle,
+ Given, decode_vcard_name_N_FAMILY(_el));
+ _ ->
+ decode_vcard_name_N_els(_els, Suffix, Prefix, Middle,
+ Given, Family)
+ end;
+decode_vcard_name_N_els([_ | _els], Suffix, Prefix,
+ Middle, Given, Family) ->
+ decode_vcard_name_N_els(_els, Suffix, Prefix, Middle,
+ Given, Family);
+decode_vcard_name_N_els([], Suffix, Prefix, Middle,
+ Given, Family) ->
+ {Suffix, Prefix, Middle, Given, Family}.
+
+encode_vcard_name_N(undefined, _acc) -> _acc;
+encode_vcard_name_N({vcard_name, Family, Given, Middle,
+ Prefix, Suffix},
+ _acc) ->
+ _els = encode_vcard_name_N_FAMILY(Family,
+ encode_vcard_name_N_GIVEN(Given,
+ encode_vcard_name_N_MIDDLE(Middle,
+ encode_vcard_name_N_PREFIX(Prefix,
+ encode_vcard_name_N_SUFFIX(Suffix,
+ []))))),
+ _attrs = [],
+ [{xmlel, <<"N">>, _attrs, _els} | _acc].
+
+decode_vcard_name_N_SUFFIX({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_name_N_SUFFIX_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_name_N_SUFFIX_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_name_N_SUFFIX_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_name_N_SUFFIX_els([_ | _els], Cdata) ->
+ decode_vcard_name_N_SUFFIX_els(_els, Cdata);
+decode_vcard_name_N_SUFFIX_els([], Cdata) ->
+ decode_vcard_name_N_SUFFIX_cdata(Cdata).
+
+encode_vcard_name_N_SUFFIX(undefined, _acc) -> _acc;
+encode_vcard_name_N_SUFFIX(Cdata, _acc) ->
+ _els = encode_vcard_name_N_SUFFIX_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"SUFFIX">>, _attrs, _els} | _acc].
+
+decode_vcard_name_N_SUFFIX_cdata(<<>>) -> undefined;
+decode_vcard_name_N_SUFFIX_cdata(_val) -> _val.
+
+encode_vcard_name_N_SUFFIX_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_name_N_SUFFIX_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_name_N_PREFIX({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_name_N_PREFIX_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_name_N_PREFIX_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_name_N_PREFIX_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_name_N_PREFIX_els([_ | _els], Cdata) ->
+ decode_vcard_name_N_PREFIX_els(_els, Cdata);
+decode_vcard_name_N_PREFIX_els([], Cdata) ->
+ decode_vcard_name_N_PREFIX_cdata(Cdata).
+
+encode_vcard_name_N_PREFIX(undefined, _acc) -> _acc;
+encode_vcard_name_N_PREFIX(Cdata, _acc) ->
+ _els = encode_vcard_name_N_PREFIX_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"PREFIX">>, _attrs, _els} | _acc].
+
+decode_vcard_name_N_PREFIX_cdata(<<>>) -> undefined;
+decode_vcard_name_N_PREFIX_cdata(_val) -> _val.
+
+encode_vcard_name_N_PREFIX_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_name_N_PREFIX_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_name_N_MIDDLE({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_name_N_MIDDLE_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_name_N_MIDDLE_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_name_N_MIDDLE_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_name_N_MIDDLE_els([_ | _els], Cdata) ->
+ decode_vcard_name_N_MIDDLE_els(_els, Cdata);
+decode_vcard_name_N_MIDDLE_els([], Cdata) ->
+ decode_vcard_name_N_MIDDLE_cdata(Cdata).
+
+encode_vcard_name_N_MIDDLE(undefined, _acc) -> _acc;
+encode_vcard_name_N_MIDDLE(Cdata, _acc) ->
+ _els = encode_vcard_name_N_MIDDLE_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"MIDDLE">>, _attrs, _els} | _acc].
+
+decode_vcard_name_N_MIDDLE_cdata(<<>>) -> undefined;
+decode_vcard_name_N_MIDDLE_cdata(_val) -> _val.
+
+encode_vcard_name_N_MIDDLE_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_name_N_MIDDLE_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_name_N_GIVEN({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_name_N_GIVEN_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_name_N_GIVEN_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_name_N_GIVEN_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_name_N_GIVEN_els([_ | _els], Cdata) ->
+ decode_vcard_name_N_GIVEN_els(_els, Cdata);
+decode_vcard_name_N_GIVEN_els([], Cdata) ->
+ decode_vcard_name_N_GIVEN_cdata(Cdata).
+
+encode_vcard_name_N_GIVEN(undefined, _acc) -> _acc;
+encode_vcard_name_N_GIVEN(Cdata, _acc) ->
+ _els = encode_vcard_name_N_GIVEN_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"GIVEN">>, _attrs, _els} | _acc].
+
+decode_vcard_name_N_GIVEN_cdata(<<>>) -> undefined;
+decode_vcard_name_N_GIVEN_cdata(_val) -> _val.
+
+encode_vcard_name_N_GIVEN_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_name_N_GIVEN_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_name_N_FAMILY({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_name_N_FAMILY_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_name_N_FAMILY_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_name_N_FAMILY_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_name_N_FAMILY_els([_ | _els], Cdata) ->
+ decode_vcard_name_N_FAMILY_els(_els, Cdata);
+decode_vcard_name_N_FAMILY_els([], Cdata) ->
+ decode_vcard_name_N_FAMILY_cdata(Cdata).
+
+encode_vcard_name_N_FAMILY(undefined, _acc) -> _acc;
+encode_vcard_name_N_FAMILY(Cdata, _acc) ->
+ _els = encode_vcard_name_N_FAMILY_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"FAMILY">>, _attrs, _els} | _acc].
+
+decode_vcard_name_N_FAMILY_cdata(<<>>) -> undefined;
+decode_vcard_name_N_FAMILY_cdata(_val) -> _val.
+
+encode_vcard_name_N_FAMILY_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_name_N_FAMILY_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_adr_ADR({xmlel, _, _attrs, _els}) ->
+ {Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home} =
+ decode_vcard_adr_ADR_els(_els, undefined, undefined,
+ undefined, undefined, undefined, undefined,
+ undefined, false, false, false, false, false,
+ false, false),
+ {vcard_adr, Home, Work, Postal, Parcel, Dom, Intl, Pref,
+ Pobox, Extadd, Street, Locality, Region, Pcode, Ctry}.
+
+decode_vcard_adr_ADR_els([{xmlel, <<"CTRY">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els,
+ decode_vcard_adr_ADR_CTRY(_el), Pcode,
+ Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"PCODE">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry,
+ decode_vcard_adr_ADR_PCODE(_el), Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"REGION">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode,
+ decode_vcard_adr_ADR_REGION(_el), Locality,
+ Street, Extadd, Pobox, Pref, Intl, Dom,
+ Parcel, Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"LOCALITY">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ decode_vcard_adr_ADR_LOCALITY(_el), Street,
+ Extadd, Pobox, Pref, Intl, Dom, Parcel,
+ Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"STREET">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, decode_vcard_adr_ADR_STREET(_el),
+ Extadd, Pobox, Pref, Intl, Dom, Parcel,
+ Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"EXTADD">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street,
+ decode_vcard_adr_ADR_EXTADD(_el), Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"POBOX">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd,
+ decode_vcard_adr_ADR_POBOX(_el), Pref, Intl,
+ Dom, Parcel, Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"PREF">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox,
+ decode_vcard_adr_ADR_PREF(_el), Intl, Dom,
+ Parcel, Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"INTL">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref,
+ decode_vcard_adr_ADR_INTL(_el), Dom, Parcel,
+ Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"DOM">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ decode_vcard_adr_ADR_DOM(_el), Parcel,
+ Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"PARCEL">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, decode_vcard_adr_ADR_PARCEL(_el),
+ Postal, Work, Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"POSTAL">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel,
+ decode_vcard_adr_ADR_POSTAL(_el), Work,
+ Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"WORK">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal,
+ decode_vcard_adr_ADR_WORK(_el), Home);
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([{xmlel, <<"HOME">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work,
+ decode_vcard_adr_ADR_HOME(_el));
+ _ ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_adr_ADR_els([_ | _els], Ctry, Pcode,
+ Region, Locality, Street, Extadd, Pobox, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home) ->
+ decode_vcard_adr_ADR_els(_els, Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl, Dom,
+ Parcel, Postal, Work, Home);
+decode_vcard_adr_ADR_els([], Ctry, Pcode, Region,
+ Locality, Street, Extadd, Pobox, Pref, Intl, Dom,
+ Parcel, Postal, Work, Home) ->
+ {Ctry, Pcode, Region, Locality, Street, Extadd, Pobox,
+ Pref, Intl, Dom, Parcel, Postal, Work, Home}.
+
+encode_vcard_adr_ADR([], _acc) -> _acc;
+encode_vcard_adr_ADR([{vcard_adr, Home, Work, Postal,
+ Parcel, Dom, Intl, Pref, Pobox, Extadd, Street,
+ Locality, Region, Pcode, Ctry}
+ | _tail],
+ _acc) ->
+ _els = encode_vcard_adr_ADR_HOME(Home,
+ encode_vcard_adr_ADR_WORK(Work,
+ encode_vcard_adr_ADR_POSTAL(Postal,
+ encode_vcard_adr_ADR_PARCEL(Parcel,
+ encode_vcard_adr_ADR_DOM(Dom,
+ encode_vcard_adr_ADR_INTL(Intl,
+ encode_vcard_adr_ADR_PREF(Pref,
+ encode_vcard_adr_ADR_POBOX(Pobox,
+ encode_vcard_adr_ADR_EXTADD(Extadd,
+ encode_vcard_adr_ADR_STREET(Street,
+ encode_vcard_adr_ADR_LOCALITY(Locality,
+ encode_vcard_adr_ADR_REGION(Region,
+ encode_vcard_adr_ADR_PCODE(Pcode,
+ encode_vcard_adr_ADR_CTRY(Ctry,
+ [])))))))))))))),
+ _attrs = [],
+ encode_vcard_adr_ADR(_tail,
+ [{xmlel, <<"ADR">>, _attrs, _els} | _acc]).
+
+decode_vcard_adr_ADR_CTRY({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_adr_ADR_CTRY_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_adr_ADR_CTRY_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_adr_ADR_CTRY_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_adr_ADR_CTRY_els([_ | _els], Cdata) ->
+ decode_vcard_adr_ADR_CTRY_els(_els, Cdata);
+decode_vcard_adr_ADR_CTRY_els([], Cdata) ->
+ decode_vcard_adr_ADR_CTRY_cdata(Cdata).
+
+encode_vcard_adr_ADR_CTRY(undefined, _acc) -> _acc;
+encode_vcard_adr_ADR_CTRY(Cdata, _acc) ->
+ _els = encode_vcard_adr_ADR_CTRY_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"CTRY">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_CTRY_cdata(<<>>) -> undefined;
+decode_vcard_adr_ADR_CTRY_cdata(_val) -> _val.
+
+encode_vcard_adr_ADR_CTRY_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_adr_ADR_CTRY_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_adr_ADR_PCODE({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_adr_ADR_PCODE_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_adr_ADR_PCODE_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_adr_ADR_PCODE_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_adr_ADR_PCODE_els([_ | _els], Cdata) ->
+ decode_vcard_adr_ADR_PCODE_els(_els, Cdata);
+decode_vcard_adr_ADR_PCODE_els([], Cdata) ->
+ decode_vcard_adr_ADR_PCODE_cdata(Cdata).
+
+encode_vcard_adr_ADR_PCODE(undefined, _acc) -> _acc;
+encode_vcard_adr_ADR_PCODE(Cdata, _acc) ->
+ _els = encode_vcard_adr_ADR_PCODE_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"PCODE">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_PCODE_cdata(<<>>) -> undefined;
+decode_vcard_adr_ADR_PCODE_cdata(_val) -> _val.
+
+encode_vcard_adr_ADR_PCODE_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_adr_ADR_PCODE_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_adr_ADR_REGION({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_adr_ADR_REGION_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_adr_ADR_REGION_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_adr_ADR_REGION_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_adr_ADR_REGION_els([_ | _els], Cdata) ->
+ decode_vcard_adr_ADR_REGION_els(_els, Cdata);
+decode_vcard_adr_ADR_REGION_els([], Cdata) ->
+ decode_vcard_adr_ADR_REGION_cdata(Cdata).
+
+encode_vcard_adr_ADR_REGION(undefined, _acc) -> _acc;
+encode_vcard_adr_ADR_REGION(Cdata, _acc) ->
+ _els = encode_vcard_adr_ADR_REGION_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"REGION">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_REGION_cdata(<<>>) -> undefined;
+decode_vcard_adr_ADR_REGION_cdata(_val) -> _val.
+
+encode_vcard_adr_ADR_REGION_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_adr_ADR_REGION_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_adr_ADR_LOCALITY({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_vcard_adr_ADR_LOCALITY_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_adr_ADR_LOCALITY_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_adr_ADR_LOCALITY_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_adr_ADR_LOCALITY_els([_ | _els], Cdata) ->
+ decode_vcard_adr_ADR_LOCALITY_els(_els, Cdata);
+decode_vcard_adr_ADR_LOCALITY_els([], Cdata) ->
+ decode_vcard_adr_ADR_LOCALITY_cdata(Cdata).
+
+encode_vcard_adr_ADR_LOCALITY(undefined, _acc) -> _acc;
+encode_vcard_adr_ADR_LOCALITY(Cdata, _acc) ->
+ _els = encode_vcard_adr_ADR_LOCALITY_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"LOCALITY">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_LOCALITY_cdata(<<>>) -> undefined;
+decode_vcard_adr_ADR_LOCALITY_cdata(_val) -> _val.
+
+encode_vcard_adr_ADR_LOCALITY_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_adr_ADR_LOCALITY_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_adr_ADR_STREET({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_adr_ADR_STREET_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_adr_ADR_STREET_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_adr_ADR_STREET_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_adr_ADR_STREET_els([_ | _els], Cdata) ->
+ decode_vcard_adr_ADR_STREET_els(_els, Cdata);
+decode_vcard_adr_ADR_STREET_els([], Cdata) ->
+ decode_vcard_adr_ADR_STREET_cdata(Cdata).
+
+encode_vcard_adr_ADR_STREET(undefined, _acc) -> _acc;
+encode_vcard_adr_ADR_STREET(Cdata, _acc) ->
+ _els = encode_vcard_adr_ADR_STREET_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"STREET">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_STREET_cdata(<<>>) -> undefined;
+decode_vcard_adr_ADR_STREET_cdata(_val) -> _val.
+
+encode_vcard_adr_ADR_STREET_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_adr_ADR_STREET_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_adr_ADR_EXTADD({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_adr_ADR_EXTADD_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_adr_ADR_EXTADD_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_adr_ADR_EXTADD_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_adr_ADR_EXTADD_els([_ | _els], Cdata) ->
+ decode_vcard_adr_ADR_EXTADD_els(_els, Cdata);
+decode_vcard_adr_ADR_EXTADD_els([], Cdata) ->
+ decode_vcard_adr_ADR_EXTADD_cdata(Cdata).
+
+encode_vcard_adr_ADR_EXTADD(undefined, _acc) -> _acc;
+encode_vcard_adr_ADR_EXTADD(Cdata, _acc) ->
+ _els = encode_vcard_adr_ADR_EXTADD_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"EXTADD">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_EXTADD_cdata(<<>>) -> undefined;
+decode_vcard_adr_ADR_EXTADD_cdata(_val) -> _val.
+
+encode_vcard_adr_ADR_EXTADD_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_adr_ADR_EXTADD_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_adr_ADR_POBOX({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_adr_ADR_POBOX_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_adr_ADR_POBOX_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_adr_ADR_POBOX_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_adr_ADR_POBOX_els([_ | _els], Cdata) ->
+ decode_vcard_adr_ADR_POBOX_els(_els, Cdata);
+decode_vcard_adr_ADR_POBOX_els([], Cdata) ->
+ decode_vcard_adr_ADR_POBOX_cdata(Cdata).
+
+encode_vcard_adr_ADR_POBOX(undefined, _acc) -> _acc;
+encode_vcard_adr_ADR_POBOX(Cdata, _acc) ->
+ _els = encode_vcard_adr_ADR_POBOX_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"POBOX">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_POBOX_cdata(<<>>) -> undefined;
+decode_vcard_adr_ADR_POBOX_cdata(_val) -> _val.
+
+encode_vcard_adr_ADR_POBOX_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_adr_ADR_POBOX_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_adr_ADR_PREF({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_adr_ADR_PREF(false, _acc) -> _acc;
+encode_vcard_adr_ADR_PREF(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PREF">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_INTL({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_adr_ADR_INTL(false, _acc) -> _acc;
+encode_vcard_adr_ADR_INTL(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"INTL">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_DOM({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_adr_ADR_DOM(false, _acc) -> _acc;
+encode_vcard_adr_ADR_DOM(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"DOM">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_PARCEL({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_adr_ADR_PARCEL(false, _acc) -> _acc;
+encode_vcard_adr_ADR_PARCEL(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PARCEL">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_POSTAL({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_adr_ADR_POSTAL(false, _acc) -> _acc;
+encode_vcard_adr_ADR_POSTAL(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"POSTAL">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_WORK({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_adr_ADR_WORK(false, _acc) -> _acc;
+encode_vcard_adr_ADR_WORK(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"WORK">>, _attrs, _els} | _acc].
+
+decode_vcard_adr_ADR_HOME({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_adr_ADR_HOME(false, _acc) -> _acc;
+encode_vcard_adr_ADR_HOME(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"HOME">>, _attrs, _els} | _acc].
+
+decode_vcard_label_LABEL({xmlel, _, _attrs, _els}) ->
+ {Line, Pref, Intl, Dom, Parcel, Postal, Work, Home} =
+ decode_vcard_label_LABEL_els(_els, [], false, false,
+ false, false, false, false, false),
+ {vcard_label, Home, Work, Postal, Parcel, Dom, Intl,
+ Pref, Line}.
+
+decode_vcard_label_LABEL_els([{xmlel, <<"LINE">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Line, Pref, Intl, Dom, Parcel, Postal, Work,
+ Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_label_LABEL_els(_els,
+ [decode_vcard_label_LABEL_LINE(_el)
+ | Line],
+ Pref, Intl, Dom, Parcel, Postal, Work,
+ Home);
+ _ ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_label_LABEL_els([{xmlel, <<"PREF">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Line, Pref, Intl, Dom, Parcel, Postal, Work,
+ Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_label_LABEL_els(_els, Line,
+ decode_vcard_label_LABEL_PREF(_el), Intl,
+ Dom, Parcel, Postal, Work, Home);
+ _ ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_label_LABEL_els([{xmlel, <<"INTL">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Line, Pref, Intl, Dom, Parcel, Postal, Work,
+ Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref,
+ decode_vcard_label_LABEL_INTL(_el), Dom,
+ Parcel, Postal, Work, Home);
+ _ ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_label_LABEL_els([{xmlel, <<"DOM">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Line, Pref, Intl, Dom, Parcel, Postal, Work,
+ Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ decode_vcard_label_LABEL_DOM(_el),
+ Parcel, Postal, Work, Home);
+ _ ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_label_LABEL_els([{xmlel, <<"PARCEL">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Line, Pref, Intl, Dom, Parcel, Postal, Work,
+ Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom,
+ decode_vcard_label_LABEL_PARCEL(_el),
+ Postal, Work, Home);
+ _ ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_label_LABEL_els([{xmlel, <<"POSTAL">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Line, Pref, Intl, Dom, Parcel, Postal, Work,
+ Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel,
+ decode_vcard_label_LABEL_POSTAL(_el),
+ Work, Home);
+ _ ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_label_LABEL_els([{xmlel, <<"WORK">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Line, Pref, Intl, Dom, Parcel, Postal, Work,
+ Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal,
+ decode_vcard_label_LABEL_WORK(_el),
+ Home);
+ _ ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_label_LABEL_els([{xmlel, <<"HOME">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Line, Pref, Intl, Dom, Parcel, Postal, Work,
+ Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work,
+ decode_vcard_label_LABEL_HOME(_el));
+ _ ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home)
+ end;
+decode_vcard_label_LABEL_els([_ | _els], Line, Pref,
+ Intl, Dom, Parcel, Postal, Work, Home) ->
+ decode_vcard_label_LABEL_els(_els, Line, Pref, Intl,
+ Dom, Parcel, Postal, Work, Home);
+decode_vcard_label_LABEL_els([], Line, Pref, Intl, Dom,
+ Parcel, Postal, Work, Home) ->
+ {lists:reverse(Line), Pref, Intl, Dom, Parcel, Postal,
+ Work, Home}.
+
+encode_vcard_label_LABEL([], _acc) -> _acc;
+encode_vcard_label_LABEL([{vcard_label, Home, Work,
+ Postal, Parcel, Dom, Intl, Pref, Line}
+ | _tail],
+ _acc) ->
+ _els = encode_vcard_label_LABEL_HOME(Home,
+ encode_vcard_label_LABEL_WORK(Work,
+ encode_vcard_label_LABEL_POSTAL(Postal,
+ encode_vcard_label_LABEL_PARCEL(Parcel,
+ encode_vcard_label_LABEL_DOM(Dom,
+ encode_vcard_label_LABEL_INTL(Intl,
+ encode_vcard_label_LABEL_PREF(Pref,
+ encode_vcard_label_LABEL_LINE(Line,
+ [])))))))),
+ _attrs = [],
+ encode_vcard_label_LABEL(_tail,
+ [{xmlel, <<"LABEL">>, _attrs, _els} | _acc]).
+
+decode_vcard_label_LABEL_LINE({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_vcard_label_LABEL_LINE_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_label_LABEL_LINE_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_label_LABEL_LINE_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_label_LABEL_LINE_els([_ | _els], Cdata) ->
+ decode_vcard_label_LABEL_LINE_els(_els, Cdata);
+decode_vcard_label_LABEL_LINE_els([], Cdata) ->
+ decode_vcard_label_LABEL_LINE_cdata(Cdata).
+
+encode_vcard_label_LABEL_LINE([], _acc) -> _acc;
+encode_vcard_label_LABEL_LINE([Cdata | _tail], _acc) ->
+ _els = encode_vcard_label_LABEL_LINE_cdata(Cdata, []),
+ _attrs = [],
+ encode_vcard_label_LABEL_LINE(_tail,
+ [{xmlel, <<"LINE">>, _attrs, _els} | _acc]).
+
+decode_vcard_label_LABEL_LINE_cdata(<<>>) -> undefined;
+decode_vcard_label_LABEL_LINE_cdata(_val) -> _val.
+
+encode_vcard_label_LABEL_LINE_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_label_LABEL_LINE_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_label_LABEL_PREF({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_label_LABEL_PREF(false, _acc) -> _acc;
+encode_vcard_label_LABEL_PREF(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PREF">>, _attrs, _els} | _acc].
+
+decode_vcard_label_LABEL_INTL({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_label_LABEL_INTL(false, _acc) -> _acc;
+encode_vcard_label_LABEL_INTL(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"INTL">>, _attrs, _els} | _acc].
+
+decode_vcard_label_LABEL_DOM({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_label_LABEL_DOM(false, _acc) -> _acc;
+encode_vcard_label_LABEL_DOM(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"DOM">>, _attrs, _els} | _acc].
+
+decode_vcard_label_LABEL_PARCEL({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_label_LABEL_PARCEL(false, _acc) -> _acc;
+encode_vcard_label_LABEL_PARCEL(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PARCEL">>, _attrs, _els} | _acc].
+
+decode_vcard_label_LABEL_POSTAL({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_label_LABEL_POSTAL(false, _acc) -> _acc;
+encode_vcard_label_LABEL_POSTAL(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"POSTAL">>, _attrs, _els} | _acc].
+
+decode_vcard_label_LABEL_WORK({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_label_LABEL_WORK(false, _acc) -> _acc;
+encode_vcard_label_LABEL_WORK(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"WORK">>, _attrs, _els} | _acc].
+
+decode_vcard_label_LABEL_HOME({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_label_LABEL_HOME(false, _acc) -> _acc;
+encode_vcard_label_LABEL_HOME(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"HOME">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL({xmlel, _, _attrs, _els}) ->
+ {Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home} =
+ decode_vcard_tel_TEL_els(_els, [], false, false, false,
+ false, false, false, false, false, false,
+ false, false, false, false),
+ {vcard_tel, Home, Work, Voice, Fax, Pager, Msg, Cell,
+ Video, Bbs, Modem, Isdn, Pcs, Pref, Number}.
+
+decode_vcard_tel_TEL_els([{xmlel, <<"NUMBER">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els,
+ [decode_vcard_tel_TEL_NUMBER(_el) | Number],
+ Pref, Pcs, Isdn, Modem, Bbs, Video, Cell,
+ Msg, Pager, Fax, Voice, Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"PREF">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number,
+ decode_vcard_tel_TEL_PREF(_el), Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"PCS">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref,
+ decode_vcard_tel_TEL_PCS(_el), Isdn, Modem,
+ Bbs, Video, Cell, Msg, Pager, Fax, Voice,
+ Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"ISDN">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs,
+ decode_vcard_tel_TEL_ISDN(_el), Modem, Bbs,
+ Video, Cell, Msg, Pager, Fax, Voice, Work,
+ Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"MODEM">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ decode_vcard_tel_TEL_MODEM(_el), Bbs, Video,
+ Cell, Msg, Pager, Fax, Voice, Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"BBS">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, decode_vcard_tel_TEL_BBS(_el), Video,
+ Cell, Msg, Pager, Fax, Voice, Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"VIDEO">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, decode_vcard_tel_TEL_VIDEO(_el),
+ Cell, Msg, Pager, Fax, Voice, Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"CELL">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video,
+ decode_vcard_tel_TEL_CELL(_el), Msg, Pager,
+ Fax, Voice, Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"MSG">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell,
+ decode_vcard_tel_TEL_MSG(_el), Pager, Fax,
+ Voice, Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"PAGER">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg,
+ decode_vcard_tel_TEL_PAGER(_el), Fax, Voice,
+ Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"FAX">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager,
+ decode_vcard_tel_TEL_FAX(_el), Voice, Work,
+ Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"VOICE">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ decode_vcard_tel_TEL_VOICE(_el), Work, Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"WORK">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, decode_vcard_tel_TEL_WORK(_el), Home);
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([{xmlel, <<"HOME">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, decode_vcard_tel_TEL_HOME(_el));
+ _ ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax,
+ Voice, Work, Home)
+ end;
+decode_vcard_tel_TEL_els([_ | _els], Number, Pref, Pcs,
+ Isdn, Modem, Bbs, Video, Cell, Msg, Pager, Fax, Voice,
+ Work, Home) ->
+ decode_vcard_tel_TEL_els(_els, Number, Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax, Voice,
+ Work, Home);
+decode_vcard_tel_TEL_els([], [Number], Pref, Pcs, Isdn,
+ Modem, Bbs, Video, Cell, Msg, Pager, Fax, Voice, Work,
+ Home) ->
+ {Number, Pref, Pcs, Isdn, Modem, Bbs, Video, Cell, Msg,
+ Pager, Fax, Voice, Work, Home}.
+
+encode_vcard_tel_TEL([], _acc) -> _acc;
+encode_vcard_tel_TEL([{vcard_tel, Home, Work, Voice,
+ Fax, Pager, Msg, Cell, Video, Bbs, Modem, Isdn, Pcs,
+ Pref, Number}
+ | _tail],
+ _acc) ->
+ _els = encode_vcard_tel_TEL_HOME(Home,
+ encode_vcard_tel_TEL_WORK(Work,
+ encode_vcard_tel_TEL_VOICE(Voice,
+ encode_vcard_tel_TEL_FAX(Fax,
+ encode_vcard_tel_TEL_PAGER(Pager,
+ encode_vcard_tel_TEL_MSG(Msg,
+ encode_vcard_tel_TEL_CELL(Cell,
+ encode_vcard_tel_TEL_VIDEO(Video,
+ encode_vcard_tel_TEL_BBS(Bbs,
+ encode_vcard_tel_TEL_MODEM(Modem,
+ encode_vcard_tel_TEL_ISDN(Isdn,
+ encode_vcard_tel_TEL_PCS(Pcs,
+ encode_vcard_tel_TEL_PREF(Pref,
+ encode_vcard_tel_TEL_NUMBER(Number,
+ [])))))))))))))),
+ _attrs = [],
+ encode_vcard_tel_TEL(_tail,
+ [{xmlel, <<"TEL">>, _attrs, _els} | _acc]).
+
+decode_vcard_tel_TEL_NUMBER({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_tel_TEL_NUMBER_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_tel_TEL_NUMBER_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_tel_TEL_NUMBER_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_tel_TEL_NUMBER_els([_ | _els], Cdata) ->
+ decode_vcard_tel_TEL_NUMBER_els(_els, Cdata);
+decode_vcard_tel_TEL_NUMBER_els([], Cdata) ->
+ decode_vcard_tel_TEL_NUMBER_cdata(Cdata).
+
+encode_vcard_tel_TEL_NUMBER(Cdata, _acc) ->
+ _els = encode_vcard_tel_TEL_NUMBER_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"NUMBER">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_NUMBER_cdata(<<>>) -> undefined;
+decode_vcard_tel_TEL_NUMBER_cdata(_val) -> _val.
+
+encode_vcard_tel_TEL_NUMBER_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_tel_TEL_NUMBER_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_tel_TEL_PREF({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_PREF(false, _acc) -> _acc;
+encode_vcard_tel_TEL_PREF(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PREF">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_PCS({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_PCS(false, _acc) -> _acc;
+encode_vcard_tel_TEL_PCS(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PCS">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_ISDN({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_ISDN(false, _acc) -> _acc;
+encode_vcard_tel_TEL_ISDN(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"ISDN">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_MODEM({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_MODEM(false, _acc) -> _acc;
+encode_vcard_tel_TEL_MODEM(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"MODEM">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_BBS({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_BBS(false, _acc) -> _acc;
+encode_vcard_tel_TEL_BBS(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"BBS">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_VIDEO({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_VIDEO(false, _acc) -> _acc;
+encode_vcard_tel_TEL_VIDEO(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"VIDEO">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_CELL({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_CELL(false, _acc) -> _acc;
+encode_vcard_tel_TEL_CELL(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"CELL">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_MSG({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_MSG(false, _acc) -> _acc;
+encode_vcard_tel_TEL_MSG(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"MSG">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_PAGER({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_PAGER(false, _acc) -> _acc;
+encode_vcard_tel_TEL_PAGER(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PAGER">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_FAX({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_FAX(false, _acc) -> _acc;
+encode_vcard_tel_TEL_FAX(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"FAX">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_VOICE({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_VOICE(false, _acc) -> _acc;
+encode_vcard_tel_TEL_VOICE(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"VOICE">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_WORK({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_WORK(false, _acc) -> _acc;
+encode_vcard_tel_TEL_WORK(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"WORK">>, _attrs, _els} | _acc].
+
+decode_vcard_tel_TEL_HOME({xmlel, _, _attrs, _els}) ->
+ true.
+
+encode_vcard_tel_TEL_HOME(false, _acc) -> _acc;
+encode_vcard_tel_TEL_HOME(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"HOME">>, _attrs, _els} | _acc].
+
+decode_vcard_email_EMAIL({xmlel, _, _attrs, _els}) ->
+ {Userid, X400, Pref, Internet, Work, Home} =
+ decode_vcard_email_EMAIL_els(_els, [], false, false,
+ false, false, false),
+ {vcard_email, Home, Work, Internet, Pref, X400, Userid}.
+
+decode_vcard_email_EMAIL_els([{xmlel, <<"USERID">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Userid, X400, Pref, Internet, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_email_EMAIL_els(_els,
+ [decode_vcard_email_EMAIL_USERID(_el)
+ | Userid],
+ X400, Pref, Internet, Work, Home);
+ _ ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ Internet, Work, Home)
+ end;
+decode_vcard_email_EMAIL_els([{xmlel, <<"X400">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Userid, X400, Pref, Internet, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_email_EMAIL_els(_els, Userid,
+ decode_vcard_email_EMAIL_X400(_el), Pref,
+ Internet, Work, Home);
+ _ ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ Internet, Work, Home)
+ end;
+decode_vcard_email_EMAIL_els([{xmlel, <<"PREF">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Userid, X400, Pref, Internet, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400,
+ decode_vcard_email_EMAIL_PREF(_el),
+ Internet, Work, Home);
+ _ ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ Internet, Work, Home)
+ end;
+decode_vcard_email_EMAIL_els([{xmlel, <<"INTERNET">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Userid, X400, Pref, Internet, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ decode_vcard_email_EMAIL_INTERNET(_el),
+ Work, Home);
+ _ ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ Internet, Work, Home)
+ end;
+decode_vcard_email_EMAIL_els([{xmlel, <<"WORK">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Userid, X400, Pref, Internet, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ Internet,
+ decode_vcard_email_EMAIL_WORK(_el),
+ Home);
+ _ ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ Internet, Work, Home)
+ end;
+decode_vcard_email_EMAIL_els([{xmlel, <<"HOME">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Userid, X400, Pref, Internet, Work, Home) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ Internet, Work,
+ decode_vcard_email_EMAIL_HOME(_el));
+ _ ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ Internet, Work, Home)
+ end;
+decode_vcard_email_EMAIL_els([_ | _els], Userid, X400,
+ Pref, Internet, Work, Home) ->
+ decode_vcard_email_EMAIL_els(_els, Userid, X400, Pref,
+ Internet, Work, Home);
+decode_vcard_email_EMAIL_els([], [Userid], X400, Pref,
+ Internet, Work, Home) ->
+ {Userid, X400, Pref, Internet, Work, Home}.
+
+encode_vcard_email_EMAIL([], _acc) -> _acc;
+encode_vcard_email_EMAIL([{vcard_email, Home, Work,
+ Internet, Pref, X400, Userid}
+ | _tail],
+ _acc) ->
+ _els = encode_vcard_email_EMAIL_HOME(Home,
+ encode_vcard_email_EMAIL_WORK(Work,
+ encode_vcard_email_EMAIL_INTERNET(Internet,
+ encode_vcard_email_EMAIL_PREF(Pref,
+ encode_vcard_email_EMAIL_X400(X400,
+ encode_vcard_email_EMAIL_USERID(Userid,
+ [])))))),
+ _attrs = [],
+ encode_vcard_email_EMAIL(_tail,
+ [{xmlel, <<"EMAIL">>, _attrs, _els} | _acc]).
+
+decode_vcard_email_EMAIL_USERID({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_vcard_email_EMAIL_USERID_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_email_EMAIL_USERID_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_email_EMAIL_USERID_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_email_EMAIL_USERID_els([_ | _els],
+ Cdata) ->
+ decode_vcard_email_EMAIL_USERID_els(_els, Cdata);
+decode_vcard_email_EMAIL_USERID_els([], Cdata) ->
+ decode_vcard_email_EMAIL_USERID_cdata(Cdata).
+
+encode_vcard_email_EMAIL_USERID(Cdata, _acc) ->
+ _els = encode_vcard_email_EMAIL_USERID_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"USERID">>, _attrs, _els} | _acc].
+
+decode_vcard_email_EMAIL_USERID_cdata(<<>>) ->
+ undefined;
+decode_vcard_email_EMAIL_USERID_cdata(_val) -> _val.
+
+encode_vcard_email_EMAIL_USERID_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_vcard_email_EMAIL_USERID_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_email_EMAIL_X400({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_email_EMAIL_X400(false, _acc) -> _acc;
+encode_vcard_email_EMAIL_X400(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"X400">>, _attrs, _els} | _acc].
+
+decode_vcard_email_EMAIL_PREF({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_email_EMAIL_PREF(false, _acc) -> _acc;
+encode_vcard_email_EMAIL_PREF(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PREF">>, _attrs, _els} | _acc].
+
+decode_vcard_email_EMAIL_INTERNET({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_email_EMAIL_INTERNET(false, _acc) -> _acc;
+encode_vcard_email_EMAIL_INTERNET(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"INTERNET">>, _attrs, _els} | _acc].
+
+decode_vcard_email_EMAIL_WORK({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_email_EMAIL_WORK(false, _acc) -> _acc;
+encode_vcard_email_EMAIL_WORK(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"WORK">>, _attrs, _els} | _acc].
+
+decode_vcard_email_EMAIL_HOME({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_vcard_email_EMAIL_HOME(false, _acc) -> _acc;
+encode_vcard_email_EMAIL_HOME(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"HOME">>, _attrs, _els} | _acc].
+
+decode_vcard_geo_GEO({xmlel, _, _attrs, _els}) ->
+ {Lon, Lat} = decode_vcard_geo_GEO_els(_els, [], []),
+ {vcard_geo, Lat, Lon}.
+
+decode_vcard_geo_GEO_els([{xmlel, <<"LON">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Lon, Lat) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_geo_GEO_els(_els,
+ [decode_vcard_geo_GEO_LON(_el) | Lon], Lat);
+ _ -> decode_vcard_geo_GEO_els(_els, Lon, Lat)
+ end;
+decode_vcard_geo_GEO_els([{xmlel, <<"LAT">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Lon, Lat) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_geo_GEO_els(_els, Lon,
+ [decode_vcard_geo_GEO_LAT(_el) | Lat]);
+ _ -> decode_vcard_geo_GEO_els(_els, Lon, Lat)
+ end;
+decode_vcard_geo_GEO_els([_ | _els], Lon, Lat) ->
+ decode_vcard_geo_GEO_els(_els, Lon, Lat);
+decode_vcard_geo_GEO_els([], [Lon], [Lat]) ->
+ {Lon, Lat}.
+
+encode_vcard_geo_GEO(undefined, _acc) -> _acc;
+encode_vcard_geo_GEO({vcard_geo, Lat, Lon}, _acc) ->
+ _els = encode_vcard_geo_GEO_LAT(Lat,
+ encode_vcard_geo_GEO_LON(Lon, [])),
+ _attrs = [],
+ [{xmlel, <<"GEO">>, _attrs, _els} | _acc].
+
+decode_vcard_geo_GEO_LON({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_geo_GEO_LON_els(_els, <<>>), Cdata.
+
+decode_vcard_geo_GEO_LON_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_geo_GEO_LON_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_geo_GEO_LON_els([_ | _els], Cdata) ->
+ decode_vcard_geo_GEO_LON_els(_els, Cdata);
+decode_vcard_geo_GEO_LON_els([], Cdata) ->
+ decode_vcard_geo_GEO_LON_cdata(Cdata).
+
+encode_vcard_geo_GEO_LON(Cdata, _acc) ->
+ _els = encode_vcard_geo_GEO_LON_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"LON">>, _attrs, _els} | _acc].
+
+decode_vcard_geo_GEO_LON_cdata(<<>>) -> undefined;
+decode_vcard_geo_GEO_LON_cdata(_val) -> _val.
+
+encode_vcard_geo_GEO_LON_cdata(undefined, _acc) -> _acc;
+encode_vcard_geo_GEO_LON_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_geo_GEO_LAT({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_geo_GEO_LAT_els(_els, <<>>), Cdata.
+
+decode_vcard_geo_GEO_LAT_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_geo_GEO_LAT_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_geo_GEO_LAT_els([_ | _els], Cdata) ->
+ decode_vcard_geo_GEO_LAT_els(_els, Cdata);
+decode_vcard_geo_GEO_LAT_els([], Cdata) ->
+ decode_vcard_geo_GEO_LAT_cdata(Cdata).
+
+encode_vcard_geo_GEO_LAT(Cdata, _acc) ->
+ _els = encode_vcard_geo_GEO_LAT_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"LAT">>, _attrs, _els} | _acc].
+
+decode_vcard_geo_GEO_LAT_cdata(<<>>) -> undefined;
+decode_vcard_geo_GEO_LAT_cdata(_val) -> _val.
+
+encode_vcard_geo_GEO_LAT_cdata(undefined, _acc) -> _acc;
+encode_vcard_geo_GEO_LAT_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_type_TYPE({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_type_TYPE_els(_els, <<>>), Cdata.
+
+decode_vcard_type_TYPE_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_type_TYPE_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_type_TYPE_els([_ | _els], Cdata) ->
+ decode_vcard_type_TYPE_els(_els, Cdata);
+decode_vcard_type_TYPE_els([], Cdata) ->
+ decode_vcard_type_TYPE_cdata(Cdata).
+
+encode_vcard_type_TYPE(undefined, _acc) -> _acc;
+encode_vcard_type_TYPE(Cdata, _acc) ->
+ _els = encode_vcard_type_TYPE_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"TYPE">>, _attrs, _els} | _acc].
+
+decode_vcard_type_TYPE_cdata(<<>>) -> undefined;
+decode_vcard_type_TYPE_cdata(_val) -> _val.
+
+encode_vcard_type_TYPE_cdata(undefined, _acc) -> _acc;
+encode_vcard_type_TYPE_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_binval_BINVAL({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_binval_BINVAL_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_binval_BINVAL_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_binval_BINVAL_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_binval_BINVAL_els([_ | _els], Cdata) ->
+ decode_vcard_binval_BINVAL_els(_els, Cdata);
+decode_vcard_binval_BINVAL_els([], Cdata) ->
+ decode_vcard_binval_BINVAL_cdata(Cdata).
+
+encode_vcard_binval_BINVAL(undefined, _acc) -> _acc;
+encode_vcard_binval_BINVAL(Cdata, _acc) ->
+ _els = encode_vcard_binval_BINVAL_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"BINVAL">>, _attrs, _els} | _acc].
+
+decode_vcard_binval_BINVAL_cdata(<<>>) -> undefined;
+decode_vcard_binval_BINVAL_cdata(_val) ->
+ case catch base64:decode(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_cdata_value, <<>>, <<"BINVAL">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_vcard_binval_BINVAL_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_binval_BINVAL_cdata(_val, _acc) ->
+ [{xmlcdata, base64:encode(_val)} | _acc].
+
+decode_vcard_extval_EXTVAL({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_extval_EXTVAL_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_extval_EXTVAL_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_extval_EXTVAL_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_extval_EXTVAL_els([_ | _els], Cdata) ->
+ decode_vcard_extval_EXTVAL_els(_els, Cdata);
+decode_vcard_extval_EXTVAL_els([], Cdata) ->
+ decode_vcard_extval_EXTVAL_cdata(Cdata).
+
+encode_vcard_extval_EXTVAL(undefined, _acc) -> _acc;
+encode_vcard_extval_EXTVAL(Cdata, _acc) ->
+ _els = encode_vcard_extval_EXTVAL_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"EXTVAL">>, _attrs, _els} | _acc].
+
+decode_vcard_extval_EXTVAL_cdata(<<>>) -> undefined;
+decode_vcard_extval_EXTVAL_cdata(_val) -> _val.
+
+encode_vcard_extval_EXTVAL_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_extval_EXTVAL_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_logo_LOGO({xmlel, _, _attrs, _els}) ->
+ {Extval, Binval, Type} =
+ decode_vcard_logo_LOGO_els(_els, undefined, undefined,
+ undefined),
+ {vcard_logo, Type, Binval, Extval}.
+
+decode_vcard_logo_LOGO_els([{xmlel, <<"EXTVAL">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Extval, Binval, Type) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_logo_LOGO_els(_els,
+ decode_vcard_extval_EXTVAL(_el), Binval,
+ Type);
+ _ ->
+ decode_vcard_logo_LOGO_els(_els, Extval, Binval, Type)
+ end;
+decode_vcard_logo_LOGO_els([{xmlel, <<"BINVAL">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Extval, Binval, Type) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_logo_LOGO_els(_els, Extval,
+ decode_vcard_binval_BINVAL(_el), Type);
+ _ ->
+ decode_vcard_logo_LOGO_els(_els, Extval, Binval, Type)
+ end;
+decode_vcard_logo_LOGO_els([{xmlel, <<"TYPE">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Extval, Binval, Type) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_logo_LOGO_els(_els, Extval, Binval,
+ decode_vcard_type_TYPE(_el));
+ _ ->
+ decode_vcard_logo_LOGO_els(_els, Extval, Binval, Type)
+ end;
+decode_vcard_logo_LOGO_els([_ | _els], Extval, Binval,
+ Type) ->
+ decode_vcard_logo_LOGO_els(_els, Extval, Binval, Type);
+decode_vcard_logo_LOGO_els([], Extval, Binval, Type) ->
+ {Extval, Binval, Type}.
+
+encode_vcard_logo_LOGO(undefined, _acc) -> _acc;
+encode_vcard_logo_LOGO({vcard_logo, Type, Binval,
+ Extval},
+ _acc) ->
+ _els = encode_vcard_type_TYPE(Type,
+ encode_vcard_binval_BINVAL(Binval,
+ encode_vcard_extval_EXTVAL(Extval,
+ []))),
+ _attrs = [],
+ [{xmlel, <<"LOGO">>, _attrs, _els} | _acc].
+
+decode_vcard_photo_PHOTO({xmlel, _, _attrs, _els}) ->
+ {Extval, Binval, Type} =
+ decode_vcard_photo_PHOTO_els(_els, undefined, undefined,
+ undefined),
+ {vcard_photo, Type, Binval, Extval}.
+
+decode_vcard_photo_PHOTO_els([{xmlel, <<"EXTVAL">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Extval, Binval, Type) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_photo_PHOTO_els(_els,
+ decode_vcard_extval_EXTVAL(_el), Binval,
+ Type);
+ _ ->
+ decode_vcard_photo_PHOTO_els(_els, Extval, Binval, Type)
+ end;
+decode_vcard_photo_PHOTO_els([{xmlel, <<"BINVAL">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Extval, Binval, Type) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_photo_PHOTO_els(_els, Extval,
+ decode_vcard_binval_BINVAL(_el), Type);
+ _ ->
+ decode_vcard_photo_PHOTO_els(_els, Extval, Binval, Type)
+ end;
+decode_vcard_photo_PHOTO_els([{xmlel, <<"TYPE">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Extval, Binval, Type) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_photo_PHOTO_els(_els, Extval, Binval,
+ decode_vcard_type_TYPE(_el));
+ _ ->
+ decode_vcard_photo_PHOTO_els(_els, Extval, Binval, Type)
+ end;
+decode_vcard_photo_PHOTO_els([_ | _els], Extval, Binval,
+ Type) ->
+ decode_vcard_photo_PHOTO_els(_els, Extval, Binval,
+ Type);
+decode_vcard_photo_PHOTO_els([], Extval, Binval,
+ Type) ->
+ {Extval, Binval, Type}.
+
+encode_vcard_photo_PHOTO(undefined, _acc) -> _acc;
+encode_vcard_photo_PHOTO({vcard_photo, Type, Binval,
+ Extval},
+ _acc) ->
+ _els = encode_vcard_type_TYPE(Type,
+ encode_vcard_binval_BINVAL(Binval,
+ encode_vcard_extval_EXTVAL(Extval,
+ []))),
+ _attrs = [],
+ [{xmlel, <<"PHOTO">>, _attrs, _els} | _acc].
+
+decode_vcard_org_ORG({xmlel, _, _attrs, _els}) ->
+ {Units, Name} = decode_vcard_org_ORG_els(_els, [], []),
+ {vcard_org, Name, Units}.
+
+decode_vcard_org_ORG_els([{xmlel, <<"ORGUNIT">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Units, Name) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_org_ORG_els(_els,
+ [decode_vcard_org_ORG_ORGUNIT(_el) | Units],
+ Name);
+ _ -> decode_vcard_org_ORG_els(_els, Units, Name)
+ end;
+decode_vcard_org_ORG_els([{xmlel, <<"ORGNAME">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Units, Name) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_org_ORG_els(_els, Units,
+ [decode_vcard_org_ORG_ORGNAME(_el) | Name]);
+ _ -> decode_vcard_org_ORG_els(_els, Units, Name)
+ end;
+decode_vcard_org_ORG_els([_ | _els], Units, Name) ->
+ decode_vcard_org_ORG_els(_els, Units, Name);
+decode_vcard_org_ORG_els([], Units, [Name]) ->
+ {lists:reverse(Units), Name}.
+
+encode_vcard_org_ORG(undefined, _acc) -> _acc;
+encode_vcard_org_ORG({vcard_org, Name, Units}, _acc) ->
+ _els = encode_vcard_org_ORG_ORGNAME(Name,
+ encode_vcard_org_ORG_ORGUNIT(Units,
+ [])),
+ _attrs = [],
+ [{xmlel, <<"ORG">>, _attrs, _els} | _acc].
+
+decode_vcard_org_ORG_ORGUNIT({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_vcard_org_ORG_ORGUNIT_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_org_ORG_ORGUNIT_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_org_ORG_ORGUNIT_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_org_ORG_ORGUNIT_els([_ | _els], Cdata) ->
+ decode_vcard_org_ORG_ORGUNIT_els(_els, Cdata);
+decode_vcard_org_ORG_ORGUNIT_els([], Cdata) ->
+ decode_vcard_org_ORG_ORGUNIT_cdata(Cdata).
+
+encode_vcard_org_ORG_ORGUNIT([], _acc) -> _acc;
+encode_vcard_org_ORG_ORGUNIT([Cdata | _tail], _acc) ->
+ _els = encode_vcard_org_ORG_ORGUNIT_cdata(Cdata, []),
+ _attrs = [],
+ encode_vcard_org_ORG_ORGUNIT(_tail,
+ [{xmlel, <<"ORGUNIT">>, _attrs, _els} | _acc]).
+
+decode_vcard_org_ORG_ORGUNIT_cdata(<<>>) -> undefined;
+decode_vcard_org_ORG_ORGUNIT_cdata(_val) -> _val.
+
+encode_vcard_org_ORG_ORGUNIT_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_org_ORG_ORGUNIT_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_org_ORG_ORGNAME({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_vcard_org_ORG_ORGNAME_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_org_ORG_ORGNAME_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_org_ORG_ORGNAME_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_org_ORG_ORGNAME_els([_ | _els], Cdata) ->
+ decode_vcard_org_ORG_ORGNAME_els(_els, Cdata);
+decode_vcard_org_ORG_ORGNAME_els([], Cdata) ->
+ decode_vcard_org_ORG_ORGNAME_cdata(Cdata).
+
+encode_vcard_org_ORG_ORGNAME(Cdata, _acc) ->
+ _els = encode_vcard_org_ORG_ORGNAME_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"ORGNAME">>, _attrs, _els} | _acc].
+
+decode_vcard_org_ORG_ORGNAME_cdata(<<>>) -> undefined;
+decode_vcard_org_ORG_ORGNAME_cdata(_val) -> _val.
+
+encode_vcard_org_ORG_ORGNAME_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_org_ORG_ORGNAME_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_sound_SOUND({xmlel, _, _attrs, _els}) ->
+ {Extval, Binval, Phonetic} =
+ decode_vcard_sound_SOUND_els(_els, undefined, undefined,
+ undefined),
+ {vcard_sound, Phonetic, Binval, Extval}.
+
+decode_vcard_sound_SOUND_els([{xmlel, <<"EXTVAL">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Extval, Binval, Phonetic) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_sound_SOUND_els(_els,
+ decode_vcard_extval_EXTVAL(_el), Binval,
+ Phonetic);
+ _ ->
+ decode_vcard_sound_SOUND_els(_els, Extval, Binval,
+ Phonetic)
+ end;
+decode_vcard_sound_SOUND_els([{xmlel, <<"BINVAL">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Extval, Binval, Phonetic) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_sound_SOUND_els(_els, Extval,
+ decode_vcard_binval_BINVAL(_el),
+ Phonetic);
+ _ ->
+ decode_vcard_sound_SOUND_els(_els, Extval, Binval,
+ Phonetic)
+ end;
+decode_vcard_sound_SOUND_els([{xmlel, <<"PHONETIC">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Extval, Binval, Phonetic) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_sound_SOUND_els(_els, Extval, Binval,
+ decode_vcard_sound_SOUND_PHONETIC(_el));
+ _ ->
+ decode_vcard_sound_SOUND_els(_els, Extval, Binval,
+ Phonetic)
+ end;
+decode_vcard_sound_SOUND_els([_ | _els], Extval, Binval,
+ Phonetic) ->
+ decode_vcard_sound_SOUND_els(_els, Extval, Binval,
+ Phonetic);
+decode_vcard_sound_SOUND_els([], Extval, Binval,
+ Phonetic) ->
+ {Extval, Binval, Phonetic}.
+
+encode_vcard_sound_SOUND(undefined, _acc) -> _acc;
+encode_vcard_sound_SOUND({vcard_sound, Phonetic, Binval,
+ Extval},
+ _acc) ->
+ _els = encode_vcard_sound_SOUND_PHONETIC(Phonetic,
+ encode_vcard_binval_BINVAL(Binval,
+ encode_vcard_extval_EXTVAL(Extval,
+ []))),
+ _attrs = [],
+ [{xmlel, <<"SOUND">>, _attrs, _els} | _acc].
+
+decode_vcard_sound_SOUND_PHONETIC({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_vcard_sound_SOUND_PHONETIC_els(_els,
+ <<>>),
+ Cdata.
+
+decode_vcard_sound_SOUND_PHONETIC_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_sound_SOUND_PHONETIC_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_sound_SOUND_PHONETIC_els([_ | _els],
+ Cdata) ->
+ decode_vcard_sound_SOUND_PHONETIC_els(_els, Cdata);
+decode_vcard_sound_SOUND_PHONETIC_els([], Cdata) ->
+ decode_vcard_sound_SOUND_PHONETIC_cdata(Cdata).
+
+encode_vcard_sound_SOUND_PHONETIC(undefined, _acc) ->
+ _acc;
+encode_vcard_sound_SOUND_PHONETIC(Cdata, _acc) ->
+ _els = encode_vcard_sound_SOUND_PHONETIC_cdata(Cdata,
+ []),
+ _attrs = [],
+ [{xmlel, <<"PHONETIC">>, _attrs, _els} | _acc].
+
+decode_vcard_sound_SOUND_PHONETIC_cdata(<<>>) ->
+ undefined;
+decode_vcard_sound_SOUND_PHONETIC_cdata(_val) -> _val.
+
+encode_vcard_sound_SOUND_PHONETIC_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_vcard_sound_SOUND_PHONETIC_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_key_KEY({xmlel, _, _attrs, _els}) ->
+ {Cred, Type} = decode_vcard_key_KEY_els(_els, [],
+ undefined),
+ {vcard_key, Type, Cred}.
+
+decode_vcard_key_KEY_els([{xmlel, <<"CRED">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Cred, Type) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_key_KEY_els(_els,
+ [decode_vcard_key_KEY_CRED(_el) | Cred],
+ Type);
+ _ -> decode_vcard_key_KEY_els(_els, Cred, Type)
+ end;
+decode_vcard_key_KEY_els([{xmlel, <<"TYPE">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Cred, Type) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_key_KEY_els(_els, Cred,
+ decode_vcard_type_TYPE(_el));
+ _ -> decode_vcard_key_KEY_els(_els, Cred, Type)
+ end;
+decode_vcard_key_KEY_els([_ | _els], Cred, Type) ->
+ decode_vcard_key_KEY_els(_els, Cred, Type);
+decode_vcard_key_KEY_els([], [Cred], Type) ->
+ {Cred, Type}.
+
+encode_vcard_key_KEY(undefined, _acc) -> _acc;
+encode_vcard_key_KEY({vcard_key, Type, Cred}, _acc) ->
+ _els = encode_vcard_type_TYPE(Type,
+ encode_vcard_key_KEY_CRED(Cred, [])),
+ _attrs = [],
+ [{xmlel, <<"KEY">>, _attrs, _els} | _acc].
+
+decode_vcard_key_KEY_CRED({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_key_KEY_CRED_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_key_KEY_CRED_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_key_KEY_CRED_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_key_KEY_CRED_els([_ | _els], Cdata) ->
+ decode_vcard_key_KEY_CRED_els(_els, Cdata);
+decode_vcard_key_KEY_CRED_els([], Cdata) ->
+ decode_vcard_key_KEY_CRED_cdata(Cdata).
+
+encode_vcard_key_KEY_CRED(Cdata, _acc) ->
+ _els = encode_vcard_key_KEY_CRED_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"CRED">>, _attrs, _els} | _acc].
+
+decode_vcard_key_KEY_CRED_cdata(<<>>) -> undefined;
+decode_vcard_key_KEY_CRED_cdata(_val) -> _val.
+
+encode_vcard_key_KEY_CRED_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_key_KEY_CRED_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard({xmlel, _, _attrs, _els}) ->
+ {Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version} =
+ decode_vcard_vCard_els(_els, undefined, undefined,
+ undefined, undefined, undefined, undefined,
+ undefined, undefined, undefined, undefined, [],
+ undefined, undefined, undefined, undefined,
+ undefined, undefined, undefined, undefined, [],
+ [], [], [], undefined, undefined, undefined,
+ undefined, undefined, undefined),
+ {vcard, Version, Fn, N, Nickname, Photo, Bday, Adr,
+ Label, Tel, Email, Jabberid, Mailer, Tz, Geo, Title,
+ Role, Logo, Org, Categories, Note, Prodid, Rev,
+ Sort_string, Sound, Uid, Url, Class, Key, Desc}.
+
+decode_vcard_vCard_els([{xmlel, <<"DESC">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els,
+ decode_vcard_vCard_DESC(_el), Key, Class, Url,
+ Uid, Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"KEY">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc,
+ decode_vcard_key_KEY(_el), Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"CLASS">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key,
+ decode_vcard_vCard_CLASS(_el), Url, Uid, Sound,
+ Sort_string, Rev, Prodid, Note, Categories,
+ Org, Logo, Role, Title, Geo, Tz, Mailer,
+ Jabberid, Email, Tel, Label, Adr, Bday, Photo,
+ Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"URL">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class,
+ decode_vcard_vCard_URL(_el), Uid, Sound,
+ Sort_string, Rev, Prodid, Note, Categories,
+ Org, Logo, Role, Title, Geo, Tz, Mailer,
+ Jabberid, Email, Tel, Label, Adr, Bday, Photo,
+ Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"UID">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url,
+ decode_vcard_vCard_UID(_el), Sound,
+ Sort_string, Rev, Prodid, Note, Categories,
+ Org, Logo, Role, Title, Geo, Tz, Mailer,
+ Jabberid, Email, Tel, Label, Adr, Bday, Photo,
+ Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"SOUND">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ decode_vcard_sound_SOUND(_el), Sort_string,
+ Rev, Prodid, Note, Categories, Org, Logo, Role,
+ Title, Geo, Tz, Mailer, Jabberid, Email, Tel,
+ Label, Adr, Bday, Photo, Nickname, N, Fn,
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"SORT-STRING">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, 'decode_vcard_vCard_SORT-STRING'(_el),
+ Rev, Prodid, Note, Categories, Org, Logo, Role,
+ Title, Geo, Tz, Mailer, Jabberid, Email, Tel,
+ Label, Adr, Bday, Photo, Nickname, N, Fn,
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"REV">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string,
+ decode_vcard_vCard_REV(_el), Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"PRODID">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev,
+ decode_vcard_vCard_PRODID(_el), Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"NOTE">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid,
+ decode_vcard_vCard_NOTE(_el), Categories, Org,
+ Logo, Role, Title, Geo, Tz, Mailer, Jabberid,
+ Email, Tel, Label, Adr, Bday, Photo, Nickname,
+ N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"CATEGORIES">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ decode_vcard_vCard_CATEGORIES(_el), Org, Logo,
+ Role, Title, Geo, Tz, Mailer, Jabberid, Email,
+ Tel, Label, Adr, Bday, Photo, Nickname, N, Fn,
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"ORG">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, decode_vcard_org_ORG(_el), Logo,
+ Role, Title, Geo, Tz, Mailer, Jabberid, Email,
+ Tel, Label, Adr, Bday, Photo, Nickname, N, Fn,
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"LOGO">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, decode_vcard_logo_LOGO(_el),
+ Role, Title, Geo, Tz, Mailer, Jabberid, Email,
+ Tel, Label, Adr, Bday, Photo, Nickname, N, Fn,
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"ROLE">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo,
+ decode_vcard_vCard_ROLE(_el), Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"TITLE">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role,
+ decode_vcard_vCard_TITLE(_el), Geo, Tz, Mailer,
+ Jabberid, Email, Tel, Label, Adr, Bday, Photo,
+ Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"GEO">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title,
+ decode_vcard_geo_GEO(_el), Tz, Mailer,
+ Jabberid, Email, Tel, Label, Adr, Bday, Photo,
+ Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"TZ">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo,
+ decode_vcard_vCard_TZ(_el), Mailer, Jabberid,
+ Email, Tel, Label, Adr, Bday, Photo, Nickname,
+ N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"MAILER">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ decode_vcard_vCard_MAILER(_el), Jabberid,
+ Email, Tel, Label, Adr, Bday, Photo, Nickname,
+ N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"JABBERID">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, decode_vcard_vCard_JABBERID(_el),
+ Email, Tel, Label, Adr, Bday, Photo, Nickname,
+ N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"EMAIL">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid,
+ [decode_vcard_email_EMAIL(_el) | Email], Tel,
+ Label, Adr, Bday, Photo, Nickname, N, Fn,
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"TEL">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email,
+ [decode_vcard_tel_TEL(_el) | Tel], Label, Adr,
+ Bday, Photo, Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"LABEL">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel,
+ [decode_vcard_label_LABEL(_el) | Label], Adr,
+ Bday, Photo, Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"ADR">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label,
+ [decode_vcard_adr_ADR(_el) | Adr], Bday, Photo,
+ Nickname, N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"BDAY">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr,
+ decode_vcard_vCard_BDAY(_el), Photo, Nickname,
+ N, Fn, Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"PHOTO">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ decode_vcard_photo_PHOTO(_el), Nickname, N, Fn,
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"NICKNAME">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, decode_vcard_vCard_NICKNAME(_el), N, Fn,
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"N">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, decode_vcard_name_N(_el), Fn,
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"FN">>, _attrs, _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, decode_vcard_vCard_FN(_el),
+ Version);
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([{xmlel, <<"VERSION">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn,
+ decode_vcard_vCard_VERSION(_el));
+ _ ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz,
+ Mailer, Jabberid, Email, Tel, Label, Adr, Bday,
+ Photo, Nickname, N, Fn, Version)
+ end;
+decode_vcard_vCard_els([_ | _els], Desc, Key, Class,
+ Url, Uid, Sound, Sort_string, Rev, Prodid, Note,
+ Categories, Org, Logo, Role, Title, Geo, Tz, Mailer,
+ Jabberid, Email, Tel, Label, Adr, Bday, Photo, Nickname,
+ N, Fn, Version) ->
+ decode_vcard_vCard_els(_els, Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note, Categories,
+ Org, Logo, Role, Title, Geo, Tz, Mailer, Jabberid,
+ Email, Tel, Label, Adr, Bday, Photo, Nickname, N, Fn,
+ Version);
+decode_vcard_vCard_els([], Desc, Key, Class, Url, Uid,
+ Sound, Sort_string, Rev, Prodid, Note, Categories, Org,
+ Logo, Role, Title, Geo, Tz, Mailer, Jabberid, Email,
+ Tel, Label, Adr, Bday, Photo, Nickname, N, Fn,
+ Version) ->
+ {Desc, Key, Class, Url, Uid, Sound, Sort_string, Rev,
+ Prodid, Note, Categories, Org, Logo, Role, Title, Geo,
+ Tz, Mailer, Jabberid, lists:reverse(Email),
+ lists:reverse(Tel), lists:reverse(Label),
+ lists:reverse(Adr), Bday, Photo, Nickname, N, Fn,
+ Version}.
+
+encode_vcard_vCard(undefined, _acc) -> _acc;
+encode_vcard_vCard({vcard, Version, Fn, N, Nickname,
+ Photo, Bday, Adr, Label, Tel, Email, Jabberid, Mailer,
+ Tz, Geo, Title, Role, Logo, Org, Categories, Note,
+ Prodid, Rev, Sort_string, Sound, Uid, Url, Class, Key,
+ Desc},
+ _acc) ->
+ _els = encode_vcard_vCard_VERSION(Version,
+ encode_vcard_vCard_FN(Fn,
+ encode_vcard_name_N(N,
+ encode_vcard_vCard_NICKNAME(Nickname,
+ encode_vcard_photo_PHOTO(Photo,
+ encode_vcard_vCard_BDAY(Bday,
+ encode_vcard_adr_ADR(Adr,
+ encode_vcard_label_LABEL(Label,
+ encode_vcard_tel_TEL(Tel,
+ encode_vcard_email_EMAIL(Email,
+ encode_vcard_vCard_JABBERID(Jabberid,
+ encode_vcard_vCard_MAILER(Mailer,
+ encode_vcard_vCard_TZ(Tz,
+ encode_vcard_geo_GEO(Geo,
+ encode_vcard_vCard_TITLE(Title,
+ encode_vcard_vCard_ROLE(Role,
+ encode_vcard_logo_LOGO(Logo,
+ encode_vcard_org_ORG(Org,
+ encode_vcard_vCard_CATEGORIES(Categories,
+ encode_vcard_vCard_NOTE(Note,
+ encode_vcard_vCard_PRODID(Prodid,
+ encode_vcard_vCard_REV(Rev,
+ 'encode_vcard_vCard_SORT-STRING'(Sort_string,
+ encode_vcard_sound_SOUND(Sound,
+ encode_vcard_vCard_UID(Uid,
+ encode_vcard_vCard_URL(Url,
+ encode_vcard_vCard_CLASS(Class,
+ encode_vcard_key_KEY(Key,
+ encode_vcard_vCard_DESC(Desc,
+ []))))))))))))))))))))))))))))),
+ _attrs = [{<<"xmlns">>, <<"vcard-temp">>}],
+ [{xmlel, <<"vCard">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_DESC({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_DESC_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_DESC_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_DESC_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_DESC_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_DESC_els(_els, Cdata);
+decode_vcard_vCard_DESC_els([], Cdata) ->
+ decode_vcard_vCard_DESC_cdata(Cdata).
+
+encode_vcard_vCard_DESC(undefined, _acc) -> _acc;
+encode_vcard_vCard_DESC(Cdata, _acc) ->
+ _els = encode_vcard_vCard_DESC_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"DESC">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_DESC_cdata(<<>>) -> undefined;
+decode_vcard_vCard_DESC_cdata(_val) -> _val.
+
+encode_vcard_vCard_DESC_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_DESC_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_CLASS({xmlel, _, _attrs, _els}) ->
+ Value = decode_vcard_vCard_CLASS_els(_els, undefined),
+ Value.
+
+decode_vcard_vCard_CLASS_els([{xmlel,
+ <<"CONFIDENTIAL">>, _attrs, _} =
+ _el
+ | _els],
+ Value) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_CLASS_els(_els,
+ decode_vcard_vCard_CLASS_CONFIDENTIAL(_el));
+ _ -> decode_vcard_vCard_CLASS_els(_els, Value)
+ end;
+decode_vcard_vCard_CLASS_els([{xmlel, <<"PRIVATE">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Value) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_CLASS_els(_els,
+ decode_vcard_vCard_CLASS_PRIVATE(_el));
+ _ -> decode_vcard_vCard_CLASS_els(_els, Value)
+ end;
+decode_vcard_vCard_CLASS_els([{xmlel, <<"PUBLIC">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Value) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_CLASS_els(_els,
+ decode_vcard_vCard_CLASS_PUBLIC(_el));
+ _ -> decode_vcard_vCard_CLASS_els(_els, Value)
+ end;
+decode_vcard_vCard_CLASS_els([_ | _els], Value) ->
+ decode_vcard_vCard_CLASS_els(_els, Value);
+decode_vcard_vCard_CLASS_els([], Value) -> Value.
+
+'encode_vcard_vCard_CLASS_$value'(undefined, _acc) ->
+ _acc;
+'encode_vcard_vCard_CLASS_$value'(confidential = _r,
+ _acc) ->
+ encode_vcard_vCard_CLASS_CONFIDENTIAL(_r, _acc);
+'encode_vcard_vCard_CLASS_$value'(private = _r, _acc) ->
+ encode_vcard_vCard_CLASS_PRIVATE(_r, _acc);
+'encode_vcard_vCard_CLASS_$value'(public = _r, _acc) ->
+ encode_vcard_vCard_CLASS_PUBLIC(_r, _acc).
+
+encode_vcard_vCard_CLASS(undefined, _acc) -> _acc;
+encode_vcard_vCard_CLASS(Value, _acc) ->
+ _els = 'encode_vcard_vCard_CLASS_$value'(Value, []),
+ _attrs = [],
+ [{xmlel, <<"CLASS">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_CLASS_CONFIDENTIAL({xmlel, _, _attrs,
+ _els}) ->
+ confidential.
+
+encode_vcard_vCard_CLASS_CONFIDENTIAL(undefined,
+ _acc) ->
+ _acc;
+encode_vcard_vCard_CLASS_CONFIDENTIAL(confidential,
+ _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"CONFIDENTIAL">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_CLASS_PRIVATE({xmlel, _, _attrs,
+ _els}) ->
+ private.
+
+encode_vcard_vCard_CLASS_PRIVATE(undefined, _acc) ->
+ _acc;
+encode_vcard_vCard_CLASS_PRIVATE(private, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PRIVATE">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_CLASS_PUBLIC({xmlel, _, _attrs,
+ _els}) ->
+ public.
+
+encode_vcard_vCard_CLASS_PUBLIC(undefined, _acc) ->
+ _acc;
+encode_vcard_vCard_CLASS_PUBLIC(public, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"PUBLIC">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_URL({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_URL_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_URL_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_URL_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_URL_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_URL_els(_els, Cdata);
+decode_vcard_vCard_URL_els([], Cdata) ->
+ decode_vcard_vCard_URL_cdata(Cdata).
+
+encode_vcard_vCard_URL(undefined, _acc) -> _acc;
+encode_vcard_vCard_URL(Cdata, _acc) ->
+ _els = encode_vcard_vCard_URL_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"URL">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_URL_cdata(<<>>) -> undefined;
+decode_vcard_vCard_URL_cdata(_val) -> _val.
+
+encode_vcard_vCard_URL_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_URL_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_UID({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_UID_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_UID_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_UID_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_UID_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_UID_els(_els, Cdata);
+decode_vcard_vCard_UID_els([], Cdata) ->
+ decode_vcard_vCard_UID_cdata(Cdata).
+
+encode_vcard_vCard_UID(undefined, _acc) -> _acc;
+encode_vcard_vCard_UID(Cdata, _acc) ->
+ _els = encode_vcard_vCard_UID_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"UID">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_UID_cdata(<<>>) -> undefined;
+decode_vcard_vCard_UID_cdata(_val) -> _val.
+
+encode_vcard_vCard_UID_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_UID_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+'decode_vcard_vCard_SORT-STRING'({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = 'decode_vcard_vCard_SORT-STRING_els'(_els,
+ <<>>),
+ Cdata.
+
+'decode_vcard_vCard_SORT-STRING_els'([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ 'decode_vcard_vCard_SORT-STRING_els'(_els,
+ <<Cdata/binary, _data/binary>>);
+'decode_vcard_vCard_SORT-STRING_els'([_ | _els],
+ Cdata) ->
+ 'decode_vcard_vCard_SORT-STRING_els'(_els, Cdata);
+'decode_vcard_vCard_SORT-STRING_els'([], Cdata) ->
+ 'decode_vcard_vCard_SORT-STRING_cdata'(Cdata).
+
+'encode_vcard_vCard_SORT-STRING'(undefined, _acc) ->
+ _acc;
+'encode_vcard_vCard_SORT-STRING'(Cdata, _acc) ->
+ _els = 'encode_vcard_vCard_SORT-STRING_cdata'(Cdata,
+ []),
+ _attrs = [],
+ [{xmlel, <<"SORT-STRING">>, _attrs, _els} | _acc].
+
+'decode_vcard_vCard_SORT-STRING_cdata'(<<>>) ->
+ undefined;
+'decode_vcard_vCard_SORT-STRING_cdata'(_val) -> _val.
+
+'encode_vcard_vCard_SORT-STRING_cdata'(undefined,
+ _acc) ->
+ _acc;
+'encode_vcard_vCard_SORT-STRING_cdata'(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_REV({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_REV_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_REV_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_REV_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_REV_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_REV_els(_els, Cdata);
+decode_vcard_vCard_REV_els([], Cdata) ->
+ decode_vcard_vCard_REV_cdata(Cdata).
+
+encode_vcard_vCard_REV(undefined, _acc) -> _acc;
+encode_vcard_vCard_REV(Cdata, _acc) ->
+ _els = encode_vcard_vCard_REV_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"REV">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_REV_cdata(<<>>) -> undefined;
+decode_vcard_vCard_REV_cdata(_val) -> _val.
+
+encode_vcard_vCard_REV_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_REV_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_PRODID({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_PRODID_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_vCard_PRODID_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_vCard_PRODID_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_PRODID_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_PRODID_els(_els, Cdata);
+decode_vcard_vCard_PRODID_els([], Cdata) ->
+ decode_vcard_vCard_PRODID_cdata(Cdata).
+
+encode_vcard_vCard_PRODID(undefined, _acc) -> _acc;
+encode_vcard_vCard_PRODID(Cdata, _acc) ->
+ _els = encode_vcard_vCard_PRODID_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"PRODID">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_PRODID_cdata(<<>>) -> undefined;
+decode_vcard_vCard_PRODID_cdata(_val) -> _val.
+
+encode_vcard_vCard_PRODID_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_vCard_PRODID_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_NOTE({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_NOTE_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_NOTE_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_NOTE_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_NOTE_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_NOTE_els(_els, Cdata);
+decode_vcard_vCard_NOTE_els([], Cdata) ->
+ decode_vcard_vCard_NOTE_cdata(Cdata).
+
+encode_vcard_vCard_NOTE(undefined, _acc) -> _acc;
+encode_vcard_vCard_NOTE(Cdata, _acc) ->
+ _els = encode_vcard_vCard_NOTE_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"NOTE">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_NOTE_cdata(<<>>) -> undefined;
+decode_vcard_vCard_NOTE_cdata(_val) -> _val.
+
+encode_vcard_vCard_NOTE_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_NOTE_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_CATEGORIES({xmlel, _, _attrs,
+ _els}) ->
+ Keywords = decode_vcard_vCard_CATEGORIES_els(_els, []),
+ Keywords.
+
+decode_vcard_vCard_CATEGORIES_els([{xmlel,
+ <<"KEYWORD">>, _attrs, _} =
+ _el
+ | _els],
+ Keywords) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_vcard_vCard_CATEGORIES_els(_els,
+ [decode_vcard_vCard_CATEGORIES_KEYWORD(_el)
+ | Keywords]);
+ _ -> decode_vcard_vCard_CATEGORIES_els(_els, Keywords)
+ end;
+decode_vcard_vCard_CATEGORIES_els([_ | _els],
+ Keywords) ->
+ decode_vcard_vCard_CATEGORIES_els(_els, Keywords);
+decode_vcard_vCard_CATEGORIES_els([], Keywords) ->
+ lists:reverse(Keywords).
+
+encode_vcard_vCard_CATEGORIES([], _acc) -> _acc;
+encode_vcard_vCard_CATEGORIES(Keywords, _acc) ->
+ _els = encode_vcard_vCard_CATEGORIES_KEYWORD(Keywords,
+ []),
+ _attrs = [],
+ [{xmlel, <<"CATEGORIES">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_CATEGORIES_KEYWORD({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_vcard_vCard_CATEGORIES_KEYWORD_els(_els,
+ <<>>),
+ Cdata.
+
+decode_vcard_vCard_CATEGORIES_KEYWORD_els([{xmlcdata,
+ _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_vCard_CATEGORIES_KEYWORD_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_CATEGORIES_KEYWORD_els([_ | _els],
+ Cdata) ->
+ decode_vcard_vCard_CATEGORIES_KEYWORD_els(_els, Cdata);
+decode_vcard_vCard_CATEGORIES_KEYWORD_els([], Cdata) ->
+ decode_vcard_vCard_CATEGORIES_KEYWORD_cdata(Cdata).
+
+encode_vcard_vCard_CATEGORIES_KEYWORD([], _acc) -> _acc;
+encode_vcard_vCard_CATEGORIES_KEYWORD([Cdata | _tail],
+ _acc) ->
+ _els =
+ encode_vcard_vCard_CATEGORIES_KEYWORD_cdata(Cdata, []),
+ _attrs = [],
+ encode_vcard_vCard_CATEGORIES_KEYWORD(_tail,
+ [{xmlel, <<"KEYWORD">>, _attrs, _els}
+ | _acc]).
+
+decode_vcard_vCard_CATEGORIES_KEYWORD_cdata(<<>>) ->
+ undefined;
+decode_vcard_vCard_CATEGORIES_KEYWORD_cdata(_val) ->
+ _val.
+
+encode_vcard_vCard_CATEGORIES_KEYWORD_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_vcard_vCard_CATEGORIES_KEYWORD_cdata(_val,
+ _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_ROLE({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_ROLE_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_ROLE_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_ROLE_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_ROLE_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_ROLE_els(_els, Cdata);
+decode_vcard_vCard_ROLE_els([], Cdata) ->
+ decode_vcard_vCard_ROLE_cdata(Cdata).
+
+encode_vcard_vCard_ROLE(undefined, _acc) -> _acc;
+encode_vcard_vCard_ROLE(Cdata, _acc) ->
+ _els = encode_vcard_vCard_ROLE_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"ROLE">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_ROLE_cdata(<<>>) -> undefined;
+decode_vcard_vCard_ROLE_cdata(_val) -> _val.
+
+encode_vcard_vCard_ROLE_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_ROLE_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_TITLE({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_TITLE_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_TITLE_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_TITLE_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_TITLE_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_TITLE_els(_els, Cdata);
+decode_vcard_vCard_TITLE_els([], Cdata) ->
+ decode_vcard_vCard_TITLE_cdata(Cdata).
+
+encode_vcard_vCard_TITLE(undefined, _acc) -> _acc;
+encode_vcard_vCard_TITLE(Cdata, _acc) ->
+ _els = encode_vcard_vCard_TITLE_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"TITLE">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_TITLE_cdata(<<>>) -> undefined;
+decode_vcard_vCard_TITLE_cdata(_val) -> _val.
+
+encode_vcard_vCard_TITLE_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_TITLE_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_TZ({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_TZ_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_TZ_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_TZ_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_TZ_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_TZ_els(_els, Cdata);
+decode_vcard_vCard_TZ_els([], Cdata) ->
+ decode_vcard_vCard_TZ_cdata(Cdata).
+
+encode_vcard_vCard_TZ(undefined, _acc) -> _acc;
+encode_vcard_vCard_TZ(Cdata, _acc) ->
+ _els = encode_vcard_vCard_TZ_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"TZ">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_TZ_cdata(<<>>) -> undefined;
+decode_vcard_vCard_TZ_cdata(_val) -> _val.
+
+encode_vcard_vCard_TZ_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_TZ_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_MAILER({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_MAILER_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_vCard_MAILER_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_vCard_MAILER_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_MAILER_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_MAILER_els(_els, Cdata);
+decode_vcard_vCard_MAILER_els([], Cdata) ->
+ decode_vcard_vCard_MAILER_cdata(Cdata).
+
+encode_vcard_vCard_MAILER(undefined, _acc) -> _acc;
+encode_vcard_vCard_MAILER(Cdata, _acc) ->
+ _els = encode_vcard_vCard_MAILER_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"MAILER">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_MAILER_cdata(<<>>) -> undefined;
+decode_vcard_vCard_MAILER_cdata(_val) -> _val.
+
+encode_vcard_vCard_MAILER_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_vCard_MAILER_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_JABBERID({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_JABBERID_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_vCard_JABBERID_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_vCard_JABBERID_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_JABBERID_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_JABBERID_els(_els, Cdata);
+decode_vcard_vCard_JABBERID_els([], Cdata) ->
+ decode_vcard_vCard_JABBERID_cdata(Cdata).
+
+encode_vcard_vCard_JABBERID(undefined, _acc) -> _acc;
+encode_vcard_vCard_JABBERID(Cdata, _acc) ->
+ _els = encode_vcard_vCard_JABBERID_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"JABBERID">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_JABBERID_cdata(<<>>) -> undefined;
+decode_vcard_vCard_JABBERID_cdata(_val) -> _val.
+
+encode_vcard_vCard_JABBERID_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_vCard_JABBERID_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_BDAY({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_BDAY_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_BDAY_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_BDAY_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_BDAY_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_BDAY_els(_els, Cdata);
+decode_vcard_vCard_BDAY_els([], Cdata) ->
+ decode_vcard_vCard_BDAY_cdata(Cdata).
+
+encode_vcard_vCard_BDAY(undefined, _acc) -> _acc;
+encode_vcard_vCard_BDAY(Cdata, _acc) ->
+ _els = encode_vcard_vCard_BDAY_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"BDAY">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_BDAY_cdata(<<>>) -> undefined;
+decode_vcard_vCard_BDAY_cdata(_val) -> _val.
+
+encode_vcard_vCard_BDAY_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_BDAY_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_NICKNAME({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_NICKNAME_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_vCard_NICKNAME_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_vCard_NICKNAME_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_NICKNAME_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_NICKNAME_els(_els, Cdata);
+decode_vcard_vCard_NICKNAME_els([], Cdata) ->
+ decode_vcard_vCard_NICKNAME_cdata(Cdata).
+
+encode_vcard_vCard_NICKNAME(undefined, _acc) -> _acc;
+encode_vcard_vCard_NICKNAME(Cdata, _acc) ->
+ _els = encode_vcard_vCard_NICKNAME_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"NICKNAME">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_NICKNAME_cdata(<<>>) -> undefined;
+decode_vcard_vCard_NICKNAME_cdata(_val) -> _val.
+
+encode_vcard_vCard_NICKNAME_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_vCard_NICKNAME_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_FN({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_FN_els(_els, <<>>), Cdata.
+
+decode_vcard_vCard_FN_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_vcard_vCard_FN_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_FN_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_FN_els(_els, Cdata);
+decode_vcard_vCard_FN_els([], Cdata) ->
+ decode_vcard_vCard_FN_cdata(Cdata).
+
+encode_vcard_vCard_FN(undefined, _acc) -> _acc;
+encode_vcard_vCard_FN(Cdata, _acc) ->
+ _els = encode_vcard_vCard_FN_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"FN">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_FN_cdata(<<>>) -> undefined;
+decode_vcard_vCard_FN_cdata(_val) -> _val.
+
+encode_vcard_vCard_FN_cdata(undefined, _acc) -> _acc;
+encode_vcard_vCard_FN_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_vcard_vCard_VERSION({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_vcard_vCard_VERSION_els(_els, <<>>),
+ Cdata.
+
+decode_vcard_vCard_VERSION_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_vcard_vCard_VERSION_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_vcard_vCard_VERSION_els([_ | _els], Cdata) ->
+ decode_vcard_vCard_VERSION_els(_els, Cdata);
+decode_vcard_vCard_VERSION_els([], Cdata) ->
+ decode_vcard_vCard_VERSION_cdata(Cdata).
+
+encode_vcard_vCard_VERSION(undefined, _acc) -> _acc;
+encode_vcard_vCard_VERSION(Cdata, _acc) ->
+ _els = encode_vcard_vCard_VERSION_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"VERSION">>, _attrs, _els} | _acc].
+
+decode_vcard_vCard_VERSION_cdata(<<>>) -> undefined;
+decode_vcard_vCard_VERSION_cdata(_val) -> _val.
+
+encode_vcard_vCard_VERSION_cdata(undefined, _acc) ->
+ _acc;
+encode_vcard_vCard_VERSION_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_xfield_field({xmlel, _, _attrs, _els}) ->
+ {Var, Type, Label} = decode_xfield_field_attrs(_attrs,
+ undefined, undefined,
+ undefined),
+ {Options, Values, Desc, Required} =
+ decode_xfield_field_els(_els, [], [], undefined, false),
+ {xfield, Label, Type, Var, Required, Desc, Values,
+ Options}.
+
+decode_xfield_field_els([{xmlel, <<"option">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Options, Values, Desc, Required) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xfield_field_els(_els,
+ [decode_xfield_field_option(_el) | Options],
+ Values, Desc, Required);
+ _ ->
+ decode_xfield_field_els(_els, Options, Values, Desc,
+ Required)
+ end;
+decode_xfield_field_els([{xmlel, <<"value">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Options, Values, Desc, Required) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xfield_field_els(_els, Options,
+ [decode_xfield_field_value(_el) | Values],
+ Desc, Required);
+ _ ->
+ decode_xfield_field_els(_els, Options, Values, Desc,
+ Required)
+ end;
+decode_xfield_field_els([{xmlel, <<"desc">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Options, Values, Desc, Required) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xfield_field_els(_els, Options, Values,
+ decode_xfield_field_desc(_el), Required);
+ _ ->
+ decode_xfield_field_els(_els, Options, Values, Desc,
+ Required)
+ end;
+decode_xfield_field_els([{xmlel, <<"required">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Options, Values, Desc, Required) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xfield_field_els(_els, Options, Values, Desc,
+ decode_xfield_field_required(_el));
+ _ ->
+ decode_xfield_field_els(_els, Options, Values, Desc,
+ Required)
+ end;
+decode_xfield_field_els([_ | _els], Options, Values,
+ Desc, Required) ->
+ decode_xfield_field_els(_els, Options, Values, Desc,
+ Required);
+decode_xfield_field_els([], Options, Values, Desc,
+ Required) ->
+ {lists:reverse(Options), lists:reverse(Values), Desc,
+ Required}.
+
+decode_xfield_field_attrs([{<<"var">>, _val} | _attrs],
+ _Var, Type, Label) ->
+ decode_xfield_field_attrs(_attrs, _val, Type, Label);
+decode_xfield_field_attrs([{<<"type">>, _val} | _attrs],
+ Var, _Type, Label) ->
+ decode_xfield_field_attrs(_attrs, Var, _val, Label);
+decode_xfield_field_attrs([{<<"label">>, _val}
+ | _attrs],
+ Var, Type, _Label) ->
+ decode_xfield_field_attrs(_attrs, Var, Type, _val);
+decode_xfield_field_attrs([_ | _attrs], Var, Type,
+ Label) ->
+ decode_xfield_field_attrs(_attrs, Var, Type, Label);
+decode_xfield_field_attrs([], Var, Type, Label) ->
+ {decode_xfield_field_var(Var),
+ decode_xfield_field_type(Type),
+ decode_xfield_field_label(Label)}.
+
+encode_xfield_field([], _acc) -> _acc;
+encode_xfield_field([{xfield, Label, Type, Var,
+ Required, Desc, Values, Options}
+ | _tail],
+ _acc) ->
+ _els = encode_xfield_field_required(Required,
+ encode_xfield_field_desc(Desc,
+ encode_xfield_field_value(Values,
+ encode_xfield_field_option(Options,
+ [])))),
+ _attrs = encode_xfield_field_label(Label,
+ encode_xfield_field_type(Type,
+ encode_xfield_field_var(Var,
+ []))),
+ encode_xfield_field(_tail,
+ [{xmlel, <<"field">>, _attrs, _els} | _acc]).
+
+decode_xfield_field_label(undefined) -> undefined;
+decode_xfield_field_label(_val) -> _val.
+
+encode_xfield_field_label(undefined, _acc) -> _acc;
+encode_xfield_field_label(_val, _acc) ->
+ [{<<"label">>, _val} | _acc].
+
+decode_xfield_field_type(undefined) -> undefined;
+decode_xfield_field_type(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [boolean, fixed, hidden, 'jid-multi',
+ 'jid-single', 'list-multi', 'list-single',
+ 'text-multi', 'text-private', 'text-single'])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"type">>, <<"field">>,
+ <<>>});
+ _res -> _res
+ end.
+
+encode_xfield_field_type(undefined, _acc) -> _acc;
+encode_xfield_field_type(_val, _acc) ->
+ [{<<"type">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_xfield_field_var(undefined) -> undefined;
+decode_xfield_field_var(_val) -> _val.
+
+encode_xfield_field_var(undefined, _acc) -> _acc;
+encode_xfield_field_var(_val, _acc) ->
+ [{<<"var">>, _val} | _acc].
+
+decode_xfield_field_option({xmlel, _, _attrs, _els}) ->
+ Value = decode_xfield_field_option_els(_els, []), Value.
+
+decode_xfield_field_option_els([{xmlel, <<"value">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Value) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xfield_field_option_els(_els,
+ [decode_xfield_field_option_value(_el)
+ | Value]);
+ _ -> decode_xfield_field_option_els(_els, Value)
+ end;
+decode_xfield_field_option_els([_ | _els], Value) ->
+ decode_xfield_field_option_els(_els, Value);
+decode_xfield_field_option_els([], [Value]) -> Value.
+
+encode_xfield_field_option([], _acc) -> _acc;
+encode_xfield_field_option([Value | _tail], _acc) ->
+ _els = encode_xfield_field_option_value(Value, []),
+ _attrs = [],
+ encode_xfield_field_option(_tail,
+ [{xmlel, <<"option">>, _attrs, _els} | _acc]).
+
+decode_xfield_field_option_value({xmlel, _, _attrs,
+ _els}) ->
+ Cdata = decode_xfield_field_option_value_els(_els,
+ <<>>),
+ Cdata.
+
+decode_xfield_field_option_value_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_xfield_field_option_value_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_xfield_field_option_value_els([_ | _els],
+ Cdata) ->
+ decode_xfield_field_option_value_els(_els, Cdata);
+decode_xfield_field_option_value_els([], Cdata) ->
+ decode_xfield_field_option_value_cdata(Cdata).
+
+encode_xfield_field_option_value(Cdata, _acc) ->
+ _els = encode_xfield_field_option_value_cdata(Cdata,
+ []),
+ _attrs = [],
+ [{xmlel, <<"value">>, _attrs, _els} | _acc].
+
+decode_xfield_field_option_value_cdata(<<>>) ->
+ undefined;
+decode_xfield_field_option_value_cdata(_val) -> _val.
+
+encode_xfield_field_option_value_cdata(undefined,
+ _acc) ->
+ _acc;
+encode_xfield_field_option_value_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_xfield_field_value({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_xfield_field_value_els(_els, <<>>),
+ Cdata.
+
+decode_xfield_field_value_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_xfield_field_value_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_xfield_field_value_els([_ | _els], Cdata) ->
+ decode_xfield_field_value_els(_els, Cdata);
+decode_xfield_field_value_els([], Cdata) ->
+ decode_xfield_field_value_cdata(Cdata).
+
+encode_xfield_field_value([], _acc) -> _acc;
+encode_xfield_field_value([Cdata | _tail], _acc) ->
+ _els = encode_xfield_field_value_cdata(Cdata, []),
+ _attrs = [],
+ encode_xfield_field_value(_tail,
+ [{xmlel, <<"value">>, _attrs, _els} | _acc]).
+
+decode_xfield_field_value_cdata(<<>>) -> undefined;
+decode_xfield_field_value_cdata(_val) -> _val.
+
+encode_xfield_field_value_cdata(undefined, _acc) ->
+ _acc;
+encode_xfield_field_value_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_xfield_field_desc({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_xfield_field_desc_els(_els, <<>>), Cdata.
+
+decode_xfield_field_desc_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_xfield_field_desc_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_xfield_field_desc_els([_ | _els], Cdata) ->
+ decode_xfield_field_desc_els(_els, Cdata);
+decode_xfield_field_desc_els([], Cdata) ->
+ decode_xfield_field_desc_cdata(Cdata).
+
+encode_xfield_field_desc(undefined, _acc) -> _acc;
+encode_xfield_field_desc(Cdata, _acc) ->
+ _els = encode_xfield_field_desc_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"desc">>, _attrs, _els} | _acc].
+
+decode_xfield_field_desc_cdata(<<>>) -> undefined;
+decode_xfield_field_desc_cdata(_val) -> _val.
+
+encode_xfield_field_desc_cdata(undefined, _acc) -> _acc;
+encode_xfield_field_desc_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_xfield_field_required({xmlel, _, _attrs,
+ _els}) ->
+ true.
+
+encode_xfield_field_required(false, _acc) -> _acc;
+encode_xfield_field_required(true, _acc) ->
+ _els = [],
+ _attrs = [],
+ [{xmlel, <<"required">>, _attrs, _els} | _acc].
+
+decode_xdata_x({xmlel, _, _attrs, _els}) ->
+ Type = decode_xdata_x_attrs(_attrs, undefined),
+ {Fields, Items, Reported, Title, Instructions} =
+ decode_xdata_x_els(_els, [], [], undefined, undefined,
+ []),
+ {xdata, Type, Instructions, Title, Reported, Items,
+ Fields}.
+
+decode_xdata_x_els([{xmlel, <<"field">>, _attrs, _} =
+ _el
+ | _els],
+ Fields, Items, Reported, Title, Instructions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xdata_x_els(_els,
+ [decode_xfield_field(_el) | Fields], Items,
+ Reported, Title, Instructions);
+ _ ->
+ decode_xdata_x_els(_els, Fields, Items, Reported, Title,
+ Instructions)
+ end;
+decode_xdata_x_els([{xmlel, <<"item">>, _attrs, _} = _el
+ | _els],
+ Fields, Items, Reported, Title, Instructions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xdata_x_els(_els, Fields,
+ [decode_xdata_x_item(_el) | Items], Reported,
+ Title, Instructions);
+ _ ->
+ decode_xdata_x_els(_els, Fields, Items, Reported, Title,
+ Instructions)
+ end;
+decode_xdata_x_els([{xmlel, <<"reported">>, _attrs, _} =
+ _el
+ | _els],
+ Fields, Items, Reported, Title, Instructions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xdata_x_els(_els, Fields, Items,
+ decode_xdata_x_reported(_el), Title, Instructions);
+ _ ->
+ decode_xdata_x_els(_els, Fields, Items, Reported, Title,
+ Instructions)
+ end;
+decode_xdata_x_els([{xmlel, <<"title">>, _attrs, _} =
+ _el
+ | _els],
+ Fields, Items, Reported, Title, Instructions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xdata_x_els(_els, Fields, Items, Reported,
+ decode_xdata_x_title(_el), Instructions);
+ _ ->
+ decode_xdata_x_els(_els, Fields, Items, Reported, Title,
+ Instructions)
+ end;
+decode_xdata_x_els([{xmlel, <<"instructions">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Fields, Items, Reported, Title, Instructions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xdata_x_els(_els, Fields, Items, Reported, Title,
+ [decode_xdata_x_instructions(_el) | Instructions]);
+ _ ->
+ decode_xdata_x_els(_els, Fields, Items, Reported, Title,
+ Instructions)
+ end;
+decode_xdata_x_els([_ | _els], Fields, Items, Reported,
+ Title, Instructions) ->
+ decode_xdata_x_els(_els, Fields, Items, Reported, Title,
+ Instructions);
+decode_xdata_x_els([], Fields, Items, Reported, Title,
+ Instructions) ->
+ {lists:reverse(Fields), lists:reverse(Items), Reported,
+ Title, lists:reverse(Instructions)}.
+
+decode_xdata_x_attrs([{<<"type">>, _val} | _attrs],
+ _Type) ->
+ decode_xdata_x_attrs(_attrs, _val);
+decode_xdata_x_attrs([_ | _attrs], Type) ->
+ decode_xdata_x_attrs(_attrs, Type);
+decode_xdata_x_attrs([], Type) ->
+ decode_xdata_x_type(Type).
+
+encode_xdata_x([], _acc) -> _acc;
+encode_xdata_x([{xdata, Type, Instructions, Title,
+ Reported, Items, Fields}
+ | _tail],
+ _acc) ->
+ _els = encode_xdata_x_instructions(Instructions,
+ encode_xdata_x_title(Title,
+ encode_xdata_x_reported(Reported,
+ encode_xdata_x_item(Items,
+ encode_xfield_field(Fields,
+ []))))),
+ _attrs = encode_xdata_x_type(Type,
+ [{<<"xmlns">>, <<"jabber:x:data">>}]),
+ encode_xdata_x(_tail,
+ [{xmlel, <<"x">>, _attrs, _els} | _acc]).
+
+decode_xdata_x_type(undefined) ->
+ erlang:error({missing_attr, <<"type">>, <<"x">>,
+ <<"jabber:x:data">>});
+decode_xdata_x_type(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [cancel, form, result, submit])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"type">>, <<"x">>,
+ <<"jabber:x:data">>});
+ _res -> _res
+ end.
+
+encode_xdata_x_type(_val, _acc) ->
+ [{<<"type">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_xdata_x_item({xmlel, _, _attrs, _els}) ->
+ Fields = decode_xdata_x_item_els(_els, []), Fields.
+
+decode_xdata_x_item_els([{xmlel, <<"field">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Fields) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xdata_x_item_els(_els,
+ [decode_xfield_field(_el) | Fields]);
+ _ -> decode_xdata_x_item_els(_els, Fields)
+ end;
+decode_xdata_x_item_els([_ | _els], Fields) ->
+ decode_xdata_x_item_els(_els, Fields);
+decode_xdata_x_item_els([], Fields) ->
+ lists:reverse(Fields).
+
+encode_xdata_x_item([], _acc) -> _acc;
+encode_xdata_x_item([Fields | _tail], _acc) ->
+ _els = encode_xfield_field(Fields, []),
+ _attrs = [],
+ encode_xdata_x_item(_tail,
+ [{xmlel, <<"item">>, _attrs, _els} | _acc]).
+
+decode_xdata_x_reported({xmlel, _, _attrs, _els}) ->
+ Fields = decode_xdata_x_reported_els(_els, []), Fields.
+
+decode_xdata_x_reported_els([{xmlel, <<"field">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Fields) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_xdata_x_reported_els(_els,
+ [decode_xfield_field(_el) | Fields]);
+ _ -> decode_xdata_x_reported_els(_els, Fields)
+ end;
+decode_xdata_x_reported_els([_ | _els], Fields) ->
+ decode_xdata_x_reported_els(_els, Fields);
+decode_xdata_x_reported_els([], Fields) ->
+ lists:reverse(Fields).
+
+encode_xdata_x_reported(undefined, _acc) -> _acc;
+encode_xdata_x_reported(Fields, _acc) ->
+ _els = encode_xfield_field(Fields, []),
+ _attrs = [],
+ [{xmlel, <<"reported">>, _attrs, _els} | _acc].
+
+decode_xdata_x_title({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_xdata_x_title_els(_els, <<>>), Cdata.
+
+decode_xdata_x_title_els([{xmlcdata, _data} | _els],
+ Cdata) ->
+ decode_xdata_x_title_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_xdata_x_title_els([_ | _els], Cdata) ->
+ decode_xdata_x_title_els(_els, Cdata);
+decode_xdata_x_title_els([], Cdata) ->
+ decode_xdata_x_title_cdata(Cdata).
+
+encode_xdata_x_title(undefined, _acc) -> _acc;
+encode_xdata_x_title(Cdata, _acc) ->
+ _els = encode_xdata_x_title_cdata(Cdata, []),
+ _attrs = [],
+ [{xmlel, <<"title">>, _attrs, _els} | _acc].
+
+decode_xdata_x_title_cdata(<<>>) -> undefined;
+decode_xdata_x_title_cdata(_val) -> _val.
+
+encode_xdata_x_title_cdata(undefined, _acc) -> _acc;
+encode_xdata_x_title_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_xdata_x_instructions({xmlel, _, _attrs, _els}) ->
+ Cdata = decode_xdata_x_instructions_els(_els, <<>>),
+ Cdata.
+
+decode_xdata_x_instructions_els([{xmlcdata, _data}
+ | _els],
+ Cdata) ->
+ decode_xdata_x_instructions_els(_els,
+ <<Cdata/binary, _data/binary>>);
+decode_xdata_x_instructions_els([_ | _els], Cdata) ->
+ decode_xdata_x_instructions_els(_els, Cdata);
+decode_xdata_x_instructions_els([], Cdata) ->
+ decode_xdata_x_instructions_cdata(Cdata).
+
+encode_xdata_x_instructions([], _acc) -> _acc;
+encode_xdata_x_instructions([Cdata | _tail], _acc) ->
+ _els = encode_xdata_x_instructions_cdata(Cdata, []),
+ _attrs = [],
+ encode_xdata_x_instructions(_tail,
+ [{xmlel, <<"instructions">>, _attrs, _els}
+ | _acc]).
+
+decode_xdata_x_instructions_cdata(<<>>) -> undefined;
+decode_xdata_x_instructions_cdata(_val) -> _val.
+
+encode_xdata_x_instructions_cdata(undefined, _acc) ->
+ _acc;
+encode_xdata_x_instructions_cdata(_val, _acc) ->
+ [{xmlcdata, _val} | _acc].
+
+decode_pubsub_subscription_subscription({xmlel, _,
+ _attrs, _els}) ->
+ {Type, Subid, Node, Jid} =
+ decode_pubsub_subscription_subscription_attrs(_attrs,
+ undefined, undefined,
+ undefined, undefined),
+ {pubsub_subscription, Jid, Node, Subid, Type}.
+
+decode_pubsub_subscription_subscription_attrs([{<<"subscription">>,
+ _val}
+ | _attrs],
+ _Type, Subid, Node, Jid) ->
+ decode_pubsub_subscription_subscription_attrs(_attrs,
+ _val, Subid, Node, Jid);
+decode_pubsub_subscription_subscription_attrs([{<<"subid">>,
+ _val}
+ | _attrs],
+ Type, _Subid, Node, Jid) ->
+ decode_pubsub_subscription_subscription_attrs(_attrs,
+ Type, _val, Node, Jid);
+decode_pubsub_subscription_subscription_attrs([{<<"node">>,
+ _val}
+ | _attrs],
+ Type, Subid, _Node, Jid) ->
+ decode_pubsub_subscription_subscription_attrs(_attrs,
+ Type, Subid, _val, Jid);
+decode_pubsub_subscription_subscription_attrs([{<<"jid">>,
+ _val}
+ | _attrs],
+ Type, Subid, Node, _Jid) ->
+ decode_pubsub_subscription_subscription_attrs(_attrs,
+ Type, Subid, Node, _val);
+decode_pubsub_subscription_subscription_attrs([_
+ | _attrs],
+ Type, Subid, Node, Jid) ->
+ decode_pubsub_subscription_subscription_attrs(_attrs,
+ Type, Subid, Node, Jid);
+decode_pubsub_subscription_subscription_attrs([], Type,
+ Subid, Node, Jid) ->
+ {decode_pubsub_subscription_subscription_subscription(Type),
+ decode_pubsub_subscription_subscription_subid(Subid),
+ decode_pubsub_subscription_subscription_node(Node),
+ decode_pubsub_subscription_subscription_jid(Jid)}.
+
+encode_pubsub_subscription_subscription([], _acc) ->
+ _acc;
+encode_pubsub_subscription_subscription([{pubsub_subscription,
+ Jid, Node, Subid, Type}
+ | _tail],
+ _acc) ->
+ _els = [],
+ _attrs =
+ encode_pubsub_subscription_subscription_jid(Jid,
+ encode_pubsub_subscription_subscription_node(Node,
+ encode_pubsub_subscription_subscription_subid(Subid,
+ encode_pubsub_subscription_subscription_subscription(Type,
+ [])))),
+ encode_pubsub_subscription_subscription(_tail,
+ [{xmlel, <<"subscription">>, _attrs,
+ _els}
+ | _acc]).
+
+decode_pubsub_subscription_subscription_jid(undefined) ->
+ erlang:error({missing_attr, <<"jid">>,
+ <<"subscription">>, <<>>});
+decode_pubsub_subscription_subscription_jid(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"jid">>,
+ <<"subscription">>, <<>>});
+ _res -> _res
+ end.
+
+encode_pubsub_subscription_subscription_jid(_val,
+ _acc) ->
+ [{<<"jid">>, enc_jid(_val)} | _acc].
+
+decode_pubsub_subscription_subscription_node(undefined) ->
+ undefined;
+decode_pubsub_subscription_subscription_node(_val) ->
+ _val.
+
+encode_pubsub_subscription_subscription_node(undefined,
+ _acc) ->
+ _acc;
+encode_pubsub_subscription_subscription_node(_val,
+ _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_pubsub_subscription_subscription_subid(undefined) ->
+ undefined;
+decode_pubsub_subscription_subscription_subid(_val) ->
+ _val.
+
+encode_pubsub_subscription_subscription_subid(undefined,
+ _acc) ->
+ _acc;
+encode_pubsub_subscription_subscription_subid(_val,
+ _acc) ->
+ [{<<"subid">>, _val} | _acc].
+
+decode_pubsub_subscription_subscription_subscription(undefined) ->
+ undefined;
+decode_pubsub_subscription_subscription_subscription(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [none, pending, subscribed, unconfigured])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"subscription">>,
+ <<"subscription">>, <<>>});
+ _res -> _res
+ end.
+
+encode_pubsub_subscription_subscription_subscription(undefined,
+ _acc) ->
+ _acc;
+encode_pubsub_subscription_subscription_subscription(_val,
+ _acc) ->
+ [{<<"subscription">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_pubsub_affiliation_affiliation({xmlel, _, _attrs,
+ _els}) ->
+ {Type, Node} =
+ decode_pubsub_affiliation_affiliation_attrs(_attrs,
+ undefined, undefined),
+ {pubsub_affiliation, Node, Type}.
+
+decode_pubsub_affiliation_affiliation_attrs([{<<"affiliation">>,
+ _val}
+ | _attrs],
+ _Type, Node) ->
+ decode_pubsub_affiliation_affiliation_attrs(_attrs,
+ _val, Node);
+decode_pubsub_affiliation_affiliation_attrs([{<<"node">>,
+ _val}
+ | _attrs],
+ Type, _Node) ->
+ decode_pubsub_affiliation_affiliation_attrs(_attrs,
+ Type, _val);
+decode_pubsub_affiliation_affiliation_attrs([_
+ | _attrs],
+ Type, Node) ->
+ decode_pubsub_affiliation_affiliation_attrs(_attrs,
+ Type, Node);
+decode_pubsub_affiliation_affiliation_attrs([], Type,
+ Node) ->
+ {decode_pubsub_affiliation_affiliation_affiliation(Type),
+ decode_pubsub_affiliation_affiliation_node(Node)}.
+
+encode_pubsub_affiliation_affiliation([], _acc) -> _acc;
+encode_pubsub_affiliation_affiliation([{pubsub_affiliation,
+ Node, Type}
+ | _tail],
+ _acc) ->
+ _els = [],
+ _attrs =
+ encode_pubsub_affiliation_affiliation_node(Node,
+ encode_pubsub_affiliation_affiliation_affiliation(Type,
+ [])),
+ encode_pubsub_affiliation_affiliation(_tail,
+ [{xmlel, <<"affiliation">>, _attrs,
+ _els}
+ | _acc]).
+
+decode_pubsub_affiliation_affiliation_node(undefined) ->
+ erlang:error({missing_attr, <<"node">>,
+ <<"affiliation">>, <<>>});
+decode_pubsub_affiliation_affiliation_node(_val) ->
+ _val.
+
+encode_pubsub_affiliation_affiliation_node(_val,
+ _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_pubsub_affiliation_affiliation_affiliation(undefined) ->
+ erlang:error({missing_attr, <<"affiliation">>,
+ <<"affiliation">>, <<>>});
+decode_pubsub_affiliation_affiliation_affiliation(_val) ->
+ case catch xml_gen:dec_enum(_val,
+ [member, none, outcast, owner, publisher,
+ 'publish-only'])
+ of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"affiliation">>,
+ <<"affiliation">>, <<>>});
+ _res -> _res
+ end.
+
+encode_pubsub_affiliation_affiliation_affiliation(_val,
+ _acc) ->
+ [{<<"affiliation">>, xml_gen:enc_enum(_val)} | _acc].
+
+decode_pubsub_item_item({xmlel, _, _attrs, _els}) ->
+ Id = decode_pubsub_item_item_attrs(_attrs, undefined),
+ __Els = decode_pubsub_item_item_els(_els, []),
+ {pubsub_item, Id, __Els}.
+
+decode_pubsub_item_item_els([{xmlel, _, _, _} = _el
+ | _els],
+ __Els) ->
+ decode_pubsub_item_item_els(_els,
+ [decode(_el) | __Els]);
+decode_pubsub_item_item_els([_ | _els], __Els) ->
+ decode_pubsub_item_item_els(_els, __Els);
+decode_pubsub_item_item_els([], __Els) ->
+ lists:reverse(__Els).
+
+decode_pubsub_item_item_attrs([{<<"id">>, _val}
+ | _attrs],
+ _Id) ->
+ decode_pubsub_item_item_attrs(_attrs, _val);
+decode_pubsub_item_item_attrs([_ | _attrs], Id) ->
+ decode_pubsub_item_item_attrs(_attrs, Id);
+decode_pubsub_item_item_attrs([], Id) ->
+ decode_pubsub_item_item_id(Id).
+
+encode_pubsub_item_item([], _acc) -> _acc;
+encode_pubsub_item_item([{pubsub_item, Id, __Els}
+ | _tail],
+ _acc) ->
+ _els = [encode(_subel) || _subel <- __Els] ++ [],
+ _attrs = encode_pubsub_item_item_id(Id, []),
+ encode_pubsub_item_item(_tail,
+ [{xmlel, <<"item">>, _attrs, _els} | _acc]).
+
+decode_pubsub_item_item_id(undefined) -> undefined;
+decode_pubsub_item_item_id(_val) -> _val.
+
+encode_pubsub_item_item_id(undefined, _acc) -> _acc;
+encode_pubsub_item_item_id(_val, _acc) ->
+ [{<<"id">>, _val} | _acc].
+
+decode_pubsub_items_items({xmlel, _, _attrs, _els}) ->
+ {Subid, Max_items, Node} =
+ decode_pubsub_items_items_attrs(_attrs, undefined,
+ undefined, undefined),
+ Item = decode_pubsub_items_items_els(_els, []),
+ {pubsub_items, Node, Max_items, Subid, Item}.
+
+decode_pubsub_items_items_els([{xmlel, <<"item">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Item) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_pubsub_items_items_els(_els,
+ [decode_pubsub_item_item(_el) | Item]);
+ _ -> decode_pubsub_items_items_els(_els, Item)
+ end;
+decode_pubsub_items_items_els([_ | _els], Item) ->
+ decode_pubsub_items_items_els(_els, Item);
+decode_pubsub_items_items_els([], Item) ->
+ lists:reverse(Item).
+
+decode_pubsub_items_items_attrs([{<<"subid">>, _val}
+ | _attrs],
+ _Subid, Max_items, Node) ->
+ decode_pubsub_items_items_attrs(_attrs, _val, Max_items,
+ Node);
+decode_pubsub_items_items_attrs([{<<"max_items">>, _val}
+ | _attrs],
+ Subid, _Max_items, Node) ->
+ decode_pubsub_items_items_attrs(_attrs, Subid, _val,
+ Node);
+decode_pubsub_items_items_attrs([{<<"node">>, _val}
+ | _attrs],
+ Subid, Max_items, _Node) ->
+ decode_pubsub_items_items_attrs(_attrs, Subid,
+ Max_items, _val);
+decode_pubsub_items_items_attrs([_ | _attrs], Subid,
+ Max_items, Node) ->
+ decode_pubsub_items_items_attrs(_attrs, Subid,
+ Max_items, Node);
+decode_pubsub_items_items_attrs([], Subid, Max_items,
+ Node) ->
+ {decode_pubsub_items_items_subid(Subid),
+ decode_pubsub_items_items_max_items(Max_items),
+ decode_pubsub_items_items_node(Node)}.
+
+encode_pubsub_items_items([], _acc) -> _acc;
+encode_pubsub_items_items([{pubsub_items, Node,
+ Max_items, Subid, Item}
+ | _tail],
+ _acc) ->
+ _els = encode_pubsub_item_item(Item, []),
+ _attrs = encode_pubsub_items_items_node(Node,
+ encode_pubsub_items_items_max_items(Max_items,
+ encode_pubsub_items_items_subid(Subid,
+ []))),
+ encode_pubsub_items_items(_tail,
+ [{xmlel, <<"items">>, _attrs, _els} | _acc]).
+
+decode_pubsub_items_items_max_items(undefined) ->
+ undefined;
+decode_pubsub_items_items_max_items(_val) ->
+ case catch xml_gen:dec_int(_val, 0, infinity) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"max_items">>,
+ <<"items">>, <<>>});
+ _res -> _res
+ end.
+
+encode_pubsub_items_items_max_items(undefined, _acc) ->
+ _acc;
+encode_pubsub_items_items_max_items(_val, _acc) ->
+ [{<<"max_items">>, xml_gen:enc_int(_val)} | _acc].
+
+decode_pubsub_items_items_node(undefined) ->
+ erlang:error({missing_attr, <<"node">>, <<"items">>,
+ <<>>});
+decode_pubsub_items_items_node(_val) -> _val.
+
+encode_pubsub_items_items_node(_val, _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_pubsub_items_items_subid(undefined) -> undefined;
+decode_pubsub_items_items_subid(_val) -> _val.
+
+encode_pubsub_items_items_subid(undefined, _acc) ->
+ _acc;
+encode_pubsub_items_items_subid(_val, _acc) ->
+ [{<<"subid">>, _val} | _acc].
+
+decode_pubsub_event_event({xmlel, _, _attrs, _els}) ->
+ Items = decode_pubsub_event_event_els(_els, []),
+ {pubsub_event, Items}.
+
+decode_pubsub_event_event_els([{xmlel, <<"items">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Items) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_pubsub_event_event_els(_els,
+ [decode_pubsub_items_items(_el)
+ | Items]);
+ _ -> decode_pubsub_event_event_els(_els, Items)
+ end;
+decode_pubsub_event_event_els([_ | _els], Items) ->
+ decode_pubsub_event_event_els(_els, Items);
+decode_pubsub_event_event_els([], Items) ->
+ lists:reverse(Items).
+
+encode_pubsub_event_event(undefined, _acc) -> _acc;
+encode_pubsub_event_event({pubsub_event, Items},
+ _acc) ->
+ _els = encode_pubsub_items_items(Items, []),
+ _attrs = [{<<"xmlns">>,
+ <<"http://jabber.org/protocol/pubsub#event">>}],
+ [{xmlel, <<"event">>, _attrs, _els} | _acc].
+
+decode_pubsub_pubsub({xmlel, _, _attrs, _els}) ->
+ {Subscribe, Publish, Affiliations, Subscriptions} =
+ decode_pubsub_pubsub_els(_els, undefined, undefined,
+ undefined, undefined),
+ {pubsub, Subscriptions, Affiliations, Publish,
+ Subscribe}.
+
+decode_pubsub_pubsub_els([{xmlel, <<"subscribe">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Subscribe, Publish, Affiliations, Subscriptions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_pubsub_pubsub_els(_els,
+ decode_pubsub_pubsub_subscribe(_el), Publish,
+ Affiliations, Subscriptions);
+ _ ->
+ decode_pubsub_pubsub_els(_els, Subscribe, Publish,
+ Affiliations, Subscriptions)
+ end;
+decode_pubsub_pubsub_els([{xmlel, <<"publish">>, _attrs,
+ _} =
+ _el
+ | _els],
+ Subscribe, Publish, Affiliations, Subscriptions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_pubsub_pubsub_els(_els, Subscribe,
+ decode_pubsub_pubsub_publish(_el),
+ Affiliations, Subscriptions);
+ _ ->
+ decode_pubsub_pubsub_els(_els, Subscribe, Publish,
+ Affiliations, Subscriptions)
+ end;
+decode_pubsub_pubsub_els([{xmlel, <<"affiliations">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Subscribe, Publish, Affiliations, Subscriptions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_pubsub_pubsub_els(_els, Subscribe, Publish,
+ decode_pubsub_pubsub_affiliations(_el),
+ Subscriptions);
+ _ ->
+ decode_pubsub_pubsub_els(_els, Subscribe, Publish,
+ Affiliations, Subscriptions)
+ end;
+decode_pubsub_pubsub_els([{xmlel, <<"subscriptions">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Subscribe, Publish, Affiliations, Subscriptions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_pubsub_pubsub_els(_els, Subscribe, Publish,
+ Affiliations,
+ decode_pubsub_pubsub_subscriptions(_el));
+ _ ->
+ decode_pubsub_pubsub_els(_els, Subscribe, Publish,
+ Affiliations, Subscriptions)
+ end;
+decode_pubsub_pubsub_els([_ | _els], Subscribe, Publish,
+ Affiliations, Subscriptions) ->
+ decode_pubsub_pubsub_els(_els, Subscribe, Publish,
+ Affiliations, Subscriptions);
+decode_pubsub_pubsub_els([], Subscribe, Publish,
+ Affiliations, Subscriptions) ->
+ {Subscribe, Publish, Affiliations, Subscriptions}.
+
+encode_pubsub_pubsub(undefined, _acc) -> _acc;
+encode_pubsub_pubsub({pubsub, Subscriptions,
+ Affiliations, Publish, Subscribe},
+ _acc) ->
+ _els = encode_pubsub_pubsub_subscriptions(Subscriptions,
+ encode_pubsub_pubsub_affiliations(Affiliations,
+ encode_pubsub_pubsub_publish(Publish,
+ encode_pubsub_pubsub_subscribe(Subscribe,
+ [])))),
+ _attrs = [{<<"xmlns">>,
+ <<"http://jabber.org/protocol/pubsub">>}],
+ [{xmlel, <<"pubsub">>, _attrs, _els} | _acc].
+
+decode_pubsub_pubsub_publish({xmlel, _, _attrs,
+ _els}) ->
+ Node = decode_pubsub_pubsub_publish_attrs(_attrs,
+ undefined),
+ Item = decode_pubsub_pubsub_publish_els(_els, []),
+ {Node, Item}.
+
+decode_pubsub_pubsub_publish_els([{xmlel, <<"item">>,
+ _attrs, _} =
+ _el
+ | _els],
+ Item) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_pubsub_pubsub_publish_els(_els,
+ [decode_pubsub_item_item(_el)
+ | Item]);
+ _ -> decode_pubsub_pubsub_publish_els(_els, Item)
+ end;
+decode_pubsub_pubsub_publish_els([_ | _els], Item) ->
+ decode_pubsub_pubsub_publish_els(_els, Item);
+decode_pubsub_pubsub_publish_els([], Item) ->
+ lists:reverse(Item).
+
+decode_pubsub_pubsub_publish_attrs([{<<"node">>, _val}
+ | _attrs],
+ _Node) ->
+ decode_pubsub_pubsub_publish_attrs(_attrs, _val);
+decode_pubsub_pubsub_publish_attrs([_ | _attrs],
+ Node) ->
+ decode_pubsub_pubsub_publish_attrs(_attrs, Node);
+decode_pubsub_pubsub_publish_attrs([], Node) ->
+ decode_pubsub_pubsub_publish_node(Node).
+
+encode_pubsub_pubsub_publish(undefined, _acc) -> _acc;
+encode_pubsub_pubsub_publish({Node, Item}, _acc) ->
+ _els = encode_pubsub_item_item(Item, []),
+ _attrs = encode_pubsub_pubsub_publish_node(Node, []),
+ [{xmlel, <<"publish">>, _attrs, _els} | _acc].
+
+decode_pubsub_pubsub_publish_node(undefined) ->
+ erlang:error({missing_attr, <<"node">>, <<"publish">>,
+ <<>>});
+decode_pubsub_pubsub_publish_node(_val) -> _val.
+
+encode_pubsub_pubsub_publish_node(_val, _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_pubsub_pubsub_subscribe({xmlel, _, _attrs,
+ _els}) ->
+ {Jid, Node} =
+ decode_pubsub_pubsub_subscribe_attrs(_attrs, undefined,
+ undefined),
+ {Node, Jid}.
+
+decode_pubsub_pubsub_subscribe_attrs([{<<"jid">>, _val}
+ | _attrs],
+ _Jid, Node) ->
+ decode_pubsub_pubsub_subscribe_attrs(_attrs, _val,
+ Node);
+decode_pubsub_pubsub_subscribe_attrs([{<<"node">>, _val}
+ | _attrs],
+ Jid, _Node) ->
+ decode_pubsub_pubsub_subscribe_attrs(_attrs, Jid, _val);
+decode_pubsub_pubsub_subscribe_attrs([_ | _attrs], Jid,
+ Node) ->
+ decode_pubsub_pubsub_subscribe_attrs(_attrs, Jid, Node);
+decode_pubsub_pubsub_subscribe_attrs([], Jid, Node) ->
+ {decode_pubsub_pubsub_subscribe_jid(Jid),
+ decode_pubsub_pubsub_subscribe_node(Node)}.
+
+encode_pubsub_pubsub_subscribe(undefined, _acc) -> _acc;
+encode_pubsub_pubsub_subscribe({Node, Jid}, _acc) ->
+ _els = [],
+ _attrs = encode_pubsub_pubsub_subscribe_node(Node,
+ encode_pubsub_pubsub_subscribe_jid(Jid,
+ [])),
+ [{xmlel, <<"subscribe">>, _attrs, _els} | _acc].
+
+decode_pubsub_pubsub_subscribe_node(undefined) ->
+ undefined;
+decode_pubsub_pubsub_subscribe_node(_val) -> _val.
+
+encode_pubsub_pubsub_subscribe_node(undefined, _acc) ->
+ _acc;
+encode_pubsub_pubsub_subscribe_node(_val, _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_pubsub_pubsub_subscribe_jid(undefined) ->
+ erlang:error({missing_attr, <<"jid">>, <<"subscribe">>,
+ <<>>});
+decode_pubsub_pubsub_subscribe_jid(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"jid">>,
+ <<"subscribe">>, <<>>});
+ _res -> _res
+ end.
+
+encode_pubsub_pubsub_subscribe_jid(_val, _acc) ->
+ [{<<"jid">>, enc_jid(_val)} | _acc].
+
+decode_pubsub_pubsub_affiliations({xmlel, _, _attrs,
+ _els}) ->
+ Pubsub_affiliations =
+ decode_pubsub_pubsub_affiliations_els(_els, []),
+ Pubsub_affiliations.
+
+decode_pubsub_pubsub_affiliations_els([{xmlel,
+ <<"affiliation">>, _attrs, _} =
+ _el
+ | _els],
+ Pubsub_affiliations) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_pubsub_pubsub_affiliations_els(_els,
+ [decode_pubsub_affiliation_affiliation(_el)
+ | Pubsub_affiliations]);
+ _ ->
+ decode_pubsub_pubsub_affiliations_els(_els,
+ Pubsub_affiliations)
+ end;
+decode_pubsub_pubsub_affiliations_els([_ | _els],
+ Pubsub_affiliations) ->
+ decode_pubsub_pubsub_affiliations_els(_els,
+ Pubsub_affiliations);
+decode_pubsub_pubsub_affiliations_els([],
+ Pubsub_affiliations) ->
+ lists:reverse(Pubsub_affiliations).
+
+encode_pubsub_pubsub_affiliations(undefined, _acc) ->
+ _acc;
+encode_pubsub_pubsub_affiliations(Pubsub_affiliations,
+ _acc) ->
+ _els =
+ encode_pubsub_affiliation_affiliation(Pubsub_affiliations,
+ []),
+ _attrs = [],
+ [{xmlel, <<"affiliations">>, _attrs, _els} | _acc].
+
+decode_pubsub_pubsub_subscriptions({xmlel, _, _attrs,
+ _els}) ->
+ Node = decode_pubsub_pubsub_subscriptions_attrs(_attrs,
+ undefined),
+ Pubsub_subscriptions =
+ decode_pubsub_pubsub_subscriptions_els(_els, []),
+ {Node, Pubsub_subscriptions}.
+
+decode_pubsub_pubsub_subscriptions_els([{xmlel,
+ <<"subscription">>, _attrs, _} =
+ _el
+ | _els],
+ Pubsub_subscriptions) ->
+ case xml:get_attr_s(<<"xmlns">>, _attrs) of
+ <<>> ->
+ decode_pubsub_pubsub_subscriptions_els(_els,
+ [decode_pubsub_subscription_subscription(_el)
+ | Pubsub_subscriptions]);
+ _ ->
+ decode_pubsub_pubsub_subscriptions_els(_els,
+ Pubsub_subscriptions)
+ end;
+decode_pubsub_pubsub_subscriptions_els([_ | _els],
+ Pubsub_subscriptions) ->
+ decode_pubsub_pubsub_subscriptions_els(_els,
+ Pubsub_subscriptions);
+decode_pubsub_pubsub_subscriptions_els([],
+ Pubsub_subscriptions) ->
+ lists:reverse(Pubsub_subscriptions).
+
+decode_pubsub_pubsub_subscriptions_attrs([{<<"node">>,
+ _val}
+ | _attrs],
+ _Node) ->
+ decode_pubsub_pubsub_subscriptions_attrs(_attrs, _val);
+decode_pubsub_pubsub_subscriptions_attrs([_ | _attrs],
+ Node) ->
+ decode_pubsub_pubsub_subscriptions_attrs(_attrs, Node);
+decode_pubsub_pubsub_subscriptions_attrs([], Node) ->
+ decode_pubsub_pubsub_subscriptions_node(Node).
+
+encode_pubsub_pubsub_subscriptions(undefined, _acc) ->
+ _acc;
+encode_pubsub_pubsub_subscriptions({Node,
+ Pubsub_subscriptions},
+ _acc) ->
+ _els =
+ encode_pubsub_subscription_subscription(Pubsub_subscriptions,
+ []),
+ _attrs = encode_pubsub_pubsub_subscriptions_node(Node,
+ []),
+ [{xmlel, <<"subscriptions">>, _attrs, _els} | _acc].
+
+decode_pubsub_pubsub_subscriptions_node(undefined) ->
+ none;
+decode_pubsub_pubsub_subscriptions_node(_val) -> _val.
+
+encode_pubsub_pubsub_subscriptions_node(none, _acc) ->
+ _acc;
+encode_pubsub_pubsub_subscriptions_node(_val, _acc) ->
+ [{<<"node">>, _val} | _acc].
+
+decode_delay_delay({xmlel, _, _attrs, _els}) ->
+ {From, Stamp} = decode_delay_delay_attrs(_attrs,
+ undefined, undefined),
+ {delay, Stamp, From}.
+
+decode_delay_delay_attrs([{<<"from">>, _val} | _attrs],
+ _From, Stamp) ->
+ decode_delay_delay_attrs(_attrs, _val, Stamp);
+decode_delay_delay_attrs([{<<"stamp">>, _val} | _attrs],
+ From, _Stamp) ->
+ decode_delay_delay_attrs(_attrs, From, _val);
+decode_delay_delay_attrs([_ | _attrs], From, Stamp) ->
+ decode_delay_delay_attrs(_attrs, From, Stamp);
+decode_delay_delay_attrs([], From, Stamp) ->
+ {decode_delay_delay_from(From),
+ decode_delay_delay_stamp(Stamp)}.
+
+encode_delay_delay(undefined, _acc) -> _acc;
+encode_delay_delay({delay, Stamp, From}, _acc) ->
+ _els = [],
+ _attrs = encode_delay_delay_stamp(Stamp,
+ encode_delay_delay_from(From,
+ [{<<"xmlns">>,
+ <<"urn:xmpp:delay">>}])),
+ [{xmlel, <<"delay">>, _attrs, _els} | _acc].
+
+decode_delay_delay_stamp(undefined) ->
+ erlang:error({missing_attr, <<"stamp">>, <<"delay">>,
+ <<"urn:xmpp:delay">>});
+decode_delay_delay_stamp(_val) ->
+ case catch dec_utc(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"stamp">>, <<"delay">>,
+ <<"urn:xmpp:delay">>});
+ _res -> _res
+ end.
+
+encode_delay_delay_stamp(_val, _acc) ->
+ [{<<"stamp">>, enc_utc(_val)} | _acc].
+
+decode_delay_delay_from(undefined) -> undefined;
+decode_delay_delay_from(_val) ->
+ case catch dec_jid(_val) of
+ {'EXIT', _} ->
+ erlang:error({bad_attr_value, <<"from">>, <<"delay">>,
+ <<"urn:xmpp:delay">>});
+ _res -> _res
+ end.
+
+encode_delay_delay_from(undefined, _acc) -> _acc;
+encode_delay_delay_from(_val, _acc) ->
+ [{<<"from">>, enc_jid(_val)} | _acc].
diff --git a/tools/xmpp_codec.hrl b/tools/xmpp_codec.hrl
new file mode 100644
index 000000000..9c0e4569d
--- /dev/null
+++ b/tools/xmpp_codec.hrl
@@ -0,0 +1,168 @@
+-record(last, {seconds, text}).
+
+-record(version, {name, version, os}).
+
+-record(roster, {item = [], ver}).
+
+-record(roster_item,
+ {jid, name, groups = [], subscription = none, ask}).
+
+-record(privacy_item,
+ {order, action, type, value, stanza}).
+
+-record(privacy, {list = [], default, active}).
+
+-record(privacy_list, {name, privacy_item = []}).
+
+-record(block, {block_item = []}).
+
+-record(unblock, {block_item = []}).
+
+-record(block_list, {}).
+
+-record(disco_info,
+ {node, identity = [], feature = [], xdata = []}).
+
+-record(disco_items, {node, items = []}).
+
+-record(disco_item, {jid, name, node}).
+
+-record(private, {sub_els = []}).
+
+-record(bookmark_conference,
+ {name, jid, autojoin = false, nick, password}).
+
+-record(bookmark_storage, {conference = [], url = []}).
+
+-record(bookmark_url, {name, url}).
+
+-record(stats, {stat = []}).
+
+-record(stat, {name, units, value, error = []}).
+
+-record(iq,
+ {id, type, lang, from, to, error, sub_els = []}).
+
+-record(message,
+ {id, type = normal, lang, from, to, subject = [],
+ body = [], thread, error, sub_els = []}).
+
+-record(presence,
+ {id, type, lang, from, to, show, status = [], priority,
+ error, sub_els = []}).
+
+-record(error, {error_type, by, reason, text}).
+
+-record(redirect, {cdata}).
+
+-record(gone, {cdata}).
+
+-record(bind, {jid, resource}).
+
+-record(sasl_auth, {mechanism, cdata}).
+
+-record(sasl_abort, {}).
+
+-record(sasl_challenge, {cdata}).
+
+-record(sasl_response, {cdata}).
+
+-record(sasl_success, {cdata}).
+
+-record(sasl_failure, {reason, text}).
+
+-record(sasl_mechanisms, {mechanism = []}).
+
+-record(starttls, {required = false}).
+
+-record(starttls_proceed, {}).
+
+-record(starttls_failure, {}).
+
+-record(stream_features, {sub_els = []}).
+
+-record(p1_push, {}).
+
+-record(p1_rebind, {}).
+
+-record(p1_ack, {}).
+
+-record(caps, {hash, node, ver}).
+
+-record(register, {}).
+
+-record(session, {}).
+
+-record(ping, {}).
+
+-record(time, {tzo, utc}).
+
+-record(stream_error, {reason, text}).
+
+-record('see-other-host', {cdata}).
+
+-record(vcard_name,
+ {family, given, middle, prefix, suffix}).
+
+-record(vcard_adr,
+ {home = false, work = false, postal = false,
+ parcel = false, dom = false, intl = false, pref = false,
+ pobox, extadd, street, locality, region, pcode, ctry}).
+
+-record(vcard_label,
+ {home = false, work = false, postal = false,
+ parcel = false, dom = false, intl = false, pref = false,
+ line = []}).
+
+-record(vcard_tel,
+ {home = false, work = false, voice = false, fax = false,
+ pager = false, msg = false, cell = false, video = false,
+ bbs = false, modem = false, isdn = false, pcs = false,
+ pref = false, number}).
+
+-record(vcard_email,
+ {home = false, work = false, internet = false,
+ pref = false, x400 = false, userid}).
+
+-record(vcard_geo, {lat, lon}).
+
+-record(vcard_logo, {type, binval, extval}).
+
+-record(vcard_photo, {type, binval, extval}).
+
+-record(vcard_org, {name, units = []}).
+
+-record(vcard_sound, {phonetic, binval, extval}).
+
+-record(vcard_key, {type, cred}).
+
+-record(vcard,
+ {version, fn, n, nickname, photo, bday, adr = [],
+ label = [], tel = [], email = [], jabberid, mailer, tz,
+ geo, title, role, logo, org, categories = [], note,
+ prodid, rev, 'sort-string', sound, uid, url, class, key,
+ desc}).
+
+-record(xfield,
+ {label, type, var, required = false, desc, values = [],
+ options = []}).
+
+-record(xdata,
+ {type, instructions = [], title, reported, items = [],
+ fields = []}).
+
+-record(pubsub_subscription, {jid, node, subid, type}).
+
+-record(pubsub_affiliation, {node, type}).
+
+-record(pubsub_item, {id, sub_els = []}).
+
+-record(pubsub_items,
+ {node, max_items, subid, item = []}).
+
+-record(pubsub_event, {items = []}).
+
+-record(pubsub,
+ {subscriptions, affiliations, publish, subscribe}).
+
+-record(delay, {stamp, from}).
diff --git a/tools/xmpp_codec.spec b/tools/xmpp_codec.spec
new file mode 100644
index 000000000..ebcb77e96
--- /dev/null
+++ b/tools/xmpp_codec.spec
@@ -0,0 +1,1244 @@
+{spec, last,
+ #spec{name = <<"query">>,
+ min = 0, max = 1,
+ xmlns = <<"jabber:iq:last">>,
+ result = {last, '$seconds', '$text'},
+ attrs = [#attr{name = <<"seconds">>,
+ default = undefined,
+ enc = {enc_int, []},
+ dec = {dec_int, [0, infinity]}}],
+ cdata = #cdata{label = '$text'}}}.
+
+{spec, version,
+ #spec{name = <<"query">>,
+ xmlns = <<"jabber:iq:version">>,
+ min = 0, max = 1,
+ result = {version, '$name', '$version', '$os'},
+ els = [#spec{name = <<"name">>,
+ min = 0, max = 1,
+ result = '$cdata',
+ cdata = #cdata{label = '$cdata', required = true}},
+ #spec{name = <<"version">>,
+ min = 0, max = 1,
+ result = '$cdata',
+ cdata = #cdata{label = '$cdata', required = true}},
+ #spec{name = <<"os">>,
+ min = 0, max = 1,
+ result = '$cdata',
+ cdata = #cdata{label = '$cdata', required = true}}]}}.
+
+{spec, roster,
+ #spec{name = <<"query">>,
+ xmlns = <<"jabber:iq:roster">>,
+ result = {roster, '$item', '$ver'},
+ min = 0, max = 1,
+ attrs = [#attr{name = <<"ver">>}],
+ els = [#spec{name = <<"item">>,
+ result = {roster_item, '$jid', '$name',
+ '$groups', '$subscription', '$ask'},
+ attrs = [#attr{name = <<"jid">>,
+ required = true,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}},
+ #attr{name = <<"name">>},
+ #attr{name = <<"subscription">>,
+ default = none,
+ enc = {enc_enum, []},
+ dec = {dec_enum, [[none,to,from,both,remove]]}},
+ #attr{name = <<"ask">>,
+ default = undefined,
+ enc = {enc_enum, []},
+ dec = {dec_enum, [[subscribe]]}}],
+ els = [#spec{name = <<"group">>,
+ label = '$groups',
+ result = '$cdata',
+ cdata = #cdata{required = true,
+ label = '$cdata'}}]}]}}.
+
+{spec, privacy_item,
+ #spec{name = <<"item">>,
+ result = {privacy_item, '$order', '$action', '$type',
+ '$value', '$stanza'},
+ label = '$privacy_item',
+ attrs = [#attr{name = <<"action">>,
+ required = true,
+ dec = {dec_enum, [[allow, deny]]},
+ enc = {enc_enum, []}},
+ #attr{name = <<"order">>,
+ required = true,
+ dec = {dec_int, [0, infinity]},
+ enc = {enc_int, []}},
+ #attr{name = <<"type">>,
+ dec = {dec_enum, [[group, jid, subscription]]},
+ enc = {enc_enum, []}},
+ #attr{name = <<"value">>}],
+ els = [#spec{name = <<"message">>,
+ min = 0, max = 1,
+ label = '$stanza',
+ result = message},
+ #spec{name = <<"iq">>,
+ min = 0, max = 1,
+ label = '$stanza',
+ result = iq},
+ #spec{name = <<"presence-in">>,
+ min = 0, max = 1,
+ label = '$stanza',
+ result = 'presence-in'},
+ #spec{name = <<"presence-out">>,
+ min = 0, max = 1,
+ label = '$stanza',
+ result = 'presence-out'}]}}.
+
+{spec, privacy,
+ #spec{name = <<"query">>,
+ min = 0, max = 1,
+ xmlns = <<"jabber:iq:privacy">>,
+ result = {privacy, '$list', '$default', '$active'},
+ els = [#spec{name = <<"list">>,
+ result = {privacy_list, '$name', '$privacy_item'},
+ attrs = [#attr{name = <<"name">>,
+ required = true}],
+ els = [privacy_item]},
+ #spec{name = <<"default">>,
+ min = 0, max = 1,
+ result = '$name',
+ attrs = [#attr{name = <<"name">>,
+ default = none}]},
+ #spec{name = <<"active">>,
+ min = 0, max = 1,
+ result = '$name',
+ attrs = [#attr{name = <<"name">>,
+ default = none}]}]}}.
+
+{spec, block_item,
+ #spec{name = <<"item">>,
+ label = '$block_item',
+ result = '$jid',
+ attrs = [#attr{name = <<"jid">>,
+ required = true,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}}]}}.
+
+{spec, block,
+ #spec{name = <<"block">>,
+ xmlns = <<"urn:xmpp:blocking">>,
+ min = 0, max = 1,
+ result = {block, '$block_item'},
+ els = [block_item]}}.
+
+{spec, unblock,
+ #spec{name = <<"unblock">>,
+ xmlns = <<"urn:xmpp:blocking">>,
+ min = 0, max = 1,
+ result = {unblock, '$block_item'},
+ els = [block_item]}}.
+
+{spec, block_list,
+ #spec{name = <<"blocklist">>,
+ xmlns = <<"urn:xmpp:blocking">>,
+ result = {block_list},
+ min = 0, max = 1}}.
+
+{spec, disco_info,
+ #spec{name = <<"query">>,
+ min = 0, max = 1,
+ xmlns = <<"http://jabber.org/protocol/disco#info">>,
+ result = {disco_info, '$node', '$identity', '$feature', '$xdata'},
+ attrs = [#attr{name = <<"node">>}],
+ els = [#spec{name = <<"identity">>,
+ result = {'$category', '$type', '$name'},
+ attrs = [#attr{name = <<"category">>,
+ required = true},
+ #attr{name = <<"type">>,
+ required = true},
+ #attr{name = <<"name">>}]},
+ #spec{name = <<"feature">>,
+ result = '$var',
+ attrs = [#attr{name = <<"var">>,
+ required = true}]},
+ xdata]}}.
+
+{spec, disco_items,
+ #spec{name = <<"query">>,
+ min = 0, max = 1,
+ xmlns = <<"http://jabber.org/protocol/disco#items">>,
+ result = {disco_items, '$node', '$items'},
+ attrs = [#attr{name = <<"node">>}],
+ els = [#spec{name = <<"item">>,
+ label = '$items',
+ result = {disco_item, '$jid', '$name', '$node'},
+ cdata = #cdata{label = '$cdata'},
+ attrs = [#attr{name = <<"jid">>,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []},
+ required = true},
+ #attr{name = <<"name">>},
+ #attr{name = <<"node">>}]}]}}.
+
+{spec, private,
+ #spec{name = <<"query">>,
+ min = 0, max = 1,
+ xmlns = <<"jabber:iq:private">>,
+ result = {private, '$_els'}}}.
+
+{spec, bookmark_conference,
+ #spec{name = <<"conference">>,
+ result = {bookmark_conference, '$name', '$jid',
+ '$autojoin', '$nick', '$password'},
+ attrs = [#attr{name = <<"name">>,
+ required = true},
+ #attr{name = <<"jid">>,
+ required = true,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}},
+ #attr{name = <<"autojoin">>,
+ default = false,
+ dec = {dec_bool, []},
+ enc = {enc_bool, []}}],
+ els = [#spec{name = <<"nick">>,
+ min = 0, max = 1,
+ result = '$cdata'},
+ #spec{name = <<"password">>,
+ min = 0, max = 1,
+ result = '$cdata'}]}}.
+
+{spec, storage_bookmarks,
+ #spec{name = <<"storage">>,
+ xmlns = <<"storage:bookmarks">>,
+ min = 0, max = 1,
+ result = {bookmark_storage, '$conference', '$url'},
+ els = [bookmark_conference,
+ #spec{name = <<"url">>,
+ result = {bookmark_url, '$name', '$url'},
+ attrs = [#attr{name = <<"name">>,
+ required = true},
+ #attr{name = <<"url">>,
+ required = true}]}]}}.
+
+{spec, stats,
+ #spec{name = <<"query">>,
+ min = 0, max = 1,
+ xmlns = <<"http://jabber.org/protocol/stats">>,
+ result = {stats, '$stat'},
+ els = [#spec{name = <<"stat">>,
+ result = {stat, '$name', '$units', '$value', '$error'},
+ attrs = [#attr{name = <<"name">>,
+ required = true},
+ #attr{name = <<"units">>},
+ #attr{name = <<"value">>}],
+ els = [#spec{name = <<"error">>,
+ result = {'$code', '$cdata'},
+ attrs = [#attr{name = <<"code">>,
+ required = true,
+ enc = {enc_int, []},
+ dec = {dec_int, []}}]}]}]}}.
+
+{spec, iq,
+ #spec{name = <<"iq">>,
+ min = 0, max = 1,
+ result = {iq, '$id', '$type', '$lang', '$from', '$to',
+ '$error', '$_els'},
+ attrs = [#attr{name = <<"id">>,
+ required = true},
+ #attr{name = <<"type">>,
+ required = true,
+ enc = {enc_enum, []},
+ dec = {dec_enum, [[get, set, result, error]]}},
+ #attr{name = <<"from">>,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}},
+ #attr{name = <<"to">>,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}},
+ #attr{name = <<"xml:lang">>,
+ label = '$lang'}],
+ els = [error]}}.
+
+{spec, message,
+ #spec{name = <<"message">>,
+ min = 0, max = 1,
+ result = {message, '$id', '$type', '$lang', '$from', '$to',
+ '$subject', '$body', '$thread', '$error', '$_els'},
+ attrs = [#attr{name = <<"id">>},
+ #attr{name = <<"type">>,
+ default = normal,
+ enc = {enc_enum, []},
+ dec = {dec_enum, [[chat, normal, groupchat,
+ headline, error]]}},
+ #attr{name = <<"from">>,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}},
+ #attr{name = <<"to">>,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}},
+ #attr{name = <<"xml:lang">>,
+ label = '$lang'}],
+ els = [error,
+ #spec{name = <<"subject">>,
+ result = {'$subject_lang', '$cdata'},
+ attrs = [#attr{name = <<"xml:lang">>,
+ label = '$subject_lang'}]},
+ #spec{name = <<"body">>,
+ result = {'$body_lang', '$cdata'},
+ attrs = [#attr{name = <<"xml:lang">>,
+ label = '$body_lang'}]},
+ #spec{name = <<"thread">>,
+ min = 0, max = 1,
+ result = '$cdata'}]}}.
+
+{spec, presence,
+ #spec{name = <<"presence">>,
+ min = 0, max = 1,
+ result = {presence, '$id', '$type', '$lang', '$from', '$to',
+ '$show', '$status', '$priority', '$error', '$_els'},
+ attrs = [#attr{name = <<"id">>},
+ #attr{name = <<"type">>,
+ enc = {enc_enum, []},
+ dec = {dec_enum, [[unavailable, subscribe, subscribed,
+ unsubscribe, unsubscribed,
+ probe, error]]}},
+ #attr{name = <<"from">>,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}},
+ #attr{name = <<"to">>,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}},
+ #attr{name = <<"xml:lang">>,
+ label = '$lang'}],
+ els = [error,
+ #spec{name = <<"show">>,
+ min = 0, max = 1,
+ result = '$cdata',
+ cdata = #cdata{enc = {enc_enum, []},
+ dec = {dec_enum, [[away, chat, dnd, xa]]}}},
+ #spec{name = <<"status">>,
+ result = {'$status_lang', '$cdata'},
+ attrs = [#attr{name = <<"xml:lang">>,
+ label = '$status_lang'}]},
+ #spec{name = <<"priority">>,
+ min = 0, max = 1,
+ result = '$cdata',
+ cdata = #cdata{enc = {enc_int, []},
+ dec = {dec_int, [-128, 127]}}}]}}.
+
+{spec, error,
+ #spec{name = <<"error">>,
+ min = 0, max = 1,
+ result = {error, '$error_type', '$by', '$reason', '$text'},
+ attrs = [#attr{name = <<"type">>,
+ label = '$error_type',
+ required = true,
+ dec = {dec_enum, [[auth, cancel, continue,
+ modify, wait]]},
+ enc = {enc_enum, []}},
+ #attr{name = <<"by">>}],
+ els = [#spec{name = <<"text">>,
+ min = 0, max = 1,
+ result = {'$text_lang', '$cdata'},
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ attrs = [#attr{name = <<"xml:lang">>,
+ label = '$text_lang'}]},
+ #spec{name = <<"bad-request">>,
+ result = 'bad-request',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"conflict">>,
+ result = 'conflict',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"feature-not-implemented">>,
+ result = 'feature-not-implemented',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"forbidden">>,
+ result = 'forbidden',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"gone">>,
+ result = {'gone', '$cdata'},
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"internal-server-error">>,
+ result = 'internal-server-error',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"item-not-found">>,
+ result = 'item-not-found',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"jid-malformed">>,
+ result = 'jid-malformed',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"not-acceptable">>,
+ result = 'not-acceptable',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"not-allowed">>,
+ result = 'not-allowed',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"not-authorized">>,
+ result = 'not-authorized',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"policy-violation">>,
+ result = 'policy-violation',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"recipient-unavailable">>,
+ result = 'recipient-unavailable',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"redirect">>,
+ result = {'redirect', '$cdata'},
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"registration-required">>,
+ result = 'registration-required',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"remote-server-not-found">>,
+ result = 'remote-server-not-found',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"remote-server-timeout">>,
+ result = 'remote-server-timeout',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"resource-constraint">>,
+ result = 'resource-constraint',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"service-unavailable">>,
+ result = 'service-unavailable',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"subscription-required">>,
+ result = 'subscription-required',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"undefined-condition">>,
+ result = 'undefined-condition',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"unexpected-request">>,
+ result = 'unexpected-request',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-stanzas">>,
+ min = 0, max = 1, label = '$reason'}]}}.
+
+{spec, bind,
+ #spec{name = <<"bind">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-bind">>,
+ min = 0, max = 1,
+ result = {bind, '$jid', '$resource'},
+ els = [#spec{name = <<"jid">>,
+ min = 0, max = 1,
+ result = '$cdata',
+ cdata = #cdata{dec = {dec_jid, []},
+ enc = {enc_jid, []}}},
+ #spec{name = <<"resource">>,
+ min = 0, max = 1,
+ result = '$cdata',
+ cdata = #cdata{dec = {resourceprep, []},
+ enc = {resourceprep, []}}}]}}.
+
+{spec, sasl_auth,
+ #spec{name = <<"auth">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-sasl">>,
+ min = 0, max = 1,
+ cdata = #cdata{dec = {base64, decode, []},
+ enc = {base64, encode, []}},
+ result = {sasl_auth, '$mechanism', '$cdata'},
+ attrs = [#attr{name = <<"mechanism">>,
+ required = true}]}}.
+
+{spec, sasl_abort,
+ #spec{name = <<"abort">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-sasl">>,
+ min = 0, max = 1,
+ result = {sasl_abort}}}.
+
+{spec, sasl_challenge,
+ #spec{name = <<"challenge">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-sasl">>,
+ min = 0, max = 1,
+ cdata = #cdata{dec = {base64, decode, []},
+ enc = {base64, encode, []}},
+ result = {sasl_challenge, '$cdata'}}}.
+
+{spec, sasl_response,
+ #spec{name = <<"response">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-sasl">>,
+ min = 0, max = 1,
+ cdata = #cdata{dec = {base64, decode, []},
+ enc = {base64, encode, []}},
+ result = {sasl_response, '$cdata'}}}.
+
+{spec, sasl_success,
+ #spec{name = <<"success">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-sasl">>,
+ min = 0, max = 1,
+ cdata = #cdata{dec = {base64, decode, []},
+ enc = {base64, encode, []}},
+ result = {sasl_success, '$cdata'}}}.
+
+{spec, sasl_failure,
+ #spec{name = <<"failure">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-sasl">>,
+ min = 0, max = 1,
+ result = {sasl_failure, '$reason', '$text'},
+ els = [#spec{name = <<"text">>,
+ min = 0, max = 1,
+ result = {'$text_lang', '$cdata'},
+ attrs = [#attr{name = <<"xml:lang">>,
+ label = '$text_lang'}]},
+ #spec{name = <<"aborted">>,
+ result = 'aborted',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"account-disabled">>,
+ result = 'account-disabled',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"credentials-expired">>,
+ result = 'credentials-expired',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"encryption-required">>,
+ result = 'encryption-required',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"incorrect-encoding">>,
+ result = 'incorrect-encoding',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"invalid-authzid">>,
+ result = 'invalid-authzid',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"invalid-mechanism">>,
+ result = 'invalid-mechanism',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"malformed-request">>,
+ result = 'malformed-request',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"mechanism-too-weak">>,
+ result = 'mechanism-too-weak',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"not-authorized">>,
+ result = 'not-authorized',
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"temporary-auth-failure">>,
+ result = 'temporary-auth-failure',
+ min = 0, max = 1, label = '$reason'}]}}.
+
+{spec, sasl_mechanism,
+ #spec{name = <<"mechanism">>,
+ result = '$cdata',
+ min = 1,
+ cdata = #cdata{}}}.
+
+{spec, sasl_mechanisms,
+ #spec{name = <<"mechanisms">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-sasl">>,
+ result = {sasl_mechanisms, '$mechanism'},
+ min = 0, max = 1,
+ els = [sasl_mechanism]}}.
+
+{spec, starttls,
+ #spec{name = <<"starttls">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-tls">>,
+ min = 0, max = 1,
+ result = {starttls, '$required'},
+ els = [#spec{name = <<"required">>,
+ min = 0, max = 1,
+ default = false,
+ result = true}]}}.
+
+{spec, starttls_proceed,
+ #spec{name = <<"proceed">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-tls">>,
+ min = 0, max = 1,
+ result = {starttls_proceed}}}.
+
+{spec, starttls_failure,
+ #spec{name = <<"failure">>,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-tls">>,
+ min = 0, max = 1,
+ result = {starttls_failure}}}.
+
+{spec, stream_features,
+ #spec{name = <<"stream:features">>,
+ min = 0, max = 1,
+ result = {stream_features, '$_els'}}}.
+
+{spec, p1_push,
+ #spec{name = <<"push">>,
+ min = 0, max = 1,
+ result = {p1_push},
+ xmlns = <<"p1:push">>}}.
+
+{spec, p1_rebind,
+ #spec{name = <<"rebind">>,
+ min = 0, max = 1,
+ result = {p1_rebind},
+ xmlns = <<"p1:rebind">>}}.
+
+{spec, p1_ack,
+ #spec{name = <<"ack">>,
+ min = 0, max = 1,
+ result = {p1_ack},
+ xmlns = <<"p1:ack">>}}.
+
+{spec, caps,
+ #spec{name = <<"c">>,
+ min = 0, max = 1,
+ xmlns = <<"http://jabber.org/protocol/caps">>,
+ result = {caps, '$hash', '$node', '$ver'},
+ attrs = [#attr{name = <<"hash">>},
+ #attr{name = <<"node">>},
+ #attr{name = <<"ver">>,
+ enc = {base64, encode, []},
+ dec = {base64, decode, []}}]}}.
+
+{spec, register,
+ #spec{name = <<"register">>,
+ min = 0, max = 1,
+ xmlns = <<"http://jabber.org/features/iq-register">>,
+ result = {register}}}.
+
+{spec, session,
+ #spec{name = <<"session">>,
+ min = 0, max = 1,
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-session">>,
+ result = {session}}}.
+
+{spec, ping,
+ #spec{name = <<"ping">>,
+ min = 0, max = 1,
+ xmlns = <<"urn:xmpp:ping">>,
+ result = {ping}}}.
+
+{spec, time,
+ #spec{name = <<"time">>,
+ min = 0, max = 1,
+ xmlns = <<"urn:xmpp:time">>,
+ result = {time, '$tzo', '$utc'},
+ els = [#spec{name = <<"tzo">>,
+ min = 0, max = 1,
+ result = '$cdata',
+ cdata = #cdata{dec = {dec_tzo, []},
+ enc = {enc_tzo, []}}},
+ #spec{name = <<"utc">>,
+ min = 0, max = 1,
+ result = '$cdata',
+ cdata = #cdata{dec = {dec_utc, []},
+ enc = {enc_utc, []}}}]}}.
+
+{spec, stream_error,
+ #spec{name = <<"stream:error">>,
+ min = 0, max = 1,
+ result = {stream_error, '$reason', '$text'},
+ els = [#spec{name = <<"text">>,
+ min = 0, max = 1,
+ result = {'$text_lang', '$cdata'},
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ attrs = [#attr{name = <<"xml:lang">>,
+ label = '$text_lang'}]},
+ #spec{name = <<"bad-format">>,
+ result = 'bad-format',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"bad-namespace-prefix">>,
+ result = 'bad-namespace-prefix',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"conflict">>,
+ result = 'conflict',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"connection-timeout">>,
+ result = 'connection-timeout',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"host-gone">>,
+ result = 'host-gone',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"host-unknown">>,
+ result = 'host-unknown',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"improper-addressing">>,
+ result = 'improper-addressing',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"internal-server-error">>,
+ result = 'internal-server-error',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"invalid-from">>,
+ result = 'invalid-from',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"invalid-id">>,
+ result = 'invalid-id',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"invalid-namespace">>,
+ result = 'invalid-namespace',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"invalid-xml">>,
+ result = 'invalid-xml',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"not-authorized">>,
+ result = 'not-authorized',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"not-well-formed">>,
+ result = 'not-well-formed',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"policy-violation">>,
+ result = 'policy-violation',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"remote-connection-failed">>,
+ result = 'remote-connection-failed',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"reset">>,
+ result = 'reset',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"resource-constraint">>,
+ result = 'resource-constraint',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"restricted-xml">>,
+ result = 'restricted-xml',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"see-other-host">>,
+ result = {'see-other-host', '$cdata'},
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"system-shutdown">>,
+ result = 'system-shutdown',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"undefined-condition">>,
+ result = 'undefined-condition',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"unsupported-encoding">>,
+ result = 'unsupported-encoding',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"unsupported-stanza-type">>,
+ result = 'unsupported-stanza-type',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'},
+ #spec{name = <<"unsupported-version">>,
+ result = 'unsupported-version',
+ xmlns = <<"urn:ietf:params:xml:ns:xmpp-streams">>,
+ min = 0, max = 1, label = '$reason'}
+ ]}}.
+
+{spec, vcard_name,
+ #spec{name = <<"N">>, label = '$n',
+ min = 0, max = 1,
+ result = {vcard_name, '$family', '$given', '$middle',
+ '$prefix', '$suffix'},
+ els = [#spec{name = <<"FAMILY">>, label = '$family',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"GIVEN">>, label = '$given',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"MIDDLE">>, label = '$middle',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"PREFIX">>, label = '$prefix',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"SUFFIX">>, label = '$suffix',
+ min = 0, max = 1, result = '$cdata'}]}}.
+
+{spec, vcard_adr,
+ #spec{name = <<"ADR">>, label = '$adr',
+ result = {vcard_adr, '$home', '$work', '$postal', '$parcel',
+ '$dom', '$intl', '$pref', '$pobox', '$extadd', '$street',
+ '$locality', '$region', '$pcode', '$ctry'},
+ els = [#spec{name = <<"HOME">>, label = '$home',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"WORK">>, label = '$work',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"POSTAL">>, label = '$postal',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"PARCEL">>, label = '$parcel',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"DOM">>, label = '$dom',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"INTL">>, label = '$intl',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"PREF">>, label = '$pref',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"POBOX">>, label = '$pobox',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"EXTADD">>, label = '$extadd',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"STREET">>, label = '$street',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"LOCALITY">>, label = '$locality',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"REGION">>, label = '$region',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"PCODE">>, label = '$pcode',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"CTRY">>, label = '$ctry',
+ min = 0, max = 1, result = '$cdata'}]}}.
+
+{spec, vcard_label,
+ #spec{name = <<"LABEL">>, label = '$label',
+ result = {vcard_label, '$home', '$work', '$postal', '$parcel',
+ '$dom', '$intl', '$pref', '$line'},
+ els = [#spec{name = <<"HOME">>, label = '$home',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"WORK">>, label = '$work',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"POSTAL">>, label = '$postal',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"PARCEL">>, label = '$parcel',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"DOM">>, label = '$dom',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"INTL">>, label = '$intl',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"PREF">>, label = '$pref',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"LINE">>, label = '$line',
+ result = '$cdata'}]}}.
+
+{spec, vcard_tel,
+ #spec{name = <<"TEL">>, label = '$tel',
+ result = {vcard_tel, '$home', '$work', '$voice', '$fax',
+ '$pager', '$msg', '$cell', '$video', '$bbs',
+ '$modem', '$isdn', '$pcs', '$pref', '$number'},
+ els = [#spec{name = <<"HOME">>, label = '$home',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"WORK">>, label = '$work',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"VOICE">>, label = '$voice',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"FAX">>, label = '$fax',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"PAGER">>, label = '$pager',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"MSG">>, label = '$msg',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"CELL">>, label = '$cell',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"VIDEO">>, label = '$video',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"BBS">>, label = '$bbs',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"MODEM">>, label = '$modem',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"ISDN">>, label = '$isdn',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"PCS">>, label = '$pcs',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"PREF">>, label = '$pref',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"NUMBER">>, label = '$number',
+ min = 1, max = 1, result = '$cdata'}]}}.
+
+{spec, vcard_email,
+ #spec{name = <<"EMAIL">>, label = '$email',
+ result = {vcard_email, '$home', '$work',
+ '$internet', '$pref', '$x400', '$userid'},
+ els = [#spec{name = <<"HOME">>, label = '$home',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"WORK">>, label = '$work',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"INTERNET">>, label = '$internet',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"PREF">>, label = '$pref',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"X400">>, label = '$x400',
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"USERID">>, label = '$userid',
+ min = 1, max = 1, result = '$cdata'}]}}.
+
+{spec, vcard_geo,
+ #spec{name = <<"GEO">>, label = '$geo',
+ min = 0, max = 1,
+ result = {vcard_geo, '$lat', '$lon'},
+ els = [#spec{name = <<"LAT">>, label = '$lat',
+ min = 1, max = 1, result = '$cdata'},
+ #spec{name = <<"LON">>, label = '$lon',
+ min = 1, max = 1, result = '$cdata'}]}}.
+
+{spec, vcard_type,
+ #spec{name = <<"TYPE">>, label = '$type',
+ min = 0, max = 1,
+ result = '$cdata'}}.
+
+{spec, vcard_binval,
+ #spec{name = <<"BINVAL">>, label = '$binval',
+ min = 0, max = 1,
+ cdata = #cdata{dec = {base64, decode, []},
+ enc = {base64, encode, []}},
+ result = '$cdata'}}.
+
+{spec, vcard_extval,
+ #spec{name = <<"EXTVAL">>, label = '$extval',
+ min = 0, max = 1,
+ result = '$cdata'}}.
+
+{spec, vcard_logo,
+ #spec{name = <<"LOGO">>, label = '$logo',
+ min = 0, max = 1,
+ result = {vcard_logo, '$type', '$binval', '$extval'},
+ els = [vcard_type, vcard_binval, vcard_extval]}}.
+
+{spec, vcard_photo,
+ #spec{name = <<"PHOTO">>, label = '$photo',
+ min = 0, max = 1,
+ result = {vcard_photo, '$type', '$binval', '$extval'},
+ els = [vcard_type, vcard_binval, vcard_extval]}}.
+
+{spec, vcard_org,
+ #spec{name = <<"ORG">>, label = '$org',
+ min = 0, max = 1,
+ result = {vcard_org, '$name', '$units'},
+ els = [#spec{name = <<"ORGNAME">>,
+ label = '$name',
+ min = 1, max = 1,
+ result = '$cdata'},
+ #spec{name = <<"ORGUNIT">>,
+ label = '$units',
+ result = '$cdata'}]}}.
+
+{spec, vcard_sound,
+ #spec{name = <<"SOUND">>, label = '$sound',
+ min = 0, max = 1,
+ result = {vcard_sound, '$phonetic', '$binval', '$extval'},
+ els = [vcard_binval, vcard_extval,
+ #spec{name = <<"PHONETIC">>,
+ min = 0, max = 1,
+ result = '$cdata'}]}}.
+
+{spec, vcard_key,
+ #spec{name = <<"KEY">>, label = '$key',
+ min = 0, max = 1,
+ result = {vcard_key, '$type', '$cred'},
+ els = [vcard_type,
+ #spec{name = <<"CRED">>,
+ min = 1, max = 1,
+ result = '$cdata'}]}}.
+
+{spec, vcard,
+ #spec{name = <<"vCard">>,
+ xmlns = <<"vcard-temp">>,
+ min = 0, max = 1,
+ result = {vcard, '$version', '$fn', '$n', '$nickname', '$photo',
+ '$bday', '$adr', '$label', '$tel', '$email', '$jabberid',
+ '$mailer', '$tz', '$geo', '$title', '$role', '$logo',
+ %% '$agent' XXX: recursive specs are to be implemented
+ '$org', '$categories', '$note', '$prodid',
+ '$rev', '$sort-string', '$sound', '$uid', '$url', '$class',
+ '$key', '$desc'},
+ els = [vcard_name, vcard_adr, vcard_label, vcard_tel,
+ vcard_email, vcard_geo, vcard_logo, vcard_photo,
+ vcard_org, vcard_sound, vcard_key,
+ #spec{name = <<"VERSION">>, label = '$version',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"FN">>, label = '$fn',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"NICKNAME">>, label = '$nickname',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"BDAY">>, label = '$bday',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"JABBERID">>, label = '$jabberid',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"MAILER">>, label = '$mailer',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"TZ">>, label = '$tz',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"TITLE">>, label = '$title',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"ROLE">>, label = '$role',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"CATEGORIES">>, label = '$categories',
+ default = [],
+ min = 0, max = 1,
+ result = '$keywords',
+ els = [#spec{name = <<"KEYWORD">>,
+ label = '$keywords',
+ result = '$cdata'}]},
+ #spec{name = <<"NOTE">>, label = '$note',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"PRODID">>, label = '$prodid',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"REV">>, label = '$rev',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"SORT-STRING">>, label = '$sort-string',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"UID">>, label = '$uid',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"URL">>, label = '$url',
+ min = 0, max = 1, result = '$cdata'},
+ #spec{name = <<"CLASS">>, label = '$class',
+ min = 0, max = 1,
+ result = '$value',
+ els = [#spec{name = <<"PUBLIC">>,
+ min = 0, max = 1,
+ label = '$value',
+ result = public},
+ #spec{name = <<"PRIVATE">>,
+ label = '$value',
+ min = 0, max = 1,
+ result = private},
+ #spec{name = <<"CONFIDENTIAL">>,
+ label = '$value',
+ min = 0, max = 1,
+ result = confidential}]},
+ #spec{name = <<"DESC">>, label = '$desc',
+ min = 0, max = 1, result = '$cdata'}]}}.
+
+{spec, xfield,
+ #spec{name = <<"field">>,
+ label = '$fields',
+ result = {xfield, '$label', '$type', '$var',
+ '$required', '$desc', '$values', '$options'},
+ attrs = [#attr{name = <<"label">>},
+ #attr{name = <<"type">>,
+ enc = {enc_enum, []},
+ dec = {dec_enum, [['boolean',
+ 'fixed',
+ 'hidden',
+ 'jid-multi',
+ 'jid-single',
+ 'list-multi',
+ 'list-single',
+ 'text-multi',
+ 'text-private',
+ 'text-single']]}},
+ #attr{name = <<"var">>}],
+ els = [#spec{name = <<"required">>,
+ default = false, result = true,
+ min = 0, max = 1},
+ #spec{name = <<"desc">>,
+ min = 0, max = 1,
+ result = '$cdata'},
+ #spec{name = <<"value">>,
+ label = '$values',
+ result = '$cdata'},
+ #spec{name = <<"option">>,
+ label = '$options',
+ result = '$value',
+ els = [#spec{name = <<"value">>,
+ min = 1, max = 1,
+ result = '$cdata'}]}]}}.
+
+{spec, xdata,
+ #spec{name = <<"x">>,
+ label = '$xdata',
+ xmlns = <<"jabber:x:data">>,
+ result = {xdata, '$type', '$instructions', '$title',
+ '$reported', '$items', '$fields'},
+ attrs = [#attr{name = <<"type">>,
+ required = true,
+ dec = {dec_enum, [[cancel, form, result, submit]]},
+ enc = {enc_enum, []}}],
+ els = [#spec{name = <<"instructions">>,
+ result = '$cdata'},
+ #spec{name = <<"title">>,
+ min = 0, max = 1,
+ result = '$cdata'},
+ #spec{name = <<"reported">>,
+ min = 0, max = 1,
+ result = '$fields',
+ els = [xfield]},
+ #spec{name = <<"item">>,
+ label = '$items',
+ result = '$fields',
+ els = [xfield]},
+ xfield]}}.
+
+{spec, pubsub_subscription,
+ #spec{name = <<"subscription">>,
+ label = '$pubsub_subscriptions',
+ result = {pubsub_subscription, '$jid', '$node', '$subid',
+ '$type'},
+ attrs = [#attr{name = <<"jid">>,
+ required = true,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}},
+ #attr{name = <<"node">>},
+ #attr{name = <<"subid">>},
+ #attr{name = <<"subscription">>,
+ label = '$type',
+ dec = {dec_enum, [[none, pending, subscribed,
+ unconfigured]]},
+ enc = {enc_enum, []}}]}}.
+
+{spec, pubsub_affiliation,
+ #spec{name = <<"affiliation">>,
+ label = '$pubsub_affiliations',
+ result = {pubsub_affiliation, '$node', '$type'},
+ attrs = [#attr{name = <<"node">>,
+ required = true},
+ #attr{name = <<"affiliation">>,
+ label = '$type',
+ required = true,
+ dec = {dec_enum, [[member, none, outcast, owner,
+ publisher, 'publish-only']]},
+ enc = {enc_enum, []}}]}}.
+
+{spec, pubsub_item,
+ #spec{name = <<"item">>,
+ result = {pubsub_item, '$id', '$_els'},
+ attrs = [#attr{name = <<"id">>}]}}.
+
+{spec, pubsub_items,
+ #spec{name = <<"items">>,
+ result = {pubsub_items, '$node', '$max_items',
+ '$subid', '$item'},
+ attrs = [#attr{name = <<"max_items">>,
+ dec = {dec_int, [0, infinity]},
+ enc = {enc_int, []}},
+ #attr{name = <<"node">>,
+ required = true},
+ #attr{name = <<"subid">>}],
+ els = [pubsub_item]}}.
+
+{spec, pubsub_event,
+ #spec{name = <<"event">>,
+ min = 0, max = 1,
+ xmlns = <<"http://jabber.org/protocol/pubsub#event">>,
+ result = {pubsub_event, '$items'},
+ els = [pubsub_items]}}.
+
+{spec, pubsub,
+ #spec{name = <<"pubsub">>,
+ xmlns = <<"http://jabber.org/protocol/pubsub">>,
+ result = {pubsub, '$subscriptions', '$affiliations', '$publish',
+ '$subscribe'},
+ min = 0, max = 1,
+ els = [#spec{name = <<"subscriptions">>,
+ min = 0, max = 1,
+ result = {'$node', '$pubsub_subscriptions'},
+ attrs = [#attr{name = <<"node">>,
+ default = none}],
+ els = [pubsub_subscription]},
+ #spec{name = <<"affiliations">>,
+ min = 0, max = 1,
+ result = '$pubsub_affiliations',
+ els = [pubsub_affiliation]},
+ #spec{name = <<"subscribe">>,
+ min = 0, max = 1,
+ result = {'$node', '$jid'},
+ attrs = [#attr{name = <<"node">>},
+ #attr{name = <<"jid">>,
+ required = true,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}}]},
+ #spec{name = <<"publish">>,
+ min = 0, max = 1,
+ result = {'$node', '$item'},
+ attrs = [#attr{name = <<"node">>,
+ required = true}],
+ els = [pubsub_item]}]}}.
+
+{spec, delay,
+ #spec{name = <<"delay">>,
+ min = 0, max = 1,
+ xmlns = <<"urn:xmpp:delay">>,
+ result = {delay, '$stamp', '$from'},
+ attrs = [#attr{name = <<"stamp">>,
+ required = true,
+ dec = {dec_utc, []},
+ enc = {enc_utc, []}},
+ #attr{name = <<"from">>,
+ dec = {dec_jid, []},
+ enc = {enc_jid, []}}]}}.
+
+dec_tzo(Val) ->
+ [H1, M1] = str:tokens(Val, <<":">>),
+ H = erlang:binary_to_integer(H1),
+ M = erlang:binary_to_integer(M1),
+ if H >= -12, H =< 12, M >= 0, M < 60 ->
+ {H, M}
+ end.
+
+enc_tzo({H, M}) ->
+ Sign = if H >= 0 ->
+ <<>>;
+ true ->
+ <<"-">>
+ end,
+ list_to_binary([Sign, io_lib:format("~2..0w:~2..0w", [H, M])]).
+
+dec_utc(Val) ->
+ {_, _, _} = jlib:datetime_string_to_timestamp(Val).
+
+enc_utc(Val) ->
+ jlib:now_to_utc_string(Val).
+
+dec_jid(Val) ->
+ case jlib:string_to_jid(Val) of
+ error ->
+ erlang:error(badarg);
+ J ->
+ J
+ end.
+
+enc_jid(J) ->
+ jlib:jid_to_string(J).
+
+resourceprep(R) ->
+ case jlib:resourceprep(R) of
+ error ->
+ erlang:error(badarg);
+ R1 ->
+ R1
+ end.
+
+dec_bool(<<"false">>) -> false;
+dec_bool(<<"true">>) -> true.
+
+enc_bool(false) -> <<"false">>;
+enc_bool(true) -> <<"true">>.
+
+%% Local Variables:
+%% mode: erlang
+%% End:
+%% vim: set filetype=erlang tabstop=8: