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