use super::{xml_bool, xml_str};
use crate::error::OnvifError;
use crate::soap::{SoapError, XmlNode};
#[derive(Debug, Clone)]
pub struct MediaProfile {
pub token: String,
pub name: String,
pub fixed: bool,
}
impl MediaProfile {
pub(crate) fn from_xml(p: &XmlNode) -> Self {
Self {
token: p.attr("token").unwrap_or("").to_string(),
fixed: p.attr("fixed") == Some("true"),
name: xml_str(p, "Name").unwrap_or_default(),
}
}
pub(crate) fn vec_from_xml(resp: &XmlNode) -> Result<Vec<Self>, OnvifError> {
Ok(resp
.children_named("Profiles")
.map(Self::from_xml)
.collect())
}
}
#[derive(Debug, Clone)]
pub struct StreamUri {
pub uri: String,
pub invalid_after_connect: bool,
pub invalid_after_reboot: bool,
pub timeout: String,
}
impl StreamUri {
pub(crate) fn from_xml(resp: &XmlNode) -> Result<Self, OnvifError> {
let media_uri = resp
.child("MediaUri")
.ok_or_else(|| SoapError::missing("MediaUri"))?;
let uri = media_uri
.child("Uri")
.map(|n| n.text().to_string())
.filter(|s| !s.is_empty())
.ok_or_else(|| SoapError::missing("Uri"))?;
Ok(Self {
uri,
invalid_after_connect: xml_bool(media_uri, "InvalidAfterConnect"),
invalid_after_reboot: xml_bool(media_uri, "InvalidAfterReboot"),
timeout: xml_str(media_uri, "Timeout").unwrap_or_default(),
})
}
}
#[derive(Debug, Clone)]
pub struct SnapshotUri {
pub uri: String,
pub invalid_after_connect: bool,
pub invalid_after_reboot: bool,
pub timeout: String,
}
impl SnapshotUri {
pub(crate) fn from_xml(resp: &XmlNode) -> Result<Self, OnvifError> {
let media_uri = resp
.child("MediaUri")
.ok_or_else(|| SoapError::missing("MediaUri"))?;
let uri = media_uri
.child("Uri")
.map(|n| n.text().to_string())
.filter(|s| !s.is_empty())
.ok_or_else(|| SoapError::missing("Uri"))?;
Ok(Self {
uri,
invalid_after_connect: xml_bool(media_uri, "InvalidAfterConnect"),
invalid_after_reboot: xml_bool(media_uri, "InvalidAfterReboot"),
timeout: xml_str(media_uri, "Timeout").unwrap_or_default(),
})
}
}
#[derive(Debug, Clone)]
pub struct MediaProfile2 {
pub token: String,
pub name: String,
pub fixed: bool,
pub video_source_token: Option<String>,
pub video_encoder_token: Option<String>,
}
impl MediaProfile2 {
pub(crate) fn vec_from_xml(resp: &XmlNode) -> Result<Vec<Self>, OnvifError> {
Ok(resp
.children_named("Profiles")
.map(|p| Self {
token: p.attr("token").unwrap_or("").to_string(),
name: xml_str(p, "Name").unwrap_or_default(),
fixed: p.attr("fixed") == Some("true"),
video_source_token: p
.path(&["Configurations", "VideoSource"])
.and_then(|n| n.attr("token"))
.map(str::to_string),
video_encoder_token: p
.path(&["Configurations", "VideoEncoder"])
.and_then(|n| n.attr("token"))
.map(str::to_string),
})
.collect())
}
}