libobs_wrapper\bootstrap/
version.rs

1use std::path::Path;
2
3use libloading::Library;
4use libobs::{LIBOBS_API_MAJOR_VER, LIBOBS_API_MINOR_VER, LIBOBS_API_PATCH_VER};
5
6pub type GetVersionFunc = unsafe extern "C" fn() -> *const ::std::os::raw::c_char;
7
8pub fn get_installed_version(obs_dll: &Path) -> anyhow::Result<Option<String>> {
9    // The obs.dll should always exist
10    let dll_exists = obs_dll.exists() && obs_dll.is_file();
11    if !dll_exists {
12        log::trace!("obs.dll does not exist at {}", obs_dll.display());
13        return Ok(None);
14    }
15
16    log::trace!("Getting obs.dll version string");
17    unsafe {
18        let lib = Library::new(obs_dll)?;
19        let get_version: libloading::Symbol<GetVersionFunc> = lib.get(b"obs_get_version_string")?;
20        let version = get_version();
21
22        if version.is_null() {
23            lib.close()?;
24            log::trace!("obs.dll does not have a version string");
25            return Ok(None);
26        }
27
28        let version_str = std::ffi::CStr::from_ptr(version).to_str();
29        if version_str.is_err() {
30            lib.close()?;
31            log::trace!(
32                "obs.dll version string is not valid UTF-8: {}",
33                version_str.err().unwrap()
34            );
35            return Ok(None);
36        }
37
38        lib.close()?;
39        return Ok(Some(version_str.unwrap().to_string()));
40    }
41}
42
43pub fn should_update(version_str: &str) -> anyhow::Result<bool> {
44    let version = version_str.split('.').collect::<Vec<_>>();
45    if version.len() != 3 {
46        anyhow::bail!("Invalid version string: {}", version_str);
47    }
48    let major = version[0].parse::<u64>();
49    let minor = version[1].parse::<u64>();
50    let patch = version[2].parse::<u64>();
51
52    if major.is_err() || minor.is_err() || patch.is_err() {
53        anyhow::bail!("Invalid version string: {}", version_str);
54    }
55
56    let major = major.unwrap();
57    let minor = minor.unwrap();
58    let patch = patch.unwrap();
59
60    return Ok(major != LIBOBS_API_MAJOR_VER as u64
61        || minor != LIBOBS_API_MINOR_VER as u64
62        || patch < LIBOBS_API_PATCH_VER as u64);
63}