use serde::{Deserialize, Serialize};
#[cfg(not(feature = "std"))]
use alloc::{string::String, vec, vec::Vec};
use crate::{device::DeviceType, packet::NetworkPacketType};
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IdentityPacket {
pub device_id: String,
pub protocol_version: u16,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub device_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub device_type: Option<DeviceType>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub incoming_capabilities: Option<Vec<NetworkPacketType>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub outgoing_capabilities: Option<Vec<NetworkPacketType>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
tcp_port: Option<u16>,
}
impl IdentityPacket {
pub(crate) fn new<A: Into<String>, B: Into<String>>(
device_id: A,
device_name: B,
device_type: DeviceType,
tcp_port: u16,
) -> Self {
Self {
device_id: device_id.into(),
device_name: Some(device_name.into()),
device_type: Some(device_type),
incoming_capabilities: Some(vec![]),
outgoing_capabilities: Some(vec![]),
protocol_version: crate::config::KDECONNECT_PROTOCOL_VERSION,
tcp_port: Some(tcp_port),
}
}
#[must_use]
pub(crate) fn with_incoming_capabilities<I: IntoIterator<Item = NetworkPacketType>>(
mut self,
caps: I,
) -> Self {
self.incoming_capabilities
.get_or_insert(vec![])
.extend(caps);
self
}
#[must_use]
#[allow(unused)]
pub(crate) fn with_all_incoming_capabilities(self) -> Self {
self.with_incoming_capabilities([
NetworkPacketType::Battery,
NetworkPacketType::Clipboard,
NetworkPacketType::ClipboardConnect,
NetworkPacketType::ConnectivityReport,
NetworkPacketType::ContactsRequestAllUidsTimestamps,
NetworkPacketType::ContactsRequestVcardByUid,
NetworkPacketType::FindmyphoneRequest,
NetworkPacketType::MousepadKeyboardState,
NetworkPacketType::MousepadEcho,
NetworkPacketType::MousepadRequest,
NetworkPacketType::Mpris,
NetworkPacketType::MprisRequest,
NetworkPacketType::NotificationRequest,
NetworkPacketType::NotificationReply,
NetworkPacketType::NotificationAction,
NetworkPacketType::Ping,
NetworkPacketType::Notification,
NetworkPacketType::RunCommand,
NetworkPacketType::RunCommandRequest,
NetworkPacketType::Sftp,
NetworkPacketType::ShareRequest,
NetworkPacketType::ShareRequestUpdate,
NetworkPacketType::SmsRequest,
NetworkPacketType::SmsRequestConversations,
NetworkPacketType::SmsRequestConversation,
NetworkPacketType::SmsRequestAttachment,
NetworkPacketType::SystemVolume,
NetworkPacketType::SystemVolumeRequest,
NetworkPacketType::TelephonyRequestMute,
NetworkPacketType::DigitizerSession,
NetworkPacketType::Digitizer,
NetworkPacketType::Presenter,
])
}
#[must_use]
pub(crate) fn with_outgoing_capabilities<I: IntoIterator<Item = NetworkPacketType>>(
mut self,
caps: I,
) -> Self {
self.outgoing_capabilities
.get_or_insert(vec![])
.extend(caps);
self
}
#[must_use]
#[allow(unused)]
pub(crate) fn with_all_outgoing_capabilities(self) -> Self {
self.with_outgoing_capabilities([
NetworkPacketType::RunCommand,
NetworkPacketType::RunCommandRequest,
NetworkPacketType::Sftp,
NetworkPacketType::ShareRequest,
NetworkPacketType::ShareRequestUpdate,
NetworkPacketType::SmsRequest,
NetworkPacketType::SmsRequestConversations,
NetworkPacketType::SmsRequestConversation,
NetworkPacketType::SmsRequestAttachment,
NetworkPacketType::SystemVolume,
NetworkPacketType::SystemVolumeRequest,
NetworkPacketType::TelephonyRequestMute,
NetworkPacketType::DigitizerSession,
NetworkPacketType::Digitizer,
NetworkPacketType::Presenter,
NetworkPacketType::Sftp,
NetworkPacketType::ShareRequest,
NetworkPacketType::ShareRequestUpdate,
])
}
pub(crate) fn get_tcp_port(&self) -> Option<u16> {
self.tcp_port
}
}