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