diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/ejabberd.hrl | 4 | ||||
-rw-r--r-- | include/flex_offline.hrl | 10 | ||||
-rw-r--r-- | include/jid.hrl | 17 | ||||
-rw-r--r-- | include/mod_mam.hrl | 2 | ||||
-rw-r--r-- | include/mod_muc_room.hrl | 3 | ||||
-rw-r--r-- | include/mod_privacy.hrl | 11 | ||||
-rw-r--r-- | include/mod_roster.hrl | 6 | ||||
-rw-r--r-- | include/muc_register.hrl | 16 | ||||
-rw-r--r-- | include/muc_request.hrl | 16 | ||||
-rw-r--r-- | include/muc_roomconfig.hrl | 55 | ||||
-rw-r--r-- | include/muc_roominfo.hrl | 18 | ||||
-rw-r--r-- | include/ns.hrl | 6 | ||||
-rw-r--r-- | include/pubsub_get_pending.hrl | 13 | ||||
-rw-r--r-- | include/pubsub_node_config.hrl | 60 | ||||
-rw-r--r-- | include/pubsub_publish_options.hrl | 14 | ||||
-rw-r--r-- | include/pubsub_subscribe_authorization.hrl | 13 | ||||
-rw-r--r-- | include/pubsub_subscribe_options.hrl | 25 | ||||
-rw-r--r-- | include/xmpp.hrl | 29 | ||||
-rw-r--r-- | include/xmpp_codec.hrl | 1092 |
19 files changed, 1399 insertions, 11 deletions
diff --git a/include/ejabberd.hrl b/include/ejabberd.hrl index 6316d7813..7a6df5644 100644 --- a/include/ejabberd.hrl +++ b/include/ejabberd.hrl @@ -39,7 +39,7 @@ -define(EJABBERD_URI, <<"http://www.process-one.net/en/ejabberd/">>). --define(S2STIMEOUT, 600000). +-define(S2STIMEOUT, timer:minutes(10)). %%-define(DBGFSM, true). @@ -64,7 +64,7 @@ -define(TDICT, dict:dict()). -define(TGB_TREE, gb_trees:tree()). --define(TGB_SET, gb_set:set()). +-define(TGB_SET, gb_sets:set()). -define(TQUEUE, queue:queue()). -endif. diff --git a/include/flex_offline.hrl b/include/flex_offline.hrl new file mode 100644 index 000000000..74a38fbb3 --- /dev/null +++ b/include/flex_offline.hrl @@ -0,0 +1,10 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: flex_offline.xdata +%% Form type: http://jabber.org/protocol/offline +%% Document: XEP-0013 + + +-type property() :: {'number_of_messages', non_neg_integer()}. +-type result() :: [property()]. + +-type form() :: [property() | xdata_field()]. diff --git a/include/jid.hrl b/include/jid.hrl new file mode 100644 index 000000000..965985c31 --- /dev/null +++ b/include/jid.hrl @@ -0,0 +1,17 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net> +%%% @copyright (C) 2016, Evgeny Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 10 Jul 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net> +%%%------------------------------------------------------------------- +-record(jid, {user = <<"">> :: binary(), + server = <<"">> :: binary(), + resource = <<"">> :: binary(), + luser = <<"">> :: binary(), + lserver = <<"">> :: binary(), + lresource = <<"">> :: binary()}). + +-type(jid() :: #jid{}). +-type(ljid() :: {binary(), binary(), binary()}). diff --git a/include/mod_mam.hrl b/include/mod_mam.hrl index 463db4cff..a2b92fca5 100644 --- a/include/mod_mam.hrl +++ b/include/mod_mam.hrl @@ -4,7 +4,7 @@ timestamp = p1_time_compat:timestamp() :: erlang:timestamp() | '_' | '$1', peer = {<<"">>, <<"">>, <<"">>} :: ljid() | '_' | '$3' | undefined, bare_peer = {<<"">>, <<"">>, <<"">>} :: ljid() | '_' | '$3', - packet = #xmlel{} :: xmlel() | '_', + packet = #xmlel{} :: xmlel() | message() | '_', nick = <<"">> :: binary(), type = chat :: chat | groupchat}). diff --git a/include/mod_muc_room.hrl b/include/mod_muc_room.hrl index 551da7285..dd414a8d8 100644 --- a/include/mod_muc_room.hrl +++ b/include/mod_muc_room.hrl @@ -71,6 +71,7 @@ -type config() :: #config{}. -type role() :: moderator | participant | visitor | none. +-type affiliation() :: admin | member | outcast | owner | none. -record(user, { @@ -126,5 +127,3 @@ host = <<>> :: binary() | '_' | '$2'}). -type muc_online_users() :: #muc_online_users{}. - --type muc_room_state() :: #state{}. diff --git a/include/mod_privacy.hrl b/include/mod_privacy.hrl index 8fe5abcca..dbd19a081 100644 --- a/include/mod_privacy.hrl +++ b/include/mod_privacy.hrl @@ -22,9 +22,11 @@ default = none :: none | binary(), lists = [] :: [{binary(), [listitem()]}]}). --record(listitem, {type = none :: none | jid | group | subscription, - value = none :: none | both | from | to | ljid() | binary(), - action = allow :: allow | deny, +-type privacy() :: #privacy{}. + +-record(listitem, {type = none :: listitem_type(), + value = none :: listitem_value(), + action = allow :: listitem_action(), order = 0 :: integer(), match_all = false :: boolean(), match_iq = false :: boolean(), @@ -33,6 +35,9 @@ match_presence_out = false :: boolean()}). -type listitem() :: #listitem{}. +-type listitem_type() :: none | jid | group | subscription. +-type listitem_value() :: none | both | from | to | jid:ljid() | binary(). +-type listitem_action() :: allow | deny. -record(userlist, {name = none :: none | binary(), list = [] :: [listitem()], diff --git a/include/mod_roster.hrl b/include/mod_roster.hrl index b05114e3e..818508703 100644 --- a/include/mod_roster.hrl +++ b/include/mod_roster.hrl @@ -20,15 +20,15 @@ -record(roster, { - usj = {<<>>, <<>>, {<<>>, <<>>, <<>>}} :: {binary(), binary(), ljid()} | '_', + usj = {<<>>, <<>>, {<<>>, <<>>, <<>>}} :: {binary(), binary(), jid:ljid()} | '_', us = {<<>>, <<>>} :: {binary(), binary()} | '_', - jid = {<<>>, <<>>, <<>>} :: ljid(), + jid = {<<>>, <<>>, <<>>} :: jid:ljid(), name = <<>> :: binary() | '_', subscription = none :: subscription() | '_', ask = none :: ask() | '_', groups = [] :: [binary()] | '_', askmessage = <<"">> :: binary() | '_', - xs = [] :: [xmlel()] | '_' + xs = [] :: [fxml:xmlel()] | '_' }). -record(roster_version, diff --git a/include/muc_register.hrl b/include/muc_register.hrl new file mode 100644 index 000000000..0cfc928c2 --- /dev/null +++ b/include/muc_register.hrl @@ -0,0 +1,16 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: muc_register.xdata +%% Form type: http://jabber.org/protocol/muc#register +%% Document: XEP-0045 + + +-type property() :: {'allow', boolean()} | + {'email', binary()} | + {'faqentry', [binary()]} | + {'first', binary()} | + {'last', binary()} | + {'roomnick', binary()} | + {'url', binary()}. +-type result() :: [property()]. + +-type form() :: [property() | xdata_field()]. diff --git a/include/muc_request.hrl b/include/muc_request.hrl new file mode 100644 index 000000000..bc14be35f --- /dev/null +++ b/include/muc_request.hrl @@ -0,0 +1,16 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: muc_request.xdata +%% Form type: http://jabber.org/protocol/muc#request +%% Document: XEP-0045 + + +-type property() :: {'role', participant} | + {'jid', jid:jid()} | + {'roomnick', binary()} | + {'request_allow', boolean()}. +-type result() :: [property()]. + +-type options(T) :: [{binary(), T}]. +-type property_with_options() :: + {'role', participant, options(participant)}. +-type form() :: [property() | property_with_options() | xdata_field()]. diff --git a/include/muc_roomconfig.hrl b/include/muc_roomconfig.hrl new file mode 100644 index 000000000..89cfc3346 --- /dev/null +++ b/include/muc_roomconfig.hrl @@ -0,0 +1,55 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: muc_roomconfig.xdata +%% Form type: http://jabber.org/protocol/muc#roomconfig +%% Document: XEP-0045 + +-type 'allow_private_messages_from_visitors'() :: nobody | moderators | anyone. +-type 'maxusers'() :: none | non_neg_integer(). +-type 'presencebroadcast'() :: moderator | participant | visitor. +-type 'whois'() :: moderators | anyone. + +-type property() :: {'maxhistoryfetch', binary()} | + {'allowpm', binary()} | + {'allow_private_messages', boolean()} | + {'allow_private_messages_from_visitors', 'allow_private_messages_from_visitors'()} | + {'allow_visitor_status', boolean()} | + {'allow_visitor_nickchange', boolean()} | + {'allow_voice_requests', boolean()} | + {'allow_subscription', boolean()} | + {'voice_request_min_interval', non_neg_integer()} | + {'captcha_protected', boolean()} | + {'captcha_whitelist', [jid:jid()]} | + {'allow_query_users', boolean()} | + {'allowinvites', boolean()} | + {'changesubject', boolean()} | + {'enablelogging', boolean()} | + {'getmemberlist', [binary()]} | + {'lang', binary()} | + {'pubsub', binary()} | + {'maxusers', 'maxusers'()} | + {'membersonly', boolean()} | + {'moderatedroom', boolean()} | + {'members_by_default', boolean()} | + {'passwordprotectedroom', boolean()} | + {'persistentroom', boolean()} | + {'presencebroadcast', ['presencebroadcast'()]} | + {'publicroom', boolean()} | + {'public_list', boolean()} | + {'roomadmins', [jid:jid()]} | + {'roomdesc', binary()} | + {'roomname', binary()} | + {'roomowners', [jid:jid()]} | + {'roomsecret', binary()} | + {'whois', 'whois'()} | + {'mam', boolean()}. +-type result() :: [property()]. + +-type options(T) :: [{binary(), T}]. +-type property_with_options() :: + {'allowpm', binary(), options(binary())} | + {'allow_private_messages_from_visitors', 'allow_private_messages_from_visitors'(), options('allow_private_messages_from_visitors'())} | + {'getmemberlist', [binary()], options(binary())} | + {'maxusers', 'maxusers'(), options('maxusers'())} | + {'presencebroadcast', ['presencebroadcast'()], options('presencebroadcast'())} | + {'whois', 'whois'(), options('whois'())}. +-type form() :: [property() | property_with_options() | xdata_field()]. diff --git a/include/muc_roominfo.hrl b/include/muc_roominfo.hrl new file mode 100644 index 000000000..cf4f4ebf0 --- /dev/null +++ b/include/muc_roominfo.hrl @@ -0,0 +1,18 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: muc_roominfo.xdata +%% Form type: http://jabber.org/protocol/muc#roominfo +%% Document: XEP-0045 + + +-type property() :: {'maxhistoryfetch', non_neg_integer()} | + {'contactjid', [jid:jid()]} | + {'description', binary()} | + {'lang', binary()} | + {'ldapgroup', binary()} | + {'logs', binary()} | + {'occupants', non_neg_integer()} | + {'subject', binary()} | + {'subjectmod', boolean()}. +-type result() :: [property()]. + +-type form() :: [property() | xdata_field()]. diff --git a/include/ns.hrl b/include/ns.hrl index 3dbc765b0..d94c2a95f 100644 --- a/include/ns.hrl +++ b/include/ns.hrl @@ -18,6 +18,10 @@ %%% %%%---------------------------------------------------------------------- +-define(NS_COMPONENT, <<"jabber:component:accept">>). +-define(NS_SERVER, <<"jabber:server">>). +-define(NS_SERVER_DIALBACK, <<"jabber:server:dialback">>). +-define(NS_CLIENT, <<"jabber:client">>). -define(NS_DISCO_ITEMS, <<"http://jabber.org/protocol/disco#items">>). -define(NS_DISCO_INFO, @@ -157,6 +161,8 @@ -define(NS_HTTP_UPLOAD_OLD, <<"eu:siacs:conversations:http:upload">>). -define(NS_THUMBS_1, <<"urn:xmpp:thumbs:1">>). -define(NS_NICK, <<"http://jabber.org/protocol/nick">>). +-define(NS_SIC_0, <<"urn:xmpp:sic:0">>). +-define(NS_SIC_1, <<"urn:xmpp:sic:1">>). -define(NS_MIX_0, <<"urn:xmpp:mix:0">>). -define(NS_MIX_SERVICEINFO_0, <<"urn:xmpp:mix:0#serviceinfo">>). -define(NS_MIX_NODES_MESSAGES, <<"urn:xmpp:mix:nodes:messages">>). diff --git a/include/pubsub_get_pending.hrl b/include/pubsub_get_pending.hrl new file mode 100644 index 000000000..4ddf9bad0 --- /dev/null +++ b/include/pubsub_get_pending.hrl @@ -0,0 +1,13 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: pubsub_get_pending.xdata +%% Form type: http://jabber.org/protocol/pubsub#subscribe_authorization +%% Document: XEP-0060 + + +-type property() :: {'node', binary()}. +-type result() :: [property()]. + +-type options(T) :: [{binary(), T}]. +-type property_with_options() :: + {'node', binary(), options(binary())}. +-type form() :: [property() | property_with_options() | xdata_field()]. diff --git a/include/pubsub_node_config.hrl b/include/pubsub_node_config.hrl new file mode 100644 index 000000000..e1519cdc0 --- /dev/null +++ b/include/pubsub_node_config.hrl @@ -0,0 +1,60 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: pubsub_node_config.xdata +%% Form type: http://jabber.org/protocol/pubsub#node_config +%% Document: XEP-0060 + +-type 'access_model'() :: authorize | open | presence | roster | whitelist. +-type 'children_association_policy'() :: all | owners | whitelist. +-type 'itemreply'() :: owner | publisher | none. +-type 'node_type'() :: leaf | collection. +-type 'notification_type'() :: normal | headline. +-type 'publish_model'() :: publishers | subscribers | open. +-type 'send_last_published_item'() :: never | on_sub | on_sub_and_presence. + +-type property() :: {'access_model', 'access_model'()} | + {'body_xslt', binary()} | + {'children_association_policy', 'children_association_policy'()} | + {'children_association_whitelist', [jid:jid()]} | + {'children', [binary()]} | + {'children_max', binary()} | + {'collection', [binary()]} | + {'contact', [jid:jid()]} | + {'dataform_xslt', binary()} | + {'deliver_notifications', boolean()} | + {'deliver_payloads', boolean()} | + {'description', binary()} | + {'item_expire', binary()} | + {'itemreply', 'itemreply'()} | + {'language', binary()} | + {'max_items', non_neg_integer()} | + {'max_payload_size', non_neg_integer()} | + {'node_type', 'node_type'()} | + {'notification_type', 'notification_type'()} | + {'notify_config', boolean()} | + {'notify_delete', boolean()} | + {'notify_retract', boolean()} | + {'notify_sub', boolean()} | + {'persist_items', boolean()} | + {'presence_based_delivery', boolean()} | + {'publish_model', 'publish_model'()} | + {'purge_offline', boolean()} | + {'roster_groups_allowed', [binary()]} | + {'send_last_published_item', 'send_last_published_item'()} | + {'tempsub', boolean()} | + {'subscribe', boolean()} | + {'title', binary()} | + {'type', binary()}. +-type result() :: [property()]. + +-type options(T) :: [{binary(), T}]. +-type property_with_options() :: + {'access_model', 'access_model'(), options('access_model'())} | + {'children_association_policy', 'children_association_policy'(), options('children_association_policy'())} | + {'itemreply', 'itemreply'(), options('itemreply'())} | + {'language', binary(), options(binary())} | + {'node_type', 'node_type'(), options('node_type'())} | + {'notification_type', 'notification_type'(), options('notification_type'())} | + {'publish_model', 'publish_model'(), options('publish_model'())} | + {'roster_groups_allowed', [binary()], options(binary())} | + {'send_last_published_item', 'send_last_published_item'(), options('send_last_published_item'())}. +-type form() :: [property() | property_with_options() | xdata_field()]. diff --git a/include/pubsub_publish_options.hrl b/include/pubsub_publish_options.hrl new file mode 100644 index 000000000..3b04b4826 --- /dev/null +++ b/include/pubsub_publish_options.hrl @@ -0,0 +1,14 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: pubsub_publish_options.xdata +%% Form type: http://jabber.org/protocol/pubsub#publish-options +%% Document: XEP-0060 + +-type 'access_model'() :: authorize | open | presence | roster | whitelist. + +-type property() :: {'access_model', 'access_model'()}. +-type result() :: [property()]. + +-type options(T) :: [{binary(), T}]. +-type property_with_options() :: + {'access_model', 'access_model'(), options('access_model'())}. +-type form() :: [property() | property_with_options() | xdata_field()]. diff --git a/include/pubsub_subscribe_authorization.hrl b/include/pubsub_subscribe_authorization.hrl new file mode 100644 index 000000000..fb67ab47a --- /dev/null +++ b/include/pubsub_subscribe_authorization.hrl @@ -0,0 +1,13 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: pubsub_subscribe_authorization.xdata +%% Form type: http://jabber.org/protocol/pubsub#subscribe_authorization +%% Document: XEP-0060 + + +-type property() :: {'allow', boolean()} | + {'node', binary()} | + {'subscriber_jid', jid:jid()} | + {'subid', binary()}. +-type result() :: [property()]. + +-type form() :: [property() | xdata_field()]. diff --git a/include/pubsub_subscribe_options.hrl b/include/pubsub_subscribe_options.hrl new file mode 100644 index 000000000..9a05822a5 --- /dev/null +++ b/include/pubsub_subscribe_options.hrl @@ -0,0 +1,25 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: pubsub_subscribe_options.xdata +%% Form type: http://jabber.org/protocol/pubsub#subscribe_options +%% Document: XEP-0060 + +-type 'show-values'() :: away | chat | dnd | online | xa. +-type 'subscription_type'() :: items | nodes. +-type 'subscription_depth'() :: 1 | all. + +-type property() :: {'deliver', boolean()} | + {'digest', boolean()} | + {'digest_frequency', binary()} | + {'expire', binary()} | + {'include_body', boolean()} | + {'show-values', ['show-values'()]} | + {'subscription_type', 'subscription_type'()} | + {'subscription_depth', 'subscription_depth'()}. +-type result() :: [property()]. + +-type options(T) :: [{binary(), T}]. +-type property_with_options() :: + {'show-values', ['show-values'()], options('show-values'())} | + {'subscription_type', 'subscription_type'(), options('subscription_type'())} | + {'subscription_depth', 'subscription_depth'(), options('subscription_depth'())}. +-type form() :: [property() | property_with_options() | xdata_field()]. diff --git a/include/xmpp.hrl b/include/xmpp.hrl new file mode 100644 index 000000000..e1bdaeed0 --- /dev/null +++ b/include/xmpp.hrl @@ -0,0 +1,29 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net> +%%% @copyright (C) 2015, Evgeny Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 10 Dec 2015 by Evgeny Khramtsov <ekhramtsov@process-one.net> +%%%------------------------------------------------------------------- +-include("ns.hrl"). +-include("jid.hrl"). +-include("xmpp_codec.hrl"). +-ifdef(NO_EXT_LIB). +-include("fxml.hrl"). +-else. +-include_lib("fast_xml/include/fxml.hrl"). +-endif. + +-type iq_type() :: get | set | result | error. +-type message_type() :: chat | error | groupchat | headline | normal. +-type presence_type() :: available | error | probe | subscribe | + subscribed | unavailable | unsubscribe | + unsubscribed. + +-type stanza() :: iq() | presence() | message(). + +-define(is_stanza(Pkt), + (is_record(Pkt, iq) or + is_record(Pkt, message) or + is_record(Pkt, presence))). diff --git a/include/xmpp_codec.hrl b/include/xmpp_codec.hrl new file mode 100644 index 000000000..981f7f4c2 --- /dev/null +++ b/include/xmpp_codec.hrl @@ -0,0 +1,1092 @@ +%% Created automatically by XML generator (fxml_gen.erl) +%% Source: xmpp_codec.spec + +-record(vcard_xupdate, {us = {<<>>, <<>>} :: {binary(), binary()}, + hash :: binary()}). +-type vcard_xupdate() :: #vcard_xupdate{}. + +-record(ps_affiliation, {xmlns = <<>> :: binary(), + node = <<>> :: binary(), + type :: member | none | outcast | + owner | publisher | publish_only, + jid :: jid:jid()}). +-type ps_affiliation() :: #ps_affiliation{}. + +-type ps_error_type() :: 'closed-node' | 'configuration-required' | + 'invalid-jid' | 'invalid-options' | + 'invalid-payload' | 'invalid-subid' | + 'item-forbidden' | 'item-required' | 'jid-required' | + 'max-items-exceeded' | 'max-nodes-exceeded' | + 'nodeid-required' | 'not-in-roster-group' | + 'not-subscribed' | 'payload-too-big' | + 'payload-required' | 'pending-subscription' | + 'presence-subscription-required' | 'subid-required' | + 'too-many-subscriptions' | 'unsupported' | + 'unsupported-access-model'. +-type ps_feature() :: 'access-authorize' | 'access-open' | + 'access-presence' | 'access-roster' | + 'access-whitelist' | 'auto-create' | + 'auto-subscribe' | 'collections' | 'config-node' | + 'create-and-configure' | 'create-nodes' | + 'delete-items' | 'delete-nodes' | + 'filtered-notifications' | 'get-pending' | + 'instant-nodes' | 'item-ids' | 'last-published' | + 'leased-subscription' | 'manage-subscriptions' | + 'member-affiliation' | 'meta-data' | + 'modify-affiliations' | 'multi-collection' | + 'multi-subscribe' | 'outcast-affiliation' | + 'persistent-items' | 'presence-notifications' | + 'presence-subscribe' | 'publish' | + 'publish-options' | 'publish-only-affiliation' | + 'publisher-affiliation' | 'purge-nodes' | + 'retract-items' | 'retrieve-affiliations' | + 'retrieve-default' | 'retrieve-items' | + 'retrieve-subscriptions' | 'subscribe' | + 'subscription-options' | 'subscription-notifications'. +-record(ps_error, {type :: ps_error_type(), feature :: ps_feature()}). +-type ps_error() :: #ps_error{}. + +-record(chatstate, {type :: active | composing | gone | inactive | paused}). +-type chatstate() :: #chatstate{}. + +-record(csi, {type :: active | inactive}). +-type csi() :: #csi{}. + +-record(hint, {type :: 'no-copy' | 'no-store' | 'no-storage' | 'store' | + 'no-permanent-store' | 'no-permanent-storage'}). +-type hint() :: #hint{}. + +-record(iq, {id = <<>> :: binary(), + type :: 'error' | 'get' | 'result' | 'set', + lang = <<>> :: binary(), + from :: jid:jid(), + to :: jid:jid(), + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type iq() :: #iq{}. + +-record(feature_register, {}). +-type feature_register() :: #feature_register{}. + +-record(adhoc_note, {type = info :: 'error' | 'info' | 'warn', + data = <<>> :: binary()}). +-type adhoc_note() :: #adhoc_note{}. + +-record(address, {type :: 'bcc' | 'cc' | 'noreply' | 'ofrom' | 'replyroom' | 'replyto' | 'to', + jid :: jid:jid(), + desc = <<>> :: binary(), + node = <<>> :: binary(), + delivered :: boolean()}). +-type address() :: #address{}. + +-record(sasl_success, {text = <<>> :: binary()}). +-type sasl_success() :: #sasl_success{}. + +-record(mam_result, {xmlns = <<>> :: binary(), + queryid = <<>> :: binary(), + id = <<>> :: binary(), + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type mam_result() :: #mam_result{}. + +-record(rsm_first, {index :: non_neg_integer(), + data = <<>> :: binary()}). +-type rsm_first() :: #rsm_first{}. + +-record(text, {lang = <<>> :: binary(), + data = <<>> :: binary()}). +-type text() :: #text{}. + +-record(streamhost, {jid :: jid:jid(), + host = <<>> :: binary(), + port = 1080 :: non_neg_integer()}). +-type streamhost() :: #streamhost{}. + +-record(sm_resume, {h :: non_neg_integer(), + previd = <<>> :: binary(), + xmlns = <<>> :: binary()}). +-type sm_resume() :: #sm_resume{}. + +-record(carbons_enable, {}). +-type carbons_enable() :: #carbons_enable{}. + +-record(carbons_private, {}). +-type carbons_private() :: #carbons_private{}. + +-record(expire, {seconds :: non_neg_integer(), + stored :: non_neg_integer()}). +-type expire() :: #expire{}. + +-record(muc_unsubscribe, {}). +-type muc_unsubscribe() :: #muc_unsubscribe{}. + +-record(ps_unsubscribe, {node = <<>> :: binary(), + jid :: jid:jid(), + subid = <<>> :: binary()}). +-type ps_unsubscribe() :: #ps_unsubscribe{}. + +-record(mix_leave, {}). +-type mix_leave() :: #mix_leave{}. + +-record(ping, {}). +-type ping() :: #ping{}. + +-record(delay, {stamp :: erlang:timestamp(), + from :: jid:jid(), + desc = <<>> :: binary()}). +-type delay() :: #delay{}. + +-record(muc_history, {maxchars :: non_neg_integer(), + maxstanzas :: non_neg_integer(), + seconds :: non_neg_integer(), + since :: erlang:timestamp()}). +-type muc_history() :: #muc_history{}. + +-record(thumbnail, {uri = <<>> :: binary(), + 'media-type' = <<>> :: binary(), + width :: non_neg_integer(), + height :: non_neg_integer()}). +-type thumbnail() :: #thumbnail{}. + +-record(privilege_perm, {access :: 'message' | 'presence' | 'roster', + type :: 'both' | 'get' | 'managed_entity' | 'none' | 'outgoing' | 'roster' | 'set'}). +-type privilege_perm() :: #privilege_perm{}. + +-record(muc_decline, {reason = <<>> :: binary(), + from :: jid:jid(), + to :: jid:jid()}). +-type muc_decline() :: #muc_decline{}. + +-record(sm_a, {h :: non_neg_integer(), + xmlns = <<>> :: binary()}). +-type sm_a() :: #sm_a{}. + +-record(stream_start, {from :: jid:jid(), + to :: jid:jid(), + id = <<>> :: binary(), + version :: {non_neg_integer(),non_neg_integer()}, + xmlns = <<>> :: binary(), + stream_xmlns = <<>> :: binary(), + db_xmlns = <<>> :: binary(), + lang = <<>> :: binary()}). +-type stream_start() :: #stream_start{}. + +-record(muc_subscribe, {nick = <<>> :: binary(), + events = [] :: [binary()]}). +-type muc_subscribe() :: #muc_subscribe{}. + +-record(stanza_id, {by :: jid:jid(), + id = <<>> :: binary()}). +-type stanza_id() :: #stanza_id{}. + +-record(starttls_proceed, {}). +-type starttls_proceed() :: #starttls_proceed{}. + +-record(forwarded, {delay :: #delay{}, + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type forwarded() :: #forwarded{}. + +-record(privilege, {perms = [] :: [#privilege_perm{}], + forwarded :: #forwarded{}}). +-type privilege() :: #privilege{}. + +-record(client_id, {id = <<>> :: binary()}). +-type client_id() :: #client_id{}. + +-record(sm_resumed, {h :: non_neg_integer(), + previd = <<>> :: binary(), + xmlns = <<>> :: binary()}). +-type sm_resumed() :: #sm_resumed{}. + +-record(sm_enable, {max :: non_neg_integer(), + resume = false :: boolean(), + xmlns = <<>> :: binary()}). +-type sm_enable() :: #sm_enable{}. + +-record(starttls_failure, {}). +-type starttls_failure() :: #starttls_failure{}. + +-record(sasl_challenge, {text = <<>> :: binary()}). +-type sasl_challenge() :: #sasl_challenge{}. + +-record(handshake, {data = <<>> :: binary()}). +-type handshake() :: #handshake{}. + +-record(gone, {uri = <<>> :: binary()}). +-type gone() :: #gone{}. + +-record(x_conference, {jid :: jid:jid(), + password = <<>> :: binary(), + reason = <<>> :: binary(), + continue :: boolean(), + thread = <<>> :: binary()}). +-type x_conference() :: #x_conference{}. + +-record(private, {xml_els = [] :: [fxml:xmlel()]}). +-type private() :: #private{}. + +-record(delegation_query, {to :: jid:jid(), + delegate = [] :: [binary()]}). +-type delegation_query() :: #delegation_query{}. + +-record(db_verify, {from = <<>> :: binary(), + to = <<>> :: binary(), + id = <<>> :: binary(), + type :: 'error' | 'invalid' | 'valid', + key = <<>> :: binary(), + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type db_verify() :: #db_verify{}. + +-record(nick, {name = <<>> :: binary()}). +-type nick() :: #nick{}. + +-record(p1_ack, {}). +-type p1_ack() :: #p1_ack{}. + +-record(feature_sm, {xmlns = <<>> :: binary()}). +-type feature_sm() :: #feature_sm{}. + +-record(ps_item, {xmlns = <<>> :: binary(), + id = <<>> :: binary(), + xml_els = [] :: [fxml:xmlel()], + node = <<>> :: binary(), + publisher = <<>> :: binary()}). +-type ps_item() :: #ps_item{}. + +-record(ps_publish, {node = <<>> :: binary(), + items = [] :: [#ps_item{}]}). +-type ps_publish() :: #ps_publish{}. + +-record(roster_item, {jid :: jid:jid(), + name = <<>> :: binary(), + groups = [] :: [binary()], + subscription = none :: 'both' | 'from' | 'none' | 'remove' | 'to', + ask :: 'subscribe'}). +-type roster_item() :: #roster_item{}. + +-record(roster_query, {items = [] :: [#roster_item{}], + ver :: binary()}). +-type roster_query() :: #roster_query{}. + +-record(sm_r, {xmlns = <<>> :: binary()}). +-type sm_r() :: #sm_r{}. + +-record(muc_actor, {jid :: jid:jid(), + nick = <<>> :: binary()}). +-type muc_actor() :: #muc_actor{}. + +-record(stat_error, {code :: integer(), + reason = <<>> :: binary()}). +-type stat_error() :: #stat_error{}. + +-record(stat, {name = <<>> :: binary(), + units = <<>> :: binary(), + value = <<>> :: binary(), + error :: #stat_error{}}). +-type stat() :: #stat{}. + +-record(addresses, {list = [] :: [#address{}]}). +-type addresses() :: #addresses{}. + +-record('see-other-host', {host :: binary() | inet:ip_address() | {binary() | inet:ip_address(),non_neg_integer()}}). +-type 'see-other-host'() :: #'see-other-host'{}. + +-record(compress, {methods = [] :: [binary()]}). +-type compress() :: #compress{}. + +-record(starttls, {required = false :: boolean()}). +-type starttls() :: #starttls{}. + +-record(last, {seconds :: non_neg_integer(), + status = <<>> :: binary()}). +-type last() :: #last{}. + +-record(redirect, {uri = <<>> :: binary()}). +-type redirect() :: #redirect{}. + +-record(sm_enabled, {id = <<>> :: binary(), + location = <<>> :: binary(), + max :: non_neg_integer(), + resume = false :: boolean(), + xmlns = <<>> :: binary()}). +-type sm_enabled() :: #sm_enabled{}. + +-record(muc_unique, {name = <<>> :: binary()}). +-type muc_unique() :: #muc_unique{}. + +-record(sasl_response, {text = <<>> :: binary()}). +-type sasl_response() :: #sasl_response{}. + +-record(legacy_auth, {username :: binary(), + password :: binary(), + digest :: binary(), + resource :: binary()}). +-type legacy_auth() :: #legacy_auth{}. + +-record(ps_subscribe, {node = <<>> :: binary(), + jid :: jid:jid()}). +-type ps_subscribe() :: #ps_subscribe{}. + +-record(message, {id = <<>> :: binary(), + type = normal :: 'chat' | 'error' | 'groupchat' | 'headline' | 'normal', + lang = <<>> :: binary(), + from :: jid:jid(), + to :: jid:jid(), + subject = [] :: [#text{}], + body = [] :: [#text{}], + thread :: binary(), + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type message() :: #message{}. + +-record(sasl_auth, {mechanism = <<>> :: binary(), + text = <<>> :: binary()}). +-type sasl_auth() :: #sasl_auth{}. + +-record(p1_push, {}). +-type p1_push() :: #p1_push{}. + +-record(feature_csi, {xmlns = <<>> :: binary()}). +-type feature_csi() :: #feature_csi{}. + +-record(disco_item, {jid :: jid:jid(), + name = <<>> :: binary(), + node = <<>> :: binary()}). +-type disco_item() :: #disco_item{}. + +-record(unblock, {items = [] :: [jid:jid()]}). +-type unblock() :: #unblock{}. + +-record(block, {items = [] :: [jid:jid()]}). +-type block() :: #block{}. + +-record(compression, {methods = [] :: [binary()]}). +-type compression() :: #compression{}. + +-record(muc_subscriptions, {list = [] :: [jid:jid()]}). +-type muc_subscriptions() :: #muc_subscriptions{}. + +-record(ps_subscription, {xmlns = <<>> :: binary(), + jid :: jid:jid(), + type :: 'none' | 'pending' | 'subscribed' | 'unconfigured', + node = <<>> :: binary(), + subid = <<>> :: binary(), + expiry :: erlang:timestamp()}). +-type ps_subscription() :: #ps_subscription{}. + +-record(bob_data, {cid = <<>> :: binary(), + 'max-age' :: non_neg_integer(), + type = <<>> :: binary(), + data = <<>> :: binary()}). +-type bob_data() :: #bob_data{}. + +-record(muc_item, {actor :: #muc_actor{}, + continue :: binary(), + reason = <<>> :: binary(), + affiliation :: 'admin' | 'member' | 'none' | 'outcast' | 'owner', + role :: 'moderator' | 'none' | 'participant' | 'visitor', + jid :: jid:jid(), + nick = <<>> :: binary()}). +-type muc_item() :: #muc_item{}. + +-record(muc_admin, {items = [] :: [#muc_item{}]}). +-type muc_admin() :: #muc_admin{}. + +-record(shim, {headers = [] :: [{binary(),binary()}]}). +-type shim() :: #shim{}. + +-record(mam_prefs, {xmlns = <<>> :: binary(), + default :: 'always' | 'never' | 'roster', + always :: [jid:jid()], + never :: [jid:jid()]}). +-type mam_prefs() :: #mam_prefs{}. + +-record(caps, {node = <<>> :: binary(), + version = <<>> :: binary(), + hash = <<>> :: binary(), + exts = [] :: [binary()]}). +-type caps() :: #caps{}. + +-record(muc, {history :: #muc_history{}, + password :: binary()}). +-type muc() :: #muc{}. + +-record(stream_features, {sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type stream_features() :: #stream_features{}. + +-record(stats, {list = [] :: [#stat{}], + node = <<>> :: binary()}). +-type stats() :: #stats{}. + +-record(ps_items, {xmlns = <<>> :: binary(), + node = <<>> :: binary(), + items = [] :: [#ps_item{}], + max_items :: non_neg_integer(), + subid = <<>> :: binary(), + retract :: binary()}). +-type ps_items() :: #ps_items{}. + +-record(presence, {id = <<>> :: binary(), + type = available :: 'available' | 'error' | 'probe' | 'subscribe' | 'subscribed' | 'unavailable' | 'unsubscribe' | 'unsubscribed', + lang = <<>> :: binary(), + from :: jid:jid(), + to :: jid:jid(), + show :: 'away' | 'chat' | 'dnd' | 'xa', + status = [] :: [#text{}], + priority :: integer(), + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type presence() :: #presence{}. + +-record(sic, {ip :: inet:ip_address(), + port :: non_neg_integer(), + xmlns = <<>> :: binary()}). +-type sic() :: #sic{}. + +-record(carbons_sent, {forwarded :: #forwarded{}}). +-type carbons_sent() :: #carbons_sent{}. + +-record(mam_archived, {by :: jid:jid(), + id = <<>> :: binary()}). +-type mam_archived() :: #mam_archived{}. + +-record(p1_rebind, {}). +-type p1_rebind() :: #p1_rebind{}. + +-record(compress_failure, {reason :: 'processing-failed' | 'setup-failed' | 'unsupported-method'}). +-type compress_failure() :: #compress_failure{}. + +-record(sasl_abort, {}). +-type sasl_abort() :: #sasl_abort{}. + +-record(xevent, {offline = false :: boolean(), + delivered = false :: boolean(), + displayed = false :: boolean(), + composing = false :: boolean(), + id :: binary()}). +-type xevent() :: #xevent{}. + +-record(vcard_email, {home = false :: boolean(), + work = false :: boolean(), + internet = false :: boolean(), + pref = false :: boolean(), + x400 = false :: boolean(), + userid :: binary()}). +-type vcard_email() :: #vcard_email{}. + +-record(db_result, {from = <<>> :: binary(), + to = <<>> :: binary(), + type :: 'error' | 'invalid' | 'valid', + key = <<>> :: binary(), + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type db_result() :: #db_result{}. + +-record(carbons_received, {forwarded :: #forwarded{}}). +-type carbons_received() :: #carbons_received{}. + +-record(ps_retract, {node = <<>> :: binary(), + notify = false :: boolean(), + items = [] :: [#ps_item{}]}). +-type ps_retract() :: #ps_retract{}. + +-record(upload_slot, {get :: binary(), + put :: binary(), + xmlns = <<>> :: binary()}). +-type upload_slot() :: #upload_slot{}. + +-record(mix_participant, {jid :: jid:jid(), + nick = <<>> :: binary()}). +-type mix_participant() :: #mix_participant{}. + +-record(vcard_geo, {lat :: binary(), + lon :: binary()}). +-type vcard_geo() :: #vcard_geo{}. + +-record(compressed, {}). +-type compressed() :: #compressed{}. + +-record(sasl_failure, {reason :: 'aborted' | 'account-disabled' | 'bad-protocol' | 'credentials-expired' | 'encryption-required' | 'incorrect-encoding' | 'invalid-authzid' | 'invalid-mechanism' | 'malformed-request' | 'mechanism-too-weak' | 'not-authorized' | 'temporary-auth-failure', + text = [] :: [#text{}]}). +-type sasl_failure() :: #sasl_failure{}. + +-record(block_list, {items = [] :: [jid:jid()]}). +-type block_list() :: #block_list{}. + +-record(upload_request, {filename :: binary(), + size :: non_neg_integer(), + 'content-type' = <<>> :: binary(), + xmlns = <<>> :: binary()}). +-type upload_request() :: #upload_request{}. + +-record(xdata_option, {label = <<>> :: binary(), + value :: binary()}). +-type xdata_option() :: #xdata_option{}. + +-record(xdata_field, {label = <<>> :: binary(), + type :: 'boolean' | 'fixed' | 'hidden' | 'jid-multi' | 'jid-single' | 'list-multi' | 'list-single' | 'text-multi' | 'text-private' | 'text-single', + var = <<>> :: binary(), + required = false :: boolean(), + desc = <<>> :: binary(), + values = [] :: [binary()], + options = [] :: [#xdata_option{}], + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type xdata_field() :: #xdata_field{}. + +-record(version, {name :: binary(), + ver :: binary(), + os :: binary()}). +-type version() :: #version{}. + +-record(bind, {jid :: jid:jid(), + resource = <<>> :: binary()}). +-type bind() :: #bind{}. + +-record(rosterver_feature, {}). +-type rosterver_feature() :: #rosterver_feature{}. + +-record(muc_invite, {reason = <<>> :: binary(), + from :: jid:jid(), + to :: jid:jid(), + continue :: binary()}). +-type muc_invite() :: #muc_invite{}. + +-record(delegated, {ns = <<>> :: binary(), + attrs = [] :: [binary()]}). +-type delegated() :: #delegated{}. + +-record(carbons_disable, {}). +-type carbons_disable() :: #carbons_disable{}. + +-record(bytestreams, {hosts = [] :: [#streamhost{}], + used :: jid:jid(), + activate :: jid:jid(), + dstaddr = <<>> :: binary(), + mode = tcp :: 'tcp' | 'udp', + sid = <<>> :: binary()}). +-type bytestreams() :: #bytestreams{}. + +-record(adhoc_actions, {execute :: 'complete' | 'next' | 'prev', + prev = false :: boolean(), + next = false :: boolean(), + complete = false :: boolean()}). +-type adhoc_actions() :: #adhoc_actions{}. + +-record(vcard_org, {name :: binary(), + units = [] :: [binary()]}). +-type vcard_org() :: #vcard_org{}. + +-record(rsm_set, {'after' :: binary(), + before :: binary(), + count :: non_neg_integer(), + first :: #rsm_first{}, + index :: non_neg_integer(), + last :: binary(), + max :: non_neg_integer()}). +-type rsm_set() :: #rsm_set{}. + +-record(mam_fin, {xmlns = <<>> :: binary(), + id = <<>> :: binary(), + rsm :: #rsm_set{}, + stable :: boolean(), + complete :: boolean()}). +-type mam_fin() :: #mam_fin{}. + +-record(disco_items, {node = <<>> :: binary(), + items = [] :: [#disco_item{}], + rsm :: #rsm_set{}}). +-type disco_items() :: #disco_items{}. + +-record(vcard_tel, {home = false :: boolean(), + work = false :: boolean(), + voice = false :: boolean(), + fax = false :: boolean(), + pager = false :: boolean(), + msg = false :: boolean(), + cell = false :: boolean(), + video = false :: boolean(), + bbs = false :: boolean(), + modem = false :: boolean(), + isdn = false :: boolean(), + pcs = false :: boolean(), + pref = false :: boolean(), + number :: binary()}). +-type vcard_tel() :: #vcard_tel{}. + +-record(media_uri, {type = <<>> :: binary(), + uri = <<>> :: binary()}). +-type media_uri() :: #media_uri{}. + +-record(media, {height :: non_neg_integer(), + width :: non_neg_integer(), + uri = [] :: [#media_uri{}]}). +-type media() :: #media{}. + +-record(muc_destroy, {xmlns = <<>> :: binary(), + jid :: jid:jid(), + reason = <<>> :: binary(), + password :: binary()}). +-type muc_destroy() :: #muc_destroy{}. + +-record(muc_user, {decline :: #muc_decline{}, + destroy :: #muc_destroy{}, + invites = [] :: [#muc_invite{}], + items = [] :: [#muc_item{}], + status_codes = [] :: [pos_integer()], + password :: binary()}). +-type muc_user() :: #muc_user{}. + +-record(vcard_key, {type :: binary(), + cred :: binary()}). +-type vcard_key() :: #vcard_key{}. + +-record(vcard_name, {family :: binary(), + given :: binary(), + middle :: binary(), + prefix :: binary(), + suffix :: binary()}). +-type vcard_name() :: #vcard_name{}. + +-record(identity, {category = <<>> :: binary(), + type = <<>> :: binary(), + lang = <<>> :: binary(), + name = <<>> :: binary()}). +-type identity() :: #identity{}. + +-record(bookmark_conference, {name = <<>> :: binary(), + jid :: jid:jid(), + autojoin = false :: boolean(), + nick :: binary(), + password :: binary()}). +-type bookmark_conference() :: #bookmark_conference{}. + +-record(xmpp_session, {optional = false :: boolean()}). +-type xmpp_session() :: #xmpp_session{}. + +-record(bookmark_url, {name = <<>> :: binary(), + url = <<>> :: binary()}). +-type bookmark_url() :: #bookmark_url{}. + +-record(bookmark_storage, {conference = [] :: [#bookmark_conference{}], + url = [] :: [#bookmark_url{}]}). +-type bookmark_storage() :: #bookmark_storage{}. + +-record(oob_x, {url :: binary(), + desc = <<>> :: binary(), + sid = <<>> :: binary()}). +-type oob_x() :: #oob_x{}. + +-record(vcard_sound, {phonetic :: binary(), + binval :: binary(), + extval :: binary()}). +-type vcard_sound() :: #vcard_sound{}. + +-record(vcard_photo, {type :: binary(), + binval :: binary(), + extval :: binary()}). +-type vcard_photo() :: #vcard_photo{}. + +-record(vcard_label, {home = false :: boolean(), + work = false :: boolean(), + postal = false :: boolean(), + parcel = false :: boolean(), + dom = false :: boolean(), + intl = false :: boolean(), + pref = false :: boolean(), + line = [] :: [binary()]}). +-type vcard_label() :: #vcard_label{}. + +-record(vcard_adr, {home = false :: boolean(), + work = false :: boolean(), + postal = false :: boolean(), + parcel = false :: boolean(), + dom = false :: boolean(), + intl = false :: boolean(), + pref = false :: boolean(), + pobox :: binary(), + extadd :: binary(), + street :: binary(), + locality :: binary(), + region :: binary(), + pcode :: binary(), + ctry :: binary()}). +-type vcard_adr() :: #vcard_adr{}. + +-record(search_item, {jid :: jid:jid(), + first :: binary(), + last :: binary(), + nick :: binary(), + email :: binary()}). +-type search_item() :: #search_item{}. + +-record(xdata, {type :: 'cancel' | 'form' | 'result' | 'submit', + instructions = [] :: [binary()], + title :: binary(), + reported :: [#xdata_field{}], + items = [] :: [[#xdata_field{}]], + fields = [] :: [#xdata_field{}]}). +-type xdata() :: #xdata{}. + +-record(xcaptcha, {xdata :: #xdata{}}). +-type xcaptcha() :: #xcaptcha{}. + +-record(adhoc_command, {node = <<>> :: binary(), + action = execute :: 'cancel' | 'complete' | 'execute' | 'next' | 'prev', + sid = <<>> :: binary(), + status :: 'canceled' | 'completed' | 'executing', + lang = <<>> :: binary(), + actions :: #adhoc_actions{}, + notes = [] :: [#adhoc_note{}], + xdata :: #xdata{}}). +-type adhoc_command() :: #adhoc_command{}. + +-record(search, {instructions :: binary(), + first :: binary(), + last :: binary(), + nick :: binary(), + email :: binary(), + items = [] :: [#search_item{}], + xdata :: #xdata{}}). +-type search() :: #search{}. + +-record(mam_query, {xmlns = <<>> :: binary(), + id = <<>> :: binary(), + start :: erlang:timestamp(), + 'end' :: erlang:timestamp(), + with :: jid:jid(), + withtext :: binary(), + rsm :: #rsm_set{}, + xdata :: #xdata{}}). +-type mam_query() :: #mam_query{}. + +-record(pubsub_owner, {affiliations :: {binary(),[#ps_affiliation{}]}, + configure :: {binary(),'undefined' | #xdata{}}, + default :: {binary(),'undefined' | #xdata{}}, + delete :: {binary(),binary()}, + purge :: binary(), + subscriptions :: {binary(),[#ps_subscription{}]}}). +-type pubsub_owner() :: #pubsub_owner{}. + +-record(ps_options, {node = <<>> :: binary(), + jid :: jid:jid(), + subid = <<>> :: binary(), + xdata :: #xdata{}}). +-type ps_options() :: #ps_options{}. + +-record(pubsub, {subscriptions :: {binary(),[#ps_subscription{}]}, + subscription :: #ps_subscription{}, + affiliations :: {binary(),[#ps_affiliation{}]}, + publish :: #ps_publish{}, + publish_options :: #xdata{}, + subscribe :: #ps_subscribe{}, + unsubscribe :: #ps_unsubscribe{}, + options :: #ps_options{}, + items :: #ps_items{}, + retract :: #ps_retract{}, + create :: binary(), + configure :: {binary(),'undefined' | #xdata{}}, + default :: {binary(),'undefined' | #xdata{}}, + delete :: {binary(),binary()}, + purge :: binary(), + rsm :: #rsm_set{}}). +-type pubsub() :: #pubsub{}. + +-record(ps_event, {items :: #ps_items{}, + purge :: binary(), + subscription :: #ps_subscription{}, + delete :: {binary(),binary()}, + create :: binary(), + configuration :: {binary(),'undefined' | #xdata{}}}). +-type ps_event() :: #ps_event{}. + +-record(register, {registered = false :: boolean(), + remove = false :: boolean(), + instructions :: binary(), + username :: binary(), + nick :: binary(), + password :: binary(), + name :: binary(), + first :: binary(), + last :: binary(), + email :: binary(), + address :: binary(), + city :: binary(), + state :: binary(), + zip :: binary(), + phone :: binary(), + url :: binary(), + date :: binary(), + misc :: binary(), + text :: binary(), + key :: binary(), + xdata :: #xdata{}, + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type register() :: #register{}. + +-record(disco_info, {node = <<>> :: binary(), + identities = [] :: [#identity{}], + features = [] :: [binary()], + xdata = [] :: [#xdata{}]}). +-type disco_info() :: #disco_info{}. + +-record(offline_item, {node = <<>> :: binary(), + action :: 'remove' | 'view'}). +-type offline_item() :: #offline_item{}. + +-record(offline, {items = [] :: [#offline_item{}], + purge = false :: boolean(), + fetch = false :: boolean()}). +-type offline() :: #offline{}. + +-record(muc_owner, {destroy :: #muc_destroy{}, + config :: #xdata{}, + items = [] :: [#muc_item{}]}). +-type muc_owner() :: #muc_owner{}. + +-record(sasl_mechanisms, {list = [] :: [binary()]}). +-type sasl_mechanisms() :: #sasl_mechanisms{}. + +-record(sm_failed, {reason :: atom() | #gone{} | #redirect{}, + h :: non_neg_integer(), + xmlns = <<>> :: binary()}). +-type sm_failed() :: #sm_failed{}. + +-record(stanza_error, {type :: 'auth' | 'cancel' | 'continue' | 'modify' | 'wait', + code :: non_neg_integer(), + by = <<>> :: binary(), + reason :: atom() | #gone{} | #redirect{}, + text :: #text{}, + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type stanza_error() :: #stanza_error{}. + +-record(delegation, {delegated = [] :: [#delegated{}], + forwarded :: #forwarded{}}). +-type delegation() :: #delegation{}. + +-record(mix_join, {jid :: jid:jid(), + subscribe = [] :: [binary()]}). +-type mix_join() :: #mix_join{}. + +-record(privacy_item, {order :: non_neg_integer(), + action :: 'allow' | 'deny', + type :: 'group' | 'jid' | 'subscription', + value = <<>> :: binary(), + message = false :: boolean(), + iq = false :: boolean(), + presence_in = false :: boolean(), + presence_out = false :: boolean()}). +-type privacy_item() :: #privacy_item{}. + +-record(privacy_list, {name = <<>> :: binary(), + items = [] :: [#privacy_item{}]}). +-type privacy_list() :: #privacy_list{}. + +-record(privacy_query, {lists = [] :: [#privacy_list{}], + default :: 'none' | binary(), + active :: 'none' | binary()}). +-type privacy_query() :: #privacy_query{}. + +-record(stream_error, {reason :: atom() | #'see-other-host'{}, + text :: #text{}}). +-type stream_error() :: #stream_error{}. + +-record(vcard_logo, {type :: binary(), + binval :: binary(), + extval :: binary()}). +-type vcard_logo() :: #vcard_logo{}. + +-record(vcard_temp, {version :: binary(), + fn :: binary(), + n :: #vcard_name{}, + nickname :: binary(), + photo :: #vcard_photo{}, + bday :: binary(), + adr = [] :: [#vcard_adr{}], + label = [] :: [#vcard_label{}], + tel = [] :: [#vcard_tel{}], + email = [] :: [#vcard_email{}], + jabberid :: binary(), + mailer :: binary(), + tz :: binary(), + geo :: #vcard_geo{}, + title :: binary(), + role :: binary(), + logo :: #vcard_logo{}, + org :: #vcard_org{}, + categories = [] :: [binary()], + note :: binary(), + prodid :: binary(), + rev :: binary(), + sort_string :: binary(), + sound :: #vcard_sound{}, + uid :: binary(), + url :: binary(), + class :: 'confidential' | 'private' | 'public', + key :: #vcard_key{}, + desc :: binary()}). +-type vcard_temp() :: #vcard_temp{}. + +-record(time, {tzo :: {integer(),integer()}, + utc :: erlang:timestamp()}). +-type time() :: #time{}. + +-type xmpp_element() :: compression() | + ps_subscription() | + xdata_option() | + version() | + sm_a() | + bob_data() | + media() | + stanza_id() | + starttls_proceed() | + forwarded() | + client_id() | + sm_resumed() | + xevent() | + privacy_list() | + carbons_sent() | + mam_archived() | + p1_rebind() | + sasl_abort() | + db_result() | + carbons_received() | + upload_slot() | + mix_participant() | + compressed() | + block_list() | + delegated() | + rsm_set() | + 'see-other-host'() | + hint() | + stream_start() | + text() | + vcard_org() | + shim() | + search_item() | + offline_item() | + feature_sm() | + roster_item() | + muc_item() | + vcard_temp() | + address() | + sasl_success() | + addresses() | + muc_subscriptions() | + disco_items() | + compress() | + bytestreams() | + adhoc_actions() | + privacy_query() | + muc_history() | + identity() | + feature_csi() | + delay() | + thumbnail() | + vcard_tel() | + vcard_geo() | + vcard_photo() | + pubsub_owner() | + pubsub() | + muc_owner() | + muc_actor() | + ps_error() | + starttls_failure() | + sasl_challenge() | + x_conference() | + private() | + sasl_failure() | + vcard_name() | + adhoc_note() | + rosterver_feature() | + muc_invite() | + vcard_xupdate() | + carbons_disable() | + bookmark_conference() | + offline() | + time() | + ps_subscribe() | + sm_enable() | + handshake() | + compress_failure() | + bookmark_storage() | + muc_decline() | + legacy_auth() | + search() | + ps_publish() | + nick() | + p1_ack() | + block() | + delegation() | + mix_join() | + xmpp_session() | + xdata() | + iq() | + xcaptcha() | + streamhost() | + bind() | + ps_retract() | + last() | + redirect() | + sm_enabled() | + vcard_sound() | + ps_event() | + mam_result() | + rsm_first() | + stat() | + upload_request() | + xdata_field() | + adhoc_command() | + sm_failed() | + ping() | + privilege_perm() | + privacy_item() | + disco_item() | + ps_item() | + mam_prefs() | + sasl_mechanisms() | + caps() | + muc() | + stream_features() | + stats() | + ps_items() | + sic() | + ps_options() | + starttls() | + db_verify() | + roster_query() | + media_uri() | + muc_destroy() | + vcard_key() | + csi() | + delegation_query() | + mam_query() | + bookmark_url() | + vcard_email() | + vcard_label() | + vcard_logo() | + disco_info() | + feature_register() | + register() | + sm_r() | + stat_error() | + stanza_error() | + stream_error() | + muc_user() | + vcard_adr() | + gone() | + carbons_private() | + mix_leave() | + muc_subscribe() | + privilege() | + muc_unique() | + sasl_response() | + message() | + presence() | + sm_resume() | + carbons_enable() | + expire() | + muc_unsubscribe() | + ps_unsubscribe() | + chatstate() | + sasl_auth() | + p1_push() | + oob_x() | + unblock() | + muc_admin() | + ps_affiliation() | + mam_fin(). |