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