1 |
|
-module(mongoose_stanza_helper). |
2 |
|
-export([build_message/3]). |
3 |
|
-export([parse_from_to/2]). |
4 |
|
|
5 |
|
-include("jlib.hrl"). |
6 |
|
|
7 |
|
-spec build_message(From :: binary(), To :: binary(), Body :: binary()) -> exml:element(). |
8 |
|
build_message(From, To, Body) -> |
9 |
2 |
#xmlel{name = <<"message">>, |
10 |
|
attrs = [{<<"type">>, <<"chat">>}, |
11 |
|
{<<"id">>, mongoose_bin:gen_from_crypto()}, |
12 |
|
{<<"from">>, From}, |
13 |
|
{<<"to">>, To}], |
14 |
|
children = [#xmlel{name = <<"body">>, |
15 |
|
children = [#xmlcdata{content = Body}]}] |
16 |
|
}. |
17 |
|
|
18 |
|
-spec parse_from_to(jid:jid() | binary() | undefined, jid:jid() | binary() | undefined) -> |
19 |
|
{ok, jid:jid(), jid:jid()} | {error, missing} | {error, type_error, string()}. |
20 |
|
parse_from_to(F, T) when F == undefined; T == undefined -> |
21 |
1 |
{error, missing}; |
22 |
|
parse_from_to(F, T) -> |
23 |
59 |
case parse_jid_list([F, T]) of |
24 |
47 |
{ok, [Fjid, Tjid]} -> {ok, Fjid, Tjid}; |
25 |
12 |
E -> E |
26 |
|
end. |
27 |
|
|
28 |
|
-spec parse_jid_list(BinJids :: [binary()]) -> {ok, [jid:jid()]} | {error, type_error, string()}. |
29 |
|
parse_jid_list([_ | _] = BinJids) -> |
30 |
59 |
Jids = lists:map(fun parse_jid/1, BinJids), |
31 |
59 |
case [Msg || {error, Msg} <- Jids] of |
32 |
47 |
[] -> {ok, Jids}; |
33 |
12 |
Errors -> {error, type_error, lists:join("; ", Errors)} |
34 |
|
end. |
35 |
|
|
36 |
|
-spec parse_jid(binary() | jid:jid()) -> jid:jid() | {error, string()}. |
37 |
|
parse_jid(#jid{} = Jid) -> |
38 |
16 |
Jid; |
39 |
|
parse_jid(Jid) when is_binary(Jid) -> |
40 |
102 |
case jid:from_binary(Jid) of |
41 |
12 |
error -> {error, io_lib:format("Invalid jid: ~p", [Jid])}; |
42 |
90 |
B -> B |
43 |
|
end. |