1 /*
2  * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 /* Note: In addition to this header file AccessBridgeCalls.c must be compiled and
27  * linked to your application.  AccessBridgeCalls.c implements the Java Access
28  * Bridge API and also hides the complexities associated with interfacing to the
29  * associated Java Access Bridge DLL which is installed when Java is installed.
30  *
31  * AccessBridgeCalls.c is available for download from the OpenJDK repository using
32  * the following link:
33  *
34  * https://git.openjdk.org/jdk17/blob/master/src/jdk.accessibility/windows/native/bridge/AccessBridgeCalls.c
35  *
36  * Also note that the API is used in the jaccessinspector and jaccesswalker tools.
37  * The source for those tools is available in the OpenJDK repository at these links:
38  *
39  * https://git.openjdk.org/jdk17/blob/master/src/jdk.accessibility/windows/native/jaccessinspector/jaccessinspector.cpp
40  * https://git.openjdk.org/jdk17/blob/master/src/jdk.accessibility/windows/native/jaccesswalker/jaccesswalker.cpp
41  *
42  *
43  */
44 
45 /*
46  * Wrapper functions around calls to the AccessBridge DLL
47  */
48 
49 #include <windows.h>
50 #include <jni.h>
51 #include "AccessBridgeCallbacks.h"
52 #include "AccessBridgePackages.h"
53 
54 #ifdef __cplusplus
55 extern "C" {
56 #endif
57 
58 #define null NULL
59 
60     typedef JOBJECT64 AccessibleContext;
61     typedef JOBJECT64 AccessibleText;
62     typedef JOBJECT64 AccessibleValue;
63     typedef JOBJECT64 AccessibleSelection;
64     typedef JOBJECT64 Java_Object;
65     typedef JOBJECT64 PropertyChangeEvent;
66     typedef JOBJECT64 FocusEvent;
67     typedef JOBJECT64 CaretEvent;
68     typedef JOBJECT64 MouseEvent;
69     typedef JOBJECT64 MenuEvent;
70     typedef JOBJECT64 AccessibleTable;
71     typedef JOBJECT64 AccessibleHyperlink;
72     typedef JOBJECT64 AccessibleHypertext;
73 
74 
75     typedef void (*Windows_runFP) ();
76 
77     typedef void (*SetPropertyChangeFP) (AccessBridge_PropertyChangeFP fp);
78 
79     typedef void (*SetJavaShutdownFP) (AccessBridge_JavaShutdownFP fp);
80     typedef void (*SetFocusGainedFP) (AccessBridge_FocusGainedFP fp);
81     typedef void (*SetFocusLostFP) (AccessBridge_FocusLostFP fp);
82 
83     typedef void (*SetCaretUpdateFP) (AccessBridge_CaretUpdateFP fp);
84 
85     typedef void (*SetMouseClickedFP) (AccessBridge_MouseClickedFP fp);
86     typedef void (*SetMouseEnteredFP) (AccessBridge_MouseEnteredFP fp);
87     typedef void (*SetMouseExitedFP) (AccessBridge_MouseExitedFP fp);
88     typedef void (*SetMousePressedFP) (AccessBridge_MousePressedFP fp);
89     typedef void (*SetMouseReleasedFP) (AccessBridge_MouseReleasedFP fp);
90 
91     typedef void (*SetMenuCanceledFP) (AccessBridge_MenuCanceledFP fp);
92     typedef void (*SetMenuDeselectedFP) (AccessBridge_MenuDeselectedFP fp);
93     typedef void (*SetMenuSelectedFP) (AccessBridge_MenuSelectedFP fp);
94     typedef void (*SetPopupMenuCanceledFP) (AccessBridge_PopupMenuCanceledFP fp);
95     typedef void (*SetPopupMenuWillBecomeInvisibleFP) (AccessBridge_PopupMenuWillBecomeInvisibleFP fp);
96     typedef void (*SetPopupMenuWillBecomeVisibleFP) (AccessBridge_PopupMenuWillBecomeVisibleFP fp);
97 
98     typedef void (*SetPropertyNameChangeFP) (AccessBridge_PropertyNameChangeFP fp);
99     typedef void (*SetPropertyDescriptionChangeFP) (AccessBridge_PropertyDescriptionChangeFP fp);
100     typedef void (*SetPropertyStateChangeFP) (AccessBridge_PropertyStateChangeFP fp);
101     typedef void (*SetPropertyValueChangeFP) (AccessBridge_PropertyValueChangeFP fp);
102     typedef void (*SetPropertySelectionChangeFP) (AccessBridge_PropertySelectionChangeFP fp);
103     typedef void (*SetPropertyTextChangeFP) (AccessBridge_PropertyTextChangeFP fp);
104     typedef void (*SetPropertyCaretChangeFP) (AccessBridge_PropertyCaretChangeFP fp);
105     typedef void (*SetPropertyVisibleDataChangeFP) (AccessBridge_PropertyVisibleDataChangeFP fp);
106     typedef void (*SetPropertyChildChangeFP) (AccessBridge_PropertyChildChangeFP fp);
107     typedef void (*SetPropertyActiveDescendentChangeFP) (AccessBridge_PropertyActiveDescendentChangeFP fp);
108 
109     typedef void (*SetPropertyTableModelChangeFP) (AccessBridge_PropertyTableModelChangeFP fp);
110 
111     typedef void (*ReleaseJavaObjectFP) (long vmID, Java_Object object);
112 
113     typedef BOOL (*GetVersionInfoFP) (long vmID, AccessBridgeVersionInfo *info);
114 
115     typedef BOOL (*IsJavaWindowFP) (HWND window);
116     typedef BOOL (*IsSameObjectFP) (long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
117     typedef BOOL (*GetAccessibleContextFromHWNDFP) (HWND window, long *vmID, AccessibleContext *ac);
118     typedef HWND (*getHWNDFromAccessibleContextFP) (long vmID, AccessibleContext ac);
119 
120     typedef BOOL (*GetAccessibleContextAtFP) (long vmID, AccessibleContext acParent,
121                                               jint x, jint y, AccessibleContext *ac);
122     typedef BOOL (*GetAccessibleContextWithFocusFP) (HWND window, long *vmID, AccessibleContext *ac);
123     typedef BOOL (*GetAccessibleContextInfoFP) (long vmID, AccessibleContext ac, AccessibleContextInfo *info);
124     typedef AccessibleContext (*GetAccessibleChildFromContextFP) (long vmID, AccessibleContext ac, jint i);
125     typedef AccessibleContext (*GetAccessibleParentFromContextFP) (long vmID, AccessibleContext ac);
126 
127     /* begin AccessibleTable */
128     typedef BOOL (*getAccessibleTableInfoFP) (long vmID, AccessibleContext ac, AccessibleTableInfo *tableInfo);
129     typedef BOOL (*getAccessibleTableCellInfoFP) (long vmID, AccessibleTable accessibleTable,
130                                                   jint row, jint column, AccessibleTableCellInfo *tableCellInfo);
131 
132     typedef BOOL (*getAccessibleTableRowHeaderFP) (long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
133     typedef BOOL (*getAccessibleTableColumnHeaderFP) (long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
134 
135     typedef AccessibleContext (*getAccessibleTableRowDescriptionFP) (long vmID, AccessibleContext acParent, jint row);
136     typedef AccessibleContext (*getAccessibleTableColumnDescriptionFP) (long vmID, AccessibleContext acParent, jint column);
137 
138     typedef jint (*getAccessibleTableRowSelectionCountFP) (long vmID, AccessibleTable table);
139     typedef BOOL (*isAccessibleTableRowSelectedFP) (long vmID, AccessibleTable table, jint row);
140     typedef BOOL (*getAccessibleTableRowSelectionsFP) (long vmID, AccessibleTable table, jint count,
141                                                        jint *selections);
142 
143     typedef jint (*getAccessibleTableColumnSelectionCountFP) (long vmID, AccessibleTable table);
144     typedef BOOL (*isAccessibleTableColumnSelectedFP) (long vmID, AccessibleTable table, jint column);
145     typedef BOOL (*getAccessibleTableColumnSelectionsFP) (long vmID, AccessibleTable table, jint count,
146                                                           jint *selections);
147 
148     typedef jint (*getAccessibleTableRowFP) (long vmID, AccessibleTable table, jint index);
149     typedef jint (*getAccessibleTableColumnFP) (long vmID, AccessibleTable table, jint index);
150     typedef jint (*getAccessibleTableIndexFP) (long vmID, AccessibleTable table, jint row, jint column);
151     /* end AccessibleTable */
152 
153     /* AccessibleRelationSet */
154     typedef BOOL (*getAccessibleRelationSetFP) (long vmID, AccessibleContext accessibleContext,
155                                                 AccessibleRelationSetInfo *relationSetInfo);
156 
157     /* AccessibleHypertext */
158     typedef BOOL (*getAccessibleHypertextFP)(long vmID, AccessibleContext accessibleContext,
159                                              AccessibleHypertextInfo *hypertextInfo);
160 
161     typedef BOOL (*activateAccessibleHyperlinkFP)(long vmID, AccessibleContext accessibleContext,
162                                                   AccessibleHyperlink accessibleHyperlink);
163 
164     typedef jint (*getAccessibleHyperlinkCountFP)(const long vmID,
165                                                       const AccessibleContext accessibleContext);
166 
167     typedef BOOL (*getAccessibleHypertextExtFP) (const long vmID,
168                                                  const AccessibleContext accessibleContext,
169                                                  const jint nStartIndex,
170                                                  AccessibleHypertextInfo *hypertextInfo);
171 
172     typedef jint (*getAccessibleHypertextLinkIndexFP)(const long vmID,
173                                                       const AccessibleHypertext hypertext,
174                                                       const jint nIndex);
175 
176     typedef BOOL (*getAccessibleHyperlinkFP)(const long vmID,
177                                              const AccessibleHypertext hypertext,
178                                              const jint nIndex,
179                                              AccessibleHyperlinkInfo *hyperlinkInfo);
180 
181 
182     /* Accessible KeyBindings, Icons and Actions */
183     typedef BOOL (*getAccessibleKeyBindingsFP)(long vmID, AccessibleContext accessibleContext,
184                                                AccessibleKeyBindings *keyBindings);
185 
186     typedef BOOL (*getAccessibleIconsFP)(long vmID, AccessibleContext accessibleContext,
187                                          AccessibleIcons *icons);
188 
189     typedef BOOL (*getAccessibleActionsFP)(long vmID, AccessibleContext accessibleContext,
190                                            AccessibleActions *actions);
191 
192     typedef BOOL (*doAccessibleActionsFP)(long vmID, AccessibleContext accessibleContext,
193                                           AccessibleActionsToDo *actionsToDo, jint *failure);
194 
195 
196     /* AccessibleText */
197 
198     typedef BOOL (*GetAccessibleTextInfoFP) (long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y);
199     typedef BOOL (*GetAccessibleTextItemsFP) (long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index);
200     typedef BOOL (*GetAccessibleTextSelectionInfoFP) (long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection);
201     typedef BOOL (*GetAccessibleTextAttributesFP) (long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes);
202     typedef BOOL (*GetAccessibleTextRectFP) (long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index);
203     typedef BOOL (*GetAccessibleTextLineBoundsFP) (long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex);
204     typedef BOOL (*GetAccessibleTextRangeFP) (long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len);
205 
206     typedef BOOL (*GetCurrentAccessibleValueFromContextFP) (long vmID, AccessibleValue av, wchar_t *value, short len);
207     typedef BOOL (*GetMaximumAccessibleValueFromContextFP) (long vmID, AccessibleValue av, wchar_t *value, short len);
208     typedef BOOL (*GetMinimumAccessibleValueFromContextFP) (long vmID, AccessibleValue av, wchar_t *value, short len);
209 
210     typedef void (*AddAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as, int i);
211     typedef void (*ClearAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as);
212     typedef JOBJECT64 (*GetAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as, int i);
213     typedef int (*GetAccessibleSelectionCountFromContextFP) (long vmID, AccessibleSelection as);
214     typedef BOOL (*IsAccessibleChildSelectedFromContextFP) (long vmID, AccessibleSelection as, int i);
215     typedef void (*RemoveAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as, int i);
216     typedef void (*SelectAllAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as);
217 
218     /* Utility methods */
219 
220     typedef BOOL (*setTextContentsFP) (const long vmID, const AccessibleContext ac, const wchar_t *text);
221     typedef AccessibleContext (*getParentWithRoleFP) (const long vmID, const AccessibleContext ac, const wchar_t *role);
222     typedef AccessibleContext (*getParentWithRoleElseRootFP) (const long vmID, const AccessibleContext ac, const wchar_t *role);
223     typedef AccessibleContext (*getTopLevelObjectFP) (const long vmID, const AccessibleContext ac);
224     typedef int (*getObjectDepthFP) (const long vmID, const AccessibleContext ac);
225     typedef AccessibleContext (*getActiveDescendentFP) (const long vmID, const AccessibleContext ac);
226 
227 
228     typedef BOOL (*getVirtualAccessibleNameFP) (const long vmID, const AccessibleContext accessibleContext,
229                                              wchar_t *name, int len);
230 
231     typedef BOOL (*requestFocusFP) (const long vmID, const AccessibleContext accessibleContext);
232 
233     typedef BOOL (*selectTextRangeFP) (const long vmID, const AccessibleContext accessibleContext,
234                                        const int startIndex, const int endIndex);
235 
236     typedef BOOL (*getTextAttributesInRangeFP) (const long vmID, const AccessibleContext accessibleContext,
237                                                 const int startIndex, const int endIndex,
238                                                 AccessibleTextAttributesInfo *attributes, short *len);
239 
240     typedef int (*getVisibleChildrenCountFP) (const long vmID, const AccessibleContext accessibleContext);
241 
242     typedef BOOL (*getVisibleChildrenFP) (const long vmID, const AccessibleContext accessibleContext,
243                                           const int startIndex, VisibleChildrenInfo *children);
244 
245     typedef BOOL (*setCaretPositionFP) (const long vmID, const AccessibleContext accessibleContext, const int position);
246 
247     typedef BOOL (*getCaretLocationFP) (long vmID, AccessibleContext ac, AccessibleTextRectInfo *rectInfo, jint index);
248 
249     typedef int (*getEventsWaitingFP) ();
250 
251     typedef struct AccessBridgeFPsTag {
252         Windows_runFP Windows_run;
253 
254         SetPropertyChangeFP SetPropertyChange;
255 
256         SetJavaShutdownFP SetJavaShutdown;
257         SetFocusGainedFP SetFocusGained;
258         SetFocusLostFP SetFocusLost;
259 
260         SetCaretUpdateFP SetCaretUpdate;
261 
262         SetMouseClickedFP SetMouseClicked;
263         SetMouseEnteredFP SetMouseEntered;
264         SetMouseExitedFP SetMouseExited;
265         SetMousePressedFP SetMousePressed;
266         SetMouseReleasedFP SetMouseReleased;
267 
268         SetMenuCanceledFP SetMenuCanceled;
269         SetMenuDeselectedFP SetMenuDeselected;
270         SetMenuSelectedFP SetMenuSelected;
271         SetPopupMenuCanceledFP SetPopupMenuCanceled;
272         SetPopupMenuWillBecomeInvisibleFP SetPopupMenuWillBecomeInvisible;
273         SetPopupMenuWillBecomeVisibleFP SetPopupMenuWillBecomeVisible;
274 
275         SetPropertyNameChangeFP SetPropertyNameChange;
276         SetPropertyDescriptionChangeFP SetPropertyDescriptionChange;
277         SetPropertyStateChangeFP SetPropertyStateChange;
278         SetPropertyValueChangeFP SetPropertyValueChange;
279         SetPropertySelectionChangeFP SetPropertySelectionChange;
280         SetPropertyTextChangeFP SetPropertyTextChange;
281         SetPropertyCaretChangeFP SetPropertyCaretChange;
282         SetPropertyVisibleDataChangeFP SetPropertyVisibleDataChange;
283         SetPropertyChildChangeFP SetPropertyChildChange;
284         SetPropertyActiveDescendentChangeFP SetPropertyActiveDescendentChange;
285 
286         SetPropertyTableModelChangeFP SetPropertyTableModelChange;
287 
288         ReleaseJavaObjectFP ReleaseJavaObject;
289         GetVersionInfoFP GetVersionInfo;
290 
291         IsJavaWindowFP IsJavaWindow;
292         IsSameObjectFP IsSameObject;
293         GetAccessibleContextFromHWNDFP GetAccessibleContextFromHWND;
294         getHWNDFromAccessibleContextFP getHWNDFromAccessibleContext;
295 
296         GetAccessibleContextAtFP GetAccessibleContextAt;
297         GetAccessibleContextWithFocusFP GetAccessibleContextWithFocus;
298         GetAccessibleContextInfoFP GetAccessibleContextInfo;
299         GetAccessibleChildFromContextFP GetAccessibleChildFromContext;
300         GetAccessibleParentFromContextFP GetAccessibleParentFromContext;
301 
302         getAccessibleTableInfoFP getAccessibleTableInfo;
303         getAccessibleTableCellInfoFP getAccessibleTableCellInfo;
304 
305         getAccessibleTableRowHeaderFP getAccessibleTableRowHeader;
306         getAccessibleTableColumnHeaderFP getAccessibleTableColumnHeader;
307 
308         getAccessibleTableRowDescriptionFP getAccessibleTableRowDescription;
309         getAccessibleTableColumnDescriptionFP getAccessibleTableColumnDescription;
310 
311         getAccessibleTableRowSelectionCountFP getAccessibleTableRowSelectionCount;
312         isAccessibleTableRowSelectedFP isAccessibleTableRowSelected;
313         getAccessibleTableRowSelectionsFP getAccessibleTableRowSelections;
314 
315         getAccessibleTableColumnSelectionCountFP getAccessibleTableColumnSelectionCount;
316         isAccessibleTableColumnSelectedFP isAccessibleTableColumnSelected;
317         getAccessibleTableColumnSelectionsFP getAccessibleTableColumnSelections;
318 
319         getAccessibleTableRowFP getAccessibleTableRow;
320         getAccessibleTableColumnFP getAccessibleTableColumn;
321         getAccessibleTableIndexFP getAccessibleTableIndex;
322 
323         getAccessibleRelationSetFP getAccessibleRelationSet;
324 
325         getAccessibleHypertextFP getAccessibleHypertext;
326         activateAccessibleHyperlinkFP activateAccessibleHyperlink;
327         getAccessibleHyperlinkCountFP getAccessibleHyperlinkCount;
328         getAccessibleHypertextExtFP getAccessibleHypertextExt;
329         getAccessibleHypertextLinkIndexFP getAccessibleHypertextLinkIndex;
330         getAccessibleHyperlinkFP getAccessibleHyperlink;
331 
332         getAccessibleKeyBindingsFP getAccessibleKeyBindings;
333         getAccessibleIconsFP getAccessibleIcons;
334         getAccessibleActionsFP getAccessibleActions;
335         doAccessibleActionsFP doAccessibleActions;
336 
337         GetAccessibleTextInfoFP GetAccessibleTextInfo;
338         GetAccessibleTextItemsFP GetAccessibleTextItems;
339         GetAccessibleTextSelectionInfoFP GetAccessibleTextSelectionInfo;
340         GetAccessibleTextAttributesFP GetAccessibleTextAttributes;
341         GetAccessibleTextRectFP GetAccessibleTextRect;
342         GetAccessibleTextLineBoundsFP GetAccessibleTextLineBounds;
343         GetAccessibleTextRangeFP GetAccessibleTextRange;
344 
345         GetCurrentAccessibleValueFromContextFP GetCurrentAccessibleValueFromContext;
346         GetMaximumAccessibleValueFromContextFP GetMaximumAccessibleValueFromContext;
347         GetMinimumAccessibleValueFromContextFP GetMinimumAccessibleValueFromContext;
348 
349         AddAccessibleSelectionFromContextFP AddAccessibleSelectionFromContext;
350         ClearAccessibleSelectionFromContextFP ClearAccessibleSelectionFromContext;
351         GetAccessibleSelectionFromContextFP GetAccessibleSelectionFromContext;
352         GetAccessibleSelectionCountFromContextFP GetAccessibleSelectionCountFromContext;
353         IsAccessibleChildSelectedFromContextFP IsAccessibleChildSelectedFromContext;
354         RemoveAccessibleSelectionFromContextFP RemoveAccessibleSelectionFromContext;
355         SelectAllAccessibleSelectionFromContextFP SelectAllAccessibleSelectionFromContext;
356 
357         setTextContentsFP setTextContents;
358         getParentWithRoleFP getParentWithRole;
359         getTopLevelObjectFP getTopLevelObject;
360         getParentWithRoleElseRootFP getParentWithRoleElseRoot;
361         getObjectDepthFP getObjectDepth;
362         getActiveDescendentFP getActiveDescendent;
363 
364         getVirtualAccessibleNameFP getVirtualAccessibleName;
365         requestFocusFP requestFocus;
366         selectTextRangeFP selectTextRange;
367         getTextAttributesInRangeFP getTextAttributesInRange;
368         getVisibleChildrenCountFP getVisibleChildrenCount;
369         getVisibleChildrenFP getVisibleChildren;
370         setCaretPositionFP setCaretPosition;
371         getCaretLocationFP getCaretLocation;
372 
373         getEventsWaitingFP getEventsWaiting;
374 
375     } AccessBridgeFPs;
376 
377 
378     /**
379      * Initialize the world
380      */
381     BOOL initializeAccessBridge();
382     BOOL shutdownAccessBridge();
383 
384     /**
385      * Window routines
386      */
387     BOOL IsJavaWindow(HWND window);
388 
389     // Returns the virtual machine ID and AccessibleContext for a top-level window
390     BOOL GetAccessibleContextFromHWND(HWND target, long *vmID, AccessibleContext *ac);
391 
392     // Returns the HWND from the AccessibleContext of a top-level window
393     HWND getHWNDFromAccessibleContext(long vmID, AccessibleContext ac);
394 
395 
396     /**
397      * Event handling routines
398      */
399     void SetJavaShutdown(AccessBridge_JavaShutdownFP fp);
400     void SetFocusGained(AccessBridge_FocusGainedFP fp);
401     void SetFocusLost(AccessBridge_FocusLostFP fp);
402 
403     void SetCaretUpdate(AccessBridge_CaretUpdateFP fp);
404 
405     void SetMouseClicked(AccessBridge_MouseClickedFP fp);
406     void SetMouseEntered(AccessBridge_MouseEnteredFP fp);
407     void SetMouseExited(AccessBridge_MouseExitedFP fp);
408     void SetMousePressed(AccessBridge_MousePressedFP fp);
409     void SetMouseReleased(AccessBridge_MouseReleasedFP fp);
410 
411     void SetMenuCanceled(AccessBridge_MenuCanceledFP fp);
412     void SetMenuDeselected(AccessBridge_MenuDeselectedFP fp);
413     void SetMenuSelected(AccessBridge_MenuSelectedFP fp);
414     void SetPopupMenuCanceled(AccessBridge_PopupMenuCanceledFP fp);
415     void SetPopupMenuWillBecomeInvisible(AccessBridge_PopupMenuWillBecomeInvisibleFP fp);
416     void SetPopupMenuWillBecomeVisible(AccessBridge_PopupMenuWillBecomeVisibleFP fp);
417 
418     void SetPropertyNameChange(AccessBridge_PropertyNameChangeFP fp);
419     void SetPropertyDescriptionChange(AccessBridge_PropertyDescriptionChangeFP fp);
420     void SetPropertyStateChange(AccessBridge_PropertyStateChangeFP fp);
421     void SetPropertyValueChange(AccessBridge_PropertyValueChangeFP fp);
422     void SetPropertySelectionChange(AccessBridge_PropertySelectionChangeFP fp);
423     void SetPropertyTextChange(AccessBridge_PropertyTextChangeFP fp);
424     void SetPropertyCaretChange(AccessBridge_PropertyCaretChangeFP fp);
425     void SetPropertyVisibleDataChange(AccessBridge_PropertyVisibleDataChangeFP fp);
426     void SetPropertyChildChange(AccessBridge_PropertyChildChangeFP fp);
427     void SetPropertyActiveDescendentChange(AccessBridge_PropertyActiveDescendentChangeFP fp);
428 
429     void SetPropertyTableModelChange(AccessBridge_PropertyTableModelChangeFP fp);
430 
431 
432     /**
433      * General routines
434      */
435     void ReleaseJavaObject(long vmID, Java_Object object);
436     BOOL GetVersionInfo(long vmID, AccessBridgeVersionInfo *info);
437     HWND GetHWNDFromAccessibleContext(long vmID, JOBJECT64 accesibleContext);
438 
439     /**
440      * Accessible Context routines
441      */
442     BOOL GetAccessibleContextAt(long vmID, AccessibleContext acParent,
443                                 jint x, jint y, AccessibleContext *ac);
444     BOOL GetAccessibleContextWithFocus(HWND window, long *vmID, AccessibleContext *ac);
445     BOOL GetAccessibleContextInfo(long vmID, AccessibleContext ac, AccessibleContextInfo *info);
446     AccessibleContext GetAccessibleChildFromContext(long vmID, AccessibleContext ac, jint index);
447     AccessibleContext GetAccessibleParentFromContext(long vmID, AccessibleContext ac);
448 
449     /**
450      * Accessible Text routines
451      */
452     BOOL GetAccessibleTextInfo(long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y);
453     BOOL GetAccessibleTextItems(long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index);
454     BOOL GetAccessibleTextSelectionInfo(long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection);
455     BOOL GetAccessibleTextAttributes(long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes);
456     BOOL GetAccessibleTextRect(long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index);
457     BOOL GetAccessibleTextLineBounds(long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex);
458     BOOL GetAccessibleTextRange(long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len);
459 
460     /* begin AccessibleTable routines */
461     BOOL getAccessibleTableInfo(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
462 
463     BOOL getAccessibleTableCellInfo(long vmID, AccessibleTable accessibleTable, jint row, jint column,
464                                     AccessibleTableCellInfo *tableCellInfo);
465 
466     BOOL getAccessibleTableRowHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
467     BOOL getAccessibleTableColumnHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
468 
469     AccessibleContext getAccessibleTableRowDescription(long vmID, AccessibleContext acParent, jint row);
470     AccessibleContext getAccessibleTableColumnDescription(long vmID, AccessibleContext acParent, jint column);
471 
472     jint getAccessibleTableRowSelectionCount(long vmID, AccessibleTable table);
473     BOOL isAccessibleTableRowSelected(long vmID, AccessibleTable table, jint row);
474     BOOL getAccessibleTableRowSelections(long vmID, AccessibleTable table, jint count, jint *selections);
475 
476     jint getAccessibleTableColumnSelectionCount(long vmID, AccessibleTable table);
477     BOOL isAccessibleTableColumnSelected(long vmID, AccessibleTable table, jint column);
478     BOOL getAccessibleTableColumnSelections(long vmID, AccessibleTable table, jint count, jint *selections);
479 
480     jint getAccessibleTableRow(long vmID, AccessibleTable table, jint index);
481     jint getAccessibleTableColumn(long vmID, AccessibleTable table, jint index);
482     jint getAccessibleTableIndex(long vmID, AccessibleTable table, jint row, jint column);
483     /* end AccessibleTable */
484 
485     /* ----- AccessibleRelationSet routines */
486     BOOL getAccessibleRelationSet(long vmID, AccessibleContext accessibleContext,
487                                   AccessibleRelationSetInfo *relationSetInfo);
488 
489     /* ----- AccessibleHypertext routines */
490 
491      /*
492      * Returns hypertext information associated with a component.
493      */
494     BOOL getAccessibleHypertext(long vmID, AccessibleContext accessibleContext,
495                                 AccessibleHypertextInfo *hypertextInfo);
496 
497     /*
498      * Requests that a hyperlink be activated.
499      */
500     BOOL activateAccessibleHyperlink(long vmID, AccessibleContext accessibleContext,
501                                      AccessibleHyperlink accessibleHyperlink);
502 
503     /*
504      * Returns the number of hyperlinks in a component
505      * Maps to AccessibleHypertext.getLinkCount.
506      * Returns -1 on error.
507      */
508     jint getAccessibleHyperlinkCount(const long vmID,
509                                          const AccessibleHypertext hypertext);
510 
511     /*
512      * This method is used to iterate through the hyperlinks in a component.  It
513      * returns hypertext information for a component starting at hyperlink index
514      * nStartIndex.  No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will
515      * be returned for each call to this method.
516      * Returns FALSE on error.
517      */
518     BOOL getAccessibleHypertextExt(const long vmID,
519                                    const AccessibleContext accessibleContext,
520                                    const jint nStartIndex,
521                                    /* OUT */ AccessibleHypertextInfo *hypertextInfo);
522 
523     /*
524      * Returns the index into an array of hyperlinks that is associated with
525      * a character index in document; maps to AccessibleHypertext.getLinkIndex
526      * Returns -1 on error.
527      */
528     jint getAccessibleHypertextLinkIndex(const long vmID,
529                                          const AccessibleHypertext hypertext,
530                                          const jint nIndex);
531 
532     /*
533      * Returns the nth hyperlink in a document
534      * Maps to AccessibleHypertext.getLink.
535      * Returns FALSE on error
536      */
537     BOOL getAccessibleHyperlink(const long vmID,
538                                 const AccessibleHypertext hypertext,
539                                 const jint nIndex,
540                                 /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo);
541 
542     /* Accessible KeyBindings, Icons and Actions */
543 
544     /*
545      * Returns a list of key bindings associated with a component.
546      */
547     BOOL getAccessibleKeyBindings(long vmID, AccessibleContext accessibleContext,
548                                   AccessibleKeyBindings *keyBindings);
549 
550     /*
551      * Returns a list of icons associate with a component.
552      */
553     BOOL getAccessibleIcons(long vmID, AccessibleContext accessibleContext,
554                             AccessibleIcons *icons);
555 
556     /*
557      * Returns a list of actions that a component can perform.
558      */
559     BOOL getAccessibleActions(long vmID, AccessibleContext accessibleContext,
560                               AccessibleActions *actions);
561 
562     /*
563      * Request that a list of AccessibleActions be performed by a component.
564      * Returns TRUE if all actions are performed.  Returns FALSE
565      * when the first requested action fails in which case "failure"
566      * contains the index of the action that failed.
567      */
568     BOOL doAccessibleActions(long vmID, AccessibleContext accessibleContext,
569                              AccessibleActionsToDo *actionsToDo, jint *failure);
570 
571 
572 
573     /* Additional utility methods */
574 
575     /*
576      * Returns whether two object references refer to the same object.
577      */
578     BOOL IsSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
579 
580     /**
581      * Sets editable text contents.  The AccessibleContext must implement AccessibleEditableText and
582      *   be editable.  The maximum text length that can be set is MAX_STRING_SIZE - 1.
583      * Returns whether successful
584      */
585     BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text);
586 
587     /**
588      * Returns the Accessible Context with the specified role that is the
589      * ancestor of a given object. The role is one of the role strings
590      * defined in AccessBridgePackages.h
591      * If there is no ancestor object that has the specified role,
592      * returns (AccessibleContext)0.
593      */
594     AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext,
595                                          const wchar_t *role);
596 
597     /**
598      * Returns the Accessible Context with the specified role that is the
599      * ancestor of a given object. The role is one of the role strings
600      * defined in AccessBridgePackages.h.  If an object with the specified
601      * role does not exist, returns the top level object for the Java Window.
602      * Returns (AccessibleContext)0 on error.
603      */
604     AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext,
605                                                  const wchar_t *role);
606 
607     /**
608      * Returns the Accessible Context for the top level object in
609      * a Java Window.  This is same Accessible Context that is obtained
610      * from GetAccessibleContextFromHWND for that window.  Returns
611      * (AccessibleContext)0 on error.
612      */
613     AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext);
614 
615     /**
616      * Returns how deep in the object hierarchy a given object is.
617      * The top most object in the object hierarchy has an object depth of 0.
618      * Returns -1 on error.
619      */
620     int getObjectDepth (const long vmID, const AccessibleContext accessibleContext);
621 
622     /**
623      * Returns the Accessible Context of the current ActiveDescendent of an object.
624      * This method assumes the ActiveDescendent is the component that is currently
625      * selected in a container object.
626      * Returns (AccessibleContext)0 on error or if there is no selection.
627      */
628     AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext);
629 
630     /**
631      * Accessible Value routines
632      */
633     BOOL GetCurrentAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
634     BOOL GetMaximumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
635     BOOL GetMinimumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
636 
637     /**
638      * Accessible Selection routines
639      */
640     void AddAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
641     void ClearAccessibleSelectionFromContext(long vmID, AccessibleSelection as);
642     JOBJECT64 GetAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
643     int GetAccessibleSelectionCountFromContext(long vmID, AccessibleSelection as);
644     BOOL IsAccessibleChildSelectedFromContext(long vmID, AccessibleSelection as, int i);
645     void RemoveAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
646     void SelectAllAccessibleSelectionFromContext(long vmID, AccessibleSelection as);
647 
648     /**
649      * Additional methods for Teton
650      */
651 
652     /**
653      * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
654      * whether successful.
655      *
656      * Bug ID 4916682 - Implement JAWS AccessibleName policy
657      */
658     BOOL getVirtualAccessibleName(const long vmID, const AccessibleContext accessibleContext,
659                                wchar_t *name, int len);
660 
661     /**
662      * Request focus for a component. Returns whether successful.
663      *
664      * Bug ID 4944757 - requestFocus method needed
665      */
666     BOOL requestFocus(const long vmID, const AccessibleContext accessibleContext);
667 
668     /**
669      * Selects text between two indices.  Selection includes the text at the start index
670      * and the text at the end index. Returns whether successful.
671      *
672      * Bug ID 4944758 - selectTextRange method needed
673      */
674     BOOL selectTextRange(const long vmID, const AccessibleContext accessibleContext, const int startIndex,
675                          const int endIndex);
676 
677     /**
678      * Get text attributes between two indices.  The attribute list includes the text at the
679      * start index and the text at the end index. Returns whether successful;
680      *
681      * Bug ID 4944761 - getTextAttributes between two indices method needed
682      */
683     BOOL getTextAttributesInRange(const long vmID, const AccessibleContext accessibleContext,
684                                   const int startIndex, const int endIndex,
685                                   AccessibleTextAttributesInfo *attributes, short *len);
686 
687     /**
688      * Returns the number of visible children of a component. Returns -1 on error.
689      *
690      * Bug ID 4944762- getVisibleChildren for list-like components needed
691      */
692     int getVisibleChildrenCount(const long vmID, const AccessibleContext accessibleContext);
693 
694     /**
695      * Gets the visible children of an AccessibleContext. Returns whether successful.
696      *
697      * Bug ID 4944762- getVisibleChildren for list-like components needed
698      */
699     BOOL getVisibleChildren(const long vmID, const AccessibleContext accessibleContext,
700                             const int startIndex,
701                             VisibleChildrenInfo *visibleChildrenInfo);
702 
703     /**
704      * Set the caret to a text position. Returns whether successful.
705      *
706      * Bug ID 4944770 - setCaretPosition method needed
707      */
708     BOOL setCaretPosition(const long vmID, const AccessibleContext accessibleContext,
709                           const int position);
710 
711     /**
712      * Gets the text caret location
713      */
714     BOOL getCaretLocation(long vmID, AccessibleContext ac,
715                           AccessibleTextRectInfo *rectInfo, jint index);
716 
717     /**
718      * Gets the number of events waiting to fire
719      */
720     int getEventsWaiting();
721 
722 #ifdef __cplusplus
723 }
724 #endif
725