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 class to manage JNI calls into AccessBridge.java 28 */ 29 30 #include "AccessBridgeJavaEntryPoints.h" 31 #include "AccessBridgeDebug.h" 32 33 34 35 /** 36 * Initialize the AccessBridgeJavaEntryPoints class 37 * 38 */ 39 AccessBridgeJavaEntryPoints::AccessBridgeJavaEntryPoints(JNIEnv *jniEnvironment, 40 jobject bridgeObject) { 41 jniEnv = jniEnvironment; 42 accessBridgeObject = (jobject)bridgeObject; 43 PrintDebugString("[INFO]: AccessBridgeJavaEntryPoints(%p, %p) called", jniEnv, accessBridgeObject); 44 } 45 46 47 /** 48 * Destructor 49 * 50 */ 51 AccessBridgeJavaEntryPoints::~AccessBridgeJavaEntryPoints() { 52 } 53 54 // ----------------------------------- 55 56 #define FIND_CLASS(classRef, className) \ 57 localClassRef = jniEnv->FindClass(className); \ 58 if (localClassRef == (jclass) 0) { \ 59 PrintDebugString("[ERROR]: FindClass(%s) failed! -> jniEnv = %p", className, jniEnv); \ 60 return FALSE; \ 61 } \ 62 classRef = (jclass) jniEnv->NewGlobalRef(localClassRef); \ 63 jniEnv->DeleteLocalRef(localClassRef); \ 64 if (classRef == (jclass) 0) { \ 65 PrintDebugString("[ERROR]: FindClass(%s) failed! -> (ran out of RAM)", className); \ 66 return FALSE; \ 67 } 68 69 70 #define FIND_METHOD(methodID, classRef, methodString, methodSignature); \ 71 methodID = jniEnv->GetMethodID(classRef, methodString, methodSignature); \ 72 if (methodID == (jmethodID) 0) { \ 73 PrintDebugString("[ERROR]: GetMethodID(%s) failed! -> jniEnv = %p; classRef = %p", methodString, jniEnv, classRef); \ 74 return FALSE; \ 75 } 76 77 #define EXCEPTION_CHECK(situationDescription, returnVal) \ 78 if (exception = jniEnv->ExceptionOccurred()) { \ 79 PrintDebugString("[ERROR]: *** Exception occured while doing: %s; returning %d", situationDescription, returnVal); \ 80 jniEnv->ExceptionDescribe(); \ 81 jniEnv->ExceptionClear(); \ 82 return (returnVal); \ 83 } 84 85 #define EXCEPTION_CHECK_VOID(situationDescription) \ 86 if (exception = jniEnv->ExceptionOccurred()) { \ 87 PrintDebugString("[ERROR]: *** Exception occured while doing: %s", situationDescription); \ 88 jniEnv->ExceptionDescribe(); \ 89 jniEnv->ExceptionClear(); \ 90 return; \ 91 } 92 93 /** 94 * Make all of the getClass() & getMethod() calls 95 * 96 */ 97 BOOL 98 AccessBridgeJavaEntryPoints::BuildJavaEntryPoints() { 99 jclass localClassRef; 100 101 PrintDebugString("[INFO]: Calling BuildJavaEntryPoints():"); 102 103 FIND_CLASS(bridgeClass, "com/sun/java/accessibility/internal/AccessBridge"); 104 105 // ------- general methods 106 107 // GetMethodID(decrementReference) 108 FIND_METHOD(decrementReferenceMethod, bridgeClass, 109 "decrementReference", 110 "(Ljava/lang/Object;)V"); 111 112 // GetMethodID(getJavaVersionPropertyMethod) 113 FIND_METHOD(getJavaVersionPropertyMethod, bridgeClass, 114 "getJavaVersionProperty", 115 "()Ljava/lang/String;"); 116 117 // ------- Window methods 118 119 // GetMethodID(isJavaWindow) 120 FIND_METHOD(isJavaWindowMethod, bridgeClass, 121 "isJavaWindow", 122 "(I)Z"); 123 124 // GetMethodID(getAccessibleContextFromHWND) 125 FIND_METHOD(getAccessibleContextFromHWNDMethod, bridgeClass, 126 "getContextFromNativeWindowHandle", 127 "(I)Ljavax/accessibility/AccessibleContext;"); 128 129 // GetMethodID(getHWNDFromAccessibleContext) 130 FIND_METHOD(getHWNDFromAccessibleContextMethod, bridgeClass, 131 "getNativeWindowHandleFromContext", 132 "(Ljavax/accessibility/AccessibleContext;)I"); 133 134 // GetMethodID(getAccessibleParentFromContext) 135 FIND_METHOD(getAccessibleParentFromContextMethod, bridgeClass, 136 "getAccessibleParentFromContext", 137 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;"); 138 139 // ===== utility methods ===== */ 140 141 // GetMethodID(setTextContents) 142 FIND_METHOD(setTextContentsMethod, bridgeClass, 143 "setTextContents", 144 "(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Z"); 145 146 // GetMethodID(getParentWithRole) 147 FIND_METHOD(getParentWithRoleMethod, bridgeClass, 148 "getParentWithRole", 149 "(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Ljavax/accessibility/AccessibleContext;"); 150 151 // GetMethodID(getTopLevelObject) 152 FIND_METHOD(getTopLevelObjectMethod, bridgeClass, 153 "getTopLevelObject", 154 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;"); 155 156 // GetMethodID(getParentWithRoleElseRoot) 157 FIND_METHOD(getParentWithRoleElseRootMethod, bridgeClass, 158 "getParentWithRoleElseRoot", 159 "(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Ljavax/accessibility/AccessibleContext;"); 160 161 // GetMethodID(getObjectDepth) 162 FIND_METHOD(getObjectDepthMethod, bridgeClass, 163 "getObjectDepth", 164 "(Ljavax/accessibility/AccessibleContext;)I"); 165 166 // GetMethodID(getActiveDescendent) 167 FIND_METHOD(getActiveDescendentMethod, bridgeClass, 168 "getActiveDescendent", 169 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;"); 170 171 // ------- AccessibleContext methods 172 173 // GetMethodID(getAccessibleContextAt) 174 FIND_METHOD(getAccessibleContextAtMethod, bridgeClass, 175 "getAccessibleContextAt", 176 "(IILjavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;"); 177 178 // GetMethodID(getAccessibleContextWithFocus) 179 FIND_METHOD(getAccessibleContextWithFocusMethod, bridgeClass, 180 "getAccessibleContextWithFocus", 181 "()Ljavax/accessibility/AccessibleContext;"); 182 183 // GetMethodID(getAccessibleNameFromContext) 184 FIND_METHOD(getAccessibleNameFromContextMethod, bridgeClass, 185 "getAccessibleNameFromContext", 186 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 187 188 // GetMethodID(getAccessibleDescriptionFromContext) 189 FIND_METHOD(getAccessibleDescriptionFromContextMethod, bridgeClass, 190 "getAccessibleDescriptionFromContext", 191 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 192 193 // GetMethodID(getAccessibleRoleStringFromContext) 194 FIND_METHOD(getAccessibleRoleStringFromContextMethod, bridgeClass, 195 "getAccessibleRoleStringFromContext", 196 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 197 198 // GetMethodID(getAccessibleRoleStringFromContext_en_US) 199 FIND_METHOD(getAccessibleRoleStringFromContext_en_USMethod, bridgeClass, 200 "getAccessibleRoleStringFromContext_en_US", 201 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 202 203 // GetMethodID(getAccessibleStatesStringFromContext) 204 FIND_METHOD(getAccessibleStatesStringFromContextMethod, bridgeClass, 205 "getAccessibleStatesStringFromContext", 206 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 207 208 // GetMethodID(getAccessibleStatesStringFromContext_en_US) 209 FIND_METHOD(getAccessibleStatesStringFromContext_en_USMethod, bridgeClass, 210 "getAccessibleStatesStringFromContext_en_US", 211 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 212 213 // GetMethodID(getAccessibleParentFromContext) 214 FIND_METHOD(getAccessibleParentFromContextMethod, bridgeClass, 215 "getAccessibleParentFromContext", 216 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;"); 217 218 // GetMethodID(getAccessibleIndexInParentFromContext) 219 FIND_METHOD(getAccessibleIndexInParentFromContextMethod, bridgeClass, 220 "getAccessibleIndexInParentFromContext", 221 "(Ljavax/accessibility/AccessibleContext;)I"); 222 223 // GetMethodID(getAccessibleChildrenCountFromContext) 224 FIND_METHOD(getAccessibleChildrenCountFromContextMethod, bridgeClass, 225 "getAccessibleChildrenCountFromContext", 226 "(Ljavax/accessibility/AccessibleContext;)I"); 227 228 // GetMethodID(getAccessibleChildFromContext) 229 FIND_METHOD(getAccessibleChildFromContextMethod, bridgeClass, 230 "getAccessibleChildFromContext", 231 "(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;"); 232 233 // GetMethodID(getAccessibleBoundsOnScreenFromContext) 234 FIND_METHOD(getAccessibleBoundsOnScreenFromContextMethod, bridgeClass, 235 "getAccessibleBoundsOnScreenFromContext", 236 "(Ljavax/accessibility/AccessibleContext;)Ljava/awt/Rectangle;"); 237 238 // GetMethodID(getAccessibleXcoordFromContext) 239 FIND_METHOD(getAccessibleXcoordFromContextMethod, bridgeClass, 240 "getAccessibleXcoordFromContext", 241 "(Ljavax/accessibility/AccessibleContext;)I"); 242 243 // GetMethodID(getAccessibleYcoordFromContext) 244 FIND_METHOD(getAccessibleYcoordFromContextMethod, bridgeClass, 245 "getAccessibleYcoordFromContext", 246 "(Ljavax/accessibility/AccessibleContext;)I"); 247 248 // GetMethodID(getAccessibleHeightFromContext) 249 FIND_METHOD(getAccessibleHeightFromContextMethod, bridgeClass, 250 "getAccessibleHeightFromContext", 251 "(Ljavax/accessibility/AccessibleContext;)I"); 252 253 // GetMethodID(getAccessibleWidthFromContext) 254 FIND_METHOD(getAccessibleWidthFromContextMethod, bridgeClass, 255 "getAccessibleWidthFromContext", 256 "(Ljavax/accessibility/AccessibleContext;)I"); 257 258 // GetMethodID(getAccessibleComponentFromContext) 259 FIND_METHOD(getAccessibleComponentFromContextMethod, bridgeClass, 260 "getAccessibleComponentFromContext", 261 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleComponent;"); 262 263 // GetMethodID(getAccessibleActionFromContext) 264 FIND_METHOD(getAccessibleActionFromContextMethod, bridgeClass, 265 "getAccessibleActionFromContext", 266 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleAction;"); 267 268 // GetMethodID(getAccessibleSelectionFromContext) 269 FIND_METHOD(getAccessibleSelectionFromContextMethod, bridgeClass, 270 "getAccessibleSelectionFromContext", 271 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleSelection;"); 272 273 // GetMethodID(getAccessibleTextFromContext) 274 FIND_METHOD(getAccessibleTextFromContextMethod, bridgeClass, 275 "getAccessibleTextFromContext", 276 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleText;"); 277 278 // GetMethodID(getAccessibleValueFromContext) 279 FIND_METHOD(getAccessibleValueFromContextMethod, bridgeClass, 280 "getAccessibleValueFromContext", 281 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleValue;"); 282 283 284 // ------- begin AccessibleTable methods 285 286 // GetMethodID(getAccessibleTableFromContext) 287 FIND_METHOD(getAccessibleTableFromContextMethod, bridgeClass, 288 "getAccessibleTableFromContext", 289 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleTable;"); 290 291 // GetMethodID(getContextFromAccessibleTable) 292 FIND_METHOD(getContextFromAccessibleTableMethod, bridgeClass, 293 "getContextFromAccessibleTable", 294 "(Ljavax/accessibility/AccessibleTable;)Ljavax/accessibility/AccessibleContext;"); 295 296 // GetMethodID(getAccessibleTableRowHeader) 297 FIND_METHOD(getAccessibleTableRowHeaderMethod, bridgeClass, 298 "getAccessibleTableRowHeader", 299 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleTable;"); 300 301 302 // GetMethodID(getAccessibleTableColumnHeader) 303 FIND_METHOD(getAccessibleTableColumnHeaderMethod, bridgeClass, 304 "getAccessibleTableColumnHeader", 305 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleTable;"); 306 307 308 // GetMethodID(getAccessibleTableRowCount) 309 FIND_METHOD(getAccessibleTableRowCountMethod, bridgeClass, 310 "getAccessibleTableRowCount", 311 "(Ljavax/accessibility/AccessibleContext;)I"); 312 313 // GetMethodID(getAccessibleTableColumnCount) 314 FIND_METHOD(getAccessibleTableColumnCountMethod, bridgeClass, 315 "getAccessibleTableColumnCount", 316 "(Ljavax/accessibility/AccessibleContext;)I"); 317 318 // GetMethodID(getAccessibleTableCellAccessibleContext) 319 FIND_METHOD(getAccessibleTableCellAccessibleContextMethod, bridgeClass, 320 "getAccessibleTableCellAccessibleContext", 321 "(Ljavax/accessibility/AccessibleTable;II)Ljavax/accessibility/AccessibleContext;"); 322 323 // GetMethodID(getAccessibleTableCellIndex) 324 FIND_METHOD(getAccessibleTableCellIndexMethod, bridgeClass, 325 "getAccessibleTableCellIndex", 326 "(Ljavax/accessibility/AccessibleTable;II)I"); 327 328 // GetMethodID(getAccessibleTableCellRowExtent) 329 FIND_METHOD(getAccessibleTableCellRowExtentMethod, bridgeClass, 330 "getAccessibleTableCellRowExtent", 331 "(Ljavax/accessibility/AccessibleTable;II)I"); 332 333 // GetMethodID(getAccessibleTableCellColumnExtent) 334 FIND_METHOD(getAccessibleTableCellColumnExtentMethod, bridgeClass, 335 "getAccessibleTableCellColumnExtent", 336 "(Ljavax/accessibility/AccessibleTable;II)I"); 337 338 // GetMethodID(isAccessibleTableCellSelected) 339 FIND_METHOD(isAccessibleTableCellSelectedMethod, bridgeClass, 340 "isAccessibleTableCellSelected", 341 "(Ljavax/accessibility/AccessibleTable;II)Z"); 342 343 // GetMethodID(getAccessibleTableRowHeaderRowCount) 344 FIND_METHOD(getAccessibleTableRowHeaderRowCountMethod, bridgeClass, 345 "getAccessibleTableRowHeaderRowCount", 346 "(Ljavax/accessibility/AccessibleContext;)I"); 347 348 // GetMethodID(getAccessibleTableColumnHeaderRowCount) 349 FIND_METHOD(getAccessibleTableColumnHeaderRowCountMethod, bridgeClass, 350 "getAccessibleTableColumnHeaderRowCount", 351 "(Ljavax/accessibility/AccessibleContext;)I"); 352 353 // GetMethodID(getAccessibleTableRowHeaderColumnCount) 354 FIND_METHOD(getAccessibleTableRowHeaderColumnCountMethod, bridgeClass, 355 "getAccessibleTableRowHeaderColumnCount", 356 "(Ljavax/accessibility/AccessibleContext;)I"); 357 358 // GetMethodID(getAccessibleTableColumnHeaderColumnCount) 359 FIND_METHOD(getAccessibleTableColumnHeaderColumnCountMethod, bridgeClass, 360 "getAccessibleTableColumnHeaderColumnCount", 361 "(Ljavax/accessibility/AccessibleContext;)I"); 362 363 // GetMethodID(getAccessibleTableRowDescription) 364 FIND_METHOD(getAccessibleTableRowDescriptionMethod, bridgeClass, 365 "getAccessibleTableRowDescription", 366 "(Ljavax/accessibility/AccessibleTable;I)Ljavax/accessibility/AccessibleContext;"); 367 368 // GetMethodID(getAccessibleTableColumnDescription) 369 FIND_METHOD(getAccessibleTableColumnDescriptionMethod, bridgeClass, 370 "getAccessibleTableColumnDescription", 371 "(Ljavax/accessibility/AccessibleTable;I)Ljavax/accessibility/AccessibleContext;"); 372 373 // GetMethodID(getAccessibleTableRowSelectionCount) 374 FIND_METHOD(getAccessibleTableRowSelectionCountMethod, bridgeClass, 375 "getAccessibleTableRowSelectionCount", 376 "(Ljavax/accessibility/AccessibleTable;)I"); 377 378 // GetMethodID(isAccessibleTableRowSelected) 379 FIND_METHOD(isAccessibleTableRowSelectedMethod, bridgeClass, 380 "isAccessibleTableRowSelected", 381 "(Ljavax/accessibility/AccessibleTable;I)Z"); 382 383 // GetMethodID(getAccessibleTableRowSelections) 384 FIND_METHOD(getAccessibleTableRowSelectionsMethod, bridgeClass, 385 "getAccessibleTableRowSelections", 386 "(Ljavax/accessibility/AccessibleTable;I)I"); 387 388 // GetMethodID(getAccessibleTableColumnSelectionCount) 389 FIND_METHOD(getAccessibleTableColumnSelectionCountMethod, bridgeClass, 390 "getAccessibleTableColumnSelectionCount", 391 "(Ljavax/accessibility/AccessibleTable;)I"); 392 393 // GetMethodID(isAccessibleTableColumnSelected) 394 FIND_METHOD(isAccessibleTableColumnSelectedMethod, bridgeClass, 395 "isAccessibleTableColumnSelected", 396 "(Ljavax/accessibility/AccessibleTable;I)Z"); 397 398 // GetMethodID(getAccessibleTableColumnSelections) 399 FIND_METHOD(getAccessibleTableColumnSelectionsMethod, bridgeClass, 400 "getAccessibleTableColumnSelections", 401 "(Ljavax/accessibility/AccessibleTable;I)I"); 402 403 // GetMethodID(getAccessibleTableRow) 404 FIND_METHOD(getAccessibleTableRowMethod, bridgeClass, 405 "getAccessibleTableRow", 406 "(Ljavax/accessibility/AccessibleTable;I)I"); 407 408 // GetMethodID(getAccessibleTableColumn) 409 FIND_METHOD(getAccessibleTableColumnMethod, bridgeClass, 410 "getAccessibleTableColumn", 411 "(Ljavax/accessibility/AccessibleTable;I)I"); 412 413 // GetMethodID(getAccessibleTableIndex) 414 FIND_METHOD(getAccessibleTableIndexMethod, bridgeClass, 415 "getAccessibleTableIndex", 416 "(Ljavax/accessibility/AccessibleTable;II)I"); 417 418 /* ------- end AccessibleTable methods */ 419 420 /* start AccessibleRelationSet methods ----- */ 421 422 // GetMethodID(getAccessibleRelationCount) 423 FIND_METHOD(getAccessibleRelationCountMethod, bridgeClass, 424 "getAccessibleRelationCount", 425 "(Ljavax/accessibility/AccessibleContext;)I"); 426 427 // GetMethodID(getAccessibleRelationKey) 428 FIND_METHOD(getAccessibleRelationKeyMethod, bridgeClass, 429 "getAccessibleRelationKey", 430 "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;"); 431 432 // GetMethodID(getAccessibleRelationTargetCount) 433 FIND_METHOD(getAccessibleRelationTargetCountMethod, bridgeClass, 434 "getAccessibleRelationTargetCount", 435 "(Ljavax/accessibility/AccessibleContext;I)I"); 436 437 // GetMethodID(getAccessibleRelationTarget) 438 FIND_METHOD(getAccessibleRelationTargetMethod, bridgeClass, 439 "getAccessibleRelationTarget", 440 "(Ljavax/accessibility/AccessibleContext;II)Ljavax/accessibility/AccessibleContext;"); 441 442 443 // ------- AccessibleHypertext methods 444 445 // GetMethodID(getAccessibleHypertext) 446 FIND_METHOD(getAccessibleHypertextMethod, bridgeClass, 447 "getAccessibleHypertext", 448 "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleHypertext;"); 449 450 // GetMethodID(activateAccessibleHyperlink) 451 FIND_METHOD(activateAccessibleHyperlinkMethod, bridgeClass, 452 "activateAccessibleHyperlink", 453 "(Ljavax/accessibility/AccessibleContext;Ljavax/accessibility/AccessibleHyperlink;)Z"); 454 455 // GetMethodID(getAccessibleHyperlinkCount) 456 FIND_METHOD(getAccessibleHyperlinkCountMethod, bridgeClass, 457 "getAccessibleHyperlinkCount", 458 "(Ljavax/accessibility/AccessibleContext;)I"); 459 460 // GetMethodID(getAccessibleHyperlink) 461 FIND_METHOD(getAccessibleHyperlinkMethod, bridgeClass, 462 "getAccessibleHyperlink", 463 "(Ljavax/accessibility/AccessibleHypertext;I)Ljavax/accessibility/AccessibleHyperlink;"); 464 465 // GetMethodID(getAccessibleHyperlinkText) 466 FIND_METHOD(getAccessibleHyperlinkTextMethod, bridgeClass, 467 "getAccessibleHyperlinkText", 468 "(Ljavax/accessibility/AccessibleHyperlink;)Ljava/lang/String;"); 469 470 // GetMethodID(getAccessibleHyperlinkURL) 471 FIND_METHOD(getAccessibleHyperlinkURLMethod, bridgeClass, 472 "getAccessibleHyperlinkURL", 473 "(Ljavax/accessibility/AccessibleHyperlink;)Ljava/lang/String;"); 474 475 // GetMethodID(getAccessibleHyperlinkStartIndex) 476 FIND_METHOD(getAccessibleHyperlinkStartIndexMethod, bridgeClass, 477 "getAccessibleHyperlinkStartIndex", 478 "(Ljavax/accessibility/AccessibleHyperlink;)I"); 479 480 // GetMethodID(getAccessibleHyperlinkEndIndex) 481 FIND_METHOD(getAccessibleHyperlinkEndIndexMethod, bridgeClass, 482 "getAccessibleHyperlinkEndIndex", 483 "(Ljavax/accessibility/AccessibleHyperlink;)I"); 484 485 // GetMethodID(getAccessibleHypertextLinkIndex) 486 FIND_METHOD(getAccessibleHypertextLinkIndexMethod, bridgeClass, 487 "getAccessibleHypertextLinkIndex", 488 "(Ljavax/accessibility/AccessibleHypertext;I)I"); 489 490 // Accessible KeyBinding, Icon and Action ==================== 491 492 // GetMethodID(getAccessibleKeyBindingsCount) 493 FIND_METHOD(getAccessibleKeyBindingsCountMethod, bridgeClass, 494 "getAccessibleKeyBindingsCount", 495 "(Ljavax/accessibility/AccessibleContext;)I"); 496 497 // GetMethodID(getAccessibleKeyBindingChar) 498 FIND_METHOD(getAccessibleKeyBindingCharMethod, bridgeClass, 499 "getAccessibleKeyBindingChar", 500 "(Ljavax/accessibility/AccessibleContext;I)C"); 501 502 // GetMethodID(getAccessibleKeyBindingModifiers) 503 FIND_METHOD(getAccessibleKeyBindingModifiersMethod, bridgeClass, 504 "getAccessibleKeyBindingModifiers", 505 "(Ljavax/accessibility/AccessibleContext;I)I"); 506 507 // GetMethodID(getAccessibleIconsCount) 508 FIND_METHOD(getAccessibleIconsCountMethod, bridgeClass, 509 "getAccessibleIconsCount", 510 "(Ljavax/accessibility/AccessibleContext;)I"); 511 512 // GetMethodID(getAccessibleIconDescription) 513 FIND_METHOD(getAccessibleIconDescriptionMethod, bridgeClass, 514 "getAccessibleIconDescription", 515 "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;"); 516 517 // GetMethodID(getAccessibleIconHeight) 518 FIND_METHOD(getAccessibleIconHeightMethod, bridgeClass, 519 "getAccessibleIconHeight", 520 "(Ljavax/accessibility/AccessibleContext;I)I"); 521 522 // GetMethodID(getAccessibleIconWidth) 523 FIND_METHOD(getAccessibleIconWidthMethod, bridgeClass, 524 "getAccessibleIconWidth", 525 "(Ljavax/accessibility/AccessibleContext;I)I"); 526 527 // GetMethodID(getAccessibleActionsCount) 528 FIND_METHOD(getAccessibleActionsCountMethod, bridgeClass, 529 "getAccessibleActionsCount", 530 "(Ljavax/accessibility/AccessibleContext;)I"); 531 532 // GetMethodID(getAccessibleActionName) 533 FIND_METHOD(getAccessibleActionNameMethod, bridgeClass, 534 "getAccessibleActionName", 535 "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;"); 536 537 // GetMethodID(doAccessibleActions) 538 FIND_METHOD(doAccessibleActionsMethod, bridgeClass, 539 "doAccessibleActions", 540 "(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Z"); 541 542 // ------- AccessibleText methods 543 544 // GetMethodID(getAccessibleCharCountFromContext) 545 FIND_METHOD(getAccessibleCharCountFromContextMethod, bridgeClass, 546 "getAccessibleCharCountFromContext", 547 "(Ljavax/accessibility/AccessibleContext;)I"); 548 549 // GetMethodID(getAccessibleCaretPositionFromContext) 550 FIND_METHOD(getAccessibleCaretPositionFromContextMethod, bridgeClass, 551 "getAccessibleCaretPositionFromContext", 552 "(Ljavax/accessibility/AccessibleContext;)I"); 553 554 // GetMethodID(getAccessibleIndexAtPointFromContext) 555 FIND_METHOD(getAccessibleIndexAtPointFromContextMethod, bridgeClass, 556 "getAccessibleIndexAtPointFromContext", 557 "(Ljavax/accessibility/AccessibleContext;II)I"); 558 559 // GetMethodID(getAccessibleLetterAtIndexFromContext) 560 FIND_METHOD(getAccessibleLetterAtIndexFromContextMethod, bridgeClass, 561 "getAccessibleLetterAtIndexFromContext", 562 "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;"); 563 564 // GetMethodID(getAccessibleWordAtIndexFromContext) 565 FIND_METHOD(getAccessibleWordAtIndexFromContextMethod, bridgeClass, 566 "getAccessibleWordAtIndexFromContext", 567 "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;"); 568 569 // GetMethodID(getAccessibleSentenceAtIndexFromContext) 570 FIND_METHOD(getAccessibleSentenceAtIndexFromContextMethod, bridgeClass, 571 "getAccessibleSentenceAtIndexFromContext", 572 "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;"); 573 574 // GetMethodID(getAccessibleTextSelectionStartFromContext) 575 FIND_METHOD(getAccessibleTextSelectionStartFromContextMethod, bridgeClass, 576 "getAccessibleTextSelectionStartFromContext", 577 "(Ljavax/accessibility/AccessibleContext;)I"); 578 579 // GetMethodID(getAccessibleTextSelectionEndFromContext) 580 FIND_METHOD(getAccessibleTextSelectionEndFromContextMethod, bridgeClass, 581 "getAccessibleTextSelectionEndFromContext", 582 "(Ljavax/accessibility/AccessibleContext;)I"); 583 584 // GetMethodID(getAccessibleTextSelectedTextFromContext) 585 FIND_METHOD(getAccessibleTextSelectedTextFromContextMethod, bridgeClass, 586 "getAccessibleTextSelectedTextFromContext", 587 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 588 589 // GetMethodID(getAccessibleAttributesAtIndexFromContext) 590 FIND_METHOD(getAccessibleAttributesAtIndexFromContextMethod, bridgeClass, 591 "getAccessibleAttributesAtIndexFromContext", 592 "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;"); 593 594 // GetMethodID(getAccessibleAttributeSetAtIndexFromContext) 595 FIND_METHOD(getAccessibleAttributeSetAtIndexFromContextMethod, bridgeClass, 596 "getAccessibleAttributeSetAtIndexFromContext", 597 "(Ljavax/accessibility/AccessibleContext;I)Ljavax/swing/text/AttributeSet;"); 598 599 // GetMethodID(getAccessibleTextRectAtIndexFromContext) 600 FIND_METHOD(getAccessibleTextRectAtIndexFromContextMethod, bridgeClass, 601 "getAccessibleTextRectAtIndexFromContext", 602 "(Ljavax/accessibility/AccessibleContext;I)Ljava/awt/Rectangle;"); 603 604 // GetMethodID(getAccessibleXcoordTextRectAtIndexFromContext) 605 FIND_METHOD(getAccessibleXcoordTextRectAtIndexFromContextMethod, bridgeClass, 606 "getAccessibleXcoordTextRectAtIndexFromContext", 607 "(Ljavax/accessibility/AccessibleContext;I)I"); 608 609 // GetMethodID(getAccessibleYcoordTextRectAtIndexFromContext) 610 FIND_METHOD(getAccessibleYcoordTextRectAtIndexFromContextMethod, bridgeClass, 611 "getAccessibleYcoordTextRectAtIndexFromContext", 612 "(Ljavax/accessibility/AccessibleContext;I)I"); 613 614 // GetMethodID(getAccessibleHeightTextRectAtIndexFromContext) 615 FIND_METHOD(getAccessibleHeightTextRectAtIndexFromContextMethod, bridgeClass, 616 "getAccessibleHeightTextRectAtIndexFromContext", 617 "(Ljavax/accessibility/AccessibleContext;I)I"); 618 619 // GetMethodID(getAccessibleWidthTextRectAtIndexFromContext) 620 FIND_METHOD(getAccessibleWidthTextRectAtIndexFromContextMethod, bridgeClass, 621 "getAccessibleWidthTextRectAtIndexFromContext", 622 "(Ljavax/accessibility/AccessibleContext;I)I"); 623 624 // GetMethodID(getCaretLocationX) 625 FIND_METHOD(getCaretLocationXMethod, bridgeClass, 626 "getCaretLocationX", 627 "(Ljavax/accessibility/AccessibleContext;)I"); 628 629 // GetMethodID(getCaretLocationY) 630 FIND_METHOD(getCaretLocationYMethod, bridgeClass, 631 "getCaretLocationY", 632 "(Ljavax/accessibility/AccessibleContext;)I"); 633 634 // GetMethodID(getCaretLocationHeight) 635 FIND_METHOD(getCaretLocationHeightMethod, bridgeClass, 636 "getCaretLocationHeight", 637 "(Ljavax/accessibility/AccessibleContext;)I"); 638 639 // GetMethodID(getCaretLocationWidth) 640 FIND_METHOD(getCaretLocationWidthMethod, bridgeClass, 641 "getCaretLocationWidth", 642 "(Ljavax/accessibility/AccessibleContext;)I"); 643 644 645 // GetMethodID(getAccessibleTextLineLeftBoundsFromContextMethod) 646 FIND_METHOD(getAccessibleTextLineLeftBoundsFromContextMethod, bridgeClass, 647 "getAccessibleTextLineLeftBoundsFromContext", 648 "(Ljavax/accessibility/AccessibleContext;I)I"); 649 650 // GetMethodID(getAccessibleTextLineRightBoundsFromContextMethod) 651 FIND_METHOD(getAccessibleTextLineRightBoundsFromContextMethod, bridgeClass, 652 "getAccessibleTextLineRightBoundsFromContext", 653 "(Ljavax/accessibility/AccessibleContext;I)I"); 654 655 // GetMethodID(getAccessibleTextRangeFromContextMethod) 656 FIND_METHOD(getAccessibleTextRangeFromContextMethod, bridgeClass, 657 "getAccessibleTextRangeFromContext", 658 "(Ljavax/accessibility/AccessibleContext;II)Ljava/lang/String;"); 659 660 661 // ------- AccessibleValue methods 662 663 // GetMethodID(getCurrentAccessibleValueFromContext) 664 FIND_METHOD(getCurrentAccessibleValueFromContextMethod, bridgeClass, 665 "getCurrentAccessibleValueFromContext", 666 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 667 668 // GetMethodID(getMaximumAccessibleValueFromContext) 669 FIND_METHOD(getMaximumAccessibleValueFromContextMethod, bridgeClass, 670 "getMaximumAccessibleValueFromContext", 671 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 672 673 // GetMethodID(getMinimumAccessibleValueFromContext) 674 FIND_METHOD(getMinimumAccessibleValueFromContextMethod, bridgeClass, 675 "getMinimumAccessibleValueFromContext", 676 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 677 678 679 // ------- AccessibleSelection methods 680 681 // GetMethodID(addAccessibleSelectionFromContext) 682 FIND_METHOD(addAccessibleSelectionFromContextMethod, bridgeClass, 683 "addAccessibleSelectionFromContext", 684 "(Ljavax/accessibility/AccessibleContext;I)V"); 685 686 // GetMethodID(clearAccessibleSelectionFromContext) 687 FIND_METHOD(clearAccessibleSelectionFromContextMethod, bridgeClass, 688 "clearAccessibleSelectionFromContext", 689 "(Ljavax/accessibility/AccessibleContext;)V"); 690 691 // GetMethodID(getAccessibleSelectionFromContext) 692 FIND_METHOD(getAccessibleSelectionContextFromContextMethod, bridgeClass, 693 "getAccessibleSelectionFromContext", 694 "(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;"); 695 696 // GetMethodID(getAccessibleSelectionCountFromContext) 697 FIND_METHOD(getAccessibleSelectionCountFromContextMethod, bridgeClass, 698 "getAccessibleSelectionCountFromContext", 699 "(Ljavax/accessibility/AccessibleContext;)I"); 700 701 // GetMethodID(isAccessibleChildSelectedFromContext) 702 FIND_METHOD(isAccessibleChildSelectedFromContextMethod, bridgeClass, 703 "isAccessibleChildSelectedFromContext", 704 "(Ljavax/accessibility/AccessibleContext;I)Z"); 705 706 // GetMethodID(removeAccessibleSelectionFromContext) 707 FIND_METHOD(removeAccessibleSelectionFromContextMethod, bridgeClass, 708 "removeAccessibleSelectionFromContext", 709 "(Ljavax/accessibility/AccessibleContext;I)V"); 710 711 // GetMethodID(selectAllAccessibleSelectionFromContext) 712 FIND_METHOD(selectAllAccessibleSelectionFromContextMethod, bridgeClass, 713 "selectAllAccessibleSelectionFromContext", 714 "(Ljavax/accessibility/AccessibleContext;)V"); 715 716 717 // ------- Event Notification methods 718 719 // GetMethodID(addJavaEventNotification) 720 FIND_METHOD(addJavaEventNotificationMethod, bridgeClass, 721 "addJavaEventNotification", "(J)V"); 722 723 // GetMethodID(removeJavaEventNotification) 724 FIND_METHOD(removeJavaEventNotificationMethod, bridgeClass, 725 "removeJavaEventNotification", "(J)V"); 726 727 // GetMethodID(addAccessibilityEventNotification) 728 FIND_METHOD(addAccessibilityEventNotificationMethod, bridgeClass, 729 "addAccessibilityEventNotification", "(J)V"); 730 731 // GetMethodID(removeAccessibilityEventNotification) 732 FIND_METHOD(removeAccessibilityEventNotificationMethod, bridgeClass, 733 "removeAccessibilityEventNotification", "(J)V"); 734 735 736 // ------- AttributeSet methods 737 738 // GetMethodID(getBoldFromAttributeSet) 739 FIND_METHOD(getBoldFromAttributeSetMethod, bridgeClass, 740 "getBoldFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z"); 741 742 // GetMethodID(getItalicFromAttributeSet) 743 FIND_METHOD(getItalicFromAttributeSetMethod, bridgeClass, 744 "getItalicFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z"); 745 746 // GetMethodID(getUnderlineFromAttributeSet) 747 FIND_METHOD(getUnderlineFromAttributeSetMethod, bridgeClass, 748 "getUnderlineFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z"); 749 750 // GetMethodID(getStrikethroughFromAttributeSet) 751 FIND_METHOD(getStrikethroughFromAttributeSetMethod, bridgeClass, 752 "getStrikethroughFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z"); 753 754 // GetMethodID(getSuperscriptFromAttributeSet) 755 FIND_METHOD(getSuperscriptFromAttributeSetMethod, bridgeClass, 756 "getSuperscriptFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z"); 757 758 // GetMethodID(getSubscriptFromAttributeSet) 759 FIND_METHOD(getSubscriptFromAttributeSetMethod, bridgeClass, 760 "getSubscriptFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z"); 761 762 // GetMethodID(getBackgroundColorFromAttributeSet) 763 FIND_METHOD(getBackgroundColorFromAttributeSetMethod, bridgeClass, 764 "getBackgroundColorFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Ljava/lang/String;"); 765 766 // GetMethodID(getForegroundColorFromAttributeSet) 767 FIND_METHOD(getForegroundColorFromAttributeSetMethod, bridgeClass, 768 "getForegroundColorFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Ljava/lang/String;"); 769 770 // GetMethodID(getFontFamilyFromAttributeSet) 771 FIND_METHOD(getFontFamilyFromAttributeSetMethod, bridgeClass, 772 "getFontFamilyFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Ljava/lang/String;"); 773 774 // GetMethodID(getFontSizeFromAttributeSet) 775 FIND_METHOD(getFontSizeFromAttributeSetMethod, bridgeClass, 776 "getFontSizeFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)I"); 777 778 // GetMethodID(getAlignmentFromAttributeSet) 779 FIND_METHOD(getAlignmentFromAttributeSetMethod, bridgeClass, 780 "getAlignmentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)I"); 781 782 // GetMethodID(getBidiLevelFromAttributeSet) 783 FIND_METHOD(getBidiLevelFromAttributeSetMethod, bridgeClass, 784 "getBidiLevelFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)I"); 785 786 // GetMethodID(getFirstLineIndentFromAttributeSet) 787 FIND_METHOD(getFirstLineIndentFromAttributeSetMethod, bridgeClass, 788 "getFirstLineIndentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F"); 789 790 // GetMethodID(getLeftIndentFromAttributeSet) 791 FIND_METHOD(getLeftIndentFromAttributeSetMethod, bridgeClass, 792 "getLeftIndentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F"); 793 794 // GetMethodID(getRightIndentFromAttributeSet) 795 FIND_METHOD(getRightIndentFromAttributeSetMethod, bridgeClass, 796 "getRightIndentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F"); 797 798 // GetMethodID(getLineSpacingFromAttributeSet) 799 FIND_METHOD(getLineSpacingFromAttributeSetMethod, bridgeClass, 800 "getLineSpacingFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F"); 801 802 // GetMethodID(getSpaceAboveFromAttributeSet) 803 FIND_METHOD(getSpaceAboveFromAttributeSetMethod, bridgeClass, 804 "getSpaceAboveFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F"); 805 806 // GetMethodID(getSpaceBelowFromAttributeSet) 807 FIND_METHOD(getSpaceBelowFromAttributeSetMethod, bridgeClass, 808 "getSpaceBelowFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F"); 809 810 811 /** 812 * Additional methods for Teton 813 */ 814 815 // GetMethodID(requestFocus) 816 FIND_METHOD(requestFocusMethod, bridgeClass, 817 "requestFocus", 818 "(Ljavax/accessibility/AccessibleContext;)Z"); 819 820 // GetMethodID(selectTextRange) 821 FIND_METHOD(selectTextRangeMethod, bridgeClass, 822 "selectTextRange", 823 "(Ljavax/accessibility/AccessibleContext;II)Z"); 824 825 // GetMethodID(getVisibleChildrenCount) 826 FIND_METHOD(getVisibleChildrenCountMethod, bridgeClass, 827 "getVisibleChildrenCount", 828 "(Ljavax/accessibility/AccessibleContext;)I"); 829 830 // GetMethodID(getVisibleChild) 831 FIND_METHOD(getVisibleChildMethod, bridgeClass, 832 "getVisibleChild", 833 "(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;"); 834 835 // GetMethodID(setCaretPosition) 836 FIND_METHOD(setCaretPositionMethod, bridgeClass, 837 "setCaretPosition", 838 "(Ljavax/accessibility/AccessibleContext;I)Z"); 839 840 // GetMethodID(getVirtualAccessibleNameFromContextMethod) Ben Key 841 FIND_METHOD(getVirtualAccessibleNameFromContextMethod, bridgeClass, 842 "getVirtualAccessibleNameFromContext", 843 "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;"); 844 845 return TRUE; 846 } 847 848 // Note for the following code which makes JNI upcalls... 849 // 850 // Problem, bug DB 16818166, JBS DB JDK-8015400 851 // AccessibleContext is a JOBJECT64 which is a jobject (32 bit pointer) 852 // for a Legacy (XP) build and a jlong (64 bits) for a -32 or -64 build. 853 // For the -32 build the lower 32 bits needs to be extracted into a jobject. 854 // Otherwise, if AccessibleContext is used directly what happens is that 855 // the JNI code consumes the lower 32 of its 64 bits and that is not a 856 // problem, but then when the JNI code consumes the next 32 bits for the 857 // reference to the role String it gets the higher 0x00000000 bits from 858 // the 64 bit JOBJECT64 AccessibleContext variable and thus a null reference 859 // is passed as the String reference. 860 // 861 // Solution: 862 // Cast the JOBJECT64 to a jobject. For a 64 bit compile this is basically 863 // a noop, i.e. JOBJECT64 is a 64 bit jlong and a jobject is a 64 bit reference. 864 // For a 32 bit compile the cast drops the high order 32 bits, i.e. JOBJECT64 865 // is a 64 bit jlong and jobject is a 32 bit reference. For a Legacy build 866 // JOBJECT64 is a jobject so this is also basically a noop. The casts are 867 // done in the methods in JavaAccessBridge::processPackage. 868 869 // ----------------------------------- 870 871 /** 872 * isJavaWindow - returns whether the HWND is a Java window or not 873 * 874 */ 875 BOOL 876 AccessBridgeJavaEntryPoints::isJavaWindow(jint window) { 877 jthrowable exception; 878 BOOL returnVal; 879 880 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::isJavaWindow(%X):", window); 881 882 if (isJavaWindowMethod != (jmethodID) 0) { 883 returnVal = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, isJavaWindowMethod, window); 884 EXCEPTION_CHECK("Getting isJavaWindow - call to CallBooleanMethod()", FALSE); 885 return returnVal; 886 } else { 887 PrintDebugString("[ERROR]: either jniEnv == 0 or isJavaWindowMethod == 0"); 888 return FALSE; 889 } 890 } 891 892 // ----------------------------------- 893 894 /** 895 * isSameObject - returns whether two object reference refer to the same object 896 * 897 */ 898 BOOL 899 AccessBridgeJavaEntryPoints::isSameObject(jobject obj1, jobject obj2) { 900 jthrowable exception; 901 BOOL returnVal; 902 903 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::isSameObject(%p %p):", obj1, obj2); 904 905 returnVal = (BOOL) jniEnv->IsSameObject((jobject)obj1, (jobject)obj2); 906 EXCEPTION_CHECK("Calling IsSameObject", FALSE); 907 908 PrintDebugString("[INFO]: isSameObject returning %d", returnVal); 909 return returnVal; 910 } 911 912 // ----------------------------------- 913 914 /** 915 * getAccessibleContextFromHWND - returns the AccessibleContext, if any, for an HWND 916 * 917 */ 918 jobject 919 AccessBridgeJavaEntryPoints::getAccessibleContextFromHWND(jint window) { 920 jobject returnedAccessibleContext; 921 jobject globalRef; 922 jthrowable exception; 923 924 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getAccessibleContextFromHWND(%X):", window); 925 926 if (getAccessibleContextFromHWNDMethod != (jmethodID) 0) { 927 returnedAccessibleContext = 928 (jobject)jniEnv->CallObjectMethod(accessBridgeObject, getAccessibleContextFromHWNDMethod, 929 window); 930 EXCEPTION_CHECK("Getting AccessibleContextFromHWND - call to CallObjectMethod()", (jobject) 0); 931 globalRef = (jobject)jniEnv->NewGlobalRef((jobject)returnedAccessibleContext); 932 EXCEPTION_CHECK("Getting AccessibleContextFromHWND - call to CallObjectMethod()", (jobject) 0); 933 return globalRef; 934 } else { 935 PrintDebugString("[ERROR]: either jniEnv == 0 or getAccessibleContextFromHWNDMethod == 0"); 936 return (jobject) 0; 937 } 938 } 939 940 // ----------------------------------- 941 942 /** 943 * getHWNDFromAccessibleContext - returns the HWND for an AccessibleContext, if any 944 * returns (HWND)0 on error. 945 */ 946 HWND 947 AccessBridgeJavaEntryPoints::getHWNDFromAccessibleContext(jobject accessibleContext) { 948 jthrowable exception; 949 HWND rHWND; 950 951 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getHWNDFromAccessibleContext(%X):", 952 accessibleContext); 953 954 if (getHWNDFromAccessibleContextMethod != (jmethodID) 0) { 955 rHWND = (HWND)jniEnv->CallIntMethod(accessBridgeObject, getHWNDFromAccessibleContextMethod, 956 accessibleContext); 957 EXCEPTION_CHECK("Getting HWNDFromAccessibleContext - call to CallIntMethod()", (HWND)0); 958 PrintDebugString("[INFO]: rHWND = %X", rHWND); 959 return rHWND; 960 } else { 961 PrintDebugString("[ERROR]: either jniEnv == 0 or getHWNDFromAccessibleContextMethod == 0"); 962 return (HWND)0; 963 } 964 } 965 966 967 /* ====== Utility methods ===== */ 968 969 /** 970 * Sets a text field to the specified string. Returns whether successful; 971 */ 972 BOOL 973 AccessBridgeJavaEntryPoints::setTextContents(const jobject accessibleContext, const wchar_t *text) { 974 jthrowable exception; 975 BOOL result = FALSE; 976 977 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::setTextContents(%p, %ls):", 978 accessibleContext, text); 979 980 if (setTextContentsMethod != (jmethodID) 0) { 981 982 // create a Java String for the text 983 jstring textString = jniEnv->NewString(text, (jsize)wcslen(text)); 984 if (textString == 0) { 985 PrintDebugString("[ERROR]: NewString failed"); 986 return FALSE; 987 } 988 989 result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject, 990 setTextContentsMethod, 991 accessibleContext, textString); 992 EXCEPTION_CHECK("setTextContents - call to CallBooleanMethod()", FALSE); 993 PrintDebugString("[INFO]: result = %d", result); 994 return result; 995 } else { 996 PrintDebugString("[ERROR]: either jniEnv == 0 or setTextContentsMethod == 0"); 997 return result; 998 } 999 } 1000 1001 /** 1002 * Returns the Accessible Context of a Page Tab object that is the 1003 * ancestor of a given object. If the object is a Page Tab object 1004 * or a Page Tab ancestor object was found, returns the object 1005 * AccessibleContext. 1006 * If there is no ancestor object that has an Accessible Role of Page Tab, 1007 * returns (AccessibleContext)0. 1008 */ 1009 jobject 1010 AccessBridgeJavaEntryPoints::getParentWithRole(const jobject accessibleContext, const wchar_t *role) { 1011 jthrowable exception; 1012 jobject rAccessibleContext; 1013 1014 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getParentWithRole(%p):", 1015 accessibleContext); 1016 1017 if (getParentWithRoleMethod != (jmethodID) 0) { 1018 // create a Java String for the role 1019 jstring roleName = jniEnv->NewString(role, (jsize)wcslen(role)); 1020 if (roleName == 0) { 1021 PrintDebugString("[ERROR]: NewString failed"); 1022 return FALSE; 1023 } 1024 1025 rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject, 1026 getParentWithRoleMethod, 1027 accessibleContext, roleName); 1028 EXCEPTION_CHECK("Getting ParentWithRole - call to CallObjectMethod()", (AccessibleContext)0); 1029 PrintDebugString("[INFO]: rAccessibleContext = %p", rAccessibleContext); 1030 jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext); 1031 EXCEPTION_CHECK("Getting ParentWithRole - call to NewGlobalRef()", FALSE); 1032 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 1033 rAccessibleContext, globalRef); 1034 return globalRef; 1035 } else { 1036 PrintDebugString("[ERROR]: either jniEnv == 0 or getParentWithRoleMethod == 0"); 1037 return 0; 1038 } 1039 } 1040 1041 /** 1042 * Returns the Accessible Context for the top level object in 1043 * a Java Window. This is same Accessible Context that is obtained 1044 * from GetAccessibleContextFromHWND for that window. Returns 1045 * (AccessibleContext)0 on error. 1046 */ 1047 jobject 1048 AccessBridgeJavaEntryPoints::getTopLevelObject(const jobject accessibleContext) { 1049 jthrowable exception; 1050 jobject rAccessibleContext; 1051 1052 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getTopLevelObject(%p):", 1053 accessibleContext); 1054 1055 if (getTopLevelObjectMethod != (jmethodID) 0) { 1056 rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject, 1057 getTopLevelObjectMethod, 1058 accessibleContext); 1059 EXCEPTION_CHECK("Getting TopLevelObject - call to CallObjectMethod()", FALSE); 1060 PrintDebugString("[INFO]: rAccessibleContext = %p", rAccessibleContext); 1061 jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext); 1062 EXCEPTION_CHECK("Getting TopLevelObject - call to NewGlobalRef()", FALSE); 1063 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 1064 rAccessibleContext, globalRef); 1065 return globalRef; 1066 } else { 1067 PrintDebugString("[ERROR]: either jniEnv == 0 or getTopLevelObjectMethod == 0"); 1068 return 0; 1069 } 1070 } 1071 1072 /** 1073 * If there is an Ancestor object that has an Accessible Role of 1074 * Internal Frame, returns the Accessible Context of the Internal 1075 * Frame object. Otherwise, returns the top level object for that 1076 * Java Window. Returns (AccessibleContext)0 on error. 1077 */ 1078 jobject 1079 AccessBridgeJavaEntryPoints::getParentWithRoleElseRoot(const jobject accessibleContext, const wchar_t *role) { 1080 jthrowable exception; 1081 jobject rAccessibleContext; 1082 1083 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getParentWithRoleElseRoot(%p):", 1084 accessibleContext); 1085 1086 if (getParentWithRoleElseRootMethod != (jmethodID) 0) { 1087 1088 // create a Java String for the role 1089 jstring roleName = jniEnv->NewString(role, (jsize)wcslen(role)); 1090 if (roleName == 0) { 1091 PrintDebugString("[ERROR]: NewString failed"); 1092 return FALSE; 1093 } 1094 1095 rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject, 1096 getParentWithRoleElseRootMethod, 1097 accessibleContext, roleName); 1098 EXCEPTION_CHECK("Getting ParentWithRoleElseRoot - call to CallObjectMethod()", (AccessibleContext)0); 1099 PrintDebugString("[INFO]: rAccessibleContext = %p", rAccessibleContext); 1100 jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext); 1101 EXCEPTION_CHECK("Getting ParentWithRoleElseRoot - call to NewGlobalRef()", FALSE); 1102 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 1103 rAccessibleContext, globalRef); 1104 return globalRef; 1105 } else { 1106 PrintDebugString("[ERROR]: either jniEnv == 0 or getParentWithRoleElseRootMethod == 0"); 1107 return 0; 1108 } 1109 } 1110 1111 /** 1112 * Returns how deep in the object hierarchy a given object is. 1113 * The top most object in the object hierarchy has an object depth of 0. 1114 * Returns -1 on error. 1115 */ 1116 jint 1117 AccessBridgeJavaEntryPoints::getObjectDepth(const jobject accessibleContext) { 1118 jthrowable exception; 1119 jint rResult; 1120 1121 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getObjectDepth(%p):", 1122 accessibleContext); 1123 1124 if (getObjectDepthMethod != (jmethodID) 0) { 1125 rResult = jniEnv->CallIntMethod(accessBridgeObject, 1126 getObjectDepthMethod, 1127 accessibleContext); 1128 EXCEPTION_CHECK("Getting ObjectDepth - call to CallIntMethod()", -1); 1129 PrintDebugString("[INFO]: rResult = %d", rResult); 1130 return rResult; 1131 } else { 1132 PrintDebugString("[ERROR]: either jniEnv == 0 or getObjectDepthMethod == 0"); 1133 return -1; 1134 } 1135 } 1136 1137 1138 1139 /** 1140 * Returns the Accessible Context of the current ActiveDescendent of an object. 1141 * Returns 0 on error. 1142 */ 1143 jobject 1144 AccessBridgeJavaEntryPoints::getActiveDescendent(const jobject accessibleContext) { 1145 jthrowable exception; 1146 jobject rAccessibleContext; 1147 1148 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getActiveDescendent(%p):", 1149 accessibleContext); 1150 1151 if (getActiveDescendentMethod != (jmethodID) 0) { 1152 rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject, 1153 getActiveDescendentMethod, 1154 accessibleContext); 1155 EXCEPTION_CHECK("Getting ActiveDescendent - call to CallObjectMethod()", (AccessibleContext)0); 1156 PrintDebugString("[INFO]: rAccessibleContext = %p", rAccessibleContext); 1157 jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext); 1158 EXCEPTION_CHECK("Getting ActiveDescendant - call to NewGlobalRef()", FALSE); 1159 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 1160 rAccessibleContext, globalRef); 1161 return globalRef; 1162 } else { 1163 PrintDebugString("[ERROR]: either jniEnv == 0 or getActiveDescendentMethod == 0"); 1164 return (AccessibleContext)0; 1165 } 1166 } 1167 1168 /** 1169 * Additional methods for Teton 1170 */ 1171 1172 /** 1173 * Returns an AccessibleName for a component using an algorithm optimized 1174 * for the JAWS screen reader by Ben Key (Freedom Scientific). This method 1175 * is only intended for JAWS. All other uses are entirely optional. 1176 * 1177 * Bug ID 4916682 - Implement JAWS AccessibleName policy 1178 */ 1179 BOOL 1180 AccessBridgeJavaEntryPoints::getVirtualAccessibleName ( 1181 IN const jobject object, 1182 OUT wchar_t * name, 1183 IN const int nameSize) 1184 { 1185 /* 1186 + 1187 Parameter validation 1188 + 1189 */ 1190 if ((name == 0) || (nameSize == 0)) 1191 { 1192 return FALSE; 1193 } 1194 ::memset (name, 0, nameSize * sizeof (wchar_t)); 1195 if (0 == object) 1196 { 1197 return FALSE; 1198 } 1199 1200 jstring js = NULL; 1201 const wchar_t * stringBytes = NULL; 1202 jthrowable exception = NULL; 1203 jsize length = 0; 1204 PrintDebugString("[INFO]: getVirtualAccessibleName called."); 1205 if (getVirtualAccessibleNameFromContextMethod != (jmethodID) 0) 1206 { 1207 js = (jstring) jniEnv->CallObjectMethod ( 1208 accessBridgeObject, 1209 getVirtualAccessibleNameFromContextMethod, 1210 object); 1211 EXCEPTION_CHECK("Getting AccessibleName - call to CallObjectMethod()", FALSE); 1212 if (js != (jstring) 0) 1213 { 1214 stringBytes = (const wchar_t *) jniEnv->GetStringChars (js, 0); 1215 EXCEPTION_CHECK("Getting AccessibleName - call to GetStringChars()", FALSE); 1216 wcsncpy(name, stringBytes, nameSize - 1); 1217 length = jniEnv->GetStringLength(js); 1218 EXCEPTION_CHECK("Getting AccessibleName - call to GetStringLength()", FALSE); 1219 jniEnv->ReleaseStringChars(js, stringBytes); 1220 EXCEPTION_CHECK("Getting AccessibleName - call to ReleaseStringChars()", FALSE); 1221 jniEnv->CallVoidMethod ( 1222 accessBridgeObject, 1223 decrementReferenceMethod, js); 1224 EXCEPTION_CHECK("Getting AccessibleName - call to CallVoidMethod()", FALSE); 1225 wPrintDebugString(L" Accessible Name = %ls", name); 1226 jniEnv->DeleteLocalRef(js); 1227 EXCEPTION_CHECK("Getting AccessibleName - call to DeleteLocalRef()", FALSE); 1228 } 1229 else 1230 { 1231 PrintDebugString("[INFO]: Accessible Name is null."); 1232 } 1233 } 1234 else 1235 { 1236 PrintDebugString("[INFO]: either jniEnv == 0 or getVirtualAccessibleNameFromContextMethod == 0"); 1237 return FALSE; 1238 } 1239 if ( 0 != name [0] ) 1240 { 1241 return TRUE; 1242 } 1243 return FALSE; 1244 } 1245 1246 1247 /** 1248 * Request focus for a component. Returns whether successful; 1249 * 1250 * Bug ID 4944757 - requestFocus method needed 1251 */ 1252 BOOL 1253 AccessBridgeJavaEntryPoints::requestFocus(const jobject accessibleContext) { 1254 1255 jthrowable exception; 1256 BOOL result = FALSE; 1257 1258 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::requestFocus(%p):", 1259 accessibleContext); 1260 1261 if (requestFocusMethod != (jmethodID) 0) { 1262 result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject, 1263 requestFocusMethod, 1264 accessibleContext); 1265 EXCEPTION_CHECK("requestFocus - call to CallBooleanMethod()", FALSE); 1266 PrintDebugString("[INFO]: result = %d", result); 1267 return result; 1268 } else { 1269 PrintDebugString("[ERROR]: either jniEnv == 0 or requestFocusMethod == 0"); 1270 return result; 1271 } 1272 } 1273 1274 /** 1275 * Selects text between two indices. Selection includes the text at the start index 1276 * and the text at the end index. Returns whether successful; 1277 * 1278 * Bug ID 4944758 - selectTextRange method needed 1279 */ 1280 BOOL 1281 AccessBridgeJavaEntryPoints::selectTextRange(const jobject accessibleContext, int startIndex, int endIndex) { 1282 1283 jthrowable exception; 1284 BOOL result = FALSE; 1285 1286 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::selectTextRange(%p start = %d end = %d):", 1287 accessibleContext, startIndex, endIndex); 1288 1289 if (selectTextRangeMethod != (jmethodID) 0) { 1290 result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject, 1291 selectTextRangeMethod, 1292 accessibleContext, 1293 startIndex, endIndex); 1294 EXCEPTION_CHECK("selectTextRange - call to CallBooleanMethod()", FALSE); 1295 PrintDebugString("[INFO]: result = %d", result); 1296 return result; 1297 } else { 1298 PrintDebugString("[ERROR]: either jniEnv == 0 or selectTextRangeMethod == 0"); 1299 return result; 1300 } 1301 } 1302 1303 /* 1304 * Returns whether two text attributes are the same. 1305 */ 1306 static BOOL CompareAccessibleTextAttributesInfo(AccessibleTextAttributesInfo *one, 1307 AccessibleTextAttributesInfo *two) { 1308 return(one->bold == two->bold 1309 && one->italic == two->italic 1310 && one->underline == two->underline 1311 && one->strikethrough == two->strikethrough 1312 && one->superscript == two->superscript 1313 && one->subscript == two->subscript 1314 && one->fontSize == two->fontSize 1315 && one->alignment == two->alignment 1316 && one->bidiLevel == two->bidiLevel 1317 && one->firstLineIndent == two->firstLineIndent 1318 && one->leftIndent == two->leftIndent 1319 && one->rightIndent == two->rightIndent 1320 && one->lineSpacing == two->lineSpacing 1321 && one->spaceAbove == two->spaceAbove 1322 && one->spaceBelow == two->spaceBelow 1323 && !wcscmp(one->backgroundColor,two->backgroundColor) 1324 && !wcscmp(one->foregroundColor,two->foregroundColor) 1325 && !wcscmp(one->fullAttributesString,two->fullAttributesString)); 1326 } 1327 1328 /** 1329 * Get text attributes between two indices. 1330 * 1331 * Only one AccessibleTextAttributesInfo structure is passed - which 1332 * contains the attributes for the first character, the function then goes 1333 * through the following characters in the range specified and stops when the 1334 * attributes are different from the first, it then returns in the passed 1335 * parameter len the number of characters with the attributes returned. In most 1336 * situations this will be all the characters, and if not the calling program 1337 * can easily get the attributes for the next characters with different 1338 * attributes 1339 * 1340 * Bug ID 4944761 - getTextAttributes between two indices method needed 1341 */ 1342 1343 /* NEW FASTER CODE!!*/ 1344 BOOL 1345 AccessBridgeJavaEntryPoints::getTextAttributesInRange(const jobject accessibleContext, 1346 int startIndex, int endIndex, 1347 AccessibleTextAttributesInfo *attributes, short *len) { 1348 1349 jstring js; 1350 const wchar_t *stringBytes; 1351 jthrowable exception; 1352 jsize length; 1353 BOOL result = FALSE; 1354 1355 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getTextAttributesInRange(%p start = %d end = %d):", 1356 accessibleContext, startIndex, endIndex); 1357 1358 *len = 0; 1359 result = getAccessibleTextAttributes((jobject)accessibleContext, startIndex, attributes); 1360 if (result != TRUE) { 1361 return FALSE; 1362 } 1363 (*len)++; 1364 1365 for (jint i = startIndex+1; i <= endIndex; i++) { 1366 1367 AccessibleTextAttributesInfo test_attributes = *attributes; 1368 // Get the full test_attributes string at i 1369 if (getAccessibleAttributesAtIndexFromContextMethod != (jmethodID) 0) { 1370 PrintDebugString("[INFO]: Getting full test_attributes string from Context..."); 1371 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 1372 getAccessibleAttributesAtIndexFromContextMethod, 1373 accessibleContext, i); 1374 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallObjectMethod()", FALSE); 1375 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 1376 if (js != (jstring) 0) { 1377 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 1378 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringChars()", FALSE); 1379 wcsncpy(test_attributes.fullAttributesString, stringBytes, (sizeof(test_attributes.fullAttributesString) / sizeof(wchar_t))); 1380 length = jniEnv->GetStringLength(js); 1381 test_attributes.fullAttributesString[length < (sizeof(test_attributes.fullAttributesString) / sizeof(wchar_t)) ? 1382 length : (sizeof(test_attributes.fullAttributesString) / sizeof(wchar_t))-2] = (wchar_t) 0; 1383 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringLength()", FALSE); 1384 jniEnv->ReleaseStringChars(js, stringBytes); 1385 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to ReleaseStringChars()", FALSE); 1386 jniEnv->CallVoidMethod(accessBridgeObject, 1387 decrementReferenceMethod, js); 1388 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallVoidMethod()", FALSE); 1389 wPrintDebugString(L"[INFO]: Accessible Text attributes = %ls", test_attributes.fullAttributesString); 1390 jniEnv->DeleteLocalRef(js); 1391 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to DeleteLocalRef()", FALSE); 1392 } else { 1393 PrintDebugString("[WARN]: Accessible Text attributes is null."); 1394 test_attributes.fullAttributesString[0] = (wchar_t) 0; 1395 return FALSE; 1396 } 1397 } else { 1398 PrintDebugString("[ERROR]: either env == 0 or getAccessibleAttributesAtIndexFromContextMethod == 0"); 1399 return FALSE; 1400 } 1401 1402 if(wcscmp(attributes->fullAttributesString,test_attributes.fullAttributesString)) 1403 break; 1404 if (result != TRUE) { 1405 return FALSE; 1406 } 1407 (*len)++; 1408 } 1409 return TRUE; 1410 } 1411 1412 /* 1413 * Returns the number of visible children of a component 1414 * 1415 * Bug ID 4944762- getVisibleChildren for list-like components needed 1416 */ 1417 int 1418 AccessBridgeJavaEntryPoints::getVisibleChildrenCount(const jobject accessibleContext) { 1419 1420 jthrowable exception; 1421 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getVisibleChildrenCount(%p)", 1422 accessibleContext); 1423 1424 // get the visible children count 1425 int numChildren = jniEnv->CallIntMethod(accessBridgeObject, getVisibleChildrenCountMethod, 1426 accessibleContext); 1427 EXCEPTION_CHECK("##### Getting visible children count - call to CallIntMethod()", FALSE); 1428 PrintDebugString("[INFO]: ##### visible children count = %d", numChildren); 1429 1430 return numChildren; 1431 } 1432 1433 1434 /* 1435 * This method is used to iterate through the visible children of a component. It 1436 * returns visible children information for a component starting at nStartIndex. 1437 * No more than MAX_VISIBLE_CHILDREN VisibleChildrenInfo objects will 1438 * be returned for each call to this method. Returns FALSE on error. 1439 * 1440 * Bug ID 4944762- getVisibleChildren for list-like components needed 1441 */ 1442 BOOL AccessBridgeJavaEntryPoints::getVisibleChildren(const jobject accessibleContext, 1443 const int nStartIndex, 1444 /* OUT */ VisibleChildrenInfo *visibleChildrenInfo) { 1445 1446 jthrowable exception; 1447 1448 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getVisibleChildren(%p, startIndex = %d)", 1449 accessibleContext, nStartIndex); 1450 1451 // get the visible children count 1452 int numChildren = jniEnv->CallIntMethod(accessBridgeObject, getVisibleChildrenCountMethod, 1453 accessibleContext); 1454 EXCEPTION_CHECK("##### Getting visible children count - call to CallIntMethod()", FALSE); 1455 PrintDebugString("[INFO]: ##### visible children count = %d", numChildren); 1456 1457 if (nStartIndex >= numChildren) { 1458 return FALSE; 1459 } 1460 1461 // get the visible children 1462 int bufIndex = 0; 1463 for (int i = nStartIndex; (i < numChildren) && (i < nStartIndex + MAX_VISIBLE_CHILDREN); i++) { 1464 PrintDebugString("[INFO]: getting visible child %d ...", i); 1465 1466 // get the visible child at index i 1467 jobject ac = jniEnv->CallObjectMethod(accessBridgeObject, getVisibleChildMethod, 1468 accessibleContext, i); 1469 EXCEPTION_CHECK("##### getVisibleChildMethod - call to CallObjectMethod()", FALSE); 1470 jobject globalRef = jniEnv->NewGlobalRef(ac); 1471 EXCEPTION_CHECK("##### getVisibleChildMethod - call to NewGlobalRef()", FALSE); 1472 visibleChildrenInfo->children[bufIndex] = (JOBJECT64)globalRef; 1473 PrintDebugString("[INFO]: ##### visible child = %p", globalRef); 1474 1475 bufIndex++; 1476 } 1477 visibleChildrenInfo->returnedChildrenCount = bufIndex; 1478 1479 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getVisibleChildren succeeded"); 1480 return TRUE; 1481 } 1482 1483 /** 1484 * Set the caret to a text position. Returns whether successful; 1485 * 1486 * Bug ID 4944770 - setCaretPosition method needed 1487 */ 1488 BOOL 1489 AccessBridgeJavaEntryPoints::setCaretPosition(const jobject accessibleContext, int position) { 1490 1491 jthrowable exception; 1492 BOOL result = FALSE; 1493 1494 PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::setCaretPostion(%p position = %d):", 1495 accessibleContext, position); 1496 1497 if (setCaretPositionMethod != (jmethodID) 0) { 1498 result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject, 1499 setCaretPositionMethod, 1500 accessibleContext, position); 1501 EXCEPTION_CHECK("setCaretPostion - call to CallBooleanMethod()", FALSE); 1502 PrintDebugString("[ERROR]: result = %d", result); 1503 return result; 1504 } else { 1505 PrintDebugString("[ERROR]: either jniEnv == 0 or setCaretPositionMethod == 0"); 1506 return result; 1507 } 1508 } 1509 1510 1511 // ----------------------------------- 1512 1513 /** 1514 * getVersionInfo - returns the version string of the java.version property 1515 * and the AccessBridge.java version 1516 * 1517 */ 1518 BOOL 1519 AccessBridgeJavaEntryPoints::getVersionInfo(AccessBridgeVersionInfo *info) { 1520 jstring js; 1521 const wchar_t *stringBytes; 1522 jthrowable exception; 1523 jsize length; 1524 1525 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getVersionInfo():"); 1526 1527 if (getJavaVersionPropertyMethod != (jmethodID) 0) { 1528 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 1529 getJavaVersionPropertyMethod); 1530 EXCEPTION_CHECK("Getting JavaVersionProperty - call to CallObjectMethod()", FALSE); 1531 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 1532 if (js != (jstring) 0) { 1533 length = jniEnv->GetStringLength(js); 1534 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 1535 if (stringBytes == NULL) { 1536 if (!jniEnv->ExceptionCheck()) { 1537 PrintDebugString("[ERROR]: *** Exception when getting JavaVersionProperty - call to GetStringChars"); 1538 jniEnv->ExceptionDescribe(); 1539 jniEnv->ExceptionClear(); 1540 } 1541 return FALSE; 1542 } 1543 wcsncpy(info->bridgeJavaDLLVersion, 1544 stringBytes, 1545 sizeof(info->bridgeJavaDLLVersion) / sizeof(wchar_t)); 1546 info->bridgeJavaDLLVersion[length < (sizeof(info->bridgeJavaDLLVersion) / sizeof(wchar_t)) ? 1547 length : (sizeof(info->bridgeJavaDLLVersion) / sizeof(wchar_t))-2] = (wchar_t) 0; 1548 wcsncpy(info->VMversion, 1549 stringBytes, 1550 sizeof(info->VMversion) / sizeof(wchar_t)); 1551 info->VMversion[length < (sizeof(info->VMversion) / sizeof(wchar_t)) ? 1552 length : (sizeof(info->VMversion) / sizeof(wchar_t))-2] = (wchar_t) 0; 1553 wcsncpy(info->bridgeJavaClassVersion, 1554 stringBytes, 1555 sizeof(info->bridgeJavaClassVersion) / sizeof(wchar_t)); 1556 info->bridgeJavaClassVersion[length < (sizeof(info->bridgeJavaClassVersion) / sizeof(wchar_t)) ? 1557 length : (sizeof(info->bridgeJavaClassVersion) / sizeof(wchar_t))-2] = (wchar_t) 0; 1558 wcsncpy(info->bridgeWinDLLVersion, 1559 stringBytes, 1560 sizeof(info->bridgeWinDLLVersion) / sizeof(wchar_t)); 1561 info->bridgeWinDLLVersion[length < (sizeof(info->bridgeWinDLLVersion) / sizeof(wchar_t)) ? 1562 length : (sizeof(info->bridgeWinDLLVersion) / sizeof(wchar_t))-2] = (wchar_t) 0; 1563 jniEnv->ReleaseStringChars(js, stringBytes); 1564 EXCEPTION_CHECK("Getting JavaVersionProperty - call to ReleaseStringChars()", FALSE); 1565 jniEnv->CallVoidMethod(accessBridgeObject, 1566 decrementReferenceMethod, js); 1567 EXCEPTION_CHECK("Getting JavaVersionProperty - call to CallVoidMethod()", FALSE); 1568 wPrintDebugString(L" Java version = %ls", info->VMversion); 1569 jniEnv->DeleteLocalRef(js); 1570 EXCEPTION_CHECK("Getting JavaVersionProperty - call to DeleteLocalRef()", FALSE); 1571 } else { 1572 PrintDebugString("[WARN]: Java version is null."); 1573 info->VMversion[0] = (wchar_t) 0; 1574 return FALSE; 1575 } 1576 } else { 1577 PrintDebugString("[ERROR]: either env == 0 or getJavaVersionPropertyMethod == 0"); 1578 return FALSE; 1579 } 1580 1581 return TRUE; 1582 } 1583 1584 1585 /* 1586 * Verifies the Java VM still exists and obj is an 1587 * instance of AccessibleText 1588 */ 1589 BOOL AccessBridgeJavaEntryPoints::verifyAccessibleText(jobject obj) { 1590 JavaVM *vm; 1591 BOOL retval; 1592 jthrowable exception; 1593 1594 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::verifyAccessibleText"); 1595 1596 if (jniEnv->GetJavaVM(&vm) != 0) { 1597 PrintDebugString("[ERROR]: No Java VM"); 1598 return FALSE; 1599 } 1600 1601 if (obj == (jobject)0) { 1602 PrintDebugString("[ERROR]: Null jobject"); 1603 return FALSE; 1604 } 1605 1606 // Copied from getAccessibleContextInfo 1607 if (getAccessibleTextFromContextMethod != (jmethodID) 0) { 1608 jobject returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject, 1609 getAccessibleTextFromContextMethod, 1610 (jobject)obj); 1611 EXCEPTION_CHECK("Getting AccessibleText - call to CallObjectMethod()", FALSE); 1612 PrintDebugString("[ERROR]: AccessibleText = %p", returnedJobject); 1613 retval = returnedJobject != (jobject) 0; 1614 jniEnv->DeleteLocalRef(returnedJobject); 1615 EXCEPTION_CHECK("Getting AccessibleText - call to DeleteLocalRef()", FALSE); 1616 } else { 1617 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextFromContextMethod == 0"); 1618 return FALSE; 1619 } 1620 if (retval == FALSE) { 1621 PrintDebugString("[ERROR]: jobject is not an AccessibleText"); 1622 } 1623 return retval; 1624 } 1625 1626 1627 /********** AccessibleContext routines ***********************************/ 1628 1629 /** 1630 * getAccessibleContextAt - performs the Java method call: 1631 * Accessible AccessBridge.getAccessibleContextAt(x, y) 1632 * 1633 * Note: this call explicitly goes through the AccessBridge, 1634 * so that it can keep a reference the returned jobject for the JavaVM. 1635 * You must explicity call INTreleaseJavaObject() when you are through using 1636 * the Accessible returned, to let the AccessBridge know it can release the 1637 * object, so that the can then garbage collect it. 1638 * 1639 */ 1640 jobject 1641 AccessBridgeJavaEntryPoints::getAccessibleContextAt(jint x, jint y, jobject accessibleContext) { 1642 jobject returnedAccessibleContext; 1643 jobject globalRef; 1644 jthrowable exception; 1645 1646 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleContextAt(%d, %d, %p):", 1647 x, y, accessibleContext); 1648 1649 if (getAccessibleContextAtMethod != (jmethodID) 0) { 1650 returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject, 1651 getAccessibleContextAtMethod, 1652 x, y, accessibleContext); 1653 EXCEPTION_CHECK("Getting AccessibleContextAt - call to CallObjectMethod()", FALSE); 1654 globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext); 1655 EXCEPTION_CHECK("Getting AccessibleContextAt - call to NewGlobalRef()", FALSE); 1656 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 1657 returnedAccessibleContext, globalRef); 1658 return globalRef; 1659 } else { 1660 PrintDebugString("[ERROR]: either env == 0 or getAccessibleContextAtMethod == 0"); 1661 return (jobject) 0; 1662 } 1663 } 1664 1665 /** 1666 * getAccessibleWithFocus - performs the Java method calls: 1667 * Accessible Translator.getAccessible(SwingEventMonitor.getComponentWithFocus(); 1668 * 1669 * Note: this call explicitly goes through the AccessBridge, 1670 * so that the AccessBridge can hide expected changes in how this functions 1671 * between JDK 1.1.x w/AccessibilityUtility classes, and JDK 1.2, when some 1672 * of this functionality may be built into the platform 1673 * 1674 */ 1675 jobject 1676 AccessBridgeJavaEntryPoints::getAccessibleContextWithFocus() { 1677 jobject returnedAccessibleContext; 1678 jobject globalRef; 1679 jthrowable exception; 1680 1681 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleContextWithFocus()"); 1682 1683 if (getAccessibleContextWithFocusMethod != (jmethodID) 0) { 1684 returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject, 1685 getAccessibleContextWithFocusMethod); 1686 EXCEPTION_CHECK("Getting AccessibleContextWithFocus - call to CallObjectMethod()", FALSE); 1687 globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext); 1688 EXCEPTION_CHECK("Getting AccessibleContextWithFocus - call to NewGlobalRef()", FALSE); 1689 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 1690 returnedAccessibleContext, globalRef); 1691 return globalRef; 1692 } else { 1693 PrintDebugString("[ERROR]: either jniEnv == 0 or getAccessibleContextWithFocusMethod == 0"); 1694 return (jobject) 0; 1695 } 1696 } 1697 1698 /** 1699 * getAccessibleContextInfo - fills a struct with a bunch of information 1700 * contained in the Java Accessibility API 1701 * 1702 * Note: if the AccessibleContext parameter is bogus, this call will blow up 1703 * 1704 * Note: this call explicitly goes through the AccessBridge, 1705 * so that it can keep a reference the returned jobject for the JavaVM. 1706 * You must explicity call releaseJavaObject() when you are through using 1707 * the AccessibleContext returned, to let the AccessBridge know it can release the 1708 * object, so that the JavaVM can then garbage collect it. 1709 */ 1710 BOOL 1711 AccessBridgeJavaEntryPoints::getAccessibleContextInfo(jobject accessibleContext, AccessibleContextInfo *info) { 1712 jstring js; 1713 const wchar_t *stringBytes; 1714 jobject returnedJobject; 1715 jthrowable exception; 1716 jsize length; 1717 1718 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleContextInfo(%p):", accessibleContext); 1719 1720 ZeroMemory(info, sizeof(AccessibleContextInfo)); 1721 1722 if (accessibleContext == (jobject) 0) { 1723 PrintDebugString("[WARN]: passed in AccessibleContext == null! (oops)"); 1724 return (FALSE); 1725 } 1726 1727 // Get the Accessible Name 1728 if (getAccessibleNameFromContextMethod != (jmethodID) 0) { 1729 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 1730 getAccessibleNameFromContextMethod, 1731 accessibleContext); 1732 EXCEPTION_CHECK("Getting AccessibleName - call to CallObjectMethod()", FALSE); 1733 if (js != (jstring) 0) { 1734 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 1735 EXCEPTION_CHECK("Getting AccessibleName - call to GetStringChars()", FALSE); 1736 wcsncpy(info->name, stringBytes, (sizeof(info->name) / sizeof(wchar_t))); 1737 length = jniEnv->GetStringLength(js); 1738 info->name[length < (sizeof(info->name) / sizeof(wchar_t)) ? 1739 length : (sizeof(info->name) / sizeof(wchar_t))-2] = (wchar_t) 0; 1740 EXCEPTION_CHECK("Getting AccessibleName - call to GetStringLength()", FALSE); 1741 jniEnv->ReleaseStringChars(js, stringBytes); 1742 EXCEPTION_CHECK("Getting AccessibleName - call to ReleaseStringChars()", FALSE); 1743 jniEnv->CallVoidMethod(accessBridgeObject, 1744 decrementReferenceMethod, js); 1745 EXCEPTION_CHECK("Getting AccessibleName - call to CallVoidMethod()", FALSE); 1746 wPrintDebugString(L"[INFO]: Accessible Name = %ls", info->name); 1747 jniEnv->DeleteLocalRef(js); 1748 EXCEPTION_CHECK("Getting AccessibleName - call to DeleteLocalRef()", FALSE); 1749 } else { 1750 PrintDebugString("[WARN]: Accessible Name is null."); 1751 info->name[0] = (wchar_t) 0; 1752 } 1753 } else { 1754 PrintDebugString("[ERROR]: either env == 0 or getAccessibleNameFromContextMethod == 0"); 1755 return FALSE; 1756 } 1757 1758 1759 // Get the Accessible Description 1760 if (getAccessibleDescriptionFromContextMethod != (jmethodID) 0) { 1761 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 1762 getAccessibleDescriptionFromContextMethod, 1763 accessibleContext); 1764 EXCEPTION_CHECK("Getting AccessibleDescription - call to CallObjectMethod()", FALSE); 1765 if (js != (jstring) 0) { 1766 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 1767 EXCEPTION_CHECK("Getting AccessibleName - call to GetStringChars()", FALSE); 1768 wcsncpy(info->description, stringBytes, (sizeof(info->description) / sizeof(wchar_t))); 1769 length = jniEnv->GetStringLength(js); 1770 info->description[length < (sizeof(info->description) / sizeof(wchar_t)) ? 1771 length : (sizeof(info->description) / sizeof(wchar_t))-2] = (wchar_t) 0; 1772 EXCEPTION_CHECK("Getting AccessibleName - call to GetStringLength()", FALSE); 1773 jniEnv->ReleaseStringChars(js, stringBytes); 1774 EXCEPTION_CHECK("Getting AccessibleName - call to ReleaseStringChars()", FALSE); 1775 jniEnv->CallVoidMethod(accessBridgeObject, 1776 decrementReferenceMethod, js); 1777 EXCEPTION_CHECK("Getting AccessibleName - call to CallVoidMethod()", FALSE); 1778 wPrintDebugString(L"[INFO]: Accessible Description = %ls", info->description); 1779 jniEnv->DeleteLocalRef(js); 1780 EXCEPTION_CHECK("Getting AccessibleName - call to DeleteLocalRef()", FALSE); 1781 } else { 1782 PrintDebugString("[WARN]: Accessible Description is null."); 1783 info->description[0] = (wchar_t) 0; 1784 } 1785 } else { 1786 PrintDebugString("[ERROR]: either env == 0 or getAccessibleDescriptionFromContextMethod == 0"); 1787 return FALSE; 1788 } 1789 1790 1791 // Get the Accessible Role String 1792 if (getAccessibleRoleStringFromContextMethod != (jmethodID) 0) { 1793 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 1794 getAccessibleRoleStringFromContextMethod, 1795 accessibleContext); 1796 EXCEPTION_CHECK("Getting AccessibleRole - call to CallObjectMethod()", FALSE); 1797 if (js != (jstring) 0) { 1798 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 1799 EXCEPTION_CHECK("Getting AccessibleRole - call to GetStringChars()", FALSE); 1800 wcsncpy(info->role, stringBytes, (sizeof(info->role) / sizeof(wchar_t))); 1801 length = jniEnv->GetStringLength(js); 1802 info->role[length < (sizeof(info->role) / sizeof(wchar_t)) ? 1803 length : (sizeof(info->role) / sizeof(wchar_t))-2] = (wchar_t) 0; 1804 EXCEPTION_CHECK("Getting AccessibleRole - call to GetStringLength()", FALSE); 1805 jniEnv->ReleaseStringChars(js, stringBytes); 1806 EXCEPTION_CHECK("Getting AccessibleRole - call to ReleaseStringChars()", FALSE); 1807 jniEnv->CallVoidMethod(accessBridgeObject, 1808 decrementReferenceMethod, js); 1809 EXCEPTION_CHECK("Getting AccessibleRole - call to CallVoidMethod()", FALSE); 1810 wPrintDebugString(L"[INFO]: Accessible Role = %ls", info->role); 1811 jniEnv->DeleteLocalRef(js); 1812 EXCEPTION_CHECK("Getting AccessibleRole - call to DeleteLocalRef()", FALSE); 1813 } else { 1814 PrintDebugString("[WARN]: Accessible Role is null."); 1815 info->role[0] = (wchar_t) 0; 1816 } 1817 } else { 1818 PrintDebugString("[ERROR]: either env == 0 or getAccessibleRoleStringFromContextMethod == 0"); 1819 return FALSE; 1820 } 1821 1822 1823 // Get the Accessible Role String in the en_US locale 1824 if (getAccessibleRoleStringFromContext_en_USMethod != (jmethodID) 0) { 1825 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 1826 getAccessibleRoleStringFromContext_en_USMethod, 1827 accessibleContext); 1828 EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to CallObjectMethod()", FALSE); 1829 if (js != (jstring) 0) { 1830 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 1831 EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to GetStringChars()", FALSE); 1832 wcsncpy(info->role_en_US, stringBytes, (sizeof(info->role_en_US) / sizeof(wchar_t))); 1833 length = jniEnv->GetStringLength(js); 1834 info->role_en_US[length < (sizeof(info->role_en_US) / sizeof(wchar_t)) ? 1835 length : (sizeof(info->role_en_US) / sizeof(wchar_t))-2] = (wchar_t) 0; 1836 EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to GetStringLength()", FALSE); 1837 jniEnv->ReleaseStringChars(js, stringBytes); 1838 EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to ReleaseStringChars()", FALSE); 1839 jniEnv->CallVoidMethod(accessBridgeObject, 1840 decrementReferenceMethod, js); 1841 EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to CallVoidMethod()", FALSE); 1842 wPrintDebugString(L"[INFO]: Accessible Role en_US = %ls", info->role_en_US); 1843 jniEnv->DeleteLocalRef(js); 1844 EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to DeleteLocalRef()", FALSE); 1845 } else { 1846 PrintDebugString("[WARN]: Accessible Role en_US is null."); 1847 info->role[0] = (wchar_t) 0; 1848 } 1849 } else { 1850 PrintDebugString("[ERROR]: either env == 0 or getAccessibleRoleStringFromContext_en_USMethod == 0"); 1851 return FALSE; 1852 } 1853 1854 // Get the Accessible States String 1855 if (getAccessibleStatesStringFromContextMethod != (jmethodID) 0) { 1856 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 1857 getAccessibleStatesStringFromContextMethod, 1858 accessibleContext); 1859 EXCEPTION_CHECK("Getting AccessibleState - call to CallObjectMethod()", FALSE); 1860 if (js != (jstring) 0) { 1861 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 1862 EXCEPTION_CHECK("Getting AccessibleState - call to GetStringChars()", FALSE); 1863 wcsncpy(info->states, stringBytes, (sizeof(info->states) / sizeof(wchar_t))); 1864 length = jniEnv->GetStringLength(js); 1865 info->states[length < (sizeof(info->states) / sizeof(wchar_t)) ? 1866 length : (sizeof(info->states) / sizeof(wchar_t))-2] = (wchar_t) 0; 1867 EXCEPTION_CHECK("Getting AccessibleState - call to GetStringLength()", FALSE); 1868 jniEnv->ReleaseStringChars(js, stringBytes); 1869 EXCEPTION_CHECK("Getting AccessibleState - call to ReleaseStringChars()", FALSE); 1870 jniEnv->CallVoidMethod(accessBridgeObject, 1871 decrementReferenceMethod, js); 1872 EXCEPTION_CHECK("Getting AccessibleState - call to CallVoidMethod()", FALSE); 1873 wPrintDebugString(L"[INFO]: Accessible States = %ls", info->states); 1874 jniEnv->DeleteLocalRef(js); 1875 EXCEPTION_CHECK("Getting AccessibleState - call to DeleteLocalRef()", FALSE); 1876 } else { 1877 PrintDebugString("[WARN]: Accessible States is null."); 1878 info->states[0] = (wchar_t) 0; 1879 } 1880 } else { 1881 PrintDebugString("[ERROR]: either env == 0 or getAccessibleStatesStringFromContextMethod == 0"); 1882 return FALSE; 1883 } 1884 1885 // Get the Accessible States String in the en_US locale 1886 if (getAccessibleStatesStringFromContext_en_USMethod != (jmethodID) 0) { 1887 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 1888 getAccessibleStatesStringFromContext_en_USMethod, 1889 accessibleContext); 1890 EXCEPTION_CHECK("Getting AccessibleState_en_US - call to CallObjectMethod()", FALSE); 1891 if (js != (jstring) 0) { 1892 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 1893 EXCEPTION_CHECK("Getting AccessibleState_en_US - call to GetStringChars()", FALSE); 1894 wcsncpy(info->states_en_US, stringBytes, (sizeof(info->states_en_US) / sizeof(wchar_t))); 1895 length = jniEnv->GetStringLength(js); 1896 info->states_en_US[length < (sizeof(info->states_en_US) / sizeof(wchar_t)) ? 1897 length : (sizeof(info->states_en_US) / sizeof(wchar_t))-2] = (wchar_t) 0; 1898 EXCEPTION_CHECK("Getting AccessibleState_en_US - call to GetStringLength()", FALSE); 1899 jniEnv->ReleaseStringChars(js, stringBytes); 1900 EXCEPTION_CHECK("Getting AccessibleState_en_US - call to ReleaseStringChars()", FALSE); 1901 jniEnv->CallVoidMethod(accessBridgeObject, 1902 decrementReferenceMethod, js); 1903 EXCEPTION_CHECK("Getting AccessibleState_en_US - call to CallVoidMethod()", FALSE); 1904 wPrintDebugString(L"[INFO]: Accessible States en_US = %ls", info->states_en_US); 1905 jniEnv->DeleteLocalRef(js); 1906 EXCEPTION_CHECK("Getting AccessibleState_en_US - call to DeleteLocalRef()", FALSE); 1907 } else { 1908 PrintDebugString("[WARN]: Accessible States en_US is null."); 1909 info->states[0] = (wchar_t) 0; 1910 } 1911 } else { 1912 PrintDebugString("[ERROR]: either env == 0 or getAccessibleStatesStringFromContext_en_USMethod == 0"); 1913 return FALSE; 1914 } 1915 1916 1917 // Get the index in Parent 1918 if (getAccessibleIndexInParentFromContextMethod != (jmethodID) 0) { 1919 info->indexInParent = jniEnv->CallIntMethod(accessBridgeObject, 1920 getAccessibleIndexInParentFromContextMethod, 1921 accessibleContext); 1922 EXCEPTION_CHECK("Getting AccessibleIndexInParent - call to CallIntMethod()", FALSE); 1923 PrintDebugString("[INFO]: Index in Parent = %d", info->indexInParent); 1924 } else { 1925 PrintDebugString("[ERROR]: either env == 0 or getAccessibleIndexInParentFromContextMethod == 0"); 1926 return FALSE; 1927 } 1928 1929 1930 PrintDebugString("[INFO]: *** jniEnv: %p; accessBridgeObject: %p; AccessibleContext: %p ***", 1931 jniEnv, accessBridgeObject, accessibleContext); 1932 1933 // Get the children count 1934 if (getAccessibleChildrenCountFromContextMethod != (jmethodID) 0) { 1935 info->childrenCount = jniEnv->CallIntMethod(accessBridgeObject, 1936 getAccessibleChildrenCountFromContextMethod, 1937 accessibleContext); 1938 EXCEPTION_CHECK("Getting AccessibleChildrenCount - call to CallIntMethod()", FALSE); 1939 PrintDebugString("[INFO]: Children count = %d", info->childrenCount); 1940 } else { 1941 PrintDebugString("[ERROR]: either env == 0 or getAccessibleChildrenCountFromContextMethod == 0"); 1942 return FALSE; 1943 } 1944 1945 PrintDebugString("[INFO]: *** jniEnv: %p; accessBridgeObject: %p; AccessibleContext: %X ***", 1946 jniEnv, accessBridgeObject, accessibleContext); 1947 1948 1949 // Get the x coord 1950 if (getAccessibleXcoordFromContextMethod != (jmethodID) 0) { 1951 info->x = jniEnv->CallIntMethod(accessBridgeObject, 1952 getAccessibleXcoordFromContextMethod, 1953 accessibleContext); 1954 EXCEPTION_CHECK("Getting AccessibleXcoord - call to CallIntMethod()", FALSE); 1955 PrintDebugString("[INFO]: X coord = %d", info->x); 1956 } else { 1957 PrintDebugString("[ERROR]: either env == 0 or getAccessibleXcoordFromContextMethod == 0"); 1958 return FALSE; 1959 } 1960 1961 PrintDebugString("[INFO]: *** jniEnv: %X; accessBridgeObject: %X; AccessibleContext: %p ***", 1962 jniEnv, accessBridgeObject, accessibleContext); 1963 1964 1965 // Get the y coord 1966 if (getAccessibleYcoordFromContextMethod != (jmethodID) 0) { 1967 info->y = jniEnv->CallIntMethod(accessBridgeObject, 1968 getAccessibleYcoordFromContextMethod, 1969 accessibleContext); 1970 EXCEPTION_CHECK("Getting AccessibleYcoord - call to CallIntMethod()", FALSE); 1971 PrintDebugString("[INFO]: Y coord = %d", info->y); 1972 } else { 1973 PrintDebugString("[ERROR]: either env == 0 or getAccessibleYcoordFromContextMethod == 0"); 1974 return FALSE; 1975 } 1976 1977 // Get the width 1978 if (getAccessibleWidthFromContextMethod != (jmethodID) 0) { 1979 info->width = jniEnv->CallIntMethod(accessBridgeObject, 1980 getAccessibleWidthFromContextMethod, 1981 accessibleContext); 1982 EXCEPTION_CHECK("Getting AccessibleWidth - call to CallIntMethod()", FALSE); 1983 PrintDebugString("[INFO]: Width = %d", info->width); 1984 } else { 1985 PrintDebugString("[ERROR]: either env == 0 or getAccessibleWidthFromContextMethod == 0"); 1986 return FALSE; 1987 } 1988 1989 // Get the height 1990 if (getAccessibleHeightFromContextMethod != (jmethodID) 0) { 1991 info->height = jniEnv->CallIntMethod(accessBridgeObject, 1992 getAccessibleHeightFromContextMethod, 1993 accessibleContext); 1994 EXCEPTION_CHECK("Getting AccessibleHeight - call to CallIntMethod()", FALSE); 1995 PrintDebugString("[INFO]: Height = %d", info->height); 1996 } else { 1997 PrintDebugString("[ERROR]: either env == 0 or getAccessibleHeightFromContextMethod == 0"); 1998 return FALSE; 1999 } 2000 2001 // Get the AccessibleComponent 2002 if (getAccessibleComponentFromContextMethod != (jmethodID) 0) { 2003 returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject, 2004 getAccessibleComponentFromContextMethod, 2005 accessibleContext); 2006 EXCEPTION_CHECK("Getting AccessibleComponent - call to CallObjectMethod()", FALSE); 2007 PrintDebugString("[INFO]: AccessibleComponent = %p", returnedJobject); 2008 info->accessibleComponent = (returnedJobject != (jobject) 0 ? TRUE : FALSE); 2009 jniEnv->DeleteLocalRef(returnedJobject); 2010 EXCEPTION_CHECK("Getting AccessibleComponent - call to DeleteLocalRef()", FALSE); 2011 } else { 2012 PrintDebugString("[ERROR]: either env == 0 or getAccessibleComponentFromContextMethod == 0"); 2013 return FALSE; 2014 } 2015 2016 // Get the AccessibleAction 2017 if (getAccessibleActionFromContextMethod != (jmethodID) 0) { 2018 returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject, 2019 getAccessibleActionFromContextMethod, 2020 accessibleContext); 2021 EXCEPTION_CHECK("Getting AccessibleAction - call to CallObjectMethod()", FALSE); 2022 PrintDebugString("[INFO]: AccessibleAction = %p", returnedJobject); 2023 info->accessibleAction = (returnedJobject != (jobject) 0 ? TRUE : FALSE); 2024 jniEnv->DeleteLocalRef(returnedJobject); 2025 EXCEPTION_CHECK("Getting AccessibleAction - call to DeleteLocalRef()", FALSE); 2026 } else { 2027 PrintDebugString("[ERROR]: either env == 0 or getAccessibleActionFromContextMethod == 0"); 2028 return FALSE; 2029 } 2030 2031 // Get the AccessibleSelection 2032 if (getAccessibleSelectionFromContextMethod != (jmethodID) 0) { 2033 returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject, 2034 getAccessibleSelectionFromContextMethod, 2035 accessibleContext); 2036 EXCEPTION_CHECK("Getting AccessibleSelection - call to CallObjectMethod()", FALSE); 2037 PrintDebugString("[INFO]: AccessibleSelection = %p", returnedJobject); 2038 info->accessibleSelection = (returnedJobject != (jobject) 0 ? TRUE : FALSE); 2039 jniEnv->DeleteLocalRef(returnedJobject); 2040 EXCEPTION_CHECK("Getting AccessibleSelection - call to DeleteLocalRef()", FALSE); 2041 } else { 2042 PrintDebugString("[ERROR]: either env == 0 or getAccessibleSelectionFromContextMethod == 0"); 2043 return FALSE; 2044 } 2045 2046 // Get the AccessibleTable 2047 if (getAccessibleTableFromContextMethod != (jmethodID) 0) { 2048 PrintDebugString("[INFO]: ##### Calling getAccessibleTableFromContextMethod ..."); 2049 returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject, 2050 getAccessibleTableFromContextMethod, 2051 accessibleContext); 2052 PrintDebugString("[INFO]: ##### ... Returned from getAccessibleTableFromContextMethod"); 2053 EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE); 2054 PrintDebugString("[INFO]: ##### AccessibleTable = %p", returnedJobject); 2055 if (returnedJobject != (jobject) 0) { 2056 info->accessibleInterfaces |= cAccessibleTableInterface; 2057 } 2058 jniEnv->DeleteLocalRef(returnedJobject); 2059 EXCEPTION_CHECK("##### Getting AccessibleTable - call to DeleteLocalRef()", FALSE); 2060 2061 /* 2062 returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject, 2063 getAccessibleTableFromContextMethod, 2064 AccessibleContext); 2065 PrintDebugString("##### ... Returned from getAccessibleTableFromContextMethod"); 2066 EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE); 2067 PrintDebugString(" ##### AccessibleTable = %X", returnedJobject); 2068 info->accessibleTable = returnedJobject; 2069 */ 2070 2071 } else { 2072 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableFromContextMethod == 0"); 2073 return FALSE; 2074 } 2075 2076 // Get the AccessibleText 2077 if (getAccessibleTextFromContextMethod != (jmethodID) 0) { 2078 returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject, 2079 getAccessibleTextFromContextMethod, 2080 accessibleContext); 2081 EXCEPTION_CHECK("Getting AccessibleText - call to CallObjectMethod()", FALSE); 2082 PrintDebugString("[INFO]: AccessibleText = %p", returnedJobject); 2083 info->accessibleText = (returnedJobject != (jobject) 0 ? TRUE : FALSE); 2084 jniEnv->DeleteLocalRef(returnedJobject); 2085 EXCEPTION_CHECK("Getting AccessibleText - call to DeleteLocalRef()", FALSE); 2086 } else { 2087 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextFromContextMethod == 0"); 2088 return FALSE; 2089 } 2090 2091 // Get the AccessibleValue 2092 if (getAccessibleValueFromContextMethod != (jmethodID) 0) { 2093 returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject, 2094 getAccessibleValueFromContextMethod, 2095 accessibleContext); 2096 EXCEPTION_CHECK("Getting AccessibleValue - call to CallObjectMethod()", FALSE); 2097 PrintDebugString("[INFO]: AccessibleValue = %p", returnedJobject); 2098 if (returnedJobject != (jobject) 0) { 2099 info->accessibleInterfaces |= cAccessibleValueInterface; 2100 } 2101 jniEnv->DeleteLocalRef(returnedJobject); 2102 EXCEPTION_CHECK("Getting AccessibleValue - call to DeleteLocalRef()", FALSE); 2103 } else { 2104 PrintDebugString("[ERROR]: either env == 0 or getAccessibleValueFromContextMethod == 0"); 2105 return FALSE; 2106 } 2107 2108 // FIX 2109 // get the AccessibleHypertext 2110 if (getAccessibleHypertextMethod != (jmethodID) 0 && 2111 getAccessibleHyperlinkCountMethod != (jmethodID) 0 && 2112 getAccessibleHyperlinkMethod != (jmethodID) 0 && 2113 getAccessibleHyperlinkTextMethod != (jmethodID) 0 && 2114 getAccessibleHyperlinkStartIndexMethod != (jmethodID) 0 && 2115 getAccessibleHyperlinkEndIndexMethod != (jmethodID) 0) { 2116 returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject, 2117 getAccessibleHypertextMethod, 2118 accessibleContext); 2119 EXCEPTION_CHECK("Getting AccessibleHypertext - call to CallObjectMethod()", FALSE); 2120 PrintDebugString("[INFO]: AccessibleHypertext = %p", 2121 returnedJobject); 2122 if (returnedJobject != (jobject) 0) { 2123 info->accessibleInterfaces |= cAccessibleHypertextInterface; 2124 } 2125 jniEnv->DeleteLocalRef(returnedJobject); 2126 EXCEPTION_CHECK("Getting AccessibleHypertext - call to DeleteLocalRef()", FALSE); 2127 } 2128 2129 // set new accessibleInterfaces flags from old BOOL values 2130 if(info->accessibleComponent) 2131 info->accessibleInterfaces |= cAccessibleComponentInterface; 2132 if(info->accessibleAction) 2133 info->accessibleInterfaces |= cAccessibleActionInterface; 2134 if(info->accessibleSelection) 2135 info->accessibleInterfaces |= cAccessibleSelectionInterface; 2136 if(info->accessibleText) 2137 info->accessibleInterfaces |= cAccessibleTextInterface; 2138 // FIX END 2139 2140 return TRUE; 2141 } 2142 2143 /** 2144 * getAccessibleChildFromContext - performs the Java method call: 2145 * AccessibleContext AccessBridge.getAccessibleChildContext(AccessibleContext) 2146 * 2147 * Note: if the AccessibleContext parameter is bogus, this call will blow up 2148 * 2149 * Note: this call explicitly goes through the AccessBridge, 2150 * so that it can keep a reference the returned jobject for the JavaVM. 2151 * You must explicity call releaseJavaObject() when you are through using 2152 * the AccessibleContext returned, to let the AccessBridge know it can release the 2153 * object, so that the JavaVM can then garbage collect it. 2154 */ 2155 jobject 2156 AccessBridgeJavaEntryPoints::getAccessibleChildFromContext(jobject accessibleContext, jint childIndex) { 2157 jobject returnedAccessibleContext; 2158 jobject globalRef; 2159 jthrowable exception; 2160 2161 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleChildContext(%p, %d):", 2162 accessibleContext, childIndex); 2163 2164 if (getAccessibleChildFromContextMethod != (jmethodID) 0) { 2165 returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject, 2166 getAccessibleChildFromContextMethod, 2167 accessibleContext, childIndex); 2168 EXCEPTION_CHECK("Getting AccessibleChild - call to CallObjectMethod()", FALSE); 2169 globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext); 2170 EXCEPTION_CHECK("Getting AccessibleChild - call to NewGlobalRef()", FALSE); 2171 jniEnv->DeleteLocalRef(returnedAccessibleContext); 2172 EXCEPTION_CHECK("Getting AccessibleChild - call to DeleteLocalRef()", FALSE); 2173 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 2174 returnedAccessibleContext, globalRef); 2175 return globalRef; 2176 } else { 2177 PrintDebugString("[ERROR]: either env == 0 or getAccessibleChildContextMethod == 0"); 2178 return (jobject) 0; 2179 } 2180 } 2181 2182 /** 2183 * getAccessibleParentFromContext - returns the AccessibleContext parent 2184 * 2185 */ 2186 jobject 2187 AccessBridgeJavaEntryPoints::getAccessibleParentFromContext(jobject accessibleContext) 2188 { 2189 jobject returnedAccessibleContext; 2190 jobject globalRef; 2191 jthrowable exception; 2192 2193 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleParentFromContext(%p):", accessibleContext); 2194 2195 if (getAccessibleParentFromContextMethod != (jmethodID) 0) { 2196 returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject, 2197 getAccessibleParentFromContextMethod, 2198 accessibleContext); 2199 EXCEPTION_CHECK("Getting AccessibleParent - call to CallObjectMethod()", FALSE); 2200 globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext); 2201 EXCEPTION_CHECK("Getting AccessibleParent - call to NewGlobalRef()", FALSE); 2202 jniEnv->DeleteLocalRef(returnedAccessibleContext); 2203 EXCEPTION_CHECK("Getting AccessibleParent - call to DeleteLocalRef()", FALSE); 2204 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 2205 returnedAccessibleContext, globalRef); 2206 return globalRef; 2207 } else { 2208 PrintDebugString("[ERROR]: either env == 0 or getAccessibleParentFromContextMethod == 0"); 2209 return (jobject) 0; 2210 } 2211 } 2212 2213 2214 /********** AccessibleTable routines **********************************/ 2215 2216 BOOL 2217 AccessBridgeJavaEntryPoints::getAccessibleTableInfo(jobject accessibleContext, 2218 AccessibleTableInfo *tableInfo) { 2219 2220 jthrowable exception; 2221 2222 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableInfo(%p):", 2223 accessibleContext); 2224 2225 // get the table row count 2226 if (getAccessibleTableRowCountMethod != (jmethodID) 0) { 2227 tableInfo->rowCount = jniEnv->CallIntMethod(accessBridgeObject, 2228 getAccessibleTableRowCountMethod, 2229 accessibleContext); 2230 EXCEPTION_CHECK("##### Getting AccessibleTableRowCount - call to CallIntMethod()", FALSE); 2231 PrintDebugString("[INFO]: ##### table row count = %d", tableInfo->rowCount); 2232 } else { 2233 PrintDebugString("[ERROR]: either env == 0 or getAccessibleRowCountMethod == 0"); 2234 return FALSE; 2235 } 2236 2237 // get the table column count 2238 if (getAccessibleTableColumnCountMethod != (jmethodID) 0) { 2239 tableInfo->columnCount = jniEnv->CallIntMethod(accessBridgeObject, 2240 getAccessibleTableColumnCountMethod, 2241 accessibleContext); 2242 EXCEPTION_CHECK("Getting AccessibleTableColumnCount - call to CallIntMethod()", FALSE); 2243 PrintDebugString("[INFO]: ##### table column count = %d", tableInfo->columnCount); 2244 } else { 2245 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnCountMethod == 0"); 2246 return FALSE; 2247 } 2248 2249 // get the AccessibleTable 2250 if (getAccessibleTableFromContextMethod != (jmethodID) 0) { 2251 PrintDebugString("[INFO]: ##### Calling getAccessibleTableFromContextMethod ..."); 2252 jobject accTable = jniEnv->CallObjectMethod(accessBridgeObject, 2253 getAccessibleTableFromContextMethod, 2254 accessibleContext); 2255 PrintDebugString("[INFO]: ##### ... Returned from getAccessibleTableFromContextMethod"); 2256 EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE); 2257 jobject globalRef = jniEnv->NewGlobalRef(accTable); 2258 EXCEPTION_CHECK("##### Getting AccessibleTable - call to NewGlobalRef()", FALSE); 2259 tableInfo->accessibleTable = (JOBJECT64)globalRef; 2260 PrintDebugString("[INFO]: ##### accessibleTable = %p", globalRef); 2261 } else { 2262 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableFromContextMethod == 0"); 2263 return FALSE; 2264 } 2265 2266 // cache the AccessibleContext 2267 if (getContextFromAccessibleTableMethod != (jmethodID) 0) { 2268 PrintDebugString("[INFO]: ##### Calling getContextFromAccessibleTable Method ..."); 2269 jobject ac = jniEnv->CallObjectMethod(accessBridgeObject, 2270 getContextFromAccessibleTableMethod, 2271 accessibleContext); 2272 PrintDebugString("[INFO]: ##### ... Returned from getContextFromAccessibleTable Method"); 2273 EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE); 2274 jobject globalRef = jniEnv->NewGlobalRef(ac); 2275 EXCEPTION_CHECK("##### Getting AccessibleTable - call to NewGlobalRef()", FALSE); 2276 tableInfo->accessibleContext = (JOBJECT64)globalRef; 2277 PrintDebugString("[INFO]: ##### accessibleContext = %p", globalRef); 2278 } else { 2279 PrintDebugString("[ERROR]: either env == 0 or getContextFromAccessibleTable Method == 0"); 2280 return FALSE; 2281 } 2282 2283 // FIX - set unused elements 2284 tableInfo->caption = NULL; 2285 tableInfo->summary = NULL; 2286 2287 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableInfo succeeded"); 2288 return TRUE; 2289 } 2290 2291 BOOL 2292 AccessBridgeJavaEntryPoints::getAccessibleTableCellInfo(jobject accessibleTable, jint row, jint column, 2293 AccessibleTableCellInfo *tableCellInfo) { 2294 2295 jthrowable exception; 2296 2297 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableCellInfo(%p): row=%d, column=%d", 2298 accessibleTable, row, column); 2299 2300 // FIX 2301 ZeroMemory(tableCellInfo, sizeof(AccessibleTableCellInfo)); 2302 tableCellInfo->row = row; 2303 tableCellInfo->column = column; 2304 // FIX END 2305 2306 // get the table cell index 2307 if (getAccessibleTableCellIndexMethod != (jmethodID) 0) { 2308 tableCellInfo->index = jniEnv->CallIntMethod(accessBridgeObject, 2309 getAccessibleTableCellIndexMethod, 2310 accessibleTable, row, column); 2311 EXCEPTION_CHECK("##### Getting AccessibleTableCellIndex - call to CallIntMethod()", FALSE); 2312 PrintDebugString("[INFO]: ##### table cell index = %d", tableCellInfo->index); 2313 } else { 2314 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableCellIndexMethod == 0"); 2315 return FALSE; 2316 } 2317 2318 // get the table cell row extent 2319 if (getAccessibleTableCellRowExtentMethod != (jmethodID) 0) { 2320 tableCellInfo->rowExtent = jniEnv->CallIntMethod(accessBridgeObject, 2321 getAccessibleTableCellRowExtentMethod, 2322 accessibleTable, row, column); 2323 EXCEPTION_CHECK("##### Getting AccessibleTableCellRowExtentCount - call to CallIntMethod()", FALSE); 2324 PrintDebugString("[INFO]: ##### table cell row extent = %d", tableCellInfo->rowExtent); 2325 } else { 2326 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableCellRowExtentMethod == 0"); 2327 return FALSE; 2328 } 2329 2330 // get the table cell column extent 2331 if (getAccessibleTableCellColumnExtentMethod != (jmethodID) 0) { 2332 tableCellInfo->columnExtent = jniEnv->CallIntMethod(accessBridgeObject, 2333 getAccessibleTableCellColumnExtentMethod, 2334 accessibleTable, row, column); 2335 EXCEPTION_CHECK("##### Getting AccessibleTableCellColumnExtentCount - call to CallIntMethod()", FALSE); 2336 PrintDebugString("[INFO]: ##### table cell column extent = %d", tableCellInfo->columnExtent); 2337 } else { 2338 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableCellColumnExtentMethod == 0"); 2339 return FALSE; 2340 } 2341 2342 // get whether the table cell is selected 2343 if (isAccessibleTableCellSelectedMethod != (jmethodID) 0) { 2344 tableCellInfo->isSelected = jniEnv->CallBooleanMethod(accessBridgeObject, 2345 isAccessibleTableCellSelectedMethod, 2346 accessibleTable, row, column); 2347 EXCEPTION_CHECK("##### Getting isAccessibleTableCellSelected - call to CallBooleanMethod()", FALSE); 2348 PrintDebugString("[INFO]: ##### table cell isSelected = %d", tableCellInfo->isSelected); 2349 } else { 2350 PrintDebugString("[ERROR]: either env == 0 or isAccessibleTableCellSelectedMethod == 0"); 2351 return FALSE; 2352 } 2353 2354 // get the table cell AccessibleContext 2355 if (getAccessibleTableCellAccessibleContextMethod != (jmethodID) 0) { 2356 jobject tableCellAC = jniEnv->CallObjectMethod(accessBridgeObject, 2357 getAccessibleTableCellAccessibleContextMethod, 2358 accessibleTable, row, column); 2359 EXCEPTION_CHECK("##### Getting AccessibleTableCellAccessibleContext - call to CallObjectMethod()", FALSE); 2360 jobject globalRef = jniEnv->NewGlobalRef(tableCellAC); 2361 EXCEPTION_CHECK("##### Getting AccessibleTableCellAccessibleContext - call to NewGlobalRef()", FALSE); 2362 tableCellInfo->accessibleContext = (JOBJECT64)globalRef; 2363 PrintDebugString("[INFO]: ##### table cell AccessibleContext = %p", globalRef); 2364 } else { 2365 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableCellAccessibleContextMethod == 0"); 2366 return FALSE; 2367 } 2368 2369 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableCellInfo succeeded"); 2370 return TRUE; 2371 } 2372 2373 BOOL 2374 AccessBridgeJavaEntryPoints::getAccessibleTableRowHeader(jobject acParent, AccessibleTableInfo *tableInfo) { 2375 2376 jthrowable exception; 2377 2378 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableRowHeader(%p):", 2379 acParent); 2380 2381 // get the header row count 2382 if (getAccessibleTableRowHeaderRowCountMethod != (jmethodID) 0) { 2383 tableInfo->rowCount = jniEnv->CallIntMethod(accessBridgeObject, 2384 getAccessibleTableRowHeaderRowCountMethod, 2385 acParent); 2386 EXCEPTION_CHECK("##### Getting AccessibleTableRowHeaderRowCount - call to CallIntMethod()", FALSE); 2387 PrintDebugString("[INFO]: ##### table row count = %d", tableInfo->rowCount); 2388 } else { 2389 PrintDebugString("[ERROR]: either env == 0 or getAccessibleRowHeaderRowCountMethod == 0"); 2390 return FALSE; 2391 } 2392 2393 // get the header column count 2394 if (getAccessibleTableRowHeaderColumnCountMethod != (jmethodID) 0) { 2395 tableInfo->columnCount = jniEnv->CallIntMethod(accessBridgeObject, 2396 getAccessibleTableRowHeaderColumnCountMethod, 2397 acParent); 2398 EXCEPTION_CHECK("Getting AccessibleTableRowHeaderColumnCount - call to CallIntMethod()", FALSE); 2399 PrintDebugString("[INFO]: ##### table column count = %d", tableInfo->columnCount); 2400 } else { 2401 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowHeaderColumnCountMethod == 0"); 2402 return FALSE; 2403 } 2404 2405 // get the header AccessibleTable 2406 if (getAccessibleTableRowHeaderMethod != (jmethodID) 0) { 2407 jobject accTable = jniEnv->CallObjectMethod(accessBridgeObject, 2408 getAccessibleTableRowHeaderMethod, 2409 acParent); 2410 EXCEPTION_CHECK("##### Getting AccessibleTableRowHeader - call to CallObjectMethod()", FALSE); 2411 jobject globalRef = jniEnv->NewGlobalRef(accTable); 2412 EXCEPTION_CHECK("##### Getting AccessibleTableRowHeader - call to NewGlobalRef()", FALSE); 2413 tableInfo->accessibleTable = (JOBJECT64)globalRef; 2414 PrintDebugString("[INFO]: ##### row header AccessibleTable = %p", globalRef); 2415 } else { 2416 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowHeaderMethod == 0"); 2417 return FALSE; 2418 } 2419 2420 // FIX - set unused elements 2421 tableInfo->caption = NULL; 2422 tableInfo->summary = NULL; 2423 tableInfo->accessibleContext = NULL; 2424 2425 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableRowHeader succeeded"); 2426 return TRUE; 2427 } 2428 2429 BOOL 2430 AccessBridgeJavaEntryPoints::getAccessibleTableColumnHeader(jobject acParent, AccessibleTableInfo *tableInfo) { 2431 jthrowable exception; 2432 2433 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableColumnHeader(%p):", 2434 acParent); 2435 2436 // get the header row count 2437 if (getAccessibleTableColumnHeaderRowCountMethod != (jmethodID) 0) { 2438 tableInfo->rowCount = jniEnv->CallIntMethod(accessBridgeObject, 2439 getAccessibleTableColumnHeaderRowCountMethod, 2440 acParent); 2441 EXCEPTION_CHECK("##### Getting AccessibleTableColumnHeaderRowCount - call to CallIntMethod()", FALSE); 2442 PrintDebugString("[INFO]: ##### table row count = %d", tableInfo->rowCount); 2443 } else { 2444 PrintDebugString("[ERROR]: either env == 0 or getAccessibleColumnHeaderRowCountMethod == 0"); 2445 return FALSE; 2446 } 2447 2448 // get the header column count 2449 if (getAccessibleTableColumnHeaderColumnCountMethod != (jmethodID) 0) { 2450 tableInfo->columnCount = jniEnv->CallIntMethod(accessBridgeObject, 2451 getAccessibleTableColumnHeaderColumnCountMethod, 2452 acParent); 2453 EXCEPTION_CHECK("Getting AccessibleTableColumnHeaderColumnCount - call to CallIntMethod()", FALSE); 2454 PrintDebugString("[INFO]: ##### table column count = %d", tableInfo->columnCount); 2455 } else { 2456 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnHeaderColumnCountMethod == 0"); 2457 return FALSE; 2458 } 2459 // get the header AccessibleTable 2460 if (getAccessibleTableColumnHeaderMethod != (jmethodID) 0) { 2461 jobject accTable = jniEnv->CallObjectMethod(accessBridgeObject, 2462 getAccessibleTableColumnHeaderMethod, 2463 acParent); 2464 EXCEPTION_CHECK("##### Getting AccessibleTableColumnHeader - call to CallObjectMethod()", FALSE); 2465 jobject globalRef = jniEnv->NewGlobalRef(accTable); 2466 EXCEPTION_CHECK("##### Getting AccessibleTableColumnHeader - call to NewGlobalRef()", FALSE); 2467 tableInfo->accessibleTable = (JOBJECT64)globalRef; 2468 PrintDebugString("[INFO]: ##### column header AccessibleTable = %p", globalRef); 2469 } else { 2470 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnHeaderMethod == 0"); 2471 return FALSE; 2472 } 2473 2474 // FIX - set unused elements 2475 tableInfo->caption = NULL; 2476 tableInfo->summary = NULL; 2477 tableInfo->accessibleContext = NULL; 2478 2479 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableColumnHeader succeeded"); 2480 return TRUE; 2481 } 2482 2483 jobject 2484 AccessBridgeJavaEntryPoints::getAccessibleTableRowDescription(jobject acParent, jint row) { 2485 2486 jobject returnedAccessibleContext; 2487 jobject globalRef; 2488 jthrowable exception; 2489 2490 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableRowDescription(%p):", 2491 acParent); 2492 2493 if (getAccessibleTableRowDescriptionMethod != (jmethodID) 0) { 2494 returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject, 2495 getAccessibleTableRowDescriptionMethod, 2496 acParent, row); 2497 EXCEPTION_CHECK("Getting AccessibleTableRowDescription - call to CallObjectMethod()", FALSE); 2498 globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext); 2499 EXCEPTION_CHECK("Getting AccessibleTableRowDescription - call to NewGlobalRef()", FALSE); 2500 jniEnv->DeleteLocalRef(returnedAccessibleContext); 2501 EXCEPTION_CHECK("Getting AccessibleTableRowDescription - call to DeleteLocalRef()", FALSE); 2502 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 2503 returnedAccessibleContext, globalRef); 2504 return globalRef; 2505 } else { 2506 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowDescriptionMethod == 0"); 2507 return (jobject) 0; 2508 } 2509 } 2510 2511 jobject 2512 AccessBridgeJavaEntryPoints::getAccessibleTableColumnDescription(jobject acParent, jint column) { 2513 2514 jobject returnedAccessibleContext; 2515 jobject globalRef; 2516 jthrowable exception; 2517 2518 PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableColumnDescription(%p):", 2519 acParent); 2520 2521 if (getAccessibleTableColumnDescriptionMethod != (jmethodID) 0) { 2522 returnedAccessibleContext = jniEnv->CallObjectMethod( 2523 accessBridgeObject, 2524 getAccessibleTableColumnDescriptionMethod, 2525 acParent, column); 2526 EXCEPTION_CHECK("Getting AccessibleTableColumnDescription - call to CallObjectMethod()", FALSE); 2527 globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext); 2528 EXCEPTION_CHECK("Getting AccessibleTableColumnDescription - call to NewGlobalRef()", FALSE); 2529 jniEnv->DeleteLocalRef(returnedAccessibleContext); 2530 EXCEPTION_CHECK("Getting AccessibleTableColumnDescription - call to DeleteLocalRef()", FALSE); 2531 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 2532 returnedAccessibleContext, globalRef); 2533 return globalRef; 2534 } else { 2535 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnDescriptionMethod == 0"); 2536 return (jobject) 0; 2537 } 2538 } 2539 2540 jint 2541 AccessBridgeJavaEntryPoints::getAccessibleTableRowSelectionCount(jobject accessibleTable) { 2542 2543 jthrowable exception; 2544 jint count; 2545 2546 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelectionCount(%p)", 2547 accessibleTable); 2548 2549 // Get the table row selection count 2550 if (getAccessibleTableRowSelectionCountMethod != (jmethodID) 0) { 2551 count = jniEnv->CallIntMethod(accessBridgeObject, 2552 getAccessibleTableRowSelectionCountMethod, 2553 accessibleTable); 2554 EXCEPTION_CHECK("##### Getting AccessibleTableRowSelectionCount - call to CallIntMethod()", FALSE); 2555 PrintDebugString("[INFO]: ##### table row selection count = %d", count); 2556 return count; 2557 } else { 2558 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowSelectionCountMethod == 0"); 2559 return 0; 2560 } 2561 2562 PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelectionCount failed"); 2563 return 0; 2564 } 2565 2566 BOOL 2567 AccessBridgeJavaEntryPoints::isAccessibleTableRowSelected(jobject accessibleTable, jint row) { 2568 jthrowable exception; 2569 BOOL result; 2570 2571 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::isAccessibleTableRowSelected(%p, %d)", 2572 accessibleTable, row); 2573 2574 if (isAccessibleTableRowSelectedMethod != (jmethodID) 0) { 2575 result = jniEnv->CallBooleanMethod(accessBridgeObject, 2576 isAccessibleTableRowSelectedMethod, 2577 accessibleTable, row); 2578 EXCEPTION_CHECK("##### Getting isAccessibleTableRowSelected - call to CallBooleanMethod()", FALSE); 2579 PrintDebugString("[INFO]: ##### table row isSelected = %d", result); 2580 return result; 2581 } else { 2582 PrintDebugString("[ERROR]: either env == 0 or isAccessibleTableRowSelectedMethod == 0"); 2583 return FALSE; 2584 } 2585 2586 PrintDebugString("[ERROR]: AccessBridgeJavaEntryPoints::isAccessibleTableRowSelected failed"); 2587 return FALSE; 2588 } 2589 2590 BOOL 2591 AccessBridgeJavaEntryPoints::getAccessibleTableRowSelections(jobject accessibleTable, jint count, 2592 jint *selections) { 2593 2594 jthrowable exception; 2595 2596 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelections(%p, %d %p)", 2597 accessibleTable, count, selections); 2598 2599 if (getAccessibleTableRowSelectionsMethod == (jmethodID) 0) { 2600 return FALSE; 2601 } 2602 // Get the table row selections 2603 for (int i = 0; i < count; i++) { 2604 2605 selections[i] = jniEnv->CallIntMethod(accessBridgeObject, 2606 getAccessibleTableRowSelectionsMethod, 2607 accessibleTable, 2608 i); 2609 EXCEPTION_CHECK("##### Getting AccessibleTableRowSelections - call to CallIntMethod()", FALSE); 2610 PrintDebugString("[INFO]: ##### table row selection[%d] = %d", i, selections[i]); 2611 } 2612 2613 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelections succeeded"); 2614 return TRUE; 2615 } 2616 2617 2618 jint 2619 AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelectionCount(jobject accessibleTable) { 2620 2621 jthrowable exception; 2622 jint count; 2623 2624 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelectionCount(%p)", 2625 accessibleTable); 2626 2627 // Get the table column selection count 2628 if (getAccessibleTableColumnSelectionCountMethod != (jmethodID) 0) { 2629 count = jniEnv->CallIntMethod(accessBridgeObject, 2630 getAccessibleTableColumnSelectionCountMethod, 2631 accessibleTable); 2632 EXCEPTION_CHECK("##### Getting AccessibleTableColumnSelectionCount - call to CallIntMethod()", FALSE); 2633 PrintDebugString("[INFO]: ##### table column selection count = %d", count); 2634 return count; 2635 } else { 2636 PrintDebugString("[ERROR]: either env == 0 or getAccessibleRowCountMethod == 0"); 2637 return 0; 2638 } 2639 2640 PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelectionCount failed"); 2641 return 0; 2642 } 2643 2644 BOOL 2645 AccessBridgeJavaEntryPoints::isAccessibleTableColumnSelected(jobject accessibleTable, jint column) { 2646 jthrowable exception; 2647 BOOL result; 2648 2649 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::isAccessibleTableColumnSelected(%p, %d)", 2650 accessibleTable, column); 2651 2652 if (isAccessibleTableColumnSelectedMethod != (jmethodID) 0) { 2653 result = jniEnv->CallBooleanMethod(accessBridgeObject, 2654 isAccessibleTableColumnSelectedMethod, 2655 accessibleTable, column); 2656 EXCEPTION_CHECK("##### Getting isAccessibleTableColumnSelected - call to CallBooleanMethod()", FALSE); 2657 PrintDebugString("[INFO]: ##### table column isSelected = %d", result); 2658 return result; 2659 } else { 2660 PrintDebugString("[ERROR]: either env == 0 or isAccessibleTableColumnSelectedMethod == 0"); 2661 return FALSE; 2662 } 2663 2664 PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::isAccessibleTableColumnSelected failed"); 2665 return FALSE; 2666 } 2667 2668 BOOL 2669 AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelections(jobject accessibleTable, jint count, 2670 jint *selections) { 2671 jthrowable exception; 2672 2673 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelections(%p, %d, %p)", 2674 accessibleTable, count, selections); 2675 2676 if (getAccessibleTableColumnSelectionsMethod == (jmethodID) 0) { 2677 return FALSE; 2678 } 2679 // Get the table column selections 2680 for (int i = 0; i < count; i++) { 2681 2682 selections[i] = jniEnv->CallIntMethod(accessBridgeObject, 2683 getAccessibleTableColumnSelectionsMethod, 2684 accessibleTable, 2685 i); 2686 EXCEPTION_CHECK("##### Getting AccessibleTableColumnSelections - call to CallIntMethod()", FALSE); 2687 PrintDebugString("[INFO]: ##### table Column selection[%d] = %d", i, selections[i]); 2688 } 2689 2690 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelections succeeded"); 2691 return TRUE; 2692 } 2693 2694 2695 jint 2696 AccessBridgeJavaEntryPoints::getAccessibleTableRow(jobject accessibleTable, jint index) { 2697 jthrowable exception; 2698 jint result; 2699 2700 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRow(%p, index=%d)", 2701 accessibleTable, index); 2702 2703 if (getAccessibleTableRowMethod != (jmethodID) 0) { 2704 result = jniEnv->CallIntMethod(accessBridgeObject, 2705 getAccessibleTableRowMethod, 2706 accessibleTable, index); 2707 EXCEPTION_CHECK("##### Getting AccessibleTableRow - call to CallIntMethod()", FALSE); 2708 PrintDebugString("[INFO]: ##### table row = %d", result); 2709 return result; 2710 } else { 2711 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowMethod == 0"); 2712 return -1; 2713 } 2714 2715 PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRow failed"); 2716 return -1; 2717 } 2718 2719 jint 2720 AccessBridgeJavaEntryPoints::getAccessibleTableColumn(jobject accessibleTable, jint index) { 2721 jthrowable exception; 2722 jint result; 2723 2724 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumn(%p, index=%d)", 2725 accessibleTable, index); 2726 2727 if (getAccessibleTableColumnMethod != (jmethodID) 0) { 2728 result = jniEnv->CallIntMethod(accessBridgeObject, 2729 getAccessibleTableColumnMethod, 2730 accessibleTable, index); 2731 EXCEPTION_CHECK("##### Getting AccessibleTableColumn - call to CallIntMethod()", FALSE); 2732 PrintDebugString("[INFO]: ##### table column = %d", result); 2733 return result; 2734 } else { 2735 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnMethod == 0"); 2736 return -1; 2737 } 2738 2739 PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumn failed"); 2740 return -1; 2741 } 2742 2743 jint 2744 AccessBridgeJavaEntryPoints::getAccessibleTableIndex(jobject accessibleTable, jint row, jint column) { 2745 jthrowable exception; 2746 jint result; 2747 2748 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableIndex(%p, row=%d, col=%d)", 2749 accessibleTable, row, column); 2750 2751 if (getAccessibleTableIndexMethod != (jmethodID) 0) { 2752 result = jniEnv->CallIntMethod(accessBridgeObject, 2753 getAccessibleTableIndexMethod, 2754 accessibleTable, row, column); 2755 EXCEPTION_CHECK("##### Getting getAccessibleTableIndex - call to CallIntMethod()", FALSE); 2756 PrintDebugString("[INFO]: ##### table index = %d", result); 2757 return result; 2758 } else { 2759 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableIndexMethod == 0"); 2760 return -1; 2761 } 2762 2763 PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableIndex failed"); 2764 return -1; 2765 } 2766 2767 /********** end AccessibleTable routines ******************************/ 2768 2769 2770 /********** begin AccessibleRelationSet routines **********************/ 2771 2772 BOOL 2773 AccessBridgeJavaEntryPoints::getAccessibleRelationSet(jobject accessibleContext, 2774 AccessibleRelationSetInfo *relationSet) { 2775 2776 jthrowable exception; 2777 const wchar_t *stringBytes; 2778 jsize length; 2779 2780 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleRelationSet(%p, %p)", 2781 accessibleContext, relationSet); 2782 2783 if (getAccessibleRelationCountMethod == (jmethodID) 0 || 2784 getAccessibleRelationKeyMethod == (jmethodID) 0 || 2785 getAccessibleRelationTargetCountMethod == (jmethodID) 0 || 2786 getAccessibleRelationTargetMethod == (jmethodID) 0) { 2787 return FALSE; 2788 } 2789 2790 // Get the relations set count 2791 relationSet->relationCount = jniEnv->CallIntMethod(accessBridgeObject, 2792 getAccessibleRelationCountMethod, 2793 accessibleContext); 2794 EXCEPTION_CHECK("##### Getting AccessibleRelationCount - call to CallIntMethod()", FALSE); 2795 PrintDebugString("[INFO]: ##### AccessibleRelation count = %d", relationSet->relationCount); 2796 2797 2798 // Get the relation set 2799 for (int i = 0; i < relationSet->relationCount && i < MAX_RELATIONS; i++) { 2800 2801 jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject, 2802 getAccessibleRelationKeyMethod, 2803 accessibleContext, 2804 i); 2805 2806 EXCEPTION_CHECK("Getting AccessibleRelationKey - call to CallObjectMethod()", FALSE); 2807 if (js != (jstring) 0) { 2808 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 2809 EXCEPTION_CHECK("Getting AccessibleRelation key - call to GetStringChars()", FALSE); 2810 wcsncpy(relationSet->relations[i].key, stringBytes, (sizeof(relationSet->relations[i].key ) / sizeof(wchar_t))); 2811 length = jniEnv->GetStringLength(js); 2812 relationSet->relations[i].key [length < (sizeof(relationSet->relations[i].key ) / sizeof(wchar_t)) ? 2813 length : (sizeof(relationSet->relations[i].key ) / sizeof(wchar_t))-2] = (wchar_t) 0; 2814 EXCEPTION_CHECK("Getting AccessibleRelation key - call to GetStringLength()", FALSE); 2815 jniEnv->ReleaseStringChars(js, stringBytes); 2816 EXCEPTION_CHECK("Getting AccessibleRelation key - call to ReleaseStringChars()", FALSE); 2817 // jniEnv->CallVoidMethod(accessBridgeObject, 2818 // decrementReferenceMethod, js); 2819 //EXCEPTION_CHECK("Getting AccessibleRelation key - call to CallVoidMethod()", FALSE); 2820 PrintDebugString("[INFO]: ##### AccessibleRelation key = %ls", relationSet->relations[i].key ); 2821 jniEnv->DeleteLocalRef(js); 2822 EXCEPTION_CHECK("Getting AccessibleRelation key - call to DeleteLocalRef()", FALSE); 2823 } else { 2824 PrintDebugString("[WARN]: AccessibleRelation key is null."); 2825 relationSet->relations[i].key [0] = (wchar_t) 0; 2826 } 2827 2828 relationSet->relations[i].targetCount = jniEnv->CallIntMethod(accessBridgeObject, 2829 getAccessibleRelationTargetCountMethod, 2830 accessibleContext, 2831 i); 2832 2833 for (int j = 0; j < relationSet->relations[i].targetCount && j < MAX_RELATION_TARGETS; j++) { 2834 jobject target = jniEnv->CallObjectMethod(accessBridgeObject, getAccessibleRelationTargetMethod, 2835 accessibleContext, i, j); 2836 EXCEPTION_CHECK("Getting AccessibleRelationSet - call to CallObjectMethod()", FALSE); 2837 jobject globalRef = jniEnv->NewGlobalRef(target); 2838 EXCEPTION_CHECK("Getting AccessibleRelationSet - call to NewGlobalRef()", FALSE); 2839 relationSet->relations[i].targets[j] = (JOBJECT64)globalRef; 2840 PrintDebugString("[INFO]: relation set item: %p", globalRef); 2841 } 2842 } 2843 2844 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleRelationSet succeeded"); 2845 return TRUE; 2846 } 2847 2848 2849 /********** end AccessibleRelationSet routines ************************/ 2850 2851 2852 /********** begin AccessibleHypertext routines **********************/ 2853 2854 BOOL 2855 AccessBridgeJavaEntryPoints::getAccessibleHypertext(jobject accessibleContext, 2856 AccessibleHypertextInfo *hypertext) { 2857 2858 jthrowable exception; 2859 const wchar_t *stringBytes; 2860 jsize length; 2861 2862 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertext(%p, %p)", 2863 accessibleContext, hypertext); 2864 2865 // get the AccessibleHypertext 2866 jobject ht = jniEnv->CallObjectMethod(accessBridgeObject, 2867 getAccessibleHypertextMethod, 2868 accessibleContext); 2869 EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to CallObjectMethod()", FALSE); 2870 jobject globalRef = jniEnv->NewGlobalRef(ht); 2871 EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to NewGlobalRef()", FALSE); 2872 hypertext->accessibleHypertext = (JOBJECT64)globalRef; 2873 PrintDebugString("[INFO]: ##### AccessibleHypertext = %p", globalRef); 2874 2875 if (hypertext->accessibleHypertext == 0) { 2876 PrintDebugString("[WARN]: ##### null AccessibleHypertext; returning FALSE"); 2877 return false; 2878 } 2879 2880 // get the hyperlink count 2881 hypertext->linkCount = jniEnv->CallIntMethod(accessBridgeObject, 2882 getAccessibleHyperlinkCountMethod,accessibleContext); 2883 2884 EXCEPTION_CHECK("##### Getting hyperlink count - call to CallIntMethod()", FALSE); 2885 PrintDebugString("[INFO]: ##### hyperlink count = %d", hypertext->linkCount); 2886 2887 2888 // get the hypertext links 2889 for (int i = 0; i < hypertext->linkCount && i < MAX_HYPERLINKS; i++) { 2890 2891 // get the hyperlink 2892 jobject hl = jniEnv->CallObjectMethod(accessBridgeObject, 2893 getAccessibleHyperlinkMethod, 2894 accessibleContext, 2895 i); 2896 EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to CallObjectMethod()", FALSE); 2897 jobject globalRef = jniEnv->NewGlobalRef(hl); 2898 EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to NewGlobalRef()", FALSE); 2899 hypertext->links[i].accessibleHyperlink = (JOBJECT64)globalRef; 2900 PrintDebugString("[INFO]: ##### AccessibleHyperlink = %p", globalRef); 2901 2902 // get the hyperlink text 2903 jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject, 2904 getAccessibleHyperlinkTextMethod, 2905 hypertext->links[i].accessibleHyperlink, 2906 i); 2907 2908 EXCEPTION_CHECK("Getting hyperlink text - call to CallObjectMethod()", FALSE); 2909 if (js != (jstring) 0) { 2910 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 2911 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringChars()", FALSE); 2912 wcsncpy(hypertext->links[i].text, stringBytes, (sizeof(hypertext->links[i].text) / sizeof(wchar_t))); 2913 length = jniEnv->GetStringLength(js); 2914 if (length >= (sizeof(hypertext->links[i].text) / sizeof(wchar_t))) { 2915 length = (sizeof(hypertext->links[i].text) / sizeof(wchar_t)) - 2; 2916 } 2917 hypertext->links[i].text[length] = (wchar_t) 0; 2918 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringLength()", FALSE); 2919 jniEnv->ReleaseStringChars(js, stringBytes); 2920 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to ReleaseStringChars()", FALSE); 2921 // jniEnv->CallVoidMethod(accessBridgeObject, 2922 // decrementReferenceMethod, js); 2923 //EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to CallVoidMethod()", FALSE); 2924 PrintDebugString("[INFO]: ##### AccessibleHyperlink text = %ls", hypertext->links[i].text ); 2925 jniEnv->DeleteLocalRef(js); 2926 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to DeleteLocalRef()", FALSE); 2927 } else { 2928 PrintDebugString("[WARN]: AccessibleHyperlink text is null."); 2929 hypertext->links[i].text[0] = (wchar_t) 0; 2930 } 2931 2932 hypertext->links[i].startIndex = jniEnv->CallIntMethod(accessBridgeObject, 2933 getAccessibleHyperlinkStartIndexMethod, 2934 hypertext->links[i].accessibleHyperlink, 2935 i); 2936 EXCEPTION_CHECK("##### Getting hyperlink start index - call to CallIntMethod()", FALSE); 2937 PrintDebugString("[INFO]: ##### hyperlink start index = %d", hypertext->links[i].startIndex); 2938 2939 2940 hypertext->links[i].endIndex = jniEnv->CallIntMethod(accessBridgeObject, 2941 getAccessibleHyperlinkEndIndexMethod, 2942 hypertext->links[i].accessibleHyperlink, 2943 i); 2944 EXCEPTION_CHECK("##### Getting hyperlink end index - call to CallIntMethod()", FALSE); 2945 PrintDebugString("[INFO]: ##### hyperlink end index = %d", hypertext->links[i].endIndex); 2946 2947 } 2948 2949 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertext succeeded"); 2950 return TRUE; 2951 } 2952 2953 /* 2954 * Activates an AccessibleHyperlink 2955 */ 2956 BOOL 2957 AccessBridgeJavaEntryPoints::activateAccessibleHyperlink(jobject accessibleContext, 2958 jobject accessibleHyperlink) { 2959 2960 jthrowable exception; 2961 BOOL returnVal; 2962 2963 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::activateAccessibleHyperlink(%p, %p):", 2964 accessibleContext, accessibleHyperlink); 2965 2966 if (activateAccessibleHyperlinkMethod != (jmethodID) 0) { 2967 returnVal = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, activateAccessibleHyperlinkMethod, 2968 accessibleContext, accessibleHyperlink); 2969 EXCEPTION_CHECK("activateAccessibleHyperlink - call to CallBooleanMethod()", FALSE); 2970 return returnVal; 2971 } else { 2972 PrintDebugString("[ERROR]: either jniEnv == 0 or activateAccessibleHyperlinkMethod == 0"); 2973 return FALSE; 2974 } 2975 } 2976 2977 2978 /* 2979 * This method is used to iterate through the hyperlinks in a component. It 2980 * returns hypertext information for a component starting at hyperlink index 2981 * nStartIndex. No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will 2982 * be returned for each call to this method. 2983 * returns FALSE on error. 2984 */ 2985 BOOL 2986 AccessBridgeJavaEntryPoints::getAccessibleHypertextExt(const jobject accessibleContext, 2987 const jint nStartIndex, 2988 /* OUT */ AccessibleHypertextInfo *hypertext) { 2989 2990 jthrowable exception; 2991 const wchar_t *stringBytes; 2992 jsize length; 2993 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertextExt(%p, %p, startIndex = %d)", 2994 accessibleContext, hypertext, nStartIndex); 2995 2996 // get the AccessibleHypertext 2997 jobject ht = jniEnv->CallObjectMethod(accessBridgeObject, getAccessibleHypertextMethod, 2998 accessibleContext); 2999 EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to CallObjectMethod()", FALSE); 3000 jobject globalRef = jniEnv->NewGlobalRef(ht); 3001 EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to NewGlobalRef()", FALSE); 3002 hypertext->accessibleHypertext = (JOBJECT64)globalRef; 3003 PrintDebugString("[INFO]: ##### AccessibleHypertext = %p", globalRef); 3004 if (hypertext->accessibleHypertext == 0) { 3005 PrintDebugString("[WARN]: ##### null AccessibleHypertext; returning FALSE"); 3006 return FALSE; 3007 } 3008 3009 // get the hyperlink count 3010 hypertext->linkCount = jniEnv->CallIntMethod(accessBridgeObject, getAccessibleHyperlinkCountMethod, 3011 accessibleContext); 3012 EXCEPTION_CHECK("##### Getting hyperlink count - call to CallIntMethod()", FALSE); 3013 PrintDebugString("[INFO]: ##### hyperlink count = %d", hypertext->linkCount); 3014 3015 if (nStartIndex >= hypertext->linkCount) { 3016 return FALSE; 3017 } 3018 3019 // get the hypertext links 3020 // NOTE: To avoid a crash when there are more than MAX_HYPERLINKS (64) links 3021 // in the document, test for i < MAX_HYPERLINKS in addition to 3022 // i < hypertext->linkCount 3023 int bufIndex = 0; 3024 for (int i = nStartIndex; (i < hypertext->linkCount) && (i < nStartIndex + MAX_HYPERLINKS); i++) { 3025 PrintDebugString("[INFO]: getting hyperlink %d ...", i); 3026 3027 // get the hyperlink 3028 jobject hl = jniEnv->CallObjectMethod(accessBridgeObject, 3029 getAccessibleHyperlinkMethod, 3030 hypertext->accessibleHypertext, 3031 i); 3032 EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to CallObjectMethod()", FALSE); 3033 jobject globalRef = jniEnv->NewGlobalRef(hl); 3034 EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to NewGlobalRef()", FALSE); 3035 hypertext->links[bufIndex].accessibleHyperlink = (JOBJECT64)globalRef; 3036 PrintDebugString("[INFO]: ##### AccessibleHyperlink = %p", globalRef); 3037 3038 // get the hyperlink text 3039 jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject, 3040 getAccessibleHyperlinkTextMethod, 3041 hypertext->links[bufIndex].accessibleHyperlink, 3042 i); 3043 3044 EXCEPTION_CHECK("Getting hyperlink text - call to CallObjectMethod()", FALSE); 3045 if (js != (jstring) 0) { 3046 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3047 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringChars()", FALSE); 3048 wcsncpy(hypertext->links[bufIndex].text, stringBytes, 3049 (sizeof(hypertext->links[bufIndex].text) / sizeof(wchar_t))); 3050 length = jniEnv->GetStringLength(js); 3051 if (length >= (sizeof(hypertext->links[bufIndex].text) / sizeof(wchar_t))) { 3052 length = (sizeof(hypertext->links[bufIndex].text) / sizeof(wchar_t)) - 2; 3053 } 3054 hypertext->links[bufIndex].text[length] = (wchar_t) 0; 3055 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringLength()", FALSE); 3056 jniEnv->ReleaseStringChars(js, stringBytes); 3057 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to ReleaseStringChars()", FALSE); 3058 // jniEnv->CallVoidMethod(accessBridgeObject, 3059 // decrementReferenceMethod, js); 3060 //EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to CallVoidMethod()", FALSE); 3061 PrintDebugString("[INFO]: ##### AccessibleHyperlink text = %ls", hypertext->links[bufIndex].text ); 3062 jniEnv->DeleteLocalRef(js); 3063 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to DeleteLocalRef()", FALSE); 3064 3065 } else { 3066 PrintDebugString("[WARN]: AccessibleHyperlink text is null."); 3067 hypertext->links[bufIndex].text[0] = (wchar_t) 0; 3068 } 3069 3070 hypertext->links[bufIndex].startIndex = jniEnv->CallIntMethod(accessBridgeObject, 3071 getAccessibleHyperlinkStartIndexMethod, 3072 hypertext->links[bufIndex].accessibleHyperlink, 3073 i); 3074 EXCEPTION_CHECK("##### Getting hyperlink start index - call to CallIntMethod()", FALSE); 3075 PrintDebugString("[INFO]: ##### hyperlink start index = %d", hypertext->links[bufIndex].startIndex); 3076 3077 hypertext->links[bufIndex].endIndex = jniEnv->CallIntMethod(accessBridgeObject, 3078 getAccessibleHyperlinkEndIndexMethod, 3079 hypertext->links[bufIndex].accessibleHyperlink, 3080 i); 3081 EXCEPTION_CHECK("##### Getting hyperlink end index - call to CallIntMethod()", FALSE); 3082 PrintDebugString("[INFO]: ##### hyperlink end index = %d", hypertext->links[bufIndex].endIndex); 3083 3084 bufIndex++; 3085 } 3086 3087 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertextExt succeeded"); 3088 return TRUE; 3089 } 3090 3091 jint AccessBridgeJavaEntryPoints::getAccessibleHyperlinkCount(const jobject accessibleContext) { 3092 3093 jthrowable exception; 3094 3095 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHyperlinkCount(%X)", 3096 accessibleContext); 3097 3098 if (getAccessibleHyperlinkCountMethod == (jmethodID)0) { 3099 return -1; 3100 } 3101 3102 // get the hyperlink count 3103 jint linkCount = jniEnv->CallIntMethod(accessBridgeObject, getAccessibleHyperlinkCountMethod, 3104 accessibleContext); 3105 EXCEPTION_CHECK("##### Getting hyperlink count - call to CallIntMethod()", -1); 3106 PrintDebugString("[INFO]: ##### hyperlink count = %d", linkCount); 3107 3108 return linkCount; 3109 } 3110 3111 3112 jint AccessBridgeJavaEntryPoints::getAccessibleHypertextLinkIndex(const jobject hypertext, 3113 const jint nIndex) { 3114 3115 jthrowable exception; 3116 3117 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertextLinkIndex(%p, index = %d)", 3118 hypertext, nIndex); 3119 3120 if (getAccessibleHypertextLinkIndexMethod == (jmethodID)0) { 3121 return -1; 3122 } 3123 3124 // get the hyperlink index 3125 jint index = jniEnv->CallIntMethod(accessBridgeObject, getAccessibleHypertextLinkIndexMethod, 3126 hypertext, nIndex); 3127 3128 EXCEPTION_CHECK("##### Getting hyperlink index - call to CallIntMethod()", -1); 3129 PrintDebugString("[INFO]: ##### hyperlink index = %d", index); 3130 3131 return index; 3132 } 3133 3134 BOOL AccessBridgeJavaEntryPoints::getAccessibleHyperlink(jobject hypertext, 3135 const jint index, 3136 /* OUT */ AccessibleHyperlinkInfo *info) { 3137 3138 jthrowable exception; 3139 const wchar_t *stringBytes; 3140 jsize length; 3141 3142 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHyperlink(%p, index = %d)", 3143 hypertext, index); 3144 3145 3146 // get the hyperlink 3147 jobject hl = jniEnv->CallObjectMethod(accessBridgeObject, 3148 getAccessibleHyperlinkMethod, 3149 hypertext, 3150 index); 3151 EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to CallObjectMethod()", FALSE); 3152 jobject globalRef = jniEnv->NewGlobalRef(hl); 3153 EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to NewGlobalRef()", FALSE); 3154 info->accessibleHyperlink = (JOBJECT64)globalRef; 3155 PrintDebugString("[INFO]: ##### AccessibleHyperlink = %p", globalRef); 3156 3157 // get the hyperlink text 3158 jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject, 3159 getAccessibleHyperlinkTextMethod, 3160 info->accessibleHyperlink, 3161 index); 3162 3163 EXCEPTION_CHECK("Getting hyperlink text - call to CallObjectMethod()", FALSE); 3164 if (js != (jstring) 0) { 3165 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3166 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringChars()", FALSE); 3167 wcsncpy(info->text, stringBytes, 3168 (sizeof(info->text) / sizeof(wchar_t))); 3169 length = jniEnv->GetStringLength(js); 3170 if (length >= (sizeof(info->text) / sizeof(wchar_t))) { 3171 length = (sizeof(info->text) / sizeof(wchar_t)) - 2; 3172 } 3173 info->text[length] = (wchar_t) 0; 3174 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringLength()", FALSE); 3175 jniEnv->ReleaseStringChars(js, stringBytes); 3176 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to ReleaseStringChars()", FALSE); 3177 // jniEnv->CallVoidMethod(accessBridgeObject, 3178 // decrementReferenceMethod, js); 3179 //EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to CallVoidMethod()", FALSE); 3180 PrintDebugString("[INFO]: ##### AccessibleHyperlink text = %ls", info->text ); 3181 jniEnv->DeleteLocalRef(js); 3182 EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to DeleteLocalRef()", FALSE); 3183 3184 } else { 3185 PrintDebugString("[WARN]: AccessibleHyperlink text is null."); 3186 info->text[0] = (wchar_t) 0; 3187 } 3188 3189 info->startIndex = jniEnv->CallIntMethod(accessBridgeObject, 3190 getAccessibleHyperlinkStartIndexMethod, 3191 info->accessibleHyperlink, 3192 index); 3193 EXCEPTION_CHECK("##### Getting hyperlink start index - call to CallIntMethod()", FALSE); 3194 PrintDebugString("[INFO]: ##### hyperlink start index = %d", info->startIndex); 3195 3196 info->endIndex = jniEnv->CallIntMethod(accessBridgeObject, 3197 getAccessibleHyperlinkEndIndexMethod, 3198 info->accessibleHyperlink, 3199 index); 3200 EXCEPTION_CHECK("##### Getting hyperlink end index - call to CallIntMethod()", FALSE); 3201 PrintDebugString("[INFO]: ##### hyperlink end index = %d", info->endIndex); 3202 3203 return TRUE; 3204 } 3205 3206 3207 /********** end AccessibleHypertext routines ************************/ 3208 3209 // Accessible Keybinding methods 3210 BOOL AccessBridgeJavaEntryPoints::getAccessibleKeyBindings(jobject accessibleContext, 3211 AccessibleKeyBindings *keyBindings) { 3212 3213 jthrowable exception; 3214 3215 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleKeyBindings(%p, %p)", 3216 accessibleContext, keyBindings); 3217 3218 if (getAccessibleKeyBindingsCountMethod == (jmethodID) 0 || 3219 getAccessibleKeyBindingCharMethod == (jmethodID) 0 || 3220 getAccessibleKeyBindingModifiersMethod == (jmethodID) 0) { 3221 return FALSE; 3222 } 3223 3224 // get the key binding count 3225 keyBindings->keyBindingsCount = jniEnv->CallIntMethod(accessBridgeObject, 3226 getAccessibleKeyBindingsCountMethod, accessibleContext); 3227 3228 EXCEPTION_CHECK("##### Getting key bindings count - call to CallIntMethod()", FALSE); 3229 3230 PrintDebugString("[INFO]: ##### key bindings count = %d", keyBindings->keyBindingsCount); 3231 3232 // get the key bindings 3233 for (int i = 0; i < keyBindings->keyBindingsCount && i < MAX_KEY_BINDINGS; i++) { 3234 3235 // get the key binding character 3236 keyBindings->keyBindingInfo[i].character = jniEnv->CallCharMethod(accessBridgeObject, 3237 getAccessibleKeyBindingCharMethod, 3238 accessibleContext, 3239 i); 3240 EXCEPTION_CHECK("##### Getting key binding character - call to CallCharMethod()", FALSE); 3241 PrintDebugString("[INFO]: ##### key binding character = %c"\ 3242 " ##### key binding character in hex = %hx"\ 3243 , keyBindings->keyBindingInfo[i].character, keyBindings->keyBindingInfo[i].character); 3244 3245 // get the key binding modifiers 3246 keyBindings->keyBindingInfo[i].modifiers = jniEnv->CallIntMethod(accessBridgeObject, 3247 getAccessibleKeyBindingModifiersMethod, 3248 accessibleContext, 3249 i); 3250 EXCEPTION_CHECK("##### Getting key binding modifiers - call to CallIntMethod()", FALSE); 3251 PrintDebugString("[INFO]: ##### key binding modifiers = %x", keyBindings->keyBindingInfo[i].modifiers); 3252 } 3253 return FALSE; 3254 } 3255 3256 // AccessibleIcon methods 3257 BOOL AccessBridgeJavaEntryPoints::getAccessibleIcons(jobject accessibleContext, 3258 AccessibleIcons *icons) { 3259 3260 jthrowable exception; 3261 const wchar_t *stringBytes; 3262 jsize length; 3263 3264 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleIcons(%p, %p)", 3265 accessibleContext, icons); 3266 3267 if (getAccessibleIconsCountMethod == (jmethodID) 0 || 3268 getAccessibleIconDescriptionMethod == (jmethodID) 0 || 3269 getAccessibleIconHeightMethod == (jmethodID) 0 || 3270 getAccessibleIconWidthMethod == (jmethodID) 0) { 3271 PrintDebugString("[WARN]: ##### missing method(s) !!!"); 3272 return FALSE; 3273 } 3274 3275 3276 // get the icons count 3277 icons->iconsCount = jniEnv->CallIntMethod(accessBridgeObject, 3278 getAccessibleIconsCountMethod, accessibleContext); 3279 3280 EXCEPTION_CHECK("##### Getting icons count - call to CallIntMethod()", FALSE); 3281 PrintDebugString("[INFO]: ##### icons count = %d", icons->iconsCount); 3282 3283 3284 // get the icons 3285 for (int i = 0; i < icons->iconsCount && i < MAX_ICON_INFO; i++) { 3286 3287 // get the icon description 3288 jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject, 3289 getAccessibleIconDescriptionMethod, 3290 accessibleContext, 3291 i); 3292 3293 EXCEPTION_CHECK("Getting icon description - call to CallObjectMethod()", FALSE); 3294 if (js != (jstring) 0) { 3295 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3296 EXCEPTION_CHECK("Getting AccessibleIcon description - call to GetStringChars()", FALSE); 3297 wcsncpy(icons->iconInfo[i].description, stringBytes, (sizeof(icons->iconInfo[i].description) / sizeof(wchar_t))); 3298 length = jniEnv->GetStringLength(js); 3299 if (length >= (sizeof(icons->iconInfo[i].description) / sizeof(wchar_t))) { 3300 length = (sizeof(icons->iconInfo[i].description) / sizeof(wchar_t)) - 2; 3301 } 3302 icons->iconInfo[i].description[length] = (wchar_t) 0; 3303 EXCEPTION_CHECK("Getting AccessibleIcon description - call to GetStringLength()", FALSE); 3304 jniEnv->ReleaseStringChars(js, stringBytes); 3305 EXCEPTION_CHECK("Getting AccessibleIcon description - call to ReleaseStringChars()", FALSE); 3306 // jniEnv->CallVoidMethod(accessBridgeObject, 3307 // decrementReferenceMethod, js); 3308 //EXCEPTION_CHECK("Getting AccessibleIcon description - call to CallVoidMethod()", FALSE); 3309 PrintDebugString("[INFO]: ##### AccessibleIcon description = %ls", icons->iconInfo[i].description ); 3310 jniEnv->DeleteLocalRef(js); 3311 EXCEPTION_CHECK("Getting AccessibleIcon description - call to DeleteLocalRef()", FALSE); 3312 } else { 3313 PrintDebugString("[WARN]: AccessibleIcon description is null."); 3314 icons->iconInfo[i].description[0] = (wchar_t) 0; 3315 } 3316 3317 3318 // get the icon height 3319 icons->iconInfo[i].height = jniEnv->CallIntMethod(accessBridgeObject, 3320 getAccessibleIconHeightMethod, 3321 accessibleContext, 3322 i); 3323 EXCEPTION_CHECK("##### Getting icon height - call to CallIntMethod()", FALSE); 3324 PrintDebugString("[INFO]: ##### icon height = %d", icons->iconInfo[i].height); 3325 3326 // get the icon width 3327 icons->iconInfo[i].width = jniEnv->CallIntMethod(accessBridgeObject, 3328 getAccessibleIconWidthMethod, 3329 accessibleContext, 3330 i); 3331 EXCEPTION_CHECK("##### Getting icon width - call to CallIntMethod()", FALSE); 3332 PrintDebugString("[INFO]: ##### icon width = %d", icons->iconInfo[i].width); 3333 } 3334 return FALSE; 3335 } 3336 3337 // AccessibleActionMethods 3338 BOOL AccessBridgeJavaEntryPoints::getAccessibleActions(jobject accessibleContext, 3339 AccessibleActions *actions) { 3340 3341 jthrowable exception; 3342 const wchar_t *stringBytes; 3343 jsize length; 3344 3345 PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleIcons(%p, %p)", 3346 accessibleContext, actions); 3347 3348 if (getAccessibleActionsCountMethod == (jmethodID) 0 || 3349 getAccessibleActionNameMethod == (jmethodID) 0) { 3350 PrintDebugString("[WARN]: ##### missing method(s) !!!"); 3351 return FALSE; 3352 } 3353 3354 3355 // get the icons count 3356 actions->actionsCount = jniEnv->CallIntMethod(accessBridgeObject, 3357 getAccessibleActionsCountMethod,accessibleContext); 3358 3359 EXCEPTION_CHECK("##### Getting actions count - call to CallIntMethod()", FALSE); 3360 PrintDebugString("[INFO]: ##### key actions count = %d", actions->actionsCount); 3361 3362 3363 // get the actions 3364 for (int i = 0; i < actions->actionsCount && i < MAX_ACTION_INFO; i++) { 3365 3366 // get the action name 3367 jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject, 3368 getAccessibleActionNameMethod, 3369 accessibleContext, 3370 i); 3371 3372 EXCEPTION_CHECK("Getting Action Name - call to CallObjectMethod()", FALSE); 3373 if (js != (jstring) 0) { 3374 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3375 EXCEPTION_CHECK("Getting AccessibleAction Name - call to GetStringChars()", FALSE); 3376 wcsncpy(actions->actionInfo[i].name , stringBytes, (sizeof(actions->actionInfo[i].name ) / sizeof(wchar_t))); 3377 length = jniEnv->GetStringLength(js); 3378 if (length >= (sizeof(actions->actionInfo[i].name ) / sizeof(wchar_t))) { 3379 length = (sizeof(actions->actionInfo[i].name ) / sizeof(wchar_t)) - 2; 3380 } 3381 actions->actionInfo[i].name [length] = (wchar_t) 0; 3382 EXCEPTION_CHECK("Getting AccessibleAction name - call to GetStringLength()", FALSE); 3383 jniEnv->ReleaseStringChars(js, stringBytes); 3384 EXCEPTION_CHECK("Getting AccessibleAction name - call to ReleaseStringChars()", FALSE); 3385 // jniEnv->CallVoidMethod(accessBridgeObject, 3386 // decrementReferenceMethod, js); 3387 //EXCEPTION_CHECK("Getting AccessibleAction name - call to CallVoidMethod()", FALSE); 3388 PrintDebugString("[INFO]: ##### AccessibleAction name = %ls", actions->actionInfo[i].name ); 3389 jniEnv->DeleteLocalRef(js); 3390 EXCEPTION_CHECK("Getting AccessibleAction name - call to DeleteLocalRef()", FALSE); 3391 } else { 3392 PrintDebugString("[WARN]: AccessibleAction name is null."); 3393 actions->actionInfo[i].name [0] = (wchar_t) 0; 3394 } 3395 } 3396 return FALSE; 3397 } 3398 3399 BOOL AccessBridgeJavaEntryPoints::doAccessibleActions(jobject accessibleContext, 3400 AccessibleActionsToDo *actionsToDo, 3401 jint *failure) { 3402 3403 jthrowable exception; 3404 BOOL returnVal; 3405 3406 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::doAccessibleActions(%p, #actions %d %s):", 3407 accessibleContext, 3408 actionsToDo->actionsCount, 3409 actionsToDo->actions[0].name); 3410 3411 if (doAccessibleActionsMethod == (jmethodID) 0) { 3412 *failure = 0; 3413 return FALSE; 3414 } 3415 3416 PrintDebugString("[INFO]: doing %d actions ...", actionsToDo->actionsCount); 3417 for (int i = 0; i < actionsToDo->actionsCount && i < MAX_ACTIONS_TO_DO; i++) { 3418 PrintDebugString("[INFO]: doing action %d: %s ...", i, actionsToDo->actions[i].name); 3419 3420 // create a Java String for the action name 3421 wchar_t *actionName = (wchar_t *)actionsToDo->actions[i].name; 3422 jstring javaName = jniEnv->NewString(actionName, (jsize)wcslen(actionName)); 3423 if (javaName == 0) { 3424 PrintDebugString("[ERROR]: NewString failed"); 3425 *failure = i; 3426 return FALSE; 3427 } 3428 3429 returnVal = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject, doAccessibleActionsMethod, 3430 accessibleContext, javaName); 3431 jniEnv->DeleteLocalRef(javaName); 3432 EXCEPTION_CHECK("doAccessibleActions - call to CallBooleanMethod()", FALSE); 3433 3434 if (returnVal != TRUE) { 3435 PrintDebugString("[ERROR]: Action %d failed", i); 3436 *failure = i; 3437 return FALSE; 3438 } 3439 } 3440 *failure = -1; 3441 return TRUE; 3442 } 3443 3444 3445 /********** AccessibleText routines ***********************************/ 3446 3447 BOOL 3448 AccessBridgeJavaEntryPoints::getAccessibleTextInfo(jobject accessibleContext, 3449 AccessibleTextInfo *textInfo, 3450 jint x, jint y) { 3451 jthrowable exception; 3452 3453 // Verify the Java VM still exists and AccessibleContext is 3454 // an instance of AccessibleText 3455 if (verifyAccessibleText(accessibleContext) == FALSE) { 3456 return FALSE; 3457 } 3458 3459 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextInfo(%p, %d, %d):", 3460 accessibleContext, x, y); 3461 3462 // Get the character count 3463 if (getAccessibleCharCountFromContextMethod != (jmethodID) 0) { 3464 textInfo->charCount = jniEnv->CallIntMethod(accessBridgeObject, 3465 getAccessibleCharCountFromContextMethod, 3466 accessibleContext); 3467 EXCEPTION_CHECK("Getting AccessibleCharCount - call to CallIntMethod()", FALSE); 3468 PrintDebugString("[INFO]: Char count = %d", textInfo->charCount); 3469 } else { 3470 PrintDebugString("[ERROR]: either env == 0 or getAccessibleCharCountFromContextMethod == 0"); 3471 return FALSE; 3472 } 3473 3474 // Get the index of the caret 3475 if (getAccessibleCaretPositionFromContextMethod != (jmethodID) 0) { 3476 textInfo->caretIndex = jniEnv->CallIntMethod(accessBridgeObject, 3477 getAccessibleCaretPositionFromContextMethod, 3478 accessibleContext); 3479 EXCEPTION_CHECK("Getting AccessibleCaretPosition - call to CallIntMethod()", FALSE); 3480 PrintDebugString("[INFO]: Index at caret = %d", textInfo->caretIndex); 3481 } else { 3482 PrintDebugString("[ERROR]: either env == 0 or getAccessibleCaretPositionFromContextMethod == 0"); 3483 return FALSE; 3484 } 3485 3486 // Get the index at the given point 3487 if (getAccessibleIndexAtPointFromContextMethod != (jmethodID) 0) { 3488 // If x or y is -1 return -1 3489 if (x == -1 || y == -1) { 3490 textInfo->indexAtPoint = -1; 3491 } else { 3492 textInfo->indexAtPoint = jniEnv->CallIntMethod(accessBridgeObject, 3493 getAccessibleIndexAtPointFromContextMethod, 3494 accessibleContext, x, y); 3495 EXCEPTION_CHECK("Getting AccessibleIndexAtPoint - call to CallIntMethod()", FALSE); 3496 } 3497 PrintDebugString("[INFO]: Index at point = %d", textInfo->indexAtPoint); 3498 } else { 3499 PrintDebugString("[ERROR]: either env == 0 or getAccessibleIndexAtPointFromContextMethod == 0"); 3500 return FALSE; 3501 } 3502 return TRUE; 3503 } 3504 3505 BOOL 3506 AccessBridgeJavaEntryPoints::getAccessibleTextItems(jobject accessibleContext, 3507 AccessibleTextItemsInfo *textItems, jint index) { 3508 jstring js; 3509 const wchar_t *stringBytes; 3510 jthrowable exception; 3511 jsize length; 3512 3513 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextItems(%p):", accessibleContext); 3514 3515 // Verify the Java VM still exists and AccessibleContext is 3516 // an instance of AccessibleText 3517 if (verifyAccessibleText(accessibleContext) == FALSE) { 3518 return FALSE; 3519 } 3520 3521 // Get the letter at index 3522 if (getAccessibleLetterAtIndexFromContextMethod != (jmethodID) 0) { 3523 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 3524 getAccessibleLetterAtIndexFromContextMethod, 3525 accessibleContext, index); 3526 EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to CallIntMethod()", FALSE); 3527 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 3528 if (js != (jstring) 0) { 3529 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3530 EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to GetStringChars()", FALSE); 3531 textItems->letter = stringBytes[0]; 3532 jniEnv->ReleaseStringChars(js, stringBytes); 3533 EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to ReleaseStringChars()", FALSE); 3534 jniEnv->CallVoidMethod(accessBridgeObject, 3535 decrementReferenceMethod, js); 3536 EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to CallVoidMethod()", FALSE); 3537 PrintDebugString("[INFO]: Accessible Text letter = %c", textItems->letter); 3538 jniEnv->DeleteLocalRef(js); 3539 EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to DeleteLocalRef()", FALSE); 3540 } else { 3541 PrintDebugString("[WARN]: Accessible Text letter is null."); 3542 textItems->letter = (wchar_t) 0; 3543 } 3544 } else { 3545 PrintDebugString("[ERROR]: either env == 0 or getAccessibleLetterAtIndexFromContextMethod == 0"); 3546 return FALSE; 3547 } 3548 3549 3550 // Get the word at index 3551 if (getAccessibleWordAtIndexFromContextMethod != (jmethodID) 0) { 3552 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 3553 getAccessibleWordAtIndexFromContextMethod, 3554 accessibleContext, index); 3555 EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to CallIntMethod()", FALSE); 3556 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 3557 if (js != (jstring) 0) { 3558 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3559 EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to GetStringChars()", FALSE); 3560 wcsncpy(textItems->word, stringBytes, (sizeof(textItems->word) / sizeof(wchar_t))); 3561 length = jniEnv->GetStringLength(js); 3562 textItems->word[length < (sizeof(textItems->word) / sizeof(wchar_t)) ? 3563 length : (sizeof(textItems->word) / sizeof(wchar_t))-2] = (wchar_t) 0; 3564 EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to GetStringLength()", FALSE); 3565 jniEnv->ReleaseStringChars(js, stringBytes); 3566 EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to ReleaseStringChars()", FALSE); 3567 jniEnv->CallVoidMethod(accessBridgeObject, 3568 decrementReferenceMethod, js); 3569 EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to CallVoidMethod()", FALSE); 3570 wPrintDebugString(L"[INFO]: Accessible Text word = %ls", textItems->word); 3571 jniEnv->DeleteLocalRef(js); 3572 EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to DeleteLocalRef()", FALSE); 3573 } else { 3574 PrintDebugString("[WARN]: Accessible Text word is null."); 3575 textItems->word[0] = (wchar_t) 0; 3576 } 3577 } else { 3578 PrintDebugString("[ERROR]: either env == 0 or getAccessibleWordAtIndexFromContextMethod == 0"); 3579 return FALSE; 3580 } 3581 3582 // Get the sentence at index 3583 if (getAccessibleSentenceAtIndexFromContextMethod != (jmethodID) 0) { 3584 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 3585 getAccessibleSentenceAtIndexFromContextMethod, 3586 accessibleContext, index); 3587 EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to CallObjectMethod()", FALSE); 3588 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 3589 if (js != (jstring) 0) { 3590 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3591 EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to GetStringChars()", FALSE); 3592 wcsncpy(textItems->sentence, stringBytes, (sizeof(textItems->sentence) / sizeof(wchar_t))-2); 3593 length = jniEnv->GetStringLength(js); 3594 3595 if (length < sizeof(textItems->sentence) / sizeof(wchar_t)) { 3596 textItems->sentence[length] = (wchar_t) 0; 3597 } else { 3598 textItems->sentence[(sizeof(textItems->sentence) / sizeof(wchar_t))-2] = (wchar_t) 0; 3599 } 3600 EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to GetStringLength()", FALSE); 3601 jniEnv->ReleaseStringChars(js, stringBytes); 3602 EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to ReleaseStringChars()", FALSE); 3603 jniEnv->CallVoidMethod(accessBridgeObject, 3604 decrementReferenceMethod, js); 3605 EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to CallVoidMethod()", FALSE); 3606 wPrintDebugString(L"[INFO]: Accessible Text sentence = %ls", textItems->sentence); 3607 jniEnv->DeleteLocalRef(js); 3608 EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to DeleteLocalRef()", FALSE); 3609 } else { 3610 PrintDebugString("[WARN]: Accessible Text sentence is null."); 3611 textItems->sentence[0] = (wchar_t) 0; 3612 } 3613 } else { 3614 PrintDebugString("[ERROR]: either env == 0 or getAccessibleSentenceAtIndexFromContextMethod == 0"); 3615 return FALSE; 3616 } 3617 3618 return TRUE; 3619 } 3620 3621 BOOL 3622 AccessBridgeJavaEntryPoints::getAccessibleTextSelectionInfo(jobject accessibleContext, 3623 AccessibleTextSelectionInfo *selectionInfo) { 3624 jstring js; 3625 const wchar_t *stringBytes; 3626 jthrowable exception; 3627 jsize length; 3628 3629 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextSelectionInfo(%p):", 3630 accessibleContext); 3631 3632 // Verify the Java VM still exists and AccessibleContext is 3633 // an instance of AccessibleText 3634 if (verifyAccessibleText(accessibleContext) == FALSE) { 3635 return FALSE; 3636 } 3637 3638 // Get the selection start index 3639 if (getAccessibleTextSelectionStartFromContextMethod != (jmethodID) 0) { 3640 selectionInfo->selectionStartIndex = jniEnv->CallIntMethod(accessBridgeObject, 3641 getAccessibleTextSelectionStartFromContextMethod, 3642 accessibleContext); 3643 EXCEPTION_CHECK("Getting AccessibleTextSelectionStart - call to CallIntMethod()", FALSE); 3644 PrintDebugString("[INFO]: Selection start = %d", selectionInfo->selectionStartIndex); 3645 } else { 3646 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextSelectionStartFromContextMethod == 0"); 3647 return FALSE; 3648 } 3649 3650 // Get the selection end index 3651 if (getAccessibleTextSelectionEndFromContextMethod != (jmethodID) 0) { 3652 selectionInfo->selectionEndIndex = jniEnv->CallIntMethod(accessBridgeObject, 3653 getAccessibleTextSelectionEndFromContextMethod, 3654 accessibleContext); 3655 EXCEPTION_CHECK("Getting AccessibleTextSelectionEnd - call to CallIntMethod()", FALSE); 3656 PrintDebugString("[INFO]: Selection end = %d", selectionInfo->selectionEndIndex); 3657 } else { 3658 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextSelectionEndFromContextMethod == 0"); 3659 return FALSE; 3660 } 3661 3662 // Get the selected text 3663 if (getAccessibleTextSelectedTextFromContextMethod != (jmethodID) 0) { 3664 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 3665 getAccessibleTextSelectedTextFromContextMethod, 3666 accessibleContext); 3667 EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to CallObjectMethod()", FALSE); 3668 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 3669 if (js != (jstring) 0) { 3670 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3671 EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to GetStringChars()", FALSE); 3672 wcsncpy(selectionInfo->selectedText, stringBytes, (sizeof(selectionInfo->selectedText) / sizeof(wchar_t))); 3673 length = jniEnv->GetStringLength(js); 3674 selectionInfo->selectedText[length < (sizeof(selectionInfo->selectedText) / sizeof(wchar_t)) ? 3675 length : (sizeof(selectionInfo->selectedText) / sizeof(wchar_t))-2] = (wchar_t) 0; 3676 EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to GetStringLength()", FALSE); 3677 jniEnv->ReleaseStringChars(js, stringBytes); 3678 EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to ReleaseStringChars()", FALSE); 3679 jniEnv->CallVoidMethod(accessBridgeObject, 3680 decrementReferenceMethod, js); 3681 EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to CallVoidMethod()", FALSE); 3682 PrintDebugString("[INFO]: Accessible's selected text = %s", selectionInfo->selectedText); 3683 jniEnv->DeleteLocalRef(js); 3684 EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to DeleteLocalRef()", FALSE); 3685 } else { 3686 PrintDebugString("[WARN]: Accessible's selected text is null."); 3687 selectionInfo->selectedText[0] = (wchar_t) 0; 3688 } 3689 } else { 3690 PrintDebugString("[WARN]: either env == 0 or getAccessibleTextSelectedTextFromContextMethod == 0"); 3691 return FALSE; 3692 } 3693 return TRUE; 3694 } 3695 3696 BOOL 3697 AccessBridgeJavaEntryPoints::getAccessibleTextAttributes(jobject accessibleContext, jint index, AccessibleTextAttributesInfo *attributes) { 3698 jstring js; 3699 const wchar_t *stringBytes; 3700 jobject AttributeSet; 3701 jthrowable exception; 3702 jsize length; 3703 3704 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextAttributes(%p):", accessibleContext); 3705 3706 // Verify the Java VM still exists and AccessibleContext is 3707 // an instance of AccessibleText 3708 if (verifyAccessibleText(accessibleContext) == FALSE) { 3709 return FALSE; 3710 } 3711 3712 if (accessibleContext == (jobject) 0) { 3713 PrintDebugString("[WARN]: passed in AccessibleContext == null! (oops)"); 3714 3715 attributes->bold = FALSE; 3716 attributes->italic = FALSE; 3717 attributes->underline = FALSE; 3718 attributes->strikethrough = FALSE; 3719 attributes->superscript = FALSE; 3720 attributes->subscript = FALSE; 3721 attributes->backgroundColor[0] = (wchar_t) 0; 3722 attributes->foregroundColor[0] = (wchar_t) 0; 3723 attributes->fontFamily[0] = (wchar_t) 0; 3724 attributes->fontSize = -1; 3725 attributes->alignment = -1; 3726 attributes->bidiLevel = -1; 3727 attributes->firstLineIndent = -1; 3728 attributes->leftIndent = -1; 3729 attributes->rightIndent = -1; 3730 attributes->lineSpacing = -1; 3731 attributes->spaceAbove = -1; 3732 attributes->spaceBelow = -1; 3733 attributes->fullAttributesString[0] = (wchar_t) 0; 3734 3735 return (FALSE); 3736 } 3737 3738 // Get the AttributeSet 3739 if (getAccessibleAttributeSetAtIndexFromContextMethod != (jmethodID) 0) { 3740 PrintDebugString("[INFO]: Getting AttributeSet at index..."); 3741 AttributeSet = jniEnv->CallObjectMethod(accessBridgeObject, 3742 getAccessibleAttributeSetAtIndexFromContextMethod, 3743 accessibleContext, index); 3744 EXCEPTION_CHECK("Getting AccessibleAttributeSetAtIndex - call to CallObjectMethod()", FALSE); 3745 } else { 3746 PrintDebugString("[ERROR]: either env == 0 or getAccessibleAttributeSetAtIndexFromContextMethod == 0"); 3747 return FALSE; 3748 } 3749 3750 // It is legal for the AttributeSet object to be null, in which case we return false! 3751 if (AttributeSet == (jobject) 0) { 3752 PrintDebugString("[WARN]: AttributeSet returned at index is null (this is legal! - see AWT in J2SE 1.3"); 3753 3754 attributes->bold = FALSE; 3755 attributes->italic = FALSE; 3756 attributes->underline = FALSE; 3757 attributes->strikethrough = FALSE; 3758 attributes->superscript = FALSE; 3759 attributes->subscript = FALSE; 3760 attributes->backgroundColor[0] = (wchar_t) 0; 3761 attributes->foregroundColor[0] = (wchar_t) 0; 3762 attributes->fontFamily[0] = (wchar_t) 0; 3763 attributes->fontSize = -1; 3764 attributes->alignment = -1; 3765 attributes->bidiLevel = -1; 3766 attributes->firstLineIndent = -1; 3767 attributes->leftIndent = -1; 3768 attributes->rightIndent = -1; 3769 attributes->lineSpacing = -1; 3770 attributes->spaceAbove = -1; 3771 attributes->spaceBelow = -1; 3772 attributes->fullAttributesString[0] = (wchar_t) 0; 3773 3774 return (FALSE); 3775 } 3776 3777 // Get the bold setting 3778 if (getBoldFromAttributeSetMethod != (jmethodID) 0) { 3779 PrintDebugString("[INFO]: Getting bold from AttributeSet..."); 3780 attributes->bold = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, 3781 getBoldFromAttributeSetMethod, 3782 AttributeSet); 3783 EXCEPTION_CHECK("Getting BoldFromAttributeSet - call to CallBooleanMethod()", FALSE); 3784 } else { 3785 PrintDebugString("[ERROR]: either env == 0 or getBoldFromAttributeSetMethod == 0"); 3786 jniEnv->CallVoidMethod(accessBridgeObject, 3787 decrementReferenceMethod, AttributeSet); 3788 EXCEPTION_CHECK("Getting BoldFromAttributeSet - call to CallVoidMethod()", FALSE); 3789 jniEnv->DeleteLocalRef(AttributeSet); 3790 EXCEPTION_CHECK("Getting BoldFromAttributeSet - call to DeleteLocalRef()", FALSE); 3791 return FALSE; 3792 } 3793 3794 // Get the italic setting 3795 if (getItalicFromAttributeSetMethod != (jmethodID) 0) { 3796 PrintDebugString("[INFO]: Getting italic from AttributeSet..."); 3797 attributes->italic = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, 3798 getItalicFromAttributeSetMethod, 3799 AttributeSet); 3800 EXCEPTION_CHECK("Getting ItalicFromAttributeSet - call to CallBooleanMethod()", FALSE); 3801 } else { 3802 PrintDebugString("[ERROR]: either env == 0 or getItalicdFromAttributeSetMethod == 0"); 3803 jniEnv->CallVoidMethod(accessBridgeObject, 3804 decrementReferenceMethod, AttributeSet); 3805 EXCEPTION_CHECK("Getting ItalicFromAttributeSet - call to CallVoidMethod()", FALSE); 3806 jniEnv->DeleteLocalRef(AttributeSet); 3807 EXCEPTION_CHECK("Getting ItalicFromAttributeSet - call to DeleteLocalRef()", FALSE); 3808 return FALSE; 3809 } 3810 3811 // Get the underline setting 3812 if (getUnderlineFromAttributeSetMethod != (jmethodID) 0) { 3813 PrintDebugString("[INFO]: Getting underline from AttributeSet..."); 3814 attributes->underline = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, 3815 getUnderlineFromAttributeSetMethod, 3816 AttributeSet); 3817 EXCEPTION_CHECK("Getting UnderlineFromAttributeSet - call to CallBooleanMethod()", FALSE); 3818 } else { 3819 PrintDebugString("[ERROR]: either env == 0 or getUnderlineFromAttributeSetMethod == 0"); 3820 jniEnv->CallVoidMethod(accessBridgeObject, 3821 decrementReferenceMethod, AttributeSet); 3822 EXCEPTION_CHECK("Getting UnderlineFromAttributeSet - call to CallVoidMethod()", FALSE); 3823 jniEnv->DeleteLocalRef(AttributeSet); 3824 EXCEPTION_CHECK("Getting UnderlineFromAttributeSet - call to DeleteLocalRef()", FALSE); 3825 return FALSE; 3826 } 3827 3828 // Get the strikethrough setting 3829 if (getStrikethroughFromAttributeSetMethod != (jmethodID) 0) { 3830 PrintDebugString("[INFO]: Getting strikethrough from AttributeSet..."); 3831 attributes->strikethrough = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, 3832 getStrikethroughFromAttributeSetMethod, 3833 AttributeSet); 3834 EXCEPTION_CHECK("Getting StrikethroughFromAttributeSet - call to CallBooleanMethod()", FALSE); 3835 } else { 3836 PrintDebugString("[ERROR]: either env == 0 or getStrikethroughFromAttributeSetMethod == 0"); 3837 jniEnv->CallVoidMethod(accessBridgeObject, 3838 decrementReferenceMethod, AttributeSet); 3839 EXCEPTION_CHECK("Getting StrikethroughFromAttributeSet - call to CallVoidMethod()", FALSE); 3840 jniEnv->DeleteLocalRef(AttributeSet); 3841 EXCEPTION_CHECK("Getting StrikethroughFromAttributeSet - call to DeleteLocalRef()", FALSE); 3842 return FALSE; 3843 } 3844 3845 // Get the superscript setting 3846 if (getSuperscriptFromAttributeSetMethod != (jmethodID) 0) { 3847 PrintDebugString("[INFO]: Getting superscript from AttributeSet..."); 3848 attributes->superscript = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, 3849 getSuperscriptFromAttributeSetMethod, 3850 AttributeSet); 3851 EXCEPTION_CHECK("Getting SuperscriptFromAttributeSet - call to CallBooleanMethod()", FALSE); 3852 } else { 3853 PrintDebugString("[ERROR]: either env == 0 or getSuperscripteFromAttributeSetMethod == 0"); 3854 jniEnv->CallVoidMethod(accessBridgeObject, 3855 decrementReferenceMethod, AttributeSet); 3856 EXCEPTION_CHECK("Getting SuperscriptFromAttributeSet - call to CallVoidMethod()", FALSE); 3857 jniEnv->DeleteLocalRef(AttributeSet); 3858 EXCEPTION_CHECK("Getting SuperscriptFromAttributeSet - call to DeleteLocalRef()", FALSE); 3859 return FALSE; 3860 } 3861 3862 // Get the subscript setting 3863 if (getSubscriptFromAttributeSetMethod != (jmethodID) 0) { 3864 PrintDebugString("[INFO]: Getting subscript from AttributeSet..."); 3865 attributes->subscript = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, 3866 getSubscriptFromAttributeSetMethod, 3867 AttributeSet); 3868 EXCEPTION_CHECK("Getting SubscriptFromAttributeSet - call to CallBooleanMethod()", FALSE); 3869 } else { 3870 PrintDebugString("[ERROR]: either env == 0 or getSubscriptFromAttributeSetMethod == 0"); 3871 jniEnv->CallVoidMethod(accessBridgeObject, 3872 decrementReferenceMethod, AttributeSet); 3873 EXCEPTION_CHECK("Getting SubscriptFromAttributeSet - call to CallVoidMethod()", FALSE); 3874 jniEnv->DeleteLocalRef(AttributeSet); 3875 EXCEPTION_CHECK("Getting SubscriptFromAttributeSet - call to DeleteLocalRef()", FALSE); 3876 return FALSE; 3877 } 3878 3879 // Get the backgroundColor setting 3880 if (getBackgroundColorFromAttributeSetMethod != (jmethodID) 0) { 3881 PrintDebugString("[INFO]: Getting backgroundColor from AttributeSet..."); 3882 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 3883 getBackgroundColorFromAttributeSetMethod, 3884 AttributeSet); 3885 EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to CallObjectMethod()", FALSE); 3886 if (js != (jstring) 0) { 3887 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3888 EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to GetStringChars()", FALSE); 3889 wcsncpy(attributes->backgroundColor, stringBytes, (sizeof(attributes->backgroundColor) / sizeof(wchar_t))); 3890 length = jniEnv->GetStringLength(js); 3891 attributes->backgroundColor[length < (sizeof(attributes->backgroundColor) / sizeof(wchar_t)) ? 3892 length : (sizeof(attributes->backgroundColor) / sizeof(wchar_t))-2] = (wchar_t) 0; 3893 EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to GetStringLength()", FALSE); 3894 jniEnv->ReleaseStringChars(js, stringBytes); 3895 EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to ReleaseStringChars()", FALSE); 3896 jniEnv->CallVoidMethod(accessBridgeObject, 3897 decrementReferenceMethod, js); 3898 EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to CallVoidMethod()", FALSE); 3899 wPrintDebugString(L"[INFO]: AttributeSet's background color = %ls", attributes->backgroundColor); 3900 jniEnv->DeleteLocalRef(js); 3901 EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE); 3902 } else { 3903 PrintDebugString("[WARN]: AttributeSet's background color is null."); 3904 attributes->backgroundColor[0] = (wchar_t) 0; 3905 } 3906 } else { 3907 PrintDebugString("[ERROR]: either env == 0 or getBackgroundColorFromAttributeSetMethod == 0"); 3908 jniEnv->CallVoidMethod(accessBridgeObject, 3909 decrementReferenceMethod, AttributeSet); 3910 EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to CallVoidMethod()", FALSE); 3911 jniEnv->DeleteLocalRef(AttributeSet); 3912 EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE); 3913 return FALSE; 3914 } 3915 3916 // Get the foregroundColor setting 3917 if (getForegroundColorFromAttributeSetMethod != (jmethodID) 0) { 3918 PrintDebugString("[INFO]: Getting foregroundColor from AttributeSet..."); 3919 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 3920 getForegroundColorFromAttributeSetMethod, 3921 AttributeSet); 3922 EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to CallObjectMethod()", FALSE); 3923 if (js != (jstring) 0) { 3924 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3925 EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to GetStringChars()", FALSE); 3926 wcsncpy(attributes->foregroundColor, stringBytes, (sizeof(attributes->foregroundColor) / sizeof(wchar_t))); 3927 length = jniEnv->GetStringLength(js); 3928 attributes->foregroundColor[length < (sizeof(attributes->foregroundColor) / sizeof(wchar_t)) ? 3929 length : (sizeof(attributes->foregroundColor) / sizeof(wchar_t))-2] = (wchar_t) 0; 3930 EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to GetStringLength()", FALSE); 3931 jniEnv->ReleaseStringChars(js, stringBytes); 3932 EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to ReleaseStringChars()", FALSE); 3933 jniEnv->CallVoidMethod(accessBridgeObject, 3934 decrementReferenceMethod, js); 3935 EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to CallVoidMethod()", FALSE); 3936 wPrintDebugString(L"[INFO]: AttributeSet's foreground color = %ls", attributes->foregroundColor); 3937 jniEnv->DeleteLocalRef(js); 3938 EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE); 3939 } else { 3940 PrintDebugString("[WARN]: AttributeSet's foreground color is null."); 3941 attributes->foregroundColor[0] = (wchar_t) 0; 3942 } 3943 } else { 3944 PrintDebugString("[ERROR]: either env == 0 or getForegroundColorFromAttributeSetMethod == 0"); 3945 jniEnv->CallVoidMethod(accessBridgeObject, 3946 decrementReferenceMethod, AttributeSet); 3947 EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to CallVoidMethod()", FALSE); 3948 jniEnv->DeleteLocalRef(AttributeSet); 3949 EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE); 3950 return FALSE; 3951 } 3952 3953 // Get the fontFamily setting 3954 if (getFontFamilyFromAttributeSetMethod != (jmethodID) 0) { 3955 PrintDebugString("[INFO]: Getting fontFamily from AttributeSet..."); 3956 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 3957 getFontFamilyFromAttributeSetMethod, 3958 AttributeSet); 3959 EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to CallObjectMethod()", FALSE); 3960 if (js != (jstring) 0) { 3961 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 3962 EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to GetStringChars()", FALSE); 3963 wcsncpy(attributes->fontFamily, stringBytes, (sizeof(attributes->fontFamily) / sizeof(wchar_t))); 3964 length = jniEnv->GetStringLength(js); 3965 attributes->fontFamily[length < (sizeof(attributes->fontFamily) / sizeof(wchar_t)) ? 3966 length : (sizeof(attributes->fontFamily) / sizeof(wchar_t))-2] = (wchar_t) 0; 3967 EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to GetStringLength()", FALSE); 3968 jniEnv->ReleaseStringChars(js, stringBytes); 3969 EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to ReleaseStringChars()", FALSE); 3970 jniEnv->CallVoidMethod(accessBridgeObject, 3971 decrementReferenceMethod, js); 3972 EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to CallVoidMethod()", FALSE); 3973 wPrintDebugString(L"[INFO]: AttributeSet's fontFamily = %ls", attributes->fontFamily); 3974 jniEnv->DeleteLocalRef(js); 3975 EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to DeleteLocalRef()", FALSE); 3976 } else { 3977 PrintDebugString("[WARN]: AttributeSet's fontFamily is null."); 3978 attributes->backgroundColor[0] = (wchar_t) 0; 3979 } 3980 } else { 3981 PrintDebugString("[ERROR]: either env == 0 or getFontFamilyFromAttributeSetMethod == 0"); 3982 jniEnv->CallVoidMethod(accessBridgeObject, 3983 decrementReferenceMethod, AttributeSet); 3984 EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to CallVoidMethod()", FALSE); 3985 jniEnv->DeleteLocalRef(AttributeSet); 3986 EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to DeleteLocalRef()", FALSE); 3987 return FALSE; 3988 } 3989 3990 // Get the font size 3991 if (getFontSizeFromAttributeSetMethod != (jmethodID) 0) { 3992 PrintDebugString("[INFO]: Getting font size from AttributeSet..."); 3993 attributes->fontSize = jniEnv->CallIntMethod(accessBridgeObject, 3994 getFontSizeFromAttributeSetMethod, 3995 AttributeSet); 3996 EXCEPTION_CHECK("Getting FontSizeFromAttributeSet - call to CallIntMethod()", FALSE); 3997 PrintDebugString("[INFO]: AttributeSet's font size = %d", attributes->fontSize); 3998 } else { 3999 PrintDebugString("[ERROR]: either env == 0 or getAlignmentFromAttributeSetMethod == 0"); 4000 jniEnv->CallVoidMethod(accessBridgeObject, 4001 decrementReferenceMethod, AttributeSet); 4002 EXCEPTION_CHECK("Getting FontSizeFromAttributeSet - call to CallVoidMethod()", FALSE); 4003 jniEnv->DeleteLocalRef(AttributeSet); 4004 EXCEPTION_CHECK("Getting FontSizeFromAttributeSet - call to DeleteLocalRef()", FALSE); 4005 return FALSE; 4006 } 4007 4008 4009 // Get the alignment setting 4010 if (getAlignmentFromAttributeSetMethod != (jmethodID) 0) { 4011 PrintDebugString(" Getting alignment from AttributeSet..."); 4012 attributes->alignment = jniEnv->CallIntMethod(accessBridgeObject, 4013 getAlignmentFromAttributeSetMethod, 4014 AttributeSet); 4015 EXCEPTION_CHECK("Getting AlignmentFromAttributeSet - call to CallIntMethod()", FALSE); 4016 } else { 4017 PrintDebugString("[ERROR]: either env == 0 or getAlignmentFromAttributeSetMethod == 0"); 4018 jniEnv->CallVoidMethod(accessBridgeObject, 4019 decrementReferenceMethod, AttributeSet); 4020 EXCEPTION_CHECK("Getting AlignmentFromAttributeSet - call to CallVoidMethod()", FALSE); 4021 jniEnv->DeleteLocalRef(AttributeSet); 4022 EXCEPTION_CHECK("Getting AlignmentFromAttributeSet - call to DeleteLocalRef()", FALSE); 4023 return FALSE; 4024 } 4025 4026 // Get the bidiLevel setting 4027 if (getBidiLevelFromAttributeSetMethod != (jmethodID) 0) { 4028 PrintDebugString("[INFO]: Getting bidiLevel from AttributeSet..."); 4029 attributes->bidiLevel = jniEnv->CallIntMethod(accessBridgeObject, 4030 getBidiLevelFromAttributeSetMethod, 4031 AttributeSet); 4032 EXCEPTION_CHECK("Getting BidiLevelFromAttributeSet - call to CallIntMethod()", FALSE); 4033 } else { 4034 PrintDebugString("[ERROR]: either env == 0 or getBidiLevelFromAttributeSetMethod == 0"); 4035 jniEnv->CallVoidMethod(accessBridgeObject, 4036 decrementReferenceMethod, AttributeSet); 4037 EXCEPTION_CHECK("Getting BidiLevelFromAttributeSet - call to CallVoidMethod()", FALSE); 4038 jniEnv->DeleteLocalRef(AttributeSet); 4039 EXCEPTION_CHECK("Getting BidiLevelFromAttributeSet - call to DeleteLocalRef()", FALSE); 4040 return FALSE; 4041 } 4042 4043 // Get the firstLineIndent setting 4044 if (getFirstLineIndentFromAttributeSetMethod != (jmethodID) 0) { 4045 PrintDebugString("[ERROR]: Getting firstLineIndent from AttributeSet..."); 4046 attributes->firstLineIndent = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject, 4047 getFirstLineIndentFromAttributeSetMethod, 4048 AttributeSet); 4049 EXCEPTION_CHECK("Getting FirstLineIndentFromAttributeSet - call to CallIntMethod()", FALSE); 4050 } else { 4051 PrintDebugString("[ERROR]: either env == 0 or getFirstLineIndentFromAttributeSetMethod == 0"); 4052 jniEnv->CallVoidMethod(accessBridgeObject, 4053 decrementReferenceMethod, AttributeSet); 4054 EXCEPTION_CHECK("Getting FirstLineIndentFromAttributeSet - call to CallVoidMethod()", FALSE); 4055 jniEnv->DeleteLocalRef(AttributeSet); 4056 EXCEPTION_CHECK("Getting FirstLineIndentFromAttributeSet - call to DeleteLocalRef()", FALSE); 4057 return FALSE; 4058 } 4059 4060 // Get the leftIndent setting 4061 if (getLeftIndentFromAttributeSetMethod != (jmethodID) 0) { 4062 PrintDebugString("[INFO]: Getting leftIndent from AttributeSet..."); 4063 attributes->leftIndent = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject, 4064 getLeftIndentFromAttributeSetMethod, 4065 AttributeSet); 4066 EXCEPTION_CHECK("Getting LeftIndentFromAttributeSet - call to CallIntMethod()", FALSE); 4067 } else { 4068 PrintDebugString("[ERROR]: either env == 0 or getLeftIndentFromAttributeSetMethod == 0"); 4069 jniEnv->CallVoidMethod(accessBridgeObject, 4070 decrementReferenceMethod, AttributeSet); 4071 EXCEPTION_CHECK("Getting LeftIndentFromAttributeSet - call to CallVoidMethod()", FALSE); 4072 jniEnv->DeleteLocalRef(AttributeSet); 4073 EXCEPTION_CHECK("Getting LeftIndentFromAttributeSet - call to DeleteLocalRef()", FALSE); 4074 return FALSE; 4075 } 4076 4077 // Get the rightIndent setting 4078 if (getRightIndentFromAttributeSetMethod != (jmethodID) 0) { 4079 PrintDebugString("[INFO]: Getting rightIndent from AttributeSet..."); 4080 attributes->rightIndent = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject, 4081 getRightIndentFromAttributeSetMethod, 4082 AttributeSet); 4083 EXCEPTION_CHECK("Getting RightIndentFromAttributeSet - call to CallIntMethod()", FALSE); 4084 } else { 4085 PrintDebugString("[ERROR]: either env == 0 or getRightIndentFromAttributeSetMethod == 0"); 4086 jniEnv->CallVoidMethod(accessBridgeObject, 4087 decrementReferenceMethod, AttributeSet); 4088 EXCEPTION_CHECK("Getting RightIndentFromAttributeSet - call to CallVoidMethod()", FALSE); 4089 jniEnv->DeleteLocalRef(AttributeSet); 4090 EXCEPTION_CHECK("Getting RightIndentFromAttributeSet - call to DeleteLocalRef()", FALSE); 4091 return FALSE; 4092 } 4093 4094 // Get the lineSpacing setting 4095 if (getLineSpacingFromAttributeSetMethod != (jmethodID) 0) { 4096 PrintDebugString("[INFO]: Getting lineSpacing from AttributeSet..."); 4097 attributes->lineSpacing = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject, 4098 getLineSpacingFromAttributeSetMethod, 4099 AttributeSet); 4100 EXCEPTION_CHECK("Getting LineSpacingFromAttributeSet - call to CallIntMethod()", FALSE); 4101 } else { 4102 PrintDebugString("[ERROR]: either env == 0 or getLineSpacingFromAttributeSetMethod == 0"); 4103 jniEnv->CallVoidMethod(accessBridgeObject, 4104 decrementReferenceMethod, AttributeSet); 4105 EXCEPTION_CHECK("Getting LineSpacingFromAttributeSet - call to CallVoidMethod()", FALSE); 4106 jniEnv->DeleteLocalRef(AttributeSet); 4107 EXCEPTION_CHECK("Getting LineSpacingFromAttributeSet - call to DeleteLocalRef()", FALSE); 4108 return FALSE; 4109 } 4110 4111 // Get the spaceAbove setting 4112 if (getSpaceAboveFromAttributeSetMethod != (jmethodID) 0) { 4113 PrintDebugString("[INFO]: Getting spaceAbove from AttributeSet..."); 4114 attributes->spaceAbove = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject, 4115 getSpaceAboveFromAttributeSetMethod, 4116 AttributeSet); 4117 EXCEPTION_CHECK("Getting SpaceAboveFromAttributeSet - call to CallIntMethod()", FALSE); 4118 } else { 4119 PrintDebugString("[ERROR]: either env == 0 or getSpaceAboveFromAttributeSetMethod == 0"); 4120 jniEnv->CallVoidMethod(accessBridgeObject, 4121 decrementReferenceMethod, AttributeSet); 4122 EXCEPTION_CHECK("Getting SpaceAboveFromAttributeSet - call to CallVoidMethod()", FALSE); 4123 jniEnv->DeleteLocalRef(AttributeSet); 4124 EXCEPTION_CHECK("Getting SpaceAboveFromAttributeSet - call to DeleteLocalRef()", FALSE); 4125 return FALSE; 4126 } 4127 4128 // Get the spaceBelow setting 4129 if (getSpaceBelowFromAttributeSetMethod != (jmethodID) 0) { 4130 PrintDebugString("[INFO]: Getting spaceBelow from AttributeSet..."); 4131 attributes->spaceBelow = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject, 4132 getSpaceBelowFromAttributeSetMethod, 4133 AttributeSet); 4134 EXCEPTION_CHECK("Getting SpaceBelowFromAttributeSet - call to CallIntMethod()", FALSE); 4135 } else { 4136 PrintDebugString("[ERROR]: either env == 0 or getSpaceBelowFromAttributeSetMethod == 0"); 4137 jniEnv->CallVoidMethod(accessBridgeObject, 4138 decrementReferenceMethod, AttributeSet); 4139 EXCEPTION_CHECK("Getting SpaceBelowFromAttributeSet - call to CallVoidMethod()", FALSE); 4140 jniEnv->DeleteLocalRef(AttributeSet); 4141 EXCEPTION_CHECK("Getting SpaceBelowFromAttributeSet - call to DeleteLocalRef()", FALSE); 4142 return FALSE; 4143 } 4144 4145 // Release the AttributeSet object 4146 if (decrementReferenceMethod != (jmethodID) 0) { 4147 PrintDebugString("[INFO]: Decrementing reference to AttributeSet..."); 4148 jniEnv->CallVoidMethod(accessBridgeObject, 4149 decrementReferenceMethod, AttributeSet); 4150 EXCEPTION_CHECK("Releasing AttributeSet object - call to CallVoidMethod()", FALSE); 4151 } else { 4152 PrintDebugString("[ERROR]: either env == 0 or accessBridgeObject == 0"); 4153 jniEnv->DeleteLocalRef(AttributeSet); 4154 EXCEPTION_CHECK("Releasing AttributeSet object - call to DeleteLocalRef()", FALSE); 4155 return FALSE; 4156 } 4157 4158 // Get the full attributes string at index 4159 if (getAccessibleAttributesAtIndexFromContextMethod != (jmethodID) 0) { 4160 PrintDebugString("[INFO]: Getting full attributes string from Context..."); 4161 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 4162 getAccessibleAttributesAtIndexFromContextMethod, 4163 accessibleContext, index); 4164 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallObjectMethod()", FALSE); 4165 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 4166 if (js != (jstring) 0) { 4167 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 4168 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringChars()", FALSE); 4169 wcsncpy(attributes->fullAttributesString, stringBytes, (sizeof(attributes->fullAttributesString) / sizeof(wchar_t))); 4170 length = jniEnv->GetStringLength(js); 4171 attributes->fullAttributesString[length < (sizeof(attributes->fullAttributesString) / sizeof(wchar_t)) ? 4172 length : (sizeof(attributes->fullAttributesString) / sizeof(wchar_t))-2] = (wchar_t) 0; 4173 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringLength()", FALSE); 4174 jniEnv->ReleaseStringChars(js, stringBytes); 4175 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to ReleaseStringChars()", FALSE); 4176 jniEnv->CallVoidMethod(accessBridgeObject, 4177 decrementReferenceMethod, js); 4178 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallVoidMethod()", FALSE); 4179 wPrintDebugString(L"[INFO]: Accessible Text attributes = %ls", attributes->fullAttributesString); 4180 jniEnv->DeleteLocalRef(js); 4181 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to DeleteLocalRef()", FALSE); 4182 } else { 4183 PrintDebugString("[WARN]: Accessible Text attributes is null."); 4184 attributes->fullAttributesString[0] = (wchar_t) 0; 4185 jniEnv->DeleteLocalRef(AttributeSet); 4186 EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to DeleteLocalRef()", FALSE); 4187 return FALSE; 4188 } 4189 } else { 4190 PrintDebugString("[ERROR]: either env == 0 or getAccessibleAttributesAtIndexFromContextMethod == 0"); 4191 jniEnv->DeleteLocalRef(AttributeSet); 4192 return FALSE; 4193 } 4194 4195 jniEnv->DeleteLocalRef(AttributeSet); 4196 EXCEPTION_CHECK("Getting AccessibleAttributeSetAtIndex - call to DeleteLocalRef()", FALSE); 4197 return TRUE; 4198 } 4199 4200 BOOL 4201 AccessBridgeJavaEntryPoints::getAccessibleTextRect(jobject accessibleContext, AccessibleTextRectInfo *rectInfo, jint index) { 4202 4203 jthrowable exception; 4204 4205 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextRect(%p), index = %d", 4206 accessibleContext, index); 4207 4208 // Verify the Java VM still exists and AccessibleContext is 4209 // an instance of AccessibleText 4210 if (verifyAccessibleText(accessibleContext) == FALSE) { 4211 return FALSE; 4212 } 4213 4214 // Get the x coord 4215 if (getAccessibleXcoordTextRectAtIndexFromContextMethod != (jmethodID) 0) { 4216 rectInfo->x = jniEnv->CallIntMethod(accessBridgeObject, 4217 getAccessibleXcoordTextRectAtIndexFromContextMethod, 4218 accessibleContext, index); 4219 EXCEPTION_CHECK("Getting AccessibleXcoordTextRect - call to CallIntMethod()", FALSE); 4220 PrintDebugString("[INFO]: X coord = %d", rectInfo->x); 4221 } else { 4222 PrintDebugString("[ERROR]: either env == 0 or getAccessibleXcoordTextRectAtIndexFromContextMethod == 0"); 4223 return FALSE; 4224 } 4225 4226 // Get the y coord 4227 if (getAccessibleYcoordTextRectAtIndexFromContextMethod != (jmethodID) 0) { 4228 rectInfo->y = jniEnv->CallIntMethod(accessBridgeObject, 4229 getAccessibleYcoordTextRectAtIndexFromContextMethod, 4230 accessibleContext, index); 4231 EXCEPTION_CHECK("Getting AccessibleYcoordTextRect - call to CallIntMethod()", FALSE); 4232 PrintDebugString("[INFO]: Y coord = %d", rectInfo->y); 4233 } else { 4234 PrintDebugString("[INFO]: either env == 0 or getAccessibleYcoordTextRectAtIndexFromContextMethod == 0"); 4235 return FALSE; 4236 } 4237 4238 // Get the width 4239 if (getAccessibleWidthTextRectAtIndexFromContextMethod != (jmethodID) 0) { 4240 rectInfo->width = jniEnv->CallIntMethod(accessBridgeObject, 4241 getAccessibleWidthTextRectAtIndexFromContextMethod, 4242 accessibleContext, index); 4243 EXCEPTION_CHECK("Getting AccessibleWidthTextRect - call to CallIntMethod()", FALSE); 4244 PrintDebugString("[INFO]: Width = %d", rectInfo->width); 4245 } else { 4246 PrintDebugString("[INFO]: either env == 0 or getAccessibleWidthTextRectAtIndexFromContextMethod == 0"); 4247 return FALSE; 4248 } 4249 4250 // Get the height 4251 if (getAccessibleHeightTextRectAtIndexFromContextMethod != (jmethodID) 0) { 4252 rectInfo->height = jniEnv->CallIntMethod(accessBridgeObject, 4253 getAccessibleHeightTextRectAtIndexFromContextMethod, 4254 accessibleContext, index); 4255 EXCEPTION_CHECK("Getting AccessibleHeightTextRect - call to CallIntMethod()", FALSE); 4256 PrintDebugString("[INFO]: Height = %d", rectInfo->height); 4257 } else { 4258 PrintDebugString("[ERROR]: either env == 0 or getAccessibleHeightTextRectAtIndexFromContextMethod == 0"); 4259 return FALSE; 4260 } 4261 4262 return TRUE; 4263 } 4264 4265 // ===== 4266 4267 /** 4268 * gets the bounding rectangle for the text caret 4269 */ 4270 BOOL 4271 AccessBridgeJavaEntryPoints::getCaretLocation(jobject accessibleContext, AccessibleTextRectInfo *rectInfo, jint index) { 4272 4273 jthrowable exception; 4274 4275 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getCaretLocation(%p), index = %d", 4276 accessibleContext, index); 4277 4278 // Verify the Java VM still exists and AccessibleContext is 4279 // an instance of AccessibleText 4280 if (verifyAccessibleText(accessibleContext) == FALSE) { 4281 return FALSE; 4282 } 4283 4284 // Get the x coord 4285 if (getCaretLocationXMethod != (jmethodID) 0) { 4286 rectInfo->x = jniEnv->CallIntMethod(accessBridgeObject, 4287 getCaretLocationXMethod, 4288 accessibleContext, index); 4289 EXCEPTION_CHECK("Getting caret X coordinate - call to CallIntMethod()", FALSE); 4290 PrintDebugString("[INFO]: X coord = %d", rectInfo->x); 4291 } else { 4292 PrintDebugString("[ERROR]: either env == 0 or getCaretLocationXMethod == 0"); 4293 return FALSE; 4294 } 4295 4296 // Get the y coord 4297 if (getCaretLocationYMethod != (jmethodID) 0) { 4298 rectInfo->y = jniEnv->CallIntMethod(accessBridgeObject, 4299 getCaretLocationYMethod, 4300 accessibleContext, index); 4301 EXCEPTION_CHECK("Getting caret Y coordinate - call to CallIntMethod()", FALSE); 4302 PrintDebugString("[INFO]: Y coord = %d", rectInfo->y); 4303 } else { 4304 PrintDebugString("[ERROR]: either env == 0 or getCaretLocationYMethod == 0"); 4305 return FALSE; 4306 } 4307 4308 // Get the width 4309 if (getCaretLocationWidthMethod != (jmethodID) 0) { 4310 rectInfo->width = jniEnv->CallIntMethod(accessBridgeObject, 4311 getCaretLocationWidthMethod, 4312 accessibleContext, index); 4313 EXCEPTION_CHECK("Getting caret width - call to CallIntMethod()", FALSE); 4314 PrintDebugString("[INFO]: Width = %d", rectInfo->width); 4315 } else { 4316 PrintDebugString("[ERROR]: either env == 0 or getCaretLocationWidthMethod == 0"); 4317 return FALSE; 4318 } 4319 4320 // Get the height 4321 if (getCaretLocationHeightMethod != (jmethodID) 0) { 4322 rectInfo->height = jniEnv->CallIntMethod(accessBridgeObject, 4323 getCaretLocationHeightMethod, 4324 accessibleContext, index); 4325 EXCEPTION_CHECK("Getting caret height - call to CallIntMethod()", FALSE); 4326 PrintDebugString("[INFO]: Height = %d", rectInfo->height); 4327 } else { 4328 PrintDebugString("[ERROR]: either env == 0 or getCaretLocationHeightMethod == 0"); 4329 return FALSE; 4330 } 4331 4332 return TRUE; 4333 } 4334 4335 // ===== 4336 4337 BOOL 4338 AccessBridgeJavaEntryPoints::getAccessibleTextLineBounds(jobject accessibleContext, jint index, jint *startIndex, jint *endIndex) { 4339 4340 jthrowable exception; 4341 4342 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextLineBounds(%p):", accessibleContext); 4343 4344 // Verify the Java VM still exists and AccessibleContext is 4345 // an instance of AccessibleText 4346 if (verifyAccessibleText(accessibleContext) == FALSE) { 4347 return FALSE; 4348 } 4349 4350 // Get the index of the left boundary of the line containing 'index' 4351 if (getAccessibleTextLineLeftBoundsFromContextMethod != (jmethodID) 0) { 4352 *startIndex = jniEnv->CallIntMethod(accessBridgeObject, 4353 getAccessibleTextLineLeftBoundsFromContextMethod, 4354 accessibleContext, index); 4355 EXCEPTION_CHECK("Getting AccessibleTextLineLeftBounds - call to CallIntMethod()", FALSE); 4356 PrintDebugString("[INFO]: startIndex = %d", *startIndex); 4357 } else { 4358 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextLineLeftBoundsFromContextMethod == 0"); 4359 return FALSE; 4360 } 4361 4362 // Get the index of the right boundary of the line containing 'index' 4363 if (getAccessibleTextLineRightBoundsFromContextMethod != (jmethodID) 0) { 4364 *endIndex = jniEnv->CallIntMethod(accessBridgeObject, 4365 getAccessibleTextLineRightBoundsFromContextMethod, 4366 accessibleContext, index); 4367 EXCEPTION_CHECK("Getting AccessibleTextLineRightBounds - call to CallIntMethod()", FALSE); 4368 PrintDebugString("[INFO]: endIndex = %d", *endIndex); 4369 } else { 4370 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextLineRightBoundsFromContextMethod == 0"); 4371 return FALSE; 4372 } 4373 4374 return TRUE; 4375 } 4376 4377 BOOL 4378 AccessBridgeJavaEntryPoints::getAccessibleTextRange(jobject accessibleContext, 4379 jint start, jint end, wchar_t *text, short len) { 4380 jstring js; 4381 const wchar_t *stringBytes; 4382 jthrowable exception; 4383 jsize length; 4384 4385 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextRange(%p, %d, %d, *text, %d):", accessibleContext, start, end, len); 4386 4387 // Verify the Java VM still exists and AccessibleContext is 4388 // an instance of AccessibleText 4389 if (verifyAccessibleText(accessibleContext) == FALSE) { 4390 return FALSE; 4391 } 4392 4393 // range is inclusive 4394 if (end < start) { 4395 PrintDebugString("[ERROR]: end < start!"); 4396 text[0] = (wchar_t) 0; 4397 return FALSE; 4398 } 4399 4400 // Get the text range within [start, end] inclusive 4401 if (getAccessibleTextRangeFromContextMethod != (jmethodID) 0) { 4402 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 4403 getAccessibleTextRangeFromContextMethod, 4404 accessibleContext, start, end); 4405 EXCEPTION_CHECK("Getting AccessibleTextRange - call to CallObjectMethod()", FALSE); 4406 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 4407 if (js != (jstring) 0) { 4408 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 4409 EXCEPTION_CHECK("Getting AccessibleTextRange - call to GetStringChars()", FALSE); 4410 wPrintDebugString(L"[INFO]: Accessible Text stringBytes returned from Java = %ls", stringBytes); 4411 wcsncpy(text, stringBytes, len); 4412 length = jniEnv->GetStringLength(js); 4413 PrintDebugString("[INFO]: Accessible Text stringBytes length = %d", length); 4414 text[length < len ? length : len - 2] = (wchar_t) 0; 4415 wPrintDebugString(L"[INFO]: Accessible Text 'text' after null termination = %ls", text); 4416 EXCEPTION_CHECK("Getting AccessibleTextRange - call to GetStringLength()", FALSE); 4417 jniEnv->ReleaseStringChars(js, stringBytes); 4418 EXCEPTION_CHECK("Getting AccessibleTextRange - call to ReleaseStringChars()", FALSE); 4419 jniEnv->CallVoidMethod(accessBridgeObject, 4420 decrementReferenceMethod, js); 4421 EXCEPTION_CHECK("Getting AccessibleTextRange - call to CallVoidMethod()", FALSE); 4422 wPrintDebugString(L"[INFO]: Accessible Text range = %ls", text); 4423 jniEnv->DeleteLocalRef(js); 4424 EXCEPTION_CHECK("Getting AccessibleTextRange - call to DeleteLocalRef()", FALSE); 4425 } else { 4426 PrintDebugString("[WARN]: current Accessible Text range is null."); 4427 text[0] = (wchar_t) 0; 4428 return FALSE; 4429 } 4430 } else { 4431 PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextRangeFromContextMethod == 0"); 4432 return FALSE; 4433 } 4434 return TRUE; 4435 } 4436 4437 /********** AccessibleValue routines ***************/ 4438 4439 BOOL 4440 AccessBridgeJavaEntryPoints::getCurrentAccessibleValueFromContext(jobject accessibleContext, wchar_t *value, short len) { 4441 jstring js; 4442 const wchar_t *stringBytes; 4443 jthrowable exception; 4444 jsize length; 4445 4446 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getCurrentAccessibleValueFromContext(%p):", accessibleContext); 4447 4448 // Get the current Accessible Value 4449 if (getCurrentAccessibleValueFromContextMethod != (jmethodID) 0) { 4450 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 4451 getCurrentAccessibleValueFromContextMethod, 4452 accessibleContext); 4453 EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to CallObjectMethod()", FALSE); 4454 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 4455 if (js != (jstring) 0) { 4456 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 4457 EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to GetStringChars()", FALSE); 4458 wcsncpy(value, stringBytes, len); 4459 length = jniEnv->GetStringLength(js); 4460 value[length < len ? length : len - 2] = (wchar_t) 0; 4461 EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to GetStringLength()", FALSE); 4462 jniEnv->ReleaseStringChars(js, stringBytes); 4463 EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to ReleaseStringChars()", FALSE); 4464 jniEnv->CallVoidMethod(accessBridgeObject, 4465 decrementReferenceMethod, js); 4466 EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to CallVoidMethod()", FALSE); 4467 PrintDebugString("[INFO]: current Accessible Value = %s", value); 4468 jniEnv->DeleteLocalRef(js); 4469 EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to DeleteLocalRef()", FALSE); 4470 } else { 4471 PrintDebugString("[WARN]: current Accessible Value is null."); 4472 value[0] = (wchar_t) 0; 4473 return FALSE; 4474 } 4475 } else { 4476 PrintDebugString("[ERROR]: either env == 0 or getCurrentAccessibleValueFromContextMethod == 0"); 4477 return FALSE; 4478 } 4479 return TRUE; 4480 } 4481 4482 BOOL 4483 AccessBridgeJavaEntryPoints::getMaximumAccessibleValueFromContext(jobject accessibleContext, wchar_t *value, short len) { 4484 jstring js; 4485 const wchar_t *stringBytes; 4486 jthrowable exception; 4487 jsize length; 4488 4489 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getMaximumAccessibleValueFromContext(%p):", accessibleContext); 4490 4491 // Get the maximum Accessible Value 4492 if (getMaximumAccessibleValueFromContextMethod != (jmethodID) 0) { 4493 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 4494 getMaximumAccessibleValueFromContextMethod, 4495 accessibleContext); 4496 EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to CallObjectMethod()", FALSE); 4497 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 4498 if (js != (jstring) 0) { 4499 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 4500 EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to GetStringChars()", FALSE); 4501 wcsncpy(value, stringBytes, len); 4502 length = jniEnv->GetStringLength(js); 4503 value[length < len ? length : len - 2] = (wchar_t) 0; 4504 EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to GetStringLength()", FALSE); 4505 jniEnv->ReleaseStringChars(js, stringBytes); 4506 EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to ReleaseStringChars()", FALSE); 4507 jniEnv->CallVoidMethod(accessBridgeObject, 4508 decrementReferenceMethod, js); 4509 EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to CallVoidMethod()", FALSE); 4510 PrintDebugString("[INFO]: maximum Accessible Value = %s", value); 4511 jniEnv->DeleteLocalRef(js); 4512 EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to DeleteLocalRef()", FALSE); 4513 } else { 4514 PrintDebugString("[WARN]: maximum Accessible Value is null."); 4515 value[0] = (wchar_t) 0; 4516 return FALSE; 4517 } 4518 } else { 4519 PrintDebugString("[ERROR]: either env == 0 or getMaximumAccessibleValueFromContextMethod == 0"); 4520 return FALSE; 4521 } 4522 return TRUE; 4523 } 4524 4525 BOOL 4526 AccessBridgeJavaEntryPoints::getMinimumAccessibleValueFromContext(jobject accessibleContext, wchar_t *value, short len) { 4527 jstring js; 4528 const wchar_t *stringBytes; 4529 jthrowable exception; 4530 jsize length; 4531 4532 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getMinimumAccessibleValueFromContext(%p):", accessibleContext); 4533 4534 // Get the mimimum Accessible Value 4535 if (getMinimumAccessibleValueFromContextMethod != (jmethodID) 0) { 4536 js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject, 4537 getMinimumAccessibleValueFromContextMethod, 4538 accessibleContext); 4539 EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to CallObjectMethod()", FALSE); 4540 PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js); 4541 if (js != (jstring) 0) { 4542 stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0); 4543 EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to GetStringChars()", FALSE); 4544 wcsncpy(value, stringBytes, len); 4545 length = jniEnv->GetStringLength(js); 4546 value[length < len ? length : len - 2] = (wchar_t) 0; 4547 EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to GetStringLength()", FALSE); 4548 jniEnv->ReleaseStringChars(js, stringBytes); 4549 EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to ReleaseStringChars()", FALSE); 4550 jniEnv->CallVoidMethod(accessBridgeObject, 4551 decrementReferenceMethod, js); 4552 EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to CallVoidMethod()", FALSE); 4553 PrintDebugString("[INFO]: mimimum Accessible Value = %s", value); 4554 jniEnv->DeleteLocalRef(js); 4555 EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to DeleteLocalRef()", FALSE); 4556 } else { 4557 PrintDebugString("[WARN]: mimimum Accessible Value is null."); 4558 value[0] = (wchar_t) 0; 4559 return FALSE; 4560 } 4561 } else { 4562 PrintDebugString("[ERROR]: either env == 0 or getMinimumAccessibleValueFromContextMethod == 0"); 4563 return FALSE; 4564 } 4565 return TRUE; 4566 } 4567 4568 4569 /********** AccessibleSelection routines ***************/ 4570 4571 void 4572 AccessBridgeJavaEntryPoints::addAccessibleSelectionFromContext(jobject accessibleContext, int i) { 4573 jthrowable exception; 4574 4575 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::addAccessibleSelectionFromContext(%p):", accessibleContext); 4576 4577 // Add the child to the AccessibleSelection 4578 if (addAccessibleSelectionFromContextMethod != (jmethodID) 0) { 4579 jniEnv->CallVoidMethod(accessBridgeObject, 4580 addAccessibleSelectionFromContextMethod, 4581 accessibleContext, i); 4582 EXCEPTION_CHECK_VOID("Doing addAccessibleSelection - call to CallVoidMethod()"); 4583 PrintDebugString("[INFO]: returned from CallObjectMethod()"); 4584 } else { 4585 PrintDebugString("[ERROR]: either env == 0 or addAccessibleSelectionFromContextMethod == 0"); 4586 } 4587 } 4588 4589 void 4590 AccessBridgeJavaEntryPoints::clearAccessibleSelectionFromContext(jobject accessibleContext) { 4591 jthrowable exception; 4592 4593 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::clearAccessibleSelectionFromContext(%p):", accessibleContext); 4594 4595 // Clearing the Selection of the AccessibleSelection 4596 if (clearAccessibleSelectionFromContextMethod != (jmethodID) 0) { 4597 jniEnv->CallVoidMethod(accessBridgeObject, 4598 clearAccessibleSelectionFromContextMethod, 4599 accessibleContext); 4600 EXCEPTION_CHECK_VOID("Doing clearAccessibleSelection - call to CallVoidMethod()"); 4601 PrintDebugString("[INFO]: returned from CallObjectMethod()"); 4602 } else { 4603 PrintDebugString("[ERROR]: either env == 0 or clearAccessibleSelectionFromContextMethod == 0"); 4604 } 4605 } 4606 4607 jobject 4608 AccessBridgeJavaEntryPoints::getAccessibleSelectionFromContext(jobject accessibleContext, int i) { 4609 jobject returnedAccessibleContext; 4610 jobject globalRef; 4611 jthrowable exception; 4612 4613 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleSelectionFromContext(%p):", accessibleContext); 4614 4615 if (getAccessibleSelectionContextFromContextMethod != (jmethodID) 0) { 4616 returnedAccessibleContext = jniEnv->CallObjectMethod( 4617 accessBridgeObject, 4618 getAccessibleSelectionContextFromContextMethod, 4619 accessibleContext, i); 4620 EXCEPTION_CHECK("Getting AccessibleSelectionContext - call to CallObjectMethod()", (jobject) 0); 4621 globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext); 4622 EXCEPTION_CHECK("Getting AccessibleSelectionContext - call to NewGlobalRef()", (jobject) 0); 4623 jniEnv->DeleteLocalRef(returnedAccessibleContext); 4624 EXCEPTION_CHECK("Getting AccessibleSelectionContext - call to DeleteLocalRef()", (jobject) 0); 4625 PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p", 4626 returnedAccessibleContext, globalRef); 4627 return globalRef; 4628 } else { 4629 PrintDebugString("[ERROR]: either env == 0 or getAccessibleSelectionContextFromContextMethod == 0"); 4630 return (jobject) 0; 4631 } 4632 } 4633 4634 int 4635 AccessBridgeJavaEntryPoints::getAccessibleSelectionCountFromContext(jobject accessibleContext) { 4636 int count; 4637 jthrowable exception; 4638 4639 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleSelectionCountFromContext(%p):", accessibleContext); 4640 4641 // Get (& return) the # of items selected in the AccessibleSelection 4642 if (getAccessibleSelectionCountFromContextMethod != (jmethodID) 0) { 4643 count = jniEnv->CallIntMethod(accessBridgeObject, 4644 getAccessibleSelectionCountFromContextMethod, 4645 accessibleContext); 4646 EXCEPTION_CHECK("Getting AccessibleSelectionCount - call to CallIntMethod()", -1); 4647 PrintDebugString("[INFO]: returned from CallObjectMethod()"); 4648 return count; 4649 } else { 4650 PrintDebugString("[ERROR]: either env == 0 or getAccessibleSelectionCountFromContextMethod == 0"); 4651 return -1; 4652 } 4653 } 4654 4655 BOOL 4656 AccessBridgeJavaEntryPoints::isAccessibleChildSelectedFromContext(jobject accessibleContext, int i) { 4657 jboolean result; 4658 jthrowable exception; 4659 4660 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::isAccessibleChildSelectedFromContext(%p):", accessibleContext); 4661 4662 // Get (& return) the # of items selected in the AccessibleSelection 4663 if (isAccessibleChildSelectedFromContextMethod != (jmethodID) 0) { 4664 result = jniEnv->CallBooleanMethod(accessBridgeObject, 4665 isAccessibleChildSelectedFromContextMethod, 4666 accessibleContext, i); 4667 EXCEPTION_CHECK("Doing isAccessibleChildSelected - call to CallBooleanMethod()", FALSE); 4668 PrintDebugString("[INFO]: returned from CallObjectMethod()"); 4669 if (result != 0) { 4670 return TRUE; 4671 } 4672 } else { 4673 PrintDebugString("[ERROR]: either env == 0 or isAccessibleChildSelectedFromContextMethod == 0"); 4674 } 4675 return FALSE; 4676 } 4677 4678 4679 void 4680 AccessBridgeJavaEntryPoints::removeAccessibleSelectionFromContext(jobject accessibleContext, int i) { 4681 jthrowable exception; 4682 4683 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::removeAccessibleSelectionFromContext(%p):", accessibleContext); 4684 4685 // Remove the i-th child from the AccessibleSelection 4686 if (removeAccessibleSelectionFromContextMethod != (jmethodID) 0) { 4687 jniEnv->CallVoidMethod(accessBridgeObject, 4688 removeAccessibleSelectionFromContextMethod, 4689 accessibleContext, i); 4690 EXCEPTION_CHECK_VOID("Doing removeAccessibleSelection - call to CallVoidMethod()"); 4691 PrintDebugString("[INFO]: returned from CallObjectMethod()"); 4692 } else { 4693 PrintDebugString("[ERROR]: either env == 0 or removeAccessibleSelectionFromContextMethod == 0"); 4694 } 4695 } 4696 4697 void 4698 AccessBridgeJavaEntryPoints::selectAllAccessibleSelectionFromContext(jobject accessibleContext) { 4699 jthrowable exception; 4700 4701 PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::selectAllAccessibleSelectionFromContext(%p):", accessibleContext); 4702 4703 // Select all children (if possible) of the AccessibleSelection 4704 if (selectAllAccessibleSelectionFromContextMethod != (jmethodID) 0) { 4705 jniEnv->CallVoidMethod(accessBridgeObject, 4706 selectAllAccessibleSelectionFromContextMethod, 4707 accessibleContext); 4708 EXCEPTION_CHECK_VOID("Doing selectAllAccessibleSelection - call to CallVoidMethod()"); 4709 PrintDebugString("[INFO]: returned from CallObjectMethod()"); 4710 } else { 4711 PrintDebugString("[ERROR]: either env == 0 or selectAllAccessibleSelectionFromContextMethod == 0"); 4712 } 4713 } 4714 4715 4716 /********** Event Notification Registration routines ***************/ 4717 4718 BOOL 4719 AccessBridgeJavaEntryPoints::addJavaEventNotification(jlong type) { 4720 jthrowable exception; 4721 4722 PrintDebugString("[INFO]: in AccessBridgeJavaEntryPoints::addJavaEventNotification(%016I64X);", type); 4723 4724 // Let AccessBridge know we want to add an event type 4725 if (addJavaEventNotificationMethod != (jmethodID) 0) { 4726 jniEnv->CallVoidMethod(accessBridgeObject, 4727 addJavaEventNotificationMethod, type); 4728 EXCEPTION_CHECK("Doing addJavaEventNotification - call to CallVoidMethod()", FALSE); 4729 } else { 4730 PrintDebugString("[ERROR]: either env == 0 or addJavaEventNotificationMethod == 0"); 4731 return FALSE; 4732 } 4733 return TRUE; 4734 } 4735 4736 BOOL 4737 AccessBridgeJavaEntryPoints::removeJavaEventNotification(jlong type) { 4738 jthrowable exception; 4739 4740 PrintDebugString("[INFO]: in AccessBridgeJavaEntryPoints::removeJavaEventNotification(%016I64X):", type); 4741 4742 // Let AccessBridge know we want to remove an event type 4743 if (removeJavaEventNotificationMethod != (jmethodID) 0) { 4744 jniEnv->CallVoidMethod(accessBridgeObject, 4745 removeJavaEventNotificationMethod, type); 4746 EXCEPTION_CHECK("Doing removeJavaEventNotification - call to CallVoidMethod()", FALSE); 4747 } else { 4748 PrintDebugString("[ERROR]: either env == 0 or removeJavaEventNotificationMethod == 0"); 4749 return FALSE; 4750 } 4751 return TRUE; 4752 } 4753 4754 BOOL 4755 AccessBridgeJavaEntryPoints::addAccessibilityEventNotification(jlong type) { 4756 jthrowable exception; 4757 4758 PrintDebugString("[INFO]: in AccessBridgeJavaEntryPoints::addAccessibilityEventNotification(%016I64X);", type); 4759 4760 // Let AccessBridge know we want to add an event type 4761 if (addAccessibilityEventNotificationMethod != (jmethodID) 0) { 4762 PrintDebugString("[INFO]: addAccessibilityEventNotification: calling void method: accessBridgeObject = %p", accessBridgeObject); 4763 jniEnv->CallVoidMethod(accessBridgeObject, 4764 addAccessibilityEventNotificationMethod, type); 4765 EXCEPTION_CHECK("Doing addAccessibilityEvent - call to CallVoidMethod()", FALSE); 4766 } else { 4767 PrintDebugString("[ERROR]: either env == 0 or addAccessibilityEventNotificationMethod == 0"); 4768 return FALSE; 4769 } 4770 PrintDebugString("[INFO]: addAccessibilityEventNotification: just returning true"); 4771 return TRUE; 4772 } 4773 4774 BOOL 4775 AccessBridgeJavaEntryPoints::removeAccessibilityEventNotification(jlong type) { 4776 jthrowable exception; 4777 4778 PrintDebugString("[INFO]: in AccessBridgeJavaEntryPoints::removeAccessibilityEventNotification(%016I64X):", type); 4779 4780 // Let AccessBridge know we want to remove an event type 4781 if (removeAccessibilityEventNotificationMethod != (jmethodID) 0) { 4782 jniEnv->CallVoidMethod(accessBridgeObject, 4783 removeAccessibilityEventNotificationMethod, type); 4784 EXCEPTION_CHECK("Doing removeAccessibilityEvent - call to CallVoidMethod()", FALSE); 4785 } else { 4786 PrintDebugString("[ERROR]: either env == 0 or removeAccessibilityEventNotificationMethod == 0"); 4787 return FALSE; 4788 } 4789 return TRUE; 4790 }