summaryrefslogtreecommitdiff
path: root/src/jlib.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/jlib.erl')
-rw-r--r--src/jlib.erl97
1 files changed, 75 insertions, 22 deletions
diff --git a/src/jlib.erl b/src/jlib.erl
index 4992bb51..ced40894 100644
--- a/src/jlib.erl
+++ b/src/jlib.erl
@@ -18,12 +18,18 @@
replace_from_to_attrs/3,
replace_from_to/3,
remove_attr/2,
+ make_jid/3,
+ make_jid/1,
string_to_jid/1,
jid_to_string/1,
is_nodename/1,
tolower/1,
+ nodeprep/1,
+ nameprep/1,
+ resourceprep/1,
jid_tolower/1,
jid_remove_resource/1,
+ jid_replace_resource/2,
get_iq_namespace/1,
iq_query_info/1,
is_iq_request_type/1,
@@ -130,6 +136,30 @@ remove_attr(Attr, {xmlelement, Name, Attrs, Els}) ->
NewAttrs = lists:keydelete(Attr, 1, Attrs),
{xmlelement, Name, NewAttrs, Els}.
+
+make_jid(User, Server, Resource) ->
+ case stringprep:nodeprep(User) of
+ error -> error;
+ LUser ->
+ case stringprep:nameprep(Server) of
+ error -> error;
+ LServer ->
+ case stringprep:resourceprep(Resource) of
+ error -> error;
+ LResource ->
+ #jid{user = User,
+ server = Server,
+ resource = Resource,
+ luser = LUser,
+ lserver = LServer,
+ lresource = LResource}
+ end
+ end
+ end.
+
+make_jid({User, Server, Resource}) ->
+ make_jid(User, Server, Resource).
+
string_to_jid(J) ->
string_to_jid1(J, "").
@@ -157,7 +187,7 @@ string_to_jid1([C | J], N) ->
string_to_jid1([], "") ->
error;
string_to_jid1([], N) ->
- {"", lists:reverse(N), ""}.
+ make_jid("", lists:reverse(N), "").
string_to_jid2([$/ | J], N, "") ->
error;
@@ -168,13 +198,15 @@ string_to_jid2([C | J], N, S) ->
string_to_jid2([], N, "") ->
error;
string_to_jid2([], N, S) ->
- {N, lists:reverse(S), ""}.
+ make_jid(N, lists:reverse(S), "").
string_to_jid3([C | J], N, S, R) ->
string_to_jid3(J, N, S, [C | R]);
string_to_jid3([], N, S, R) ->
- {N, S, lists:reverse(R)}.
+ make_jid(N, S, lists:reverse(R)).
+jid_to_string(#jid{user = User, server = Server, resource = Resource}) ->
+ jid_to_string({User, Server, Resource});
jid_to_string({Node, Server, Resource}) ->
S1 = case Node of
"" ->
@@ -256,13 +288,34 @@ tolower([]) ->
% [].
+nodeprep(S) ->
+ stringprep:nodeprep(S).
+nameprep(S) ->
+ stringprep:nameprep(S).
+
+resourceprep(S) ->
+ stringprep:resourceprep(S).
+
+
+jid_tolower(#jid{luser = U, lserver = S, lresource = R}) ->
+ {U, S, R};
jid_tolower({U, S, R}) ->
{tolower(U), tolower(S), R}.
+jid_remove_resource(#jid{} = JID) ->
+ JID#jid{resource = "", lresource = ""};
jid_remove_resource({U, S, R}) ->
{U, S, ""}.
+jid_replace_resource(JID, Resource) ->
+ case stringprep:resourceprep(Resource) of
+ error -> error;
+ LResource ->
+ JID#jid{resource = Resource, lresource = LResource}
+ end.
+
+
get_iq_namespace({xmlelement, Name, Attrs, Els}) when Name == "iq" ->
case xml:remove_cdata(Els) of
[{xmlelement, Name2, Attrs2, Els2}] ->
@@ -276,29 +329,29 @@ get_iq_namespace(_) ->
iq_query_info({xmlelement, Name, Attrs, Els}) when Name == "iq" ->
ID = xml:get_attr_s("id", Attrs),
Type = xml:get_attr_s("type", Attrs),
- case xml:remove_cdata(Els) of
- [{xmlelement, Name2, Attrs2, Els2}] ->
- XMLNS = xml:get_attr_s("xmlns", Attrs2),
- Type1 = case Type of
- "set" -> set;
- "get" -> get;
- "result" -> reply;
- "error" -> reply;
- _ -> invalid
- end,
- if
- (Type1 /= invalid) and (Type1 /= reply) and (XMLNS /= "") ->
- {iq, ID, Type1, XMLNS, {xmlelement, Name2, Attrs2, Els2}};
- true ->
+ Type1 = case Type of
+ "set" -> set;
+ "get" -> get;
+ "result" -> reply;
+ "error" -> reply;
+ _ -> invalid
+ end,
+ if
+ (Type1 /= invalid) and (Type1 /= reply) ->
+ case xml:remove_cdata(Els) of
+ [{xmlelement, Name2, Attrs2, Els2}] ->
+ XMLNS = xml:get_attr_s("xmlns", Attrs2),
if
- Type1 == reply ->
- reply;
+ XMLNS /= "" ->
+ {iq, ID, Type1, XMLNS, {xmlelement, Name2, Attrs2, Els2}};
true ->
invalid
- end
+ end;
+ _ ->
+ invalid
end;
- _ ->
- invalid
+ true ->
+ Type1
end;
iq_query_info(_) ->
not_iq.