1 /* 2 * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 * A DLL which is loaded by Java applications to handle communication 28 * between Java VMs purposes of Accessbility. 29 */ 30 31 #include "AccessBridgeDebug.h" 32 #include "JavaAccessBridge.h" 33 #include "com_sun_java_accessibility_AccessBridge.h" // programatically generated by JNI 34 #include "accessBridgeResource.h" 35 #include "accessBridgeCallbacks.h" 36 #include "AccessBridgeMessages.h" 37 38 39 #include <windows.h> 40 #include <stdio.h> 41 42 #include <jawt.h> 43 #include <jawt_md.h> 44 45 JavaAccessBridge *theJavaAccessBridge; 46 HWND theDialogWindow; 47 48 // re-entrance lock for receiving memory messages 49 CRITICAL_SECTION receiveMemoryIPCLock; 50 51 52 // unique broadcast msg. IDs gotten dymanically 53 extern UINT theFromJavaHelloMsgID; 54 extern UINT theFromWindowsHelloMsgID; 55 56 57 // --------------------------------------------------------------------------- 58 59 extern "C" { 60 /** 61 * DllMain - where Windows executables will load/unload us 62 * 63 */ 64 BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) { 65 66 switch (fdwReason) { 67 case DLL_PROCESS_ATTACH: 68 InitializeCriticalSection(&receiveMemoryIPCLock); 69 theJavaAccessBridge = new JavaAccessBridge(hinstDll); 70 break; 71 72 case DLL_PROCESS_DETACH: // A Windows executable unloaded us 73 if (theJavaAccessBridge != (JavaAccessBridge *) 0) { 74 delete theJavaAccessBridge; 75 DeleteCriticalSection(&receiveMemoryIPCLock); 76 } 77 break; 78 } 79 return TRUE; 80 } 81 82 /** 83 * Open a native window (and init the wrappers we'll be using) 84 * 85 */ 86 JNIEXPORT void JNICALL 87 Java_com_sun_java_accessibility_AccessBridge_runDLL(JNIEnv *env, jobject obj) { 88 PrintDebugString("\r\nJavaAccessBridge.DLL runDLL() called"); 89 theJavaAccessBridge->javaRun(env, obj); 90 } 91 92 #if 0 // SetDlgItemText has caused problems with JAWS 93 /** 94 * Append debug info to dialog 95 * 96 */ 97 void AppendToCallInfo(char *s) { 98 char buffer[4096]; 99 100 PrintDebugString(s); 101 102 GetDlgItemText(theDialogWindow, cCallInfo, buffer, sizeof(buffer)); 103 if (strlen(buffer) < (sizeof(buffer) - strlen(s))) { 104 strncat(buffer, s, sizeof(buffer)); 105 SetDlgItemText(theDialogWindow, cCallInfo, buffer); 106 } else { 107 SetDlgItemText(theDialogWindow, cCallInfo, s); 108 } 109 } 110 #endif 111 112 113 /** 114 * Our window proc 115 * 116 */ 117 BOOL APIENTRY AccessBridgeDialogProc (HWND hDlg, UINT message, UINT wParam, LONG lParam) { 118 int command; 119 COPYDATASTRUCT *sentToUs; 120 char *package; 121 //DEBUG_CODE(char buffer[256]); 122 123 switch (message) { 124 case WM_INITDIALOG: 125 //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Initializing")); 126 break; 127 128 case WM_COMMAND: 129 command = LOWORD (wParam); 130 break; 131 132 // call from Java with data for us to deliver 133 case WM_COPYDATA: 134 if (theDialogWindow == (HWND) wParam) { 135 //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Got WM_COPYDATA from ourselves")); 136 } else { 137 //DEBUG_CODE(sprintf(buffer, "Got WM_COPYDATA from HWND %p", wParam)); 138 //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, buffer)); 139 sentToUs = (COPYDATASTRUCT *) lParam; 140 package = (char *) sentToUs->lpData; 141 theJavaAccessBridge->processPackage(package, sentToUs->cbData); 142 } 143 break; 144 145 // call from Java with data for us retrieve from memory mapped file and deliver 146 case AB_MESSAGE_WAITING: 147 // wParam == sourceHwnd 148 // lParam == buffer size in shared memory 149 if (theDialogWindow == (HWND) wParam) { 150 //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Got AB_MESSAGE_WAITING from ourselves")); 151 } else { 152 //DEBUG_CODE(sprintf(buffer, "Got AB_MESSAGE_WAITING from HWND %p", wParam)); 153 //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, buffer)); 154 LRESULT returnVal = theJavaAccessBridge->receiveMemoryPackage((HWND) wParam, lParam); 155 } 156 break; 157 158 // a JavaAccessBridge DLL is going away 159 case AB_DLL_GOING_AWAY: 160 // wParam == sourceHwnd 161 //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Got AB_DLL_GOING_AWAY message")); 162 theJavaAccessBridge->WindowsATDestroyed((HWND) wParam); 163 break; 164 165 default: 166 // the Windows AT is saying "hi"! 167 // wParam == sourceHwnc; lParam unused 168 if (message == theFromWindowsHelloMsgID) { 169 // A new Windows AT just said "hi"; 170 // say "hi" back so it can mate up with us 171 // otherwise don't do anything (e.g. don't set up data structures yet) 172 theJavaAccessBridge->postHelloToWindowsDLLMsg((HWND) wParam); 173 } 174 } 175 return FALSE; 176 } 177 178 } 179 180 181 // ----------------------------- 182 183 184 /** 185 * Initialize the JavaAccessBridge 186 * 187 */ 188 JavaAccessBridge::JavaAccessBridge(HINSTANCE hInstance) { 189 windowsInstance = hInstance; 190 ATs = (AccessBridgeATInstance *) 0; 191 initBroadcastMessageIDs(); // get the unique to us broadcast msg. IDs 192 } 193 194 extern DWORD JavaBridgeThreadId; 195 196 /** 197 * Destroy the JavaAccessBridge 198 * 199 */ 200 JavaAccessBridge::~JavaAccessBridge() { 201 // inform all other AccessBridges that we're going away 202 203 PrintDebugString("\r\nin JavaAccessBridge::~JavaAccessBridge()"); 204 205 // Send a shutdown message for those applications like StarOffice that do 206 // send a shutdown message themselves. 207 javaShutdown(NULL, 0); 208 209 AccessBridgeATInstance *current = ATs; 210 while (current != (AccessBridgeATInstance *) 0) { 211 PrintDebugString(" telling %p we're going away", current->winAccessBridgeWindow); 212 SendMessage(current->winAccessBridgeWindow, 213 AB_DLL_GOING_AWAY, (WPARAM) dialogWindow, (LPARAM) 0); 214 current = current->nextATInstance; 215 } 216 217 PrintDebugString(" finished telling ATs about our demise"); 218 219 if(JavaBridgeThreadId) 220 { 221 PostThreadMessage(JavaBridgeThreadId,WM_USER+1,0,0); 222 Sleep(100); 223 } 224 225 delete ATs; 226 227 PrintDebugString(" finished deleting ATs"); 228 PrintDebugString("GOODBYE CRUEL WORLD..."); 229 } 230 231 232 void 233 JavaAccessBridge::javaRun(JNIEnv *env, jobject obj) { 234 MSG msg; 235 236 PrintDebugString("JavaAccessBridge::javaRun(%p, %p) called", env, obj); 237 238 if (env->GetJavaVM(&javaVM) != 0) { 239 return; // huh!?!?! 240 } 241 PrintDebugString(" -> javaVM = %p", javaVM); 242 243 if (javaVM->AttachCurrentThread((void **) &windowsThreadJNIEnv, NULL) != 0) { 244 return; // huh!?!?! 245 } 246 PrintDebugString(" -> windowsThreadJNIEnv = %p", windowsThreadJNIEnv); 247 248 javaThreadABObject = env->NewGlobalRef(obj); 249 windowsThreadABObject = windowsThreadJNIEnv->NewGlobalRef(obj); 250 251 // initialize the Java thread AccessBridge entry points 252 javaThreadEntryPoints = new AccessBridgeJavaEntryPoints(env, javaThreadABObject); 253 if (javaThreadEntryPoints->BuildJavaEntryPoints() == FALSE) { 254 return; // couldn't build our entry points; let's get out of here! 255 } 256 PrintDebugString(" all Java thread entry points successfully found."); 257 258 // initialize the Windows thread AccessBridge entry points 259 windowsThreadEntryPoints = new AccessBridgeJavaEntryPoints(windowsThreadJNIEnv, 260 windowsThreadABObject); 261 if (windowsThreadEntryPoints->BuildJavaEntryPoints() == FALSE) { 262 return; // couldn't build our entry points; let's get out of here! 263 } 264 PrintDebugString(" all Windows thread entry points successfully found."); 265 266 267 // open our window 268 if (initWindow() == TRUE) { 269 PrintDebugString(" Window created. HWND = %p", dialogWindow); 270 271 // post a broadcast msg.; let other AccessBridge DLLs know we exist 272 postHelloToWindowsDLLMsg(HWND_BROADCAST); 273 274 // do that message loop thing 275 while (GetMessage(&msg, NULL, 0, 0)) { 276 TranslateMessage(&msg); 277 DispatchMessage(&msg); 278 } 279 } else { 280 PrintDebugString(" FAILED TO CREATE WINDOW!!!"); 281 } 282 283 javaVM->DetachCurrentThread(); 284 } 285 286 /** 287 * Bring up our window; make a connection to the rest of the world 288 * 289 */ 290 BOOL 291 JavaAccessBridge::initWindow() { 292 theDialogWindow = CreateDialog(windowsInstance, 293 "ACCESSBRIDGESTATUSWINDOW", NULL, 294 (DLGPROC) AccessBridgeDialogProc); 295 296 // If window could not be created, return "failure". 297 if (!theDialogWindow) 298 return FALSE; 299 300 dialogWindow = theDialogWindow; 301 302 // Make the window visible, update its client area, & return "success". 303 // DEBUG_CODE(ShowWindow (theDialogWindow, SW_SHOWNORMAL)); 304 // DEBUG_CODE(UpdateWindow (theDialogWindow)); 305 306 return TRUE; 307 } 308 309 310 311 // ----------------------- 312 313 314 /** 315 * postHelloToWindowsDLLMsg 316 * - PostMessage(theFromJavaHelloMsgID) to let one or 317 * all WindowDLLs we're here and have a vmID 318 * 319 * destHwnd is either a single hwnd or HWND_BROADCAST 320 * (former if a reply, latter if we're just born) 321 * wParam is our HWND 322 * lParam is our vmID 323 * 324 */ 325 void 326 JavaAccessBridge::postHelloToWindowsDLLMsg(HWND destHwnd) { 327 PrintDebugString("\r\nin JavaAccessBridge::postHelloToWindowsDLLMsg"); 328 PrintDebugString(" calling PostMessage(%p, %X, %p, %p)", 329 destHwnd, theFromJavaHelloMsgID, dialogWindow, javaVM); 330 PostMessage(destHwnd, theFromJavaHelloMsgID, (WPARAM) dialogWindow, (LPARAM) dialogWindow); 331 } 332 333 334 // ----------------------- 335 336 /** 337 * sendPackage - uses SendMessage(WM_COPYDATA) to do IPC messaging 338 * with the Java AccessBridge DLL 339 * 340 */ 341 void 342 JavaAccessBridge::sendPackage(char *buffer, int bufsize, HWND destHwnd) { 343 COPYDATASTRUCT toCopy; 344 toCopy.dwData = 0; // 32-bits we could use for something... 345 toCopy.cbData = bufsize; 346 toCopy.lpData = buffer; 347 348 SendMessage(destHwnd, WM_COPYDATA, (WPARAM) dialogWindow, (LPARAM) &toCopy); 349 } 350 351 352 /** 353 * sendJavaEventPackage - walk through ATs, sending event messages to 'em 354 * 355 */ 356 void 357 JavaAccessBridge::sendJavaEventPackage(char *buffer, int bufsize, long type) { 358 359 PrintDebugString("JavaAccessBridge::sendJavaEventPackage(), type = %X", type); 360 361 if (ATs == (AccessBridgeATInstance *) 0) { 362 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 363 } 364 365 AccessBridgeATInstance *ati = ATs; 366 while (ati != (AccessBridgeATInstance *) 0) { 367 ati->sendJavaEventPackage(buffer, bufsize, type); 368 ati = ati->nextATInstance; 369 } 370 } 371 372 /** 373 * sendAccessibilityEventPackage - walk through ATs, sending event messages to 'em 374 * 375 */ 376 void 377 JavaAccessBridge::sendAccessibilityEventPackage(char *buffer, int bufsize, long type) { 378 379 PrintDebugString("JavaAccessBridge::sendAccessibilityEventPackage(), type = %X", type); 380 381 if (ATs == (AccessBridgeATInstance *) 0) { 382 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 383 } 384 385 AccessBridgeATInstance *ati = ATs; 386 while (ati != (AccessBridgeATInstance *) 0) { 387 ati->sendAccessibilityEventPackage(buffer, bufsize, type); 388 ati = ati->nextATInstance; 389 } 390 } 391 392 393 394 395 /** 396 * receiveMemoryPackage - uses Memory-Mapped files to do IPC messaging 397 * with the Java AccessBridge DLL, receiving the 398 * message from Java AccessBridge DLL by reading the 399 * contents of the shared memory mapped file that 400 * is used for Java-initiated messages 401 * 402 */ 403 BOOL 404 JavaAccessBridge::receiveMemoryPackage(HWND srcWindow, long bufsize) { 405 char *IPCview; 406 407 PrintDebugString("\r\nJavaAccessBridge::receiveMemoryPackage(%p, %d)", srcWindow, bufsize); 408 409 // look-up the appropriate IPCview based on the srcHWND of the Windows AccessBridge DLL 410 if (ATs == (AccessBridgeATInstance *) 0) { 411 PrintDebugString(" ERROR! - ATs == 0 (shouldn't happen in receiveMemoryPackage()!"); 412 return FALSE; 413 } 414 AccessBridgeATInstance *ati = ATs->findABATInstanceFromATHWND(srcWindow); 415 if (ati != (AccessBridgeATInstance *) 0) { 416 IPCview = (char *) ati->memoryMappedView; 417 418 // wait for the lock if someone else has it (re-entrancy) 419 EnterCriticalSection(&receiveMemoryIPCLock); 420 { 421 // set byte at end of buffer to indicate to caller that we have reached this point 422 IPCview[bufsize] = 1; 423 424 // process the package 425 processPackage(IPCview, bufsize); 426 } 427 // release re-entrance lock 428 LeaveCriticalSection(&receiveMemoryIPCLock); 429 430 return TRUE; 431 432 } else { 433 //DEBUG_CODE(AppendToCallInfo("ERROR receiving memory package: couldn't find srcWindow")); 434 PrintDebugString("ERROR receiving memory package: couldn't find srcWindow"); 435 return FALSE; 436 } 437 } 438 439 /** 440 * processPackage - processes the output of SendMessage(WM_COPYDATA) 441 * to do IPC messaging with the Windows AccessBridge DLL 442 * 443 */ 444 LRESULT 445 JavaAccessBridge::processPackage(char *buffer, int bufsize) { 446 PrintDebugString("\r\nProcessing package sent from Windows, bufsize = %d:", bufsize); 447 448 PackageType *type = (PackageType *) buffer; 449 LRESULT returnVal = 0; 450 PrintDebugString(" PackageType = %X:", *type); 451 jobject rAC; 452 453 switch (*type) { 454 455 456 case cMemoryMappedFileCreatedPackage: 457 // Windows is telling us it created a memory mapped file for us to use 458 // in repsonding to various information querying packages (see below) 459 PrintDebugString(" type == cMemoryMappedFileCreatedPackage"); 460 if (bufsize == (sizeof(PackageType) + sizeof(MemoryMappedFileCreatedPackage))) { 461 MemoryMappedFileCreatedPackage *pkg = 462 (MemoryMappedFileCreatedPackage *) (buffer + sizeof(PackageType)); 463 returnVal = MemoryMappedFileCreated((HWND)ABLongToHandle(pkg->bridgeWindow), pkg->filename); 464 } else { 465 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 466 bufsize, sizeof(PackageType) + sizeof(MemoryMappedFileCreatedPackage)); 467 } 468 break; 469 470 // ------------ information querying packages ------------------ 471 472 case cReleaseJavaObjectPackage: 473 PrintDebugString(" type == cReleaseJavaObjectPackage"); 474 if (bufsize == (sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage))) { 475 ReleaseJavaObjectPackage *pkg = 476 (ReleaseJavaObjectPackage *) (buffer + sizeof(PackageType)); 477 releaseJavaObject((jobject)pkg->object); 478 } else { 479 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 480 bufsize, sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage)); 481 } 482 break; 483 484 case cGetAccessBridgeVersionPackage: 485 PrintDebugString(" type == cGetAccessBridgeVersionPackage"); 486 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage))) { 487 GetAccessBridgeVersionPackage *pkg = 488 (GetAccessBridgeVersionPackage *) (buffer + sizeof(PackageType)); 489 windowsThreadEntryPoints->getVersionInfo(&(pkg->rVersionInfo)); 490 } else { 491 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 492 bufsize, sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage)); 493 } 494 break; 495 496 case cIsJavaWindowPackage: 497 PrintDebugString(" type == cIsJavaWindowPackage"); 498 if (bufsize == (sizeof(PackageType) + sizeof(IsJavaWindowPackage))) { 499 IsJavaWindowPackage *pkg = 500 (IsJavaWindowPackage *) (buffer + sizeof(PackageType)); 501 pkg->rResult = 502 windowsThreadEntryPoints->isJavaWindow(pkg->window); 503 PrintDebugString(" -> returning result = %d", pkg->rResult); 504 } else { 505 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 506 bufsize, sizeof(PackageType) + sizeof(IsJavaWindowPackage)); 507 } 508 break; 509 510 case cIsSameObjectPackage: 511 PrintDebugString(" type == cIsSameObjectPackage"); 512 if (bufsize == (sizeof(PackageType) + sizeof(IsSameObjectPackage))) { 513 IsSameObjectPackage *pkg = 514 (IsSameObjectPackage *) (buffer + sizeof(PackageType)); 515 pkg->rResult = 516 windowsThreadEntryPoints->isSameObject((jobject)pkg->obj1, (jobject)pkg->obj2); 517 PrintDebugString(" -> returning result = %d", pkg->rResult); 518 } else { 519 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 520 bufsize, sizeof(PackageType) + sizeof(IsSameObjectPackage)); 521 } 522 break; 523 524 525 case cGetAccessibleContextFromHWNDPackage: 526 PrintDebugString(" type == cGetAccessibleContextFromHWNDPackage"); 527 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage))) { 528 GetAccessibleContextFromHWNDPackage *pkg = 529 (GetAccessibleContextFromHWNDPackage *) (buffer + sizeof(PackageType)); 530 rAC = windowsThreadEntryPoints->getAccessibleContextFromHWND(pkg->window); 531 pkg->rAccessibleContext = (JOBJECT64)rAC; 532 pkg->rVMID = HandleToLong(dialogWindow); 533 PrintDebugString(" -> returning AC = %p, vmID = %X", rAC, pkg->rVMID); 534 } else { 535 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 536 bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage)); 537 } 538 break; 539 540 541 case cGetHWNDFromAccessibleContextPackage: 542 PrintDebugString(" type == cGetHWNDFromAccessibleContextPackage"); 543 if (bufsize == (sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage))) { 544 GetHWNDFromAccessibleContextPackage *pkg = 545 (GetHWNDFromAccessibleContextPackage *) (buffer + sizeof(PackageType)); 546 pkg->rHWND = 547 ABHandleToLong( windowsThreadEntryPoints->getHWNDFromAccessibleContext((jobject)pkg->accessibleContext) ); 548 PrintDebugString(" -> returning HWND = %p", pkg->rHWND); 549 } else { 550 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 551 bufsize, sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage)); 552 } 553 break; 554 555 556 /* ===== utility methods ===== */ 557 558 case cSetTextContentsPackage: 559 PrintDebugString(" type == cSetTextContentsPackage"); 560 if (bufsize == (sizeof(PackageType) + sizeof(SetTextContentsPackage))) { 561 SetTextContentsPackage *pkg = 562 (SetTextContentsPackage *) (buffer + sizeof(PackageType)); 563 pkg->rResult = 564 windowsThreadEntryPoints->setTextContents((jobject)pkg->accessibleContext, pkg->text); 565 PrintDebugString(" -> returning result = %d", pkg->rResult); 566 } else { 567 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 568 bufsize, sizeof(PackageType) + sizeof(SetTextContentsPackage)); 569 } 570 break; 571 572 case cGetParentWithRolePackage: 573 if (bufsize == (sizeof(PackageType) + sizeof(GetParentWithRolePackage))) { 574 GetParentWithRolePackage *pkg = 575 (GetParentWithRolePackage *) (buffer + sizeof(PackageType)); 576 rAC = windowsThreadEntryPoints->getParentWithRole((jobject)pkg->accessibleContext, pkg->role); 577 pkg->rAccessibleContext = (JOBJECT64)rAC; 578 PrintDebugString(" type == cGetParentWithRolePackage"); 579 PrintDebugString(" pkg->vmID: %X", pkg->vmID); 580 PrintDebugString(" pkg->accessibleContext: %p", (jobject)pkg->accessibleContext); 581 PrintDebugString(" pkg->role: %ls", pkg->role); 582 PrintDebugString(" -> returning rAccessibleContext = %p", rAC); 583 } else { 584 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 585 bufsize, sizeof(PackageType) + sizeof(GetParentWithRolePackage)); 586 } 587 break; 588 589 case cGetTopLevelObjectPackage: 590 PrintDebugString(" type == cGetTopLevelObjectPackage"); 591 if (bufsize == (sizeof(PackageType) + sizeof(GetTopLevelObjectPackage))) { 592 GetTopLevelObjectPackage *pkg = 593 (GetTopLevelObjectPackage *) (buffer + sizeof(PackageType)); 594 rAC = windowsThreadEntryPoints->getTopLevelObject((jobject)pkg->accessibleContext); 595 pkg->rAccessibleContext = (JOBJECT64)rAC; 596 PrintDebugString(" -> returning rAccessibleContext = %p", rAC); 597 } else { 598 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 599 bufsize, sizeof(PackageType) + sizeof(GetTopLevelObjectPackage)); 600 } 601 break; 602 603 case cGetParentWithRoleElseRootPackage: 604 PrintDebugString(" type == cGetParentWithRoleElseRootPackage"); 605 if (bufsize == (sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage))) { 606 GetParentWithRoleElseRootPackage *pkg = 607 (GetParentWithRoleElseRootPackage *) (buffer + sizeof(PackageType)); 608 rAC = windowsThreadEntryPoints->getParentWithRoleElseRoot((jobject)pkg->accessibleContext, pkg->role); 609 pkg->rAccessibleContext = (JOBJECT64)rAC; 610 PrintDebugString(" -> returning rAccessibleContext = %p", rAC); 611 } else { 612 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 613 bufsize, sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage)); 614 } 615 break; 616 617 case cGetObjectDepthPackage: 618 PrintDebugString(" type == cGetObjectDepthPackage"); 619 if (bufsize == (sizeof(PackageType) + sizeof(GetObjectDepthPackage))) { 620 GetObjectDepthPackage *pkg = 621 (GetObjectDepthPackage *) (buffer + sizeof(PackageType)); 622 pkg->rResult = 623 windowsThreadEntryPoints->getObjectDepth((jobject)pkg->accessibleContext); 624 PrintDebugString(" -> returning rResult = %d", pkg->rResult); 625 } else { 626 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 627 bufsize, sizeof(PackageType) + sizeof(GetObjectDepthPackage)); 628 } 629 break; 630 631 case cGetActiveDescendentPackage: 632 PrintDebugString(" type == cGetActiveDescendentPackage"); 633 if (bufsize == (sizeof(PackageType) + sizeof(GetActiveDescendentPackage))) { 634 GetActiveDescendentPackage *pkg = 635 (GetActiveDescendentPackage *) (buffer + sizeof(PackageType)); 636 rAC = windowsThreadEntryPoints->getActiveDescendent((jobject)pkg->accessibleContext); 637 pkg->rAccessibleContext = (JOBJECT64)rAC; 638 PrintDebugString(" -> returning rAccessibleContext = %p", rAC); 639 } else { 640 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 641 bufsize, sizeof(PackageType) + sizeof(GetActiveDescendentPackage)); 642 } 643 break; 644 645 case cGetAccessibleContextAtPackage: 646 PrintDebugString(" type == cGetAccessibleContextAtPackage"); 647 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage))) { 648 GetAccessibleContextAtPackage *pkg = 649 (GetAccessibleContextAtPackage *) (buffer + sizeof(PackageType)); 650 pkg->rAccessibleContext = (JOBJECT64) 651 windowsThreadEntryPoints->getAccessibleContextAt(pkg->x, pkg->y, 652 (jobject)pkg->AccessibleContext); 653 } else { 654 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 655 bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage)); 656 } 657 break; 658 659 case cGetAccessibleContextWithFocusPackage: 660 PrintDebugString(" type == cGetAccessibleContextWithFocusPackage"); 661 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage))) { 662 GetAccessibleContextWithFocusPackage *pkg = 663 (GetAccessibleContextWithFocusPackage *) (buffer + sizeof(PackageType)); 664 pkg->rAccessibleContext = (JOBJECT64) 665 windowsThreadEntryPoints->getAccessibleContextWithFocus(); 666 pkg->rVMID = HandleToLong(dialogWindow); 667 } else { 668 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 669 bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage)); 670 } 671 break; 672 673 case cGetAccessibleContextInfoPackage: 674 PrintDebugString(" type == cGetAccessibleContextInfoPackage"); 675 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage))) { 676 GetAccessibleContextInfoPackage *pkg = 677 (GetAccessibleContextInfoPackage *) (buffer + sizeof(PackageType)); 678 windowsThreadEntryPoints->getAccessibleContextInfo( 679 (jobject)pkg->AccessibleContext, &(pkg->rAccessibleContextInfo)); 680 } else { 681 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 682 bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage)); 683 } 684 break; 685 686 case cGetAccessibleChildFromContextPackage: 687 PrintDebugString(" type == cGetAccessibleChildFromContextPackage"); 688 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage))) { 689 GetAccessibleChildFromContextPackage *pkg = 690 (GetAccessibleChildFromContextPackage *) (buffer + sizeof(PackageType)); 691 pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleChildFromContext( 692 (jobject)pkg->AccessibleContext, pkg->childIndex); 693 } else { 694 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 695 bufsize, sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage)); 696 } 697 break; 698 699 case cGetAccessibleParentFromContextPackage: 700 PrintDebugString(" type == cGetAccessibleParentFromContextPackage"); 701 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage))) { 702 GetAccessibleParentFromContextPackage *pkg = 703 (GetAccessibleParentFromContextPackage *) (buffer + sizeof(PackageType)); 704 pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleParentFromContext( 705 (jobject)pkg->AccessibleContext); 706 } else { 707 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 708 bufsize, sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage)); 709 } 710 break; 711 712 // ------------ begin AccessibleTable packages ------------------ 713 714 case cGetAccessibleTableInfoPackage: 715 PrintDebugString(" ##### type == cGetAccessibleTableInfoPackage"); 716 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage))) { 717 GetAccessibleTableInfoPackage *pkg = 718 (GetAccessibleTableInfoPackage *) (buffer + sizeof(PackageType)); 719 windowsThreadEntryPoints->getAccessibleTableInfo((jobject)pkg->accessibleContext, 720 &(pkg->rTableInfo)); 721 PrintDebugString(" ##### processing succeeded"); 722 } else { 723 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 724 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage)); 725 } 726 break; 727 728 case cGetAccessibleTableCellInfoPackage: 729 PrintDebugString(" ##### type == cGetAccessibleTableCellInfoPackage"); 730 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage))) { 731 GetAccessibleTableCellInfoPackage *pkg = 732 (GetAccessibleTableCellInfoPackage *) (buffer + sizeof(PackageType)); 733 windowsThreadEntryPoints->getAccessibleTableCellInfo((jobject)pkg->accessibleTable, pkg->row, 734 pkg->column, &(pkg->rTableCellInfo)); 735 PrintDebugString(" ##### processing succeeded"); 736 } else { 737 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 738 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage)); 739 } 740 break; 741 742 case cGetAccessibleTableRowHeaderPackage: 743 PrintDebugString(" ##### type == cGetAccessibleTableRowHeaderPackage"); 744 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage))) { 745 GetAccessibleTableRowHeaderPackage *pkg = 746 (GetAccessibleTableRowHeaderPackage *) (buffer + sizeof(PackageType)); 747 windowsThreadEntryPoints->getAccessibleTableRowHeader((jobject)pkg->accessibleContext, 748 &(pkg->rTableInfo)); 749 PrintDebugString(" ##### processing succeeded"); 750 } else { 751 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 752 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage)); 753 } 754 break; 755 756 case cGetAccessibleTableColumnHeaderPackage: 757 PrintDebugString(" ##### type == cGetAccessibleTableColumnHeaderPackage"); 758 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage))) { 759 GetAccessibleTableColumnHeaderPackage *pkg = 760 (GetAccessibleTableColumnHeaderPackage *) (buffer + sizeof(PackageType)); 761 windowsThreadEntryPoints->getAccessibleTableColumnHeader((jobject)pkg->accessibleContext, 762 &(pkg->rTableInfo)); 763 PrintDebugString(" ##### processing succeeded"); 764 } else { 765 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 766 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage)); 767 } 768 break; 769 770 771 case cGetAccessibleTableRowDescriptionPackage: 772 PrintDebugString(" ##### type == cGetAccessibleTableRowDescriptionPackage"); 773 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage))) { 774 GetAccessibleTableRowDescriptionPackage *pkg = 775 (GetAccessibleTableRowDescriptionPackage *) (buffer + sizeof(PackageType)); 776 pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleTableRowDescription( 777 (jobject)pkg->accessibleContext, pkg->row); 778 PrintDebugString(" ##### processing succeeded"); 779 } else { 780 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 781 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage)); 782 } 783 break; 784 785 case cGetAccessibleTableColumnDescriptionPackage: 786 PrintDebugString(" ##### type == cGetAccessibleTableColumnDescriptionPackage"); 787 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage))) { 788 GetAccessibleTableColumnDescriptionPackage *pkg = 789 (GetAccessibleTableColumnDescriptionPackage *) (buffer + sizeof(PackageType)); 790 pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleTableColumnDescription( 791 (jobject)pkg->accessibleContext, pkg->column); 792 PrintDebugString(" ##### processing succeeded"); 793 } else { 794 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 795 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage)); 796 } 797 break; 798 799 case cGetAccessibleTableColumnSelectionCountPackage: 800 PrintDebugString(" ##### type == cGetAccessibleTableColumnSelectionCountPackage"); 801 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage))) { 802 GetAccessibleTableColumnSelectionCountPackage *pkg = 803 (GetAccessibleTableColumnSelectionCountPackage *) (buffer + sizeof(PackageType)); 804 pkg->rCount = windowsThreadEntryPoints->getAccessibleTableColumnSelectionCount( 805 (jobject)pkg->accessibleTable); 806 PrintDebugString(" ##### processing succeeded"); 807 } else { 808 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 809 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage)); 810 } 811 break; 812 813 case cGetAccessibleTableRowSelectionCountPackage: 814 PrintDebugString(" ##### type == cGetAccessibleTableRowSelectionCountPackage"); 815 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage))) { 816 GetAccessibleTableRowSelectionCountPackage *pkg = 817 (GetAccessibleTableRowSelectionCountPackage *) (buffer + sizeof(PackageType)); 818 819 pkg->rCount = windowsThreadEntryPoints->getAccessibleTableRowSelectionCount( 820 (jobject)pkg->accessibleTable); 821 822 PrintDebugString(" ##### processing succeeded"); 823 } else { 824 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 825 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage)); 826 } 827 break; 828 829 case cIsAccessibleTableRowSelectedPackage: 830 PrintDebugString(" ##### type == cIsAccessibleTableRowSelectedPackage"); 831 if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage))) { 832 IsAccessibleTableRowSelectedPackage *pkg = 833 (IsAccessibleTableRowSelectedPackage *) (buffer + sizeof(PackageType)); 834 pkg->rResult = windowsThreadEntryPoints->isAccessibleTableRowSelected( 835 (jobject)pkg->accessibleTable, pkg->row); 836 PrintDebugString(" ##### processing succeeded"); 837 } else { 838 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 839 bufsize, sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage)); 840 } 841 break; 842 843 case cIsAccessibleTableColumnSelectedPackage: 844 PrintDebugString(" ##### type == cIsAccessibleTableColumnSelectedPackage"); 845 if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage))) { 846 IsAccessibleTableColumnSelectedPackage *pkg = 847 (IsAccessibleTableColumnSelectedPackage *) (buffer + sizeof(PackageType)); 848 pkg->rResult = windowsThreadEntryPoints->isAccessibleTableColumnSelected( 849 (jobject)pkg->accessibleTable, pkg->column); 850 PrintDebugString(" ##### processing succeeded"); 851 } else { 852 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 853 bufsize, sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage)); 854 } 855 break; 856 857 case cGetAccessibleTableColumnSelectionsPackage: 858 PrintDebugString(" ##### type == cGetAccessibleTableColumnSelectionsPackage"); 859 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage))) { 860 GetAccessibleTableColumnSelectionsPackage *pkg = 861 (GetAccessibleTableColumnSelectionsPackage *) (buffer + sizeof(PackageType)); 862 PrintDebugString(" ##### cGetAccessibleTableColumnSelectionsPackage count=%d", pkg->count); 863 windowsThreadEntryPoints->getAccessibleTableColumnSelections( 864 (jobject)pkg->accessibleTable, pkg->count, pkg->rSelections); 865 866 for (int i = 0; i < pkg->count; i++) { 867 PrintDebugString(" ##### cGetAccessibleTableColumnSelectionsPackage(%d)=%d", i, pkg->rSelections[i]); 868 } 869 870 PrintDebugString(" ##### processing succeeded"); 871 } else { 872 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 873 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage)); 874 } 875 break; 876 877 878 case cGetAccessibleTableRowSelectionsPackage: 879 PrintDebugString(" ##### type == cGetAccessibleTableRowSelectionsPackage"); 880 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage))) { 881 GetAccessibleTableRowSelectionsPackage *pkg = 882 (GetAccessibleTableRowSelectionsPackage *) (buffer + sizeof(PackageType)); 883 windowsThreadEntryPoints->getAccessibleTableRowSelections( 884 (jobject)pkg->accessibleTable, pkg->count, pkg->rSelections); 885 PrintDebugString(" ##### processing succeeded"); 886 } else { 887 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 888 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage)); 889 } 890 break; 891 892 case cGetAccessibleTableRowPackage: 893 PrintDebugString(" ##### type == cGetAccessibleTableRowPackage"); 894 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage))) { 895 GetAccessibleTableRowPackage *pkg = 896 (GetAccessibleTableRowPackage *) (buffer + sizeof(PackageType)); 897 pkg->rRow = windowsThreadEntryPoints->getAccessibleTableRow( 898 (jobject)pkg->accessibleTable, pkg->index); 899 PrintDebugString(" ##### processing succeeded"); 900 } else { 901 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 902 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage)); 903 } 904 break; 905 906 case cGetAccessibleTableColumnPackage: 907 PrintDebugString(" ##### type == cGetAccessibleTableColumnPackage"); 908 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage))) { 909 GetAccessibleTableColumnPackage *pkg = 910 (GetAccessibleTableColumnPackage *) (buffer + sizeof(PackageType)); 911 pkg->rColumn = windowsThreadEntryPoints->getAccessibleTableColumn( 912 (jobject)pkg->accessibleTable, pkg->index); 913 PrintDebugString(" ##### processing succeeded"); 914 } else { 915 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 916 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage)); 917 } 918 break; 919 920 case cGetAccessibleTableIndexPackage: 921 PrintDebugString(" ##### type == cGetAccessibleTableIndexPackage"); 922 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage))) { 923 GetAccessibleTableIndexPackage *pkg = 924 (GetAccessibleTableIndexPackage *) (buffer + sizeof(PackageType)); 925 pkg->rIndex = windowsThreadEntryPoints->getAccessibleTableIndex( 926 (jobject)pkg->accessibleTable, pkg->row, pkg->column); 927 PrintDebugString(" ##### processing succeeded"); 928 } else { 929 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 930 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage)); 931 } 932 break; 933 934 // ------------ end AccessibleTable packages ------------------ 935 936 937 // ------------ begin AccessibleRelationSet packages ------------------ 938 939 case cGetAccessibleRelationSetPackage: 940 PrintDebugString(" ##### type == cGetAccessibleRelationSetPackage"); 941 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage))) { 942 GetAccessibleRelationSetPackage *pkg = 943 (GetAccessibleRelationSetPackage *) (buffer + sizeof(PackageType)); 944 windowsThreadEntryPoints->getAccessibleRelationSet( 945 (jobject)pkg->accessibleContext, &(pkg->rAccessibleRelationSetInfo)); 946 PrintDebugString(" ##### processing succeeded"); 947 } else { 948 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 949 bufsize, sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage)); 950 } 951 break; 952 953 // ------------ end AccessibleRelationSet packages ------------------ 954 955 // ------------ begin AccessibleHypertext packages ------------------ 956 957 case cGetAccessibleHypertextPackage: 958 PrintDebugString(" ##### type == cGetAccessibleHypertextPackage"); 959 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage))) { 960 GetAccessibleHypertextPackage *pkg = 961 (GetAccessibleHypertextPackage *) (buffer + sizeof(PackageType)); 962 windowsThreadEntryPoints->getAccessibleHypertext( 963 (jobject)pkg->accessibleContext, &(pkg->rAccessibleHypertextInfo)); 964 PrintDebugString(" ##### processing succeeded"); 965 } else { 966 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 967 bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage)); 968 } 969 break; 970 971 case cActivateAccessibleHyperlinkPackage: 972 PrintDebugString(" ##### type == cActivateAccessibleHyperlinkPackage"); 973 if (bufsize == (sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage))) { 974 ActivateAccessibleHyperlinkPackage *pkg = 975 (ActivateAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType)); 976 pkg->rResult = windowsThreadEntryPoints->activateAccessibleHyperlink( 977 (jobject)pkg->accessibleContext, (jobject)pkg->accessibleHyperlink); 978 PrintDebugString(" ##### processing succeeded"); 979 } else { 980 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 981 bufsize, sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage)); 982 } 983 break; 984 985 case cGetAccessibleHyperlinkCountPackage: 986 PrintDebugString(" ##### type == cGetAccessibleHyperlinkCountPackage"); 987 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage))) { 988 GetAccessibleHyperlinkCountPackage *pkg = 989 (GetAccessibleHyperlinkCountPackage *) (buffer + sizeof(PackageType)); 990 pkg->rLinkCount = windowsThreadEntryPoints->getAccessibleHyperlinkCount( 991 (jobject)pkg->accessibleContext); 992 PrintDebugString(" ##### processing succeeded: pkg->rLinkCount = %d", pkg->rLinkCount); 993 } else { 994 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 995 bufsize, sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage)); 996 } 997 break; 998 999 case cGetAccessibleHypertextExtPackage: 1000 PrintDebugString(" ##### type == cGetAccessibleHypertextExtPackage"); 1001 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage))) { 1002 GetAccessibleHypertextExtPackage *pkg = 1003 (GetAccessibleHypertextExtPackage *) (buffer + sizeof(PackageType)); 1004 pkg->rSuccess = windowsThreadEntryPoints->getAccessibleHypertextExt( 1005 (jobject)pkg->accessibleContext, pkg->startIndex, &(pkg->rAccessibleHypertextInfo)); 1006 PrintDebugString(" ##### processing succeeded"); 1007 } else { 1008 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1009 bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage)); 1010 } 1011 break; 1012 1013 case cGetAccessibleHypertextLinkIndexPackage: 1014 PrintDebugString(" ##### type == cGetAccessibleHypertextLinkIndexPackage"); 1015 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage))) { 1016 GetAccessibleHypertextLinkIndexPackage *pkg = 1017 (GetAccessibleHypertextLinkIndexPackage *) (buffer + sizeof(PackageType)); 1018 pkg->rLinkIndex = windowsThreadEntryPoints->getAccessibleHypertextLinkIndex( 1019 (jobject)pkg->hypertext, pkg->charIndex); 1020 PrintDebugString(" ##### processing succeeded"); 1021 } else { 1022 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1023 bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage)); 1024 } 1025 break; 1026 1027 case cGetAccessibleHyperlinkPackage: 1028 PrintDebugString(" ##### type == cGetAccessibleHyperlinkPackage"); 1029 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage))) { 1030 GetAccessibleHyperlinkPackage *pkg = 1031 (GetAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType)); 1032 windowsThreadEntryPoints->getAccessibleHyperlink((jobject)pkg->hypertext, pkg->linkIndex, 1033 &(pkg->rAccessibleHyperlinkInfo)); 1034 PrintDebugString(" ##### processing succeeded"); 1035 } else { 1036 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1037 bufsize, sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage)); 1038 } 1039 break; 1040 1041 // ------------ end AccessibleHypertext packages 1042 1043 // ------------ begin Accessible KeyBindings, Icons and Actions 1044 1045 case cGetAccessibleKeyBindingsPackage: 1046 PrintDebugString(" ##### type == cGetAccessibleKeyBindingsPackage"); 1047 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage))) { 1048 GetAccessibleKeyBindingsPackage *pkg = 1049 (GetAccessibleKeyBindingsPackage *) (buffer + sizeof(PackageType)); 1050 windowsThreadEntryPoints->getAccessibleKeyBindings ( 1051 (jobject)pkg->accessibleContext, &(pkg->rAccessibleKeyBindings)); 1052 PrintDebugString(" ##### processing succeeded"); 1053 } else { 1054 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1055 bufsize, sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage)); 1056 } 1057 break; 1058 1059 case cGetAccessibleIconsPackage: 1060 PrintDebugString(" ##### type == cGetAccessibleIconsPackage"); 1061 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleIconsPackage))) { 1062 GetAccessibleIconsPackage *pkg = 1063 (GetAccessibleIconsPackage *) (buffer + sizeof(PackageType)); 1064 windowsThreadEntryPoints->getAccessibleIcons ( 1065 (jobject)pkg->accessibleContext, &(pkg->rAccessibleIcons)); 1066 PrintDebugString(" ##### processing succeeded"); 1067 } else { 1068 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1069 bufsize, sizeof(PackageType) + sizeof(GetAccessibleIconsPackage)); 1070 } 1071 break; 1072 1073 1074 case cGetAccessibleActionsPackage: 1075 PrintDebugString(" ##### type == cGetAccessibleActionsPackage"); 1076 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleActionsPackage))) { 1077 GetAccessibleActionsPackage *pkg = 1078 (GetAccessibleActionsPackage *) (buffer + sizeof(PackageType)); 1079 windowsThreadEntryPoints->getAccessibleActions ( 1080 (jobject)pkg->accessibleContext, &(pkg->rAccessibleActions)); 1081 PrintDebugString(" ##### processing succeeded"); 1082 } else { 1083 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1084 bufsize, sizeof(PackageType) + sizeof(GetAccessibleActionsPackage)); 1085 } 1086 break; 1087 1088 case cDoAccessibleActionsPackage: 1089 PrintDebugString(" ##### type == cDoAccessibleActionsPackage"); 1090 if (bufsize == (sizeof(PackageType) + sizeof(DoAccessibleActionsPackage))) { 1091 DoAccessibleActionsPackage *pkg = 1092 (DoAccessibleActionsPackage *) (buffer + sizeof(PackageType)); 1093 pkg->rResult = 1094 windowsThreadEntryPoints->doAccessibleActions((jobject)pkg->accessibleContext, &(pkg->actionsToDo), 1095 &(pkg->failure)); 1096 PrintDebugString(" ##### processing succeeded"); 1097 } else { 1098 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1099 bufsize, sizeof(PackageType) + sizeof(DoAccessibleActionsPackage)); 1100 } 1101 break; 1102 1103 // ------------ begin addtional methods for Teton 1104 1105 case cGetVirtualAccessibleNamePackage: 1106 PrintDebugString(" ##### type == GetVirtualAccessibleNamePackage"); 1107 if (bufsize == (sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage))) { 1108 GetVirtualAccessibleNamePackage *pkg = 1109 (GetVirtualAccessibleNamePackage *) (buffer + sizeof(PackageType)); 1110 windowsThreadEntryPoints->getVirtualAccessibleName ((const jobject)pkg->accessibleContext, 1111 pkg->rName, 1112 pkg->len); 1113 PrintDebugString(" ##### processing succeeded"); 1114 } else { 1115 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1116 bufsize, sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage)); 1117 } 1118 break; 1119 1120 case cRequestFocusPackage: 1121 PrintDebugString(" ##### type == RequestFocusPackage"); 1122 if (bufsize == (sizeof(PackageType) + sizeof(RequestFocusPackage))) { 1123 RequestFocusPackage *pkg = 1124 (RequestFocusPackage *) (buffer + sizeof(PackageType)); 1125 windowsThreadEntryPoints->requestFocus ( 1126 (jobject)pkg->accessibleContext); 1127 PrintDebugString(" ##### processing succeeded"); 1128 } else { 1129 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1130 bufsize, sizeof(PackageType) + sizeof(RequestFocusPackage)); 1131 } 1132 break; 1133 1134 case cSelectTextRangePackage: 1135 PrintDebugString(" ##### type == SelectTextRangePackage"); 1136 if (bufsize == (sizeof(PackageType) + sizeof(SelectTextRangePackage))) { 1137 SelectTextRangePackage *pkg = 1138 (SelectTextRangePackage *) (buffer + sizeof(PackageType)); 1139 windowsThreadEntryPoints->selectTextRange ( 1140 (jobject)pkg->accessibleContext, pkg->startIndex, pkg->endIndex); 1141 PrintDebugString(" ##### processing succeeded"); 1142 } else { 1143 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1144 bufsize, sizeof(PackageType) + sizeof(SelectTextRangePackage)); 1145 } 1146 break; 1147 1148 case cGetTextAttributesInRangePackage: 1149 PrintDebugString(" ##### type == GetTextAttributesInRangePackage"); 1150 if (bufsize == (sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage))) { 1151 GetTextAttributesInRangePackage *pkg = 1152 (GetTextAttributesInRangePackage *) (buffer + sizeof(PackageType)); 1153 windowsThreadEntryPoints->getTextAttributesInRange ( 1154 (jobject)pkg->accessibleContext, pkg->startIndex, pkg->endIndex, 1155 (AccessibleTextAttributesInfo *)&(pkg->attributes), 1156 &(pkg->rLength)); 1157 PrintDebugString(" ##### processing succeeded"); 1158 } else { 1159 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1160 bufsize, sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage)); 1161 } 1162 break; 1163 1164 1165 case cGetVisibleChildrenCountPackage: 1166 PrintDebugString(" ##### type == GetVisibleChildrenCountPackage"); 1167 if (bufsize == (sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage))) { 1168 GetVisibleChildrenCountPackage *pkg = 1169 (GetVisibleChildrenCountPackage *) (buffer + sizeof(PackageType)); 1170 pkg->rChildrenCount = windowsThreadEntryPoints->getVisibleChildrenCount ((jobject)pkg->accessibleContext); 1171 1172 PrintDebugString(" ##### processing succeeded"); 1173 } else { 1174 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1175 bufsize, sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage)); 1176 } 1177 break; 1178 1179 case cGetVisibleChildrenPackage: 1180 PrintDebugString(" ##### type == GetVisibleChildrenPackage"); 1181 if (bufsize == (sizeof(PackageType) + sizeof(GetVisibleChildrenPackage))) { 1182 GetVisibleChildrenPackage *pkg = 1183 (GetVisibleChildrenPackage *) (buffer + sizeof(PackageType)); 1184 pkg->rSuccess = windowsThreadEntryPoints->getVisibleChildren ((jobject)pkg->accessibleContext, 1185 pkg->startIndex, 1186 &(pkg->rVisibleChildrenInfo)); 1187 1188 PrintDebugString(" ##### processing succeeded"); 1189 } else { 1190 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1191 bufsize, sizeof(PackageType) + sizeof(GetVisibleChildrenPackage)); 1192 } 1193 break; 1194 1195 case cSetCaretPositionPackage: 1196 PrintDebugString(" ##### type == SetCaretPositionPackage"); 1197 if (bufsize == (sizeof(PackageType) + sizeof(SetCaretPositionPackage))) { 1198 SetCaretPositionPackage *pkg = 1199 (SetCaretPositionPackage *) (buffer + sizeof(PackageType)); 1200 windowsThreadEntryPoints->setCaretPosition ( 1201 (jobject)pkg->accessibleContext, pkg->position); 1202 PrintDebugString(" ##### processing succeeded"); 1203 } else { 1204 PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", 1205 bufsize, sizeof(PackageType) + sizeof(SetCaretPositionPackage)); 1206 } 1207 break; 1208 1209 // ------------ end additional methods for Teton 1210 1211 // ------------ end Accessible KeyBindings, Icons and Actions 1212 1213 // ------------ Accessible Text packages ------------------ 1214 1215 case cGetAccessibleTextInfoPackage: 1216 PrintDebugString(" type == cGetAccessibleTextInfoPackage"); 1217 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage))) { 1218 GetAccessibleTextInfoPackage *pkg = 1219 (GetAccessibleTextInfoPackage *) (buffer + sizeof(PackageType)); 1220 windowsThreadEntryPoints->getAccessibleTextInfo((jobject)pkg->AccessibleContext, 1221 &(pkg->rTextInfo), pkg->x, pkg->y); 1222 } else { 1223 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1224 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage)); 1225 } 1226 break; 1227 1228 case cGetAccessibleTextItemsPackage: 1229 PrintDebugString(" type == cGetAccessibleTextItemsPackage"); 1230 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextItemsPackage))) { 1231 GetAccessibleTextItemsPackage *pkg = 1232 (GetAccessibleTextItemsPackage *) (buffer + sizeof(PackageType)); 1233 windowsThreadEntryPoints->getAccessibleTextItems((jobject)pkg->AccessibleContext, 1234 &(pkg->rTextItemsInfo), pkg->index); 1235 } else { 1236 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1237 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage)); 1238 } 1239 break; 1240 1241 case cGetAccessibleTextSelectionInfoPackage: 1242 PrintDebugString(" type == cGetAccessibleTextSelectionInfoPackage"); 1243 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage))) { 1244 GetAccessibleTextSelectionInfoPackage *pkg = 1245 (GetAccessibleTextSelectionInfoPackage *) (buffer + sizeof(PackageType)); 1246 windowsThreadEntryPoints->getAccessibleTextSelectionInfo( 1247 (jobject)pkg->AccessibleContext, &(pkg->rTextSelectionItemsInfo)); 1248 } else { 1249 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1250 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage)); 1251 } 1252 break; 1253 1254 case cGetAccessibleTextAttributeInfoPackage: 1255 PrintDebugString(" type == cGetAccessibleTextAttributeInfoPackage"); 1256 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage))) { 1257 GetAccessibleTextAttributeInfoPackage *pkg = 1258 (GetAccessibleTextAttributeInfoPackage *) (buffer + sizeof(PackageType)); 1259 windowsThreadEntryPoints->getAccessibleTextAttributes( 1260 (jobject)pkg->AccessibleContext, pkg->index, (AccessibleTextAttributesInfo *) &(pkg->rAttributeInfo)); 1261 } else { 1262 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1263 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage)); 1264 } 1265 break; 1266 1267 case cGetAccessibleTextRectInfoPackage: 1268 PrintDebugString(" type == cGetAccessibleTextRectInfoPackage"); 1269 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage))) { 1270 GetAccessibleTextRectInfoPackage *pkg = 1271 (GetAccessibleTextRectInfoPackage *) (buffer + sizeof(PackageType)); 1272 windowsThreadEntryPoints->getAccessibleTextRect((jobject)pkg->AccessibleContext, 1273 &(pkg->rTextRectInfo), pkg->index); 1274 } else { 1275 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1276 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage)); 1277 } 1278 break; 1279 1280 case cGetCaretLocationPackage: 1281 PrintDebugString(" type == cGetCaretLocationPackage"); 1282 if (bufsize == (sizeof(PackageType) + sizeof(GetCaretLocationPackage))) { 1283 GetCaretLocationPackage *pkg = 1284 (GetCaretLocationPackage *) (buffer + sizeof(PackageType)); 1285 windowsThreadEntryPoints->getCaretLocation((jobject)pkg->AccessibleContext, 1286 &(pkg->rTextRectInfo), pkg->index); 1287 } else { 1288 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1289 bufsize, sizeof(PackageType) + sizeof(GetCaretLocationPackage)); 1290 } 1291 break; 1292 1293 case cGetAccessibleTextLineBoundsPackage: 1294 PrintDebugString(" type == cGetAccessibleTextLineBoundsPackage"); 1295 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage))) { 1296 GetAccessibleTextLineBoundsPackage *pkg = 1297 (GetAccessibleTextLineBoundsPackage *) (buffer + sizeof(PackageType)); 1298 windowsThreadEntryPoints->getAccessibleTextLineBounds((jobject)pkg->AccessibleContext, 1299 pkg->index, &(pkg->rLineStart), &(pkg->rLineEnd)); 1300 } else { 1301 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1302 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage)); 1303 } 1304 break; 1305 1306 case cGetAccessibleTextRangePackage: 1307 PrintDebugString(" type == cGetAccessibleTextRangePackage"); 1308 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage))) { 1309 GetAccessibleTextRangePackage *pkg = 1310 (GetAccessibleTextRangePackage *) (buffer + sizeof(PackageType)); 1311 windowsThreadEntryPoints->getAccessibleTextRange((jobject)pkg->AccessibleContext, 1312 pkg->start, pkg->end, (wchar_t *) &(pkg->rText), (sizeof(pkg->rText) / sizeof(wchar_t))); 1313 } else { 1314 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1315 bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage)); 1316 } 1317 break; 1318 1319 1320 // ------------ Accessible Value packages ------------------ 1321 1322 case cGetCurrentAccessibleValueFromContextPackage: 1323 PrintDebugString(" type == cGetCurrentAccessibleValueFromContextPackage"); 1324 if (bufsize == (sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage))) { 1325 GetCurrentAccessibleValueFromContextPackage *pkg = 1326 (GetCurrentAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType)); 1327 windowsThreadEntryPoints->getCurrentAccessibleValueFromContext((jobject)pkg->AccessibleContext, 1328 (wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t))); 1329 } else { 1330 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1331 bufsize, sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage)); 1332 } 1333 break; 1334 1335 case cGetMaximumAccessibleValueFromContextPackage: 1336 PrintDebugString(" type == cGetMaximumAccessibleValueFromContextPackage"); 1337 if (bufsize == (sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage))) { 1338 GetMaximumAccessibleValueFromContextPackage *pkg = 1339 (GetMaximumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType)); 1340 windowsThreadEntryPoints->getMaximumAccessibleValueFromContext((jobject)pkg->AccessibleContext, 1341 (wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t))); 1342 } else { 1343 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1344 bufsize, sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage)); 1345 } 1346 break; 1347 1348 case cGetMinimumAccessibleValueFromContextPackage: 1349 PrintDebugString(" type == cGetMinimumAccessibleValueFromContextPackage"); 1350 if (bufsize == (sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage))) { 1351 GetMinimumAccessibleValueFromContextPackage *pkg = 1352 (GetMinimumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType)); 1353 windowsThreadEntryPoints->getMinimumAccessibleValueFromContext((jobject)pkg->AccessibleContext, 1354 (wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t))); 1355 } else { 1356 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1357 bufsize, sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage)); 1358 } 1359 break; 1360 1361 // ------------ Accessible Selection packages ------------------ 1362 1363 case cAddAccessibleSelectionFromContextPackage: 1364 PrintDebugString(" type == cAddAccessibleSelectionFromContextPackage"); 1365 if (bufsize == (sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage))) { 1366 AddAccessibleSelectionFromContextPackage *pkg = 1367 (AddAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); 1368 windowsThreadEntryPoints->addAccessibleSelectionFromContext((jobject)pkg->AccessibleContext, 1369 pkg->index); 1370 } else { 1371 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1372 bufsize, sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage)); 1373 } 1374 break; 1375 1376 case cClearAccessibleSelectionFromContextPackage: 1377 PrintDebugString(" type == cClearAccessibleSelectionFromContextPackage"); 1378 if (bufsize == (sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage))) { 1379 ClearAccessibleSelectionFromContextPackage *pkg = 1380 (ClearAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); 1381 windowsThreadEntryPoints->clearAccessibleSelectionFromContext((jobject)pkg->AccessibleContext); 1382 } else { 1383 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1384 bufsize, sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage)); 1385 } 1386 break; 1387 1388 case cGetAccessibleSelectionFromContextPackage: 1389 PrintDebugString(" type == cGetAccessibleSelectionFromContextPackage"); 1390 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage))) { 1391 GetAccessibleSelectionFromContextPackage *pkg = 1392 (GetAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); 1393 pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleSelectionFromContext( 1394 (jobject)pkg->AccessibleContext, pkg->index); 1395 } else { 1396 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1397 bufsize, sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage)); 1398 } 1399 break; 1400 1401 case cGetAccessibleSelectionCountFromContextPackage: 1402 PrintDebugString(" type == cGetAccessibleSelectionCountFromContextPackage"); 1403 if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage))) { 1404 GetAccessibleSelectionCountFromContextPackage *pkg = 1405 (GetAccessibleSelectionCountFromContextPackage *) (buffer + sizeof(PackageType)); 1406 pkg->rCount = windowsThreadEntryPoints->getAccessibleSelectionCountFromContext( 1407 (jobject)pkg->AccessibleContext); 1408 } else { 1409 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1410 bufsize, sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage)); 1411 } 1412 break; 1413 1414 case cIsAccessibleChildSelectedFromContextPackage: 1415 PrintDebugString(" type == cIsAccessibleChildSelectedFromContextPackage"); 1416 if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage))) { 1417 IsAccessibleChildSelectedFromContextPackage *pkg = 1418 (IsAccessibleChildSelectedFromContextPackage *) (buffer + sizeof(PackageType)); 1419 pkg->rResult = windowsThreadEntryPoints->isAccessibleChildSelectedFromContext( 1420 (jobject)pkg->AccessibleContext, pkg->index); 1421 } else { 1422 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1423 bufsize, sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage)); 1424 } 1425 break; 1426 1427 case cRemoveAccessibleSelectionFromContextPackage: 1428 PrintDebugString(" type == cRemoveAccessibleSelectionFromContextPackage"); 1429 if (bufsize == (sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage))) { 1430 RemoveAccessibleSelectionFromContextPackage *pkg = 1431 (RemoveAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); 1432 windowsThreadEntryPoints->removeAccessibleSelectionFromContext((jobject)pkg->AccessibleContext, 1433 pkg->index); 1434 } else { 1435 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1436 bufsize, sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage)); 1437 } 1438 break; 1439 1440 case cSelectAllAccessibleSelectionFromContextPackage: 1441 PrintDebugString(" type == cSelectAllAccessibleSelectionFromContextPackage"); 1442 if (bufsize == (sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage))) { 1443 SelectAllAccessibleSelectionFromContextPackage *pkg = 1444 (SelectAllAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); 1445 windowsThreadEntryPoints->selectAllAccessibleSelectionFromContext((jobject)pkg->AccessibleContext); 1446 } else { 1447 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1448 bufsize, sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage)); 1449 } 1450 break; 1451 1452 1453 // ------------ event notification management packages ------------------ 1454 1455 case cAddJavaEventNotificationPackage: 1456 PrintDebugString(" type = cAddJavaEventNotificationPackage"); 1457 if (bufsize == (sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage))) { 1458 AddJavaEventNotificationPackage *pkg = 1459 (AddJavaEventNotificationPackage *) (buffer + sizeof(PackageType)); 1460 addJavaEventNotification(pkg->type, (HWND)ABLongToHandle( pkg->DLLwindow ) ); 1461 } else { 1462 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1463 bufsize, sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage)); 1464 } 1465 break; 1466 1467 case cRemoveJavaEventNotificationPackage: 1468 PrintDebugString(" type = cRemoveJavaEventNotificationPackage"); 1469 if (bufsize == (sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage))) { 1470 RemoveJavaEventNotificationPackage *pkg = 1471 (RemoveJavaEventNotificationPackage *) (buffer + sizeof(PackageType)); 1472 removeJavaEventNotification(pkg->type, (HWND)ABLongToHandle( pkg->DLLwindow )); 1473 } else { 1474 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1475 bufsize, sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage)); 1476 } 1477 break; 1478 1479 case cAddAccessibilityEventNotificationPackage: 1480 PrintDebugString(" type = cAddAccessibilityEventNotificationPackage"); 1481 if (bufsize == (sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage))) { 1482 AddAccessibilityEventNotificationPackage *pkg = 1483 (AddAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType)); 1484 addAccessibilityEventNotification(pkg->type, (HWND)ABLongToHandle(pkg->DLLwindow)); 1485 } else { 1486 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1487 bufsize, sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage)); 1488 } 1489 break; 1490 1491 case cRemoveAccessibilityEventNotificationPackage: 1492 PrintDebugString(" type = cRemoveAccessibilityEventNotificationPackage"); 1493 if (bufsize == (sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage))) { 1494 RemoveAccessibilityEventNotificationPackage *pkg = 1495 (RemoveAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType)); 1496 removeAccessibilityEventNotification(pkg->type, (HWND)ABLongToHandle(pkg->DLLwindow)); 1497 } else { 1498 PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", 1499 bufsize, sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage)); 1500 } 1501 break; 1502 1503 default: 1504 PrintDebugString(" processing FAILED!! -> don't know how to handle type = %X", *type); 1505 returnVal = -1; 1506 break; 1507 } 1508 1509 PrintDebugString(" package processing completed"); 1510 return returnVal; 1511 } 1512 1513 1514 // ----------------------------- 1515 1516 1517 /** 1518 * MemoryMappedFileCreated 1519 * - WindowsDLL letting us know it's created a memory-mapped file 1520 * for IPC. We need to open it and write a magic string into 1521 * it to let the WindowsDLL know all is OK. Also we need to 1522 * set up our own data structures to communicate with the 1523 * WindowsDLL 1524 * 1525 */ 1526 LRESULT 1527 JavaAccessBridge::MemoryMappedFileCreated(HWND ATBridgeDLLWindow, char *filename) { 1528 PrintDebugString(" in MemoryMappedFileCreated(%p, %s)!", ATBridgeDLLWindow, filename); 1529 AccessBridgeATInstance *newAT = 1530 new AccessBridgeATInstance(dialogWindow, ATBridgeDLLWindow, filename, ATs); 1531 PrintDebugString(" just created a new ATInstance = %p, old = %p", newAT, ATs); 1532 ATs = newAT; 1533 1534 LRESULT returnVal = ATs->initiateIPC(); 1535 if (returnVal == 0) { 1536 PrintDebugString(" Successfully initiated IPC with AT!!!"); 1537 } else { 1538 PrintDebugString(" ERROR: Failed to initiate IPC with AT!!!"); 1539 } 1540 1541 return returnVal; 1542 } 1543 1544 1545 /** 1546 * WindowsATDestroyed - lets the JavaABDLL know a Windows AT disappeared 1547 * 1548 */ 1549 void 1550 JavaAccessBridge::WindowsATDestroyed(HWND ATBridgeDLLWindow) { 1551 PrintDebugString("\r\nin JavaAccessBridge::WindowsATDestroyed(%p)", ATBridgeDLLWindow); 1552 if (ATs == (AccessBridgeATInstance *) 0) { 1553 PrintDebugString(" ERROR!! -> ATs == 0! (shouldn't happen here)"); 1554 return; 1555 } 1556 1557 AccessBridgeATInstance *currentAT = ATs; 1558 AccessBridgeATInstance *previousAT = ATs; 1559 if (ATs->winAccessBridgeWindow == ATBridgeDLLWindow) { 1560 ATs = ATs->nextATInstance; 1561 // remove event notification for this AT 1562 removeJavaEventNotification(currentAT->javaEventMask, ATBridgeDLLWindow); 1563 removeAccessibilityEventNotification(currentAT->accessibilityEventMask, ATBridgeDLLWindow); 1564 delete currentAT; 1565 PrintDebugString(" data structures successfully removed"); 1566 } else { 1567 while (currentAT != (AccessBridgeATInstance *) NULL) { 1568 if (currentAT->winAccessBridgeWindow == ATBridgeDLLWindow) { 1569 previousAT->nextATInstance = currentAT->nextATInstance; 1570 delete currentAT; 1571 PrintDebugString(" data structures successfully removed"); 1572 return; 1573 } else { 1574 previousAT = currentAT; 1575 currentAT = currentAT->nextATInstance; 1576 } 1577 } 1578 PrintDebugString(" ERROR!! couldn't find matching data structures!"); 1579 } 1580 } 1581 1582 1583 // ----------------------------- 1584 1585 1586 /** 1587 * releaseJavaObject - lets the JavaVM know it can release the Java Object 1588 * 1589 * Note: once you have made this call, the JavaVM will garbage collect 1590 * the jobject you pass in. If you later use that jobject in another 1591 * call, you will cause all maner of havoc! 1592 * 1593 */ 1594 void 1595 JavaAccessBridge::releaseJavaObject(jobject object) { 1596 PrintDebugString("In JavaAccessBridge::releaseJavaObject"); 1597 PrintDebugString(" object X: %p", object); 1598 if (windowsThreadJNIEnv != (JNIEnv *) 0) { 1599 windowsThreadJNIEnv->DeleteGlobalRef(object); 1600 PrintDebugString(" global reference deleted.", object); 1601 } else { 1602 PrintDebugString(" Error! windowsThreadJNIEnv == 0"); 1603 } 1604 } 1605 1606 // ----------------------------- 1607 1608 /** 1609 * addJavaEventNotification - this AT now wants this type of events 1610 * 1611 */ 1612 void 1613 JavaAccessBridge::addJavaEventNotification(jlong type, HWND DLLwindow) { 1614 // walk through list of ATs, find this one and add this type 1615 // and, if we weren't listening for these before, ask Java for 'em 1616 PrintDebugString(" adding Java event type %016I64X to HWND %p", type, DLLwindow); 1617 AccessBridgeATInstance *ati = ATs; 1618 long globalEventMask = 0; 1619 while (ati != (AccessBridgeATInstance *) 0) { 1620 if (ati->winAccessBridgeWindow == DLLwindow) { 1621 ati->javaEventMask |= type; 1622 PrintDebugString(" found HWND, javaEventMask now is %X", ati->javaEventMask); 1623 } else { 1624 globalEventMask |= ati->javaEventMask; 1625 } 1626 ati = ati->nextATInstance; 1627 } 1628 PrintDebugString(" union of all Java AT event masks: %X", globalEventMask); 1629 if (!(globalEventMask & type)) { 1630 // no other ATs wanted this event; 1631 // start getting them from Java 1632 PrintDebugString(" no other AT wanted this Java event (so not registered); adding to AccessBridge.java"); 1633 windowsThreadEntryPoints->addJavaEventNotification(type); 1634 } 1635 } 1636 1637 /** 1638 * removeJavaEventNotification - this AT no longer wants this type of events 1639 * 1640 */ 1641 void 1642 JavaAccessBridge::removeJavaEventNotification(jlong type, HWND DLLwindow) { 1643 // walk through list of ATs, find this one and remove this type 1644 // and, if no other AT wants 'em either, tell Java we no longer want 'em 1645 PrintDebugString(" removing Java event type %016I64X from HWND %p", type, DLLwindow); 1646 AccessBridgeATInstance *ati = ATs; 1647 long globalEventMask = 0; 1648 while (ati != (AccessBridgeATInstance *) 0) { 1649 if (ati->winAccessBridgeWindow == DLLwindow) { 1650 ati->javaEventMask &= (0xFFFFFFFF - type); 1651 PrintDebugString(" found HWND, javaEventMask now is %X", ati->javaEventMask); 1652 } else { 1653 globalEventMask |= ati->javaEventMask; 1654 } 1655 ati = ati->nextATInstance; 1656 } 1657 PrintDebugString(" union of all Java AT event masks: %X", globalEventMask); 1658 if (!(globalEventMask & type)) { 1659 // no other ATs wanted this event; 1660 // stop getting them from Java 1661 PrintDebugString(" no other AT wanted this Java event (so can remove); removing from AccessBridge.java"); 1662 windowsThreadEntryPoints->removeJavaEventNotification(type); 1663 } 1664 } 1665 1666 1667 /** 1668 * addAccesibilityEventNotification - this AT now wants this type of events 1669 * 1670 */ 1671 void 1672 JavaAccessBridge::addAccessibilityEventNotification(jlong type, HWND DLLwindow) { 1673 // walk through list of ATs, find this one and add this type 1674 // and, if we weren't listening for these before, ask Java for 'em 1675 PrintDebugString(" adding Accesibility event type %016I64X to HWND %p", type, DLLwindow); 1676 AccessBridgeATInstance *ati = ATs; 1677 long globalEventMask = 0; 1678 while (ati != (AccessBridgeATInstance *) 0) { 1679 if (ati->winAccessBridgeWindow == DLLwindow) { 1680 ati->accessibilityEventMask |= type; 1681 PrintDebugString(" found HWND, accessibilityEventMask now is %X", ati->accessibilityEventMask); 1682 } else { 1683 globalEventMask |= ati->accessibilityEventMask; 1684 } 1685 ati = ati->nextATInstance; 1686 } 1687 PrintDebugString(" union of all Accessibility AT event masks: %X", globalEventMask); 1688 if (!(globalEventMask & type)) { 1689 // no other ATs wanted this event; 1690 // start getting them from Java 1691 PrintDebugString(" no other AT wanted this Accesibility event (so not registered); adding to AccessBridge.java"); 1692 windowsThreadEntryPoints->addAccessibilityEventNotification(type); 1693 } 1694 } 1695 1696 /** 1697 * removeAccesibilityEventNotification - this AT no longer wants this type of events 1698 * 1699 */ 1700 void 1701 JavaAccessBridge::removeAccessibilityEventNotification(jlong type, HWND DLLwindow) { 1702 // walk through list of ATs, find this one and remove this type 1703 // and, if no other AT wants 'em either, tell Java we no longer want 'em 1704 PrintDebugString(" removing Accesibility event type %016I64X from HWND %p", type, DLLwindow); 1705 AccessBridgeATInstance *ati = ATs; 1706 long globalEventMask = 0; 1707 while (ati != (AccessBridgeATInstance *) 0) { 1708 if (ati->winAccessBridgeWindow == DLLwindow) { 1709 ati->accessibilityEventMask &= (0xFFFFFFFF - type); 1710 PrintDebugString(" found HWND, accessibilityEventMask now is %X", ati->accessibilityEventMask); 1711 } else { 1712 globalEventMask |= ati->accessibilityEventMask; 1713 } 1714 ati = ati->nextATInstance; 1715 } 1716 PrintDebugString(" union of all Accessibility AT event masks: %X", globalEventMask); 1717 if (!(globalEventMask & type)) { 1718 // no other ATs wanted this event; 1719 // stop getting them from Java 1720 PrintDebugString(" no other AT wanted this Accessibility event (so can remove); removing from AccessBridge.java"); 1721 windowsThreadEntryPoints->removeAccessibilityEventNotification(type); 1722 } 1723 } 1724 1725 1726 1727 1728 /** 1729 * firePropertyCaretChange 1730 * 1731 */ 1732 void 1733 JavaAccessBridge::firePropertyCaretChange(JNIEnv *env, jobject callingObj, 1734 jobject event, jobject source, 1735 jint oldValue, jint newValue) { 1736 1737 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyCaretChanged(%p, %p, %p, %p, %d, %d)", 1738 env, callingObj, event, 1739 source, oldValue, newValue); 1740 1741 // sanity check 1742 if (ATs == (AccessBridgeATInstance *) 0) { 1743 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 1744 return; // panic! 1745 } 1746 1747 // common setup 1748 char buffer[sizeof(PackageType) + sizeof(PropertyCaretChangePackage)]; 1749 PackageType *type = (PackageType *) buffer; 1750 PropertyCaretChangePackage *pkg = (PropertyCaretChangePackage *) (buffer + sizeof(PackageType)); 1751 *type = cPropertyCaretChangePackage; 1752 pkg->vmID = (long) dialogWindow; 1753 1754 // make new Global Refs and send events only to those ATs that want 'em 1755 AccessBridgeATInstance *ati = ATs; 1756 while (ati != (AccessBridgeATInstance *) 0) { 1757 if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) { 1758 1759 PrintDebugString(" sending to AT"); 1760 1761 // make new GlobalRefs for this AT 1762 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 1763 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 1764 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 1765 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 1766 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 1767 #else // JOBJECT64 is jlong (64 bit) 1768 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 1769 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 1770 #endif 1771 1772 pkg->oldPosition = oldValue; 1773 pkg->newPosition = newValue; 1774 1775 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyCaretChangeEvent); 1776 } 1777 ati = ati->nextATInstance; 1778 } 1779 PrintDebugString(" done with propertyCaretChange event"); 1780 } 1781 1782 /** 1783 * firePropertyDescriptionChange 1784 * 1785 */ 1786 void 1787 JavaAccessBridge::firePropertyDescriptionChange(JNIEnv *env, jobject callingObj, 1788 jobject event, jobject source, 1789 jstring oldValue, jstring newValue){ 1790 1791 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyDescriptionChanged(%p, %p, %p, %p, %p, %p)", 1792 env, callingObj, event, 1793 source, oldValue, newValue); 1794 1795 // sanity check 1796 if (ATs == (AccessBridgeATInstance *) 0) { 1797 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 1798 return; // panic! 1799 } 1800 1801 // common setup 1802 const wchar_t *stringBytes; 1803 char buffer[sizeof(PackageType) + sizeof(PropertyDescriptionChangePackage)]; 1804 PackageType *type = (PackageType *) buffer; 1805 PropertyDescriptionChangePackage *pkg = (PropertyDescriptionChangePackage *) (buffer + sizeof(PackageType)); 1806 *type = cPropertyDescriptionChangePackage; 1807 pkg->vmID = (long) dialogWindow; 1808 1809 // make new Global Refs and send events only to those ATs that want 'em 1810 AccessBridgeATInstance *ati = ATs; 1811 while (ati != (AccessBridgeATInstance *) 0) { 1812 if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) { 1813 1814 PrintDebugString(" sending to AT"); 1815 1816 // make new GlobalRefs for this AT 1817 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 1818 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 1819 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 1820 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 1821 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 1822 #else // JOBJECT64 is jlong (64 bit) 1823 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 1824 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 1825 #endif 1826 1827 if (oldValue != (jstring) 0) { 1828 stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); 1829 if (stringBytes == NULL) { 1830 if (!env->ExceptionCheck()) { 1831 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 1832 if (cls != NULL) { 1833 env->ThrowNew(cls, NULL); 1834 } 1835 } 1836 return; 1837 } 1838 wcsncpy(pkg->oldDescription, stringBytes, (sizeof(pkg->oldDescription) / sizeof(wchar_t))); 1839 env->ReleaseStringChars(oldValue, stringBytes); 1840 } else { 1841 wcsncpy(pkg->oldDescription, L"(null)", (sizeof(pkg->oldDescription) / sizeof(wchar_t))); 1842 } 1843 1844 if (newValue != (jstring) 0) { 1845 stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); 1846 if (stringBytes == NULL) { 1847 if (!env->ExceptionCheck()) { 1848 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 1849 if (cls != NULL) { 1850 env->ThrowNew(cls, NULL); 1851 } 1852 } 1853 return; 1854 } 1855 wcsncpy(pkg->newDescription, stringBytes, (sizeof(pkg->newDescription) / sizeof(wchar_t))); 1856 env->ReleaseStringChars(newValue, stringBytes); 1857 } else { 1858 wcsncpy(pkg->newDescription, L"(null)", (sizeof(pkg->newDescription) / sizeof(wchar_t))); 1859 } 1860 1861 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyDescriptionChangeEvent); 1862 } 1863 ati = ati->nextATInstance; 1864 } 1865 PrintDebugString(" done with propertyDescriptionChange event"); 1866 } 1867 1868 /** 1869 * firePropertyNameChange 1870 * 1871 */ 1872 void 1873 JavaAccessBridge::firePropertyNameChange(JNIEnv *env, jobject callingObj, 1874 jobject event, jobject source, 1875 jstring oldValue, jstring newValue){ 1876 1877 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyNameChanged(%p, %p, %p, %p, %p, %p)", 1878 env, callingObj, event, 1879 source, oldValue, newValue); 1880 1881 // sanity check 1882 if (ATs == (AccessBridgeATInstance *) 0) { 1883 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 1884 return; // panic! 1885 } 1886 1887 // common setup 1888 const wchar_t *stringBytes; 1889 char buffer[sizeof(PackageType) + sizeof(PropertyNameChangePackage)]; 1890 PackageType *type = (PackageType *) buffer; 1891 PropertyNameChangePackage *pkg = (PropertyNameChangePackage *) (buffer + sizeof(PackageType)); 1892 *type = cPropertyNameChangePackage; 1893 pkg->vmID = (long) dialogWindow; 1894 1895 // make new Global Refs and send events only to those ATs that want 'em 1896 AccessBridgeATInstance *ati = ATs; 1897 while (ati != (AccessBridgeATInstance *) 0) { 1898 if (ati->accessibilityEventMask & cPropertyNameChangeEvent) { 1899 1900 PrintDebugString(" sending to AT"); 1901 1902 // make new GlobalRefs for this AT 1903 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 1904 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 1905 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 1906 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 1907 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 1908 #else // JOBJECT64 is jlong (64 bit) 1909 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 1910 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 1911 #endif 1912 1913 if (oldValue != (jstring) 0) { 1914 stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); 1915 if (stringBytes == NULL) { 1916 if (!env->ExceptionCheck()) { 1917 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 1918 if (cls != NULL) { 1919 env->ThrowNew(cls, NULL); 1920 } 1921 } 1922 return; 1923 } 1924 wcsncpy(pkg->oldName, stringBytes, (sizeof(pkg->oldName) / sizeof(wchar_t))); 1925 env->ReleaseStringChars(oldValue, stringBytes); 1926 } else { 1927 wcsncpy(pkg->oldName, L"(null)", (sizeof(pkg->oldName) / sizeof(wchar_t))); 1928 } 1929 1930 if (newValue != (jstring) 0) { 1931 stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); 1932 if (stringBytes == NULL) { 1933 if (!env->ExceptionCheck()) { 1934 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 1935 if (cls != NULL) { 1936 env->ThrowNew(cls, NULL); 1937 } 1938 } 1939 return; 1940 } 1941 wcsncpy(pkg->newName, stringBytes, (sizeof(pkg->newName) / sizeof(wchar_t))); 1942 env->ReleaseStringChars(newValue, stringBytes); 1943 } else { 1944 wcsncpy(pkg->newName, L"(null)", (sizeof(pkg->newName) / sizeof(wchar_t))); 1945 } 1946 1947 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyNameChangeEvent); 1948 } 1949 ati = ati->nextATInstance; 1950 } 1951 PrintDebugString(" done with propertyNameChange event"); 1952 } 1953 1954 1955 /** 1956 * firePropertySelectionChange 1957 * 1958 */ 1959 void 1960 JavaAccessBridge::firePropertySelectionChange(JNIEnv *env, jobject callingObj, 1961 jobject event, jobject source) { 1962 1963 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertySelectionChanged(%p, %p, %p, %p)", 1964 env, callingObj, event, source); 1965 1966 // sanity check 1967 if (ATs == (AccessBridgeATInstance *) 0) { 1968 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 1969 return; // panic! 1970 } 1971 1972 // common setup 1973 char buffer[sizeof(PackageType) + sizeof(PropertySelectionChangePackage)]; 1974 PackageType *type = (PackageType *) buffer; 1975 PropertySelectionChangePackage *pkg = (PropertySelectionChangePackage *) (buffer + sizeof(PackageType)); 1976 *type = cPropertySelectionChangePackage; 1977 pkg->vmID = (long) dialogWindow; 1978 1979 // make new Global Refs and send events only to those ATs that want 'em 1980 AccessBridgeATInstance *ati = ATs; 1981 while (ati != (AccessBridgeATInstance *) 0) { 1982 if (ati->accessibilityEventMask & cPropertySelectionChangeEvent) { 1983 1984 PrintDebugString(" sending to AT"); 1985 1986 // make new GlobalRefs for this AT 1987 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 1988 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 1989 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 1990 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 1991 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 1992 #else // JOBJECT64 is jlong (64 bit) 1993 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 1994 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 1995 #endif 1996 1997 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertySelectionChangeEvent); 1998 } 1999 ati = ati->nextATInstance; 2000 } 2001 PrintDebugString(" done with propertySelectionChange event"); 2002 } 2003 2004 2005 /** 2006 * firePropertyStateChange 2007 * 2008 */ 2009 void 2010 JavaAccessBridge::firePropertyStateChange(JNIEnv *env, jobject callingObj, 2011 jobject event, jobject source, 2012 jstring oldValue, jstring newValue){ 2013 2014 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyStateChanged(%p, %p, %p, %p, %p, %p)", 2015 env, callingObj, event, 2016 source, oldValue, newValue); 2017 2018 // sanity check 2019 if (ATs == (AccessBridgeATInstance *) 0) { 2020 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 2021 return; // panic! 2022 } 2023 2024 // common setup 2025 const wchar_t *stringBytes; 2026 char buffer[sizeof(PackageType) + sizeof(PropertyStateChangePackage)]; 2027 PackageType *type = (PackageType *) buffer; 2028 PropertyStateChangePackage *pkg = (PropertyStateChangePackage *) (buffer + sizeof(PackageType)); 2029 *type = cPropertyStateChangePackage; 2030 pkg->vmID = (long) dialogWindow; 2031 2032 // make new Global Refs and send events only to those ATs that want 'em 2033 AccessBridgeATInstance *ati = ATs; 2034 while (ati != (AccessBridgeATInstance *) 0) { 2035 if (ati->accessibilityEventMask & cPropertyStateChangeEvent) { 2036 2037 PrintDebugString(" sending to AT"); 2038 2039 // make new GlobalRefs for this AT 2040 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 2041 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 2042 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 2043 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 2044 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 2045 #else // JOBJECT64 is jlong (64 bit) 2046 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 2047 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 2048 #endif 2049 2050 if (oldValue != (jstring) 0) { 2051 stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); 2052 if (stringBytes == NULL) { 2053 if (!env->ExceptionCheck()) { 2054 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 2055 if (cls != NULL) { 2056 env->ThrowNew(cls, NULL); 2057 } 2058 } 2059 return; 2060 } 2061 wcsncpy(pkg->oldState, stringBytes, (sizeof(pkg->oldState) / sizeof(wchar_t))); 2062 env->ReleaseStringChars(oldValue, stringBytes); 2063 } else { 2064 wcsncpy(pkg->oldState, L"(null)", (sizeof(pkg->oldState) / sizeof(wchar_t))); 2065 } 2066 2067 if (newValue != (jstring) 0) { 2068 stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); 2069 if (stringBytes == NULL) { 2070 if (!env->ExceptionCheck()) { 2071 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 2072 if (cls != NULL) { 2073 env->ThrowNew(cls, NULL); 2074 } 2075 } 2076 return; 2077 } 2078 wcsncpy(pkg->newState, stringBytes, (sizeof(pkg->newState) / sizeof(wchar_t))); 2079 env->ReleaseStringChars(newValue, stringBytes); 2080 } else { 2081 wcsncpy(pkg->newState, L"(null)", (sizeof(pkg->newState) / sizeof(wchar_t))); 2082 } 2083 2084 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyStateChangeEvent); 2085 } 2086 ati = ati->nextATInstance; 2087 } 2088 PrintDebugString(" done with propertyStateChange event"); 2089 } 2090 2091 2092 /** 2093 * firePropertyTextChange 2094 * 2095 */ 2096 void 2097 JavaAccessBridge::firePropertyTextChange(JNIEnv *env, jobject callingObj, 2098 jobject event, jobject source) { 2099 2100 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyTextChanged(%p, %p, %p, %p)", 2101 env, callingObj, event, source); 2102 2103 // sanity check 2104 if (ATs == (AccessBridgeATInstance *) 0) { 2105 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 2106 return; // panic! 2107 } 2108 2109 // common setup 2110 char buffer[sizeof(PackageType) + sizeof(PropertyTextChangePackage)]; 2111 PackageType *type = (PackageType *) buffer; 2112 PropertyTextChangePackage *pkg = (PropertyTextChangePackage *) (buffer + sizeof(PackageType)); 2113 *type = cPropertyTextChangePackage; 2114 pkg->vmID = (long) dialogWindow; 2115 2116 // make new Global Refs and send events only to those ATs that want 'em 2117 AccessBridgeATInstance *ati = ATs; 2118 while (ati != (AccessBridgeATInstance *) 0) { 2119 if (ati->accessibilityEventMask & cPropertyTextChangeEvent) { 2120 2121 PrintDebugString(" sending to AT"); 2122 2123 // make new GlobalRefs for this AT 2124 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 2125 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 2126 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 2127 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 2128 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 2129 #else // JOBJECT64 is jlong (64 bit) 2130 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 2131 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 2132 #endif 2133 2134 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTextChangeEvent); 2135 } 2136 ati = ati->nextATInstance; 2137 } 2138 PrintDebugString(" done with propertyTextChange event"); 2139 } 2140 2141 2142 /** 2143 * firePropertyValueChange 2144 * 2145 */ 2146 void 2147 JavaAccessBridge::firePropertyValueChange(JNIEnv *env, jobject callingObj, 2148 jobject event, jobject source, 2149 jstring oldValue, jstring newValue){ 2150 2151 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyValueChanged(%p, %p, %p, %p, %p, %p)", 2152 env, callingObj, event, 2153 source, oldValue, newValue); 2154 2155 // sanity check 2156 if (ATs == (AccessBridgeATInstance *) 0) { 2157 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 2158 return; // panic! 2159 } 2160 2161 // common setup 2162 const wchar_t *stringBytes; 2163 char buffer[sizeof(PackageType) + sizeof(PropertyValueChangePackage)]; 2164 PackageType *type = (PackageType *) buffer; 2165 PropertyValueChangePackage *pkg = (PropertyValueChangePackage *) (buffer + sizeof(PackageType)); 2166 *type = cPropertyValueChangePackage; 2167 pkg->vmID = (long) dialogWindow; 2168 2169 // make new Global Refs and send events only to those ATs that want 'em 2170 AccessBridgeATInstance *ati = ATs; 2171 while (ati != (AccessBridgeATInstance *) 0) { 2172 if (ati->accessibilityEventMask & cPropertyValueChangeEvent) { 2173 2174 PrintDebugString(" sending to AT"); 2175 2176 // make new GlobalRefs for this AT 2177 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 2178 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 2179 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 2180 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 2181 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 2182 #else // JOBJECT64 is jlong (64 bit) 2183 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 2184 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 2185 #endif 2186 2187 if (oldValue != (jstring) 0) { 2188 stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); 2189 if (stringBytes == NULL) { 2190 if (!env->ExceptionCheck()) { 2191 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 2192 if (cls != NULL) { 2193 env->ThrowNew(cls, NULL); 2194 } 2195 } 2196 return; 2197 } 2198 wcsncpy(pkg->oldValue, stringBytes, (sizeof(pkg->oldValue) / sizeof(wchar_t))); 2199 env->ReleaseStringChars(oldValue, stringBytes); 2200 } else { 2201 wcsncpy(pkg->oldValue, L"(null)", (sizeof(pkg->oldValue) / sizeof(wchar_t))); 2202 } 2203 2204 if (newValue != (jstring) 0) { 2205 stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); 2206 if (stringBytes == NULL) { 2207 if (!env->ExceptionCheck()) { 2208 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 2209 if (cls != NULL) { 2210 env->ThrowNew(cls, NULL); 2211 } 2212 } 2213 return; 2214 } 2215 wcsncpy(pkg->newValue, stringBytes, (sizeof(pkg->newValue) / sizeof(wchar_t))); 2216 env->ReleaseStringChars(newValue, stringBytes); 2217 } else { 2218 wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t))); 2219 } 2220 2221 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyValueChangeEvent); 2222 } 2223 ati = ati->nextATInstance; 2224 } 2225 PrintDebugString(" done with propertyValueChange event"); 2226 } 2227 2228 /** 2229 * firePropertyVisibleDataChange 2230 * 2231 */ 2232 void 2233 JavaAccessBridge::firePropertyVisibleDataChange(JNIEnv *env, jobject callingObj, 2234 jobject event, jobject source) { 2235 2236 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyVisibleDataChanged(%p, %p, %p, %p)", 2237 env, callingObj, event, source); 2238 2239 // sanity check 2240 if (ATs == (AccessBridgeATInstance *) 0) { 2241 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 2242 return; // panic! 2243 } 2244 2245 // common setup 2246 char buffer[sizeof(PackageType) + sizeof(PropertyVisibleDataChangePackage)]; 2247 PackageType *type = (PackageType *) buffer; 2248 PropertyVisibleDataChangePackage *pkg = (PropertyVisibleDataChangePackage *) (buffer + sizeof(PackageType)); 2249 *type = cPropertyVisibleDataChangePackage; 2250 pkg->vmID = (long) dialogWindow; 2251 2252 // make new Global Refs and send events only to those ATs that want 'em 2253 AccessBridgeATInstance *ati = ATs; 2254 while (ati != (AccessBridgeATInstance *) 0) { 2255 if (ati->accessibilityEventMask & cPropertyVisibleDataChangeEvent) { 2256 2257 PrintDebugString(" sending to AT"); 2258 2259 // make new GlobalRefs for this AT 2260 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 2261 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 2262 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 2263 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 2264 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 2265 #else // JOBJECT64 is jlong (64 bit) 2266 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 2267 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 2268 #endif 2269 2270 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyVisibleDataChangeEvent); 2271 } 2272 ati = ati->nextATInstance; 2273 } 2274 PrintDebugString(" done with propertyVisibleDataChange event"); 2275 } 2276 2277 2278 /** 2279 * firePropertyChildChange 2280 * 2281 */ 2282 void 2283 JavaAccessBridge::firePropertyChildChange(JNIEnv *env, jobject callingObj, 2284 jobject event, jobject source, 2285 jobject oldValue, jobject newValue){ 2286 2287 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyChildPropertyChanged(%p, %p, %p, %p, %p, %p)", 2288 env, callingObj, event, 2289 source, oldValue, newValue); 2290 2291 // sanity check 2292 if (ATs == (AccessBridgeATInstance *) 0) { 2293 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 2294 return; // panic! 2295 } 2296 2297 // common setup 2298 char buffer[sizeof(PackageType) + sizeof(PropertyChildChangePackage)]; 2299 PackageType *type = (PackageType *) buffer; 2300 PropertyChildChangePackage *pkg = (PropertyChildChangePackage *) (buffer + sizeof(PackageType)); 2301 *type = cPropertyChildChangePackage; 2302 pkg->vmID = (long) dialogWindow; 2303 2304 // make new Global Refs and send events only to those ATs that want 'em 2305 AccessBridgeATInstance *ati = ATs; 2306 while (ati != (AccessBridgeATInstance *) 0) { 2307 if (ati->accessibilityEventMask & cPropertyChildChangeEvent) { 2308 2309 PrintDebugString(" sending to AT"); 2310 2311 // make new GlobalRefs for this AT 2312 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 2313 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 2314 pkg->oldChildAccessibleContext = (JOBJECT64)env->NewGlobalRef(oldValue); 2315 pkg->newChildAccessibleContext = (JOBJECT64)env->NewGlobalRef(newValue); 2316 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 2317 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 2318 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 2319 PrintDebugString(" GlobalRef'd OldChildAC: %p", pkg->oldChildAccessibleContext); 2320 PrintDebugString(" GlobalRef'd NewChildAC: %p", pkg->newChildAccessibleContext); 2321 #else // JOBJECT64 is jlong (64 bit) 2322 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 2323 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 2324 PrintDebugString(" GlobalRef'd OldChildAC: %016I64X", pkg->oldChildAccessibleContext); 2325 PrintDebugString(" GlobalRef'd NewChildAC: %016I64X", pkg->newChildAccessibleContext); 2326 #endif 2327 2328 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyChildChangeEvent); 2329 } 2330 ati = ati->nextATInstance; 2331 } 2332 PrintDebugString(" done with propertyChildChange event"); 2333 } 2334 2335 2336 /** 2337 * firePropertyActiveDescendentChange 2338 * 2339 */ 2340 void 2341 JavaAccessBridge::firePropertyActiveDescendentChange(JNIEnv *env, jobject callingObj, 2342 jobject event, jobject source, 2343 jobject oldValue, jobject newValue){ 2344 2345 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyActiveDescendentPropertyChanged(%p, %p, %p, %p, %p, %p)", 2346 env, callingObj, event, 2347 source, oldValue, newValue); 2348 2349 // sanity check 2350 if (ATs == (AccessBridgeATInstance *) 0) { 2351 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 2352 return; // panic! 2353 } 2354 2355 // common setup 2356 char buffer[sizeof(PackageType) + sizeof(PropertyActiveDescendentChangePackage)]; 2357 PackageType *type = (PackageType *) buffer; 2358 PropertyActiveDescendentChangePackage *pkg = (PropertyActiveDescendentChangePackage *) (buffer + sizeof(PackageType)); 2359 *type = cPropertyActiveDescendentChangePackage; 2360 pkg->vmID = (long) dialogWindow; 2361 2362 // make new Global Refs and send events only to those ATs that want 'em 2363 AccessBridgeATInstance *ati = ATs; 2364 while (ati != (AccessBridgeATInstance *) 0) { 2365 if (ati->accessibilityEventMask & cPropertyActiveDescendentChangeEvent) { 2366 2367 PrintDebugString(" sending to AT"); 2368 2369 // make new GlobalRefs for this AT 2370 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 2371 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 2372 pkg->oldActiveDescendentAccessibleContext = (JOBJECT64)env->NewGlobalRef(oldValue); 2373 pkg->newActiveDescendentAccessibleContext = (JOBJECT64)env->NewGlobalRef(newValue); 2374 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 2375 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 2376 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 2377 PrintDebugString(" GlobalRef'd OldActiveDescendentAC: %p", pkg->oldActiveDescendentAccessibleContext); 2378 PrintDebugString(" GlobalRef'd NewActiveDescendentAC: %p", pkg->newActiveDescendentAccessibleContext); 2379 #else // JOBJECT64 is jlong (64 bit) 2380 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 2381 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 2382 PrintDebugString(" GlobalRef'd OldActiveDescendentAC: %016I64X", pkg->oldActiveDescendentAccessibleContext); 2383 PrintDebugString(" GlobalRef'd NewActiveDescendentAC: %016I64X", pkg->newActiveDescendentAccessibleContext); 2384 #endif 2385 2386 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyActiveDescendentChangeEvent); 2387 } 2388 ati = ati->nextATInstance; 2389 } 2390 PrintDebugString(" done with propertyActiveChange event"); 2391 } 2392 2393 /** 2394 * firePropertyValueChange 2395 * 2396 */ 2397 void 2398 JavaAccessBridge::firePropertyTableModelChange(JNIEnv *env, jobject callingObj, 2399 jobject event, jobject source, 2400 jstring oldValue, jstring newValue){ 2401 2402 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyTableModelChange(%p, %p, %p, %p, %p, %p)", 2403 env, callingObj, event, 2404 source, oldValue, newValue); 2405 2406 // sanity check 2407 if (ATs == (AccessBridgeATInstance *) 0) { 2408 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 2409 return; // panic! 2410 } 2411 2412 // common setup 2413 const wchar_t *stringBytes; 2414 char buffer[sizeof(PackageType) + sizeof(PropertyTableModelChangePackage)]; 2415 PackageType *type = (PackageType *) buffer; 2416 PropertyTableModelChangePackage *pkg = (PropertyTableModelChangePackage *) (buffer + sizeof(PackageType)); 2417 *type = cPropertyTableModelChangePackage; 2418 pkg->vmID = (long) dialogWindow; 2419 2420 // make new Global Refs and send events only to those ATs that want 'em 2421 AccessBridgeATInstance *ati = ATs; 2422 while (ati != (AccessBridgeATInstance *) 0) { 2423 if (ati->accessibilityEventMask & cPropertyTableModelChangeEvent) { 2424 2425 PrintDebugString(" sending to AT"); 2426 2427 // make new GlobalRefs for this AT 2428 pkg->Event = (JOBJECT64)env->NewGlobalRef(event); 2429 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); 2430 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 2431 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); 2432 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 2433 #else // JOBJECT64 is jlong (64 bit) 2434 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); 2435 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 2436 #endif 2437 2438 if (oldValue != (jstring) 0) { 2439 stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); 2440 if (stringBytes == NULL) { 2441 if (!env->ExceptionCheck()) { 2442 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 2443 if (cls != NULL) { 2444 env->ThrowNew(cls, NULL); 2445 } 2446 } 2447 return; 2448 } 2449 wcsncpy(pkg->oldValue, stringBytes, (sizeof(pkg->oldValue) / sizeof(wchar_t))); 2450 env->ReleaseStringChars(oldValue, stringBytes); 2451 } else { 2452 wcsncpy(pkg->oldValue, L"(null)", (sizeof(pkg->oldValue) / sizeof(wchar_t))); 2453 } 2454 2455 if (newValue != (jstring) 0) { 2456 stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); 2457 if (stringBytes == NULL) { 2458 if (!env->ExceptionCheck()) { 2459 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 2460 if (cls != NULL) { 2461 env->ThrowNew(cls, NULL); 2462 } 2463 } 2464 return; 2465 } 2466 wcsncpy(pkg->newValue, stringBytes, (sizeof(pkg->newValue) / sizeof(wchar_t))); 2467 env->ReleaseStringChars(newValue, stringBytes); 2468 } else { 2469 wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t))); 2470 } 2471 2472 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTableModelChangeEvent); 2473 } 2474 ati = ati->nextATInstance; 2475 } 2476 PrintDebugString(" done with propertyTableModelChange event"); 2477 } 2478 2479 2480 2481 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) 2482 #define PRINT_GLOBALREFS() \ 2483 PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); \ 2484 PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); 2485 #else // JOBJECT64 is jlong (64 bit) 2486 #define PRINT_GLOBALREFS() \ 2487 PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); \ 2488 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); 2489 #endif 2490 2491 #define FIRE_EVENT(function, packageStruct, packageConstant, eventConstant) \ 2492 void JavaAccessBridge::function(JNIEnv *env, jobject callingObj, \ 2493 jobject eventObj, jobject source) { \ 2494 \ 2495 PrintDebugString("\r\nFiring event id = %d(%p, %p, %p, %p); vmID = %X", \ 2496 eventConstant, env, callingObj, eventObj, source, javaVM); \ 2497 \ 2498 /* sanity check */ \ 2499 if (ATs == (AccessBridgeATInstance *) 0) { \ 2500 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); \ 2501 return; /* panic! */ \ 2502 } \ 2503 \ 2504 /* common setup */ \ 2505 char buffer[sizeof(PackageType) + sizeof(packageStruct)]; \ 2506 PackageType *type = (PackageType *) buffer; \ 2507 packageStruct *pkg = (packageStruct *) (buffer + sizeof(PackageType)); \ 2508 *type = packageConstant; \ 2509 pkg->vmID = (long) dialogWindow; \ 2510 \ 2511 /* make new Global Refs, send events only to those ATs that want 'em */ \ 2512 AccessBridgeATInstance *ati = ATs; \ 2513 while (ati != (AccessBridgeATInstance *) 0) { \ 2514 PrintDebugString("\r\njavaEventMask = %X eventConstant=%d pkg->vmID=%X", \ 2515 ati->javaEventMask, eventConstant, pkg->vmID ); \ 2516 if (ati->javaEventMask & eventConstant) { \ 2517 \ 2518 PrintDebugString(" sending to AT"); \ 2519 /* make new GlobalRefs for this AT */ \ 2520 pkg->Event = (JOBJECT64)env->NewGlobalRef(eventObj); \ 2521 pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); \ 2522 PRINT_GLOBALREFS() \ 2523 \ 2524 ati->sendJavaEventPackage(buffer, sizeof(buffer), eventConstant); \ 2525 } \ 2526 ati = ati->nextATInstance; \ 2527 } \ 2528 PrintDebugString(" done with firing AWT event"); \ 2529 } 2530 2531 void JavaAccessBridge::javaShutdown(JNIEnv *env, jobject callingObj) { 2532 2533 PrintDebugString("\r\nFiring event id = %d(%p, %p); vmID = %X", 2534 cJavaShutdownEvent, env, callingObj, javaVM); 2535 2536 /* sanity check */ 2537 if (ATs == (AccessBridgeATInstance *) 0) { 2538 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); 2539 return; /* panic! */ 2540 } 2541 2542 /* common setup */ 2543 char buffer[sizeof(PackageType) + sizeof(JavaShutdownPackage)]; 2544 PackageType *type = (PackageType *) buffer; 2545 JavaShutdownPackage *pkg = (JavaShutdownPackage *) (buffer + sizeof(PackageType)); 2546 *type = cJavaShutdownPackage; 2547 pkg->vmID = (long) dialogWindow; 2548 2549 /* make new Global Refs, send events only to those ATs that want 'em */ 2550 AccessBridgeATInstance *ati = ATs; 2551 while (ati != (AccessBridgeATInstance *) 0) { 2552 if (ati->javaEventMask & cJavaShutdownEvent) { 2553 PrintDebugString(" sending to AT"); 2554 ati->sendJavaEventPackage(buffer, sizeof(buffer), cJavaShutdownEvent); 2555 } 2556 ati = ati->nextATInstance; 2557 } 2558 PrintDebugString(" done with firing AWT event"); 2559 } 2560 2561 FIRE_EVENT(fireFocusGained, FocusGainedPackage, cFocusGainedPackage, cFocusGainedEvent) 2562 FIRE_EVENT(fireFocusLost, FocusLostPackage, cFocusLostPackage, cFocusLostEvent) 2563 FIRE_EVENT(fireCaretUpdate, CaretUpdatePackage, cCaretUpdatePackage, cCaretUpdateEvent) 2564 FIRE_EVENT(fireMouseClicked, MouseClickedPackage, cMouseClickedPackage, cMouseClickedEvent) 2565 FIRE_EVENT(fireMouseEntered, MouseEnteredPackage, cMouseEnteredPackage, cMouseEnteredEvent) 2566 FIRE_EVENT(fireMouseExited, MouseExitedPackage, cMouseExitedPackage, cMouseExitedEvent) 2567 FIRE_EVENT(fireMousePressed, MousePressedPackage, cMousePressedPackage, cMousePressedEvent) 2568 FIRE_EVENT(fireMouseReleased, MouseReleasedPackage, cMouseReleasedPackage, cMouseReleasedEvent) 2569 FIRE_EVENT(fireMenuCanceled, MenuCanceledPackage, cMenuCanceledPackage, cMenuCanceledEvent) 2570 FIRE_EVENT(fireMenuDeselected, MenuDeselectedPackage, cMenuDeselectedPackage, cMenuDeselectedEvent) 2571 FIRE_EVENT(fireMenuSelected, MenuSelectedPackage, cMenuSelectedPackage, cMenuSelectedEvent) 2572 FIRE_EVENT(firePopupMenuCanceled, PopupMenuCanceledPackage, cPopupMenuCanceledPackage, cPopupMenuCanceledEvent) 2573 FIRE_EVENT(firePopupMenuWillBecomeInvisible, PopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisibleEvent) 2574 FIRE_EVENT(firePopupMenuWillBecomeVisible, PopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisibleEvent) 2575 2576 2577 // ----------------------------- 2578 2579 2580 extern "C" { // event stuff from AccessBridge.h, generated by JNI 2581 2582 JNIEXPORT void JNICALL 2583 Java_com_sun_java_accessibility_AccessBridge_sendDebugString(JNIEnv *env, jobject callingObj, jstring debugStr) { 2584 2585 const wchar_t *stringBytes; 2586 stringBytes = (const wchar_t *) env->GetStringChars(debugStr, 0); 2587 if (stringBytes == NULL) { 2588 if (!env->ExceptionCheck()) { 2589 jclass cls = env->FindClass("java/lang/OutOfMemoryError"); 2590 if (cls != NULL) { 2591 env->ThrowNew(cls, NULL); 2592 } 2593 } 2594 return; 2595 } 2596 wPrintJavaDebugString(L"AccessBridge.java: %ls", stringBytes); 2597 env->ReleaseStringChars(debugStr, stringBytes); 2598 } 2599 2600 JNIEXPORT void JNICALL 2601 Java_com_sun_java_accessibility_AccessBridge_propertyCaretChange(JNIEnv *env, jobject callingObj, 2602 jobject event, jobject source, 2603 jint oldValue, jint newValue) { 2604 theJavaAccessBridge->firePropertyCaretChange(env, callingObj, 2605 event, source, 2606 oldValue, newValue); 2607 } 2608 2609 JNIEXPORT void JNICALL 2610 Java_com_sun_java_accessibility_AccessBridge_propertyDescriptionChange(JNIEnv *env, jobject callingObj, 2611 jobject event, jobject source, 2612 jstring oldValue, jstring newValue) { 2613 theJavaAccessBridge->firePropertyDescriptionChange(env, callingObj, 2614 event, source, 2615 oldValue, newValue); 2616 } 2617 2618 JNIEXPORT void JNICALL 2619 Java_com_sun_java_accessibility_AccessBridge_propertyNameChange(JNIEnv *env, jobject callingObj, 2620 jobject event, jobject source, 2621 jstring oldValue, jstring newValue) { 2622 theJavaAccessBridge->firePropertyNameChange(env, callingObj, 2623 event, source, 2624 oldValue, newValue); 2625 } 2626 2627 JNIEXPORT void JNICALL 2628 Java_com_sun_java_accessibility_AccessBridge_propertySelectionChange(JNIEnv *env, jobject callingObj, 2629 jobject event, jobject source) { 2630 theJavaAccessBridge->firePropertySelectionChange(env, callingObj, 2631 event, source); 2632 } 2633 2634 JNIEXPORT void JNICALL 2635 Java_com_sun_java_accessibility_AccessBridge_propertyStateChange(JNIEnv *env, jobject callingObj, 2636 jobject event, jobject source, 2637 jstring oldValue, jstring newValue) { 2638 theJavaAccessBridge->firePropertyStateChange(env, callingObj, 2639 event, source, 2640 oldValue, newValue); 2641 } 2642 2643 JNIEXPORT void JNICALL 2644 Java_com_sun_java_accessibility_AccessBridge_propertyTextChange(JNIEnv *env, jobject callingObj, 2645 jobject event, jobject source) { 2646 theJavaAccessBridge->firePropertyTextChange(env, callingObj, 2647 event, source); 2648 } 2649 2650 JNIEXPORT void JNICALL 2651 Java_com_sun_java_accessibility_AccessBridge_propertyValueChange(JNIEnv *env, jobject callingObj, 2652 jobject event, jobject source, 2653 jstring oldValue, jstring newValue) { 2654 theJavaAccessBridge->firePropertyValueChange(env, callingObj, 2655 event, source, 2656 oldValue, newValue); 2657 } 2658 2659 JNIEXPORT void JNICALL 2660 Java_com_sun_java_accessibility_AccessBridge_propertyVisibleDataChange(JNIEnv *env, jobject callingObj, 2661 jobject event, jobject source) { 2662 theJavaAccessBridge->firePropertyVisibleDataChange(env, callingObj, 2663 event, source); 2664 } 2665 2666 JNIEXPORT void JNICALL 2667 Java_com_sun_java_accessibility_AccessBridge_propertyChildChange(JNIEnv *env, jobject callingObj, 2668 jobject event, jobject source, 2669 jobject oldValue, jobject newValue) { 2670 theJavaAccessBridge->firePropertyChildChange(env, callingObj, 2671 event, source, 2672 oldValue, newValue); 2673 } 2674 2675 JNIEXPORT void JNICALL 2676 Java_com_sun_java_accessibility_AccessBridge_propertyActiveDescendentChange(JNIEnv *env, jobject callingObj, 2677 jobject event, jobject source, 2678 jobject oldValue, 2679 jobject newValue) { 2680 theJavaAccessBridge->firePropertyActiveDescendentChange(env, callingObj, 2681 event, source, 2682 oldValue, newValue); 2683 } 2684 2685 JNIEXPORT void JNICALL 2686 Java_com_sun_java_accessibility_AccessBridge_propertyTableModelChange(JNIEnv *env, jobject callingObj, 2687 jobject event, jobject source, 2688 jstring oldValue, jstring newValue) { 2689 2690 theJavaAccessBridge->firePropertyTableModelChange(env, callingObj, 2691 event, source, 2692 oldValue, newValue); 2693 } 2694 2695 #define HANDLE_STANDARD_EVENT_FROM_JAVA(function, method) \ 2696 JNIEXPORT void JNICALL \ 2697 function(JNIEnv *env, jobject callingObj, jobject event, jobject source) { \ 2698 theJavaAccessBridge->method(env, callingObj, event, source); \ 2699 } 2700 2701 2702 JNIEXPORT void JNICALL 2703 Java_com_sun_java_accessibility_AccessBridge_javaShutdown(JNIEnv *env, jobject callingObj) { 2704 theJavaAccessBridge->javaShutdown(env, callingObj); 2705 } 2706 2707 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_focusGained, fireFocusGained) 2708 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_focusLost, fireFocusLost) 2709 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_caretUpdate, fireCaretUpdate) 2710 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseClicked, fireMouseClicked) 2711 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseEntered, fireMouseEntered) 2712 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseExited, fireMouseExited) 2713 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mousePressed, fireMousePressed) 2714 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseReleased, fireMouseReleased) 2715 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuCanceled, fireMenuCanceled) 2716 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuDeselected, fireMenuDeselected) 2717 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuSelected, fireMenuSelected) 2718 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuCanceled, firePopupMenuCanceled) 2719 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuWillBecomeInvisible, firePopupMenuWillBecomeInvisible) 2720 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuWillBecomeVisible, firePopupMenuWillBecomeVisible) 2721 2722 /* 2723 * Map a HWND to a Java component 2724 * 2725 * Class: com_sun_java_accessibility_AccessBridge 2726 * Method: jawtGetComponentFromNativeWindowHandle 2727 * Signature: (I)Ljava/awt/Component; 2728 */ 2729 JNIEXPORT jobject JNICALL 2730 Java_com_sun_java_accessibility_AccessBridge_jawtGetComponentFromNativeWindowHandle 2731 (JNIEnv *env, jobject callingObj, jint windowHandle) { 2732 2733 JAWT awt; 2734 jboolean result; 2735 jobject component = (jobject)0; 2736 2737 // Get the AWT 2738 awt.version = JAWT_VERSION_1_4; 2739 result = JAWT_GetAWT(env, &awt); 2740 if (result == JNI_FALSE) { 2741 return (jobject)0; 2742 } 2743 2744 // Get the component 2745 return awt.GetComponent(env, (void *)windowHandle); 2746 } 2747 2748 2749 /* 2750 * Map a Java component to a HWND 2751 * 2752 * Class: com_sun_java_accessibility_AccessBridge 2753 * Method: jawtGetNativeWindowHandleFromComponent 2754 * Signature: (Ljava/awt/Component;)I 2755 */ 2756 JNIEXPORT jint JNICALL 2757 Java_com_sun_java_accessibility_AccessBridge_jawtGetNativeWindowHandleFromComponent 2758 (JNIEnv *env, jobject callingObj, jobject component) { 2759 2760 JAWT awt; 2761 JAWT_DrawingSurface* ds; 2762 JAWT_DrawingSurfaceInfo* dsi; 2763 JAWT_Win32DrawingSurfaceInfo* dsi_win; 2764 jboolean result; 2765 // jint lock; 2766 jint windowHandle = -1; 2767 2768 // Get the AWT 2769 awt.version = JAWT_VERSION_1_4; 2770 result = JAWT_GetAWT(env, &awt); 2771 if (result == JNI_FALSE) { 2772 return -1; 2773 } 2774 2775 // Get the drawing surface 2776 ds = awt.GetDrawingSurface(env, component); 2777 if (ds == NULL) { 2778 return -1; 2779 } 2780 2781 // Get the drawing surface info 2782 dsi = ds->GetDrawingSurfaceInfo(ds); 2783 2784 // Get the platform-specific drawing info 2785 dsi_win = (JAWT_Win32DrawingSurfaceInfo *)dsi->platformInfo; 2786 2787 // Get the window handle 2788 windowHandle = (jint)dsi_win->hwnd; 2789 2790 // Free the drawing surface info 2791 ds->FreeDrawingSurfaceInfo(dsi); 2792 2793 // Free the drawing surface 2794 awt.FreeDrawingSurface(ds); 2795 2796 return windowHandle; 2797 } 2798 2799 }