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