eusb 0.4.2

Rust library for accessing USB devices.
Documentation
use std::ptr::null_mut;
use libusb_src::*;
use crate::define::{DeviceClass};
use crate::error::*;

#[derive(Copy, Clone)]
pub(crate) struct Context(pub(crate) *mut libusb_context);
unsafe impl Send for Context{}
unsafe impl Sync for Context{}


impl Context {
    pub(crate) fn new() ->Self{
        Self(null_mut())
    }

    pub(crate) fn init(&mut self) ->Result<()>{
        unsafe {
            let r = libusb_init(&mut self.0);
            check_err(r)?;
        }
        Ok(())
    }
}



#[derive(Copy, Clone)]
pub(crate) struct DeviceHandle(pub(crate) *mut libusb_device_handle);
unsafe impl Send for DeviceHandle{}
unsafe impl Sync for DeviceHandle{}

impl DeviceHandle {
    pub(crate) fn is_null(&self)->bool{ self.0.is_null() }
}



pub(crate) struct ConfigDescriptorPtr{
    pub(crate) config: *const libusb_config_descriptor
}



impl ConfigDescriptorPtr{
    pub(crate) fn new(dev: *const libusb_device, index: u8)->Result<Self>{
        unsafe {
            let mut config_ptr: *const  libusb_config_descriptor = null_mut();
            let r = libusb_get_config_descriptor(dev, index, &mut config_ptr);
            check_err(r)?;
            Ok( Self{config: config_ptr})
        }
    }
}

impl From<*const libusb_config_descriptor> for ConfigDescriptorPtr{
    fn from(value: *const libusb_config_descriptor) -> Self {
        Self{config: value}
    }
}

impl Drop for ConfigDescriptorPtr{
    fn drop(&mut self) {
        unsafe {
            libusb_free_config_descriptor(self.config);
        }
    }
}

pub(crate) fn class_from_lib(class: u8)->DeviceClass{
    match class {
        LIBUSB_CLASS_PER_INTERFACE=> DeviceClass::PerInterface,
        LIBUSB_CLASS_AUDIO => DeviceClass::Audio,
        LIBUSB_CLASS_COMM => DeviceClass::Comm,
        LIBUSB_CLASS_HID => DeviceClass::Hid,
        LIBUSB_CLASS_PHYSICAL => DeviceClass::Physical,
        LIBUSB_CLASS_PRINTER => DeviceClass::Printer,
        LIBUSB_CLASS_IMAGE => DeviceClass::Image,
        LIBUSB_CLASS_MASS_STORAGE => DeviceClass::MassStorage,
        LIBUSB_CLASS_HUB => DeviceClass::Hub,
        LIBUSB_CLASS_DATA => DeviceClass::Data,
        LIBUSB_CLASS_SMART_CARD => DeviceClass::SmartCard,
        LIBUSB_CLASS_CONTENT_SECURITY => DeviceClass::ContentSecurity,
        LIBUSB_CLASS_VIDEO => DeviceClass::Video,
        LIBUSB_CLASS_PERSONAL_HEALTHCARE => DeviceClass::PersonalHealthcare,
        LIBUSB_CLASS_DIAGNOSTIC_DEVICE => DeviceClass::DiagnosticDevice,
        LIBUSB_CLASS_WIRELESS => DeviceClass::Wireless,
        LIBUSB_CLASS_APPLICATION => DeviceClass::Application,
        LIBUSB_CLASS_VENDOR_SPEC => DeviceClass::VendorSpec,
        _ => panic!("Unknown class: {}", class)
    }
}