libobs_wrapper\bootstrap/
version.rs1use 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 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}