use bitflags::bitflags;
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(tag = "event", rename_all = "snake_case"))]
#[non_exhaustive]
pub enum RdpMessage {
ConnectionRequest {
cookie_username: Option<String>,
routing_token: Option<String>,
requested_protocols: Option<RdpProtocols>,
},
ConnectionConfirm {
selected_protocol: Option<RdpProtocols>,
negotiation_failure: Option<RdpFailureCode>,
},
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct RdpProtocols: u32 {
const RDP = 0x00;
const SSL = 0x01;
const HYBRID = 0x02;
const RDSTLS = 0x04;
const HYBRID_EX = 0x08;
const RDSAAD = 0x10;
}
}
#[cfg(feature = "serde")]
impl serde::Serialize for RdpProtocols {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_u32(self.bits())
}
}
#[cfg(feature = "serde")]
impl<'de> serde::Deserialize<'de> for RdpProtocols {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let bits = <u32 as serde::Deserialize>::deserialize(deserializer)?;
Ok(RdpProtocols::from_bits_truncate(bits))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
#[non_exhaustive]
pub enum RdpFailureCode {
SslRequiredByServer,
SslNotAllowedByServer,
SslCertNotOnServer,
InconsistentFlags,
HybridRequiredByServer,
SslWithUserAuthRequiredByServer,
Other(u32),
}
impl RdpFailureCode {
pub fn from_raw(code: u32) -> Self {
match code {
1 => Self::SslRequiredByServer,
2 => Self::SslNotAllowedByServer,
3 => Self::SslCertNotOnServer,
4 => Self::InconsistentFlags,
5 => Self::HybridRequiredByServer,
6 => Self::SslWithUserAuthRequiredByServer,
n => Self::Other(n),
}
}
}