carbons.rs

  1// Copyright (c) 2019 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
  2//
  3// This Source Code Form is subject to the terms of the Mozilla Public
  4// License, v. 2.0. If a copy of the MPL was not distributed with this
  5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6
  7use crate::forwarding::Forwarded;
  8use crate::iq::IqSetPayload;
  9use crate::message::MessagePayload;
 10
 11generate_empty_element!(
 12    /// Enable carbons for this session.
 13    Enable,
 14    "enable",
 15    CARBONS
 16);
 17
 18impl IqSetPayload for Enable {}
 19
 20generate_empty_element!(
 21    /// Disable a previously-enabled carbons.
 22    Disable,
 23    "disable",
 24    CARBONS
 25);
 26
 27impl IqSetPayload for Disable {}
 28
 29generate_empty_element!(
 30    /// Request the enclosing message to not be copied to other carbons-enabled
 31    /// resources of the user.
 32    Private,
 33    "private",
 34    CARBONS
 35);
 36
 37impl MessagePayload for Private {}
 38
 39generate_element!(
 40    /// Wrapper for a message received on another resource.
 41    Received, "received", CARBONS,
 42
 43    children: [
 44        /// Wrapper for the enclosed message.
 45        forwarded: Required<Forwarded> = ("forwarded", FORWARD) => Forwarded
 46    ]
 47);
 48
 49impl MessagePayload for Received {}
 50
 51generate_element!(
 52    /// Wrapper for a message sent from another resource.
 53    Sent, "sent", CARBONS,
 54
 55    children: [
 56        /// Wrapper for the enclosed message.
 57        forwarded: Required<Forwarded> = ("forwarded", FORWARD) => Forwarded
 58    ]
 59);
 60
 61impl MessagePayload for Sent {}
 62
 63#[cfg(test)]
 64mod tests {
 65    use super::*;
 66    use minidom::Element;
 67    use std::convert::TryFrom;
 68
 69    #[cfg(target_pointer_width = "32")]
 70    #[test]
 71    fn test_size() {
 72        assert_size!(Enable, 0);
 73        assert_size!(Disable, 0);
 74        assert_size!(Private, 0);
 75        assert_size!(Received, 212);
 76        assert_size!(Sent, 212);
 77    }
 78
 79    #[cfg(target_pointer_width = "64")]
 80    #[test]
 81    fn test_size() {
 82        assert_size!(Enable, 0);
 83        assert_size!(Disable, 0);
 84        assert_size!(Private, 0);
 85        assert_size!(Received, 408);
 86        assert_size!(Sent, 408);
 87    }
 88
 89    #[test]
 90    fn empty_elements() {
 91        let elem: Element = "<enable xmlns='urn:xmpp:carbons:2'/>".parse().unwrap();
 92        Enable::try_from(elem).unwrap();
 93
 94        let elem: Element = "<disable xmlns='urn:xmpp:carbons:2'/>".parse().unwrap();
 95        Disable::try_from(elem).unwrap();
 96
 97        let elem: Element = "<private xmlns='urn:xmpp:carbons:2'/>".parse().unwrap();
 98        Private::try_from(elem).unwrap();
 99    }
100
101    #[test]
102    fn forwarded_elements() {
103        let elem: Element = "<received xmlns='urn:xmpp:carbons:2'>
104  <forwarded xmlns='urn:xmpp:forward:0'>
105    <message xmlns='jabber:client'
106             to='juliet@capulet.example/balcony'
107             from='romeo@montague.example/home'/>
108  </forwarded>
109</received>"
110            .parse()
111            .unwrap();
112        let received = Received::try_from(elem).unwrap();
113        assert!(received.forwarded.stanza.is_some());
114
115        let elem: Element = "<sent xmlns='urn:xmpp:carbons:2'>
116  <forwarded xmlns='urn:xmpp:forward:0'>
117    <message xmlns='jabber:client'
118             to='juliet@capulet.example/balcony'
119             from='romeo@montague.example/home'/>
120  </forwarded>
121</sent>"
122            .parse()
123            .unwrap();
124        let sent = Sent::try_from(elem).unwrap();
125        assert!(sent.forwarded.stanza.is_some());
126    }
127}