1/*
2 * Copyright (c) 2005, 2015, 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 * A DLL which is loaded by Windows executables to handle communication
28 * between Java VMs purposes of Accessbility.
29 */
30
31#ifndef __WinAccessBridge_H__
32#define __WinAccessBridge_H__
33
34#include <windows.h>
35#include "AccessBridgePackages.h"
36#include "AccessBridgeEventHandler.h"
37#include "AccessBridgeJavaVMInstance.h"
38#include "AccessBridgeMessageQueue.h"
39
40
41extern "C" {
42    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason,
43                        LPVOID lpvReserved);
44    void AppendToCallOutput(char *s);
45    BOOL CALLBACK AccessBridgeDialogProc(HWND hDlg, UINT message,
46                                         UINT wParam, LONG lParam);
47    HWND getTopLevelHWND(HWND descendent);
48}
49
50LRESULT CALLBACK WinAccessBridgeWindowProc(HWND hWnd, UINT message,
51                                           UINT wParam, LONG lParam);
52
53BOOL CALLBACK DeleteItemProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
54
55/**
56 * The WinAccessBridge class.  The core of the Windows AT AccessBridge dll
57 */
58class WinAccessBridge {
59    HINSTANCE windowsInstance;
60    HWND dialogWindow;
61    AccessBridgeJavaVMInstance *javaVMs;
62    AccessBridgeEventHandler *eventHandler;
63    AccessBridgeMessageQueue *messageQueue;
64
65public:
66    WinAccessBridge(HINSTANCE hInstance);
67    ~WinAccessBridge();
68    BOOL initWindow();
69
70    HWND showWinAccessBridgeGUI(int showCommand);
71
72    // IPC with the Java AccessBridge DLL
73    LRESULT rendezvousWithNewJavaDLL(HWND JavaBridgeDLLwindow, long vmID);
74
75    void sendPackage(char *buffer, long bufsize, HWND destWindow);
76    BOOL sendMemoryPackage(char *buffer, long bufsize, HWND destWindow);
77    BOOL queuePackage(char *buffer, long bufsize);
78    BOOL receiveAQueuedPackage();
79    void preProcessPackage(char *buffer, long bufsize);
80    void processPackage(char *buffer, long bufsize);
81    void JavaVMDestroyed(HWND VMBridgeDLLWindow);
82
83    // Java VM object memory management
84    void releaseJavaObject(long vmID, JOBJECT64 object);
85
86    // Version info
87    BOOL getVersionInfo(long vmID, AccessBridgeVersionInfo *info);
88
89    // HWND management methods
90    HWND getNextJavaWindow(HWND previous);
91    BOOL isJavaWindow(HWND window);
92    BOOL getAccessibleContextFromHWND(HWND window, long *vmID, JOBJECT64 *AccessibleContext);
93    HWND getHWNDFromAccessibleContext(long vmID, JOBJECT64 accessibleContext);
94
95    /* Additional utility methods */
96    BOOL isSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
97
98    BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text);
99
100    AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext,
101                                         const wchar_t *role);
102
103    AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext);
104
105    AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext,
106                                                 const wchar_t *role);
107
108    int getObjectDepth (const long vmID, const AccessibleContext accessibleContext);
109
110    AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext);
111
112
113    // Accessible Context methods
114    BOOL getAccessibleContextAt(long vmID, JOBJECT64 AccessibleContextParent,
115                                jint x, jint y, JOBJECT64 *AccessibleContext);
116    BOOL getAccessibleContextWithFocus(HWND window, long *vmID, JOBJECT64 *AccessibleContext);
117    BOOL getAccessibleContextInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleContextInfo *info);
118    JOBJECT64 getAccessibleChildFromContext(long vmID, JOBJECT64 AccessibleContext, jint childIndex);
119    JOBJECT64 getAccessibleParentFromContext(long vmID, JOBJECT64 AccessibleContext);
120
121    /* begin AccessibleTable methods */
122    BOOL getAccessibleTableInfo(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo);
123    BOOL getAccessibleTableCellInfo(long vmID, JOBJECT64 accessibleTable, jint row, jint column,
124                                    AccessibleTableCellInfo *tableCellInfo);
125
126    BOOL getAccessibleTableRowHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo);
127    BOOL getAccessibleTableColumnHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo);
128
129    JOBJECT64 getAccessibleTableRowDescription(long vmID, JOBJECT64 acParent, jint row);
130    JOBJECT64 getAccessibleTableColumnDescription(long vmID, JOBJECT64 acParent, jint column);
131
132    jint getAccessibleTableRowSelectionCount(long vmID, JOBJECT64 accessibleTable);
133    BOOL isAccessibleTableRowSelected(long vmID, JOBJECT64 accessibleTable, jint row);
134    BOOL getAccessibleTableRowSelections(long vmID, JOBJECT64 accessibleTable, jint count,
135                                         jint *selections);
136
137    jint getAccessibleTableColumnSelectionCount(long vmID, JOBJECT64 accessibleTable);
138    BOOL isAccessibleTableColumnSelected(long vmID, JOBJECT64 accessibleTable, jint column);
139    BOOL getAccessibleTableColumnSelections(long vmID, JOBJECT64 accessibleTable, jint count,
140                                            jint *selections);
141
142    jint getAccessibleTableRow(long vmID, JOBJECT64 accessibleTable, jint index);
143    jint getAccessibleTableColumn(long vmID, JOBJECT64 accessibleTable, jint index);
144    jint getAccessibleTableIndex(long vmID, JOBJECT64 accessibleTable, jint row, jint column);
145
146    /* end AccessibleTable methods */
147
148    // --------- AccessibleRelationSet methods
149    BOOL getAccessibleRelationSet(long vmID, JOBJECT64 accessibleContext, AccessibleRelationSetInfo *relationSet);
150
151    // --------- AccessibleHypertext methods
152    BOOL getAccessibleHypertext(long vmID, JOBJECT64 accessibleContext, AccessibleHypertextInfo *hypertextInfo);
153    BOOL activateAccessibleHyperlink(long vmID, JOBJECT64 accessibleContext, JOBJECT64 accessibleHyperlink);
154
155    jint getAccessibleHyperlinkCount(const long vmID,
156                                     const AccessibleContext accessibleContext);
157
158    BOOL getAccessibleHypertextExt(const long vmID,
159                                   const AccessibleContext accessibleContext,
160                                   const jint nStartIndex,
161                                   /* OUT */ AccessibleHypertextInfo *hypertextInfo);
162
163    jint getAccessibleHypertextLinkIndex(const long vmID,
164                                         const AccessibleHypertext hypertext,
165                                         const jint nIndex);
166
167    BOOL getAccessibleHyperlink(const long vmID,
168                                const AccessibleHypertext hypertext,
169                                const jint nIndex,
170                                /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo);
171
172
173    /* Accessible KeyBindings, Icons and Actions */
174    BOOL getAccessibleKeyBindings(long vmID, JOBJECT64 accessibleContext,
175                                  AccessibleKeyBindings *keyBindings);
176
177    BOOL getAccessibleIcons(long vmID, JOBJECT64 accessibleContext,
178                            AccessibleIcons *icons);
179
180    BOOL getAccessibleActions(long vmID, JOBJECT64 accessibleContext,
181                              AccessibleActions *actions);
182
183    BOOL doAccessibleActions(long vmID, JOBJECT64 accessibleContext,
184                             AccessibleActionsToDo *actionsToDo, jint *failure);
185
186
187    // Accessible Text methods
188    BOOL getAccessibleTextInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleTextInfo *textInfo, jint x, jint y);
189    BOOL getAccessibleTextItems(long vmID, JOBJECT64 AccessibleContext, AccessibleTextItemsInfo *textItems, jint index);
190    BOOL getAccessibleTextSelectionInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleTextSelectionInfo *selectionInfo);
191    BOOL getAccessibleTextAttributes(long vmID, JOBJECT64 AccessibleContext, jint index, AccessibleTextAttributesInfo *attributes);
192    BOOL getAccessibleTextRect(long vmID, JOBJECT64 AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
193    BOOL getAccessibleTextLineBounds(long vmID, JOBJECT64 AccessibleContext, jint index, jint *startIndex, jint *endIndex);
194    BOOL getAccessibleTextRange(long vmID, JOBJECT64 AccessibleContext, jint start, jint end, wchar_t *text, short len);
195
196    // Accessible Value methods
197    BOOL getCurrentAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext, wchar_t *value, short len);
198    BOOL getMaximumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext, wchar_t *value, short len);
199    BOOL getMinimumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext, wchar_t *value, short len);
200
201    // Accessible Selection methods
202    void addAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i);
203    void clearAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext);
204    JOBJECT64 getAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i);
205    int getAccessibleSelectionCountFromContext(long vmID, JOBJECT64 AccessibleContext);
206    BOOL isAccessibleChildSelectedFromContext(long vmID, JOBJECT64 AccessibleContext, int i);
207    void removeAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i);
208    void selectAllAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext);
209
210    // Event handling methods
211    void addJavaEventNotification(jlong type);
212    void removeJavaEventNotification(jlong type);
213    void addAccessibilityEventNotification(jlong type);
214    void removeAccessibilityEventNotification(jlong type);
215
216    void setPropertyChangeFP(AccessBridge_PropertyChangeFP fp);
217    void setJavaShutdownFP(AccessBridge_JavaShutdownFP fp);
218    void setFocusGainedFP(AccessBridge_FocusGainedFP fp);
219    void setFocusLostFP(AccessBridge_FocusLostFP fp);
220    void setCaretUpdateFP(AccessBridge_CaretUpdateFP fp);
221    void setMouseClickedFP(AccessBridge_MouseClickedFP fp);
222    void setMouseEnteredFP(AccessBridge_MouseEnteredFP fp);
223    void setMouseExitedFP(AccessBridge_MouseExitedFP fp);
224    void setMousePressedFP(AccessBridge_MousePressedFP fp);
225    void setMouseReleasedFP(AccessBridge_MouseReleasedFP fp);
226    void setMenuCanceledFP(AccessBridge_MenuCanceledFP fp);
227    void setMenuDeselectedFP(AccessBridge_MenuDeselectedFP fp);
228    void setMenuSelectedFP(AccessBridge_MenuSelectedFP fp);
229    void setPopupMenuCanceledFP(AccessBridge_PopupMenuCanceledFP fp);
230    void setPopupMenuWillBecomeInvisibleFP(AccessBridge_PopupMenuWillBecomeInvisibleFP fp);
231    void setPopupMenuWillBecomeVisibleFP(AccessBridge_PopupMenuWillBecomeVisibleFP fp);
232
233    void setPropertyNameChangeFP(AccessBridge_PropertyNameChangeFP fp);
234    void setPropertyDescriptionChangeFP(AccessBridge_PropertyDescriptionChangeFP fp);
235    void setPropertyStateChangeFP(AccessBridge_PropertyStateChangeFP fp);
236    void setPropertyValueChangeFP(AccessBridge_PropertyValueChangeFP fp);
237    void setPropertySelectionChangeFP(AccessBridge_PropertySelectionChangeFP fp);
238    void setPropertyTextChangeFP(AccessBridge_PropertyTextChangeFP fp);
239    void setPropertyCaretChangeFP(AccessBridge_PropertyCaretChangeFP fp);
240    void setPropertyVisibleDataChangeFP(AccessBridge_PropertyVisibleDataChangeFP fp);
241    void setPropertyChildChangeFP(AccessBridge_PropertyChildChangeFP fp);
242    void setPropertyActiveDescendentChangeFP(AccessBridge_PropertyActiveDescendentChangeFP fp);
243
244    void setPropertyTableModelChangeFP(AccessBridge_PropertyTableModelChangeFP fp);
245
246    /**
247     * Additional methods for Teton
248     */
249
250    /**
251     * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
252     * whether successful.
253     *
254     * Bug ID 4916682 - Implement JAWS AccessibleName policy
255     */
256    BOOL getVirtualAccessibleName(long vmID, AccessibleContext accessibleContext, wchar_t *name, int len);
257
258    /**
259     * Request focus for a component. Returns whether successful;
260     *
261     * Bug ID 4944757 - requestFocus method needed
262     */
263    BOOL requestFocus(long vmID, AccessibleContext accessibleContext);
264
265    /**
266     * Selects text between two indices.  Selection includes the text at the start index
267     * and the text at the end index. Returns whether successful;
268     *
269     * Bug ID 4944758 - selectTextRange method needed
270     */
271    BOOL selectTextRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex);
272
273    /**
274     * Get text attributes between two indices.  The attribute list includes the text at the
275     * start index and the text at the end index. Returns whether successful;
276     *
277     * Bug ID 4944761 - getTextAttributes between two indices method needed
278     */
279    BOOL getTextAttributesInRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex,
280                                  AccessibleTextAttributesInfo *attributes, short *len);
281
282    /**
283     * Gets number of visible children of a component. Returns -1 on error.
284     *
285     * Bug ID 4944762- getVisibleChildren for list-like components needed
286     */
287    int getVisibleChildrenCount(long vmID, AccessibleContext accessibleContext);
288
289    /**
290     * Gets the visible children of an AccessibleContext. Returns whether successful;
291     *
292     * Bug ID 4944762- getVisibleChildren for list-like components needed
293     */
294    BOOL getVisibleChildren(long vmID, AccessibleContext accessibleContext, int startIndex,
295                            VisibleChildrenInfo *visibleChildrenInfo);
296
297    /**
298     * Set the caret to a text position. Returns whether successful;
299     *
300     * Bug ID 4944770 - setCaretPosition method needed
301     */
302    BOOL setCaretPosition(long vmID, AccessibleContext accessibleContext, int position);
303
304
305    /**
306     * Gets the text caret bounding rectangle
307     */
308    BOOL getCaretLocation(long vmID, JOBJECT64 AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
309
310    /**
311     * Gets number of events waiting in the message queue
312     */
313    int getEventsWaiting();
314
315};
316
317#endif
318