1mod codes;
46mod container;
47mod device;
48mod pack;
49mod session;
50#[cfg(test)]
51mod test_utils;
52mod types;
53
54pub use codes::{
55 DevicePropertyCode, EventCode, ObjectFormatCode, ObjectPropertyCode, OperationCode,
56 PropertyDataType, ResponseCode,
57};
58pub use container::{
59 container_type, CommandContainer, ContainerType, DataContainer, EventContainer,
60 ResponseContainer,
61};
62pub use device::PtpDevice;
63pub use pack::{
64 pack_datetime, pack_i16, pack_i32, pack_i64, pack_i8, pack_string, pack_u16, pack_u16_array,
65 pack_u32, pack_u32_array, pack_u64, pack_u8, unpack_datetime, unpack_i16, unpack_i32,
66 unpack_i64, unpack_i8, unpack_string, unpack_u16, unpack_u16_array, unpack_u32,
67 unpack_u32_array, unpack_u64, unpack_u8, DateTime,
68};
69pub use session::{receive_stream_to_stream, PtpSession, ReceiveStream};
70pub use types::{
71 AccessCapability, AssociationType, DeviceInfo, DevicePropDesc, FilesystemType, ObjectInfo,
72 PropertyFormType, PropertyRange, PropertyValue, ProtectionStatus, StorageInfo, StorageType,
73};
74
75#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
77pub struct ObjectHandle(pub u32);
78
79impl ObjectHandle {
80 pub const ROOT: Self = ObjectHandle(0x00000000);
82 pub const ALL: Self = ObjectHandle(0xFFFFFFFF);
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
88pub struct StorageId(pub u32);
89
90impl StorageId {
91 pub const ALL: Self = StorageId(0xFFFFFFFF);
93}
94
95#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
97pub struct SessionId(pub u32);
98
99#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
101pub struct TransactionId(pub u32);
102
103impl TransactionId {
104 pub const FIRST: Self = TransactionId(0x00000001);
106
107 pub const INVALID: Self = TransactionId(0xFFFFFFFF);
109
110 pub const SESSION_LESS: Self = TransactionId(0x00000000);
112
113 #[must_use]
117 pub fn next(self) -> Self {
118 let next = self.0.wrapping_add(1);
119 if next == 0 || next == 0xFFFFFFFF {
120 TransactionId(0x00000001)
121 } else {
122 TransactionId(next)
123 }
124 }
125}
126
127#[cfg(test)]
128mod tests {
129 use super::*;
130
131 #[test]
132 fn transaction_id_next() {
133 assert_eq!(TransactionId(1).next(), TransactionId(2));
134 assert_eq!(TransactionId(100).next(), TransactionId(101));
135 }
136
137 #[test]
138 fn transaction_id_wrapping() {
139 assert_eq!(TransactionId(0xFFFFFFFE).next(), TransactionId(1));
141 assert_eq!(TransactionId(0xFFFFFFFD).next(), TransactionId(0xFFFFFFFE));
142 }
143
144 #[test]
145 fn object_handle_constants() {
146 assert_eq!(ObjectHandle::ROOT.0, 0);
147 assert_eq!(ObjectHandle::ALL.0, 0xFFFFFFFF);
148 }
149
150 #[test]
151 fn storage_id_constants() {
152 assert_eq!(StorageId::ALL.0, 0xFFFFFFFF);
153 }
154}