Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions include/mam_query.hrl
Original file line number Diff line number Diff line change
@@ -1,20 +1,28 @@
%% Created automatically by xdata generator (xdata_codec.erl)
%% Source: mam_query.xdata
%% Form type: urn:xmpp:mam:1
%% Form type: urn:xmpp:mam:2
%% Document: XEP-0313


-type property() :: {'with', jid:jid()} |
{'start', erlang:timestamp()} |
{'end', erlang:timestamp()} |
{'withtext', binary()}.
{'withtext', binary()} |
{'after-id', binary()} |
{'before-id', binary()} |
{'ids', [binary()]}.
-type result() :: [property()].

-type options(T) :: [{binary(), T}].
-type form_property() ::
{'with', jid:jid() | undefined} |
{'start', erlang:timestamp() | undefined} |
{'end', erlang:timestamp() | undefined} |
{'withtext', binary()}.
{'withtext', binary()} |
{'after-id', binary()} |
{'before-id', binary()} |
{'ids', [binary()]} |
{'ids', [binary()], options(binary())}.
-type form() :: [form_property() | xdata_field()].

-type error_reason() :: {form_type_mismatch, binary()} |
Expand Down
1 change: 1 addition & 0 deletions include/ns.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@
-define(NS_MAM_0, <<"urn:xmpp:mam:0">>).
-define(NS_MAM_1, <<"urn:xmpp:mam:1">>).
-define(NS_MAM_2, <<"urn:xmpp:mam:2">>).
-define(NS_MAM_2_EXTENDED, <<"urn:xmpp:mam:2#extended">>).
-define(NS_MAM_FULLTEXT_0, <<"urn:xmpp:fulltext:0">>).
-define(NS_SID_0, <<"urn:xmpp:sid:0">>).
-define(NS_INBOX_1, <<"urn:xmpp:inbox:1">>).
Expand Down
27 changes: 21 additions & 6 deletions include/xmpp_codec.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,10 @@
-record(gone, {uri = <<>> :: binary()}).
-type gone() :: #gone{}.

-record(mam_metadata_end, {id = <<>> :: binary(),
timestamp :: erlang:timestamp()}).
-type mam_metadata_end() :: #mam_metadata_end{}.

-record(message_thread, {parent = <<>> :: binary(),
data = <<>> :: binary()}).
-type message_thread() :: #message_thread{}.
Expand Down Expand Up @@ -311,6 +315,10 @@
xmlns = <<>> :: binary()}).
-type sm_resume() :: #sm_resume{}.

-record(mam_metadata_start, {id = <<>> :: binary(),
timestamp :: erlang:timestamp()}).
-type mam_metadata_start() :: #mam_metadata_start{}.

-record(jingle_content, {creator :: 'initiator' | 'responder',
disposition = <<>> :: binary(),
name = <<>> :: binary(),
Expand Down Expand Up @@ -384,6 +392,10 @@
desc = <<>> :: binary()}).
-type delay() :: #delay{}.

-record(mam_metadata, {start :: 'undefined' | #mam_metadata_start{},
'end' :: 'undefined' | #mam_metadata_end{}}).
-type mam_metadata() :: #mam_metadata{}.

-record(handshake, {data = <<>> :: binary()}).
-type handshake() :: #handshake{}.

Expand Down Expand Up @@ -915,12 +927,6 @@
-record(muc_hats, {hats = [] :: [#muc_hat{}]}).
-type muc_hats() :: #muc_hats{}.

-record(oob_x, {url :: binary(),
desc = <<>> :: binary(),
sid = <<>> :: binary(),
sub_els = [] :: [xmpp_element() | fxml:xmlel()]}).
-type oob_x() :: #oob_x{}.

-record(x509_ca_list, {certs = [] :: [binary()]}).
-type x509_ca_list() :: #x509_ca_list{}.

Expand Down Expand Up @@ -1468,6 +1474,12 @@
sub_els = [] :: [xmpp_element() | fxml:xmlel()]}).
-type vcard_temp() :: #vcard_temp{}.

-record(oob_x, {url :: binary(),
desc = <<>> :: binary(),
sid = <<>> :: binary(),
sub_els = [] :: [xmpp_element() | fxml:xmlel()]}).
-type oob_x() :: #oob_x{}.

-type xmpp_element() :: address() |
addresses() |
adhoc_actions() |
Expand Down Expand Up @@ -1557,6 +1569,9 @@
legacy_auth_feature() |
mam_archived() |
mam_fin() |
mam_metadata() |
mam_metadata_end() |
mam_metadata_start() |
mam_prefs() |
mam_query() |
mam_result() |
Expand Down
13 changes: 12 additions & 1 deletion specs/mam_query.xdata
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<form_type>
<name>urn:xmpp:mam:1</name>
<name>urn:xmpp:mam:2</name>
<doc>XEP-0313</doc>
<desc>Form to query message archives</desc>
<field var='with'
Expand All @@ -14,6 +14,17 @@
<field var='withtext'
type='text-single'
label='Search the text (obsolete)'/>
<field var='after-id'
type='text-single'
label='Only results after given id'/>
<field var='before-id'
type='text-single'
label='Only results before given id'/>
<field var='ids'
type='list-multi'
label='List of stanza ids to retrieve'>
<validate xmlns='http://jabber.org/protocol/xdata-validate' datatype='xs:string'>
<open/></validate></field>
</form_type>

<!--
Expand Down
38 changes: 38 additions & 0 deletions specs/xmpp_codec.spec
Original file line number Diff line number Diff line change
Expand Up @@ -3237,6 +3237,44 @@
enc = {enc_bool, []}}],
refs = [#ref{name = rsm_set, min = 0, max = 1, label = '$rsm'}]}).


-xml(mam_metadata_start,
#elem{name = <<"start">>,
xmlns = <<"urn:xmpp:mam:2">>,
module = 'xep0313',
result = {mam_metadata_start, '$id', '$timestamp'},
attrs = [#attr{name = <<"id">>,
label = '$id',
required = true},
#attr{name = <<"timestamp">>,
label = '$timestamp',
required = true,
dec = {dec_utc, []},
enc = {enc_utc, []}}]}).

-xml(mam_metadata_end,
#elem{name = <<"end">>,
xmlns = <<"urn:xmpp:mam:2">>,
module = 'xep0313',
result = {mam_metadata_end, '$id', '$timestamp'},
attrs = [#attr{name = <<"id">>,
label = '$id',
required = true},
#attr{name = <<"timestamp">>,
label = '$timestamp',
required = true,
dec = {dec_utc, []},
enc = {enc_utc, []}}]}).

-xml(mam_metadata,
#elem{name = <<"metadata">>,
xmlns = [<<"urn:xmpp:mam:2">>],
module = 'xep0313',
result = {mam_metadata, '$start', '$end'},
refs = [#ref{name = mam_metadata_start, label = '$start', min=0, max=1},
#ref{name = mam_metadata_end, label = '$end', min=0, max=1}]
}).

-xml(forwarded,
#elem{name = <<"forwarded">>,
xmlns = <<"urn:xmpp:forward:0">>,
Expand Down
164 changes: 160 additions & 4 deletions src/mam_query.erl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
%% Created automatically by xdata generator (xdata_codec.erl)
%% Source: mam_query.xdata
%% Form type: urn:xmpp:mam:1
%% Form type: urn:xmpp:mam:2
%% Document: XEP-0313

-module(mam_query).
Expand Down Expand Up @@ -67,7 +67,13 @@
-spec encode(form(), binary()) -> [xdata_field()].

-spec encode(form(), binary(),
[with | start | 'end' | withtext]) -> [xdata_field()].
[with |
start |
'end' |
withtext |
'after-id' |
'before-id' |
ids]) -> [xdata_field()].

dec_int(Val) -> dec_int(Val, infinity, infinity).

Expand Down Expand Up @@ -158,7 +164,7 @@ io_format_error({missing_required_var, Var, Type}) ->
[Var, Type]}.

decode(Fs) ->
decode(Fs, [<<"urn:xmpp:mam:1">>], [], []).
decode(Fs, [<<"urn:xmpp:mam:2">>], [], []).

decode(Fs, XMLNSList) -> decode(Fs, XMLNSList, [], []).

Expand Down Expand Up @@ -197,11 +203,29 @@ encode(List, Lang, Required) ->
[encode_withtext(Val,
Lang,
lists:member(withtext, Required))];
{'after-id', Val} ->
['encode_after-id'(Val,
Lang,
lists:member('after-id', Required))];
{'before-id', Val} ->
['encode_before-id'(Val,
Lang,
lists:member('before-id', Required))];
{ids, Val} ->
[encode_ids(Val,
default,
Lang,
lists:member(ids, Required))];
{ids, Val, Opts} ->
[encode_ids(Val,
Opts,
Lang,
lists:member(ids, Required))];
#xdata_field{} -> [Opt]
end
|| Opt <- List],
FormType = #xdata_field{var = <<"FORM_TYPE">>,
type = hidden, values = [<<"urn:xmpp:mam:1">>]},
type = hidden, values = [<<"urn:xmpp:mam:2">>]},
[FormType | lists:flatten(Fs)].

do_decode([#xdata_field{var = <<"with">>,
Expand Down Expand Up @@ -322,6 +346,81 @@ do_decode([#xdata_field{var = <<"withtext">>} | _],
XMLNS, _, _) ->
erlang:error({?MODULE,
{too_many_values, <<"withtext">>, XMLNS}});
do_decode([#xdata_field{var = <<"after-id">>,
values = [Value]}
| Fs],
XMLNS, Required, Acc) ->
try Value of
Result ->
do_decode(Fs,
XMLNS,
lists:delete(<<"after-id">>, Required),
[{'after-id', Result} | Acc])
catch
_:_ ->
erlang:error({?MODULE,
{bad_var_value, <<"after-id">>, XMLNS}})
end;
do_decode([#xdata_field{var = <<"after-id">>,
values = []} =
F
| Fs],
XMLNS, Required, Acc) ->
do_decode([F#xdata_field{var = <<"after-id">>,
values = [<<>>]}
| Fs],
XMLNS,
Required,
Acc);
do_decode([#xdata_field{var = <<"after-id">>} | _],
XMLNS, _, _) ->
erlang:error({?MODULE,
{too_many_values, <<"after-id">>, XMLNS}});
do_decode([#xdata_field{var = <<"before-id">>,
values = [Value]}
| Fs],
XMLNS, Required, Acc) ->
try Value of
Result ->
do_decode(Fs,
XMLNS,
lists:delete(<<"before-id">>, Required),
[{'before-id', Result} | Acc])
catch
_:_ ->
erlang:error({?MODULE,
{bad_var_value, <<"before-id">>, XMLNS}})
end;
do_decode([#xdata_field{var = <<"before-id">>,
values = []} =
F
| Fs],
XMLNS, Required, Acc) ->
do_decode([F#xdata_field{var = <<"before-id">>,
values = [<<>>]}
| Fs],
XMLNS,
Required,
Acc);
do_decode([#xdata_field{var = <<"before-id">>} | _],
XMLNS, _, _) ->
erlang:error({?MODULE,
{too_many_values, <<"before-id">>, XMLNS}});
do_decode([#xdata_field{var = <<"ids">>,
values = Values}
| Fs],
XMLNS, Required, Acc) ->
try [Value || Value <- Values] of
Result ->
do_decode(Fs,
XMLNS,
lists:delete(<<"ids">>, Required),
[{ids, Result} | Acc])
catch
_:_ ->
erlang:error({?MODULE,
{bad_var_value, <<"ids">>, XMLNS}})
end;
do_decode([#xdata_field{var = Var} | Fs], XMLNS,
Required, Acc) ->
if Var /= <<"FORM_TYPE">> ->
Expand Down Expand Up @@ -389,3 +488,60 @@ encode_withtext(Value, Lang, IsRequired) ->
options = Opts, desc = <<>>,
label =
xmpp_tr:tr(Lang, ?T("Search the text (obsolete)"))}.

-spec 'encode_after-id'(binary(), binary(),
boolean()) -> xdata_field().

'encode_after-id'(Value, Lang, IsRequired) ->
Values = case Value of
<<>> -> [];
Value -> [Value]
end,
Opts = [],
#xdata_field{var = <<"after-id">>, values = Values,
required = IsRequired, type = 'text-single',
options = Opts, desc = <<>>,
label =
xmpp_tr:tr(Lang, ?T("Only results after given id"))}.

-spec 'encode_before-id'(binary(), binary(),
boolean()) -> xdata_field().

'encode_before-id'(Value, Lang, IsRequired) ->
Values = case Value of
<<>> -> [];
Value -> [Value]
end,
Opts = [],
#xdata_field{var = <<"before-id">>, values = Values,
required = IsRequired, type = 'text-single',
options = Opts, desc = <<>>,
label =
xmpp_tr:tr(Lang, ?T("Only results before given id"))}.

-spec encode_ids([binary()],
default | options(binary()), binary(),
boolean()) -> xdata_field().

encode_ids(Value, Options, Lang, IsRequired) ->
Values = case Value of
[] -> [];
Value -> Value
end,
Opts = if Options == default -> [];
true ->
[#xdata_option{label = xmpp_tr:tr(Lang, L), value = V}
|| {L, V} <- Options]
end,
#xdata_field{var = <<"ids">>, values = Values,
required = IsRequired, type = 'list-multi',
options = Opts, desc = <<>>,
label =
xmpp_tr:tr(Lang, ?T("List of stanza ids to retrieve")),
sub_els =
[{xmlel,
<<"validate">>,
[{<<"xmlns">>,
<<"http://jabber.org/protocol/xdata-validate">>},
{<<"datatype">>, <<"xs:string">>}],
[{xmlcdata, <<>>}, {xmlel, <<"open">>, [], []}]}]}.
Loading