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