diff --git a/Cargo.lock b/Cargo.lock index 65b6a81..e031942 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -237,6 +237,7 @@ name = "fujicli" version = "0.1.0" dependencies = [ "anyhow", + "byteorder", "clap", "libptp", "log", diff --git a/Cargo.toml b/Cargo.toml index 9f56185..b8e8bd3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ codegen-units = 1 [dependencies] anyhow = "1.0.100" +byteorder = "1.5.0" clap = { version = "4.5.48", features = ["derive", "wrap_help"] } libptp = "0.6.5" log = "0.4.28" diff --git a/src/hardware/mod.rs b/src/hardware/mod.rs index 1543df5..1b8d16d 100644 --- a/src/hardware/mod.rs +++ b/src/hardware/mod.rs @@ -1,10 +1,12 @@ use std::{ fmt, + io::Cursor, ops::{Deref, DerefMut}, time::Duration, }; use anyhow::bail; +use byteorder::{LittleEndian, WriteBytesExt}; use libptp::{DeviceInfo, StandardCommandCode}; use log::{debug, error}; use rusb::{DeviceDescriptor, GlobalContext}; @@ -280,29 +282,18 @@ pub trait CameraImpl { debug!("Preparing ObjectInfo header for backup"); let mut obj_info = vec![0u8; 1088]; - let mut offset = 0; - let padding0: u32 = 0x0; - let object_format: u16 = 0x5000; - let padding1: u16 = 0x0; - - obj_info[offset..offset + size_of::()].copy_from_slice(&padding0.to_le_bytes()); - offset += size_of::(); - obj_info[offset..offset + size_of::()].copy_from_slice(&object_format.to_le_bytes()); - offset += size_of::(); - obj_info[offset..offset + size_of::()].copy_from_slice(&padding1.to_le_bytes()); - offset += size_of::(); - obj_info[offset..offset + size_of::()] - .copy_from_slice(&u32::try_from(buffer.len())?.to_le_bytes()); - - let param0: u32 = 0x0; - let param1: u32 = 0x0; + let mut cursor = Cursor::new(&mut obj_info[..]); + cursor.write_u32::(0x0)?; + cursor.write_u16::(0x5000)?; + cursor.write_u16::(0x0)?; + cursor.write_u32::(u32::try_from(buffer.len())?)?; debug!("Sending ObjectInfo for backup"); ptp.command( libptp::StandardCommandCode::SendObjectInfo, - &[param0, param1], + &[0x0, 0x0], Some(&obj_info), Some(TIMEOUT), )?;