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