summaryrefslogtreecommitdiff
path: root/src/jlib.erl
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2016-06-03 20:28:48 +0200
committerHolger Weiss <holger@zedat.fu-berlin.de>2016-06-03 20:28:48 +0200
commit4d5eab66625b9693933bdea8abbf5d25799f1fde (patch)
tree6b69ab3d3480c9040e74a184994f8a1c12214b57 /src/jlib.erl
parentIgnore <delay/> when checking for chat states (diff)
Unwrap carbon copies when checking for chat states
Detect standalone chat states that were carbon-copied.
Diffstat (limited to 'src/jlib.erl')
-rw-r--r--src/jlib.erl45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/jlib.erl b/src/jlib.erl
index 8fe2b977..42ac4bff 100644
--- a/src/jlib.erl
+++ b/src/jlib.erl
@@ -43,7 +43,7 @@
get_iq_namespace/1, iq_query_info/1,
iq_query_or_response_info/1, is_iq_request_type/1,
iq_to_xml/1, parse_xdata_submit/1,
- is_standalone_chat_state/1,
+ unwrap_carbon/1, is_standalone_chat_state/1,
add_delay_info/3, add_delay_info/4,
timestamp_to_legacy/1, timestamp_to_iso_basic/1, timestamp_to_iso/2,
now_to_utc_string/1, now_to_local_string/1,
@@ -529,6 +529,49 @@ rsm_encode_count(Count, Arr) ->
children = [{xmlcdata, i2l(Count)}]}
| Arr].
+-spec unwrap_carbon(xmlel()) -> xmlel().
+
+unwrap_carbon(#xmlel{name = <<"message">>} = Stanza) ->
+ case unwrap_carbon(Stanza, <<"sent">>) of
+ #xmlel{} = Payload ->
+ Payload;
+ false ->
+ case unwrap_carbon(Stanza, <<"received">>) of
+ #xmlel{} = Payload ->
+ Payload;
+ false ->
+ Stanza
+ end
+ end;
+unwrap_carbon(Stanza) -> Stanza.
+
+-spec unwrap_carbon(xmlel(), binary()) -> xmlel() | false.
+
+unwrap_carbon(Stanza, Direction) ->
+ case fxml:get_subtag(Stanza, Direction) of
+ #xmlel{name = Direction, attrs = Attrs} = El ->
+ case fxml:get_attr_s(<<"xmlns">>, Attrs) of
+ NS when NS == ?NS_CARBONS_2;
+ NS == ?NS_CARBONS_1 ->
+ case fxml:get_subtag_with_xmlns(El, <<"forwarded">>,
+ ?NS_FORWARD) of
+ #xmlel{children = Els} ->
+ case fxml:remove_cdata(Els) of
+ [#xmlel{} = Payload] ->
+ Payload;
+ _ ->
+ false
+ end;
+ false ->
+ false
+ end;
+ _NS ->
+ false
+ end;
+ false ->
+ false
+ end.
+
-spec is_standalone_chat_state(xmlel()) -> boolean().
is_standalone_chat_state(#xmlel{name = <<"message">>, children = Els}) ->