mirror of
https://github.com/jkcoxson/idevice.git
synced 2026-03-02 06:26:15 +01:00
Implement ideviceinfo in cpp
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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(); }
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user