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