mod codes;
mod container;
mod device;
mod pack;
mod session;
#[cfg(test)]
mod test_utils;
mod types;
pub use codes::{
DevicePropertyCode, EventCode, ObjectFormatCode, ObjectPropertyCode, OperationCode,
PropertyDataType, ResponseCode,
};
pub use container::{
container_type, CommandContainer, ContainerType, DataContainer, EventContainer,
ResponseContainer,
};
pub use device::PtpDevice;
pub use pack::{
pack_datetime, pack_i16, pack_i32, pack_i64, pack_i8, pack_string, pack_u16, pack_u16_array,
pack_u32, pack_u32_array, pack_u64, pack_u8, unpack_datetime, unpack_i16, unpack_i32,
unpack_i64, unpack_i8, unpack_string, unpack_u16, unpack_u16_array, unpack_u32,
unpack_u32_array, unpack_u64, unpack_u8, DateTime,
};
pub use session::{receive_stream_to_stream, PtpSession, ReceiveStream};
pub use types::{
AccessCapability, AssociationType, DeviceInfo, DevicePropDesc, FilesystemType, ObjectInfo,
PropertyFormType, PropertyRange, PropertyValue, ProtectionStatus, StorageInfo, StorageType,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct ObjectHandle(pub u32);
impl ObjectHandle {
pub const ROOT: Self = ObjectHandle(0x00000000);
pub const ALL: Self = ObjectHandle(0xFFFFFFFF);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct StorageId(pub u32);
impl StorageId {
pub const ALL: Self = StorageId(0xFFFFFFFF);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct SessionId(pub u32);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct TransactionId(pub u32);
impl TransactionId {
pub const FIRST: Self = TransactionId(0x00000001);
pub const INVALID: Self = TransactionId(0xFFFFFFFF);
pub const SESSION_LESS: Self = TransactionId(0x00000000);
#[must_use]
pub fn next(self) -> Self {
let next = self.0.wrapping_add(1);
if next == 0 || next == 0xFFFFFFFF {
TransactionId(0x00000001)
} else {
TransactionId(next)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn transaction_id_next() {
assert_eq!(TransactionId(1).next(), TransactionId(2));
assert_eq!(TransactionId(100).next(), TransactionId(101));
}
#[test]
fn transaction_id_wrapping() {
assert_eq!(TransactionId(0xFFFFFFFE).next(), TransactionId(1));
assert_eq!(TransactionId(0xFFFFFFFD).next(), TransactionId(0xFFFFFFFE));
}
#[test]
fn object_handle_constants() {
assert_eq!(ObjectHandle::ROOT.0, 0);
assert_eq!(ObjectHandle::ALL.0, 0xFFFFFFFF);
}
#[test]
fn storage_id_constants() {
assert_eq!(StorageId::ALL.0, 0xFFFFFFFF);
}
}