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 
  41 extern "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 
  50 LRESULT CALLBACK WinAccessBridgeWindowProc(HWND hWnd, UINT message,
  51                                            UINT wParam, LONG lParam);
  52 
  53 BOOL 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  */
  58 class WinAccessBridge {
  59     HINSTANCE windowsInstance;
  60     HWND dialogWindow;
  61     AccessBridgeJavaVMInstance *javaVMs;
  62     AccessBridgeEventHandler *eventHandler;
  63     AccessBridgeMessageQueue *messageQueue;
  64 
  65 public:
  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