1 /*
2  * Copyright (c) 2005, 2019, 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      */
DllMain(HINSTANCE hinstDll,DWORD fdwReason,LPVOID lpvReserved)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
Java_com_sun_java_accessibility_internal_AccessBridge_runDLL(JNIEnv * env,jobject obj)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      */
AccessBridgeDialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)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  */
JavaAccessBridge(HINSTANCE hInstance)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  */
~JavaAccessBridge()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
javaRun(JNIEnv * env,jobject obj)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
initWindow()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
postHelloToWindowsDLLMsg(HWND destHwnd)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
sendPackage(char * buffer,int bufsize,HWND destHwnd)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
sendJavaEventPackage(char * buffer,int bufsize,long type)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
sendAccessibilityEventPackage(char * buffer,int bufsize,long type)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
receiveMemoryPackage(HWND srcWindow,long bufsize)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
processPackage(char * buffer,int bufsize)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
MemoryMappedFileCreated(HWND ATBridgeDLLWindow,char * filename)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
WindowsATDestroyed(HWND ATBridgeDLLWindow)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
releaseJavaObject(jobject object)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
addJavaEventNotification(jlong type,HWND DLLwindow)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
removeJavaEventNotification(jlong type,HWND DLLwindow)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
addAccessibilityEventNotification(jlong type,HWND DLLwindow)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
removeAccessibilityEventNotification(jlong type,HWND DLLwindow)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
firePropertyCaretChange(JNIEnv * env,jobject callingObj,jobject event,jobject source,jint oldValue,jint newValue)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
firePropertyDescriptionChange(JNIEnv * env,jobject callingObj,jobject event,jobject source,jstring oldValue,jstring newValue)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
firePropertyNameChange(JNIEnv * env,jobject callingObj,jobject event,jobject source,jstring oldValue,jstring newValue)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
firePropertySelectionChange(JNIEnv * env,jobject callingObj,jobject event,jobject source)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
firePropertyStateChange(JNIEnv * env,jobject callingObj,jobject event,jobject source,jstring oldValue,jstring newValue)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
firePropertyTextChange(JNIEnv * env,jobject callingObj,jobject event,jobject source)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
firePropertyValueChange(JNIEnv * env,jobject callingObj,jobject event,jobject source,jstring oldValue,jstring newValue)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
firePropertyVisibleDataChange(JNIEnv * env,jobject callingObj,jobject event,jobject source)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
firePropertyChildChange(JNIEnv * env,jobject callingObj,jobject event,jobject source,jobject oldValue,jobject newValue)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
firePropertyActiveDescendentChange(JNIEnv * env,jobject callingObj,jobject event,jobject source,jobject oldValue,jobject newValue)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
firePropertyTableModelChange(JNIEnv * env,jobject callingObj,jobject event,jobject source,jstring oldValue,jstring newValue)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 
javaShutdown(JNIEnv * env,jobject callingObj)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 
FIRE_EVENT(fireFocusGained,FocusGainedPackage,cFocusGainedPackage,cFocusGainedEvent)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 }
2784