libmtp-rs 0.7.7

High-level interface for the libmtp C library.
Documentation
macro_rules! cstr_to_u8vec {
    ($ptr:expr) => {{
        let mut u8_vec = Vec::new();

        let mut offset = 0;
        let mut ch = *$ptr.offset(offset);
        while ch as u8 != 0x0 {
            u8_vec.push(ch as u8);
            offset += 1;
            ch = *$ptr.offset(offset);
        }

        u8_vec
    }};
}

macro_rules! prim_array_ptr_to_vec {
    ($ptr:expr, $to:ty, $len:expr) => {{
        let mut vec = Vec::new();

        for offset in 0..($len as isize) {
            let item = *$ptr.offset(offset);
            vec.push(item as $to);
        }

        vec
    }};
}

macro_rules! path_to_cvec {
    ($path:expr) => {{
        let mut buf = Vec::new();

        cfg_if::cfg_if! {
            if #[cfg(windows)] {
                use std::iter::once;
                use std::os::windows::ffi::OsStrExt;

                buf.extend($path.as_os_str()
                    .encode_wide()
                    .chain(once(0))
                    .flat_map(|b| {
                        let b = b.to_ne_bytes();
                        once(b[0]).chain(once(b[1]))
                    }));
            } else {
                use std::os::unix::ffi::OsStrExt;

                buf.extend($path.as_os_str().as_bytes());
                buf.push(0);
            }
        }

        buf
    }};
}

macro_rules! fill_file_t {
    ($filemetadata:expr, $parent:expr, $storage:expr, $file:ident) => {{
        use num_traits::ToPrimitive;
        use std::ffi::CString;

        let file_t = $file;
        let metadata = $filemetadata;

        (*file_t).parent_id = $parent;
        (*file_t).storage_id = $storage;
        (*file_t).filesize = metadata.file_size;
        (*file_t).filetype = metadata
            .file_type
            .to_u32()
            .expect("Unexpected variant in Filetype");
        (*file_t).modificationdate = metadata.modification_date.timestamp() as libc::time_t;

        let filename = CString::new(metadata.file_name).unwrap();
        (*file_t).filename = libc::strdup(filename.as_c_str().as_ptr());
    }};
}