mod codes;
mod container;
mod device;
mod pack;
mod session;
#[cfg(test)]
mod test_utils;
mod types;
pub use crate::error::{PtpError, UsbError};
pub use codes::{
DevicePropertyCode, EventCode, ObjectFormatCode, ObjectPropertyCode, OperationCode,
PropertyDataType, ResponseCode,
};
pub(crate) use container::{container_type, CommandContainer, ContainerType, DataContainer};
pub use container::{EventContainer, ResponseContainer};
pub use device::PtpDevice;
#[allow(unused_imports)]
pub(crate) use pack::{
pack_datetime, pack_i16, pack_i32, pack_i64, pack_i8, pack_string, pack_u16, pack_u32,
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,
};
#[cfg(any(test, feature = "virtual-device"))]
#[allow(unused_imports)]
pub(crate) use pack::{pack_u16_array, pack_u32_array};
pub use pack::{DateTime, UtcOffset, MAX_STRING_UNITS};
pub use session::{receive_stream_to_stream, PtpSession, ReceiveStream};
pub use types::{
AccessCapability, AssociationType, DeviceInfo, DevicePropDesc, FilesystemType, ObjectInfo,
ObjectPropListElement, 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);
pub const SEND_ROOT: 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(crate) struct TransactionId(pub u32);
impl TransactionId {
pub(crate) const FIRST: Self = TransactionId(0x00000001);
pub(crate) const SESSION_LESS: Self = TransactionId(0x00000000);
#[must_use]
pub(crate) 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);
}
}