descriptor
This commit is contained in:
parent
9f5c2fcabb
commit
62ee11ec19
79
src/main.rs
79
src/main.rs
|
@ -51,7 +51,7 @@ impl Context {
|
||||||
Ok((Context {}, Version(version_code)))
|
Ok((Context {}, Version(version_code)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn devices(&self, only_local: bool) -> Result<impl Iterator<Item = Device>, Error> {
|
fn devices(&self, only_local: bool) -> Result<impl ExactSizeIterator<Item = Device>, Error> {
|
||||||
let mut device_list: *mut *const SANE_Device = std::ptr::null_mut();
|
let mut device_list: *mut *const SANE_Device = std::ptr::null_mut();
|
||||||
unsafe {
|
unsafe {
|
||||||
checked(|| sane_get_devices(&mut device_list, only_local as _))?;
|
checked(|| sane_get_devices(&mut device_list, only_local as _))?;
|
||||||
|
@ -65,7 +65,6 @@ impl Context {
|
||||||
num_devices += 1;
|
num_devices += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
println!("{}", num_devices);
|
|
||||||
|
|
||||||
Ok((0..num_devices).map(move |i| {
|
Ok((0..num_devices).map(move |i| {
|
||||||
let device = unsafe { *device_list.offset(i) };
|
let device = unsafe { *device_list.offset(i) };
|
||||||
|
@ -73,6 +72,11 @@ impl Context {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
impl Drop for Context {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe { sane_exit() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct Device(*const SANE_Device);
|
struct Device(*const SANE_Device);
|
||||||
|
|
||||||
|
@ -93,11 +97,65 @@ impl Device {
|
||||||
let cstr = unsafe { CStr::from_ptr((*self.0).type_) };
|
let cstr = unsafe { CStr::from_ptr((*self.0).type_) };
|
||||||
cstr.to_str().unwrap()
|
cstr.to_str().unwrap()
|
||||||
}
|
}
|
||||||
|
fn open(&self) -> Result<Handle, Error> {
|
||||||
|
let mut handle = std::ptr::null_mut();
|
||||||
|
unsafe { checked(|| sane_open((*self.0).name, &mut handle))? };
|
||||||
|
|
||||||
|
Ok(Handle(handle))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Context {
|
struct Handle(SANE_Handle);
|
||||||
|
|
||||||
|
impl Drop for Handle {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
unsafe { sane_exit() }
|
unsafe { sane_close(self.0) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Handle {
|
||||||
|
fn descriptors(&self) -> impl ExactSizeIterator<Item = Descriptor> + '_ {
|
||||||
|
// Guaranteed to exist
|
||||||
|
let first_desc = self.get_descriptor(0).unwrap();
|
||||||
|
assert_eq!(first_desc.type_(), SANE_Value_Type_SANE_TYPE_INT);
|
||||||
|
assert_eq!(first_desc.size(), std::mem::size_of::<SANE_Int>() as _);
|
||||||
|
let mut num_desc: SANE_Int = 0;
|
||||||
|
unsafe {
|
||||||
|
checked(|| {
|
||||||
|
sane_control_option(
|
||||||
|
self.0,
|
||||||
|
0,
|
||||||
|
SANE_Action_SANE_ACTION_GET_VALUE,
|
||||||
|
&mut num_desc as *mut _ as _,
|
||||||
|
std::ptr::null_mut(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unwrap()
|
||||||
|
};
|
||||||
|
(0..num_desc).map(move |i| self.get_descriptor(i as _).unwrap())
|
||||||
|
}
|
||||||
|
fn get_descriptor(&self, index: usize) -> Option<Descriptor> {
|
||||||
|
let desc = unsafe { sane_get_option_descriptor(self.0, index as _) };
|
||||||
|
if desc.is_null() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(Descriptor(desc))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Descriptor(*const SANE_Option_Descriptor);
|
||||||
|
|
||||||
|
impl Descriptor {
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
let cstr = unsafe { CStr::from_ptr((*self.0).name) };
|
||||||
|
cstr.to_str().unwrap()
|
||||||
|
}
|
||||||
|
fn type_(&self) -> SANE_Value_Type {
|
||||||
|
unsafe { (*self.0).type_ }
|
||||||
|
}
|
||||||
|
fn size(&self) -> SANE_Int {
|
||||||
|
unsafe { (*self.0).size }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,11 +183,22 @@ fn main() {
|
||||||
version.minor(),
|
version.minor(),
|
||||||
version.build()
|
version.build()
|
||||||
);
|
);
|
||||||
|
let mut chosen_device = None;
|
||||||
for device in context.devices(true).unwrap() {
|
for device in context.devices(true).unwrap() {
|
||||||
println!("Device:");
|
println!("Device:");
|
||||||
println!("\tname: {}", device.name());
|
let name = device.name();
|
||||||
|
println!("\tname: {}", name);
|
||||||
println!("\tvendor: {}", device.vendor());
|
println!("\tvendor: {}", device.vendor());
|
||||||
println!("\tmodel: {}", device.model());
|
println!("\tmodel: {}", device.model());
|
||||||
println!("\ttype: {}", device.type_());
|
println!("\ttype: {}", device.type_());
|
||||||
|
chosen_device = Some(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
let device = chosen_device.unwrap();
|
||||||
|
let handle = device.open().unwrap();
|
||||||
|
|
||||||
|
println!("Options:");
|
||||||
|
for descriptor in handle.descriptors() {
|
||||||
|
println!("\t{}", descriptor.name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue