Implement ideviceinfo in cpp

This commit is contained in:
Jackson Coxson
2025-08-14 18:07:56 -06:00
parent f152f18f8e
commit c607909beb
5 changed files with 55 additions and 2 deletions

View File

@@ -15,16 +15,19 @@ int main() {
if (!u) { if (!u) {
std::cerr << "failed to connect to usbmuxd"; std::cerr << "failed to connect to usbmuxd";
std::cerr << e.message; std::cerr << e.message;
return 1;
} }
auto devices = u->get_devices(e); auto devices = u->get_devices(e);
if (!devices) { if (!devices) {
std::cerr << "failed to get devices from usbmuxd"; std::cerr << "failed to get devices from usbmuxd";
std::cerr << e.message; std::cerr << e.message;
return 1;
} }
if (devices->empty()) { if (devices->empty()) {
std::cerr << "no devices connected"; std::cerr << "no devices connected";
std::cerr << e.message; std::cerr << e.message;
return 1;
} }
auto& dev = (*devices)[0]; auto& dev = (*devices)[0];
@@ -55,7 +58,14 @@ int main() {
return 1; return 1;
} }
auto values = client->get_value("", "", e); auto pf = prov->get_pairing_file(e);
if (!pf) {
std::cerr << "failed to get pairing file: " << e.message << "\n";
return 1;
}
client->start_session(*pf, e);
auto values = client->get_value(NULL, NULL, e);
if (!values) { if (!values) {
std::cerr << "get values failed: " << e.message << "\n"; std::cerr << "get values failed: " << e.message << "\n";
return 1; return 1;

View File

@@ -37,6 +37,8 @@ class Provider {
Provider(const Provider&) = delete; Provider(const Provider&) = delete;
Provider& operator=(const Provider&) = delete; Provider& operator=(const Provider&) = delete;
std::optional<PairingFile> get_pairing_file(FfiError& err);
IdeviceProviderHandle* raw() const noexcept { return handle_.get(); } IdeviceProviderHandle* raw() const noexcept { return handle_.get(); }
static Provider adopt(IdeviceProviderHandle* h) noexcept { return Provider(h); } static Provider adopt(IdeviceProviderHandle* h) noexcept { return Provider(h); }
IdeviceProviderHandle* release() noexcept { return handle_.release(); } IdeviceProviderHandle* release() noexcept { return handle_.release(); }

View File

@@ -49,4 +49,15 @@ std::optional<Provider> Provider::usbmuxd_new(UsbmuxdAddr&& addr,
return Provider::adopt(out); return Provider::adopt(out);
} }
std::optional<PairingFile> Provider::get_pairing_file(FfiError& err) {
IdevicePairingFile* out = nullptr;
if (IdeviceFfiError* e = idevice_provider_get_pairing_file(handle_.get(), &out)) {
err = FfiError(e);
return std::nullopt;
}
return PairingFile(out);
}
} // namespace IdeviceFFI } // namespace IdeviceFFI

View File

@@ -179,7 +179,7 @@ pub unsafe extern "C" fn lockdownd_get_value(
domain: *const libc::c_char, domain: *const libc::c_char,
out_plist: *mut plist_t, out_plist: *mut plist_t,
) -> *mut IdeviceFfiError { ) -> *mut IdeviceFfiError {
if key.is_null() || out_plist.is_null() { if out_plist.is_null() {
return ffi_err!(IdeviceError::FfiInvalidArg); return ffi_err!(IdeviceError::FfiInvalidArg);
} }

View File

@@ -7,6 +7,7 @@ use std::{ffi::CStr, ptr::null_mut};
use crate::util::{SockAddr, idevice_sockaddr}; use crate::util::{SockAddr, idevice_sockaddr};
use crate::{IdeviceFfiError, ffi_err, usbmuxd::UsbmuxdAddrHandle, util}; use crate::{IdeviceFfiError, ffi_err, usbmuxd::UsbmuxdAddrHandle, util};
use crate::{IdevicePairingFile, RUNTIME};
pub struct IdeviceProviderHandle(pub Box<dyn IdeviceProvider>); pub struct IdeviceProviderHandle(pub Box<dyn IdeviceProvider>);
@@ -136,3 +137,32 @@ pub unsafe extern "C" fn usbmuxd_provider_new(
null_mut() null_mut()
} }
/// Gets the pairing file for the device
///
/// # Arguments
/// * [`provider`] - A pointer to the provider
/// * [`pairing_file`] - A pointer to the newly allocated pairing file
///
/// # Returns
/// An IdeviceFfiError on error, null on success
///
/// # Safety
/// `provider` must be a valid, non-null pointer to the provider
#[unsafe(no_mangle)]
pub unsafe extern "C" fn idevice_provider_get_pairing_file(
provider: *mut IdeviceProviderHandle,
pairing_file: *mut *mut IdevicePairingFile,
) -> *mut IdeviceFfiError {
let provider = unsafe { &mut *provider };
let res = RUNTIME.block_on(async move { provider.0.get_pairing_file().await });
match res {
Ok(pf) => {
let pf = Box::new(IdevicePairingFile(pf));
unsafe { *pairing_file = Box::into_raw(pf) };
null_mut()
}
Err(e) => ffi_err!(e),
}
}