pub(crate) mod callbacks;
pub(crate) mod calls;
pub(crate) mod packages;
use crate::{
jab,
jab::jab_lib::{
callbacks::{
AccessBridgeCaretUpdateFp, AccessBridgeFocusGainedFp, AccessBridgeFocusLostFp,
AccessBridgeJavaShutdownFp, AccessBridgeMenuCanceledFp, AccessBridgeMenuDeselectedFp,
AccessBridgeMenuSelectedFp, AccessBridgeMouseClickedFp, AccessBridgeMouseEnteredFp,
AccessBridgeMouseExitedFp, AccessBridgeMousePressedFp, AccessBridgeMouseReleasedFp,
AccessBridgePopupMenuCanceledFp, AccessBridgePopupMenuWillBecomeInvisibleFp,
AccessBridgePopupMenuWillBecomeVisibleFp, AccessBridgePropertyActiveDescendentChangeFp,
AccessBridgePropertyCaretChangeFp, AccessBridgePropertyChangeFp,
AccessBridgePropertyChildChangeFp, AccessBridgePropertyDescriptionChangeFp,
AccessBridgePropertyNameChangeFp, AccessBridgePropertySelectionChangeFp,
AccessBridgePropertyStateChangeFp, AccessBridgePropertyTableModelChangeFp,
AccessBridgePropertyTextChangeFp, AccessBridgePropertyValueChangeFp,
AccessBridgePropertyVisibleDataChangeFp,
},
packages::{
AccessBridgeVersionInfo, AccessibleActions, AccessibleActionsToDo, AccessibleContext,
AccessibleContextInfo, AccessibleHyperlink, AccessibleHypertext,
AccessibleHypertextInfo, AccessibleIcons, AccessibleKeyBindings,
AccessibleRelationSetInfo, AccessibleSelection, AccessibleTable,
AccessibleTableCellInfo, AccessibleTableInfo, AccessibleText,
AccessibleTextAttributesInfo, AccessibleTextInfo, AccessibleTextItemsInfo,
AccessibleTextRectInfo, AccessibleTextSelectionInfo, AccessibleValue, JInt, JObject,
JObject64, JavaObject, VisibleChildrenInfo, BOOL,
},
},
};
use rigela_utils::{call_proc, common::SafeModuleHandle};
use std::{
env::var,
path::{Path, PathBuf},
};
use win_wrap::common::{free_library, get_proc_address, load_library, Result, FARPROC, HWND};
use windows::{
core::{Error, HSTRING},
Win32::Foundation::S_FALSE,
};
#[allow(unused)]
#[derive(Debug)]
pub(crate) struct JabLib {
h_module: SafeModuleHandle,
}
#[allow(dead_code)]
impl JabLib {
pub(crate) fn new(path: Option<PathBuf>) -> Result<Self> {
#[cfg(target_arch = "x86_64")]
const DLL_NAME: &str = "windowsaccessbridge-64.dll";
#[cfg(target_arch = "x86")]
const DLL_NAME: &str = "windowsaccessbridge-32.dll";
let lib = match path {
None => match var("JAVA_HOME") {
Ok(s) => Path::new(&s).join("bin").join(DLL_NAME),
Err(e) => {
return Err(Error::new(
S_FALSE,
&format!("Can't find the jab library. ({})", e),
));
}
},
Some(p) => p.to_path_buf(),
};
let h_module = match load_library(lib.to_str().unwrap()) {
Ok(h) => SafeModuleHandle::new(h),
Err(e) => return Err(e),
};
let res = jab!(*h_module, windows_run);
if res.is_none() {
return Err(Error::new(S_FALSE, "Can't load the jab library."));
}
Ok(Self { h_module })
}
pub(crate) fn is_java_window(&self, h_wnd: HWND) -> bool {
jab!(*self.h_module, is_java_window, h_wnd).unwrap_or(0) != 0
}
pub(crate) fn get_accessible_context_from_hwnd(
&self,
target: HWND,
) -> Option<(i32, AccessibleContext)> {
let (mut context, mut vm_id) = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_context_from_hwnd,
target,
&mut vm_id,
&mut context
)
.unwrap_or(0)
== 0
{
return None;
}
Some((vm_id, context))
}
pub(crate) fn get_hwnd_from_accessible_context(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> HWND {
jab!(*self.h_module, get_hwnd__from_accessible_context, vm_id, ac)
.unwrap_or(HWND::default())
}
pub(crate) fn release_java_object(&self, vm_id: i32, object: JavaObject) {
jab!(*self.h_module, release_java_object, vm_id, object);
}
pub(crate) fn get_version_info(&self, vm_id: i32) -> Option<AccessBridgeVersionInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(*self.h_module, get_version_info, vm_id, &mut info).unwrap_or(0) == 0 {
return None;
}
Some(info)
}
pub(crate) fn get_accessible_context_at(
&self,
vm_id: i32,
parent: AccessibleContext,
x: JInt,
y: JInt,
) -> Option<AccessibleContext> {
let mut ac = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_context_at,
vm_id,
parent,
x,
y,
&mut ac
)
.unwrap_or(0)
== 0
{
return None;
}
Some(ac)
}
pub(crate) fn get_accessible_context_with_focus(
&self,
window: HWND,
) -> Option<(i32, AccessibleContext)> {
let (mut vm_id, mut ac) = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_context_with_focus,
window,
&mut vm_id,
&mut ac
)
.unwrap_or(0)
== 0
{
return None;
}
Some((vm_id, ac))
}
pub(crate) fn get_accessible_context_info(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleContextInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_context_info,
vm_id,
ac,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_child_from_context(
&self,
vm_id: i32,
ac: AccessibleContext,
index: JInt,
) -> Option<AccessibleContext> {
jab!(
*self.h_module,
get_accessible_child_from_context,
vm_id,
ac,
index
)
}
pub(crate) fn get_accessible_parent_from_context(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleContext> {
jab!(
*self.h_module,
get_accessible_parent_from_context,
vm_id,
ac
)
}
pub(crate) fn is_same_object(&self, vm_id: i32, obj1: JObject64, obj2: JObject64) -> bool {
jab!(*self.h_module, is_same_object, vm_id, obj1, obj2).unwrap_or(0) != 0
}
pub(crate) fn get_parent_with_role(
&self,
vm_id: i32,
ac: AccessibleContext,
role: &str,
) -> Option<AccessibleContext> {
jab!(
*self.h_module,
get_parent_with_role,
vm_id,
ac,
HSTRING::from(role).as_ptr()
)
}
pub(crate) fn get_parent_with_role_else_root(
&self,
vm_id: i32,
ac: AccessibleContext,
role: &str,
) -> Option<AccessibleContext> {
jab!(
*self.h_module,
get_parent_with_role_else_root,
vm_id,
ac,
HSTRING::from(role).as_ptr()
)
}
pub(crate) fn get_top_level_object(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleContext> {
jab!(*self.h_module, get_top_level_object, vm_id, ac)
}
pub(crate) fn get_object_depth(&self, vm_id: i32, ac: AccessibleContext) -> i32 {
jab!(*self.h_module, get_object_depth, vm_id, ac).unwrap_or(-1)
}
pub(crate) fn get_active_descendent(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleContext> {
jab!(*self.h_module, get_active_descendent, vm_id, ac)
}
pub(crate) fn request_focus(&self, vm_id: i32, ac: AccessibleContext) -> bool {
jab!(*self.h_module, request_focus, vm_id, ac).unwrap_or(0) != 0
}
pub(crate) fn get_visible_children_count(&self, vm_id: i32, ac: AccessibleContext) -> i32 {
jab!(*self.h_module, get_visible_children_count, vm_id, ac).unwrap_or(-1)
}
pub(crate) fn get_visible_children(
&self,
vm_id: i32,
ac: AccessibleContext,
start_index: i32,
) -> Option<VisibleChildrenInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_visible_children,
vm_id,
ac,
start_index,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_events_waiting(&self) -> i32 {
jab!(*self.h_module, get_events_waiting).unwrap_or(0)
}
pub(crate) fn get_accessible_actions(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleActions> {
let mut actions = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_actions,
vm_id,
ac,
&mut actions
)
.unwrap_or(0)
== 0
{
return None;
}
Some(actions)
}
pub(crate) fn get_caret_location(
&self,
vm_id: i32,
ac: AccessibleContext,
index: JInt,
) -> Option<AccessibleTextRectInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_caret_location,
vm_id,
ac,
&mut info,
index
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn set_caret_position(
&self,
vm_id: i32,
ac: AccessibleContext,
position: i32,
) -> bool {
jab!(*self.h_module, set_caret_position, vm_id, ac, position).unwrap_or(0) != 0
}
pub(crate) fn get_text_attributes_in_range(
&self,
vm_id: i32,
ac: AccessibleContext,
start_index: i32,
end_index: i32,
) -> Option<(AccessibleTextAttributesInfo, i16)> {
let (mut info, mut len) = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_text_attributes_in_range,
vm_id,
ac,
start_index,
end_index,
&mut info,
&mut len
)
.unwrap_or(0)
== 0
{
return None;
}
Some((info, len))
}
pub(crate) fn get_accessible_relation_set(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleRelationSetInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_relation_set,
vm_id,
ac,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_key_bindings(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleKeyBindings> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_key_bindings,
vm_id,
ac,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_icons(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleIcons> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(*self.h_module, get_accessible_icons, vm_id, ac, &mut info).unwrap_or(0) == 0 {
return None;
}
Some(info)
}
pub(crate) fn get_accessible_table_row_header(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleTableInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_table_row_header,
vm_id,
ac,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_table_column_header(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleTableInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_table_column_header,
vm_id,
ac,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_table_column_description(
&self,
vm_id: i32,
ac: AccessibleContext,
column: JInt,
) -> Option<AccessibleContext> {
jab!(
*self.h_module,
get_accessible_table_column_description,
vm_id,
ac,
column
)
}
pub(crate) fn get_accessible_table_row_description(
&self,
vm_id: i32,
ac: AccessibleContext,
row: JInt,
) -> Option<AccessibleContext> {
jab!(
*self.h_module,
get_accessible_table_row_description,
vm_id,
ac,
row
)
}
pub(crate) fn select_text_range(
&self,
vm_id: i32,
ac: AccessibleContext,
start_index: JInt,
end_index: JInt,
) -> bool {
jab!(
*self.h_module,
select_text_range,
vm_id,
ac,
start_index,
end_index
)
.unwrap_or(0)
!= 0
}
pub(crate) fn get_accessible_table_info(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleTableInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_table_info,
vm_id,
ac,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_virtual_accessible_name(
&self,
vm_id: i32,
ac: AccessibleContext,
len: i32,
) -> Option<Vec<u16>> {
let mut name = Vec::new();
for _ in 0..len {
name.push(0);
}
if jab!(
*self.h_module,
get_virtual_accessible_name,
vm_id,
ac,
name.as_mut_ptr(),
len
)
.unwrap_or(0)
== 0
{
return None;
}
Some(name)
}
pub(crate) fn get_accessible_hypertext(
&self,
vm_id: i32,
ac: AccessibleContext,
) -> Option<AccessibleHypertextInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_hypertext,
vm_id,
ac,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_hypertext_ext(
&self,
vm_id: i32,
ac: AccessibleContext,
start_index: JInt,
) -> Option<AccessibleHypertextInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_hypertext_ext,
vm_id,
ac,
start_index,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn do_accessible_actions(
&self,
vm_id: i32,
ac: AccessibleContext,
actions_to_do: *const AccessibleActionsToDo,
) -> (bool, JInt) {
let mut failure = unsafe { std::mem::zeroed() };
(
jab!(
*self.h_module,
do_accessible_actions,
vm_id,
ac,
actions_to_do,
&mut failure
)
.unwrap_or(0)
!= 0,
failure,
)
}
pub(crate) fn set_text_contents(
&self,
vm_id: i32,
ac: AccessibleContext,
text: *const u16,
) -> bool {
jab!(*self.h_module, set_text_contents, vm_id, ac, text).unwrap_or(0) != 0
}
pub(crate) fn set_caret_update_fp(&self, cb: AccessBridgeCaretUpdateFp) {
jab!(*self.h_module, set_caret_update_fp, cb).unwrap_or(())
}
pub(crate) fn set_focus_gained_fp(&self, cb: AccessBridgeFocusGainedFp) {
jab!(*self.h_module, set_focus_gained_fp, cb).unwrap_or(())
}
pub(crate) fn set_focus_lost_fp(&self, cb: AccessBridgeFocusLostFp) {
jab!(*self.h_module, set_focus_lost_fp, cb).unwrap_or(())
}
pub(crate) fn set_java_shutdown_fp(&self, cb: AccessBridgeJavaShutdownFp) {
jab!(*self.h_module, set_java_shutdown_fp, cb).unwrap_or(())
}
pub(crate) fn set_menu_canceled_fp(&self, cb: AccessBridgeMenuCanceledFp) {
jab!(*self.h_module, set_menu_canceled_fp, cb).unwrap_or(())
}
pub(crate) fn set_menu_deselected_fp(&self, cb: AccessBridgeMenuDeselectedFp) {
jab!(*self.h_module, set_menu_deselected_fp, cb).unwrap_or(())
}
pub(crate) fn set_menu_selected_fp(&self, cb: AccessBridgeMenuSelectedFp) {
jab!(*self.h_module, set_menu_selected_fp, cb).unwrap_or(())
}
pub(crate) fn set_mouse_clicked_fp(&self, cb: AccessBridgeMouseClickedFp) {
jab!(*self.h_module, set_mouse_clicked_fp, cb).unwrap_or(())
}
pub(crate) fn set_mouse_entered_fp(&self, cb: AccessBridgeMouseEnteredFp) {
jab!(*self.h_module, set_mouse_entered_fp, cb).unwrap_or(())
}
pub(crate) fn set_mouse_exited_fp(&self, cb: AccessBridgeMouseExitedFp) {
jab!(*self.h_module, set_mouse_exited_fp, cb).unwrap_or(())
}
pub(crate) fn set_mouse_pressed_fp(&self, cb: AccessBridgeMousePressedFp) {
jab!(*self.h_module, set_mouse_pressed_fp, cb).unwrap_or(())
}
pub(crate) fn set_mouse_released_fp(&self, cb: AccessBridgeMouseReleasedFp) {
jab!(*self.h_module, set_mouse_released_fp, cb).unwrap_or(())
}
pub(crate) fn set_popup_menu_canceled_fp(&self, cb: AccessBridgePopupMenuCanceledFp) {
jab!(*self.h_module, set_popup_menu_canceled_fp, cb).unwrap_or(())
}
pub(crate) fn set_popup_menu_will_become_invisible_fp(
&self,
cb: AccessBridgePopupMenuWillBecomeInvisibleFp,
) {
jab!(*self.h_module, set_popup_menu_will_become_invisible_fp, cb).unwrap_or(())
}
pub(crate) fn set_popup_menu_will_become_visible_fp(
&self,
cb: AccessBridgePopupMenuWillBecomeVisibleFp,
) {
jab!(*self.h_module, set_popup_menu_will_become_visible_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_active_descendent_change_fp(
&self,
cb: AccessBridgePropertyActiveDescendentChangeFp,
) {
jab!(*self.h_module, set_property_active_descendent_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_caret_change_fp(&self, cb: AccessBridgePropertyCaretChangeFp) {
jab!(*self.h_module, set_property_caret_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_change_fp(&self, cb: AccessBridgePropertyChangeFp) {
jab!(*self.h_module, set_property_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_child_change_fp(&self, cb: AccessBridgePropertyChildChangeFp) {
jab!(*self.h_module, set_property_child_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_description_change_fp(
&self,
cb: AccessBridgePropertyDescriptionChangeFp,
) {
jab!(*self.h_module, set_property_description_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_name_change_fp(&self, cb: AccessBridgePropertyNameChangeFp) {
jab!(*self.h_module, set_property_name_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_selection_change_fp(
&self,
cb: AccessBridgePropertySelectionChangeFp,
) {
jab!(*self.h_module, set_property_selection_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_state_change_fp(&self, cb: AccessBridgePropertyStateChangeFp) {
jab!(*self.h_module, set_property_state_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_table_model_change_fp(
&self,
cb: AccessBridgePropertyTableModelChangeFp,
) {
jab!(*self.h_module, set_property_table_model_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_text_change_fp(&self, cb: AccessBridgePropertyTextChangeFp) {
jab!(*self.h_module, set_property_text_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_value_change_fp(&self, cb: AccessBridgePropertyValueChangeFp) {
jab!(*self.h_module, set_property_value_change_fp, cb).unwrap_or(())
}
pub(crate) fn set_property_visible_data_change_fp(
&self,
cb: AccessBridgePropertyVisibleDataChangeFp,
) {
jab!(*self.h_module, set_property_visible_data_change_fp, cb).unwrap_or(())
}
pub(crate) fn activate_accessible_hyperlink(
&self,
vm_id: i32,
ac: AccessibleContext,
link: AccessibleHyperlink,
) -> bool {
jab!(
*self.h_module,
activate_accessible_hyperlink,
vm_id,
ac,
link
)
.unwrap_or(0)
!= 0
}
pub(crate) fn add_accessible_selection_from_context(
&self,
vm_id: i32,
r#as: AccessibleSelection,
index: i32,
) {
jab!(
*self.h_module,
add_accessible_selection_from_context,
vm_id,
r#as,
index
)
.unwrap_or(())
}
pub(crate) fn remove_accessible_selection_from_context(
&self,
vm_id: i32,
r#as: AccessibleSelection,
index: i32,
) {
jab!(
*self.h_module,
remove_accessible_selection_from_context,
vm_id,
r#as,
index
)
.unwrap_or(())
}
pub(crate) fn clear_accessible_selection_from_context(
&self,
vm_id: i32,
r#as: AccessibleSelection,
) {
jab!(
*self.h_module,
clear_accessible_selection_from_context,
vm_id,
r#as
)
.unwrap_or(())
}
pub(crate) fn select_all_accessible_selection_from_context(
&self,
vm_id: i32,
r#as: AccessibleSelection,
) {
jab!(
*self.h_module,
select_all_accessible_selection_from_context,
vm_id,
r#as
)
.unwrap_or(())
}
pub(crate) fn get_accessible_hyperlink(
&self,
vm_id: i32,
ah: AccessibleContext,
index: JInt,
) -> Option<AccessibleHypertextInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_hyperlink,
vm_id,
ah,
index,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_hyperlink_count(
&self,
vm_id: i32,
ah: AccessibleHypertext,
) -> JInt {
jab!(*self.h_module, get_accessible_hyperlink_count, vm_id, ah).unwrap_or(-1)
}
pub(crate) fn get_accessible_hypertext_link_index(
&self,
vm_id: i32,
ah: AccessibleHypertext,
index: JInt,
) -> JInt {
jab!(
*self.h_module,
get_accessible_hypertext_link_index,
vm_id,
ah,
index
)
.unwrap_or(-1)
}
pub(crate) fn get_accessible_selection_count_from_context(
&self,
vm_id: i32,
r#as: AccessibleSelection,
) -> i32 {
jab!(
*self.h_module,
get_accessible_selection_count_from_context,
vm_id,
r#as
)
.unwrap_or(-1)
}
pub(crate) fn get_accessible_selection_from_context(
&self,
vm_id: i32,
r#as: AccessibleSelection,
index: i32,
) -> Option<JObject> {
jab!(
*self.h_module,
get_accessible_selection_from_context,
vm_id,
r#as,
index
)
}
pub(crate) fn is_accessible_child_selected_from_context(
&self,
vm_id: i32,
r#as: AccessibleSelection,
index: i32,
) -> bool {
jab!(
*self.h_module,
is_accessible_child_selected_from_context,
vm_id,
r#as,
index
)
.unwrap_or(0)
!= 0
}
pub(crate) fn is_accessible_table_row_selected(
&self,
vm_id: i32,
at: AccessibleTable,
row: JInt,
) -> bool {
jab!(
*self.h_module,
is_accessible_table_row_selected,
vm_id,
at,
row
)
.unwrap_or(0)
!= 0
}
pub(crate) fn is_accessible_table_column_selected(
&self,
vm_id: i32,
at: AccessibleTable,
column: JInt,
) -> bool {
jab!(
*self.h_module,
is_accessible_table_column_selected,
vm_id,
at,
column
)
.unwrap_or(0)
!= 0
}
pub(crate) fn get_accessible_table_cell_info(
&self,
vm_id: i32,
at: AccessibleTable,
row: JInt,
column: JInt,
) -> Option<AccessibleTableCellInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_table_cell_info,
vm_id,
at,
row,
column,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_table_column(
&self,
vm_id: i32,
at: AccessibleTable,
index: JInt,
) -> JInt {
jab!(
*self.h_module,
get_accessible_table_column,
vm_id,
at,
index
)
.unwrap_or(0)
}
pub(crate) fn get_accessible_table_row(
&self,
vm_id: i32,
at: AccessibleTable,
index: JInt,
) -> JInt {
jab!(*self.h_module, get_accessible_table_row, vm_id, at, index).unwrap_or(0)
}
pub(crate) fn get_accessible_table_column_selection_count(
&self,
vm_id: i32,
at: AccessibleTable,
) -> JInt {
jab!(
*self.h_module,
get_accessible_table_column_selection_count,
vm_id,
at
)
.unwrap_or(0)
}
pub(crate) fn get_accessible_table_row_selection_count(
&self,
vm_id: i32,
at: AccessibleTable,
) -> JInt {
jab!(
*self.h_module,
get_accessible_table_row_selection_count,
vm_id,
at
)
.unwrap_or(0)
}
pub(crate) fn get_accessible_table_index(
&self,
vm_id: i32,
at: AccessibleTable,
row: JInt,
column: JInt,
) -> JInt {
jab!(
*self.h_module,
get_accessible_table_index,
vm_id,
at,
row,
column
)
.unwrap_or(0)
}
pub(crate) fn get_accessible_table_column_selections(
&self,
vm_id: i32,
at: AccessibleTable,
count: JInt,
) -> Option<Vec<JInt>> {
let mut arr = Vec::new();
for _ in 0..count {
arr.push(0);
}
if jab!(
*self.h_module,
get_accessible_table_column_selections,
vm_id,
at,
count,
arr.as_mut_ptr()
)
.unwrap_or(0)
== 0
{
return None;
}
return Some(arr);
}
pub(crate) fn get_accessible_table_row_selections(
&self,
vm_id: i32,
at: AccessibleTable,
count: JInt,
) -> Option<Vec<JInt>> {
let mut arr = Vec::new();
for _ in 0..count {
arr.push(0);
}
if jab!(
*self.h_module,
get_accessible_table_row_selections,
vm_id,
at,
count,
arr.as_mut_ptr()
)
.unwrap_or(0)
== 0
{
return None;
}
return Some(arr);
}
pub(crate) fn get_accessible_text_selection_info(
&self,
vm_id: i32,
at: AccessibleText,
) -> Option<AccessibleTextSelectionInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_text_selection_info,
vm_id,
at,
&mut info
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_text_info(
&self,
vm_id: i32,
at: AccessibleText,
x: JInt,
y: JInt,
) -> Option<AccessibleTextInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_text_info,
vm_id,
at,
&mut info,
x,
y
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_text_attributes(
&self,
vm_id: i32,
at: AccessibleText,
index: JInt,
) -> (*const u8, AccessibleTextAttributesInfo) {
let mut info = unsafe { std::mem::zeroed() };
let char = jab!(
*self.h_module,
get_accessible_text_attributes,
vm_id,
at,
index,
&mut info
)
.unwrap_or(std::ptr::null());
(char, info)
}
pub(crate) fn get_accessible_text_items(
&self,
vm_id: i32,
at: AccessibleText,
index: JInt,
) -> Option<AccessibleTextItemsInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_text_items,
vm_id,
at,
&mut info,
index
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_accessible_text_line_bounds(
&self,
vm_id: i32,
at: AccessibleText,
index: JInt,
) -> Option<(JInt, JInt)> {
let (mut start, mut end) = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_text_line_bounds,
vm_id,
at,
index,
&mut start,
&mut end
)
.unwrap_or(0)
== 0
{
return None;
}
Some((start, end))
}
pub(crate) fn get_accessible_text_range(
&self,
vm_id: i32,
at: AccessibleText,
start_index: JInt,
end_index: JInt,
len: i16,
) -> Option<Vec<u16>> {
let mut text = Vec::new();
for _ in 0..len {
text.push(0);
}
if jab!(
*self.h_module,
get_accessible_text_range,
vm_id,
at,
start_index,
end_index,
text.as_mut_ptr(),
len
)
.unwrap_or(0)
== 0
{
return None;
}
Some(text)
}
pub(crate) fn get_accessible_text_rect(
&self,
vm_id: i32,
at: AccessibleText,
index: JInt,
) -> Option<AccessibleTextRectInfo> {
let mut info = unsafe { std::mem::zeroed() };
if jab!(
*self.h_module,
get_accessible_text_rect,
vm_id,
at,
&mut info,
index
)
.unwrap_or(0)
== 0
{
return None;
}
Some(info)
}
pub(crate) fn get_current_accessible_value_from_context(
&self,
vm_id: i32,
av: AccessibleValue,
len: i16,
) -> Option<Vec<u16>> {
let mut value = Vec::new();
for _ in 0..len {
value.push(0);
}
if jab!(
*self.h_module,
get_current_accessible_value_from_context,
vm_id,
av,
value.as_mut_ptr(),
len
)
.unwrap_or(0)
== 0
{
return None;
}
Some(value)
}
pub(crate) fn get_maximum_accessible_value_from_context(
&self,
vm_id: i32,
av: AccessibleValue,
len: i16,
) -> Option<Vec<u16>> {
let mut value = Vec::new();
for _ in 0..len {
value.push(0);
}
if jab!(
*self.h_module,
get_maximum_accessible_value_from_context,
vm_id,
av,
value.as_mut_ptr(),
len
)
.unwrap_or(0)
== 0
{
return None;
}
Some(value)
}
pub(crate) fn get_minimum_accessible_value_from_context(
&self,
vm_id: i32,
av: AccessibleValue,
len: i16,
) -> Option<Vec<u16>> {
let mut value = Vec::new();
for _ in 0..len {
value.push(0);
}
if jab!(
*self.h_module,
get_minimum_accessible_value_from_context,
vm_id,
av,
value.as_mut_ptr(),
len
)
.unwrap_or(0)
== 0
{
return None;
}
Some(value)
}
}
impl Drop for JabLib {
fn drop(&mut self) {
if self.h_module.is_invalid() {
return;
}
free_library(*self.h_module);
}
}