aboutsummaryrefslogtreecommitdiff
path: root/src/pubsub_node_config.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-10-07 10:31:03 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-10-07 10:31:03 +0300
commit6a3691ef7ce33c17d379ba40fa0c27f21c5ed75d (patch)
tree846810a4086c93f4dd7bd8ef84b15c449697fa2e /src/pubsub_node_config.erl
parentPubSub: creation jid must be bare jid (diff)
Add xdata generator and make some code using it
Diffstat (limited to 'src/pubsub_node_config.erl')
-rw-r--r--src/pubsub_node_config.erl1666
1 files changed, 1666 insertions, 0 deletions
diff --git a/src/pubsub_node_config.erl b/src/pubsub_node_config.erl
new file mode 100644
index 000000000..47ed10b49
--- /dev/null
+++ b/src/pubsub_node_config.erl
@@ -0,0 +1,1666 @@
+%% 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
+
+-module(pubsub_node_config).
+
+-export([decode/1, decode/2, encode/1, encode/2,
+ format_error/1]).
+
+-include("xmpp_codec.hrl").
+
+-include("pubsub_node_config.hrl").
+
+-export_type([{property, 0}, {result, 0}, {form, 0}]).
+
+dec_int(Val, Min, Max) ->
+ case list_to_integer(binary_to_list(Val)) of
+ Int when Int =< Max, Min == infinity -> Int;
+ Int when Int =< Max, Int >= Min -> Int
+ end.
+
+enc_int(Int) -> integer_to_binary(Int).
+
+dec_enum(Val, Enums) ->
+ AtomVal = erlang:binary_to_existing_atom(Val, utf8),
+ case lists:member(AtomVal, Enums) of
+ true -> AtomVal
+ end.
+
+enc_enum(Atom) -> erlang:atom_to_binary(Atom, utf8).
+
+dec_bool(<<"1">>) -> true;
+dec_bool(<<"0">>) -> false;
+dec_bool(<<"true">>) -> true;
+dec_bool(<<"false">>) -> false.
+
+enc_bool(true) -> <<"1">>;
+enc_bool(false) -> <<"0">>.
+
+enc_jid(J) -> jid:to_string(J).
+
+dec_jid(Val) ->
+ case jid:from_string(Val) of
+ error -> erlang:error(badarg);
+ J -> J
+ end.
+
+format_error({form_type_mismatch, Type}) ->
+ <<"FORM_TYPE doesn't match '", Type/binary, "'">>;
+format_error({bad_var_value, Var, Type}) ->
+ <<"Bad value of field '", Var/binary, "' of type '",
+ Type/binary, "'">>;
+format_error({missing_value, Var, Type}) ->
+ <<"Missing value of field '", Var/binary, "' of type '",
+ Type/binary, "'">>;
+format_error({too_many_values, Var, Type}) ->
+ <<"Too many values for field '", Var/binary,
+ "' of type '", Type/binary, "'">>;
+format_error({unknown_var, Var, Type}) ->
+ <<"Unknown field '", Var/binary, "' of type '",
+ Type/binary, "'">>;
+format_error({missing_required_var, Var, Type}) ->
+ <<"Missing required field '", Var/binary, "' of type '",
+ Type/binary, "'">>.
+
+decode(Fs) -> decode(Fs, []).
+
+decode(Fs, Acc) ->
+ case lists:keyfind(<<"FORM_TYPE">>, #xdata_field.var,
+ Fs)
+ of
+ false -> decode(Fs, Acc, []);
+ #xdata_field{values =
+ [<<"http://jabber.org/protocol/pubsub#node_config">>]} ->
+ decode(Fs, Acc, []);
+ _ ->
+ erlang:error({?MODULE,
+ {form_type_mismatch,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end.
+
+encode(Cfg) -> encode(Cfg, fun (Text) -> Text end).
+
+encode(List, Translate) when is_list(List) ->
+ Fs = [case Opt of
+ {access_model, Val} ->
+ [encode_access_model(Val, default, Translate)];
+ {access_model, Val, Opts} ->
+ [encode_access_model(Val, Opts, Translate)];
+ {body_xslt, Val} -> [encode_body_xslt(Val, Translate)];
+ {body_xslt, _, _} -> erlang:error({badarg, Opt});
+ {children_association_policy, Val} ->
+ [encode_children_association_policy(Val, default,
+ Translate)];
+ {children_association_policy, Val, Opts} ->
+ [encode_children_association_policy(Val, Opts,
+ Translate)];
+ {children_association_whitelist, Val} ->
+ [encode_children_association_whitelist(Val, Translate)];
+ {children_association_whitelist, _, _} ->
+ erlang:error({badarg, Opt});
+ {children, Val} -> [encode_children(Val, Translate)];
+ {children, _, _} -> erlang:error({badarg, Opt});
+ {children_max, Val} ->
+ [encode_children_max(Val, Translate)];
+ {children_max, _, _} -> erlang:error({badarg, Opt});
+ {collection, Val} ->
+ [encode_collection(Val, Translate)];
+ {collection, _, _} -> erlang:error({badarg, Opt});
+ {contact, Val} -> [encode_contact(Val, Translate)];
+ {contact, _, _} -> erlang:error({badarg, Opt});
+ {dataform_xslt, Val} ->
+ [encode_dataform_xslt(Val, Translate)];
+ {dataform_xslt, _, _} -> erlang:error({badarg, Opt});
+ {deliver_notifications, Val} ->
+ [encode_deliver_notifications(Val, Translate)];
+ {deliver_notifications, _, _} ->
+ erlang:error({badarg, Opt});
+ {deliver_payloads, Val} ->
+ [encode_deliver_payloads(Val, Translate)];
+ {deliver_payloads, _, _} -> erlang:error({badarg, Opt});
+ {description, Val} ->
+ [encode_description(Val, Translate)];
+ {description, _, _} -> erlang:error({badarg, Opt});
+ {item_expire, Val} ->
+ [encode_item_expire(Val, Translate)];
+ {item_expire, _, _} -> erlang:error({badarg, Opt});
+ {itemreply, Val} ->
+ [encode_itemreply(Val, default, Translate)];
+ {itemreply, Val, Opts} ->
+ [encode_itemreply(Val, Opts, Translate)];
+ {language, Val} ->
+ [encode_language(Val, default, Translate)];
+ {language, Val, Opts} ->
+ [encode_language(Val, Opts, Translate)];
+ {max_items, Val} -> [encode_max_items(Val, Translate)];
+ {max_items, _, _} -> erlang:error({badarg, Opt});
+ {max_payload_size, Val} ->
+ [encode_max_payload_size(Val, Translate)];
+ {max_payload_size, _, _} -> erlang:error({badarg, Opt});
+ {node_type, Val} ->
+ [encode_node_type(Val, default, Translate)];
+ {node_type, Val, Opts} ->
+ [encode_node_type(Val, Opts, Translate)];
+ {notification_type, Val} ->
+ [encode_notification_type(Val, default, Translate)];
+ {notification_type, Val, Opts} ->
+ [encode_notification_type(Val, Opts, Translate)];
+ {notify_config, Val} ->
+ [encode_notify_config(Val, Translate)];
+ {notify_config, _, _} -> erlang:error({badarg, Opt});
+ {notify_delete, Val} ->
+ [encode_notify_delete(Val, Translate)];
+ {notify_delete, _, _} -> erlang:error({badarg, Opt});
+ {notify_retract, Val} ->
+ [encode_notify_retract(Val, Translate)];
+ {notify_retract, _, _} -> erlang:error({badarg, Opt});
+ {notify_sub, Val} ->
+ [encode_notify_sub(Val, Translate)];
+ {notify_sub, _, _} -> erlang:error({badarg, Opt});
+ {persist_items, Val} ->
+ [encode_persist_items(Val, Translate)];
+ {persist_items, _, _} -> erlang:error({badarg, Opt});
+ {presence_based_delivery, Val} ->
+ [encode_presence_based_delivery(Val, Translate)];
+ {presence_based_delivery, _, _} ->
+ erlang:error({badarg, Opt});
+ {publish_model, Val} ->
+ [encode_publish_model(Val, default, Translate)];
+ {publish_model, Val, Opts} ->
+ [encode_publish_model(Val, Opts, Translate)];
+ {purge_offline, Val} ->
+ [encode_purge_offline(Val, Translate)];
+ {purge_offline, _, _} -> erlang:error({badarg, Opt});
+ {roster_groups_allowed, Val} ->
+ [encode_roster_groups_allowed(Val, default, Translate)];
+ {roster_groups_allowed, Val, Opts} ->
+ [encode_roster_groups_allowed(Val, Opts, Translate)];
+ {send_last_published_item, Val} ->
+ [encode_send_last_published_item(Val, default,
+ Translate)];
+ {send_last_published_item, Val, Opts} ->
+ [encode_send_last_published_item(Val, Opts, Translate)];
+ {tempsub, Val} -> [encode_tempsub(Val, Translate)];
+ {tempsub, _, _} -> erlang:error({badarg, Opt});
+ {subscribe, Val} -> [encode_subscribe(Val, Translate)];
+ {subscribe, _, _} -> erlang:error({badarg, Opt});
+ {title, Val} -> [encode_title(Val, Translate)];
+ {title, _, _} -> erlang:error({badarg, Opt});
+ {type, Val} -> [encode_type(Val, Translate)];
+ {type, _, _} -> erlang:error({badarg, Opt});
+ #xdata_field{} -> [Opt];
+ _ -> []
+ end
+ || Opt <- List],
+ FormType = #xdata_field{var = <<"FORM_TYPE">>,
+ type = hidden,
+ values =
+ [<<"http://jabber.org/protocol/pubsub#node_config">>]},
+ [FormType | lists:flatten(Fs)].
+
+decode([#xdata_field{var = <<"pubsub#access_model">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_enum(Value,
+ [authorize, open, presence, roster, whitelist])
+ of
+ Result ->
+ decode(Fs, [{access_model, Result} | Acc],
+ lists:delete(<<"pubsub#access_model">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#access_model">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#access_model">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#access_model">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#access_model">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#access_model">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#body_xslt">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try Value of
+ Result ->
+ decode(Fs, [{body_xslt, Result} | Acc],
+ lists:delete(<<"pubsub#body_xslt">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#body_xslt">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#body_xslt">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#body_xslt">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#body_xslt">>} | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#body_xslt">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var =
+ <<"pubsub#children_association_policy">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_enum(Value, [all, owners, whitelist]) of
+ Result ->
+ decode(Fs,
+ [{children_association_policy, Result} | Acc],
+ lists:delete(<<"pubsub#children_association_policy">>,
+ Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value,
+ <<"pubsub#children_association_policy">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var =
+ <<"pubsub#children_association_policy">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var =
+ <<"pubsub#children_association_policy">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var =
+ <<"pubsub#children_association_policy">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values,
+ <<"pubsub#children_association_policy">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var =
+ <<"pubsub#children_association_whitelist">>,
+ values = Values}
+ | Fs],
+ Acc, Required) ->
+ try [dec_jid(Value) || Value <- Values] of
+ Result ->
+ decode(Fs,
+ [{children_association_whitelist, Result} | Acc],
+ lists:delete(<<"pubsub#children_association_whitelist">>,
+ Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value,
+ <<"pubsub#children_association_whitelist">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#children">>,
+ values = Values}
+ | Fs],
+ Acc, Required) ->
+ try [Value || Value <- Values] of
+ Result ->
+ decode(Fs, [{children, Result} | Acc],
+ lists:delete(<<"pubsub#children">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#children">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#children_max">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try Value of
+ Result ->
+ decode(Fs, [{children_max, Result} | Acc],
+ lists:delete(<<"pubsub#children_max">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#children_max">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#children_max">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#children_max">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#children_max">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#children_max">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#collection">>,
+ values = Values}
+ | Fs],
+ Acc, Required) ->
+ try [Value || Value <- Values] of
+ Result ->
+ decode(Fs, [{collection, Result} | Acc],
+ lists:delete(<<"pubsub#collection">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#collection">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#contact">>,
+ values = Values}
+ | Fs],
+ Acc, Required) ->
+ try [dec_jid(Value) || Value <- Values] of
+ Result ->
+ decode(Fs, [{contact, Result} | Acc],
+ lists:delete(<<"pubsub#contact">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#contact">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#dataform_xslt">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try Value of
+ Result ->
+ decode(Fs, [{dataform_xslt, Result} | Acc],
+ lists:delete(<<"pubsub#dataform_xslt">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#dataform_xslt">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#dataform_xslt">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#dataform_xslt">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#dataform_xslt">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#dataform_xslt">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var =
+ <<"pubsub#deliver_notifications">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{deliver_notifications, Result} | Acc],
+ lists:delete(<<"pubsub#deliver_notifications">>,
+ Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#deliver_notifications">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var =
+ <<"pubsub#deliver_notifications">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var =
+ <<"pubsub#deliver_notifications">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var =
+ <<"pubsub#deliver_notifications">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#deliver_notifications">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var =
+ <<"pubsub#deliver_payloads">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{deliver_payloads, Result} | Acc],
+ lists:delete(<<"pubsub#deliver_payloads">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#deliver_payloads">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var =
+ <<"pubsub#deliver_payloads">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var =
+ <<"pubsub#deliver_payloads">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var =
+ <<"pubsub#deliver_payloads">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#deliver_payloads">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#description">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try Value of
+ Result ->
+ decode(Fs, [{description, Result} | Acc],
+ lists:delete(<<"pubsub#description">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#description">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#description">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#description">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#description">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#description">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#item_expire">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try Value of
+ Result ->
+ decode(Fs, [{item_expire, Result} | Acc],
+ lists:delete(<<"pubsub#item_expire">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#item_expire">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#item_expire">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#item_expire">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#item_expire">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#item_expire">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#itemreply">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_enum(Value, [owner, publisher, none]) of
+ Result ->
+ decode(Fs, [{itemreply, Result} | Acc],
+ lists:delete(<<"pubsub#itemreply">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#itemreply">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#itemreply">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#itemreply">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#itemreply">>} | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#itemreply">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#language">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try Value of
+ Result ->
+ decode(Fs, [{language, Result} | Acc],
+ lists:delete(<<"pubsub#language">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#language">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#language">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#language">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#language">>} | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#language">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#max_items">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_int(Value, 0, infinity) of
+ Result ->
+ decode(Fs, [{max_items, Result} | Acc],
+ lists:delete(<<"pubsub#max_items">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#max_items">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#max_items">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#max_items">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#max_items">>} | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#max_items">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var =
+ <<"pubsub#max_payload_size">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_int(Value, 0, infinity) of
+ Result ->
+ decode(Fs, [{max_payload_size, Result} | Acc],
+ lists:delete(<<"pubsub#max_payload_size">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#max_payload_size">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var =
+ <<"pubsub#max_payload_size">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var =
+ <<"pubsub#max_payload_size">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var =
+ <<"pubsub#max_payload_size">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#max_payload_size">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#node_type">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_enum(Value, [leaf, collection]) of
+ Result ->
+ decode(Fs, [{node_type, Result} | Acc],
+ lists:delete(<<"pubsub#node_type">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#node_type">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#node_type">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#node_type">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#node_type">>} | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#node_type">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var =
+ <<"pubsub#notification_type">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_enum(Value, [normal, headline]) of
+ Result ->
+ decode(Fs, [{notification_type, Result} | Acc],
+ lists:delete(<<"pubsub#notification_type">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#notification_type">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var =
+ <<"pubsub#notification_type">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var =
+ <<"pubsub#notification_type">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var =
+ <<"pubsub#notification_type">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#notification_type">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#notify_config">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{notify_config, Result} | Acc],
+ lists:delete(<<"pubsub#notify_config">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#notify_config">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#notify_config">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#notify_config">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#notify_config">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#notify_config">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#notify_delete">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{notify_delete, Result} | Acc],
+ lists:delete(<<"pubsub#notify_delete">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#notify_delete">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#notify_delete">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#notify_delete">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#notify_delete">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#notify_delete">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#notify_retract">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{notify_retract, Result} | Acc],
+ lists:delete(<<"pubsub#notify_retract">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#notify_retract">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#notify_retract">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#notify_retract">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#notify_retract">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#notify_retract">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#notify_sub">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{notify_sub, Result} | Acc],
+ lists:delete(<<"pubsub#notify_sub">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#notify_sub">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#notify_sub">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#notify_sub">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#notify_sub">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#notify_sub">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#persist_items">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{persist_items, Result} | Acc],
+ lists:delete(<<"pubsub#persist_items">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#persist_items">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#persist_items">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#persist_items">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#persist_items">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#persist_items">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var =
+ <<"pubsub#presence_based_delivery">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{presence_based_delivery, Result} | Acc],
+ lists:delete(<<"pubsub#presence_based_delivery">>,
+ Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#presence_based_delivery">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var =
+ <<"pubsub#presence_based_delivery">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var =
+ <<"pubsub#presence_based_delivery">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var =
+ <<"pubsub#presence_based_delivery">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#presence_based_delivery">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#publish_model">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_enum(Value, [publishers, subscribers, open]) of
+ Result ->
+ decode(Fs, [{publish_model, Result} | Acc],
+ lists:delete(<<"pubsub#publish_model">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#publish_model">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#publish_model">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#publish_model">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#publish_model">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#publish_model">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#purge_offline">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{purge_offline, Result} | Acc],
+ lists:delete(<<"pubsub#purge_offline">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#purge_offline">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#purge_offline">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#purge_offline">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#purge_offline">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#purge_offline">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var =
+ <<"pubsub#roster_groups_allowed">>,
+ values = Values}
+ | Fs],
+ Acc, Required) ->
+ try [Value || Value <- Values] of
+ Result ->
+ decode(Fs, [{roster_groups_allowed, Result} | Acc],
+ lists:delete(<<"pubsub#roster_groups_allowed">>,
+ Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#roster_groups_allowed">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var =
+ <<"pubsub#send_last_published_item">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_enum(Value,
+ [never, on_sub, on_sub_and_presence])
+ of
+ Result ->
+ decode(Fs, [{send_last_published_item, Result} | Acc],
+ lists:delete(<<"pubsub#send_last_published_item">>,
+ Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#send_last_published_item">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var =
+ <<"pubsub#send_last_published_item">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var =
+ <<"pubsub#send_last_published_item">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var =
+ <<"pubsub#send_last_published_item">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#send_last_published_item">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#tempsub">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{tempsub, Result} | Acc],
+ lists:delete(<<"pubsub#tempsub">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#tempsub">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#tempsub">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#tempsub">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#tempsub">>} | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#tempsub">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#subscribe">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_bool(Value) of
+ Result ->
+ decode(Fs, [{subscribe, Result} | Acc],
+ lists:delete(<<"pubsub#subscribe">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#subscribe">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#subscribe">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#subscribe">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#subscribe">>} | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#subscribe">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#title">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try Value of
+ Result ->
+ decode(Fs, [{title, Result} | Acc],
+ lists:delete(<<"pubsub#title">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#title">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#title">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#title">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#title">>} | _], _,
+ _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#title">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = <<"pubsub#type">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try Value of
+ Result ->
+ decode(Fs, [{type, Result} | Acc],
+ lists:delete(<<"pubsub#type">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#type">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#type">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#type">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#type">>} | _], _,
+ _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#type">>,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([#xdata_field{var = Var} | Fs], Acc, Required) ->
+ if Var /= <<"FORM_TYPE">> ->
+ erlang:error({?MODULE,
+ {unknown_var, Var,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+ true -> decode(Fs, Acc, Required)
+ end;
+decode([], _, [Var | _]) ->
+ erlang:error({?MODULE,
+ {missing_required_var, Var,
+ <<"http://jabber.org/protocol/pubsub#node_config">>}});
+decode([], Acc, []) -> Acc.
+
+encode_access_model(Value, Options, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_enum(Value)]
+ end,
+ Opts = if Options == default ->
+ [#xdata_option{label =
+ Translate(<<"Subscription requests must be approved "
+ "and only subscribers may retrieve items">>),
+ value = <<"authorize">>},
+ #xdata_option{label =
+ Translate(<<"Anyone may subscribe and retrieve items">>),
+ value = <<"open">>},
+ #xdata_option{label =
+ Translate(<<"Anyone with a presence subscription "
+ "of both or from may subscribe and retrieve "
+ "items">>),
+ value = <<"presence">>},
+ #xdata_option{label =
+ Translate(<<"Anyone in the specified roster group(s) "
+ "may subscribe and retrieve items">>),
+ value = <<"roster">>},
+ #xdata_option{label =
+ Translate(<<"Only those on a whitelist may subscribe "
+ "and retrieve items">>),
+ value = <<"whitelist">>}];
+ true ->
+ [#xdata_option{label = Translate(L),
+ value = enc_enum(V)}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var = <<"pubsub#access_model">>,
+ values = Values, required = false, type = 'list-single',
+ options = Opts, desc = <<>>,
+ label = Translate(<<"Specify the access model">>)}.
+
+encode_body_xslt(Value, Translate) ->
+ Values = case Value of
+ <<>> -> [];
+ Value -> [Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#body_xslt">>,
+ values = Values, required = false, type = 'text-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"The URL of an XSL transformation which "
+ "can be applied to payloads in order "
+ "to generate an appropriate message body "
+ "element.">>)}.
+
+encode_children_association_policy(Value, Options,
+ Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_enum(Value)]
+ end,
+ Opts = if Options == default ->
+ [#xdata_option{label =
+ Translate(<<"Anyone may associate leaf nodes with "
+ "the collection">>),
+ value = <<"all">>},
+ #xdata_option{label =
+ Translate(<<"Only collection node owners may associate "
+ "leaf nodes with the collection">>),
+ value = <<"owners">>},
+ #xdata_option{label =
+ Translate(<<"Only those on a whitelist may associate "
+ "leaf nodes with the collection">>),
+ value = <<"whitelist">>}];
+ true ->
+ [#xdata_option{label = Translate(L),
+ value = enc_enum(V)}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var =
+ <<"pubsub#children_association_policy">>,
+ values = Values, required = false, type = 'list-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Who may associate leaf nodes with a "
+ "collection">>)}.
+
+encode_children_association_whitelist(Value,
+ Translate) ->
+ Values = case Value of
+ [] -> [];
+ Value -> [enc_jid(V) || V <- Value]
+ end,
+ Opts = [],
+ #xdata_field{var =
+ <<"pubsub#children_association_whitelist">>,
+ values = Values, required = false, type = 'jid-multi',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"The list of JIDs that may associate "
+ "leaf nodes with a collection">>)}.
+
+encode_children(Value, Translate) ->
+ Values = case Value of
+ [] -> [];
+ Value -> [Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#children">>,
+ values = Values, required = false, type = 'text-multi',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"The child nodes (leaf or collection) "
+ "associated with a collection">>)}.
+
+encode_children_max(Value, Translate) ->
+ Values = case Value of
+ <<>> -> [];
+ Value -> [Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#children_max">>,
+ values = Values, required = false, type = 'text-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"The maximum number of child nodes that "
+ "can be associated with a collection">>)}.
+
+encode_collection(Value, Translate) ->
+ Values = case Value of
+ [] -> [];
+ Value -> [Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#collection">>,
+ values = Values, required = false, type = 'text-multi',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"The collections with which a node is "
+ "affiliated">>)}.
+
+encode_contact(Value, Translate) ->
+ Values = case Value of
+ [] -> [];
+ Value -> [enc_jid(V) || V <- Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#contact">>,
+ values = Values, required = false, type = 'jid-multi',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"The JIDs of those to contact with questions">>)}.
+
+encode_dataform_xslt(Value, Translate) ->
+ Values = case Value of
+ <<>> -> [];
+ Value -> [Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#dataform_xslt">>,
+ values = Values, required = false, type = 'text-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"The URL of an XSL transformation which "
+ "can be applied to the payload format "
+ "in order to generate a valid Data Forms "
+ "result that the client could display "
+ "using a generic Data Forms rendering "
+ "engine">>)}.
+
+encode_deliver_notifications(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#deliver_notifications">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label = Translate(<<"Deliver event notifications">>)}.
+
+encode_deliver_payloads(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#deliver_payloads">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Deliver payloads with event notifications">>)}.
+
+encode_description(Value, Translate) ->
+ Values = case Value of
+ <<>> -> [];
+ Value -> [Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#description">>,
+ values = Values, required = false, type = 'text-single',
+ options = Opts, desc = <<>>,
+ label = Translate(<<"A description of the node">>)}.
+
+encode_item_expire(Value, Translate) ->
+ Values = case Value of
+ <<>> -> [];
+ Value -> [Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#item_expire">>,
+ values = Values, required = false, type = 'text-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Number of seconds after which to automaticall"
+ "y purge items">>)}.
+
+encode_itemreply(Value, Options, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_enum(Value)]
+ end,
+ Opts = if Options == default ->
+ [#xdata_option{label =
+ Translate(<<"Statically specify a replyto of the "
+ "node owner(s)">>),
+ value = <<"owner">>},
+ #xdata_option{label =
+ Translate(<<"Dynamically specify a replyto of the "
+ "item publisher">>),
+ value = <<"publisher">>},
+ #xdata_option{value = <<"none">>}];
+ true ->
+ [#xdata_option{label = Translate(L),
+ value = enc_enum(V)}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var = <<"pubsub#itemreply">>,
+ values = Values, required = false, type = 'list-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Whether owners or publisher should receive "
+ "replies to items">>)}.
+
+encode_language(Value, Options, Translate) ->
+ Values = case Value of
+ <<>> -> [];
+ Value -> [Value]
+ end,
+ Opts = if Options == default -> [];
+ true ->
+ [#xdata_option{label = Translate(L), value = V}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var = <<"pubsub#language">>,
+ values = Values, required = false, type = 'list-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"The default language of the node">>)}.
+
+encode_max_items(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_int(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#max_items">>,
+ values = Values, required = false, type = 'text-single',
+ options = Opts, desc = <<>>,
+ label = Translate(<<"Max # of items to persist">>)}.
+
+encode_max_payload_size(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_int(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#max_payload_size">>,
+ values = Values, required = false, type = 'text-single',
+ options = Opts, desc = <<>>,
+ label = Translate(<<"Max payload size in bytes">>)}.
+
+encode_node_type(Value, Options, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_enum(Value)]
+ end,
+ Opts = if Options == default ->
+ [#xdata_option{label =
+ Translate(<<"The node is a leaf node (default)">>),
+ value = <<"leaf">>},
+ #xdata_option{label =
+ Translate(<<"The node is a collection node">>),
+ value = <<"collection">>}];
+ true ->
+ [#xdata_option{label = Translate(L),
+ value = enc_enum(V)}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var = <<"pubsub#node_type">>,
+ values = Values, required = false, type = 'list-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Whether the node is a leaf (default) "
+ "or a collection">>)}.
+
+encode_notification_type(Value, Options, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_enum(Value)]
+ end,
+ Opts = if Options == default ->
+ [#xdata_option{label =
+ Translate(<<"Messages of type normal">>),
+ value = <<"normal">>},
+ #xdata_option{label =
+ Translate(<<"Messages of type headline">>),
+ value = <<"headline">>}];
+ true ->
+ [#xdata_option{label = Translate(L),
+ value = enc_enum(V)}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var = <<"pubsub#notification_type">>,
+ values = Values, required = false, type = 'list-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Specify the event message type">>)}.
+
+encode_notify_config(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#notify_config">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Notify subscribers when the node configuratio"
+ "n changes">>)}.
+
+encode_notify_delete(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#notify_delete">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Notify subscribers when the node is "
+ "deleted">>)}.
+
+encode_notify_retract(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#notify_retract">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Notify subscribers when items are removed "
+ "from the node">>)}.
+
+encode_notify_sub(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#notify_sub">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Whether to notify owners about new subscriber"
+ "s and unsubscribes">>)}.
+
+encode_persist_items(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#persist_items">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label = Translate(<<"Persist items to storage">>)}.
+
+encode_presence_based_delivery(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#presence_based_delivery">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Only deliver notifications to available "
+ "users">>)}.
+
+encode_publish_model(Value, Options, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_enum(Value)]
+ end,
+ Opts = if Options == default ->
+ [#xdata_option{label =
+ Translate(<<"Only publishers may publish">>),
+ value = <<"publishers">>},
+ #xdata_option{label =
+ Translate(<<"Subscribers may publish">>),
+ value = <<"subscribers">>},
+ #xdata_option{label =
+ Translate(<<"Anyone may publish">>),
+ value = <<"open">>}];
+ true ->
+ [#xdata_option{label = Translate(L),
+ value = enc_enum(V)}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var = <<"pubsub#publish_model">>,
+ values = Values, required = false, type = 'list-single',
+ options = Opts, desc = <<>>,
+ label = Translate(<<"Specify the publisher model">>)}.
+
+encode_purge_offline(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#purge_offline">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Purge all items when the relevant publisher "
+ "goes offline">>)}.
+
+encode_roster_groups_allowed(Value, Options,
+ Translate) ->
+ Values = case Value of
+ [] -> [];
+ Value -> [Value]
+ end,
+ Opts = if Options == default -> [];
+ true ->
+ [#xdata_option{label = Translate(L), value = V}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var = <<"pubsub#roster_groups_allowed">>,
+ values = Values, required = false, type = 'list-multi',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Roster groups allowed to subscribe">>)}.
+
+encode_send_last_published_item(Value, Options,
+ Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_enum(Value)]
+ end,
+ Opts = if Options == default ->
+ [#xdata_option{label = Translate(<<"Never">>),
+ value = <<"never">>},
+ #xdata_option{label =
+ Translate(<<"When a new subscription is processed">>),
+ value = <<"on_sub">>},
+ #xdata_option{label =
+ Translate(<<"When a new subscription is processed "
+ "and whenever a subscriber comes online">>),
+ value = <<"on_sub_and_presence">>}];
+ true ->
+ [#xdata_option{label = Translate(L),
+ value = enc_enum(V)}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var =
+ <<"pubsub#send_last_published_item">>,
+ values = Values, required = false, type = 'list-single',
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"When to send the last published item">>)}.
+
+encode_tempsub(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#tempsub">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Whether to make all subscriptions temporary, "
+ "based on subscriber presence">>)}.
+
+encode_subscribe(Value, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_bool(Value)]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#subscribe">>,
+ values = Values, required = false, type = boolean,
+ options = Opts, desc = <<>>,
+ label =
+ Translate(<<"Whether to allow subscriptions">>)}.
+
+encode_title(Value, Translate) ->
+ Values = case Value of
+ <<>> -> [];
+ Value -> [Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#title">>, values = Values,
+ required = false, type = 'text-single', options = Opts,
+ desc = <<>>,
+ label = Translate(<<"A friendly name for the node">>)}.
+
+encode_type(Value, Translate) ->
+ Values = case Value of
+ <<>> -> [];
+ Value -> [Value]
+ end,
+ Opts = [],
+ #xdata_field{var = <<"pubsub#type">>, values = Values,
+ required = false, type = 'text-single', options = Opts,
+ desc = <<>>,
+ label =
+ Translate(<<"The type of node data, usually specified "
+ "by the namespace of the payload (if "
+ "any)">>)}.