1 /*
2  * Copyright (c) 2005, 2014, 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 /*
27  * Glue routines called by Windows AT into the WindowsAccessBridge dll
28  */
29 
30 #include "AccessBridgeDebug.h"
31 #include "AccessBridgeWindowsEntryPoints.h"
32 #include "WinAccessBridge.h"
33 #include "accessBridgeResource.h"
34 
35 #include <windows.h>
36 #include <jni.h>
37 
38 
39 extern WinAccessBridge *theWindowsAccessBridge;
40 extern HWND theDialogWindow;
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46     /**
47      * Windows_run - where Windows executables will load/unload us
48      *
49      */
Windows_run()50     void Windows_run() {
51         // open our window
52         if (theWindowsAccessBridge != (WinAccessBridge *) 0) {
53             theWindowsAccessBridge->initWindow();
54         }
55     }
56 
57     /*
58       /**
59       * Windows_shutdown - where Windows executables will load/unload us
60       *
61       *
62       void Windows_shutdown() {
63       if (theWindowsAccessBridge != (WinAccessBridge *) 0) {
64       theWindowsAccessBridge->initWindow();
65       }
66       }
67     */
68 
69     /**
70      * getTopLevelHWND - returns the top-level window parent of the descendent
71      *
72      */
getTopLevelHWND(HWND descendent)73     HWND getTopLevelHWND(HWND descendent) {
74         HWND hwnd;
75         if (descendent == NULL) {
76             return NULL;
77         }
78 
79         if (!IsWindow(descendent)) {
80             return NULL;
81         }
82 
83         hwnd = descendent;
84         for(;;) {
85             LONG style = GetWindowLong(hwnd, GWL_STYLE);
86             if ( (style & WS_CHILD) == 0 ) {
87                 // found a non-child window so terminate
88                 break;
89             }
90             hwnd = GetParent(hwnd);
91         }
92 
93         return hwnd;
94     }
95 
releaseJavaObject(long vmID,JOBJECT64 object)96     void releaseJavaObject(long vmID, JOBJECT64 object) {
97         if (theWindowsAccessBridge != 0) {
98             theWindowsAccessBridge->releaseJavaObject(vmID, object);
99         }
100     }
101 
getVersionInfo(long vmID,AccessBridgeVersionInfo * info)102     void getVersionInfo(long vmID, AccessBridgeVersionInfo *info) {
103         if (theWindowsAccessBridge != 0) {
104             theWindowsAccessBridge->getVersionInfo(vmID, info);
105         }
106     }
107 
108 
isJavaWindow(HWND window)109     BOOL isJavaWindow(HWND window) {
110         if (theWindowsAccessBridge != 0) {
111             return theWindowsAccessBridge->isJavaWindow(window);
112         }
113         return FALSE;
114     }
115 
116     /*
117      * Returns whether two object references refer to the same object
118      */
isSameObject(long vmID,JOBJECT64 obj1,JOBJECT64 obj2)119     BOOL isSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2) {
120 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
121         PrintDebugString("\r\nAccessBridgeWindowsEntryPoints::isSameObject(%p %p)", obj1, obj2);
122 #else // JOBJECT64 is jlong (64 bit)
123         PrintDebugString("\r\nAccessBridgeWindowsEntryPoints::isSameObject(%016I64X %016I64X)", obj1, obj2);
124 #endif
125         if (theWindowsAccessBridge != 0) {
126             return theWindowsAccessBridge->isSameObject(vmID, obj1, obj2);
127         }
128         return FALSE;
129     }
130 
131     /**
132      * Sets a text field to the specified string. Returns whether successful
133      */
setTextContents(const long vmID,const AccessibleContext accessibleContext,const wchar_t * text)134     BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext,const wchar_t *text) {
135 
136         if (theWindowsAccessBridge != 0) {
137             return theWindowsAccessBridge->setTextContents(vmID, accessibleContext, text);
138         }
139         return FALSE;
140     }
141 
142     /**
143      * Returns the Accessible Context of an object of the specified role that is the
144      * ancestor of a given object.  If the object is of the specified role
145      * or an ancestor object of the specified role was found, returns the object's
146      * AccessibleContext.
147      * If there is no ancestor object of the specified role,
148      * returns (AccessibleContext)0.
149      */
getParentWithRole(const long vmID,const AccessibleContext accessibleContext,const wchar_t * role)150     AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role) {
151 
152         if (theWindowsAccessBridge != 0) {
153             return theWindowsAccessBridge->getParentWithRole(vmID, accessibleContext, role);
154         }
155         return (AccessibleContext)0;
156     }
157 
158 
159     /**
160      * Returns the Accessible Context for the top level object in
161      * a Java Window.  This is same Accessible Context that is obtained
162      * from GetAccessibleContextFromHWND for that window.  Returns
163      * (AccessibleContext)0 on error.
164      */
getTopLevelObject(const long vmID,const AccessibleContext accessibleContext)165     AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext) {
166 
167         if (theWindowsAccessBridge != 0) {
168             return theWindowsAccessBridge->getTopLevelObject(vmID, accessibleContext);
169         }
170         return (AccessibleContext)0;
171     }
172 
173     /**
174      * If there is an Ancestor object of the specified role,
175      * returns the Accessible Context of the found object.
176      * Otherwise, returns the top level object for that
177      * Java Window.  Returns (AccessibleContext)0 on error.
178      */
getParentWithRoleElseRoot(const long vmID,const AccessibleContext accessibleContext,const wchar_t * role)179     AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role) {
180 
181         if (theWindowsAccessBridge != 0) {
182             return theWindowsAccessBridge->getParentWithRoleElseRoot(vmID, accessibleContext, role);
183         }
184         return (AccessibleContext)0;
185     }
186 
187     /**
188      * Returns how deep in the object hierarchy a given object is.
189      * The top most object in the object hierarchy has an object depth of 0.
190      * Returns -1 on error.
191      */
getObjectDepth(const long vmID,const AccessibleContext accessibleContext)192     int getObjectDepth (const long vmID, const AccessibleContext accessibleContext) {
193 
194         if (theWindowsAccessBridge != 0) {
195             return theWindowsAccessBridge->getObjectDepth(vmID, accessibleContext);
196         }
197         return -1;
198     }
199 
200     /**
201      * Returns the Accessible Context of the currently ActiveDescendent of an object.
202      * Returns (AccessibleContext)0 on error.
203      */
getActiveDescendent(const long vmID,const AccessibleContext accessibleContext)204     AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext) {
205 
206         if (theWindowsAccessBridge != 0) {
207             return theWindowsAccessBridge->getActiveDescendent(vmID, accessibleContext);
208         }
209         return (AccessibleContext)0;
210     }
211 
212     // -------- Accessible Context methods -------------
213 
getAccessibleContextFromHWND(HWND window,long * vmID,JOBJECT64 * AccessibleContext)214     BOOL getAccessibleContextFromHWND(HWND window, long *vmID, JOBJECT64 *AccessibleContext) {
215         if (theWindowsAccessBridge != 0) {
216             return theWindowsAccessBridge->getAccessibleContextFromHWND(window, vmID, AccessibleContext);
217         }
218         return FALSE;
219     }
220 
getHWNDFromAccessibleContext(long vmID,JOBJECT64 accessibleContext)221     HWND getHWNDFromAccessibleContext(long vmID, JOBJECT64 accessibleContext) {
222         if (theWindowsAccessBridge != 0) {
223             return theWindowsAccessBridge->getHWNDFromAccessibleContext(vmID, accessibleContext);
224         }
225         return (HWND)0;
226     }
227 
getAccessibleContextAt(long vmID,JOBJECT64 AccessibleContextParent,jint x,jint y,JOBJECT64 * AccessibleContext)228     BOOL getAccessibleContextAt(long vmID, JOBJECT64 AccessibleContextParent,
229                                 jint x, jint y, JOBJECT64 *AccessibleContext) {
230         if (theWindowsAccessBridge != 0) {
231             return theWindowsAccessBridge->getAccessibleContextAt(vmID, AccessibleContextParent,
232                                                                   x, y, AccessibleContext);
233         }
234         return FALSE;
235     }
236 
getAccessibleContextWithFocus(HWND window,long * vmID,JOBJECT64 * AccessibleContext)237     BOOL getAccessibleContextWithFocus(HWND window, long *vmID, JOBJECT64 *AccessibleContext) {
238         if (theWindowsAccessBridge != 0) {
239             return theWindowsAccessBridge->getAccessibleContextWithFocus(window, vmID, AccessibleContext);
240         }
241         return FALSE;
242     }
243 
getAccessibleContextInfo(long vmID,JOBJECT64 AccessibleContext,AccessibleContextInfo * info)244     BOOL getAccessibleContextInfo(long vmID,
245                                   JOBJECT64 AccessibleContext,
246                                   AccessibleContextInfo *info) {
247         if (theWindowsAccessBridge != 0) {
248             return theWindowsAccessBridge->getAccessibleContextInfo(
249                                                                     vmID,
250                                                                     AccessibleContext,
251                                                                     info);
252         }
253         return FALSE;
254     }
255 
getAccessibleChildFromContext(long vmID,JOBJECT64 AccessibleContext,jint childIndex)256     JOBJECT64 getAccessibleChildFromContext(long vmID,
257                                           JOBJECT64 AccessibleContext,
258                                           jint childIndex) {
259         if (theWindowsAccessBridge != 0) {
260             return theWindowsAccessBridge->getAccessibleChildFromContext(
261                                                                          vmID,
262                                                                          AccessibleContext,
263                                                                          childIndex);
264         }
265         return (JOBJECT64) 0;
266     }
267 
getAccessibleParentFromContext(long vmID,JOBJECT64 AccessibleContext)268     JOBJECT64 getAccessibleParentFromContext(long vmID,
269                                            JOBJECT64 AccessibleContext) {
270         if (theWindowsAccessBridge != 0) {
271             return theWindowsAccessBridge->getAccessibleParentFromContext(
272                                                                           vmID,
273                                                                           AccessibleContext);
274         }
275         return (JOBJECT64) 0;
276     }
277 
278     // -------- begin AccessibleTable routines -------------
279 
getAccessibleTableInfo(long vmID,JOBJECT64 ac,AccessibleTableInfo * tableInfo)280     BOOL getAccessibleTableInfo(long vmID, JOBJECT64 ac,
281                                 AccessibleTableInfo *tableInfo) {
282         if (theWindowsAccessBridge != 0) {
283             return theWindowsAccessBridge->getAccessibleTableInfo(
284                                                                   vmID,
285                                                                   ac,
286                                                                   tableInfo);
287         }
288         return FALSE;
289     }
290 
getAccessibleTableCellInfo(long vmID,JOBJECT64 accessibleTable,jint row,jint column,AccessibleTableCellInfo * tableCellInfo)291     BOOL getAccessibleTableCellInfo(long vmID, JOBJECT64 accessibleTable,
292                                     jint row, jint column, AccessibleTableCellInfo *tableCellInfo) {
293 
294         if (theWindowsAccessBridge != 0) {
295             return theWindowsAccessBridge->getAccessibleTableCellInfo(
296                                                                       vmID,
297                                                                       accessibleTable,
298                                                                       row, column, tableCellInfo);
299         }
300         return FALSE;
301     }
302 
getAccessibleTableRowHeader(long vmID,JOBJECT64 acParent,AccessibleTableInfo * tableInfo)303     BOOL getAccessibleTableRowHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo) {
304 
305         if (theWindowsAccessBridge != 0) {
306             return theWindowsAccessBridge->getAccessibleTableRowHeader(
307                                                                        vmID,
308                                                                        acParent,
309                                                                        tableInfo);
310         }
311         return FALSE;
312     }
313 
getAccessibleTableColumnHeader(long vmID,JOBJECT64 acParent,AccessibleTableInfo * tableInfo)314     BOOL getAccessibleTableColumnHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo) {
315 
316         if (theWindowsAccessBridge != 0) {
317             return theWindowsAccessBridge->getAccessibleTableColumnHeader(
318                                                                           vmID,
319                                                                           acParent,
320                                                                           tableInfo);
321         }
322         return FALSE;
323     }
324 
getAccessibleTableRowDescription(long vmID,JOBJECT64 acParent,jint row)325     JOBJECT64 getAccessibleTableRowDescription(long vmID, JOBJECT64 acParent, jint row) {
326 
327         if (theWindowsAccessBridge != 0) {
328             return (JOBJECT64)theWindowsAccessBridge->getAccessibleTableRowDescription(
329                                                                             vmID,
330                                                                             acParent,
331                                                                             row);
332         }
333         return (JOBJECT64)0;
334     }
335 
getAccessibleTableColumnDescription(long vmID,JOBJECT64 acParent,jint column)336     JOBJECT64 getAccessibleTableColumnDescription(long vmID, JOBJECT64 acParent, jint column) {
337 
338         if (theWindowsAccessBridge != 0) {
339             return (JOBJECT64)theWindowsAccessBridge->getAccessibleTableColumnDescription(
340                                                                                vmID,
341                                                                                acParent,
342                                                                                column);
343         }
344         return (JOBJECT64)0;
345     }
346 
getAccessibleTableRowSelectionCount(long vmID,JOBJECT64 accessibleTable)347     jint getAccessibleTableRowSelectionCount(long vmID, JOBJECT64 accessibleTable) {
348         if (theWindowsAccessBridge != 0) {
349             return theWindowsAccessBridge->getAccessibleTableRowSelectionCount(vmID, accessibleTable);
350         }
351         return -1;
352     }
353 
isAccessibleTableRowSelected(long vmID,JOBJECT64 accessibleTable,jint row)354     BOOL isAccessibleTableRowSelected(long vmID, JOBJECT64 accessibleTable, jint row) {
355         if (theWindowsAccessBridge != 0 ) {
356             return theWindowsAccessBridge->isAccessibleTableRowSelected(vmID, accessibleTable, row);
357         }
358         return FALSE;
359     }
360 
getAccessibleTableRowSelections(long vmID,JOBJECT64 accessibleTable,jint count,jint * selections)361     BOOL getAccessibleTableRowSelections(long vmID, JOBJECT64 accessibleTable, jint count, jint *selections) {
362         if (theWindowsAccessBridge != 0 ) {
363             return theWindowsAccessBridge->getAccessibleTableRowSelections(vmID, accessibleTable, count,
364                                                                            selections);
365         }
366         return FALSE;
367     }
368 
369 
getAccessibleTableColumnSelectionCount(long vmID,JOBJECT64 accessibleTable)370     jint getAccessibleTableColumnSelectionCount(long vmID, JOBJECT64 accessibleTable) {
371         if (theWindowsAccessBridge != 0 ) {
372             return theWindowsAccessBridge->getAccessibleTableColumnSelectionCount(vmID, accessibleTable);
373         }
374         return -1;
375     }
376 
isAccessibleTableColumnSelected(long vmID,JOBJECT64 accessibleTable,jint column)377     BOOL isAccessibleTableColumnSelected(long vmID, JOBJECT64 accessibleTable, jint column) {
378         if (theWindowsAccessBridge != 0 ) {
379             return theWindowsAccessBridge->isAccessibleTableColumnSelected(vmID, accessibleTable, column);
380         }
381         return FALSE;
382     }
383 
getAccessibleTableColumnSelections(long vmID,JOBJECT64 accessibleTable,jint count,jint * selections)384     BOOL getAccessibleTableColumnSelections(long vmID, JOBJECT64 accessibleTable, jint count, jint *selections) {
385         if (theWindowsAccessBridge != 0 ) {
386             return theWindowsAccessBridge->getAccessibleTableColumnSelections(vmID, accessibleTable, count,
387                                                                               selections);
388         }
389         return FALSE;
390     }
391 
getAccessibleTableRow(long vmID,JOBJECT64 accessibleTable,jint index)392     jint getAccessibleTableRow(long vmID, JOBJECT64 accessibleTable, jint index) {
393         if (theWindowsAccessBridge != 0 ) {
394             return theWindowsAccessBridge->getAccessibleTableRow(vmID, accessibleTable, index);
395         }
396         return -1;
397     }
398 
getAccessibleTableColumn(long vmID,JOBJECT64 accessibleTable,jint index)399     jint getAccessibleTableColumn(long vmID, JOBJECT64 accessibleTable, jint index) {
400         if (theWindowsAccessBridge != 0 ) {
401             return theWindowsAccessBridge->getAccessibleTableColumn(vmID, accessibleTable, index);
402         }
403         return -1;
404     }
405 
getAccessibleTableIndex(long vmID,JOBJECT64 accessibleTable,jint row,jint column)406     jint getAccessibleTableIndex(long vmID, JOBJECT64 accessibleTable, jint row, jint column) {
407         if (theWindowsAccessBridge != 0 ) {
408             return theWindowsAccessBridge->getAccessibleTableIndex(vmID, accessibleTable, row, column);
409         }
410         return -1;
411     }
412 
413     /* --------- end AccessibleTable routines ------- */
414 
415     // --------- AccessibleRelationSet methods
416 
getAccessibleRelationSet(long vmID,JOBJECT64 accessibleContext,AccessibleRelationSetInfo * relationSetInfo)417     BOOL getAccessibleRelationSet(long vmID, JOBJECT64 accessibleContext,
418                                   AccessibleRelationSetInfo *relationSetInfo) {
419         if (theWindowsAccessBridge != 0) {
420             return theWindowsAccessBridge->getAccessibleRelationSet(vmID, accessibleContext, relationSetInfo);
421         }
422         return FALSE;
423     }
424 
425     // --------- AccessibleHypertext methods
426 
getAccessibleHypertext(long vmID,JOBJECT64 accessibleContext,AccessibleHypertextInfo * accessibleHypertextInfo)427     BOOL getAccessibleHypertext(long vmID, JOBJECT64 accessibleContext,
428                                 AccessibleHypertextInfo *accessibleHypertextInfo) {
429         if (theWindowsAccessBridge != 0) {
430             return theWindowsAccessBridge->getAccessibleHypertext(vmID, accessibleContext,
431                                                                   accessibleHypertextInfo);
432         }
433         return FALSE;
434     }
435 
activateAccessibleHyperlink(long vmID,JOBJECT64 accessibleContext,JOBJECT64 accessibleHyperlink)436     BOOL activateAccessibleHyperlink(long vmID, JOBJECT64 accessibleContext, JOBJECT64 accessibleHyperlink) {
437         if (theWindowsAccessBridge != 0) {
438             return theWindowsAccessBridge->activateAccessibleHyperlink(vmID, accessibleContext,
439                                                                        accessibleHyperlink);
440         }
441         return FALSE;
442     }
443 
getAccessibleHyperlinkCount(const long vmID,const AccessibleContext accessibleContext)444     jint getAccessibleHyperlinkCount(const long vmID,
445                                      const AccessibleContext accessibleContext) {
446 
447         if (theWindowsAccessBridge != 0) {
448             return theWindowsAccessBridge->getAccessibleHyperlinkCount(vmID, accessibleContext);
449         }
450         return -1;
451     }
452 
453 
getAccessibleHypertextExt(const long vmID,const AccessibleContext accessibleContext,const jint nStartIndex,AccessibleHypertextInfo * hypertextInfo)454     BOOL getAccessibleHypertextExt(const long vmID,
455                                    const AccessibleContext accessibleContext,
456                                    const jint nStartIndex,
457                                    /* OUT */ AccessibleHypertextInfo *hypertextInfo) {
458 
459         if (theWindowsAccessBridge != 0) {
460             return theWindowsAccessBridge->getAccessibleHypertextExt(vmID,
461                                                                      accessibleContext,
462                                                                      nStartIndex,
463                                                                      hypertextInfo);
464         }
465         return FALSE;
466     }
467 
468 
getAccessibleHypertextLinkIndex(const long vmID,const AccessibleHypertext hypertext,const jint nIndex)469     jint getAccessibleHypertextLinkIndex(const long vmID,
470                                          const AccessibleHypertext hypertext,
471                                          const jint nIndex) {
472 
473         if (theWindowsAccessBridge != 0) {
474             return theWindowsAccessBridge->getAccessibleHypertextLinkIndex(vmID,
475                                                                            hypertext,
476                                                                            nIndex);
477         }
478         return -1;
479     }
480 
481 
getAccessibleHyperlink(const long vmID,const AccessibleHypertext hypertext,const jint nIndex,AccessibleHyperlinkInfo * hyperlinkInfo)482     BOOL getAccessibleHyperlink(const long vmID,
483                                 const AccessibleHypertext hypertext,
484                                 const jint nIndex,
485                                 /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo) {
486 
487         if (theWindowsAccessBridge != 0) {
488             return theWindowsAccessBridge->getAccessibleHyperlink(vmID,
489                                                                   hypertext,
490                                                                   nIndex,
491                                                                   hyperlinkInfo);
492         }
493         return FALSE;
494     }
495 
496 
497     /* Accessible KeyBindings, Icons and Actions */
getAccessibleKeyBindings(long vmID,JOBJECT64 accessibleContext,AccessibleKeyBindings * keyBindings)498     BOOL getAccessibleKeyBindings(long vmID, JOBJECT64 accessibleContext, AccessibleKeyBindings *keyBindings) {
499 
500         if (theWindowsAccessBridge != 0) {
501             return theWindowsAccessBridge->getAccessibleKeyBindings(vmID, accessibleContext, keyBindings);
502         }
503         return FALSE;
504     }
505 
getAccessibleIcons(long vmID,JOBJECT64 accessibleContext,AccessibleIcons * icons)506     BOOL getAccessibleIcons(long vmID, JOBJECT64 accessibleContext, AccessibleIcons *icons) {
507 
508         if (theWindowsAccessBridge != 0) {
509             return theWindowsAccessBridge->getAccessibleIcons(vmID, accessibleContext, icons);
510         }
511         return FALSE;
512     }
513 
getAccessibleActions(long vmID,JOBJECT64 accessibleContext,AccessibleActions * actions)514     BOOL getAccessibleActions(long vmID, JOBJECT64 accessibleContext, AccessibleActions *actions) {
515 
516         if (theWindowsAccessBridge != 0) {
517             return theWindowsAccessBridge->getAccessibleActions(vmID, accessibleContext, actions);
518         }
519         return FALSE;
520     }
521 
doAccessibleActions(long vmID,JOBJECT64 accessibleContext,AccessibleActionsToDo * actionsToDo,jint * failure)522     BOOL doAccessibleActions(long vmID, JOBJECT64 accessibleContext, AccessibleActionsToDo *actionsToDo,
523                              jint *failure) {
524 
525         if (theWindowsAccessBridge != 0) {
526             return theWindowsAccessBridge->doAccessibleActions(vmID, accessibleContext, actionsToDo,
527                                                                failure);
528         }
529         return FALSE;
530     }
531 
532     /**
533      * Additional methods for Teton
534      */
535 
536     /**
537      * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
538      * whether successful.
539      *
540      * Bug ID 4916682 - Implement JAWS AccessibleName policy
541      */
getVirtualAccessibleName(long vmID,AccessibleContext accessibleContext,wchar_t * name,int len)542     BOOL getVirtualAccessibleName(long vmID, AccessibleContext accessibleContext, wchar_t *name, int len) {
543         if (theWindowsAccessBridge != 0) {
544             return theWindowsAccessBridge->getVirtualAccessibleName(vmID, accessibleContext, name, len);
545         }
546         return FALSE;
547     }
548 
549     /**
550      * Request focus for a component. Returns whether successful;
551      *
552      * Bug ID 4944757 - requestFocus method needed
553      */
requestFocus(long vmID,AccessibleContext accessibleContext)554     BOOL requestFocus(long vmID, AccessibleContext accessibleContext) {
555         if (theWindowsAccessBridge != 0) {
556             return theWindowsAccessBridge->requestFocus(vmID, accessibleContext);
557         }
558         return FALSE;
559     }
560 
561     /**
562      * Selects text between two indices.  Selection includes the text at the start index
563      * and the text at the end index. Returns whether successful;
564      *
565      * Bug ID 4944758 - selectTextRange method needed
566      */
selectTextRange(long vmID,AccessibleContext accessibleContext,int startIndex,int endIndex)567     BOOL selectTextRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex) {
568         if (theWindowsAccessBridge != 0) {
569             return theWindowsAccessBridge->selectTextRange(vmID, accessibleContext, startIndex, endIndex);
570         }
571         return FALSE;
572     }
573 
574     /**
575      * Get text attributes between two indices.  The attribute list includes the text at the
576      * start index and the text at the end index. Returns whether successful;
577      *
578      * Bug ID 4944761 - getTextAttributes between two indices method needed
579      */
getTextAttributesInRange(long vmID,AccessibleContext accessibleContext,int startIndex,int endIndex,AccessibleTextAttributesInfo * attributes,short * len)580     BOOL getTextAttributesInRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex,
581                                   AccessibleTextAttributesInfo *attributes, short *len) {
582         if (theWindowsAccessBridge != 0) {
583             return theWindowsAccessBridge->getTextAttributesInRange(vmID, accessibleContext,
584                                                                     startIndex, endIndex, attributes, len);
585         }
586         return FALSE;
587     }
588 
589     /**
590      * Gets the number of visible children of a component.  Returns -1 on error.
591      *
592      * Bug ID 4944762- getVisibleChildren for list-like components needed
593      */
getVisibleChildrenCount(long vmID,AccessibleContext accessibleContext)594     int getVisibleChildrenCount(long vmID, AccessibleContext accessibleContext) {
595         if (theWindowsAccessBridge != 0) {
596             return theWindowsAccessBridge->getVisibleChildrenCount(vmID, accessibleContext);
597         }
598         return FALSE;
599     }
600 
601     /**
602      * Gets the visible children of an AccessibleContext. Returns whether successful;
603      *
604      * Bug ID 4944762- getVisibleChildren for list-like components needed
605      */
getVisibleChildren(long vmID,AccessibleContext accessibleContext,int startIndex,VisibleChildrenInfo * visibleChildrenInfo)606     BOOL getVisibleChildren(long vmID, AccessibleContext accessibleContext, int startIndex,
607                             VisibleChildrenInfo *visibleChildrenInfo) {
608         if (theWindowsAccessBridge != 0) {
609             return theWindowsAccessBridge->getVisibleChildren(vmID, accessibleContext, startIndex,
610                                                               visibleChildrenInfo);
611         }
612         return FALSE;
613     }
614 
615     /**
616      * Set the caret to a text position. Returns whether successful;
617      *
618      * Bug ID 4944770 - setCaretPosition method needed
619      */
setCaretPosition(const long vmID,const AccessibleContext accessibleContext,const int position)620     BOOL setCaretPosition(const long vmID, const AccessibleContext accessibleContext,
621                           const int position) {
622         if (theWindowsAccessBridge != 0) {
623             return theWindowsAccessBridge->setCaretPosition(vmID, accessibleContext, position);
624         }
625         return FALSE;
626     }
627 
628     // -------- Accessible Text methods -------------
629 
getAccessibleTextInfo(long vmID,JOBJECT64 AccessibleContext,AccessibleTextInfo * textInfo,jint x,jint y)630     BOOL getAccessibleTextInfo(long vmID, JOBJECT64 AccessibleContext,
631                                AccessibleTextInfo *textInfo, jint x, jint y) {
632         if (theWindowsAccessBridge != 0) {
633             return theWindowsAccessBridge->getAccessibleTextInfo(
634                                                                  vmID,
635                                                                  AccessibleContext,
636                                                                  textInfo, x, y);
637         }
638         return FALSE;
639     }
640 
getAccessibleTextItems(long vmID,JOBJECT64 AccessibleContext,AccessibleTextItemsInfo * textItems,jint index)641     BOOL getAccessibleTextItems(long vmID, JOBJECT64 AccessibleContext,
642                                 AccessibleTextItemsInfo *textItems, jint index) {
643         if (theWindowsAccessBridge != 0) {
644             return theWindowsAccessBridge->getAccessibleTextItems(
645                                                                   vmID,
646                                                                   AccessibleContext,
647                                                                   textItems, index);
648         }
649         return FALSE;
650     }
651 
getAccessibleTextSelectionInfo(long vmID,JOBJECT64 AccessibleContext,AccessibleTextSelectionInfo * selectionInfo)652     BOOL getAccessibleTextSelectionInfo(long vmID, JOBJECT64 AccessibleContext,
653                                         AccessibleTextSelectionInfo *selectionInfo) {
654         if (theWindowsAccessBridge != 0) {
655             return theWindowsAccessBridge->getAccessibleTextSelectionInfo(
656                                                                           vmID,
657                                                                           AccessibleContext,
658                                                                           selectionInfo);
659         }
660         return FALSE;
661     }
662 
getAccessibleTextAttributes(long vmID,JOBJECT64 AccessibleContext,jint index,AccessibleTextAttributesInfo * attributes)663     BOOL getAccessibleTextAttributes(long vmID, JOBJECT64 AccessibleContext,
664                                      jint index, AccessibleTextAttributesInfo *attributes) {
665         if (theWindowsAccessBridge != 0) {
666             return theWindowsAccessBridge->getAccessibleTextAttributes(
667                                                                        vmID,
668                                                                        AccessibleContext,
669                                                                        index, attributes);
670         }
671         return FALSE;
672     }
673 
getAccessibleTextRect(long vmID,JOBJECT64 AccessibleContext,AccessibleTextRectInfo * rectInfo,jint index)674     BOOL getAccessibleTextRect(long vmID, JOBJECT64 AccessibleContext,
675                                AccessibleTextRectInfo *rectInfo, jint index) {
676         if (theWindowsAccessBridge != 0) {
677             return theWindowsAccessBridge->getAccessibleTextRect(
678                                                                  vmID,
679                                                                  AccessibleContext,
680                                                                  rectInfo, index);
681         }
682         return FALSE;
683     }
684 
getCaretLocation(long vmID,JOBJECT64 AccessibleContext,AccessibleTextRectInfo * rectInfo,jint index)685     BOOL getCaretLocation(long vmID, JOBJECT64 AccessibleContext,
686                           AccessibleTextRectInfo *rectInfo, jint index) {
687         if (theWindowsAccessBridge != 0) {
688             return theWindowsAccessBridge->getCaretLocation(vmID,
689                                                             AccessibleContext,
690                                                             rectInfo, index);
691         }
692         return FALSE;
693     }
694 
getEventsWaiting()695     int getEventsWaiting() {
696         if (theWindowsAccessBridge != 0) {
697             return theWindowsAccessBridge->getEventsWaiting();
698         }
699         return FALSE;
700     }
701 
getAccessibleTextLineBounds(long vmID,JOBJECT64 AccessibleContext,jint index,jint * startIndex,jint * endIndex)702     BOOL getAccessibleTextLineBounds(long vmID, JOBJECT64 AccessibleContext,
703                                      jint index, jint *startIndex, jint *endIndex) {
704         if (theWindowsAccessBridge != 0) {
705             return theWindowsAccessBridge->getAccessibleTextLineBounds(
706                                                                        vmID,
707                                                                        AccessibleContext,
708                                                                        index, startIndex, endIndex);
709         }
710         return FALSE;
711     }
712 
getAccessibleTextRange(long vmID,JOBJECT64 AccessibleContext,jint start,jint end,wchar_t * text,short len)713     BOOL getAccessibleTextRange(long vmID, JOBJECT64 AccessibleContext,
714                                 jint start, jint end, wchar_t *text, short len) {
715         if (theWindowsAccessBridge != 0) {
716             return theWindowsAccessBridge->getAccessibleTextRange(
717                                                                   vmID,
718                                                                   AccessibleContext,
719                                                                   start, end, text, len);
720         }
721         return FALSE;
722     }
723 
724 
725     // -------- Accessible Value methods -------------
726 
getCurrentAccessibleValueFromContext(long vmID,JOBJECT64 AccessibleContext,wchar_t * value,short len)727     BOOL getCurrentAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext,
728                                               wchar_t *value, short len) {
729         if (theWindowsAccessBridge != 0) {
730             return theWindowsAccessBridge->getCurrentAccessibleValueFromContext(
731                                                                                 vmID, AccessibleContext, value, len);
732         }
733         return FALSE;
734     }
735 
getMaximumAccessibleValueFromContext(long vmID,JOBJECT64 AccessibleContext,wchar_t * value,short len)736     BOOL getMaximumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext,
737                                               wchar_t *value, short len) {
738         if (theWindowsAccessBridge != 0) {
739             return theWindowsAccessBridge->getMaximumAccessibleValueFromContext(
740                                                                                 vmID, AccessibleContext, value, len);
741         }
742         return FALSE;
743     }
744 
getMinimumAccessibleValueFromContext(long vmID,JOBJECT64 AccessibleContext,wchar_t * value,short len)745     BOOL getMinimumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext,
746                                               wchar_t *value, short len) {
747         if (theWindowsAccessBridge != 0) {
748             return theWindowsAccessBridge->getMinimumAccessibleValueFromContext(
749                                                                                 vmID, AccessibleContext, value, len);
750         }
751         return FALSE;
752     }
753 
754     // -------- Accessible Selection methods -------------
755 
addAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext,int i)756     void addAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i) {
757         if (theWindowsAccessBridge != 0) {
758             theWindowsAccessBridge->addAccessibleSelectionFromContext(
759                                                                       vmID, AccessibleContext, i);
760         }
761     }
762 
clearAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext)763     void clearAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext) {
764         if (theWindowsAccessBridge != 0) {
765             theWindowsAccessBridge->clearAccessibleSelectionFromContext(
766                                                                         vmID, AccessibleContext);
767         }
768     }
769 
getAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext,int i)770     JOBJECT64 getAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i) {
771         if (theWindowsAccessBridge != 0) {
772             return theWindowsAccessBridge->getAccessibleSelectionFromContext(
773                                                                              vmID, AccessibleContext, i);
774         }
775         return (JOBJECT64) 0;
776     }
777 
getAccessibleSelectionCountFromContext(long vmID,JOBJECT64 AccessibleContext)778     int getAccessibleSelectionCountFromContext(long vmID, JOBJECT64 AccessibleContext) {
779         if (theWindowsAccessBridge != 0) {
780             return theWindowsAccessBridge->getAccessibleSelectionCountFromContext(
781                                                                                   vmID, AccessibleContext);
782         }
783         return -1;
784     }
785 
isAccessibleChildSelectedFromContext(long vmID,JOBJECT64 AccessibleContext,int i)786     BOOL isAccessibleChildSelectedFromContext(long vmID, JOBJECT64 AccessibleContext, int i) {
787         if (theWindowsAccessBridge != 0) {
788             return theWindowsAccessBridge->isAccessibleChildSelectedFromContext(
789                                                                                 vmID, AccessibleContext, i);
790         }
791         return FALSE;
792     }
793 
removeAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext,int i)794     void removeAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i) {
795         if (theWindowsAccessBridge != 0) {
796             theWindowsAccessBridge->removeAccessibleSelectionFromContext(
797                                                                          vmID, AccessibleContext, i);
798         }
799     }
800 
selectAllAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext)801     void selectAllAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext) {
802         if (theWindowsAccessBridge != 0) {
803             theWindowsAccessBridge->selectAllAccessibleSelectionFromContext(
804                                                                             vmID, AccessibleContext);
805         }
806     }
807 
808 
809     // -------- Event Handler methods -------------
810 
811 #define SET_EVENT_FP(function, callbackFP)          \
812     void function(callbackFP fp) {                  \
813         if (theWindowsAccessBridge != 0) {          \
814             theWindowsAccessBridge->function(fp);   \
815         }                                           \
816 }
817 
setJavaShutdownFP(AccessBridge_JavaShutdownFP fp)818     void setJavaShutdownFP(AccessBridge_JavaShutdownFP fp) {
819         if (theWindowsAccessBridge != 0) {
820             theWindowsAccessBridge->setJavaShutdownFP(fp);
821         }
822     }
823 
824         SET_EVENT_FP(setPropertyChangeFP, AccessBridge_PropertyChangeFP)
825         SET_EVENT_FP(setFocusGainedFP, AccessBridge_FocusGainedFP)
826         SET_EVENT_FP(setFocusLostFP, AccessBridge_FocusLostFP)
827         SET_EVENT_FP(setCaretUpdateFP, AccessBridge_CaretUpdateFP)
828         SET_EVENT_FP(setMouseClickedFP, AccessBridge_MouseClickedFP)
829         SET_EVENT_FP(setMouseEnteredFP, AccessBridge_MouseEnteredFP)
830         SET_EVENT_FP(setMouseExitedFP, AccessBridge_MouseExitedFP)
831         SET_EVENT_FP(setMousePressedFP, AccessBridge_MousePressedFP)
832         SET_EVENT_FP(setMouseReleasedFP, AccessBridge_MouseReleasedFP)
833         SET_EVENT_FP(setMenuCanceledFP, AccessBridge_MenuCanceledFP)
834         SET_EVENT_FP(setMenuDeselectedFP, AccessBridge_MenuDeselectedFP)
835         SET_EVENT_FP(setMenuSelectedFP, AccessBridge_MenuSelectedFP)
836         SET_EVENT_FP(setPopupMenuCanceledFP, AccessBridge_PopupMenuCanceledFP)
837         SET_EVENT_FP(setPopupMenuWillBecomeInvisibleFP, AccessBridge_PopupMenuWillBecomeInvisibleFP)
838         SET_EVENT_FP(setPopupMenuWillBecomeVisibleFP, AccessBridge_PopupMenuWillBecomeVisibleFP)
839 
840         SET_EVENT_FP(setPropertyNameChangeFP, AccessBridge_PropertyNameChangeFP)
841         SET_EVENT_FP(setPropertyDescriptionChangeFP, AccessBridge_PropertyDescriptionChangeFP)
842         SET_EVENT_FP(setPropertyStateChangeFP, AccessBridge_PropertyStateChangeFP)
843         SET_EVENT_FP(setPropertyValueChangeFP, AccessBridge_PropertyValueChangeFP)
844         SET_EVENT_FP(setPropertySelectionChangeFP, AccessBridge_PropertySelectionChangeFP)
845         SET_EVENT_FP(setPropertyTextChangeFP, AccessBridge_PropertyTextChangeFP)
846         SET_EVENT_FP(setPropertyCaretChangeFP, AccessBridge_PropertyCaretChangeFP)
847         SET_EVENT_FP(setPropertyVisibleDataChangeFP, AccessBridge_PropertyVisibleDataChangeFP)
848         SET_EVENT_FP(setPropertyChildChangeFP, AccessBridge_PropertyChildChangeFP)
849         SET_EVENT_FP(setPropertyActiveDescendentChangeFP, AccessBridge_PropertyActiveDescendentChangeFP)
850 
851         SET_EVENT_FP(setPropertyTableModelChangeFP, AccessBridge_PropertyTableModelChangeFP)
852 
853 #ifdef __cplusplus
854         }
855 #endif
856