Cargo.toml 🔗
@@ -16,6 +16,7 @@ gitlab = { repository = "lumi/xmpp-rs" }
[dependencies]
xml-rs = "0.4.1"
+xmpp-parsers = "0.3.0"
openssl = "0.9.12"
base64 = "0.5.2"
minidom = "0.4.1"
Emmanuel Gil Peyrot created
Cargo.toml | 1
src/lib.rs | 2 +
src/plugins/stanza.rs | 76 ++++++++------------------------------------
3 files changed, 18 insertions(+), 61 deletions(-)
@@ -16,6 +16,7 @@ gitlab = { repository = "lumi/xmpp-rs" }
[dependencies]
xml-rs = "0.4.1"
+xmpp-parsers = "0.3.0"
openssl = "0.9.12"
base64 = "0.5.2"
minidom = "0.4.1"
@@ -1,6 +1,8 @@
#![feature(raw)]
+#![feature(try_from)]
extern crate xml;
+extern crate xmpp_parsers;
extern crate openssl;
extern crate minidom;
extern crate base64;
@@ -1,44 +1,16 @@
-use std::fmt::Debug;
-use std::any::Any;
+use std::convert::TryFrom;
use plugin::PluginProxy;
use event::{Event, EventHandler, ReceiveElement, Propagation, Priority};
-use minidom::Element;
-use jid::Jid;
use ns;
-pub trait Stanza: Any + Debug {}
+pub use xmpp_parsers::message::Message;
+pub use xmpp_parsers::presence::Presence;
+pub use xmpp_parsers::iq::Iq;
-#[derive(Debug)]
-pub struct MessageEvent {
- pub from: Option<Jid>,
- pub to: Option<Jid>,
- pub id: Option<String>,
- pub type_: Option<String>,
- pub payloads: Vec<Element>,
-}
-
-#[derive(Debug)]
-pub struct IqEvent {
- pub from: Option<Jid>,
- pub to: Option<Jid>,
- pub id: Option<String>,
- pub type_: Option<String>,
- pub payloads: Vec<Element>,
-}
-
-#[derive(Debug)]
-pub struct PresenceEvent {
- pub from: Option<Jid>,
- pub to: Option<Jid>,
- pub id: Option<String>,
- pub type_: Option<String>,
- pub payloads: Vec<Element>,
-}
-
-impl Event for MessageEvent {}
-impl Event for IqEvent {}
-impl Event for PresenceEvent {}
+impl Event for Message {}
+impl Event for Presence {}
+impl Event for Iq {}
pub struct StanzaPlugin {
proxy: PluginProxy,
@@ -60,36 +32,18 @@ impl EventHandler<ReceiveElement> for StanzaPlugin {
fn handle(&self, evt: &ReceiveElement) -> Propagation {
let elem = &evt.0;
- let from = match elem.attr("from") { Some(from) => Some(from.parse().unwrap()), None => None };
- let to = match elem.attr("to") { Some(to) => Some(to.parse().unwrap()), None => None };
- let id = match elem.attr("id") { Some(id) => Some(id.parse().unwrap()), None => None };
- let type_ = match elem.attr("type") { Some(type_) => Some(type_.parse().unwrap()), None => None };
- let payloads = elem.children().cloned().collect::<Vec<_>>();
+ // TODO: make the handle take an Element instead of a reference.
+ let elem = elem.clone();
if elem.is("message", ns::CLIENT) {
- self.proxy.dispatch(MessageEvent {
- from: from,
- to: to,
- id: id,
- type_: type_,
- payloads: payloads,
- });
+ let message = Message::try_from(elem).unwrap();
+ self.proxy.dispatch(message);
} else if elem.is("presence", ns::CLIENT) {
- self.proxy.dispatch(PresenceEvent {
- from: from,
- to: to,
- id: id,
- type_: type_,
- payloads: payloads,
- });
+ let presence = Presence::try_from(elem).unwrap();
+ self.proxy.dispatch(presence);
} else if elem.is("iq", ns::CLIENT) {
- self.proxy.dispatch(IqEvent {
- from: from,
- to: to,
- id: id,
- type_: type_,
- payloads: payloads,
- });
+ let iq = Iq::try_from(elem).unwrap();
+ self.proxy.dispatch(iq);
}
Propagation::Continue