Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/jdk.accessibility/windows/native/libjavaaccessbridge/AccessBridgeJavaEntryPoints.cpp
40957 views
1
/*
2
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
/*
27
* A class to manage JNI calls into AccessBridge.java
28
*/
29
30
#include "AccessBridgeJavaEntryPoints.h"
31
#include "AccessBridgeDebug.h"
32
33
34
35
/**
36
* Initialize the AccessBridgeJavaEntryPoints class
37
*
38
*/
39
AccessBridgeJavaEntryPoints::AccessBridgeJavaEntryPoints(JNIEnv *jniEnvironment,
40
jobject bridgeObject) {
41
jniEnv = jniEnvironment;
42
accessBridgeObject = (jobject)bridgeObject;
43
PrintDebugString("[INFO]: AccessBridgeJavaEntryPoints(%p, %p) called", jniEnv, accessBridgeObject);
44
}
45
46
47
/**
48
* Destructor
49
*
50
*/
51
AccessBridgeJavaEntryPoints::~AccessBridgeJavaEntryPoints() {
52
}
53
54
// -----------------------------------
55
56
#define FIND_CLASS(classRef, className) \
57
localClassRef = jniEnv->FindClass(className); \
58
if (localClassRef == (jclass) 0) { \
59
PrintDebugString("[ERROR]: FindClass(%s) failed! -> jniEnv = %p", className, jniEnv); \
60
return FALSE; \
61
} \
62
classRef = (jclass) jniEnv->NewGlobalRef(localClassRef); \
63
jniEnv->DeleteLocalRef(localClassRef); \
64
if (classRef == (jclass) 0) { \
65
PrintDebugString("[ERROR]: FindClass(%s) failed! -> (ran out of RAM)", className); \
66
return FALSE; \
67
}
68
69
70
#define FIND_METHOD(methodID, classRef, methodString, methodSignature); \
71
methodID = jniEnv->GetMethodID(classRef, methodString, methodSignature); \
72
if (methodID == (jmethodID) 0) { \
73
PrintDebugString("[ERROR]: GetMethodID(%s) failed! -> jniEnv = %p; classRef = %p", methodString, jniEnv, classRef); \
74
return FALSE; \
75
}
76
77
#define EXCEPTION_CHECK(situationDescription, returnVal) \
78
if (exception = jniEnv->ExceptionOccurred()) { \
79
PrintDebugString("[ERROR]: *** Exception occured while doing: %s; returning %d", situationDescription, returnVal); \
80
jniEnv->ExceptionDescribe(); \
81
jniEnv->ExceptionClear(); \
82
return (returnVal); \
83
}
84
85
#define EXCEPTION_CHECK_VOID(situationDescription) \
86
if (exception = jniEnv->ExceptionOccurred()) { \
87
PrintDebugString("[ERROR]: *** Exception occured while doing: %s", situationDescription); \
88
jniEnv->ExceptionDescribe(); \
89
jniEnv->ExceptionClear(); \
90
return; \
91
}
92
93
/**
94
* Make all of the getClass() & getMethod() calls
95
*
96
*/
97
BOOL
98
AccessBridgeJavaEntryPoints::BuildJavaEntryPoints() {
99
jclass localClassRef;
100
101
PrintDebugString("[INFO]: Calling BuildJavaEntryPoints():");
102
103
FIND_CLASS(bridgeClass, "com/sun/java/accessibility/internal/AccessBridge");
104
105
// ------- general methods
106
107
// GetMethodID(decrementReference)
108
FIND_METHOD(decrementReferenceMethod, bridgeClass,
109
"decrementReference",
110
"(Ljava/lang/Object;)V");
111
112
// GetMethodID(getJavaVersionPropertyMethod)
113
FIND_METHOD(getJavaVersionPropertyMethod, bridgeClass,
114
"getJavaVersionProperty",
115
"()Ljava/lang/String;");
116
117
// ------- Window methods
118
119
// GetMethodID(isJavaWindow)
120
FIND_METHOD(isJavaWindowMethod, bridgeClass,
121
"isJavaWindow",
122
"(I)Z");
123
124
// GetMethodID(getAccessibleContextFromHWND)
125
FIND_METHOD(getAccessibleContextFromHWNDMethod, bridgeClass,
126
"getContextFromNativeWindowHandle",
127
"(I)Ljavax/accessibility/AccessibleContext;");
128
129
// GetMethodID(getHWNDFromAccessibleContext)
130
FIND_METHOD(getHWNDFromAccessibleContextMethod, bridgeClass,
131
"getNativeWindowHandleFromContext",
132
"(Ljavax/accessibility/AccessibleContext;)I");
133
134
// GetMethodID(getAccessibleParentFromContext)
135
FIND_METHOD(getAccessibleParentFromContextMethod, bridgeClass,
136
"getAccessibleParentFromContext",
137
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
138
139
// ===== utility methods ===== */
140
141
// GetMethodID(setTextContents)
142
FIND_METHOD(setTextContentsMethod, bridgeClass,
143
"setTextContents",
144
"(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Z");
145
146
// GetMethodID(getParentWithRole)
147
FIND_METHOD(getParentWithRoleMethod, bridgeClass,
148
"getParentWithRole",
149
"(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Ljavax/accessibility/AccessibleContext;");
150
151
// GetMethodID(getTopLevelObject)
152
FIND_METHOD(getTopLevelObjectMethod, bridgeClass,
153
"getTopLevelObject",
154
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
155
156
// GetMethodID(getParentWithRoleElseRoot)
157
FIND_METHOD(getParentWithRoleElseRootMethod, bridgeClass,
158
"getParentWithRoleElseRoot",
159
"(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Ljavax/accessibility/AccessibleContext;");
160
161
// GetMethodID(getObjectDepth)
162
FIND_METHOD(getObjectDepthMethod, bridgeClass,
163
"getObjectDepth",
164
"(Ljavax/accessibility/AccessibleContext;)I");
165
166
// GetMethodID(getActiveDescendent)
167
FIND_METHOD(getActiveDescendentMethod, bridgeClass,
168
"getActiveDescendent",
169
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
170
171
// ------- AccessibleContext methods
172
173
// GetMethodID(getAccessibleContextAt)
174
FIND_METHOD(getAccessibleContextAtMethod, bridgeClass,
175
"getAccessibleContextAt",
176
"(IILjavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
177
178
// GetMethodID(getAccessibleContextWithFocus)
179
FIND_METHOD(getAccessibleContextWithFocusMethod, bridgeClass,
180
"getAccessibleContextWithFocus",
181
"()Ljavax/accessibility/AccessibleContext;");
182
183
// GetMethodID(getAccessibleNameFromContext)
184
FIND_METHOD(getAccessibleNameFromContextMethod, bridgeClass,
185
"getAccessibleNameFromContext",
186
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
187
188
// GetMethodID(getAccessibleDescriptionFromContext)
189
FIND_METHOD(getAccessibleDescriptionFromContextMethod, bridgeClass,
190
"getAccessibleDescriptionFromContext",
191
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
192
193
// GetMethodID(getAccessibleRoleStringFromContext)
194
FIND_METHOD(getAccessibleRoleStringFromContextMethod, bridgeClass,
195
"getAccessibleRoleStringFromContext",
196
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
197
198
// GetMethodID(getAccessibleRoleStringFromContext_en_US)
199
FIND_METHOD(getAccessibleRoleStringFromContext_en_USMethod, bridgeClass,
200
"getAccessibleRoleStringFromContext_en_US",
201
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
202
203
// GetMethodID(getAccessibleStatesStringFromContext)
204
FIND_METHOD(getAccessibleStatesStringFromContextMethod, bridgeClass,
205
"getAccessibleStatesStringFromContext",
206
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
207
208
// GetMethodID(getAccessibleStatesStringFromContext_en_US)
209
FIND_METHOD(getAccessibleStatesStringFromContext_en_USMethod, bridgeClass,
210
"getAccessibleStatesStringFromContext_en_US",
211
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
212
213
// GetMethodID(getAccessibleParentFromContext)
214
FIND_METHOD(getAccessibleParentFromContextMethod, bridgeClass,
215
"getAccessibleParentFromContext",
216
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
217
218
// GetMethodID(getAccessibleIndexInParentFromContext)
219
FIND_METHOD(getAccessibleIndexInParentFromContextMethod, bridgeClass,
220
"getAccessibleIndexInParentFromContext",
221
"(Ljavax/accessibility/AccessibleContext;)I");
222
223
// GetMethodID(getAccessibleChildrenCountFromContext)
224
FIND_METHOD(getAccessibleChildrenCountFromContextMethod, bridgeClass,
225
"getAccessibleChildrenCountFromContext",
226
"(Ljavax/accessibility/AccessibleContext;)I");
227
228
// GetMethodID(getAccessibleChildFromContext)
229
FIND_METHOD(getAccessibleChildFromContextMethod, bridgeClass,
230
"getAccessibleChildFromContext",
231
"(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;");
232
233
// GetMethodID(getAccessibleBoundsOnScreenFromContext)
234
FIND_METHOD(getAccessibleBoundsOnScreenFromContextMethod, bridgeClass,
235
"getAccessibleBoundsOnScreenFromContext",
236
"(Ljavax/accessibility/AccessibleContext;)Ljava/awt/Rectangle;");
237
238
// GetMethodID(getAccessibleXcoordFromContext)
239
FIND_METHOD(getAccessibleXcoordFromContextMethod, bridgeClass,
240
"getAccessibleXcoordFromContext",
241
"(Ljavax/accessibility/AccessibleContext;)I");
242
243
// GetMethodID(getAccessibleYcoordFromContext)
244
FIND_METHOD(getAccessibleYcoordFromContextMethod, bridgeClass,
245
"getAccessibleYcoordFromContext",
246
"(Ljavax/accessibility/AccessibleContext;)I");
247
248
// GetMethodID(getAccessibleHeightFromContext)
249
FIND_METHOD(getAccessibleHeightFromContextMethod, bridgeClass,
250
"getAccessibleHeightFromContext",
251
"(Ljavax/accessibility/AccessibleContext;)I");
252
253
// GetMethodID(getAccessibleWidthFromContext)
254
FIND_METHOD(getAccessibleWidthFromContextMethod, bridgeClass,
255
"getAccessibleWidthFromContext",
256
"(Ljavax/accessibility/AccessibleContext;)I");
257
258
// GetMethodID(getAccessibleComponentFromContext)
259
FIND_METHOD(getAccessibleComponentFromContextMethod, bridgeClass,
260
"getAccessibleComponentFromContext",
261
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleComponent;");
262
263
// GetMethodID(getAccessibleActionFromContext)
264
FIND_METHOD(getAccessibleActionFromContextMethod, bridgeClass,
265
"getAccessibleActionFromContext",
266
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleAction;");
267
268
// GetMethodID(getAccessibleSelectionFromContext)
269
FIND_METHOD(getAccessibleSelectionFromContextMethod, bridgeClass,
270
"getAccessibleSelectionFromContext",
271
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleSelection;");
272
273
// GetMethodID(getAccessibleTextFromContext)
274
FIND_METHOD(getAccessibleTextFromContextMethod, bridgeClass,
275
"getAccessibleTextFromContext",
276
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleText;");
277
278
// GetMethodID(getAccessibleValueFromContext)
279
FIND_METHOD(getAccessibleValueFromContextMethod, bridgeClass,
280
"getAccessibleValueFromContext",
281
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleValue;");
282
283
284
// ------- begin AccessibleTable methods
285
286
// GetMethodID(getAccessibleTableFromContext)
287
FIND_METHOD(getAccessibleTableFromContextMethod, bridgeClass,
288
"getAccessibleTableFromContext",
289
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleTable;");
290
291
// GetMethodID(getContextFromAccessibleTable)
292
FIND_METHOD(getContextFromAccessibleTableMethod, bridgeClass,
293
"getContextFromAccessibleTable",
294
"(Ljavax/accessibility/AccessibleTable;)Ljavax/accessibility/AccessibleContext;");
295
296
// GetMethodID(getAccessibleTableRowHeader)
297
FIND_METHOD(getAccessibleTableRowHeaderMethod, bridgeClass,
298
"getAccessibleTableRowHeader",
299
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleTable;");
300
301
302
// GetMethodID(getAccessibleTableColumnHeader)
303
FIND_METHOD(getAccessibleTableColumnHeaderMethod, bridgeClass,
304
"getAccessibleTableColumnHeader",
305
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleTable;");
306
307
308
// GetMethodID(getAccessibleTableRowCount)
309
FIND_METHOD(getAccessibleTableRowCountMethod, bridgeClass,
310
"getAccessibleTableRowCount",
311
"(Ljavax/accessibility/AccessibleContext;)I");
312
313
// GetMethodID(getAccessibleTableColumnCount)
314
FIND_METHOD(getAccessibleTableColumnCountMethod, bridgeClass,
315
"getAccessibleTableColumnCount",
316
"(Ljavax/accessibility/AccessibleContext;)I");
317
318
// GetMethodID(getAccessibleTableCellAccessibleContext)
319
FIND_METHOD(getAccessibleTableCellAccessibleContextMethod, bridgeClass,
320
"getAccessibleTableCellAccessibleContext",
321
"(Ljavax/accessibility/AccessibleTable;II)Ljavax/accessibility/AccessibleContext;");
322
323
// GetMethodID(getAccessibleTableCellIndex)
324
FIND_METHOD(getAccessibleTableCellIndexMethod, bridgeClass,
325
"getAccessibleTableCellIndex",
326
"(Ljavax/accessibility/AccessibleTable;II)I");
327
328
// GetMethodID(getAccessibleTableCellRowExtent)
329
FIND_METHOD(getAccessibleTableCellRowExtentMethod, bridgeClass,
330
"getAccessibleTableCellRowExtent",
331
"(Ljavax/accessibility/AccessibleTable;II)I");
332
333
// GetMethodID(getAccessibleTableCellColumnExtent)
334
FIND_METHOD(getAccessibleTableCellColumnExtentMethod, bridgeClass,
335
"getAccessibleTableCellColumnExtent",
336
"(Ljavax/accessibility/AccessibleTable;II)I");
337
338
// GetMethodID(isAccessibleTableCellSelected)
339
FIND_METHOD(isAccessibleTableCellSelectedMethod, bridgeClass,
340
"isAccessibleTableCellSelected",
341
"(Ljavax/accessibility/AccessibleTable;II)Z");
342
343
// GetMethodID(getAccessibleTableRowHeaderRowCount)
344
FIND_METHOD(getAccessibleTableRowHeaderRowCountMethod, bridgeClass,
345
"getAccessibleTableRowHeaderRowCount",
346
"(Ljavax/accessibility/AccessibleContext;)I");
347
348
// GetMethodID(getAccessibleTableColumnHeaderRowCount)
349
FIND_METHOD(getAccessibleTableColumnHeaderRowCountMethod, bridgeClass,
350
"getAccessibleTableColumnHeaderRowCount",
351
"(Ljavax/accessibility/AccessibleContext;)I");
352
353
// GetMethodID(getAccessibleTableRowHeaderColumnCount)
354
FIND_METHOD(getAccessibleTableRowHeaderColumnCountMethod, bridgeClass,
355
"getAccessibleTableRowHeaderColumnCount",
356
"(Ljavax/accessibility/AccessibleContext;)I");
357
358
// GetMethodID(getAccessibleTableColumnHeaderColumnCount)
359
FIND_METHOD(getAccessibleTableColumnHeaderColumnCountMethod, bridgeClass,
360
"getAccessibleTableColumnHeaderColumnCount",
361
"(Ljavax/accessibility/AccessibleContext;)I");
362
363
// GetMethodID(getAccessibleTableRowDescription)
364
FIND_METHOD(getAccessibleTableRowDescriptionMethod, bridgeClass,
365
"getAccessibleTableRowDescription",
366
"(Ljavax/accessibility/AccessibleTable;I)Ljavax/accessibility/AccessibleContext;");
367
368
// GetMethodID(getAccessibleTableColumnDescription)
369
FIND_METHOD(getAccessibleTableColumnDescriptionMethod, bridgeClass,
370
"getAccessibleTableColumnDescription",
371
"(Ljavax/accessibility/AccessibleTable;I)Ljavax/accessibility/AccessibleContext;");
372
373
// GetMethodID(getAccessibleTableRowSelectionCount)
374
FIND_METHOD(getAccessibleTableRowSelectionCountMethod, bridgeClass,
375
"getAccessibleTableRowSelectionCount",
376
"(Ljavax/accessibility/AccessibleTable;)I");
377
378
// GetMethodID(isAccessibleTableRowSelected)
379
FIND_METHOD(isAccessibleTableRowSelectedMethod, bridgeClass,
380
"isAccessibleTableRowSelected",
381
"(Ljavax/accessibility/AccessibleTable;I)Z");
382
383
// GetMethodID(getAccessibleTableRowSelections)
384
FIND_METHOD(getAccessibleTableRowSelectionsMethod, bridgeClass,
385
"getAccessibleTableRowSelections",
386
"(Ljavax/accessibility/AccessibleTable;I)I");
387
388
// GetMethodID(getAccessibleTableColumnSelectionCount)
389
FIND_METHOD(getAccessibleTableColumnSelectionCountMethod, bridgeClass,
390
"getAccessibleTableColumnSelectionCount",
391
"(Ljavax/accessibility/AccessibleTable;)I");
392
393
// GetMethodID(isAccessibleTableColumnSelected)
394
FIND_METHOD(isAccessibleTableColumnSelectedMethod, bridgeClass,
395
"isAccessibleTableColumnSelected",
396
"(Ljavax/accessibility/AccessibleTable;I)Z");
397
398
// GetMethodID(getAccessibleTableColumnSelections)
399
FIND_METHOD(getAccessibleTableColumnSelectionsMethod, bridgeClass,
400
"getAccessibleTableColumnSelections",
401
"(Ljavax/accessibility/AccessibleTable;I)I");
402
403
// GetMethodID(getAccessibleTableRow)
404
FIND_METHOD(getAccessibleTableRowMethod, bridgeClass,
405
"getAccessibleTableRow",
406
"(Ljavax/accessibility/AccessibleTable;I)I");
407
408
// GetMethodID(getAccessibleTableColumn)
409
FIND_METHOD(getAccessibleTableColumnMethod, bridgeClass,
410
"getAccessibleTableColumn",
411
"(Ljavax/accessibility/AccessibleTable;I)I");
412
413
// GetMethodID(getAccessibleTableIndex)
414
FIND_METHOD(getAccessibleTableIndexMethod, bridgeClass,
415
"getAccessibleTableIndex",
416
"(Ljavax/accessibility/AccessibleTable;II)I");
417
418
/* ------- end AccessibleTable methods */
419
420
/* start AccessibleRelationSet methods ----- */
421
422
// GetMethodID(getAccessibleRelationCount)
423
FIND_METHOD(getAccessibleRelationCountMethod, bridgeClass,
424
"getAccessibleRelationCount",
425
"(Ljavax/accessibility/AccessibleContext;)I");
426
427
// GetMethodID(getAccessibleRelationKey)
428
FIND_METHOD(getAccessibleRelationKeyMethod, bridgeClass,
429
"getAccessibleRelationKey",
430
"(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
431
432
// GetMethodID(getAccessibleRelationTargetCount)
433
FIND_METHOD(getAccessibleRelationTargetCountMethod, bridgeClass,
434
"getAccessibleRelationTargetCount",
435
"(Ljavax/accessibility/AccessibleContext;I)I");
436
437
// GetMethodID(getAccessibleRelationTarget)
438
FIND_METHOD(getAccessibleRelationTargetMethod, bridgeClass,
439
"getAccessibleRelationTarget",
440
"(Ljavax/accessibility/AccessibleContext;II)Ljavax/accessibility/AccessibleContext;");
441
442
443
// ------- AccessibleHypertext methods
444
445
// GetMethodID(getAccessibleHypertext)
446
FIND_METHOD(getAccessibleHypertextMethod, bridgeClass,
447
"getAccessibleHypertext",
448
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleHypertext;");
449
450
// GetMethodID(activateAccessibleHyperlink)
451
FIND_METHOD(activateAccessibleHyperlinkMethod, bridgeClass,
452
"activateAccessibleHyperlink",
453
"(Ljavax/accessibility/AccessibleContext;Ljavax/accessibility/AccessibleHyperlink;)Z");
454
455
// GetMethodID(getAccessibleHyperlinkCount)
456
FIND_METHOD(getAccessibleHyperlinkCountMethod, bridgeClass,
457
"getAccessibleHyperlinkCount",
458
"(Ljavax/accessibility/AccessibleContext;)I");
459
460
// GetMethodID(getAccessibleHyperlink)
461
FIND_METHOD(getAccessibleHyperlinkMethod, bridgeClass,
462
"getAccessibleHyperlink",
463
"(Ljavax/accessibility/AccessibleHypertext;I)Ljavax/accessibility/AccessibleHyperlink;");
464
465
// GetMethodID(getAccessibleHyperlinkText)
466
FIND_METHOD(getAccessibleHyperlinkTextMethod, bridgeClass,
467
"getAccessibleHyperlinkText",
468
"(Ljavax/accessibility/AccessibleHyperlink;)Ljava/lang/String;");
469
470
// GetMethodID(getAccessibleHyperlinkURL)
471
FIND_METHOD(getAccessibleHyperlinkURLMethod, bridgeClass,
472
"getAccessibleHyperlinkURL",
473
"(Ljavax/accessibility/AccessibleHyperlink;)Ljava/lang/String;");
474
475
// GetMethodID(getAccessibleHyperlinkStartIndex)
476
FIND_METHOD(getAccessibleHyperlinkStartIndexMethod, bridgeClass,
477
"getAccessibleHyperlinkStartIndex",
478
"(Ljavax/accessibility/AccessibleHyperlink;)I");
479
480
// GetMethodID(getAccessibleHyperlinkEndIndex)
481
FIND_METHOD(getAccessibleHyperlinkEndIndexMethod, bridgeClass,
482
"getAccessibleHyperlinkEndIndex",
483
"(Ljavax/accessibility/AccessibleHyperlink;)I");
484
485
// GetMethodID(getAccessibleHypertextLinkIndex)
486
FIND_METHOD(getAccessibleHypertextLinkIndexMethod, bridgeClass,
487
"getAccessibleHypertextLinkIndex",
488
"(Ljavax/accessibility/AccessibleHypertext;I)I");
489
490
// Accessible KeyBinding, Icon and Action ====================
491
492
// GetMethodID(getAccessibleKeyBindingsCount)
493
FIND_METHOD(getAccessibleKeyBindingsCountMethod, bridgeClass,
494
"getAccessibleKeyBindingsCount",
495
"(Ljavax/accessibility/AccessibleContext;)I");
496
497
// GetMethodID(getAccessibleKeyBindingChar)
498
FIND_METHOD(getAccessibleKeyBindingCharMethod, bridgeClass,
499
"getAccessibleKeyBindingChar",
500
"(Ljavax/accessibility/AccessibleContext;I)C");
501
502
// GetMethodID(getAccessibleKeyBindingModifiers)
503
FIND_METHOD(getAccessibleKeyBindingModifiersMethod, bridgeClass,
504
"getAccessibleKeyBindingModifiers",
505
"(Ljavax/accessibility/AccessibleContext;I)I");
506
507
// GetMethodID(getAccessibleIconsCount)
508
FIND_METHOD(getAccessibleIconsCountMethod, bridgeClass,
509
"getAccessibleIconsCount",
510
"(Ljavax/accessibility/AccessibleContext;)I");
511
512
// GetMethodID(getAccessibleIconDescription)
513
FIND_METHOD(getAccessibleIconDescriptionMethod, bridgeClass,
514
"getAccessibleIconDescription",
515
"(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
516
517
// GetMethodID(getAccessibleIconHeight)
518
FIND_METHOD(getAccessibleIconHeightMethod, bridgeClass,
519
"getAccessibleIconHeight",
520
"(Ljavax/accessibility/AccessibleContext;I)I");
521
522
// GetMethodID(getAccessibleIconWidth)
523
FIND_METHOD(getAccessibleIconWidthMethod, bridgeClass,
524
"getAccessibleIconWidth",
525
"(Ljavax/accessibility/AccessibleContext;I)I");
526
527
// GetMethodID(getAccessibleActionsCount)
528
FIND_METHOD(getAccessibleActionsCountMethod, bridgeClass,
529
"getAccessibleActionsCount",
530
"(Ljavax/accessibility/AccessibleContext;)I");
531
532
// GetMethodID(getAccessibleActionName)
533
FIND_METHOD(getAccessibleActionNameMethod, bridgeClass,
534
"getAccessibleActionName",
535
"(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
536
537
// GetMethodID(doAccessibleActions)
538
FIND_METHOD(doAccessibleActionsMethod, bridgeClass,
539
"doAccessibleActions",
540
"(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Z");
541
542
// ------- AccessibleText methods
543
544
// GetMethodID(getAccessibleCharCountFromContext)
545
FIND_METHOD(getAccessibleCharCountFromContextMethod, bridgeClass,
546
"getAccessibleCharCountFromContext",
547
"(Ljavax/accessibility/AccessibleContext;)I");
548
549
// GetMethodID(getAccessibleCaretPositionFromContext)
550
FIND_METHOD(getAccessibleCaretPositionFromContextMethod, bridgeClass,
551
"getAccessibleCaretPositionFromContext",
552
"(Ljavax/accessibility/AccessibleContext;)I");
553
554
// GetMethodID(getAccessibleIndexAtPointFromContext)
555
FIND_METHOD(getAccessibleIndexAtPointFromContextMethod, bridgeClass,
556
"getAccessibleIndexAtPointFromContext",
557
"(Ljavax/accessibility/AccessibleContext;II)I");
558
559
// GetMethodID(getAccessibleLetterAtIndexFromContext)
560
FIND_METHOD(getAccessibleLetterAtIndexFromContextMethod, bridgeClass,
561
"getAccessibleLetterAtIndexFromContext",
562
"(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
563
564
// GetMethodID(getAccessibleWordAtIndexFromContext)
565
FIND_METHOD(getAccessibleWordAtIndexFromContextMethod, bridgeClass,
566
"getAccessibleWordAtIndexFromContext",
567
"(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
568
569
// GetMethodID(getAccessibleSentenceAtIndexFromContext)
570
FIND_METHOD(getAccessibleSentenceAtIndexFromContextMethod, bridgeClass,
571
"getAccessibleSentenceAtIndexFromContext",
572
"(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
573
574
// GetMethodID(getAccessibleTextSelectionStartFromContext)
575
FIND_METHOD(getAccessibleTextSelectionStartFromContextMethod, bridgeClass,
576
"getAccessibleTextSelectionStartFromContext",
577
"(Ljavax/accessibility/AccessibleContext;)I");
578
579
// GetMethodID(getAccessibleTextSelectionEndFromContext)
580
FIND_METHOD(getAccessibleTextSelectionEndFromContextMethod, bridgeClass,
581
"getAccessibleTextSelectionEndFromContext",
582
"(Ljavax/accessibility/AccessibleContext;)I");
583
584
// GetMethodID(getAccessibleTextSelectedTextFromContext)
585
FIND_METHOD(getAccessibleTextSelectedTextFromContextMethod, bridgeClass,
586
"getAccessibleTextSelectedTextFromContext",
587
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
588
589
// GetMethodID(getAccessibleAttributesAtIndexFromContext)
590
FIND_METHOD(getAccessibleAttributesAtIndexFromContextMethod, bridgeClass,
591
"getAccessibleAttributesAtIndexFromContext",
592
"(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
593
594
// GetMethodID(getAccessibleAttributeSetAtIndexFromContext)
595
FIND_METHOD(getAccessibleAttributeSetAtIndexFromContextMethod, bridgeClass,
596
"getAccessibleAttributeSetAtIndexFromContext",
597
"(Ljavax/accessibility/AccessibleContext;I)Ljavax/swing/text/AttributeSet;");
598
599
// GetMethodID(getAccessibleTextRectAtIndexFromContext)
600
FIND_METHOD(getAccessibleTextRectAtIndexFromContextMethod, bridgeClass,
601
"getAccessibleTextRectAtIndexFromContext",
602
"(Ljavax/accessibility/AccessibleContext;I)Ljava/awt/Rectangle;");
603
604
// GetMethodID(getAccessibleXcoordTextRectAtIndexFromContext)
605
FIND_METHOD(getAccessibleXcoordTextRectAtIndexFromContextMethod, bridgeClass,
606
"getAccessibleXcoordTextRectAtIndexFromContext",
607
"(Ljavax/accessibility/AccessibleContext;I)I");
608
609
// GetMethodID(getAccessibleYcoordTextRectAtIndexFromContext)
610
FIND_METHOD(getAccessibleYcoordTextRectAtIndexFromContextMethod, bridgeClass,
611
"getAccessibleYcoordTextRectAtIndexFromContext",
612
"(Ljavax/accessibility/AccessibleContext;I)I");
613
614
// GetMethodID(getAccessibleHeightTextRectAtIndexFromContext)
615
FIND_METHOD(getAccessibleHeightTextRectAtIndexFromContextMethod, bridgeClass,
616
"getAccessibleHeightTextRectAtIndexFromContext",
617
"(Ljavax/accessibility/AccessibleContext;I)I");
618
619
// GetMethodID(getAccessibleWidthTextRectAtIndexFromContext)
620
FIND_METHOD(getAccessibleWidthTextRectAtIndexFromContextMethod, bridgeClass,
621
"getAccessibleWidthTextRectAtIndexFromContext",
622
"(Ljavax/accessibility/AccessibleContext;I)I");
623
624
// GetMethodID(getCaretLocationX)
625
FIND_METHOD(getCaretLocationXMethod, bridgeClass,
626
"getCaretLocationX",
627
"(Ljavax/accessibility/AccessibleContext;)I");
628
629
// GetMethodID(getCaretLocationY)
630
FIND_METHOD(getCaretLocationYMethod, bridgeClass,
631
"getCaretLocationY",
632
"(Ljavax/accessibility/AccessibleContext;)I");
633
634
// GetMethodID(getCaretLocationHeight)
635
FIND_METHOD(getCaretLocationHeightMethod, bridgeClass,
636
"getCaretLocationHeight",
637
"(Ljavax/accessibility/AccessibleContext;)I");
638
639
// GetMethodID(getCaretLocationWidth)
640
FIND_METHOD(getCaretLocationWidthMethod, bridgeClass,
641
"getCaretLocationWidth",
642
"(Ljavax/accessibility/AccessibleContext;)I");
643
644
645
// GetMethodID(getAccessibleTextLineLeftBoundsFromContextMethod)
646
FIND_METHOD(getAccessibleTextLineLeftBoundsFromContextMethod, bridgeClass,
647
"getAccessibleTextLineLeftBoundsFromContext",
648
"(Ljavax/accessibility/AccessibleContext;I)I");
649
650
// GetMethodID(getAccessibleTextLineRightBoundsFromContextMethod)
651
FIND_METHOD(getAccessibleTextLineRightBoundsFromContextMethod, bridgeClass,
652
"getAccessibleTextLineRightBoundsFromContext",
653
"(Ljavax/accessibility/AccessibleContext;I)I");
654
655
// GetMethodID(getAccessibleTextRangeFromContextMethod)
656
FIND_METHOD(getAccessibleTextRangeFromContextMethod, bridgeClass,
657
"getAccessibleTextRangeFromContext",
658
"(Ljavax/accessibility/AccessibleContext;II)Ljava/lang/String;");
659
660
661
// ------- AccessibleValue methods
662
663
// GetMethodID(getCurrentAccessibleValueFromContext)
664
FIND_METHOD(getCurrentAccessibleValueFromContextMethod, bridgeClass,
665
"getCurrentAccessibleValueFromContext",
666
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
667
668
// GetMethodID(getMaximumAccessibleValueFromContext)
669
FIND_METHOD(getMaximumAccessibleValueFromContextMethod, bridgeClass,
670
"getMaximumAccessibleValueFromContext",
671
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
672
673
// GetMethodID(getMinimumAccessibleValueFromContext)
674
FIND_METHOD(getMinimumAccessibleValueFromContextMethod, bridgeClass,
675
"getMinimumAccessibleValueFromContext",
676
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
677
678
679
// ------- AccessibleSelection methods
680
681
// GetMethodID(addAccessibleSelectionFromContext)
682
FIND_METHOD(addAccessibleSelectionFromContextMethod, bridgeClass,
683
"addAccessibleSelectionFromContext",
684
"(Ljavax/accessibility/AccessibleContext;I)V");
685
686
// GetMethodID(clearAccessibleSelectionFromContext)
687
FIND_METHOD(clearAccessibleSelectionFromContextMethod, bridgeClass,
688
"clearAccessibleSelectionFromContext",
689
"(Ljavax/accessibility/AccessibleContext;)V");
690
691
// GetMethodID(getAccessibleSelectionFromContext)
692
FIND_METHOD(getAccessibleSelectionContextFromContextMethod, bridgeClass,
693
"getAccessibleSelectionFromContext",
694
"(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;");
695
696
// GetMethodID(getAccessibleSelectionCountFromContext)
697
FIND_METHOD(getAccessibleSelectionCountFromContextMethod, bridgeClass,
698
"getAccessibleSelectionCountFromContext",
699
"(Ljavax/accessibility/AccessibleContext;)I");
700
701
// GetMethodID(isAccessibleChildSelectedFromContext)
702
FIND_METHOD(isAccessibleChildSelectedFromContextMethod, bridgeClass,
703
"isAccessibleChildSelectedFromContext",
704
"(Ljavax/accessibility/AccessibleContext;I)Z");
705
706
// GetMethodID(removeAccessibleSelectionFromContext)
707
FIND_METHOD(removeAccessibleSelectionFromContextMethod, bridgeClass,
708
"removeAccessibleSelectionFromContext",
709
"(Ljavax/accessibility/AccessibleContext;I)V");
710
711
// GetMethodID(selectAllAccessibleSelectionFromContext)
712
FIND_METHOD(selectAllAccessibleSelectionFromContextMethod, bridgeClass,
713
"selectAllAccessibleSelectionFromContext",
714
"(Ljavax/accessibility/AccessibleContext;)V");
715
716
717
// ------- Event Notification methods
718
719
// GetMethodID(addJavaEventNotification)
720
FIND_METHOD(addJavaEventNotificationMethod, bridgeClass,
721
"addJavaEventNotification", "(J)V");
722
723
// GetMethodID(removeJavaEventNotification)
724
FIND_METHOD(removeJavaEventNotificationMethod, bridgeClass,
725
"removeJavaEventNotification", "(J)V");
726
727
// GetMethodID(addAccessibilityEventNotification)
728
FIND_METHOD(addAccessibilityEventNotificationMethod, bridgeClass,
729
"addAccessibilityEventNotification", "(J)V");
730
731
// GetMethodID(removeAccessibilityEventNotification)
732
FIND_METHOD(removeAccessibilityEventNotificationMethod, bridgeClass,
733
"removeAccessibilityEventNotification", "(J)V");
734
735
736
// ------- AttributeSet methods
737
738
// GetMethodID(getBoldFromAttributeSet)
739
FIND_METHOD(getBoldFromAttributeSetMethod, bridgeClass,
740
"getBoldFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
741
742
// GetMethodID(getItalicFromAttributeSet)
743
FIND_METHOD(getItalicFromAttributeSetMethod, bridgeClass,
744
"getItalicFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
745
746
// GetMethodID(getUnderlineFromAttributeSet)
747
FIND_METHOD(getUnderlineFromAttributeSetMethod, bridgeClass,
748
"getUnderlineFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
749
750
// GetMethodID(getStrikethroughFromAttributeSet)
751
FIND_METHOD(getStrikethroughFromAttributeSetMethod, bridgeClass,
752
"getStrikethroughFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
753
754
// GetMethodID(getSuperscriptFromAttributeSet)
755
FIND_METHOD(getSuperscriptFromAttributeSetMethod, bridgeClass,
756
"getSuperscriptFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
757
758
// GetMethodID(getSubscriptFromAttributeSet)
759
FIND_METHOD(getSubscriptFromAttributeSetMethod, bridgeClass,
760
"getSubscriptFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
761
762
// GetMethodID(getBackgroundColorFromAttributeSet)
763
FIND_METHOD(getBackgroundColorFromAttributeSetMethod, bridgeClass,
764
"getBackgroundColorFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Ljava/lang/String;");
765
766
// GetMethodID(getForegroundColorFromAttributeSet)
767
FIND_METHOD(getForegroundColorFromAttributeSetMethod, bridgeClass,
768
"getForegroundColorFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Ljava/lang/String;");
769
770
// GetMethodID(getFontFamilyFromAttributeSet)
771
FIND_METHOD(getFontFamilyFromAttributeSetMethod, bridgeClass,
772
"getFontFamilyFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Ljava/lang/String;");
773
774
// GetMethodID(getFontSizeFromAttributeSet)
775
FIND_METHOD(getFontSizeFromAttributeSetMethod, bridgeClass,
776
"getFontSizeFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)I");
777
778
// GetMethodID(getAlignmentFromAttributeSet)
779
FIND_METHOD(getAlignmentFromAttributeSetMethod, bridgeClass,
780
"getAlignmentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)I");
781
782
// GetMethodID(getBidiLevelFromAttributeSet)
783
FIND_METHOD(getBidiLevelFromAttributeSetMethod, bridgeClass,
784
"getBidiLevelFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)I");
785
786
// GetMethodID(getFirstLineIndentFromAttributeSet)
787
FIND_METHOD(getFirstLineIndentFromAttributeSetMethod, bridgeClass,
788
"getFirstLineIndentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
789
790
// GetMethodID(getLeftIndentFromAttributeSet)
791
FIND_METHOD(getLeftIndentFromAttributeSetMethod, bridgeClass,
792
"getLeftIndentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
793
794
// GetMethodID(getRightIndentFromAttributeSet)
795
FIND_METHOD(getRightIndentFromAttributeSetMethod, bridgeClass,
796
"getRightIndentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
797
798
// GetMethodID(getLineSpacingFromAttributeSet)
799
FIND_METHOD(getLineSpacingFromAttributeSetMethod, bridgeClass,
800
"getLineSpacingFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
801
802
// GetMethodID(getSpaceAboveFromAttributeSet)
803
FIND_METHOD(getSpaceAboveFromAttributeSetMethod, bridgeClass,
804
"getSpaceAboveFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
805
806
// GetMethodID(getSpaceBelowFromAttributeSet)
807
FIND_METHOD(getSpaceBelowFromAttributeSetMethod, bridgeClass,
808
"getSpaceBelowFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
809
810
811
/**
812
* Additional methods for Teton
813
*/
814
815
// GetMethodID(requestFocus)
816
FIND_METHOD(requestFocusMethod, bridgeClass,
817
"requestFocus",
818
"(Ljavax/accessibility/AccessibleContext;)Z");
819
820
// GetMethodID(selectTextRange)
821
FIND_METHOD(selectTextRangeMethod, bridgeClass,
822
"selectTextRange",
823
"(Ljavax/accessibility/AccessibleContext;II)Z");
824
825
// GetMethodID(getVisibleChildrenCount)
826
FIND_METHOD(getVisibleChildrenCountMethod, bridgeClass,
827
"getVisibleChildrenCount",
828
"(Ljavax/accessibility/AccessibleContext;)I");
829
830
// GetMethodID(getVisibleChild)
831
FIND_METHOD(getVisibleChildMethod, bridgeClass,
832
"getVisibleChild",
833
"(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;");
834
835
// GetMethodID(setCaretPosition)
836
FIND_METHOD(setCaretPositionMethod, bridgeClass,
837
"setCaretPosition",
838
"(Ljavax/accessibility/AccessibleContext;I)Z");
839
840
// GetMethodID(getVirtualAccessibleNameFromContextMethod) Ben Key
841
FIND_METHOD(getVirtualAccessibleNameFromContextMethod, bridgeClass,
842
"getVirtualAccessibleNameFromContext",
843
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
844
845
return TRUE;
846
}
847
848
// Note for the following code which makes JNI upcalls...
849
//
850
// Problem, bug DB 16818166, JBS DB JDK-8015400
851
// AccessibleContext is a JOBJECT64 which is a jobject (32 bit pointer)
852
// for a Legacy (XP) build and a jlong (64 bits) for a -32 or -64 build.
853
// For the -32 build the lower 32 bits needs to be extracted into a jobject.
854
// Otherwise, if AccessibleContext is used directly what happens is that
855
// the JNI code consumes the lower 32 of its 64 bits and that is not a
856
// problem, but then when the JNI code consumes the next 32 bits for the
857
// reference to the role String it gets the higher 0x00000000 bits from
858
// the 64 bit JOBJECT64 AccessibleContext variable and thus a null reference
859
// is passed as the String reference.
860
//
861
// Solution:
862
// Cast the JOBJECT64 to a jobject. For a 64 bit compile this is basically
863
// a noop, i.e. JOBJECT64 is a 64 bit jlong and a jobject is a 64 bit reference.
864
// For a 32 bit compile the cast drops the high order 32 bits, i.e. JOBJECT64
865
// is a 64 bit jlong and jobject is a 32 bit reference. For a Legacy build
866
// JOBJECT64 is a jobject so this is also basically a noop. The casts are
867
// done in the methods in JavaAccessBridge::processPackage.
868
869
// -----------------------------------
870
871
/**
872
* isJavaWindow - returns whether the HWND is a Java window or not
873
*
874
*/
875
BOOL
876
AccessBridgeJavaEntryPoints::isJavaWindow(jint window) {
877
jthrowable exception;
878
BOOL returnVal;
879
880
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::isJavaWindow(%X):", window);
881
882
if (isJavaWindowMethod != (jmethodID) 0) {
883
returnVal = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, isJavaWindowMethod, window);
884
EXCEPTION_CHECK("Getting isJavaWindow - call to CallBooleanMethod()", FALSE);
885
return returnVal;
886
} else {
887
PrintDebugString("[ERROR]: either jniEnv == 0 or isJavaWindowMethod == 0");
888
return FALSE;
889
}
890
}
891
892
// -----------------------------------
893
894
/**
895
* isSameObject - returns whether two object reference refer to the same object
896
*
897
*/
898
BOOL
899
AccessBridgeJavaEntryPoints::isSameObject(jobject obj1, jobject obj2) {
900
jthrowable exception;
901
BOOL returnVal;
902
903
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::isSameObject(%p %p):", obj1, obj2);
904
905
returnVal = (BOOL) jniEnv->IsSameObject((jobject)obj1, (jobject)obj2);
906
EXCEPTION_CHECK("Calling IsSameObject", FALSE);
907
908
PrintDebugString("[INFO]: isSameObject returning %d", returnVal);
909
return returnVal;
910
}
911
912
// -----------------------------------
913
914
/**
915
* getAccessibleContextFromHWND - returns the AccessibleContext, if any, for an HWND
916
*
917
*/
918
jobject
919
AccessBridgeJavaEntryPoints::getAccessibleContextFromHWND(jint window) {
920
jobject returnedAccessibleContext;
921
jobject globalRef;
922
jthrowable exception;
923
924
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getAccessibleContextFromHWND(%X):", window);
925
926
if (getAccessibleContextFromHWNDMethod != (jmethodID) 0) {
927
returnedAccessibleContext =
928
(jobject)jniEnv->CallObjectMethod(accessBridgeObject, getAccessibleContextFromHWNDMethod,
929
window);
930
EXCEPTION_CHECK("Getting AccessibleContextFromHWND - call to CallObjectMethod()", (jobject) 0);
931
globalRef = (jobject)jniEnv->NewGlobalRef((jobject)returnedAccessibleContext);
932
EXCEPTION_CHECK("Getting AccessibleContextFromHWND - call to CallObjectMethod()", (jobject) 0);
933
return globalRef;
934
} else {
935
PrintDebugString("[ERROR]: either jniEnv == 0 or getAccessibleContextFromHWNDMethod == 0");
936
return (jobject) 0;
937
}
938
}
939
940
// -----------------------------------
941
942
/**
943
* getHWNDFromAccessibleContext - returns the HWND for an AccessibleContext, if any
944
* returns (HWND)0 on error.
945
*/
946
HWND
947
AccessBridgeJavaEntryPoints::getHWNDFromAccessibleContext(jobject accessibleContext) {
948
jthrowable exception;
949
HWND rHWND;
950
951
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getHWNDFromAccessibleContext(%X):",
952
accessibleContext);
953
954
if (getHWNDFromAccessibleContextMethod != (jmethodID) 0) {
955
rHWND = (HWND)jniEnv->CallIntMethod(accessBridgeObject, getHWNDFromAccessibleContextMethod,
956
accessibleContext);
957
EXCEPTION_CHECK("Getting HWNDFromAccessibleContext - call to CallIntMethod()", (HWND)0);
958
PrintDebugString("[INFO]: rHWND = %X", rHWND);
959
return rHWND;
960
} else {
961
PrintDebugString("[ERROR]: either jniEnv == 0 or getHWNDFromAccessibleContextMethod == 0");
962
return (HWND)0;
963
}
964
}
965
966
967
/* ====== Utility methods ===== */
968
969
/**
970
* Sets a text field to the specified string. Returns whether successful;
971
*/
972
BOOL
973
AccessBridgeJavaEntryPoints::setTextContents(const jobject accessibleContext, const wchar_t *text) {
974
jthrowable exception;
975
BOOL result = FALSE;
976
977
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::setTextContents(%p, %ls):",
978
accessibleContext, text);
979
980
if (setTextContentsMethod != (jmethodID) 0) {
981
982
// create a Java String for the text
983
jstring textString = jniEnv->NewString(text, (jsize)wcslen(text));
984
if (textString == 0) {
985
PrintDebugString("[ERROR]: NewString failed");
986
return FALSE;
987
}
988
989
result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject,
990
setTextContentsMethod,
991
accessibleContext, textString);
992
EXCEPTION_CHECK("setTextContents - call to CallBooleanMethod()", FALSE);
993
PrintDebugString("[INFO]: result = %d", result);
994
return result;
995
} else {
996
PrintDebugString("[ERROR]: either jniEnv == 0 or setTextContentsMethod == 0");
997
return result;
998
}
999
}
1000
1001
/**
1002
* Returns the Accessible Context of a Page Tab object that is the
1003
* ancestor of a given object. If the object is a Page Tab object
1004
* or a Page Tab ancestor object was found, returns the object
1005
* AccessibleContext.
1006
* If there is no ancestor object that has an Accessible Role of Page Tab,
1007
* returns (AccessibleContext)0.
1008
*/
1009
jobject
1010
AccessBridgeJavaEntryPoints::getParentWithRole(const jobject accessibleContext, const wchar_t *role) {
1011
jthrowable exception;
1012
jobject rAccessibleContext;
1013
1014
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getParentWithRole(%p):",
1015
accessibleContext);
1016
1017
if (getParentWithRoleMethod != (jmethodID) 0) {
1018
// create a Java String for the role
1019
jstring roleName = jniEnv->NewString(role, (jsize)wcslen(role));
1020
if (roleName == 0) {
1021
PrintDebugString("[ERROR]: NewString failed");
1022
return FALSE;
1023
}
1024
1025
rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
1026
getParentWithRoleMethod,
1027
accessibleContext, roleName);
1028
EXCEPTION_CHECK("Getting ParentWithRole - call to CallObjectMethod()", (AccessibleContext)0);
1029
PrintDebugString("[INFO]: rAccessibleContext = %p", rAccessibleContext);
1030
jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext);
1031
EXCEPTION_CHECK("Getting ParentWithRole - call to NewGlobalRef()", FALSE);
1032
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
1033
rAccessibleContext, globalRef);
1034
return globalRef;
1035
} else {
1036
PrintDebugString("[ERROR]: either jniEnv == 0 or getParentWithRoleMethod == 0");
1037
return 0;
1038
}
1039
}
1040
1041
/**
1042
* Returns the Accessible Context for the top level object in
1043
* a Java Window. This is same Accessible Context that is obtained
1044
* from GetAccessibleContextFromHWND for that window. Returns
1045
* (AccessibleContext)0 on error.
1046
*/
1047
jobject
1048
AccessBridgeJavaEntryPoints::getTopLevelObject(const jobject accessibleContext) {
1049
jthrowable exception;
1050
jobject rAccessibleContext;
1051
1052
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getTopLevelObject(%p):",
1053
accessibleContext);
1054
1055
if (getTopLevelObjectMethod != (jmethodID) 0) {
1056
rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
1057
getTopLevelObjectMethod,
1058
accessibleContext);
1059
EXCEPTION_CHECK("Getting TopLevelObject - call to CallObjectMethod()", FALSE);
1060
PrintDebugString("[INFO]: rAccessibleContext = %p", rAccessibleContext);
1061
jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext);
1062
EXCEPTION_CHECK("Getting TopLevelObject - call to NewGlobalRef()", FALSE);
1063
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
1064
rAccessibleContext, globalRef);
1065
return globalRef;
1066
} else {
1067
PrintDebugString("[ERROR]: either jniEnv == 0 or getTopLevelObjectMethod == 0");
1068
return 0;
1069
}
1070
}
1071
1072
/**
1073
* If there is an Ancestor object that has an Accessible Role of
1074
* Internal Frame, returns the Accessible Context of the Internal
1075
* Frame object. Otherwise, returns the top level object for that
1076
* Java Window. Returns (AccessibleContext)0 on error.
1077
*/
1078
jobject
1079
AccessBridgeJavaEntryPoints::getParentWithRoleElseRoot(const jobject accessibleContext, const wchar_t *role) {
1080
jthrowable exception;
1081
jobject rAccessibleContext;
1082
1083
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getParentWithRoleElseRoot(%p):",
1084
accessibleContext);
1085
1086
if (getParentWithRoleElseRootMethod != (jmethodID) 0) {
1087
1088
// create a Java String for the role
1089
jstring roleName = jniEnv->NewString(role, (jsize)wcslen(role));
1090
if (roleName == 0) {
1091
PrintDebugString("[ERROR]: NewString failed");
1092
return FALSE;
1093
}
1094
1095
rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
1096
getParentWithRoleElseRootMethod,
1097
accessibleContext, roleName);
1098
EXCEPTION_CHECK("Getting ParentWithRoleElseRoot - call to CallObjectMethod()", (AccessibleContext)0);
1099
PrintDebugString("[INFO]: rAccessibleContext = %p", rAccessibleContext);
1100
jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext);
1101
EXCEPTION_CHECK("Getting ParentWithRoleElseRoot - call to NewGlobalRef()", FALSE);
1102
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
1103
rAccessibleContext, globalRef);
1104
return globalRef;
1105
} else {
1106
PrintDebugString("[ERROR]: either jniEnv == 0 or getParentWithRoleElseRootMethod == 0");
1107
return 0;
1108
}
1109
}
1110
1111
/**
1112
* Returns how deep in the object hierarchy a given object is.
1113
* The top most object in the object hierarchy has an object depth of 0.
1114
* Returns -1 on error.
1115
*/
1116
jint
1117
AccessBridgeJavaEntryPoints::getObjectDepth(const jobject accessibleContext) {
1118
jthrowable exception;
1119
jint rResult;
1120
1121
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getObjectDepth(%p):",
1122
accessibleContext);
1123
1124
if (getObjectDepthMethod != (jmethodID) 0) {
1125
rResult = jniEnv->CallIntMethod(accessBridgeObject,
1126
getObjectDepthMethod,
1127
accessibleContext);
1128
EXCEPTION_CHECK("Getting ObjectDepth - call to CallIntMethod()", -1);
1129
PrintDebugString("[INFO]: rResult = %d", rResult);
1130
return rResult;
1131
} else {
1132
PrintDebugString("[ERROR]: either jniEnv == 0 or getObjectDepthMethod == 0");
1133
return -1;
1134
}
1135
}
1136
1137
1138
1139
/**
1140
* Returns the Accessible Context of the current ActiveDescendent of an object.
1141
* Returns 0 on error.
1142
*/
1143
jobject
1144
AccessBridgeJavaEntryPoints::getActiveDescendent(const jobject accessibleContext) {
1145
jthrowable exception;
1146
jobject rAccessibleContext;
1147
1148
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getActiveDescendent(%p):",
1149
accessibleContext);
1150
1151
if (getActiveDescendentMethod != (jmethodID) 0) {
1152
rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
1153
getActiveDescendentMethod,
1154
accessibleContext);
1155
EXCEPTION_CHECK("Getting ActiveDescendent - call to CallObjectMethod()", (AccessibleContext)0);
1156
PrintDebugString("[INFO]: rAccessibleContext = %p", rAccessibleContext);
1157
jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext);
1158
EXCEPTION_CHECK("Getting ActiveDescendant - call to NewGlobalRef()", FALSE);
1159
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
1160
rAccessibleContext, globalRef);
1161
return globalRef;
1162
} else {
1163
PrintDebugString("[ERROR]: either jniEnv == 0 or getActiveDescendentMethod == 0");
1164
return (AccessibleContext)0;
1165
}
1166
}
1167
1168
/**
1169
* Additional methods for Teton
1170
*/
1171
1172
/**
1173
* Returns an AccessibleName for a component using an algorithm optimized
1174
* for the JAWS screen reader by Ben Key (Freedom Scientific). This method
1175
* is only intended for JAWS. All other uses are entirely optional.
1176
*
1177
* Bug ID 4916682 - Implement JAWS AccessibleName policy
1178
*/
1179
BOOL
1180
AccessBridgeJavaEntryPoints::getVirtualAccessibleName (
1181
IN const jobject object,
1182
OUT wchar_t * name,
1183
IN const int nameSize)
1184
{
1185
/*
1186
+
1187
Parameter validation
1188
+
1189
*/
1190
if ((name == 0) || (nameSize == 0))
1191
{
1192
return FALSE;
1193
}
1194
::memset (name, 0, nameSize * sizeof (wchar_t));
1195
if (0 == object)
1196
{
1197
return FALSE;
1198
}
1199
1200
jstring js = NULL;
1201
const wchar_t * stringBytes = NULL;
1202
jthrowable exception = NULL;
1203
jsize length = 0;
1204
PrintDebugString("[INFO]: getVirtualAccessibleName called.");
1205
if (getVirtualAccessibleNameFromContextMethod != (jmethodID) 0)
1206
{
1207
js = (jstring) jniEnv->CallObjectMethod (
1208
accessBridgeObject,
1209
getVirtualAccessibleNameFromContextMethod,
1210
object);
1211
EXCEPTION_CHECK("Getting AccessibleName - call to CallObjectMethod()", FALSE);
1212
if (js != (jstring) 0)
1213
{
1214
stringBytes = (const wchar_t *) jniEnv->GetStringChars (js, 0);
1215
EXCEPTION_CHECK("Getting AccessibleName - call to GetStringChars()", FALSE);
1216
wcsncpy(name, stringBytes, nameSize - 1);
1217
length = jniEnv->GetStringLength(js);
1218
EXCEPTION_CHECK("Getting AccessibleName - call to GetStringLength()", FALSE);
1219
jniEnv->ReleaseStringChars(js, stringBytes);
1220
EXCEPTION_CHECK("Getting AccessibleName - call to ReleaseStringChars()", FALSE);
1221
jniEnv->CallVoidMethod (
1222
accessBridgeObject,
1223
decrementReferenceMethod, js);
1224
EXCEPTION_CHECK("Getting AccessibleName - call to CallVoidMethod()", FALSE);
1225
wPrintDebugString(L" Accessible Name = %ls", name);
1226
jniEnv->DeleteLocalRef(js);
1227
EXCEPTION_CHECK("Getting AccessibleName - call to DeleteLocalRef()", FALSE);
1228
}
1229
else
1230
{
1231
PrintDebugString("[INFO]: Accessible Name is null.");
1232
}
1233
}
1234
else
1235
{
1236
PrintDebugString("[INFO]: either jniEnv == 0 or getVirtualAccessibleNameFromContextMethod == 0");
1237
return FALSE;
1238
}
1239
if ( 0 != name [0] )
1240
{
1241
return TRUE;
1242
}
1243
return FALSE;
1244
}
1245
1246
1247
/**
1248
* Request focus for a component. Returns whether successful;
1249
*
1250
* Bug ID 4944757 - requestFocus method needed
1251
*/
1252
BOOL
1253
AccessBridgeJavaEntryPoints::requestFocus(const jobject accessibleContext) {
1254
1255
jthrowable exception;
1256
BOOL result = FALSE;
1257
1258
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::requestFocus(%p):",
1259
accessibleContext);
1260
1261
if (requestFocusMethod != (jmethodID) 0) {
1262
result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject,
1263
requestFocusMethod,
1264
accessibleContext);
1265
EXCEPTION_CHECK("requestFocus - call to CallBooleanMethod()", FALSE);
1266
PrintDebugString("[INFO]: result = %d", result);
1267
return result;
1268
} else {
1269
PrintDebugString("[ERROR]: either jniEnv == 0 or requestFocusMethod == 0");
1270
return result;
1271
}
1272
}
1273
1274
/**
1275
* Selects text between two indices. Selection includes the text at the start index
1276
* and the text at the end index. Returns whether successful;
1277
*
1278
* Bug ID 4944758 - selectTextRange method needed
1279
*/
1280
BOOL
1281
AccessBridgeJavaEntryPoints::selectTextRange(const jobject accessibleContext, int startIndex, int endIndex) {
1282
1283
jthrowable exception;
1284
BOOL result = FALSE;
1285
1286
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::selectTextRange(%p start = %d end = %d):",
1287
accessibleContext, startIndex, endIndex);
1288
1289
if (selectTextRangeMethod != (jmethodID) 0) {
1290
result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject,
1291
selectTextRangeMethod,
1292
accessibleContext,
1293
startIndex, endIndex);
1294
EXCEPTION_CHECK("selectTextRange - call to CallBooleanMethod()", FALSE);
1295
PrintDebugString("[INFO]: result = %d", result);
1296
return result;
1297
} else {
1298
PrintDebugString("[ERROR]: either jniEnv == 0 or selectTextRangeMethod == 0");
1299
return result;
1300
}
1301
}
1302
1303
/*
1304
* Returns whether two text attributes are the same.
1305
*/
1306
static BOOL CompareAccessibleTextAttributesInfo(AccessibleTextAttributesInfo *one,
1307
AccessibleTextAttributesInfo *two) {
1308
return(one->bold == two->bold
1309
&& one->italic == two->italic
1310
&& one->underline == two->underline
1311
&& one->strikethrough == two->strikethrough
1312
&& one->superscript == two->superscript
1313
&& one->subscript == two->subscript
1314
&& one->fontSize == two->fontSize
1315
&& one->alignment == two->alignment
1316
&& one->bidiLevel == two->bidiLevel
1317
&& one->firstLineIndent == two->firstLineIndent
1318
&& one->leftIndent == two->leftIndent
1319
&& one->rightIndent == two->rightIndent
1320
&& one->lineSpacing == two->lineSpacing
1321
&& one->spaceAbove == two->spaceAbove
1322
&& one->spaceBelow == two->spaceBelow
1323
&& !wcscmp(one->backgroundColor,two->backgroundColor)
1324
&& !wcscmp(one->foregroundColor,two->foregroundColor)
1325
&& !wcscmp(one->fullAttributesString,two->fullAttributesString));
1326
}
1327
1328
/**
1329
* Get text attributes between two indices.
1330
*
1331
* Only one AccessibleTextAttributesInfo structure is passed - which
1332
* contains the attributes for the first character, the function then goes
1333
* through the following characters in the range specified and stops when the
1334
* attributes are different from the first, it then returns in the passed
1335
* parameter len the number of characters with the attributes returned. In most
1336
* situations this will be all the characters, and if not the calling program
1337
* can easily get the attributes for the next characters with different
1338
* attributes
1339
*
1340
* Bug ID 4944761 - getTextAttributes between two indices method needed
1341
*/
1342
1343
/* NEW FASTER CODE!!*/
1344
BOOL
1345
AccessBridgeJavaEntryPoints::getTextAttributesInRange(const jobject accessibleContext,
1346
int startIndex, int endIndex,
1347
AccessibleTextAttributesInfo *attributes, short *len) {
1348
1349
jstring js;
1350
const wchar_t *stringBytes;
1351
jthrowable exception;
1352
jsize length;
1353
BOOL result = FALSE;
1354
1355
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::getTextAttributesInRange(%p start = %d end = %d):",
1356
accessibleContext, startIndex, endIndex);
1357
1358
*len = 0;
1359
result = getAccessibleTextAttributes((jobject)accessibleContext, startIndex, attributes);
1360
if (result != TRUE) {
1361
return FALSE;
1362
}
1363
(*len)++;
1364
1365
for (jint i = startIndex+1; i <= endIndex; i++) {
1366
1367
AccessibleTextAttributesInfo test_attributes = *attributes;
1368
// Get the full test_attributes string at i
1369
if (getAccessibleAttributesAtIndexFromContextMethod != (jmethodID) 0) {
1370
PrintDebugString("[INFO]: Getting full test_attributes string from Context...");
1371
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
1372
getAccessibleAttributesAtIndexFromContextMethod,
1373
accessibleContext, i);
1374
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallObjectMethod()", FALSE);
1375
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
1376
if (js != (jstring) 0) {
1377
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
1378
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringChars()", FALSE);
1379
wcsncpy(test_attributes.fullAttributesString, stringBytes, (sizeof(test_attributes.fullAttributesString) / sizeof(wchar_t)));
1380
length = jniEnv->GetStringLength(js);
1381
test_attributes.fullAttributesString[length < (sizeof(test_attributes.fullAttributesString) / sizeof(wchar_t)) ?
1382
length : (sizeof(test_attributes.fullAttributesString) / sizeof(wchar_t))-2] = (wchar_t) 0;
1383
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringLength()", FALSE);
1384
jniEnv->ReleaseStringChars(js, stringBytes);
1385
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to ReleaseStringChars()", FALSE);
1386
jniEnv->CallVoidMethod(accessBridgeObject,
1387
decrementReferenceMethod, js);
1388
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallVoidMethod()", FALSE);
1389
wPrintDebugString(L"[INFO]: Accessible Text attributes = %ls", test_attributes.fullAttributesString);
1390
jniEnv->DeleteLocalRef(js);
1391
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to DeleteLocalRef()", FALSE);
1392
} else {
1393
PrintDebugString("[WARN]: Accessible Text attributes is null.");
1394
test_attributes.fullAttributesString[0] = (wchar_t) 0;
1395
return FALSE;
1396
}
1397
} else {
1398
PrintDebugString("[ERROR]: either env == 0 or getAccessibleAttributesAtIndexFromContextMethod == 0");
1399
return FALSE;
1400
}
1401
1402
if(wcscmp(attributes->fullAttributesString,test_attributes.fullAttributesString))
1403
break;
1404
if (result != TRUE) {
1405
return FALSE;
1406
}
1407
(*len)++;
1408
}
1409
return TRUE;
1410
}
1411
1412
/*
1413
* Returns the number of visible children of a component
1414
*
1415
* Bug ID 4944762- getVisibleChildren for list-like components needed
1416
*/
1417
int
1418
AccessBridgeJavaEntryPoints::getVisibleChildrenCount(const jobject accessibleContext) {
1419
1420
jthrowable exception;
1421
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getVisibleChildrenCount(%p)",
1422
accessibleContext);
1423
1424
// get the visible children count
1425
int numChildren = jniEnv->CallIntMethod(accessBridgeObject, getVisibleChildrenCountMethod,
1426
accessibleContext);
1427
EXCEPTION_CHECK("##### Getting visible children count - call to CallIntMethod()", FALSE);
1428
PrintDebugString("[INFO]: ##### visible children count = %d", numChildren);
1429
1430
return numChildren;
1431
}
1432
1433
1434
/*
1435
* This method is used to iterate through the visible children of a component. It
1436
* returns visible children information for a component starting at nStartIndex.
1437
* No more than MAX_VISIBLE_CHILDREN VisibleChildrenInfo objects will
1438
* be returned for each call to this method. Returns FALSE on error.
1439
*
1440
* Bug ID 4944762- getVisibleChildren for list-like components needed
1441
*/
1442
BOOL AccessBridgeJavaEntryPoints::getVisibleChildren(const jobject accessibleContext,
1443
const int nStartIndex,
1444
/* OUT */ VisibleChildrenInfo *visibleChildrenInfo) {
1445
1446
jthrowable exception;
1447
1448
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getVisibleChildren(%p, startIndex = %d)",
1449
accessibleContext, nStartIndex);
1450
1451
// get the visible children count
1452
int numChildren = jniEnv->CallIntMethod(accessBridgeObject, getVisibleChildrenCountMethod,
1453
accessibleContext);
1454
EXCEPTION_CHECK("##### Getting visible children count - call to CallIntMethod()", FALSE);
1455
PrintDebugString("[INFO]: ##### visible children count = %d", numChildren);
1456
1457
if (nStartIndex >= numChildren) {
1458
return FALSE;
1459
}
1460
1461
// get the visible children
1462
int bufIndex = 0;
1463
for (int i = nStartIndex; (i < numChildren) && (i < nStartIndex + MAX_VISIBLE_CHILDREN); i++) {
1464
PrintDebugString("[INFO]: getting visible child %d ...", i);
1465
1466
// get the visible child at index i
1467
jobject ac = jniEnv->CallObjectMethod(accessBridgeObject, getVisibleChildMethod,
1468
accessibleContext, i);
1469
EXCEPTION_CHECK("##### getVisibleChildMethod - call to CallObjectMethod()", FALSE);
1470
jobject globalRef = jniEnv->NewGlobalRef(ac);
1471
EXCEPTION_CHECK("##### getVisibleChildMethod - call to NewGlobalRef()", FALSE);
1472
visibleChildrenInfo->children[bufIndex] = (JOBJECT64)globalRef;
1473
PrintDebugString("[INFO]: ##### visible child = %p", globalRef);
1474
1475
bufIndex++;
1476
}
1477
visibleChildrenInfo->returnedChildrenCount = bufIndex;
1478
1479
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getVisibleChildren succeeded");
1480
return TRUE;
1481
}
1482
1483
/**
1484
* Set the caret to a text position. Returns whether successful;
1485
*
1486
* Bug ID 4944770 - setCaretPosition method needed
1487
*/
1488
BOOL
1489
AccessBridgeJavaEntryPoints::setCaretPosition(const jobject accessibleContext, int position) {
1490
1491
jthrowable exception;
1492
BOOL result = FALSE;
1493
1494
PrintDebugString("[INFO]: In AccessBridgeJavaEntryPoints::setCaretPostion(%p position = %d):",
1495
accessibleContext, position);
1496
1497
if (setCaretPositionMethod != (jmethodID) 0) {
1498
result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject,
1499
setCaretPositionMethod,
1500
accessibleContext, position);
1501
EXCEPTION_CHECK("setCaretPostion - call to CallBooleanMethod()", FALSE);
1502
PrintDebugString("[ERROR]: result = %d", result);
1503
return result;
1504
} else {
1505
PrintDebugString("[ERROR]: either jniEnv == 0 or setCaretPositionMethod == 0");
1506
return result;
1507
}
1508
}
1509
1510
1511
// -----------------------------------
1512
1513
/**
1514
* getVersionInfo - returns the version string of the java.version property
1515
* and the AccessBridge.java version
1516
*
1517
*/
1518
BOOL
1519
AccessBridgeJavaEntryPoints::getVersionInfo(AccessBridgeVersionInfo *info) {
1520
jstring js;
1521
const wchar_t *stringBytes;
1522
jthrowable exception;
1523
jsize length;
1524
1525
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getVersionInfo():");
1526
1527
if (getJavaVersionPropertyMethod != (jmethodID) 0) {
1528
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
1529
getJavaVersionPropertyMethod);
1530
EXCEPTION_CHECK("Getting JavaVersionProperty - call to CallObjectMethod()", FALSE);
1531
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
1532
if (js != (jstring) 0) {
1533
length = jniEnv->GetStringLength(js);
1534
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
1535
if (stringBytes == NULL) {
1536
if (!jniEnv->ExceptionCheck()) {
1537
PrintDebugString("[ERROR]: *** Exception when getting JavaVersionProperty - call to GetStringChars");
1538
jniEnv->ExceptionDescribe();
1539
jniEnv->ExceptionClear();
1540
}
1541
return FALSE;
1542
}
1543
wcsncpy(info->bridgeJavaDLLVersion,
1544
stringBytes,
1545
sizeof(info->bridgeJavaDLLVersion) / sizeof(wchar_t));
1546
info->bridgeJavaDLLVersion[length < (sizeof(info->bridgeJavaDLLVersion) / sizeof(wchar_t)) ?
1547
length : (sizeof(info->bridgeJavaDLLVersion) / sizeof(wchar_t))-2] = (wchar_t) 0;
1548
wcsncpy(info->VMversion,
1549
stringBytes,
1550
sizeof(info->VMversion) / sizeof(wchar_t));
1551
info->VMversion[length < (sizeof(info->VMversion) / sizeof(wchar_t)) ?
1552
length : (sizeof(info->VMversion) / sizeof(wchar_t))-2] = (wchar_t) 0;
1553
wcsncpy(info->bridgeJavaClassVersion,
1554
stringBytes,
1555
sizeof(info->bridgeJavaClassVersion) / sizeof(wchar_t));
1556
info->bridgeJavaClassVersion[length < (sizeof(info->bridgeJavaClassVersion) / sizeof(wchar_t)) ?
1557
length : (sizeof(info->bridgeJavaClassVersion) / sizeof(wchar_t))-2] = (wchar_t) 0;
1558
wcsncpy(info->bridgeWinDLLVersion,
1559
stringBytes,
1560
sizeof(info->bridgeWinDLLVersion) / sizeof(wchar_t));
1561
info->bridgeWinDLLVersion[length < (sizeof(info->bridgeWinDLLVersion) / sizeof(wchar_t)) ?
1562
length : (sizeof(info->bridgeWinDLLVersion) / sizeof(wchar_t))-2] = (wchar_t) 0;
1563
jniEnv->ReleaseStringChars(js, stringBytes);
1564
EXCEPTION_CHECK("Getting JavaVersionProperty - call to ReleaseStringChars()", FALSE);
1565
jniEnv->CallVoidMethod(accessBridgeObject,
1566
decrementReferenceMethod, js);
1567
EXCEPTION_CHECK("Getting JavaVersionProperty - call to CallVoidMethod()", FALSE);
1568
wPrintDebugString(L" Java version = %ls", info->VMversion);
1569
jniEnv->DeleteLocalRef(js);
1570
EXCEPTION_CHECK("Getting JavaVersionProperty - call to DeleteLocalRef()", FALSE);
1571
} else {
1572
PrintDebugString("[WARN]: Java version is null.");
1573
info->VMversion[0] = (wchar_t) 0;
1574
return FALSE;
1575
}
1576
} else {
1577
PrintDebugString("[ERROR]: either env == 0 or getJavaVersionPropertyMethod == 0");
1578
return FALSE;
1579
}
1580
1581
return TRUE;
1582
}
1583
1584
1585
/*
1586
* Verifies the Java VM still exists and obj is an
1587
* instance of AccessibleText
1588
*/
1589
BOOL AccessBridgeJavaEntryPoints::verifyAccessibleText(jobject obj) {
1590
JavaVM *vm;
1591
BOOL retval;
1592
jthrowable exception;
1593
1594
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::verifyAccessibleText");
1595
1596
if (jniEnv->GetJavaVM(&vm) != 0) {
1597
PrintDebugString("[ERROR]: No Java VM");
1598
return FALSE;
1599
}
1600
1601
if (obj == (jobject)0) {
1602
PrintDebugString("[ERROR]: Null jobject");
1603
return FALSE;
1604
}
1605
1606
// Copied from getAccessibleContextInfo
1607
if (getAccessibleTextFromContextMethod != (jmethodID) 0) {
1608
jobject returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
1609
getAccessibleTextFromContextMethod,
1610
(jobject)obj);
1611
EXCEPTION_CHECK("Getting AccessibleText - call to CallObjectMethod()", FALSE);
1612
PrintDebugString("[ERROR]: AccessibleText = %p", returnedJobject);
1613
retval = returnedJobject != (jobject) 0;
1614
jniEnv->DeleteLocalRef(returnedJobject);
1615
EXCEPTION_CHECK("Getting AccessibleText - call to DeleteLocalRef()", FALSE);
1616
} else {
1617
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextFromContextMethod == 0");
1618
return FALSE;
1619
}
1620
if (retval == FALSE) {
1621
PrintDebugString("[ERROR]: jobject is not an AccessibleText");
1622
}
1623
return retval;
1624
}
1625
1626
1627
/********** AccessibleContext routines ***********************************/
1628
1629
/**
1630
* getAccessibleContextAt - performs the Java method call:
1631
* Accessible AccessBridge.getAccessibleContextAt(x, y)
1632
*
1633
* Note: this call explicitly goes through the AccessBridge,
1634
* so that it can keep a reference the returned jobject for the JavaVM.
1635
* You must explicity call INTreleaseJavaObject() when you are through using
1636
* the Accessible returned, to let the AccessBridge know it can release the
1637
* object, so that the can then garbage collect it.
1638
*
1639
*/
1640
jobject
1641
AccessBridgeJavaEntryPoints::getAccessibleContextAt(jint x, jint y, jobject accessibleContext) {
1642
jobject returnedAccessibleContext;
1643
jobject globalRef;
1644
jthrowable exception;
1645
1646
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleContextAt(%d, %d, %p):",
1647
x, y, accessibleContext);
1648
1649
if (getAccessibleContextAtMethod != (jmethodID) 0) {
1650
returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
1651
getAccessibleContextAtMethod,
1652
x, y, accessibleContext);
1653
EXCEPTION_CHECK("Getting AccessibleContextAt - call to CallObjectMethod()", FALSE);
1654
globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
1655
EXCEPTION_CHECK("Getting AccessibleContextAt - call to NewGlobalRef()", FALSE);
1656
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
1657
returnedAccessibleContext, globalRef);
1658
return globalRef;
1659
} else {
1660
PrintDebugString("[ERROR]: either env == 0 or getAccessibleContextAtMethod == 0");
1661
return (jobject) 0;
1662
}
1663
}
1664
1665
/**
1666
* getAccessibleWithFocus - performs the Java method calls:
1667
* Accessible Translator.getAccessible(SwingEventMonitor.getComponentWithFocus();
1668
*
1669
* Note: this call explicitly goes through the AccessBridge,
1670
* so that the AccessBridge can hide expected changes in how this functions
1671
* between JDK 1.1.x w/AccessibilityUtility classes, and JDK 1.2, when some
1672
* of this functionality may be built into the platform
1673
*
1674
*/
1675
jobject
1676
AccessBridgeJavaEntryPoints::getAccessibleContextWithFocus() {
1677
jobject returnedAccessibleContext;
1678
jobject globalRef;
1679
jthrowable exception;
1680
1681
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleContextWithFocus()");
1682
1683
if (getAccessibleContextWithFocusMethod != (jmethodID) 0) {
1684
returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
1685
getAccessibleContextWithFocusMethod);
1686
EXCEPTION_CHECK("Getting AccessibleContextWithFocus - call to CallObjectMethod()", FALSE);
1687
globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
1688
EXCEPTION_CHECK("Getting AccessibleContextWithFocus - call to NewGlobalRef()", FALSE);
1689
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
1690
returnedAccessibleContext, globalRef);
1691
return globalRef;
1692
} else {
1693
PrintDebugString("[ERROR]: either jniEnv == 0 or getAccessibleContextWithFocusMethod == 0");
1694
return (jobject) 0;
1695
}
1696
}
1697
1698
/**
1699
* getAccessibleContextInfo - fills a struct with a bunch of information
1700
* contained in the Java Accessibility API
1701
*
1702
* Note: if the AccessibleContext parameter is bogus, this call will blow up
1703
*
1704
* Note: this call explicitly goes through the AccessBridge,
1705
* so that it can keep a reference the returned jobject for the JavaVM.
1706
* You must explicity call releaseJavaObject() when you are through using
1707
* the AccessibleContext returned, to let the AccessBridge know it can release the
1708
* object, so that the JavaVM can then garbage collect it.
1709
*/
1710
BOOL
1711
AccessBridgeJavaEntryPoints::getAccessibleContextInfo(jobject accessibleContext, AccessibleContextInfo *info) {
1712
jstring js;
1713
const wchar_t *stringBytes;
1714
jobject returnedJobject;
1715
jthrowable exception;
1716
jsize length;
1717
1718
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleContextInfo(%p):", accessibleContext);
1719
1720
ZeroMemory(info, sizeof(AccessibleContextInfo));
1721
1722
if (accessibleContext == (jobject) 0) {
1723
PrintDebugString("[WARN]: passed in AccessibleContext == null! (oops)");
1724
return (FALSE);
1725
}
1726
1727
// Get the Accessible Name
1728
if (getAccessibleNameFromContextMethod != (jmethodID) 0) {
1729
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
1730
getAccessibleNameFromContextMethod,
1731
accessibleContext);
1732
EXCEPTION_CHECK("Getting AccessibleName - call to CallObjectMethod()", FALSE);
1733
if (js != (jstring) 0) {
1734
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
1735
EXCEPTION_CHECK("Getting AccessibleName - call to GetStringChars()", FALSE);
1736
wcsncpy(info->name, stringBytes, (sizeof(info->name) / sizeof(wchar_t)));
1737
length = jniEnv->GetStringLength(js);
1738
info->name[length < (sizeof(info->name) / sizeof(wchar_t)) ?
1739
length : (sizeof(info->name) / sizeof(wchar_t))-2] = (wchar_t) 0;
1740
EXCEPTION_CHECK("Getting AccessibleName - call to GetStringLength()", FALSE);
1741
jniEnv->ReleaseStringChars(js, stringBytes);
1742
EXCEPTION_CHECK("Getting AccessibleName - call to ReleaseStringChars()", FALSE);
1743
jniEnv->CallVoidMethod(accessBridgeObject,
1744
decrementReferenceMethod, js);
1745
EXCEPTION_CHECK("Getting AccessibleName - call to CallVoidMethod()", FALSE);
1746
wPrintDebugString(L"[INFO]: Accessible Name = %ls", info->name);
1747
jniEnv->DeleteLocalRef(js);
1748
EXCEPTION_CHECK("Getting AccessibleName - call to DeleteLocalRef()", FALSE);
1749
} else {
1750
PrintDebugString("[WARN]: Accessible Name is null.");
1751
info->name[0] = (wchar_t) 0;
1752
}
1753
} else {
1754
PrintDebugString("[ERROR]: either env == 0 or getAccessibleNameFromContextMethod == 0");
1755
return FALSE;
1756
}
1757
1758
1759
// Get the Accessible Description
1760
if (getAccessibleDescriptionFromContextMethod != (jmethodID) 0) {
1761
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
1762
getAccessibleDescriptionFromContextMethod,
1763
accessibleContext);
1764
EXCEPTION_CHECK("Getting AccessibleDescription - call to CallObjectMethod()", FALSE);
1765
if (js != (jstring) 0) {
1766
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
1767
EXCEPTION_CHECK("Getting AccessibleName - call to GetStringChars()", FALSE);
1768
wcsncpy(info->description, stringBytes, (sizeof(info->description) / sizeof(wchar_t)));
1769
length = jniEnv->GetStringLength(js);
1770
info->description[length < (sizeof(info->description) / sizeof(wchar_t)) ?
1771
length : (sizeof(info->description) / sizeof(wchar_t))-2] = (wchar_t) 0;
1772
EXCEPTION_CHECK("Getting AccessibleName - call to GetStringLength()", FALSE);
1773
jniEnv->ReleaseStringChars(js, stringBytes);
1774
EXCEPTION_CHECK("Getting AccessibleName - call to ReleaseStringChars()", FALSE);
1775
jniEnv->CallVoidMethod(accessBridgeObject,
1776
decrementReferenceMethod, js);
1777
EXCEPTION_CHECK("Getting AccessibleName - call to CallVoidMethod()", FALSE);
1778
wPrintDebugString(L"[INFO]: Accessible Description = %ls", info->description);
1779
jniEnv->DeleteLocalRef(js);
1780
EXCEPTION_CHECK("Getting AccessibleName - call to DeleteLocalRef()", FALSE);
1781
} else {
1782
PrintDebugString("[WARN]: Accessible Description is null.");
1783
info->description[0] = (wchar_t) 0;
1784
}
1785
} else {
1786
PrintDebugString("[ERROR]: either env == 0 or getAccessibleDescriptionFromContextMethod == 0");
1787
return FALSE;
1788
}
1789
1790
1791
// Get the Accessible Role String
1792
if (getAccessibleRoleStringFromContextMethod != (jmethodID) 0) {
1793
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
1794
getAccessibleRoleStringFromContextMethod,
1795
accessibleContext);
1796
EXCEPTION_CHECK("Getting AccessibleRole - call to CallObjectMethod()", FALSE);
1797
if (js != (jstring) 0) {
1798
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
1799
EXCEPTION_CHECK("Getting AccessibleRole - call to GetStringChars()", FALSE);
1800
wcsncpy(info->role, stringBytes, (sizeof(info->role) / sizeof(wchar_t)));
1801
length = jniEnv->GetStringLength(js);
1802
info->role[length < (sizeof(info->role) / sizeof(wchar_t)) ?
1803
length : (sizeof(info->role) / sizeof(wchar_t))-2] = (wchar_t) 0;
1804
EXCEPTION_CHECK("Getting AccessibleRole - call to GetStringLength()", FALSE);
1805
jniEnv->ReleaseStringChars(js, stringBytes);
1806
EXCEPTION_CHECK("Getting AccessibleRole - call to ReleaseStringChars()", FALSE);
1807
jniEnv->CallVoidMethod(accessBridgeObject,
1808
decrementReferenceMethod, js);
1809
EXCEPTION_CHECK("Getting AccessibleRole - call to CallVoidMethod()", FALSE);
1810
wPrintDebugString(L"[INFO]: Accessible Role = %ls", info->role);
1811
jniEnv->DeleteLocalRef(js);
1812
EXCEPTION_CHECK("Getting AccessibleRole - call to DeleteLocalRef()", FALSE);
1813
} else {
1814
PrintDebugString("[WARN]: Accessible Role is null.");
1815
info->role[0] = (wchar_t) 0;
1816
}
1817
} else {
1818
PrintDebugString("[ERROR]: either env == 0 or getAccessibleRoleStringFromContextMethod == 0");
1819
return FALSE;
1820
}
1821
1822
1823
// Get the Accessible Role String in the en_US locale
1824
if (getAccessibleRoleStringFromContext_en_USMethod != (jmethodID) 0) {
1825
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
1826
getAccessibleRoleStringFromContext_en_USMethod,
1827
accessibleContext);
1828
EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to CallObjectMethod()", FALSE);
1829
if (js != (jstring) 0) {
1830
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
1831
EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to GetStringChars()", FALSE);
1832
wcsncpy(info->role_en_US, stringBytes, (sizeof(info->role_en_US) / sizeof(wchar_t)));
1833
length = jniEnv->GetStringLength(js);
1834
info->role_en_US[length < (sizeof(info->role_en_US) / sizeof(wchar_t)) ?
1835
length : (sizeof(info->role_en_US) / sizeof(wchar_t))-2] = (wchar_t) 0;
1836
EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to GetStringLength()", FALSE);
1837
jniEnv->ReleaseStringChars(js, stringBytes);
1838
EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to ReleaseStringChars()", FALSE);
1839
jniEnv->CallVoidMethod(accessBridgeObject,
1840
decrementReferenceMethod, js);
1841
EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to CallVoidMethod()", FALSE);
1842
wPrintDebugString(L"[INFO]: Accessible Role en_US = %ls", info->role_en_US);
1843
jniEnv->DeleteLocalRef(js);
1844
EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to DeleteLocalRef()", FALSE);
1845
} else {
1846
PrintDebugString("[WARN]: Accessible Role en_US is null.");
1847
info->role[0] = (wchar_t) 0;
1848
}
1849
} else {
1850
PrintDebugString("[ERROR]: either env == 0 or getAccessibleRoleStringFromContext_en_USMethod == 0");
1851
return FALSE;
1852
}
1853
1854
// Get the Accessible States String
1855
if (getAccessibleStatesStringFromContextMethod != (jmethodID) 0) {
1856
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
1857
getAccessibleStatesStringFromContextMethod,
1858
accessibleContext);
1859
EXCEPTION_CHECK("Getting AccessibleState - call to CallObjectMethod()", FALSE);
1860
if (js != (jstring) 0) {
1861
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
1862
EXCEPTION_CHECK("Getting AccessibleState - call to GetStringChars()", FALSE);
1863
wcsncpy(info->states, stringBytes, (sizeof(info->states) / sizeof(wchar_t)));
1864
length = jniEnv->GetStringLength(js);
1865
info->states[length < (sizeof(info->states) / sizeof(wchar_t)) ?
1866
length : (sizeof(info->states) / sizeof(wchar_t))-2] = (wchar_t) 0;
1867
EXCEPTION_CHECK("Getting AccessibleState - call to GetStringLength()", FALSE);
1868
jniEnv->ReleaseStringChars(js, stringBytes);
1869
EXCEPTION_CHECK("Getting AccessibleState - call to ReleaseStringChars()", FALSE);
1870
jniEnv->CallVoidMethod(accessBridgeObject,
1871
decrementReferenceMethod, js);
1872
EXCEPTION_CHECK("Getting AccessibleState - call to CallVoidMethod()", FALSE);
1873
wPrintDebugString(L"[INFO]: Accessible States = %ls", info->states);
1874
jniEnv->DeleteLocalRef(js);
1875
EXCEPTION_CHECK("Getting AccessibleState - call to DeleteLocalRef()", FALSE);
1876
} else {
1877
PrintDebugString("[WARN]: Accessible States is null.");
1878
info->states[0] = (wchar_t) 0;
1879
}
1880
} else {
1881
PrintDebugString("[ERROR]: either env == 0 or getAccessibleStatesStringFromContextMethod == 0");
1882
return FALSE;
1883
}
1884
1885
// Get the Accessible States String in the en_US locale
1886
if (getAccessibleStatesStringFromContext_en_USMethod != (jmethodID) 0) {
1887
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
1888
getAccessibleStatesStringFromContext_en_USMethod,
1889
accessibleContext);
1890
EXCEPTION_CHECK("Getting AccessibleState_en_US - call to CallObjectMethod()", FALSE);
1891
if (js != (jstring) 0) {
1892
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
1893
EXCEPTION_CHECK("Getting AccessibleState_en_US - call to GetStringChars()", FALSE);
1894
wcsncpy(info->states_en_US, stringBytes, (sizeof(info->states_en_US) / sizeof(wchar_t)));
1895
length = jniEnv->GetStringLength(js);
1896
info->states_en_US[length < (sizeof(info->states_en_US) / sizeof(wchar_t)) ?
1897
length : (sizeof(info->states_en_US) / sizeof(wchar_t))-2] = (wchar_t) 0;
1898
EXCEPTION_CHECK("Getting AccessibleState_en_US - call to GetStringLength()", FALSE);
1899
jniEnv->ReleaseStringChars(js, stringBytes);
1900
EXCEPTION_CHECK("Getting AccessibleState_en_US - call to ReleaseStringChars()", FALSE);
1901
jniEnv->CallVoidMethod(accessBridgeObject,
1902
decrementReferenceMethod, js);
1903
EXCEPTION_CHECK("Getting AccessibleState_en_US - call to CallVoidMethod()", FALSE);
1904
wPrintDebugString(L"[INFO]: Accessible States en_US = %ls", info->states_en_US);
1905
jniEnv->DeleteLocalRef(js);
1906
EXCEPTION_CHECK("Getting AccessibleState_en_US - call to DeleteLocalRef()", FALSE);
1907
} else {
1908
PrintDebugString("[WARN]: Accessible States en_US is null.");
1909
info->states[0] = (wchar_t) 0;
1910
}
1911
} else {
1912
PrintDebugString("[ERROR]: either env == 0 or getAccessibleStatesStringFromContext_en_USMethod == 0");
1913
return FALSE;
1914
}
1915
1916
1917
// Get the index in Parent
1918
if (getAccessibleIndexInParentFromContextMethod != (jmethodID) 0) {
1919
info->indexInParent = jniEnv->CallIntMethod(accessBridgeObject,
1920
getAccessibleIndexInParentFromContextMethod,
1921
accessibleContext);
1922
EXCEPTION_CHECK("Getting AccessibleIndexInParent - call to CallIntMethod()", FALSE);
1923
PrintDebugString("[INFO]: Index in Parent = %d", info->indexInParent);
1924
} else {
1925
PrintDebugString("[ERROR]: either env == 0 or getAccessibleIndexInParentFromContextMethod == 0");
1926
return FALSE;
1927
}
1928
1929
1930
PrintDebugString("[INFO]: *** jniEnv: %p; accessBridgeObject: %p; AccessibleContext: %p ***",
1931
jniEnv, accessBridgeObject, accessibleContext);
1932
1933
// Get the children count
1934
if (getAccessibleChildrenCountFromContextMethod != (jmethodID) 0) {
1935
info->childrenCount = jniEnv->CallIntMethod(accessBridgeObject,
1936
getAccessibleChildrenCountFromContextMethod,
1937
accessibleContext);
1938
EXCEPTION_CHECK("Getting AccessibleChildrenCount - call to CallIntMethod()", FALSE);
1939
PrintDebugString("[INFO]: Children count = %d", info->childrenCount);
1940
} else {
1941
PrintDebugString("[ERROR]: either env == 0 or getAccessibleChildrenCountFromContextMethod == 0");
1942
return FALSE;
1943
}
1944
1945
PrintDebugString("[INFO]: *** jniEnv: %p; accessBridgeObject: %p; AccessibleContext: %X ***",
1946
jniEnv, accessBridgeObject, accessibleContext);
1947
1948
1949
// Get the x coord
1950
if (getAccessibleXcoordFromContextMethod != (jmethodID) 0) {
1951
info->x = jniEnv->CallIntMethod(accessBridgeObject,
1952
getAccessibleXcoordFromContextMethod,
1953
accessibleContext);
1954
EXCEPTION_CHECK("Getting AccessibleXcoord - call to CallIntMethod()", FALSE);
1955
PrintDebugString("[INFO]: X coord = %d", info->x);
1956
} else {
1957
PrintDebugString("[ERROR]: either env == 0 or getAccessibleXcoordFromContextMethod == 0");
1958
return FALSE;
1959
}
1960
1961
PrintDebugString("[INFO]: *** jniEnv: %X; accessBridgeObject: %X; AccessibleContext: %p ***",
1962
jniEnv, accessBridgeObject, accessibleContext);
1963
1964
1965
// Get the y coord
1966
if (getAccessibleYcoordFromContextMethod != (jmethodID) 0) {
1967
info->y = jniEnv->CallIntMethod(accessBridgeObject,
1968
getAccessibleYcoordFromContextMethod,
1969
accessibleContext);
1970
EXCEPTION_CHECK("Getting AccessibleYcoord - call to CallIntMethod()", FALSE);
1971
PrintDebugString("[INFO]: Y coord = %d", info->y);
1972
} else {
1973
PrintDebugString("[ERROR]: either env == 0 or getAccessibleYcoordFromContextMethod == 0");
1974
return FALSE;
1975
}
1976
1977
// Get the width
1978
if (getAccessibleWidthFromContextMethod != (jmethodID) 0) {
1979
info->width = jniEnv->CallIntMethod(accessBridgeObject,
1980
getAccessibleWidthFromContextMethod,
1981
accessibleContext);
1982
EXCEPTION_CHECK("Getting AccessibleWidth - call to CallIntMethod()", FALSE);
1983
PrintDebugString("[INFO]: Width = %d", info->width);
1984
} else {
1985
PrintDebugString("[ERROR]: either env == 0 or getAccessibleWidthFromContextMethod == 0");
1986
return FALSE;
1987
}
1988
1989
// Get the height
1990
if (getAccessibleHeightFromContextMethod != (jmethodID) 0) {
1991
info->height = jniEnv->CallIntMethod(accessBridgeObject,
1992
getAccessibleHeightFromContextMethod,
1993
accessibleContext);
1994
EXCEPTION_CHECK("Getting AccessibleHeight - call to CallIntMethod()", FALSE);
1995
PrintDebugString("[INFO]: Height = %d", info->height);
1996
} else {
1997
PrintDebugString("[ERROR]: either env == 0 or getAccessibleHeightFromContextMethod == 0");
1998
return FALSE;
1999
}
2000
2001
// Get the AccessibleComponent
2002
if (getAccessibleComponentFromContextMethod != (jmethodID) 0) {
2003
returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
2004
getAccessibleComponentFromContextMethod,
2005
accessibleContext);
2006
EXCEPTION_CHECK("Getting AccessibleComponent - call to CallObjectMethod()", FALSE);
2007
PrintDebugString("[INFO]: AccessibleComponent = %p", returnedJobject);
2008
info->accessibleComponent = (returnedJobject != (jobject) 0 ? TRUE : FALSE);
2009
jniEnv->DeleteLocalRef(returnedJobject);
2010
EXCEPTION_CHECK("Getting AccessibleComponent - call to DeleteLocalRef()", FALSE);
2011
} else {
2012
PrintDebugString("[ERROR]: either env == 0 or getAccessibleComponentFromContextMethod == 0");
2013
return FALSE;
2014
}
2015
2016
// Get the AccessibleAction
2017
if (getAccessibleActionFromContextMethod != (jmethodID) 0) {
2018
returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
2019
getAccessibleActionFromContextMethod,
2020
accessibleContext);
2021
EXCEPTION_CHECK("Getting AccessibleAction - call to CallObjectMethod()", FALSE);
2022
PrintDebugString("[INFO]: AccessibleAction = %p", returnedJobject);
2023
info->accessibleAction = (returnedJobject != (jobject) 0 ? TRUE : FALSE);
2024
jniEnv->DeleteLocalRef(returnedJobject);
2025
EXCEPTION_CHECK("Getting AccessibleAction - call to DeleteLocalRef()", FALSE);
2026
} else {
2027
PrintDebugString("[ERROR]: either env == 0 or getAccessibleActionFromContextMethod == 0");
2028
return FALSE;
2029
}
2030
2031
// Get the AccessibleSelection
2032
if (getAccessibleSelectionFromContextMethod != (jmethodID) 0) {
2033
returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
2034
getAccessibleSelectionFromContextMethod,
2035
accessibleContext);
2036
EXCEPTION_CHECK("Getting AccessibleSelection - call to CallObjectMethod()", FALSE);
2037
PrintDebugString("[INFO]: AccessibleSelection = %p", returnedJobject);
2038
info->accessibleSelection = (returnedJobject != (jobject) 0 ? TRUE : FALSE);
2039
jniEnv->DeleteLocalRef(returnedJobject);
2040
EXCEPTION_CHECK("Getting AccessibleSelection - call to DeleteLocalRef()", FALSE);
2041
} else {
2042
PrintDebugString("[ERROR]: either env == 0 or getAccessibleSelectionFromContextMethod == 0");
2043
return FALSE;
2044
}
2045
2046
// Get the AccessibleTable
2047
if (getAccessibleTableFromContextMethod != (jmethodID) 0) {
2048
PrintDebugString("[INFO]: ##### Calling getAccessibleTableFromContextMethod ...");
2049
returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
2050
getAccessibleTableFromContextMethod,
2051
accessibleContext);
2052
PrintDebugString("[INFO]: ##### ... Returned from getAccessibleTableFromContextMethod");
2053
EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE);
2054
PrintDebugString("[INFO]: ##### AccessibleTable = %p", returnedJobject);
2055
if (returnedJobject != (jobject) 0) {
2056
info->accessibleInterfaces |= cAccessibleTableInterface;
2057
}
2058
jniEnv->DeleteLocalRef(returnedJobject);
2059
EXCEPTION_CHECK("##### Getting AccessibleTable - call to DeleteLocalRef()", FALSE);
2060
2061
/*
2062
returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
2063
getAccessibleTableFromContextMethod,
2064
AccessibleContext);
2065
PrintDebugString("##### ... Returned from getAccessibleTableFromContextMethod");
2066
EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE);
2067
PrintDebugString(" ##### AccessibleTable = %X", returnedJobject);
2068
info->accessibleTable = returnedJobject;
2069
*/
2070
2071
} else {
2072
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableFromContextMethod == 0");
2073
return FALSE;
2074
}
2075
2076
// Get the AccessibleText
2077
if (getAccessibleTextFromContextMethod != (jmethodID) 0) {
2078
returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
2079
getAccessibleTextFromContextMethod,
2080
accessibleContext);
2081
EXCEPTION_CHECK("Getting AccessibleText - call to CallObjectMethod()", FALSE);
2082
PrintDebugString("[INFO]: AccessibleText = %p", returnedJobject);
2083
info->accessibleText = (returnedJobject != (jobject) 0 ? TRUE : FALSE);
2084
jniEnv->DeleteLocalRef(returnedJobject);
2085
EXCEPTION_CHECK("Getting AccessibleText - call to DeleteLocalRef()", FALSE);
2086
} else {
2087
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextFromContextMethod == 0");
2088
return FALSE;
2089
}
2090
2091
// Get the AccessibleValue
2092
if (getAccessibleValueFromContextMethod != (jmethodID) 0) {
2093
returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
2094
getAccessibleValueFromContextMethod,
2095
accessibleContext);
2096
EXCEPTION_CHECK("Getting AccessibleValue - call to CallObjectMethod()", FALSE);
2097
PrintDebugString("[INFO]: AccessibleValue = %p", returnedJobject);
2098
if (returnedJobject != (jobject) 0) {
2099
info->accessibleInterfaces |= cAccessibleValueInterface;
2100
}
2101
jniEnv->DeleteLocalRef(returnedJobject);
2102
EXCEPTION_CHECK("Getting AccessibleValue - call to DeleteLocalRef()", FALSE);
2103
} else {
2104
PrintDebugString("[ERROR]: either env == 0 or getAccessibleValueFromContextMethod == 0");
2105
return FALSE;
2106
}
2107
2108
// FIX
2109
// get the AccessibleHypertext
2110
if (getAccessibleHypertextMethod != (jmethodID) 0 &&
2111
getAccessibleHyperlinkCountMethod != (jmethodID) 0 &&
2112
getAccessibleHyperlinkMethod != (jmethodID) 0 &&
2113
getAccessibleHyperlinkTextMethod != (jmethodID) 0 &&
2114
getAccessibleHyperlinkStartIndexMethod != (jmethodID) 0 &&
2115
getAccessibleHyperlinkEndIndexMethod != (jmethodID) 0) {
2116
returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
2117
getAccessibleHypertextMethod,
2118
accessibleContext);
2119
EXCEPTION_CHECK("Getting AccessibleHypertext - call to CallObjectMethod()", FALSE);
2120
PrintDebugString("[INFO]: AccessibleHypertext = %p",
2121
returnedJobject);
2122
if (returnedJobject != (jobject) 0) {
2123
info->accessibleInterfaces |= cAccessibleHypertextInterface;
2124
}
2125
jniEnv->DeleteLocalRef(returnedJobject);
2126
EXCEPTION_CHECK("Getting AccessibleHypertext - call to DeleteLocalRef()", FALSE);
2127
}
2128
2129
// set new accessibleInterfaces flags from old BOOL values
2130
if(info->accessibleComponent)
2131
info->accessibleInterfaces |= cAccessibleComponentInterface;
2132
if(info->accessibleAction)
2133
info->accessibleInterfaces |= cAccessibleActionInterface;
2134
if(info->accessibleSelection)
2135
info->accessibleInterfaces |= cAccessibleSelectionInterface;
2136
if(info->accessibleText)
2137
info->accessibleInterfaces |= cAccessibleTextInterface;
2138
// FIX END
2139
2140
return TRUE;
2141
}
2142
2143
/**
2144
* getAccessibleChildFromContext - performs the Java method call:
2145
* AccessibleContext AccessBridge.getAccessibleChildContext(AccessibleContext)
2146
*
2147
* Note: if the AccessibleContext parameter is bogus, this call will blow up
2148
*
2149
* Note: this call explicitly goes through the AccessBridge,
2150
* so that it can keep a reference the returned jobject for the JavaVM.
2151
* You must explicity call releaseJavaObject() when you are through using
2152
* the AccessibleContext returned, to let the AccessBridge know it can release the
2153
* object, so that the JavaVM can then garbage collect it.
2154
*/
2155
jobject
2156
AccessBridgeJavaEntryPoints::getAccessibleChildFromContext(jobject accessibleContext, jint childIndex) {
2157
jobject returnedAccessibleContext;
2158
jobject globalRef;
2159
jthrowable exception;
2160
2161
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleChildContext(%p, %d):",
2162
accessibleContext, childIndex);
2163
2164
if (getAccessibleChildFromContextMethod != (jmethodID) 0) {
2165
returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
2166
getAccessibleChildFromContextMethod,
2167
accessibleContext, childIndex);
2168
EXCEPTION_CHECK("Getting AccessibleChild - call to CallObjectMethod()", FALSE);
2169
globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
2170
EXCEPTION_CHECK("Getting AccessibleChild - call to NewGlobalRef()", FALSE);
2171
jniEnv->DeleteLocalRef(returnedAccessibleContext);
2172
EXCEPTION_CHECK("Getting AccessibleChild - call to DeleteLocalRef()", FALSE);
2173
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
2174
returnedAccessibleContext, globalRef);
2175
return globalRef;
2176
} else {
2177
PrintDebugString("[ERROR]: either env == 0 or getAccessibleChildContextMethod == 0");
2178
return (jobject) 0;
2179
}
2180
}
2181
2182
/**
2183
* getAccessibleParentFromContext - returns the AccessibleContext parent
2184
*
2185
*/
2186
jobject
2187
AccessBridgeJavaEntryPoints::getAccessibleParentFromContext(jobject accessibleContext)
2188
{
2189
jobject returnedAccessibleContext;
2190
jobject globalRef;
2191
jthrowable exception;
2192
2193
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleParentFromContext(%p):", accessibleContext);
2194
2195
if (getAccessibleParentFromContextMethod != (jmethodID) 0) {
2196
returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
2197
getAccessibleParentFromContextMethod,
2198
accessibleContext);
2199
EXCEPTION_CHECK("Getting AccessibleParent - call to CallObjectMethod()", FALSE);
2200
globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
2201
EXCEPTION_CHECK("Getting AccessibleParent - call to NewGlobalRef()", FALSE);
2202
jniEnv->DeleteLocalRef(returnedAccessibleContext);
2203
EXCEPTION_CHECK("Getting AccessibleParent - call to DeleteLocalRef()", FALSE);
2204
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
2205
returnedAccessibleContext, globalRef);
2206
return globalRef;
2207
} else {
2208
PrintDebugString("[ERROR]: either env == 0 or getAccessibleParentFromContextMethod == 0");
2209
return (jobject) 0;
2210
}
2211
}
2212
2213
2214
/********** AccessibleTable routines **********************************/
2215
2216
BOOL
2217
AccessBridgeJavaEntryPoints::getAccessibleTableInfo(jobject accessibleContext,
2218
AccessibleTableInfo *tableInfo) {
2219
2220
jthrowable exception;
2221
2222
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableInfo(%p):",
2223
accessibleContext);
2224
2225
// get the table row count
2226
if (getAccessibleTableRowCountMethod != (jmethodID) 0) {
2227
tableInfo->rowCount = jniEnv->CallIntMethod(accessBridgeObject,
2228
getAccessibleTableRowCountMethod,
2229
accessibleContext);
2230
EXCEPTION_CHECK("##### Getting AccessibleTableRowCount - call to CallIntMethod()", FALSE);
2231
PrintDebugString("[INFO]: ##### table row count = %d", tableInfo->rowCount);
2232
} else {
2233
PrintDebugString("[ERROR]: either env == 0 or getAccessibleRowCountMethod == 0");
2234
return FALSE;
2235
}
2236
2237
// get the table column count
2238
if (getAccessibleTableColumnCountMethod != (jmethodID) 0) {
2239
tableInfo->columnCount = jniEnv->CallIntMethod(accessBridgeObject,
2240
getAccessibleTableColumnCountMethod,
2241
accessibleContext);
2242
EXCEPTION_CHECK("Getting AccessibleTableColumnCount - call to CallIntMethod()", FALSE);
2243
PrintDebugString("[INFO]: ##### table column count = %d", tableInfo->columnCount);
2244
} else {
2245
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnCountMethod == 0");
2246
return FALSE;
2247
}
2248
2249
// get the AccessibleTable
2250
if (getAccessibleTableFromContextMethod != (jmethodID) 0) {
2251
PrintDebugString("[INFO]: ##### Calling getAccessibleTableFromContextMethod ...");
2252
jobject accTable = jniEnv->CallObjectMethod(accessBridgeObject,
2253
getAccessibleTableFromContextMethod,
2254
accessibleContext);
2255
PrintDebugString("[INFO]: ##### ... Returned from getAccessibleTableFromContextMethod");
2256
EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE);
2257
jobject globalRef = jniEnv->NewGlobalRef(accTable);
2258
EXCEPTION_CHECK("##### Getting AccessibleTable - call to NewGlobalRef()", FALSE);
2259
tableInfo->accessibleTable = (JOBJECT64)globalRef;
2260
PrintDebugString("[INFO]: ##### accessibleTable = %p", globalRef);
2261
} else {
2262
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableFromContextMethod == 0");
2263
return FALSE;
2264
}
2265
2266
// cache the AccessibleContext
2267
if (getContextFromAccessibleTableMethod != (jmethodID) 0) {
2268
PrintDebugString("[INFO]: ##### Calling getContextFromAccessibleTable Method ...");
2269
jobject ac = jniEnv->CallObjectMethod(accessBridgeObject,
2270
getContextFromAccessibleTableMethod,
2271
accessibleContext);
2272
PrintDebugString("[INFO]: ##### ... Returned from getContextFromAccessibleTable Method");
2273
EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE);
2274
jobject globalRef = jniEnv->NewGlobalRef(ac);
2275
EXCEPTION_CHECK("##### Getting AccessibleTable - call to NewGlobalRef()", FALSE);
2276
tableInfo->accessibleContext = (JOBJECT64)globalRef;
2277
PrintDebugString("[INFO]: ##### accessibleContext = %p", globalRef);
2278
} else {
2279
PrintDebugString("[ERROR]: either env == 0 or getContextFromAccessibleTable Method == 0");
2280
return FALSE;
2281
}
2282
2283
// FIX - set unused elements
2284
tableInfo->caption = NULL;
2285
tableInfo->summary = NULL;
2286
2287
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableInfo succeeded");
2288
return TRUE;
2289
}
2290
2291
BOOL
2292
AccessBridgeJavaEntryPoints::getAccessibleTableCellInfo(jobject accessibleTable, jint row, jint column,
2293
AccessibleTableCellInfo *tableCellInfo) {
2294
2295
jthrowable exception;
2296
2297
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableCellInfo(%p): row=%d, column=%d",
2298
accessibleTable, row, column);
2299
2300
// FIX
2301
ZeroMemory(tableCellInfo, sizeof(AccessibleTableCellInfo));
2302
tableCellInfo->row = row;
2303
tableCellInfo->column = column;
2304
// FIX END
2305
2306
// get the table cell index
2307
if (getAccessibleTableCellIndexMethod != (jmethodID) 0) {
2308
tableCellInfo->index = jniEnv->CallIntMethod(accessBridgeObject,
2309
getAccessibleTableCellIndexMethod,
2310
accessibleTable, row, column);
2311
EXCEPTION_CHECK("##### Getting AccessibleTableCellIndex - call to CallIntMethod()", FALSE);
2312
PrintDebugString("[INFO]: ##### table cell index = %d", tableCellInfo->index);
2313
} else {
2314
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableCellIndexMethod == 0");
2315
return FALSE;
2316
}
2317
2318
// get the table cell row extent
2319
if (getAccessibleTableCellRowExtentMethod != (jmethodID) 0) {
2320
tableCellInfo->rowExtent = jniEnv->CallIntMethod(accessBridgeObject,
2321
getAccessibleTableCellRowExtentMethod,
2322
accessibleTable, row, column);
2323
EXCEPTION_CHECK("##### Getting AccessibleTableCellRowExtentCount - call to CallIntMethod()", FALSE);
2324
PrintDebugString("[INFO]: ##### table cell row extent = %d", tableCellInfo->rowExtent);
2325
} else {
2326
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableCellRowExtentMethod == 0");
2327
return FALSE;
2328
}
2329
2330
// get the table cell column extent
2331
if (getAccessibleTableCellColumnExtentMethod != (jmethodID) 0) {
2332
tableCellInfo->columnExtent = jniEnv->CallIntMethod(accessBridgeObject,
2333
getAccessibleTableCellColumnExtentMethod,
2334
accessibleTable, row, column);
2335
EXCEPTION_CHECK("##### Getting AccessibleTableCellColumnExtentCount - call to CallIntMethod()", FALSE);
2336
PrintDebugString("[INFO]: ##### table cell column extent = %d", tableCellInfo->columnExtent);
2337
} else {
2338
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableCellColumnExtentMethod == 0");
2339
return FALSE;
2340
}
2341
2342
// get whether the table cell is selected
2343
if (isAccessibleTableCellSelectedMethod != (jmethodID) 0) {
2344
tableCellInfo->isSelected = jniEnv->CallBooleanMethod(accessBridgeObject,
2345
isAccessibleTableCellSelectedMethod,
2346
accessibleTable, row, column);
2347
EXCEPTION_CHECK("##### Getting isAccessibleTableCellSelected - call to CallBooleanMethod()", FALSE);
2348
PrintDebugString("[INFO]: ##### table cell isSelected = %d", tableCellInfo->isSelected);
2349
} else {
2350
PrintDebugString("[ERROR]: either env == 0 or isAccessibleTableCellSelectedMethod == 0");
2351
return FALSE;
2352
}
2353
2354
// get the table cell AccessibleContext
2355
if (getAccessibleTableCellAccessibleContextMethod != (jmethodID) 0) {
2356
jobject tableCellAC = jniEnv->CallObjectMethod(accessBridgeObject,
2357
getAccessibleTableCellAccessibleContextMethod,
2358
accessibleTable, row, column);
2359
EXCEPTION_CHECK("##### Getting AccessibleTableCellAccessibleContext - call to CallObjectMethod()", FALSE);
2360
jobject globalRef = jniEnv->NewGlobalRef(tableCellAC);
2361
EXCEPTION_CHECK("##### Getting AccessibleTableCellAccessibleContext - call to NewGlobalRef()", FALSE);
2362
tableCellInfo->accessibleContext = (JOBJECT64)globalRef;
2363
PrintDebugString("[INFO]: ##### table cell AccessibleContext = %p", globalRef);
2364
} else {
2365
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableCellAccessibleContextMethod == 0");
2366
return FALSE;
2367
}
2368
2369
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableCellInfo succeeded");
2370
return TRUE;
2371
}
2372
2373
BOOL
2374
AccessBridgeJavaEntryPoints::getAccessibleTableRowHeader(jobject acParent, AccessibleTableInfo *tableInfo) {
2375
2376
jthrowable exception;
2377
2378
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableRowHeader(%p):",
2379
acParent);
2380
2381
// get the header row count
2382
if (getAccessibleTableRowHeaderRowCountMethod != (jmethodID) 0) {
2383
tableInfo->rowCount = jniEnv->CallIntMethod(accessBridgeObject,
2384
getAccessibleTableRowHeaderRowCountMethod,
2385
acParent);
2386
EXCEPTION_CHECK("##### Getting AccessibleTableRowHeaderRowCount - call to CallIntMethod()", FALSE);
2387
PrintDebugString("[INFO]: ##### table row count = %d", tableInfo->rowCount);
2388
} else {
2389
PrintDebugString("[ERROR]: either env == 0 or getAccessibleRowHeaderRowCountMethod == 0");
2390
return FALSE;
2391
}
2392
2393
// get the header column count
2394
if (getAccessibleTableRowHeaderColumnCountMethod != (jmethodID) 0) {
2395
tableInfo->columnCount = jniEnv->CallIntMethod(accessBridgeObject,
2396
getAccessibleTableRowHeaderColumnCountMethod,
2397
acParent);
2398
EXCEPTION_CHECK("Getting AccessibleTableRowHeaderColumnCount - call to CallIntMethod()", FALSE);
2399
PrintDebugString("[INFO]: ##### table column count = %d", tableInfo->columnCount);
2400
} else {
2401
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowHeaderColumnCountMethod == 0");
2402
return FALSE;
2403
}
2404
2405
// get the header AccessibleTable
2406
if (getAccessibleTableRowHeaderMethod != (jmethodID) 0) {
2407
jobject accTable = jniEnv->CallObjectMethod(accessBridgeObject,
2408
getAccessibleTableRowHeaderMethod,
2409
acParent);
2410
EXCEPTION_CHECK("##### Getting AccessibleTableRowHeader - call to CallObjectMethod()", FALSE);
2411
jobject globalRef = jniEnv->NewGlobalRef(accTable);
2412
EXCEPTION_CHECK("##### Getting AccessibleTableRowHeader - call to NewGlobalRef()", FALSE);
2413
tableInfo->accessibleTable = (JOBJECT64)globalRef;
2414
PrintDebugString("[INFO]: ##### row header AccessibleTable = %p", globalRef);
2415
} else {
2416
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowHeaderMethod == 0");
2417
return FALSE;
2418
}
2419
2420
// FIX - set unused elements
2421
tableInfo->caption = NULL;
2422
tableInfo->summary = NULL;
2423
tableInfo->accessibleContext = NULL;
2424
2425
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableRowHeader succeeded");
2426
return TRUE;
2427
}
2428
2429
BOOL
2430
AccessBridgeJavaEntryPoints::getAccessibleTableColumnHeader(jobject acParent, AccessibleTableInfo *tableInfo) {
2431
jthrowable exception;
2432
2433
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableColumnHeader(%p):",
2434
acParent);
2435
2436
// get the header row count
2437
if (getAccessibleTableColumnHeaderRowCountMethod != (jmethodID) 0) {
2438
tableInfo->rowCount = jniEnv->CallIntMethod(accessBridgeObject,
2439
getAccessibleTableColumnHeaderRowCountMethod,
2440
acParent);
2441
EXCEPTION_CHECK("##### Getting AccessibleTableColumnHeaderRowCount - call to CallIntMethod()", FALSE);
2442
PrintDebugString("[INFO]: ##### table row count = %d", tableInfo->rowCount);
2443
} else {
2444
PrintDebugString("[ERROR]: either env == 0 or getAccessibleColumnHeaderRowCountMethod == 0");
2445
return FALSE;
2446
}
2447
2448
// get the header column count
2449
if (getAccessibleTableColumnHeaderColumnCountMethod != (jmethodID) 0) {
2450
tableInfo->columnCount = jniEnv->CallIntMethod(accessBridgeObject,
2451
getAccessibleTableColumnHeaderColumnCountMethod,
2452
acParent);
2453
EXCEPTION_CHECK("Getting AccessibleTableColumnHeaderColumnCount - call to CallIntMethod()", FALSE);
2454
PrintDebugString("[INFO]: ##### table column count = %d", tableInfo->columnCount);
2455
} else {
2456
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnHeaderColumnCountMethod == 0");
2457
return FALSE;
2458
}
2459
// get the header AccessibleTable
2460
if (getAccessibleTableColumnHeaderMethod != (jmethodID) 0) {
2461
jobject accTable = jniEnv->CallObjectMethod(accessBridgeObject,
2462
getAccessibleTableColumnHeaderMethod,
2463
acParent);
2464
EXCEPTION_CHECK("##### Getting AccessibleTableColumnHeader - call to CallObjectMethod()", FALSE);
2465
jobject globalRef = jniEnv->NewGlobalRef(accTable);
2466
EXCEPTION_CHECK("##### Getting AccessibleTableColumnHeader - call to NewGlobalRef()", FALSE);
2467
tableInfo->accessibleTable = (JOBJECT64)globalRef;
2468
PrintDebugString("[INFO]: ##### column header AccessibleTable = %p", globalRef);
2469
} else {
2470
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnHeaderMethod == 0");
2471
return FALSE;
2472
}
2473
2474
// FIX - set unused elements
2475
tableInfo->caption = NULL;
2476
tableInfo->summary = NULL;
2477
tableInfo->accessibleContext = NULL;
2478
2479
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableColumnHeader succeeded");
2480
return TRUE;
2481
}
2482
2483
jobject
2484
AccessBridgeJavaEntryPoints::getAccessibleTableRowDescription(jobject acParent, jint row) {
2485
2486
jobject returnedAccessibleContext;
2487
jobject globalRef;
2488
jthrowable exception;
2489
2490
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableRowDescription(%p):",
2491
acParent);
2492
2493
if (getAccessibleTableRowDescriptionMethod != (jmethodID) 0) {
2494
returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
2495
getAccessibleTableRowDescriptionMethod,
2496
acParent, row);
2497
EXCEPTION_CHECK("Getting AccessibleTableRowDescription - call to CallObjectMethod()", FALSE);
2498
globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
2499
EXCEPTION_CHECK("Getting AccessibleTableRowDescription - call to NewGlobalRef()", FALSE);
2500
jniEnv->DeleteLocalRef(returnedAccessibleContext);
2501
EXCEPTION_CHECK("Getting AccessibleTableRowDescription - call to DeleteLocalRef()", FALSE);
2502
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
2503
returnedAccessibleContext, globalRef);
2504
return globalRef;
2505
} else {
2506
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowDescriptionMethod == 0");
2507
return (jobject) 0;
2508
}
2509
}
2510
2511
jobject
2512
AccessBridgeJavaEntryPoints::getAccessibleTableColumnDescription(jobject acParent, jint column) {
2513
2514
jobject returnedAccessibleContext;
2515
jobject globalRef;
2516
jthrowable exception;
2517
2518
PrintDebugString("[INFO]: ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableColumnDescription(%p):",
2519
acParent);
2520
2521
if (getAccessibleTableColumnDescriptionMethod != (jmethodID) 0) {
2522
returnedAccessibleContext = jniEnv->CallObjectMethod(
2523
accessBridgeObject,
2524
getAccessibleTableColumnDescriptionMethod,
2525
acParent, column);
2526
EXCEPTION_CHECK("Getting AccessibleTableColumnDescription - call to CallObjectMethod()", FALSE);
2527
globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
2528
EXCEPTION_CHECK("Getting AccessibleTableColumnDescription - call to NewGlobalRef()", FALSE);
2529
jniEnv->DeleteLocalRef(returnedAccessibleContext);
2530
EXCEPTION_CHECK("Getting AccessibleTableColumnDescription - call to DeleteLocalRef()", FALSE);
2531
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
2532
returnedAccessibleContext, globalRef);
2533
return globalRef;
2534
} else {
2535
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnDescriptionMethod == 0");
2536
return (jobject) 0;
2537
}
2538
}
2539
2540
jint
2541
AccessBridgeJavaEntryPoints::getAccessibleTableRowSelectionCount(jobject accessibleTable) {
2542
2543
jthrowable exception;
2544
jint count;
2545
2546
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelectionCount(%p)",
2547
accessibleTable);
2548
2549
// Get the table row selection count
2550
if (getAccessibleTableRowSelectionCountMethod != (jmethodID) 0) {
2551
count = jniEnv->CallIntMethod(accessBridgeObject,
2552
getAccessibleTableRowSelectionCountMethod,
2553
accessibleTable);
2554
EXCEPTION_CHECK("##### Getting AccessibleTableRowSelectionCount - call to CallIntMethod()", FALSE);
2555
PrintDebugString("[INFO]: ##### table row selection count = %d", count);
2556
return count;
2557
} else {
2558
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowSelectionCountMethod == 0");
2559
return 0;
2560
}
2561
2562
PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelectionCount failed");
2563
return 0;
2564
}
2565
2566
BOOL
2567
AccessBridgeJavaEntryPoints::isAccessibleTableRowSelected(jobject accessibleTable, jint row) {
2568
jthrowable exception;
2569
BOOL result;
2570
2571
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::isAccessibleTableRowSelected(%p, %d)",
2572
accessibleTable, row);
2573
2574
if (isAccessibleTableRowSelectedMethod != (jmethodID) 0) {
2575
result = jniEnv->CallBooleanMethod(accessBridgeObject,
2576
isAccessibleTableRowSelectedMethod,
2577
accessibleTable, row);
2578
EXCEPTION_CHECK("##### Getting isAccessibleTableRowSelected - call to CallBooleanMethod()", FALSE);
2579
PrintDebugString("[INFO]: ##### table row isSelected = %d", result);
2580
return result;
2581
} else {
2582
PrintDebugString("[ERROR]: either env == 0 or isAccessibleTableRowSelectedMethod == 0");
2583
return FALSE;
2584
}
2585
2586
PrintDebugString("[ERROR]: AccessBridgeJavaEntryPoints::isAccessibleTableRowSelected failed");
2587
return FALSE;
2588
}
2589
2590
BOOL
2591
AccessBridgeJavaEntryPoints::getAccessibleTableRowSelections(jobject accessibleTable, jint count,
2592
jint *selections) {
2593
2594
jthrowable exception;
2595
2596
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelections(%p, %d %p)",
2597
accessibleTable, count, selections);
2598
2599
if (getAccessibleTableRowSelectionsMethod == (jmethodID) 0) {
2600
return FALSE;
2601
}
2602
// Get the table row selections
2603
for (int i = 0; i < count; i++) {
2604
2605
selections[i] = jniEnv->CallIntMethod(accessBridgeObject,
2606
getAccessibleTableRowSelectionsMethod,
2607
accessibleTable,
2608
i);
2609
EXCEPTION_CHECK("##### Getting AccessibleTableRowSelections - call to CallIntMethod()", FALSE);
2610
PrintDebugString("[INFO]: ##### table row selection[%d] = %d", i, selections[i]);
2611
}
2612
2613
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelections succeeded");
2614
return TRUE;
2615
}
2616
2617
2618
jint
2619
AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelectionCount(jobject accessibleTable) {
2620
2621
jthrowable exception;
2622
jint count;
2623
2624
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelectionCount(%p)",
2625
accessibleTable);
2626
2627
// Get the table column selection count
2628
if (getAccessibleTableColumnSelectionCountMethod != (jmethodID) 0) {
2629
count = jniEnv->CallIntMethod(accessBridgeObject,
2630
getAccessibleTableColumnSelectionCountMethod,
2631
accessibleTable);
2632
EXCEPTION_CHECK("##### Getting AccessibleTableColumnSelectionCount - call to CallIntMethod()", FALSE);
2633
PrintDebugString("[INFO]: ##### table column selection count = %d", count);
2634
return count;
2635
} else {
2636
PrintDebugString("[ERROR]: either env == 0 or getAccessibleRowCountMethod == 0");
2637
return 0;
2638
}
2639
2640
PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelectionCount failed");
2641
return 0;
2642
}
2643
2644
BOOL
2645
AccessBridgeJavaEntryPoints::isAccessibleTableColumnSelected(jobject accessibleTable, jint column) {
2646
jthrowable exception;
2647
BOOL result;
2648
2649
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::isAccessibleTableColumnSelected(%p, %d)",
2650
accessibleTable, column);
2651
2652
if (isAccessibleTableColumnSelectedMethod != (jmethodID) 0) {
2653
result = jniEnv->CallBooleanMethod(accessBridgeObject,
2654
isAccessibleTableColumnSelectedMethod,
2655
accessibleTable, column);
2656
EXCEPTION_CHECK("##### Getting isAccessibleTableColumnSelected - call to CallBooleanMethod()", FALSE);
2657
PrintDebugString("[INFO]: ##### table column isSelected = %d", result);
2658
return result;
2659
} else {
2660
PrintDebugString("[ERROR]: either env == 0 or isAccessibleTableColumnSelectedMethod == 0");
2661
return FALSE;
2662
}
2663
2664
PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::isAccessibleTableColumnSelected failed");
2665
return FALSE;
2666
}
2667
2668
BOOL
2669
AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelections(jobject accessibleTable, jint count,
2670
jint *selections) {
2671
jthrowable exception;
2672
2673
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelections(%p, %d, %p)",
2674
accessibleTable, count, selections);
2675
2676
if (getAccessibleTableColumnSelectionsMethod == (jmethodID) 0) {
2677
return FALSE;
2678
}
2679
// Get the table column selections
2680
for (int i = 0; i < count; i++) {
2681
2682
selections[i] = jniEnv->CallIntMethod(accessBridgeObject,
2683
getAccessibleTableColumnSelectionsMethod,
2684
accessibleTable,
2685
i);
2686
EXCEPTION_CHECK("##### Getting AccessibleTableColumnSelections - call to CallIntMethod()", FALSE);
2687
PrintDebugString("[INFO]: ##### table Column selection[%d] = %d", i, selections[i]);
2688
}
2689
2690
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelections succeeded");
2691
return TRUE;
2692
}
2693
2694
2695
jint
2696
AccessBridgeJavaEntryPoints::getAccessibleTableRow(jobject accessibleTable, jint index) {
2697
jthrowable exception;
2698
jint result;
2699
2700
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRow(%p, index=%d)",
2701
accessibleTable, index);
2702
2703
if (getAccessibleTableRowMethod != (jmethodID) 0) {
2704
result = jniEnv->CallIntMethod(accessBridgeObject,
2705
getAccessibleTableRowMethod,
2706
accessibleTable, index);
2707
EXCEPTION_CHECK("##### Getting AccessibleTableRow - call to CallIntMethod()", FALSE);
2708
PrintDebugString("[INFO]: ##### table row = %d", result);
2709
return result;
2710
} else {
2711
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableRowMethod == 0");
2712
return -1;
2713
}
2714
2715
PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableRow failed");
2716
return -1;
2717
}
2718
2719
jint
2720
AccessBridgeJavaEntryPoints::getAccessibleTableColumn(jobject accessibleTable, jint index) {
2721
jthrowable exception;
2722
jint result;
2723
2724
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumn(%p, index=%d)",
2725
accessibleTable, index);
2726
2727
if (getAccessibleTableColumnMethod != (jmethodID) 0) {
2728
result = jniEnv->CallIntMethod(accessBridgeObject,
2729
getAccessibleTableColumnMethod,
2730
accessibleTable, index);
2731
EXCEPTION_CHECK("##### Getting AccessibleTableColumn - call to CallIntMethod()", FALSE);
2732
PrintDebugString("[INFO]: ##### table column = %d", result);
2733
return result;
2734
} else {
2735
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableColumnMethod == 0");
2736
return -1;
2737
}
2738
2739
PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumn failed");
2740
return -1;
2741
}
2742
2743
jint
2744
AccessBridgeJavaEntryPoints::getAccessibleTableIndex(jobject accessibleTable, jint row, jint column) {
2745
jthrowable exception;
2746
jint result;
2747
2748
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableIndex(%p, row=%d, col=%d)",
2749
accessibleTable, row, column);
2750
2751
if (getAccessibleTableIndexMethod != (jmethodID) 0) {
2752
result = jniEnv->CallIntMethod(accessBridgeObject,
2753
getAccessibleTableIndexMethod,
2754
accessibleTable, row, column);
2755
EXCEPTION_CHECK("##### Getting getAccessibleTableIndex - call to CallIntMethod()", FALSE);
2756
PrintDebugString("[INFO]: ##### table index = %d", result);
2757
return result;
2758
} else {
2759
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTableIndexMethod == 0");
2760
return -1;
2761
}
2762
2763
PrintDebugString("[ERROR]: ##### AccessBridgeJavaEntryPoints::getAccessibleTableIndex failed");
2764
return -1;
2765
}
2766
2767
/********** end AccessibleTable routines ******************************/
2768
2769
2770
/********** begin AccessibleRelationSet routines **********************/
2771
2772
BOOL
2773
AccessBridgeJavaEntryPoints::getAccessibleRelationSet(jobject accessibleContext,
2774
AccessibleRelationSetInfo *relationSet) {
2775
2776
jthrowable exception;
2777
const wchar_t *stringBytes;
2778
jsize length;
2779
2780
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleRelationSet(%p, %p)",
2781
accessibleContext, relationSet);
2782
2783
if (getAccessibleRelationCountMethod == (jmethodID) 0 ||
2784
getAccessibleRelationKeyMethod == (jmethodID) 0 ||
2785
getAccessibleRelationTargetCountMethod == (jmethodID) 0 ||
2786
getAccessibleRelationTargetMethod == (jmethodID) 0) {
2787
return FALSE;
2788
}
2789
2790
// Get the relations set count
2791
relationSet->relationCount = jniEnv->CallIntMethod(accessBridgeObject,
2792
getAccessibleRelationCountMethod,
2793
accessibleContext);
2794
EXCEPTION_CHECK("##### Getting AccessibleRelationCount - call to CallIntMethod()", FALSE);
2795
PrintDebugString("[INFO]: ##### AccessibleRelation count = %d", relationSet->relationCount);
2796
2797
2798
// Get the relation set
2799
for (int i = 0; i < relationSet->relationCount && i < MAX_RELATIONS; i++) {
2800
2801
jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
2802
getAccessibleRelationKeyMethod,
2803
accessibleContext,
2804
i);
2805
2806
EXCEPTION_CHECK("Getting AccessibleRelationKey - call to CallObjectMethod()", FALSE);
2807
if (js != (jstring) 0) {
2808
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
2809
EXCEPTION_CHECK("Getting AccessibleRelation key - call to GetStringChars()", FALSE);
2810
wcsncpy(relationSet->relations[i].key, stringBytes, (sizeof(relationSet->relations[i].key ) / sizeof(wchar_t)));
2811
length = jniEnv->GetStringLength(js);
2812
relationSet->relations[i].key [length < (sizeof(relationSet->relations[i].key ) / sizeof(wchar_t)) ?
2813
length : (sizeof(relationSet->relations[i].key ) / sizeof(wchar_t))-2] = (wchar_t) 0;
2814
EXCEPTION_CHECK("Getting AccessibleRelation key - call to GetStringLength()", FALSE);
2815
jniEnv->ReleaseStringChars(js, stringBytes);
2816
EXCEPTION_CHECK("Getting AccessibleRelation key - call to ReleaseStringChars()", FALSE);
2817
// jniEnv->CallVoidMethod(accessBridgeObject,
2818
// decrementReferenceMethod, js);
2819
//EXCEPTION_CHECK("Getting AccessibleRelation key - call to CallVoidMethod()", FALSE);
2820
PrintDebugString("[INFO]: ##### AccessibleRelation key = %ls", relationSet->relations[i].key );
2821
jniEnv->DeleteLocalRef(js);
2822
EXCEPTION_CHECK("Getting AccessibleRelation key - call to DeleteLocalRef()", FALSE);
2823
} else {
2824
PrintDebugString("[WARN]: AccessibleRelation key is null.");
2825
relationSet->relations[i].key [0] = (wchar_t) 0;
2826
}
2827
2828
relationSet->relations[i].targetCount = jniEnv->CallIntMethod(accessBridgeObject,
2829
getAccessibleRelationTargetCountMethod,
2830
accessibleContext,
2831
i);
2832
2833
for (int j = 0; j < relationSet->relations[i].targetCount && j < MAX_RELATION_TARGETS; j++) {
2834
jobject target = jniEnv->CallObjectMethod(accessBridgeObject, getAccessibleRelationTargetMethod,
2835
accessibleContext, i, j);
2836
EXCEPTION_CHECK("Getting AccessibleRelationSet - call to CallObjectMethod()", FALSE);
2837
jobject globalRef = jniEnv->NewGlobalRef(target);
2838
EXCEPTION_CHECK("Getting AccessibleRelationSet - call to NewGlobalRef()", FALSE);
2839
relationSet->relations[i].targets[j] = (JOBJECT64)globalRef;
2840
PrintDebugString("[INFO]: relation set item: %p", globalRef);
2841
}
2842
}
2843
2844
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleRelationSet succeeded");
2845
return TRUE;
2846
}
2847
2848
2849
/********** end AccessibleRelationSet routines ************************/
2850
2851
2852
/********** begin AccessibleHypertext routines **********************/
2853
2854
BOOL
2855
AccessBridgeJavaEntryPoints::getAccessibleHypertext(jobject accessibleContext,
2856
AccessibleHypertextInfo *hypertext) {
2857
2858
jthrowable exception;
2859
const wchar_t *stringBytes;
2860
jsize length;
2861
2862
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertext(%p, %p)",
2863
accessibleContext, hypertext);
2864
2865
// get the AccessibleHypertext
2866
jobject ht = jniEnv->CallObjectMethod(accessBridgeObject,
2867
getAccessibleHypertextMethod,
2868
accessibleContext);
2869
EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to CallObjectMethod()", FALSE);
2870
jobject globalRef = jniEnv->NewGlobalRef(ht);
2871
EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to NewGlobalRef()", FALSE);
2872
hypertext->accessibleHypertext = (JOBJECT64)globalRef;
2873
PrintDebugString("[INFO]: ##### AccessibleHypertext = %p", globalRef);
2874
2875
if (hypertext->accessibleHypertext == 0) {
2876
PrintDebugString("[WARN]: ##### null AccessibleHypertext; returning FALSE");
2877
return false;
2878
}
2879
2880
// get the hyperlink count
2881
hypertext->linkCount = jniEnv->CallIntMethod(accessBridgeObject,
2882
getAccessibleHyperlinkCountMethod,accessibleContext);
2883
2884
EXCEPTION_CHECK("##### Getting hyperlink count - call to CallIntMethod()", FALSE);
2885
PrintDebugString("[INFO]: ##### hyperlink count = %d", hypertext->linkCount);
2886
2887
2888
// get the hypertext links
2889
for (int i = 0; i < hypertext->linkCount && i < MAX_HYPERLINKS; i++) {
2890
2891
// get the hyperlink
2892
jobject hl = jniEnv->CallObjectMethod(accessBridgeObject,
2893
getAccessibleHyperlinkMethod,
2894
accessibleContext,
2895
i);
2896
EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to CallObjectMethod()", FALSE);
2897
jobject globalRef = jniEnv->NewGlobalRef(hl);
2898
EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to NewGlobalRef()", FALSE);
2899
hypertext->links[i].accessibleHyperlink = (JOBJECT64)globalRef;
2900
PrintDebugString("[INFO]: ##### AccessibleHyperlink = %p", globalRef);
2901
2902
// get the hyperlink text
2903
jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
2904
getAccessibleHyperlinkTextMethod,
2905
hypertext->links[i].accessibleHyperlink,
2906
i);
2907
2908
EXCEPTION_CHECK("Getting hyperlink text - call to CallObjectMethod()", FALSE);
2909
if (js != (jstring) 0) {
2910
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
2911
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringChars()", FALSE);
2912
wcsncpy(hypertext->links[i].text, stringBytes, (sizeof(hypertext->links[i].text) / sizeof(wchar_t)));
2913
length = jniEnv->GetStringLength(js);
2914
if (length >= (sizeof(hypertext->links[i].text) / sizeof(wchar_t))) {
2915
length = (sizeof(hypertext->links[i].text) / sizeof(wchar_t)) - 2;
2916
}
2917
hypertext->links[i].text[length] = (wchar_t) 0;
2918
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringLength()", FALSE);
2919
jniEnv->ReleaseStringChars(js, stringBytes);
2920
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to ReleaseStringChars()", FALSE);
2921
// jniEnv->CallVoidMethod(accessBridgeObject,
2922
// decrementReferenceMethod, js);
2923
//EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to CallVoidMethod()", FALSE);
2924
PrintDebugString("[INFO]: ##### AccessibleHyperlink text = %ls", hypertext->links[i].text );
2925
jniEnv->DeleteLocalRef(js);
2926
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to DeleteLocalRef()", FALSE);
2927
} else {
2928
PrintDebugString("[WARN]: AccessibleHyperlink text is null.");
2929
hypertext->links[i].text[0] = (wchar_t) 0;
2930
}
2931
2932
hypertext->links[i].startIndex = jniEnv->CallIntMethod(accessBridgeObject,
2933
getAccessibleHyperlinkStartIndexMethod,
2934
hypertext->links[i].accessibleHyperlink,
2935
i);
2936
EXCEPTION_CHECK("##### Getting hyperlink start index - call to CallIntMethod()", FALSE);
2937
PrintDebugString("[INFO]: ##### hyperlink start index = %d", hypertext->links[i].startIndex);
2938
2939
2940
hypertext->links[i].endIndex = jniEnv->CallIntMethod(accessBridgeObject,
2941
getAccessibleHyperlinkEndIndexMethod,
2942
hypertext->links[i].accessibleHyperlink,
2943
i);
2944
EXCEPTION_CHECK("##### Getting hyperlink end index - call to CallIntMethod()", FALSE);
2945
PrintDebugString("[INFO]: ##### hyperlink end index = %d", hypertext->links[i].endIndex);
2946
2947
}
2948
2949
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertext succeeded");
2950
return TRUE;
2951
}
2952
2953
/*
2954
* Activates an AccessibleHyperlink
2955
*/
2956
BOOL
2957
AccessBridgeJavaEntryPoints::activateAccessibleHyperlink(jobject accessibleContext,
2958
jobject accessibleHyperlink) {
2959
2960
jthrowable exception;
2961
BOOL returnVal;
2962
2963
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::activateAccessibleHyperlink(%p, %p):",
2964
accessibleContext, accessibleHyperlink);
2965
2966
if (activateAccessibleHyperlinkMethod != (jmethodID) 0) {
2967
returnVal = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, activateAccessibleHyperlinkMethod,
2968
accessibleContext, accessibleHyperlink);
2969
EXCEPTION_CHECK("activateAccessibleHyperlink - call to CallBooleanMethod()", FALSE);
2970
return returnVal;
2971
} else {
2972
PrintDebugString("[ERROR]: either jniEnv == 0 or activateAccessibleHyperlinkMethod == 0");
2973
return FALSE;
2974
}
2975
}
2976
2977
2978
/*
2979
* This method is used to iterate through the hyperlinks in a component. It
2980
* returns hypertext information for a component starting at hyperlink index
2981
* nStartIndex. No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will
2982
* be returned for each call to this method.
2983
* returns FALSE on error.
2984
*/
2985
BOOL
2986
AccessBridgeJavaEntryPoints::getAccessibleHypertextExt(const jobject accessibleContext,
2987
const jint nStartIndex,
2988
/* OUT */ AccessibleHypertextInfo *hypertext) {
2989
2990
jthrowable exception;
2991
const wchar_t *stringBytes;
2992
jsize length;
2993
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertextExt(%p, %p, startIndex = %d)",
2994
accessibleContext, hypertext, nStartIndex);
2995
2996
// get the AccessibleHypertext
2997
jobject ht = jniEnv->CallObjectMethod(accessBridgeObject, getAccessibleHypertextMethod,
2998
accessibleContext);
2999
EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to CallObjectMethod()", FALSE);
3000
jobject globalRef = jniEnv->NewGlobalRef(ht);
3001
EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to NewGlobalRef()", FALSE);
3002
hypertext->accessibleHypertext = (JOBJECT64)globalRef;
3003
PrintDebugString("[INFO]: ##### AccessibleHypertext = %p", globalRef);
3004
if (hypertext->accessibleHypertext == 0) {
3005
PrintDebugString("[WARN]: ##### null AccessibleHypertext; returning FALSE");
3006
return FALSE;
3007
}
3008
3009
// get the hyperlink count
3010
hypertext->linkCount = jniEnv->CallIntMethod(accessBridgeObject, getAccessibleHyperlinkCountMethod,
3011
accessibleContext);
3012
EXCEPTION_CHECK("##### Getting hyperlink count - call to CallIntMethod()", FALSE);
3013
PrintDebugString("[INFO]: ##### hyperlink count = %d", hypertext->linkCount);
3014
3015
if (nStartIndex >= hypertext->linkCount) {
3016
return FALSE;
3017
}
3018
3019
// get the hypertext links
3020
// NOTE: To avoid a crash when there are more than MAX_HYPERLINKS (64) links
3021
// in the document, test for i < MAX_HYPERLINKS in addition to
3022
// i < hypertext->linkCount
3023
int bufIndex = 0;
3024
for (int i = nStartIndex; (i < hypertext->linkCount) && (i < nStartIndex + MAX_HYPERLINKS); i++) {
3025
PrintDebugString("[INFO]: getting hyperlink %d ...", i);
3026
3027
// get the hyperlink
3028
jobject hl = jniEnv->CallObjectMethod(accessBridgeObject,
3029
getAccessibleHyperlinkMethod,
3030
hypertext->accessibleHypertext,
3031
i);
3032
EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to CallObjectMethod()", FALSE);
3033
jobject globalRef = jniEnv->NewGlobalRef(hl);
3034
EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to NewGlobalRef()", FALSE);
3035
hypertext->links[bufIndex].accessibleHyperlink = (JOBJECT64)globalRef;
3036
PrintDebugString("[INFO]: ##### AccessibleHyperlink = %p", globalRef);
3037
3038
// get the hyperlink text
3039
jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
3040
getAccessibleHyperlinkTextMethod,
3041
hypertext->links[bufIndex].accessibleHyperlink,
3042
i);
3043
3044
EXCEPTION_CHECK("Getting hyperlink text - call to CallObjectMethod()", FALSE);
3045
if (js != (jstring) 0) {
3046
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3047
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringChars()", FALSE);
3048
wcsncpy(hypertext->links[bufIndex].text, stringBytes,
3049
(sizeof(hypertext->links[bufIndex].text) / sizeof(wchar_t)));
3050
length = jniEnv->GetStringLength(js);
3051
if (length >= (sizeof(hypertext->links[bufIndex].text) / sizeof(wchar_t))) {
3052
length = (sizeof(hypertext->links[bufIndex].text) / sizeof(wchar_t)) - 2;
3053
}
3054
hypertext->links[bufIndex].text[length] = (wchar_t) 0;
3055
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringLength()", FALSE);
3056
jniEnv->ReleaseStringChars(js, stringBytes);
3057
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to ReleaseStringChars()", FALSE);
3058
// jniEnv->CallVoidMethod(accessBridgeObject,
3059
// decrementReferenceMethod, js);
3060
//EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to CallVoidMethod()", FALSE);
3061
PrintDebugString("[INFO]: ##### AccessibleHyperlink text = %ls", hypertext->links[bufIndex].text );
3062
jniEnv->DeleteLocalRef(js);
3063
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to DeleteLocalRef()", FALSE);
3064
3065
} else {
3066
PrintDebugString("[WARN]: AccessibleHyperlink text is null.");
3067
hypertext->links[bufIndex].text[0] = (wchar_t) 0;
3068
}
3069
3070
hypertext->links[bufIndex].startIndex = jniEnv->CallIntMethod(accessBridgeObject,
3071
getAccessibleHyperlinkStartIndexMethod,
3072
hypertext->links[bufIndex].accessibleHyperlink,
3073
i);
3074
EXCEPTION_CHECK("##### Getting hyperlink start index - call to CallIntMethod()", FALSE);
3075
PrintDebugString("[INFO]: ##### hyperlink start index = %d", hypertext->links[bufIndex].startIndex);
3076
3077
hypertext->links[bufIndex].endIndex = jniEnv->CallIntMethod(accessBridgeObject,
3078
getAccessibleHyperlinkEndIndexMethod,
3079
hypertext->links[bufIndex].accessibleHyperlink,
3080
i);
3081
EXCEPTION_CHECK("##### Getting hyperlink end index - call to CallIntMethod()", FALSE);
3082
PrintDebugString("[INFO]: ##### hyperlink end index = %d", hypertext->links[bufIndex].endIndex);
3083
3084
bufIndex++;
3085
}
3086
3087
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertextExt succeeded");
3088
return TRUE;
3089
}
3090
3091
jint AccessBridgeJavaEntryPoints::getAccessibleHyperlinkCount(const jobject accessibleContext) {
3092
3093
jthrowable exception;
3094
3095
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHyperlinkCount(%X)",
3096
accessibleContext);
3097
3098
if (getAccessibleHyperlinkCountMethod == (jmethodID)0) {
3099
return -1;
3100
}
3101
3102
// get the hyperlink count
3103
jint linkCount = jniEnv->CallIntMethod(accessBridgeObject, getAccessibleHyperlinkCountMethod,
3104
accessibleContext);
3105
EXCEPTION_CHECK("##### Getting hyperlink count - call to CallIntMethod()", -1);
3106
PrintDebugString("[INFO]: ##### hyperlink count = %d", linkCount);
3107
3108
return linkCount;
3109
}
3110
3111
3112
jint AccessBridgeJavaEntryPoints::getAccessibleHypertextLinkIndex(const jobject hypertext,
3113
const jint nIndex) {
3114
3115
jthrowable exception;
3116
3117
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHypertextLinkIndex(%p, index = %d)",
3118
hypertext, nIndex);
3119
3120
if (getAccessibleHypertextLinkIndexMethod == (jmethodID)0) {
3121
return -1;
3122
}
3123
3124
// get the hyperlink index
3125
jint index = jniEnv->CallIntMethod(accessBridgeObject, getAccessibleHypertextLinkIndexMethod,
3126
hypertext, nIndex);
3127
3128
EXCEPTION_CHECK("##### Getting hyperlink index - call to CallIntMethod()", -1);
3129
PrintDebugString("[INFO]: ##### hyperlink index = %d", index);
3130
3131
return index;
3132
}
3133
3134
BOOL AccessBridgeJavaEntryPoints::getAccessibleHyperlink(jobject hypertext,
3135
const jint index,
3136
/* OUT */ AccessibleHyperlinkInfo *info) {
3137
3138
jthrowable exception;
3139
const wchar_t *stringBytes;
3140
jsize length;
3141
3142
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleHyperlink(%p, index = %d)",
3143
hypertext, index);
3144
3145
3146
// get the hyperlink
3147
jobject hl = jniEnv->CallObjectMethod(accessBridgeObject,
3148
getAccessibleHyperlinkMethod,
3149
hypertext,
3150
index);
3151
EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to CallObjectMethod()", FALSE);
3152
jobject globalRef = jniEnv->NewGlobalRef(hl);
3153
EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to NewGlobalRef()", FALSE);
3154
info->accessibleHyperlink = (JOBJECT64)globalRef;
3155
PrintDebugString("[INFO]: ##### AccessibleHyperlink = %p", globalRef);
3156
3157
// get the hyperlink text
3158
jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
3159
getAccessibleHyperlinkTextMethod,
3160
info->accessibleHyperlink,
3161
index);
3162
3163
EXCEPTION_CHECK("Getting hyperlink text - call to CallObjectMethod()", FALSE);
3164
if (js != (jstring) 0) {
3165
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3166
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringChars()", FALSE);
3167
wcsncpy(info->text, stringBytes,
3168
(sizeof(info->text) / sizeof(wchar_t)));
3169
length = jniEnv->GetStringLength(js);
3170
if (length >= (sizeof(info->text) / sizeof(wchar_t))) {
3171
length = (sizeof(info->text) / sizeof(wchar_t)) - 2;
3172
}
3173
info->text[length] = (wchar_t) 0;
3174
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringLength()", FALSE);
3175
jniEnv->ReleaseStringChars(js, stringBytes);
3176
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to ReleaseStringChars()", FALSE);
3177
// jniEnv->CallVoidMethod(accessBridgeObject,
3178
// decrementReferenceMethod, js);
3179
//EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to CallVoidMethod()", FALSE);
3180
PrintDebugString("[INFO]: ##### AccessibleHyperlink text = %ls", info->text );
3181
jniEnv->DeleteLocalRef(js);
3182
EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to DeleteLocalRef()", FALSE);
3183
3184
} else {
3185
PrintDebugString("[WARN]: AccessibleHyperlink text is null.");
3186
info->text[0] = (wchar_t) 0;
3187
}
3188
3189
info->startIndex = jniEnv->CallIntMethod(accessBridgeObject,
3190
getAccessibleHyperlinkStartIndexMethod,
3191
info->accessibleHyperlink,
3192
index);
3193
EXCEPTION_CHECK("##### Getting hyperlink start index - call to CallIntMethod()", FALSE);
3194
PrintDebugString("[INFO]: ##### hyperlink start index = %d", info->startIndex);
3195
3196
info->endIndex = jniEnv->CallIntMethod(accessBridgeObject,
3197
getAccessibleHyperlinkEndIndexMethod,
3198
info->accessibleHyperlink,
3199
index);
3200
EXCEPTION_CHECK("##### Getting hyperlink end index - call to CallIntMethod()", FALSE);
3201
PrintDebugString("[INFO]: ##### hyperlink end index = %d", info->endIndex);
3202
3203
return TRUE;
3204
}
3205
3206
3207
/********** end AccessibleHypertext routines ************************/
3208
3209
// Accessible Keybinding methods
3210
BOOL AccessBridgeJavaEntryPoints::getAccessibleKeyBindings(jobject accessibleContext,
3211
AccessibleKeyBindings *keyBindings) {
3212
3213
jthrowable exception;
3214
3215
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleKeyBindings(%p, %p)",
3216
accessibleContext, keyBindings);
3217
3218
if (getAccessibleKeyBindingsCountMethod == (jmethodID) 0 ||
3219
getAccessibleKeyBindingCharMethod == (jmethodID) 0 ||
3220
getAccessibleKeyBindingModifiersMethod == (jmethodID) 0) {
3221
return FALSE;
3222
}
3223
3224
// get the key binding count
3225
keyBindings->keyBindingsCount = jniEnv->CallIntMethod(accessBridgeObject,
3226
getAccessibleKeyBindingsCountMethod, accessibleContext);
3227
3228
EXCEPTION_CHECK("##### Getting key bindings count - call to CallIntMethod()", FALSE);
3229
3230
PrintDebugString("[INFO]: ##### key bindings count = %d", keyBindings->keyBindingsCount);
3231
3232
// get the key bindings
3233
for (int i = 0; i < keyBindings->keyBindingsCount && i < MAX_KEY_BINDINGS; i++) {
3234
3235
// get the key binding character
3236
keyBindings->keyBindingInfo[i].character = jniEnv->CallCharMethod(accessBridgeObject,
3237
getAccessibleKeyBindingCharMethod,
3238
accessibleContext,
3239
i);
3240
EXCEPTION_CHECK("##### Getting key binding character - call to CallCharMethod()", FALSE);
3241
PrintDebugString("[INFO]: ##### key binding character = %c"\
3242
" ##### key binding character in hex = %hx"\
3243
, keyBindings->keyBindingInfo[i].character, keyBindings->keyBindingInfo[i].character);
3244
3245
// get the key binding modifiers
3246
keyBindings->keyBindingInfo[i].modifiers = jniEnv->CallIntMethod(accessBridgeObject,
3247
getAccessibleKeyBindingModifiersMethod,
3248
accessibleContext,
3249
i);
3250
EXCEPTION_CHECK("##### Getting key binding modifiers - call to CallIntMethod()", FALSE);
3251
PrintDebugString("[INFO]: ##### key binding modifiers = %x", keyBindings->keyBindingInfo[i].modifiers);
3252
}
3253
return FALSE;
3254
}
3255
3256
// AccessibleIcon methods
3257
BOOL AccessBridgeJavaEntryPoints::getAccessibleIcons(jobject accessibleContext,
3258
AccessibleIcons *icons) {
3259
3260
jthrowable exception;
3261
const wchar_t *stringBytes;
3262
jsize length;
3263
3264
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleIcons(%p, %p)",
3265
accessibleContext, icons);
3266
3267
if (getAccessibleIconsCountMethod == (jmethodID) 0 ||
3268
getAccessibleIconDescriptionMethod == (jmethodID) 0 ||
3269
getAccessibleIconHeightMethod == (jmethodID) 0 ||
3270
getAccessibleIconWidthMethod == (jmethodID) 0) {
3271
PrintDebugString("[WARN]: ##### missing method(s) !!!");
3272
return FALSE;
3273
}
3274
3275
3276
// get the icons count
3277
icons->iconsCount = jniEnv->CallIntMethod(accessBridgeObject,
3278
getAccessibleIconsCountMethod, accessibleContext);
3279
3280
EXCEPTION_CHECK("##### Getting icons count - call to CallIntMethod()", FALSE);
3281
PrintDebugString("[INFO]: ##### icons count = %d", icons->iconsCount);
3282
3283
3284
// get the icons
3285
for (int i = 0; i < icons->iconsCount && i < MAX_ICON_INFO; i++) {
3286
3287
// get the icon description
3288
jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
3289
getAccessibleIconDescriptionMethod,
3290
accessibleContext,
3291
i);
3292
3293
EXCEPTION_CHECK("Getting icon description - call to CallObjectMethod()", FALSE);
3294
if (js != (jstring) 0) {
3295
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3296
EXCEPTION_CHECK("Getting AccessibleIcon description - call to GetStringChars()", FALSE);
3297
wcsncpy(icons->iconInfo[i].description, stringBytes, (sizeof(icons->iconInfo[i].description) / sizeof(wchar_t)));
3298
length = jniEnv->GetStringLength(js);
3299
if (length >= (sizeof(icons->iconInfo[i].description) / sizeof(wchar_t))) {
3300
length = (sizeof(icons->iconInfo[i].description) / sizeof(wchar_t)) - 2;
3301
}
3302
icons->iconInfo[i].description[length] = (wchar_t) 0;
3303
EXCEPTION_CHECK("Getting AccessibleIcon description - call to GetStringLength()", FALSE);
3304
jniEnv->ReleaseStringChars(js, stringBytes);
3305
EXCEPTION_CHECK("Getting AccessibleIcon description - call to ReleaseStringChars()", FALSE);
3306
// jniEnv->CallVoidMethod(accessBridgeObject,
3307
// decrementReferenceMethod, js);
3308
//EXCEPTION_CHECK("Getting AccessibleIcon description - call to CallVoidMethod()", FALSE);
3309
PrintDebugString("[INFO]: ##### AccessibleIcon description = %ls", icons->iconInfo[i].description );
3310
jniEnv->DeleteLocalRef(js);
3311
EXCEPTION_CHECK("Getting AccessibleIcon description - call to DeleteLocalRef()", FALSE);
3312
} else {
3313
PrintDebugString("[WARN]: AccessibleIcon description is null.");
3314
icons->iconInfo[i].description[0] = (wchar_t) 0;
3315
}
3316
3317
3318
// get the icon height
3319
icons->iconInfo[i].height = jniEnv->CallIntMethod(accessBridgeObject,
3320
getAccessibleIconHeightMethod,
3321
accessibleContext,
3322
i);
3323
EXCEPTION_CHECK("##### Getting icon height - call to CallIntMethod()", FALSE);
3324
PrintDebugString("[INFO]: ##### icon height = %d", icons->iconInfo[i].height);
3325
3326
// get the icon width
3327
icons->iconInfo[i].width = jniEnv->CallIntMethod(accessBridgeObject,
3328
getAccessibleIconWidthMethod,
3329
accessibleContext,
3330
i);
3331
EXCEPTION_CHECK("##### Getting icon width - call to CallIntMethod()", FALSE);
3332
PrintDebugString("[INFO]: ##### icon width = %d", icons->iconInfo[i].width);
3333
}
3334
return FALSE;
3335
}
3336
3337
// AccessibleActionMethods
3338
BOOL AccessBridgeJavaEntryPoints::getAccessibleActions(jobject accessibleContext,
3339
AccessibleActions *actions) {
3340
3341
jthrowable exception;
3342
const wchar_t *stringBytes;
3343
jsize length;
3344
3345
PrintDebugString("[INFO]: ##### AccessBridgeJavaEntryPoints::getAccessibleIcons(%p, %p)",
3346
accessibleContext, actions);
3347
3348
if (getAccessibleActionsCountMethod == (jmethodID) 0 ||
3349
getAccessibleActionNameMethod == (jmethodID) 0) {
3350
PrintDebugString("[WARN]: ##### missing method(s) !!!");
3351
return FALSE;
3352
}
3353
3354
3355
// get the icons count
3356
actions->actionsCount = jniEnv->CallIntMethod(accessBridgeObject,
3357
getAccessibleActionsCountMethod,accessibleContext);
3358
3359
EXCEPTION_CHECK("##### Getting actions count - call to CallIntMethod()", FALSE);
3360
PrintDebugString("[INFO]: ##### key actions count = %d", actions->actionsCount);
3361
3362
3363
// get the actions
3364
for (int i = 0; i < actions->actionsCount && i < MAX_ACTION_INFO; i++) {
3365
3366
// get the action name
3367
jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
3368
getAccessibleActionNameMethod,
3369
accessibleContext,
3370
i);
3371
3372
EXCEPTION_CHECK("Getting Action Name - call to CallObjectMethod()", FALSE);
3373
if (js != (jstring) 0) {
3374
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3375
EXCEPTION_CHECK("Getting AccessibleAction Name - call to GetStringChars()", FALSE);
3376
wcsncpy(actions->actionInfo[i].name , stringBytes, (sizeof(actions->actionInfo[i].name ) / sizeof(wchar_t)));
3377
length = jniEnv->GetStringLength(js);
3378
if (length >= (sizeof(actions->actionInfo[i].name ) / sizeof(wchar_t))) {
3379
length = (sizeof(actions->actionInfo[i].name ) / sizeof(wchar_t)) - 2;
3380
}
3381
actions->actionInfo[i].name [length] = (wchar_t) 0;
3382
EXCEPTION_CHECK("Getting AccessibleAction name - call to GetStringLength()", FALSE);
3383
jniEnv->ReleaseStringChars(js, stringBytes);
3384
EXCEPTION_CHECK("Getting AccessibleAction name - call to ReleaseStringChars()", FALSE);
3385
// jniEnv->CallVoidMethod(accessBridgeObject,
3386
// decrementReferenceMethod, js);
3387
//EXCEPTION_CHECK("Getting AccessibleAction name - call to CallVoidMethod()", FALSE);
3388
PrintDebugString("[INFO]: ##### AccessibleAction name = %ls", actions->actionInfo[i].name );
3389
jniEnv->DeleteLocalRef(js);
3390
EXCEPTION_CHECK("Getting AccessibleAction name - call to DeleteLocalRef()", FALSE);
3391
} else {
3392
PrintDebugString("[WARN]: AccessibleAction name is null.");
3393
actions->actionInfo[i].name [0] = (wchar_t) 0;
3394
}
3395
}
3396
return FALSE;
3397
}
3398
3399
BOOL AccessBridgeJavaEntryPoints::doAccessibleActions(jobject accessibleContext,
3400
AccessibleActionsToDo *actionsToDo,
3401
jint *failure) {
3402
3403
jthrowable exception;
3404
BOOL returnVal;
3405
3406
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::doAccessibleActions(%p, #actions %d %s):",
3407
accessibleContext,
3408
actionsToDo->actionsCount,
3409
actionsToDo->actions[0].name);
3410
3411
if (doAccessibleActionsMethod == (jmethodID) 0) {
3412
*failure = 0;
3413
return FALSE;
3414
}
3415
3416
PrintDebugString("[INFO]: doing %d actions ...", actionsToDo->actionsCount);
3417
for (int i = 0; i < actionsToDo->actionsCount && i < MAX_ACTIONS_TO_DO; i++) {
3418
PrintDebugString("[INFO]: doing action %d: %s ...", i, actionsToDo->actions[i].name);
3419
3420
// create a Java String for the action name
3421
wchar_t *actionName = (wchar_t *)actionsToDo->actions[i].name;
3422
jstring javaName = jniEnv->NewString(actionName, (jsize)wcslen(actionName));
3423
if (javaName == 0) {
3424
PrintDebugString("[ERROR]: NewString failed");
3425
*failure = i;
3426
return FALSE;
3427
}
3428
3429
returnVal = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject, doAccessibleActionsMethod,
3430
accessibleContext, javaName);
3431
jniEnv->DeleteLocalRef(javaName);
3432
EXCEPTION_CHECK("doAccessibleActions - call to CallBooleanMethod()", FALSE);
3433
3434
if (returnVal != TRUE) {
3435
PrintDebugString("[ERROR]: Action %d failed", i);
3436
*failure = i;
3437
return FALSE;
3438
}
3439
}
3440
*failure = -1;
3441
return TRUE;
3442
}
3443
3444
3445
/********** AccessibleText routines ***********************************/
3446
3447
BOOL
3448
AccessBridgeJavaEntryPoints::getAccessibleTextInfo(jobject accessibleContext,
3449
AccessibleTextInfo *textInfo,
3450
jint x, jint y) {
3451
jthrowable exception;
3452
3453
// Verify the Java VM still exists and AccessibleContext is
3454
// an instance of AccessibleText
3455
if (verifyAccessibleText(accessibleContext) == FALSE) {
3456
return FALSE;
3457
}
3458
3459
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextInfo(%p, %d, %d):",
3460
accessibleContext, x, y);
3461
3462
// Get the character count
3463
if (getAccessibleCharCountFromContextMethod != (jmethodID) 0) {
3464
textInfo->charCount = jniEnv->CallIntMethod(accessBridgeObject,
3465
getAccessibleCharCountFromContextMethod,
3466
accessibleContext);
3467
EXCEPTION_CHECK("Getting AccessibleCharCount - call to CallIntMethod()", FALSE);
3468
PrintDebugString("[INFO]: Char count = %d", textInfo->charCount);
3469
} else {
3470
PrintDebugString("[ERROR]: either env == 0 or getAccessibleCharCountFromContextMethod == 0");
3471
return FALSE;
3472
}
3473
3474
// Get the index of the caret
3475
if (getAccessibleCaretPositionFromContextMethod != (jmethodID) 0) {
3476
textInfo->caretIndex = jniEnv->CallIntMethod(accessBridgeObject,
3477
getAccessibleCaretPositionFromContextMethod,
3478
accessibleContext);
3479
EXCEPTION_CHECK("Getting AccessibleCaretPosition - call to CallIntMethod()", FALSE);
3480
PrintDebugString("[INFO]: Index at caret = %d", textInfo->caretIndex);
3481
} else {
3482
PrintDebugString("[ERROR]: either env == 0 or getAccessibleCaretPositionFromContextMethod == 0");
3483
return FALSE;
3484
}
3485
3486
// Get the index at the given point
3487
if (getAccessibleIndexAtPointFromContextMethod != (jmethodID) 0) {
3488
// If x or y is -1 return -1
3489
if (x == -1 || y == -1) {
3490
textInfo->indexAtPoint = -1;
3491
} else {
3492
textInfo->indexAtPoint = jniEnv->CallIntMethod(accessBridgeObject,
3493
getAccessibleIndexAtPointFromContextMethod,
3494
accessibleContext, x, y);
3495
EXCEPTION_CHECK("Getting AccessibleIndexAtPoint - call to CallIntMethod()", FALSE);
3496
}
3497
PrintDebugString("[INFO]: Index at point = %d", textInfo->indexAtPoint);
3498
} else {
3499
PrintDebugString("[ERROR]: either env == 0 or getAccessibleIndexAtPointFromContextMethod == 0");
3500
return FALSE;
3501
}
3502
return TRUE;
3503
}
3504
3505
BOOL
3506
AccessBridgeJavaEntryPoints::getAccessibleTextItems(jobject accessibleContext,
3507
AccessibleTextItemsInfo *textItems, jint index) {
3508
jstring js;
3509
const wchar_t *stringBytes;
3510
jthrowable exception;
3511
jsize length;
3512
3513
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextItems(%p):", accessibleContext);
3514
3515
// Verify the Java VM still exists and AccessibleContext is
3516
// an instance of AccessibleText
3517
if (verifyAccessibleText(accessibleContext) == FALSE) {
3518
return FALSE;
3519
}
3520
3521
// Get the letter at index
3522
if (getAccessibleLetterAtIndexFromContextMethod != (jmethodID) 0) {
3523
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
3524
getAccessibleLetterAtIndexFromContextMethod,
3525
accessibleContext, index);
3526
EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to CallIntMethod()", FALSE);
3527
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
3528
if (js != (jstring) 0) {
3529
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3530
EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to GetStringChars()", FALSE);
3531
textItems->letter = stringBytes[0];
3532
jniEnv->ReleaseStringChars(js, stringBytes);
3533
EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to ReleaseStringChars()", FALSE);
3534
jniEnv->CallVoidMethod(accessBridgeObject,
3535
decrementReferenceMethod, js);
3536
EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to CallVoidMethod()", FALSE);
3537
PrintDebugString("[INFO]: Accessible Text letter = %c", textItems->letter);
3538
jniEnv->DeleteLocalRef(js);
3539
EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to DeleteLocalRef()", FALSE);
3540
} else {
3541
PrintDebugString("[WARN]: Accessible Text letter is null.");
3542
textItems->letter = (wchar_t) 0;
3543
}
3544
} else {
3545
PrintDebugString("[ERROR]: either env == 0 or getAccessibleLetterAtIndexFromContextMethod == 0");
3546
return FALSE;
3547
}
3548
3549
3550
// Get the word at index
3551
if (getAccessibleWordAtIndexFromContextMethod != (jmethodID) 0) {
3552
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
3553
getAccessibleWordAtIndexFromContextMethod,
3554
accessibleContext, index);
3555
EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to CallIntMethod()", FALSE);
3556
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
3557
if (js != (jstring) 0) {
3558
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3559
EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to GetStringChars()", FALSE);
3560
wcsncpy(textItems->word, stringBytes, (sizeof(textItems->word) / sizeof(wchar_t)));
3561
length = jniEnv->GetStringLength(js);
3562
textItems->word[length < (sizeof(textItems->word) / sizeof(wchar_t)) ?
3563
length : (sizeof(textItems->word) / sizeof(wchar_t))-2] = (wchar_t) 0;
3564
EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to GetStringLength()", FALSE);
3565
jniEnv->ReleaseStringChars(js, stringBytes);
3566
EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to ReleaseStringChars()", FALSE);
3567
jniEnv->CallVoidMethod(accessBridgeObject,
3568
decrementReferenceMethod, js);
3569
EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to CallVoidMethod()", FALSE);
3570
wPrintDebugString(L"[INFO]: Accessible Text word = %ls", textItems->word);
3571
jniEnv->DeleteLocalRef(js);
3572
EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to DeleteLocalRef()", FALSE);
3573
} else {
3574
PrintDebugString("[WARN]: Accessible Text word is null.");
3575
textItems->word[0] = (wchar_t) 0;
3576
}
3577
} else {
3578
PrintDebugString("[ERROR]: either env == 0 or getAccessibleWordAtIndexFromContextMethod == 0");
3579
return FALSE;
3580
}
3581
3582
// Get the sentence at index
3583
if (getAccessibleSentenceAtIndexFromContextMethod != (jmethodID) 0) {
3584
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
3585
getAccessibleSentenceAtIndexFromContextMethod,
3586
accessibleContext, index);
3587
EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to CallObjectMethod()", FALSE);
3588
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
3589
if (js != (jstring) 0) {
3590
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3591
EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to GetStringChars()", FALSE);
3592
wcsncpy(textItems->sentence, stringBytes, (sizeof(textItems->sentence) / sizeof(wchar_t))-2);
3593
length = jniEnv->GetStringLength(js);
3594
3595
if (length < sizeof(textItems->sentence) / sizeof(wchar_t)) {
3596
textItems->sentence[length] = (wchar_t) 0;
3597
} else {
3598
textItems->sentence[(sizeof(textItems->sentence) / sizeof(wchar_t))-2] = (wchar_t) 0;
3599
}
3600
EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to GetStringLength()", FALSE);
3601
jniEnv->ReleaseStringChars(js, stringBytes);
3602
EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to ReleaseStringChars()", FALSE);
3603
jniEnv->CallVoidMethod(accessBridgeObject,
3604
decrementReferenceMethod, js);
3605
EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to CallVoidMethod()", FALSE);
3606
wPrintDebugString(L"[INFO]: Accessible Text sentence = %ls", textItems->sentence);
3607
jniEnv->DeleteLocalRef(js);
3608
EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to DeleteLocalRef()", FALSE);
3609
} else {
3610
PrintDebugString("[WARN]: Accessible Text sentence is null.");
3611
textItems->sentence[0] = (wchar_t) 0;
3612
}
3613
} else {
3614
PrintDebugString("[ERROR]: either env == 0 or getAccessibleSentenceAtIndexFromContextMethod == 0");
3615
return FALSE;
3616
}
3617
3618
return TRUE;
3619
}
3620
3621
BOOL
3622
AccessBridgeJavaEntryPoints::getAccessibleTextSelectionInfo(jobject accessibleContext,
3623
AccessibleTextSelectionInfo *selectionInfo) {
3624
jstring js;
3625
const wchar_t *stringBytes;
3626
jthrowable exception;
3627
jsize length;
3628
3629
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextSelectionInfo(%p):",
3630
accessibleContext);
3631
3632
// Verify the Java VM still exists and AccessibleContext is
3633
// an instance of AccessibleText
3634
if (verifyAccessibleText(accessibleContext) == FALSE) {
3635
return FALSE;
3636
}
3637
3638
// Get the selection start index
3639
if (getAccessibleTextSelectionStartFromContextMethod != (jmethodID) 0) {
3640
selectionInfo->selectionStartIndex = jniEnv->CallIntMethod(accessBridgeObject,
3641
getAccessibleTextSelectionStartFromContextMethod,
3642
accessibleContext);
3643
EXCEPTION_CHECK("Getting AccessibleTextSelectionStart - call to CallIntMethod()", FALSE);
3644
PrintDebugString("[INFO]: Selection start = %d", selectionInfo->selectionStartIndex);
3645
} else {
3646
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextSelectionStartFromContextMethod == 0");
3647
return FALSE;
3648
}
3649
3650
// Get the selection end index
3651
if (getAccessibleTextSelectionEndFromContextMethod != (jmethodID) 0) {
3652
selectionInfo->selectionEndIndex = jniEnv->CallIntMethod(accessBridgeObject,
3653
getAccessibleTextSelectionEndFromContextMethod,
3654
accessibleContext);
3655
EXCEPTION_CHECK("Getting AccessibleTextSelectionEnd - call to CallIntMethod()", FALSE);
3656
PrintDebugString("[INFO]: Selection end = %d", selectionInfo->selectionEndIndex);
3657
} else {
3658
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextSelectionEndFromContextMethod == 0");
3659
return FALSE;
3660
}
3661
3662
// Get the selected text
3663
if (getAccessibleTextSelectedTextFromContextMethod != (jmethodID) 0) {
3664
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
3665
getAccessibleTextSelectedTextFromContextMethod,
3666
accessibleContext);
3667
EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to CallObjectMethod()", FALSE);
3668
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
3669
if (js != (jstring) 0) {
3670
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3671
EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to GetStringChars()", FALSE);
3672
wcsncpy(selectionInfo->selectedText, stringBytes, (sizeof(selectionInfo->selectedText) / sizeof(wchar_t)));
3673
length = jniEnv->GetStringLength(js);
3674
selectionInfo->selectedText[length < (sizeof(selectionInfo->selectedText) / sizeof(wchar_t)) ?
3675
length : (sizeof(selectionInfo->selectedText) / sizeof(wchar_t))-2] = (wchar_t) 0;
3676
EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to GetStringLength()", FALSE);
3677
jniEnv->ReleaseStringChars(js, stringBytes);
3678
EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to ReleaseStringChars()", FALSE);
3679
jniEnv->CallVoidMethod(accessBridgeObject,
3680
decrementReferenceMethod, js);
3681
EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to CallVoidMethod()", FALSE);
3682
PrintDebugString("[INFO]: Accessible's selected text = %s", selectionInfo->selectedText);
3683
jniEnv->DeleteLocalRef(js);
3684
EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to DeleteLocalRef()", FALSE);
3685
} else {
3686
PrintDebugString("[WARN]: Accessible's selected text is null.");
3687
selectionInfo->selectedText[0] = (wchar_t) 0;
3688
}
3689
} else {
3690
PrintDebugString("[WARN]: either env == 0 or getAccessibleTextSelectedTextFromContextMethod == 0");
3691
return FALSE;
3692
}
3693
return TRUE;
3694
}
3695
3696
BOOL
3697
AccessBridgeJavaEntryPoints::getAccessibleTextAttributes(jobject accessibleContext, jint index, AccessibleTextAttributesInfo *attributes) {
3698
jstring js;
3699
const wchar_t *stringBytes;
3700
jobject AttributeSet;
3701
jthrowable exception;
3702
jsize length;
3703
3704
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextAttributes(%p):", accessibleContext);
3705
3706
// Verify the Java VM still exists and AccessibleContext is
3707
// an instance of AccessibleText
3708
if (verifyAccessibleText(accessibleContext) == FALSE) {
3709
return FALSE;
3710
}
3711
3712
if (accessibleContext == (jobject) 0) {
3713
PrintDebugString("[WARN]: passed in AccessibleContext == null! (oops)");
3714
3715
attributes->bold = FALSE;
3716
attributes->italic = FALSE;
3717
attributes->underline = FALSE;
3718
attributes->strikethrough = FALSE;
3719
attributes->superscript = FALSE;
3720
attributes->subscript = FALSE;
3721
attributes->backgroundColor[0] = (wchar_t) 0;
3722
attributes->foregroundColor[0] = (wchar_t) 0;
3723
attributes->fontFamily[0] = (wchar_t) 0;
3724
attributes->fontSize = -1;
3725
attributes->alignment = -1;
3726
attributes->bidiLevel = -1;
3727
attributes->firstLineIndent = -1;
3728
attributes->leftIndent = -1;
3729
attributes->rightIndent = -1;
3730
attributes->lineSpacing = -1;
3731
attributes->spaceAbove = -1;
3732
attributes->spaceBelow = -1;
3733
attributes->fullAttributesString[0] = (wchar_t) 0;
3734
3735
return (FALSE);
3736
}
3737
3738
// Get the AttributeSet
3739
if (getAccessibleAttributeSetAtIndexFromContextMethod != (jmethodID) 0) {
3740
PrintDebugString("[INFO]: Getting AttributeSet at index...");
3741
AttributeSet = jniEnv->CallObjectMethod(accessBridgeObject,
3742
getAccessibleAttributeSetAtIndexFromContextMethod,
3743
accessibleContext, index);
3744
EXCEPTION_CHECK("Getting AccessibleAttributeSetAtIndex - call to CallObjectMethod()", FALSE);
3745
} else {
3746
PrintDebugString("[ERROR]: either env == 0 or getAccessibleAttributeSetAtIndexFromContextMethod == 0");
3747
return FALSE;
3748
}
3749
3750
// It is legal for the AttributeSet object to be null, in which case we return false!
3751
if (AttributeSet == (jobject) 0) {
3752
PrintDebugString("[WARN]: AttributeSet returned at index is null (this is legal! - see AWT in J2SE 1.3");
3753
3754
attributes->bold = FALSE;
3755
attributes->italic = FALSE;
3756
attributes->underline = FALSE;
3757
attributes->strikethrough = FALSE;
3758
attributes->superscript = FALSE;
3759
attributes->subscript = FALSE;
3760
attributes->backgroundColor[0] = (wchar_t) 0;
3761
attributes->foregroundColor[0] = (wchar_t) 0;
3762
attributes->fontFamily[0] = (wchar_t) 0;
3763
attributes->fontSize = -1;
3764
attributes->alignment = -1;
3765
attributes->bidiLevel = -1;
3766
attributes->firstLineIndent = -1;
3767
attributes->leftIndent = -1;
3768
attributes->rightIndent = -1;
3769
attributes->lineSpacing = -1;
3770
attributes->spaceAbove = -1;
3771
attributes->spaceBelow = -1;
3772
attributes->fullAttributesString[0] = (wchar_t) 0;
3773
3774
return (FALSE);
3775
}
3776
3777
// Get the bold setting
3778
if (getBoldFromAttributeSetMethod != (jmethodID) 0) {
3779
PrintDebugString("[INFO]: Getting bold from AttributeSet...");
3780
attributes->bold = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
3781
getBoldFromAttributeSetMethod,
3782
AttributeSet);
3783
EXCEPTION_CHECK("Getting BoldFromAttributeSet - call to CallBooleanMethod()", FALSE);
3784
} else {
3785
PrintDebugString("[ERROR]: either env == 0 or getBoldFromAttributeSetMethod == 0");
3786
jniEnv->CallVoidMethod(accessBridgeObject,
3787
decrementReferenceMethod, AttributeSet);
3788
EXCEPTION_CHECK("Getting BoldFromAttributeSet - call to CallVoidMethod()", FALSE);
3789
jniEnv->DeleteLocalRef(AttributeSet);
3790
EXCEPTION_CHECK("Getting BoldFromAttributeSet - call to DeleteLocalRef()", FALSE);
3791
return FALSE;
3792
}
3793
3794
// Get the italic setting
3795
if (getItalicFromAttributeSetMethod != (jmethodID) 0) {
3796
PrintDebugString("[INFO]: Getting italic from AttributeSet...");
3797
attributes->italic = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
3798
getItalicFromAttributeSetMethod,
3799
AttributeSet);
3800
EXCEPTION_CHECK("Getting ItalicFromAttributeSet - call to CallBooleanMethod()", FALSE);
3801
} else {
3802
PrintDebugString("[ERROR]: either env == 0 or getItalicdFromAttributeSetMethod == 0");
3803
jniEnv->CallVoidMethod(accessBridgeObject,
3804
decrementReferenceMethod, AttributeSet);
3805
EXCEPTION_CHECK("Getting ItalicFromAttributeSet - call to CallVoidMethod()", FALSE);
3806
jniEnv->DeleteLocalRef(AttributeSet);
3807
EXCEPTION_CHECK("Getting ItalicFromAttributeSet - call to DeleteLocalRef()", FALSE);
3808
return FALSE;
3809
}
3810
3811
// Get the underline setting
3812
if (getUnderlineFromAttributeSetMethod != (jmethodID) 0) {
3813
PrintDebugString("[INFO]: Getting underline from AttributeSet...");
3814
attributes->underline = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
3815
getUnderlineFromAttributeSetMethod,
3816
AttributeSet);
3817
EXCEPTION_CHECK("Getting UnderlineFromAttributeSet - call to CallBooleanMethod()", FALSE);
3818
} else {
3819
PrintDebugString("[ERROR]: either env == 0 or getUnderlineFromAttributeSetMethod == 0");
3820
jniEnv->CallVoidMethod(accessBridgeObject,
3821
decrementReferenceMethod, AttributeSet);
3822
EXCEPTION_CHECK("Getting UnderlineFromAttributeSet - call to CallVoidMethod()", FALSE);
3823
jniEnv->DeleteLocalRef(AttributeSet);
3824
EXCEPTION_CHECK("Getting UnderlineFromAttributeSet - call to DeleteLocalRef()", FALSE);
3825
return FALSE;
3826
}
3827
3828
// Get the strikethrough setting
3829
if (getStrikethroughFromAttributeSetMethod != (jmethodID) 0) {
3830
PrintDebugString("[INFO]: Getting strikethrough from AttributeSet...");
3831
attributes->strikethrough = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
3832
getStrikethroughFromAttributeSetMethod,
3833
AttributeSet);
3834
EXCEPTION_CHECK("Getting StrikethroughFromAttributeSet - call to CallBooleanMethod()", FALSE);
3835
} else {
3836
PrintDebugString("[ERROR]: either env == 0 or getStrikethroughFromAttributeSetMethod == 0");
3837
jniEnv->CallVoidMethod(accessBridgeObject,
3838
decrementReferenceMethod, AttributeSet);
3839
EXCEPTION_CHECK("Getting StrikethroughFromAttributeSet - call to CallVoidMethod()", FALSE);
3840
jniEnv->DeleteLocalRef(AttributeSet);
3841
EXCEPTION_CHECK("Getting StrikethroughFromAttributeSet - call to DeleteLocalRef()", FALSE);
3842
return FALSE;
3843
}
3844
3845
// Get the superscript setting
3846
if (getSuperscriptFromAttributeSetMethod != (jmethodID) 0) {
3847
PrintDebugString("[INFO]: Getting superscript from AttributeSet...");
3848
attributes->superscript = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
3849
getSuperscriptFromAttributeSetMethod,
3850
AttributeSet);
3851
EXCEPTION_CHECK("Getting SuperscriptFromAttributeSet - call to CallBooleanMethod()", FALSE);
3852
} else {
3853
PrintDebugString("[ERROR]: either env == 0 or getSuperscripteFromAttributeSetMethod == 0");
3854
jniEnv->CallVoidMethod(accessBridgeObject,
3855
decrementReferenceMethod, AttributeSet);
3856
EXCEPTION_CHECK("Getting SuperscriptFromAttributeSet - call to CallVoidMethod()", FALSE);
3857
jniEnv->DeleteLocalRef(AttributeSet);
3858
EXCEPTION_CHECK("Getting SuperscriptFromAttributeSet - call to DeleteLocalRef()", FALSE);
3859
return FALSE;
3860
}
3861
3862
// Get the subscript setting
3863
if (getSubscriptFromAttributeSetMethod != (jmethodID) 0) {
3864
PrintDebugString("[INFO]: Getting subscript from AttributeSet...");
3865
attributes->subscript = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
3866
getSubscriptFromAttributeSetMethod,
3867
AttributeSet);
3868
EXCEPTION_CHECK("Getting SubscriptFromAttributeSet - call to CallBooleanMethod()", FALSE);
3869
} else {
3870
PrintDebugString("[ERROR]: either env == 0 or getSubscriptFromAttributeSetMethod == 0");
3871
jniEnv->CallVoidMethod(accessBridgeObject,
3872
decrementReferenceMethod, AttributeSet);
3873
EXCEPTION_CHECK("Getting SubscriptFromAttributeSet - call to CallVoidMethod()", FALSE);
3874
jniEnv->DeleteLocalRef(AttributeSet);
3875
EXCEPTION_CHECK("Getting SubscriptFromAttributeSet - call to DeleteLocalRef()", FALSE);
3876
return FALSE;
3877
}
3878
3879
// Get the backgroundColor setting
3880
if (getBackgroundColorFromAttributeSetMethod != (jmethodID) 0) {
3881
PrintDebugString("[INFO]: Getting backgroundColor from AttributeSet...");
3882
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
3883
getBackgroundColorFromAttributeSetMethod,
3884
AttributeSet);
3885
EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to CallObjectMethod()", FALSE);
3886
if (js != (jstring) 0) {
3887
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3888
EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to GetStringChars()", FALSE);
3889
wcsncpy(attributes->backgroundColor, stringBytes, (sizeof(attributes->backgroundColor) / sizeof(wchar_t)));
3890
length = jniEnv->GetStringLength(js);
3891
attributes->backgroundColor[length < (sizeof(attributes->backgroundColor) / sizeof(wchar_t)) ?
3892
length : (sizeof(attributes->backgroundColor) / sizeof(wchar_t))-2] = (wchar_t) 0;
3893
EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to GetStringLength()", FALSE);
3894
jniEnv->ReleaseStringChars(js, stringBytes);
3895
EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to ReleaseStringChars()", FALSE);
3896
jniEnv->CallVoidMethod(accessBridgeObject,
3897
decrementReferenceMethod, js);
3898
EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to CallVoidMethod()", FALSE);
3899
wPrintDebugString(L"[INFO]: AttributeSet's background color = %ls", attributes->backgroundColor);
3900
jniEnv->DeleteLocalRef(js);
3901
EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE);
3902
} else {
3903
PrintDebugString("[WARN]: AttributeSet's background color is null.");
3904
attributes->backgroundColor[0] = (wchar_t) 0;
3905
}
3906
} else {
3907
PrintDebugString("[ERROR]: either env == 0 or getBackgroundColorFromAttributeSetMethod == 0");
3908
jniEnv->CallVoidMethod(accessBridgeObject,
3909
decrementReferenceMethod, AttributeSet);
3910
EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to CallVoidMethod()", FALSE);
3911
jniEnv->DeleteLocalRef(AttributeSet);
3912
EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE);
3913
return FALSE;
3914
}
3915
3916
// Get the foregroundColor setting
3917
if (getForegroundColorFromAttributeSetMethod != (jmethodID) 0) {
3918
PrintDebugString("[INFO]: Getting foregroundColor from AttributeSet...");
3919
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
3920
getForegroundColorFromAttributeSetMethod,
3921
AttributeSet);
3922
EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to CallObjectMethod()", FALSE);
3923
if (js != (jstring) 0) {
3924
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3925
EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to GetStringChars()", FALSE);
3926
wcsncpy(attributes->foregroundColor, stringBytes, (sizeof(attributes->foregroundColor) / sizeof(wchar_t)));
3927
length = jniEnv->GetStringLength(js);
3928
attributes->foregroundColor[length < (sizeof(attributes->foregroundColor) / sizeof(wchar_t)) ?
3929
length : (sizeof(attributes->foregroundColor) / sizeof(wchar_t))-2] = (wchar_t) 0;
3930
EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to GetStringLength()", FALSE);
3931
jniEnv->ReleaseStringChars(js, stringBytes);
3932
EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to ReleaseStringChars()", FALSE);
3933
jniEnv->CallVoidMethod(accessBridgeObject,
3934
decrementReferenceMethod, js);
3935
EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to CallVoidMethod()", FALSE);
3936
wPrintDebugString(L"[INFO]: AttributeSet's foreground color = %ls", attributes->foregroundColor);
3937
jniEnv->DeleteLocalRef(js);
3938
EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE);
3939
} else {
3940
PrintDebugString("[WARN]: AttributeSet's foreground color is null.");
3941
attributes->foregroundColor[0] = (wchar_t) 0;
3942
}
3943
} else {
3944
PrintDebugString("[ERROR]: either env == 0 or getForegroundColorFromAttributeSetMethod == 0");
3945
jniEnv->CallVoidMethod(accessBridgeObject,
3946
decrementReferenceMethod, AttributeSet);
3947
EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to CallVoidMethod()", FALSE);
3948
jniEnv->DeleteLocalRef(AttributeSet);
3949
EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE);
3950
return FALSE;
3951
}
3952
3953
// Get the fontFamily setting
3954
if (getFontFamilyFromAttributeSetMethod != (jmethodID) 0) {
3955
PrintDebugString("[INFO]: Getting fontFamily from AttributeSet...");
3956
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
3957
getFontFamilyFromAttributeSetMethod,
3958
AttributeSet);
3959
EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to CallObjectMethod()", FALSE);
3960
if (js != (jstring) 0) {
3961
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
3962
EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to GetStringChars()", FALSE);
3963
wcsncpy(attributes->fontFamily, stringBytes, (sizeof(attributes->fontFamily) / sizeof(wchar_t)));
3964
length = jniEnv->GetStringLength(js);
3965
attributes->fontFamily[length < (sizeof(attributes->fontFamily) / sizeof(wchar_t)) ?
3966
length : (sizeof(attributes->fontFamily) / sizeof(wchar_t))-2] = (wchar_t) 0;
3967
EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to GetStringLength()", FALSE);
3968
jniEnv->ReleaseStringChars(js, stringBytes);
3969
EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to ReleaseStringChars()", FALSE);
3970
jniEnv->CallVoidMethod(accessBridgeObject,
3971
decrementReferenceMethod, js);
3972
EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to CallVoidMethod()", FALSE);
3973
wPrintDebugString(L"[INFO]: AttributeSet's fontFamily = %ls", attributes->fontFamily);
3974
jniEnv->DeleteLocalRef(js);
3975
EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to DeleteLocalRef()", FALSE);
3976
} else {
3977
PrintDebugString("[WARN]: AttributeSet's fontFamily is null.");
3978
attributes->backgroundColor[0] = (wchar_t) 0;
3979
}
3980
} else {
3981
PrintDebugString("[ERROR]: either env == 0 or getFontFamilyFromAttributeSetMethod == 0");
3982
jniEnv->CallVoidMethod(accessBridgeObject,
3983
decrementReferenceMethod, AttributeSet);
3984
EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to CallVoidMethod()", FALSE);
3985
jniEnv->DeleteLocalRef(AttributeSet);
3986
EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to DeleteLocalRef()", FALSE);
3987
return FALSE;
3988
}
3989
3990
// Get the font size
3991
if (getFontSizeFromAttributeSetMethod != (jmethodID) 0) {
3992
PrintDebugString("[INFO]: Getting font size from AttributeSet...");
3993
attributes->fontSize = jniEnv->CallIntMethod(accessBridgeObject,
3994
getFontSizeFromAttributeSetMethod,
3995
AttributeSet);
3996
EXCEPTION_CHECK("Getting FontSizeFromAttributeSet - call to CallIntMethod()", FALSE);
3997
PrintDebugString("[INFO]: AttributeSet's font size = %d", attributes->fontSize);
3998
} else {
3999
PrintDebugString("[ERROR]: either env == 0 or getAlignmentFromAttributeSetMethod == 0");
4000
jniEnv->CallVoidMethod(accessBridgeObject,
4001
decrementReferenceMethod, AttributeSet);
4002
EXCEPTION_CHECK("Getting FontSizeFromAttributeSet - call to CallVoidMethod()", FALSE);
4003
jniEnv->DeleteLocalRef(AttributeSet);
4004
EXCEPTION_CHECK("Getting FontSizeFromAttributeSet - call to DeleteLocalRef()", FALSE);
4005
return FALSE;
4006
}
4007
4008
4009
// Get the alignment setting
4010
if (getAlignmentFromAttributeSetMethod != (jmethodID) 0) {
4011
PrintDebugString(" Getting alignment from AttributeSet...");
4012
attributes->alignment = jniEnv->CallIntMethod(accessBridgeObject,
4013
getAlignmentFromAttributeSetMethod,
4014
AttributeSet);
4015
EXCEPTION_CHECK("Getting AlignmentFromAttributeSet - call to CallIntMethod()", FALSE);
4016
} else {
4017
PrintDebugString("[ERROR]: either env == 0 or getAlignmentFromAttributeSetMethod == 0");
4018
jniEnv->CallVoidMethod(accessBridgeObject,
4019
decrementReferenceMethod, AttributeSet);
4020
EXCEPTION_CHECK("Getting AlignmentFromAttributeSet - call to CallVoidMethod()", FALSE);
4021
jniEnv->DeleteLocalRef(AttributeSet);
4022
EXCEPTION_CHECK("Getting AlignmentFromAttributeSet - call to DeleteLocalRef()", FALSE);
4023
return FALSE;
4024
}
4025
4026
// Get the bidiLevel setting
4027
if (getBidiLevelFromAttributeSetMethod != (jmethodID) 0) {
4028
PrintDebugString("[INFO]: Getting bidiLevel from AttributeSet...");
4029
attributes->bidiLevel = jniEnv->CallIntMethod(accessBridgeObject,
4030
getBidiLevelFromAttributeSetMethod,
4031
AttributeSet);
4032
EXCEPTION_CHECK("Getting BidiLevelFromAttributeSet - call to CallIntMethod()", FALSE);
4033
} else {
4034
PrintDebugString("[ERROR]: either env == 0 or getBidiLevelFromAttributeSetMethod == 0");
4035
jniEnv->CallVoidMethod(accessBridgeObject,
4036
decrementReferenceMethod, AttributeSet);
4037
EXCEPTION_CHECK("Getting BidiLevelFromAttributeSet - call to CallVoidMethod()", FALSE);
4038
jniEnv->DeleteLocalRef(AttributeSet);
4039
EXCEPTION_CHECK("Getting BidiLevelFromAttributeSet - call to DeleteLocalRef()", FALSE);
4040
return FALSE;
4041
}
4042
4043
// Get the firstLineIndent setting
4044
if (getFirstLineIndentFromAttributeSetMethod != (jmethodID) 0) {
4045
PrintDebugString("[ERROR]: Getting firstLineIndent from AttributeSet...");
4046
attributes->firstLineIndent = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
4047
getFirstLineIndentFromAttributeSetMethod,
4048
AttributeSet);
4049
EXCEPTION_CHECK("Getting FirstLineIndentFromAttributeSet - call to CallIntMethod()", FALSE);
4050
} else {
4051
PrintDebugString("[ERROR]: either env == 0 or getFirstLineIndentFromAttributeSetMethod == 0");
4052
jniEnv->CallVoidMethod(accessBridgeObject,
4053
decrementReferenceMethod, AttributeSet);
4054
EXCEPTION_CHECK("Getting FirstLineIndentFromAttributeSet - call to CallVoidMethod()", FALSE);
4055
jniEnv->DeleteLocalRef(AttributeSet);
4056
EXCEPTION_CHECK("Getting FirstLineIndentFromAttributeSet - call to DeleteLocalRef()", FALSE);
4057
return FALSE;
4058
}
4059
4060
// Get the leftIndent setting
4061
if (getLeftIndentFromAttributeSetMethod != (jmethodID) 0) {
4062
PrintDebugString("[INFO]: Getting leftIndent from AttributeSet...");
4063
attributes->leftIndent = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
4064
getLeftIndentFromAttributeSetMethod,
4065
AttributeSet);
4066
EXCEPTION_CHECK("Getting LeftIndentFromAttributeSet - call to CallIntMethod()", FALSE);
4067
} else {
4068
PrintDebugString("[ERROR]: either env == 0 or getLeftIndentFromAttributeSetMethod == 0");
4069
jniEnv->CallVoidMethod(accessBridgeObject,
4070
decrementReferenceMethod, AttributeSet);
4071
EXCEPTION_CHECK("Getting LeftIndentFromAttributeSet - call to CallVoidMethod()", FALSE);
4072
jniEnv->DeleteLocalRef(AttributeSet);
4073
EXCEPTION_CHECK("Getting LeftIndentFromAttributeSet - call to DeleteLocalRef()", FALSE);
4074
return FALSE;
4075
}
4076
4077
// Get the rightIndent setting
4078
if (getRightIndentFromAttributeSetMethod != (jmethodID) 0) {
4079
PrintDebugString("[INFO]: Getting rightIndent from AttributeSet...");
4080
attributes->rightIndent = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
4081
getRightIndentFromAttributeSetMethod,
4082
AttributeSet);
4083
EXCEPTION_CHECK("Getting RightIndentFromAttributeSet - call to CallIntMethod()", FALSE);
4084
} else {
4085
PrintDebugString("[ERROR]: either env == 0 or getRightIndentFromAttributeSetMethod == 0");
4086
jniEnv->CallVoidMethod(accessBridgeObject,
4087
decrementReferenceMethod, AttributeSet);
4088
EXCEPTION_CHECK("Getting RightIndentFromAttributeSet - call to CallVoidMethod()", FALSE);
4089
jniEnv->DeleteLocalRef(AttributeSet);
4090
EXCEPTION_CHECK("Getting RightIndentFromAttributeSet - call to DeleteLocalRef()", FALSE);
4091
return FALSE;
4092
}
4093
4094
// Get the lineSpacing setting
4095
if (getLineSpacingFromAttributeSetMethod != (jmethodID) 0) {
4096
PrintDebugString("[INFO]: Getting lineSpacing from AttributeSet...");
4097
attributes->lineSpacing = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
4098
getLineSpacingFromAttributeSetMethod,
4099
AttributeSet);
4100
EXCEPTION_CHECK("Getting LineSpacingFromAttributeSet - call to CallIntMethod()", FALSE);
4101
} else {
4102
PrintDebugString("[ERROR]: either env == 0 or getLineSpacingFromAttributeSetMethod == 0");
4103
jniEnv->CallVoidMethod(accessBridgeObject,
4104
decrementReferenceMethod, AttributeSet);
4105
EXCEPTION_CHECK("Getting LineSpacingFromAttributeSet - call to CallVoidMethod()", FALSE);
4106
jniEnv->DeleteLocalRef(AttributeSet);
4107
EXCEPTION_CHECK("Getting LineSpacingFromAttributeSet - call to DeleteLocalRef()", FALSE);
4108
return FALSE;
4109
}
4110
4111
// Get the spaceAbove setting
4112
if (getSpaceAboveFromAttributeSetMethod != (jmethodID) 0) {
4113
PrintDebugString("[INFO]: Getting spaceAbove from AttributeSet...");
4114
attributes->spaceAbove = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
4115
getSpaceAboveFromAttributeSetMethod,
4116
AttributeSet);
4117
EXCEPTION_CHECK("Getting SpaceAboveFromAttributeSet - call to CallIntMethod()", FALSE);
4118
} else {
4119
PrintDebugString("[ERROR]: either env == 0 or getSpaceAboveFromAttributeSetMethod == 0");
4120
jniEnv->CallVoidMethod(accessBridgeObject,
4121
decrementReferenceMethod, AttributeSet);
4122
EXCEPTION_CHECK("Getting SpaceAboveFromAttributeSet - call to CallVoidMethod()", FALSE);
4123
jniEnv->DeleteLocalRef(AttributeSet);
4124
EXCEPTION_CHECK("Getting SpaceAboveFromAttributeSet - call to DeleteLocalRef()", FALSE);
4125
return FALSE;
4126
}
4127
4128
// Get the spaceBelow setting
4129
if (getSpaceBelowFromAttributeSetMethod != (jmethodID) 0) {
4130
PrintDebugString("[INFO]: Getting spaceBelow from AttributeSet...");
4131
attributes->spaceBelow = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
4132
getSpaceBelowFromAttributeSetMethod,
4133
AttributeSet);
4134
EXCEPTION_CHECK("Getting SpaceBelowFromAttributeSet - call to CallIntMethod()", FALSE);
4135
} else {
4136
PrintDebugString("[ERROR]: either env == 0 or getSpaceBelowFromAttributeSetMethod == 0");
4137
jniEnv->CallVoidMethod(accessBridgeObject,
4138
decrementReferenceMethod, AttributeSet);
4139
EXCEPTION_CHECK("Getting SpaceBelowFromAttributeSet - call to CallVoidMethod()", FALSE);
4140
jniEnv->DeleteLocalRef(AttributeSet);
4141
EXCEPTION_CHECK("Getting SpaceBelowFromAttributeSet - call to DeleteLocalRef()", FALSE);
4142
return FALSE;
4143
}
4144
4145
// Release the AttributeSet object
4146
if (decrementReferenceMethod != (jmethodID) 0) {
4147
PrintDebugString("[INFO]: Decrementing reference to AttributeSet...");
4148
jniEnv->CallVoidMethod(accessBridgeObject,
4149
decrementReferenceMethod, AttributeSet);
4150
EXCEPTION_CHECK("Releasing AttributeSet object - call to CallVoidMethod()", FALSE);
4151
} else {
4152
PrintDebugString("[ERROR]: either env == 0 or accessBridgeObject == 0");
4153
jniEnv->DeleteLocalRef(AttributeSet);
4154
EXCEPTION_CHECK("Releasing AttributeSet object - call to DeleteLocalRef()", FALSE);
4155
return FALSE;
4156
}
4157
4158
// Get the full attributes string at index
4159
if (getAccessibleAttributesAtIndexFromContextMethod != (jmethodID) 0) {
4160
PrintDebugString("[INFO]: Getting full attributes string from Context...");
4161
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
4162
getAccessibleAttributesAtIndexFromContextMethod,
4163
accessibleContext, index);
4164
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallObjectMethod()", FALSE);
4165
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
4166
if (js != (jstring) 0) {
4167
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
4168
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringChars()", FALSE);
4169
wcsncpy(attributes->fullAttributesString, stringBytes, (sizeof(attributes->fullAttributesString) / sizeof(wchar_t)));
4170
length = jniEnv->GetStringLength(js);
4171
attributes->fullAttributesString[length < (sizeof(attributes->fullAttributesString) / sizeof(wchar_t)) ?
4172
length : (sizeof(attributes->fullAttributesString) / sizeof(wchar_t))-2] = (wchar_t) 0;
4173
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringLength()", FALSE);
4174
jniEnv->ReleaseStringChars(js, stringBytes);
4175
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to ReleaseStringChars()", FALSE);
4176
jniEnv->CallVoidMethod(accessBridgeObject,
4177
decrementReferenceMethod, js);
4178
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallVoidMethod()", FALSE);
4179
wPrintDebugString(L"[INFO]: Accessible Text attributes = %ls", attributes->fullAttributesString);
4180
jniEnv->DeleteLocalRef(js);
4181
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to DeleteLocalRef()", FALSE);
4182
} else {
4183
PrintDebugString("[WARN]: Accessible Text attributes is null.");
4184
attributes->fullAttributesString[0] = (wchar_t) 0;
4185
jniEnv->DeleteLocalRef(AttributeSet);
4186
EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to DeleteLocalRef()", FALSE);
4187
return FALSE;
4188
}
4189
} else {
4190
PrintDebugString("[ERROR]: either env == 0 or getAccessibleAttributesAtIndexFromContextMethod == 0");
4191
jniEnv->DeleteLocalRef(AttributeSet);
4192
return FALSE;
4193
}
4194
4195
jniEnv->DeleteLocalRef(AttributeSet);
4196
EXCEPTION_CHECK("Getting AccessibleAttributeSetAtIndex - call to DeleteLocalRef()", FALSE);
4197
return TRUE;
4198
}
4199
4200
BOOL
4201
AccessBridgeJavaEntryPoints::getAccessibleTextRect(jobject accessibleContext, AccessibleTextRectInfo *rectInfo, jint index) {
4202
4203
jthrowable exception;
4204
4205
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextRect(%p), index = %d",
4206
accessibleContext, index);
4207
4208
// Verify the Java VM still exists and AccessibleContext is
4209
// an instance of AccessibleText
4210
if (verifyAccessibleText(accessibleContext) == FALSE) {
4211
return FALSE;
4212
}
4213
4214
// Get the x coord
4215
if (getAccessibleXcoordTextRectAtIndexFromContextMethod != (jmethodID) 0) {
4216
rectInfo->x = jniEnv->CallIntMethod(accessBridgeObject,
4217
getAccessibleXcoordTextRectAtIndexFromContextMethod,
4218
accessibleContext, index);
4219
EXCEPTION_CHECK("Getting AccessibleXcoordTextRect - call to CallIntMethod()", FALSE);
4220
PrintDebugString("[INFO]: X coord = %d", rectInfo->x);
4221
} else {
4222
PrintDebugString("[ERROR]: either env == 0 or getAccessibleXcoordTextRectAtIndexFromContextMethod == 0");
4223
return FALSE;
4224
}
4225
4226
// Get the y coord
4227
if (getAccessibleYcoordTextRectAtIndexFromContextMethod != (jmethodID) 0) {
4228
rectInfo->y = jniEnv->CallIntMethod(accessBridgeObject,
4229
getAccessibleYcoordTextRectAtIndexFromContextMethod,
4230
accessibleContext, index);
4231
EXCEPTION_CHECK("Getting AccessibleYcoordTextRect - call to CallIntMethod()", FALSE);
4232
PrintDebugString("[INFO]: Y coord = %d", rectInfo->y);
4233
} else {
4234
PrintDebugString("[INFO]: either env == 0 or getAccessibleYcoordTextRectAtIndexFromContextMethod == 0");
4235
return FALSE;
4236
}
4237
4238
// Get the width
4239
if (getAccessibleWidthTextRectAtIndexFromContextMethod != (jmethodID) 0) {
4240
rectInfo->width = jniEnv->CallIntMethod(accessBridgeObject,
4241
getAccessibleWidthTextRectAtIndexFromContextMethod,
4242
accessibleContext, index);
4243
EXCEPTION_CHECK("Getting AccessibleWidthTextRect - call to CallIntMethod()", FALSE);
4244
PrintDebugString("[INFO]: Width = %d", rectInfo->width);
4245
} else {
4246
PrintDebugString("[INFO]: either env == 0 or getAccessibleWidthTextRectAtIndexFromContextMethod == 0");
4247
return FALSE;
4248
}
4249
4250
// Get the height
4251
if (getAccessibleHeightTextRectAtIndexFromContextMethod != (jmethodID) 0) {
4252
rectInfo->height = jniEnv->CallIntMethod(accessBridgeObject,
4253
getAccessibleHeightTextRectAtIndexFromContextMethod,
4254
accessibleContext, index);
4255
EXCEPTION_CHECK("Getting AccessibleHeightTextRect - call to CallIntMethod()", FALSE);
4256
PrintDebugString("[INFO]: Height = %d", rectInfo->height);
4257
} else {
4258
PrintDebugString("[ERROR]: either env == 0 or getAccessibleHeightTextRectAtIndexFromContextMethod == 0");
4259
return FALSE;
4260
}
4261
4262
return TRUE;
4263
}
4264
4265
// =====
4266
4267
/**
4268
* gets the bounding rectangle for the text caret
4269
*/
4270
BOOL
4271
AccessBridgeJavaEntryPoints::getCaretLocation(jobject accessibleContext, AccessibleTextRectInfo *rectInfo, jint index) {
4272
4273
jthrowable exception;
4274
4275
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getCaretLocation(%p), index = %d",
4276
accessibleContext, index);
4277
4278
// Verify the Java VM still exists and AccessibleContext is
4279
// an instance of AccessibleText
4280
if (verifyAccessibleText(accessibleContext) == FALSE) {
4281
return FALSE;
4282
}
4283
4284
// Get the x coord
4285
if (getCaretLocationXMethod != (jmethodID) 0) {
4286
rectInfo->x = jniEnv->CallIntMethod(accessBridgeObject,
4287
getCaretLocationXMethod,
4288
accessibleContext, index);
4289
EXCEPTION_CHECK("Getting caret X coordinate - call to CallIntMethod()", FALSE);
4290
PrintDebugString("[INFO]: X coord = %d", rectInfo->x);
4291
} else {
4292
PrintDebugString("[ERROR]: either env == 0 or getCaretLocationXMethod == 0");
4293
return FALSE;
4294
}
4295
4296
// Get the y coord
4297
if (getCaretLocationYMethod != (jmethodID) 0) {
4298
rectInfo->y = jniEnv->CallIntMethod(accessBridgeObject,
4299
getCaretLocationYMethod,
4300
accessibleContext, index);
4301
EXCEPTION_CHECK("Getting caret Y coordinate - call to CallIntMethod()", FALSE);
4302
PrintDebugString("[INFO]: Y coord = %d", rectInfo->y);
4303
} else {
4304
PrintDebugString("[ERROR]: either env == 0 or getCaretLocationYMethod == 0");
4305
return FALSE;
4306
}
4307
4308
// Get the width
4309
if (getCaretLocationWidthMethod != (jmethodID) 0) {
4310
rectInfo->width = jniEnv->CallIntMethod(accessBridgeObject,
4311
getCaretLocationWidthMethod,
4312
accessibleContext, index);
4313
EXCEPTION_CHECK("Getting caret width - call to CallIntMethod()", FALSE);
4314
PrintDebugString("[INFO]: Width = %d", rectInfo->width);
4315
} else {
4316
PrintDebugString("[ERROR]: either env == 0 or getCaretLocationWidthMethod == 0");
4317
return FALSE;
4318
}
4319
4320
// Get the height
4321
if (getCaretLocationHeightMethod != (jmethodID) 0) {
4322
rectInfo->height = jniEnv->CallIntMethod(accessBridgeObject,
4323
getCaretLocationHeightMethod,
4324
accessibleContext, index);
4325
EXCEPTION_CHECK("Getting caret height - call to CallIntMethod()", FALSE);
4326
PrintDebugString("[INFO]: Height = %d", rectInfo->height);
4327
} else {
4328
PrintDebugString("[ERROR]: either env == 0 or getCaretLocationHeightMethod == 0");
4329
return FALSE;
4330
}
4331
4332
return TRUE;
4333
}
4334
4335
// =====
4336
4337
BOOL
4338
AccessBridgeJavaEntryPoints::getAccessibleTextLineBounds(jobject accessibleContext, jint index, jint *startIndex, jint *endIndex) {
4339
4340
jthrowable exception;
4341
4342
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextLineBounds(%p):", accessibleContext);
4343
4344
// Verify the Java VM still exists and AccessibleContext is
4345
// an instance of AccessibleText
4346
if (verifyAccessibleText(accessibleContext) == FALSE) {
4347
return FALSE;
4348
}
4349
4350
// Get the index of the left boundary of the line containing 'index'
4351
if (getAccessibleTextLineLeftBoundsFromContextMethod != (jmethodID) 0) {
4352
*startIndex = jniEnv->CallIntMethod(accessBridgeObject,
4353
getAccessibleTextLineLeftBoundsFromContextMethod,
4354
accessibleContext, index);
4355
EXCEPTION_CHECK("Getting AccessibleTextLineLeftBounds - call to CallIntMethod()", FALSE);
4356
PrintDebugString("[INFO]: startIndex = %d", *startIndex);
4357
} else {
4358
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextLineLeftBoundsFromContextMethod == 0");
4359
return FALSE;
4360
}
4361
4362
// Get the index of the right boundary of the line containing 'index'
4363
if (getAccessibleTextLineRightBoundsFromContextMethod != (jmethodID) 0) {
4364
*endIndex = jniEnv->CallIntMethod(accessBridgeObject,
4365
getAccessibleTextLineRightBoundsFromContextMethod,
4366
accessibleContext, index);
4367
EXCEPTION_CHECK("Getting AccessibleTextLineRightBounds - call to CallIntMethod()", FALSE);
4368
PrintDebugString("[INFO]: endIndex = %d", *endIndex);
4369
} else {
4370
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextLineRightBoundsFromContextMethod == 0");
4371
return FALSE;
4372
}
4373
4374
return TRUE;
4375
}
4376
4377
BOOL
4378
AccessBridgeJavaEntryPoints::getAccessibleTextRange(jobject accessibleContext,
4379
jint start, jint end, wchar_t *text, short len) {
4380
jstring js;
4381
const wchar_t *stringBytes;
4382
jthrowable exception;
4383
jsize length;
4384
4385
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleTextRange(%p, %d, %d, *text, %d):", accessibleContext, start, end, len);
4386
4387
// Verify the Java VM still exists and AccessibleContext is
4388
// an instance of AccessibleText
4389
if (verifyAccessibleText(accessibleContext) == FALSE) {
4390
return FALSE;
4391
}
4392
4393
// range is inclusive
4394
if (end < start) {
4395
PrintDebugString("[ERROR]: end < start!");
4396
text[0] = (wchar_t) 0;
4397
return FALSE;
4398
}
4399
4400
// Get the text range within [start, end] inclusive
4401
if (getAccessibleTextRangeFromContextMethod != (jmethodID) 0) {
4402
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
4403
getAccessibleTextRangeFromContextMethod,
4404
accessibleContext, start, end);
4405
EXCEPTION_CHECK("Getting AccessibleTextRange - call to CallObjectMethod()", FALSE);
4406
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
4407
if (js != (jstring) 0) {
4408
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
4409
EXCEPTION_CHECK("Getting AccessibleTextRange - call to GetStringChars()", FALSE);
4410
wPrintDebugString(L"[INFO]: Accessible Text stringBytes returned from Java = %ls", stringBytes);
4411
wcsncpy(text, stringBytes, len);
4412
length = jniEnv->GetStringLength(js);
4413
PrintDebugString("[INFO]: Accessible Text stringBytes length = %d", length);
4414
text[length < len ? length : len - 2] = (wchar_t) 0;
4415
wPrintDebugString(L"[INFO]: Accessible Text 'text' after null termination = %ls", text);
4416
EXCEPTION_CHECK("Getting AccessibleTextRange - call to GetStringLength()", FALSE);
4417
jniEnv->ReleaseStringChars(js, stringBytes);
4418
EXCEPTION_CHECK("Getting AccessibleTextRange - call to ReleaseStringChars()", FALSE);
4419
jniEnv->CallVoidMethod(accessBridgeObject,
4420
decrementReferenceMethod, js);
4421
EXCEPTION_CHECK("Getting AccessibleTextRange - call to CallVoidMethod()", FALSE);
4422
wPrintDebugString(L"[INFO]: Accessible Text range = %ls", text);
4423
jniEnv->DeleteLocalRef(js);
4424
EXCEPTION_CHECK("Getting AccessibleTextRange - call to DeleteLocalRef()", FALSE);
4425
} else {
4426
PrintDebugString("[WARN]: current Accessible Text range is null.");
4427
text[0] = (wchar_t) 0;
4428
return FALSE;
4429
}
4430
} else {
4431
PrintDebugString("[ERROR]: either env == 0 or getAccessibleTextRangeFromContextMethod == 0");
4432
return FALSE;
4433
}
4434
return TRUE;
4435
}
4436
4437
/********** AccessibleValue routines ***************/
4438
4439
BOOL
4440
AccessBridgeJavaEntryPoints::getCurrentAccessibleValueFromContext(jobject accessibleContext, wchar_t *value, short len) {
4441
jstring js;
4442
const wchar_t *stringBytes;
4443
jthrowable exception;
4444
jsize length;
4445
4446
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getCurrentAccessibleValueFromContext(%p):", accessibleContext);
4447
4448
// Get the current Accessible Value
4449
if (getCurrentAccessibleValueFromContextMethod != (jmethodID) 0) {
4450
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
4451
getCurrentAccessibleValueFromContextMethod,
4452
accessibleContext);
4453
EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to CallObjectMethod()", FALSE);
4454
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
4455
if (js != (jstring) 0) {
4456
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
4457
EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to GetStringChars()", FALSE);
4458
wcsncpy(value, stringBytes, len);
4459
length = jniEnv->GetStringLength(js);
4460
value[length < len ? length : len - 2] = (wchar_t) 0;
4461
EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to GetStringLength()", FALSE);
4462
jniEnv->ReleaseStringChars(js, stringBytes);
4463
EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to ReleaseStringChars()", FALSE);
4464
jniEnv->CallVoidMethod(accessBridgeObject,
4465
decrementReferenceMethod, js);
4466
EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to CallVoidMethod()", FALSE);
4467
PrintDebugString("[INFO]: current Accessible Value = %s", value);
4468
jniEnv->DeleteLocalRef(js);
4469
EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to DeleteLocalRef()", FALSE);
4470
} else {
4471
PrintDebugString("[WARN]: current Accessible Value is null.");
4472
value[0] = (wchar_t) 0;
4473
return FALSE;
4474
}
4475
} else {
4476
PrintDebugString("[ERROR]: either env == 0 or getCurrentAccessibleValueFromContextMethod == 0");
4477
return FALSE;
4478
}
4479
return TRUE;
4480
}
4481
4482
BOOL
4483
AccessBridgeJavaEntryPoints::getMaximumAccessibleValueFromContext(jobject accessibleContext, wchar_t *value, short len) {
4484
jstring js;
4485
const wchar_t *stringBytes;
4486
jthrowable exception;
4487
jsize length;
4488
4489
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getMaximumAccessibleValueFromContext(%p):", accessibleContext);
4490
4491
// Get the maximum Accessible Value
4492
if (getMaximumAccessibleValueFromContextMethod != (jmethodID) 0) {
4493
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
4494
getMaximumAccessibleValueFromContextMethod,
4495
accessibleContext);
4496
EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to CallObjectMethod()", FALSE);
4497
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
4498
if (js != (jstring) 0) {
4499
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
4500
EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to GetStringChars()", FALSE);
4501
wcsncpy(value, stringBytes, len);
4502
length = jniEnv->GetStringLength(js);
4503
value[length < len ? length : len - 2] = (wchar_t) 0;
4504
EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to GetStringLength()", FALSE);
4505
jniEnv->ReleaseStringChars(js, stringBytes);
4506
EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to ReleaseStringChars()", FALSE);
4507
jniEnv->CallVoidMethod(accessBridgeObject,
4508
decrementReferenceMethod, js);
4509
EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to CallVoidMethod()", FALSE);
4510
PrintDebugString("[INFO]: maximum Accessible Value = %s", value);
4511
jniEnv->DeleteLocalRef(js);
4512
EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to DeleteLocalRef()", FALSE);
4513
} else {
4514
PrintDebugString("[WARN]: maximum Accessible Value is null.");
4515
value[0] = (wchar_t) 0;
4516
return FALSE;
4517
}
4518
} else {
4519
PrintDebugString("[ERROR]: either env == 0 or getMaximumAccessibleValueFromContextMethod == 0");
4520
return FALSE;
4521
}
4522
return TRUE;
4523
}
4524
4525
BOOL
4526
AccessBridgeJavaEntryPoints::getMinimumAccessibleValueFromContext(jobject accessibleContext, wchar_t *value, short len) {
4527
jstring js;
4528
const wchar_t *stringBytes;
4529
jthrowable exception;
4530
jsize length;
4531
4532
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getMinimumAccessibleValueFromContext(%p):", accessibleContext);
4533
4534
// Get the mimimum Accessible Value
4535
if (getMinimumAccessibleValueFromContextMethod != (jmethodID) 0) {
4536
js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
4537
getMinimumAccessibleValueFromContextMethod,
4538
accessibleContext);
4539
EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to CallObjectMethod()", FALSE);
4540
PrintDebugString("[INFO]: returned from CallObjectMethod(), js = %p", js);
4541
if (js != (jstring) 0) {
4542
stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
4543
EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to GetStringChars()", FALSE);
4544
wcsncpy(value, stringBytes, len);
4545
length = jniEnv->GetStringLength(js);
4546
value[length < len ? length : len - 2] = (wchar_t) 0;
4547
EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to GetStringLength()", FALSE);
4548
jniEnv->ReleaseStringChars(js, stringBytes);
4549
EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to ReleaseStringChars()", FALSE);
4550
jniEnv->CallVoidMethod(accessBridgeObject,
4551
decrementReferenceMethod, js);
4552
EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to CallVoidMethod()", FALSE);
4553
PrintDebugString("[INFO]: mimimum Accessible Value = %s", value);
4554
jniEnv->DeleteLocalRef(js);
4555
EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to DeleteLocalRef()", FALSE);
4556
} else {
4557
PrintDebugString("[WARN]: mimimum Accessible Value is null.");
4558
value[0] = (wchar_t) 0;
4559
return FALSE;
4560
}
4561
} else {
4562
PrintDebugString("[ERROR]: either env == 0 or getMinimumAccessibleValueFromContextMethod == 0");
4563
return FALSE;
4564
}
4565
return TRUE;
4566
}
4567
4568
4569
/********** AccessibleSelection routines ***************/
4570
4571
void
4572
AccessBridgeJavaEntryPoints::addAccessibleSelectionFromContext(jobject accessibleContext, int i) {
4573
jthrowable exception;
4574
4575
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::addAccessibleSelectionFromContext(%p):", accessibleContext);
4576
4577
// Add the child to the AccessibleSelection
4578
if (addAccessibleSelectionFromContextMethod != (jmethodID) 0) {
4579
jniEnv->CallVoidMethod(accessBridgeObject,
4580
addAccessibleSelectionFromContextMethod,
4581
accessibleContext, i);
4582
EXCEPTION_CHECK_VOID("Doing addAccessibleSelection - call to CallVoidMethod()");
4583
PrintDebugString("[INFO]: returned from CallObjectMethod()");
4584
} else {
4585
PrintDebugString("[ERROR]: either env == 0 or addAccessibleSelectionFromContextMethod == 0");
4586
}
4587
}
4588
4589
void
4590
AccessBridgeJavaEntryPoints::clearAccessibleSelectionFromContext(jobject accessibleContext) {
4591
jthrowable exception;
4592
4593
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::clearAccessibleSelectionFromContext(%p):", accessibleContext);
4594
4595
// Clearing the Selection of the AccessibleSelection
4596
if (clearAccessibleSelectionFromContextMethod != (jmethodID) 0) {
4597
jniEnv->CallVoidMethod(accessBridgeObject,
4598
clearAccessibleSelectionFromContextMethod,
4599
accessibleContext);
4600
EXCEPTION_CHECK_VOID("Doing clearAccessibleSelection - call to CallVoidMethod()");
4601
PrintDebugString("[INFO]: returned from CallObjectMethod()");
4602
} else {
4603
PrintDebugString("[ERROR]: either env == 0 or clearAccessibleSelectionFromContextMethod == 0");
4604
}
4605
}
4606
4607
jobject
4608
AccessBridgeJavaEntryPoints::getAccessibleSelectionFromContext(jobject accessibleContext, int i) {
4609
jobject returnedAccessibleContext;
4610
jobject globalRef;
4611
jthrowable exception;
4612
4613
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleSelectionFromContext(%p):", accessibleContext);
4614
4615
if (getAccessibleSelectionContextFromContextMethod != (jmethodID) 0) {
4616
returnedAccessibleContext = jniEnv->CallObjectMethod(
4617
accessBridgeObject,
4618
getAccessibleSelectionContextFromContextMethod,
4619
accessibleContext, i);
4620
EXCEPTION_CHECK("Getting AccessibleSelectionContext - call to CallObjectMethod()", (jobject) 0);
4621
globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
4622
EXCEPTION_CHECK("Getting AccessibleSelectionContext - call to NewGlobalRef()", (jobject) 0);
4623
jniEnv->DeleteLocalRef(returnedAccessibleContext);
4624
EXCEPTION_CHECK("Getting AccessibleSelectionContext - call to DeleteLocalRef()", (jobject) 0);
4625
PrintDebugString("[INFO]: Returning - returnedAccessibleContext = %p; globalRef = %p",
4626
returnedAccessibleContext, globalRef);
4627
return globalRef;
4628
} else {
4629
PrintDebugString("[ERROR]: either env == 0 or getAccessibleSelectionContextFromContextMethod == 0");
4630
return (jobject) 0;
4631
}
4632
}
4633
4634
int
4635
AccessBridgeJavaEntryPoints::getAccessibleSelectionCountFromContext(jobject accessibleContext) {
4636
int count;
4637
jthrowable exception;
4638
4639
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::getAccessibleSelectionCountFromContext(%p):", accessibleContext);
4640
4641
// Get (& return) the # of items selected in the AccessibleSelection
4642
if (getAccessibleSelectionCountFromContextMethod != (jmethodID) 0) {
4643
count = jniEnv->CallIntMethod(accessBridgeObject,
4644
getAccessibleSelectionCountFromContextMethod,
4645
accessibleContext);
4646
EXCEPTION_CHECK("Getting AccessibleSelectionCount - call to CallIntMethod()", -1);
4647
PrintDebugString("[INFO]: returned from CallObjectMethod()");
4648
return count;
4649
} else {
4650
PrintDebugString("[ERROR]: either env == 0 or getAccessibleSelectionCountFromContextMethod == 0");
4651
return -1;
4652
}
4653
}
4654
4655
BOOL
4656
AccessBridgeJavaEntryPoints::isAccessibleChildSelectedFromContext(jobject accessibleContext, int i) {
4657
jboolean result;
4658
jthrowable exception;
4659
4660
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::isAccessibleChildSelectedFromContext(%p):", accessibleContext);
4661
4662
// Get (& return) the # of items selected in the AccessibleSelection
4663
if (isAccessibleChildSelectedFromContextMethod != (jmethodID) 0) {
4664
result = jniEnv->CallBooleanMethod(accessBridgeObject,
4665
isAccessibleChildSelectedFromContextMethod,
4666
accessibleContext, i);
4667
EXCEPTION_CHECK("Doing isAccessibleChildSelected - call to CallBooleanMethod()", FALSE);
4668
PrintDebugString("[INFO]: returned from CallObjectMethod()");
4669
if (result != 0) {
4670
return TRUE;
4671
}
4672
} else {
4673
PrintDebugString("[ERROR]: either env == 0 or isAccessibleChildSelectedFromContextMethod == 0");
4674
}
4675
return FALSE;
4676
}
4677
4678
4679
void
4680
AccessBridgeJavaEntryPoints::removeAccessibleSelectionFromContext(jobject accessibleContext, int i) {
4681
jthrowable exception;
4682
4683
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::removeAccessibleSelectionFromContext(%p):", accessibleContext);
4684
4685
// Remove the i-th child from the AccessibleSelection
4686
if (removeAccessibleSelectionFromContextMethod != (jmethodID) 0) {
4687
jniEnv->CallVoidMethod(accessBridgeObject,
4688
removeAccessibleSelectionFromContextMethod,
4689
accessibleContext, i);
4690
EXCEPTION_CHECK_VOID("Doing removeAccessibleSelection - call to CallVoidMethod()");
4691
PrintDebugString("[INFO]: returned from CallObjectMethod()");
4692
} else {
4693
PrintDebugString("[ERROR]: either env == 0 or removeAccessibleSelectionFromContextMethod == 0");
4694
}
4695
}
4696
4697
void
4698
AccessBridgeJavaEntryPoints::selectAllAccessibleSelectionFromContext(jobject accessibleContext) {
4699
jthrowable exception;
4700
4701
PrintDebugString("[INFO]: Calling AccessBridgeJavaEntryPoints::selectAllAccessibleSelectionFromContext(%p):", accessibleContext);
4702
4703
// Select all children (if possible) of the AccessibleSelection
4704
if (selectAllAccessibleSelectionFromContextMethod != (jmethodID) 0) {
4705
jniEnv->CallVoidMethod(accessBridgeObject,
4706
selectAllAccessibleSelectionFromContextMethod,
4707
accessibleContext);
4708
EXCEPTION_CHECK_VOID("Doing selectAllAccessibleSelection - call to CallVoidMethod()");
4709
PrintDebugString("[INFO]: returned from CallObjectMethod()");
4710
} else {
4711
PrintDebugString("[ERROR]: either env == 0 or selectAllAccessibleSelectionFromContextMethod == 0");
4712
}
4713
}
4714
4715
4716
/********** Event Notification Registration routines ***************/
4717
4718
BOOL
4719
AccessBridgeJavaEntryPoints::addJavaEventNotification(jlong type) {
4720
jthrowable exception;
4721
4722
PrintDebugString("[INFO]: in AccessBridgeJavaEntryPoints::addJavaEventNotification(%016I64X);", type);
4723
4724
// Let AccessBridge know we want to add an event type
4725
if (addJavaEventNotificationMethod != (jmethodID) 0) {
4726
jniEnv->CallVoidMethod(accessBridgeObject,
4727
addJavaEventNotificationMethod, type);
4728
EXCEPTION_CHECK("Doing addJavaEventNotification - call to CallVoidMethod()", FALSE);
4729
} else {
4730
PrintDebugString("[ERROR]: either env == 0 or addJavaEventNotificationMethod == 0");
4731
return FALSE;
4732
}
4733
return TRUE;
4734
}
4735
4736
BOOL
4737
AccessBridgeJavaEntryPoints::removeJavaEventNotification(jlong type) {
4738
jthrowable exception;
4739
4740
PrintDebugString("[INFO]: in AccessBridgeJavaEntryPoints::removeJavaEventNotification(%016I64X):", type);
4741
4742
// Let AccessBridge know we want to remove an event type
4743
if (removeJavaEventNotificationMethod != (jmethodID) 0) {
4744
jniEnv->CallVoidMethod(accessBridgeObject,
4745
removeJavaEventNotificationMethod, type);
4746
EXCEPTION_CHECK("Doing removeJavaEventNotification - call to CallVoidMethod()", FALSE);
4747
} else {
4748
PrintDebugString("[ERROR]: either env == 0 or removeJavaEventNotificationMethod == 0");
4749
return FALSE;
4750
}
4751
return TRUE;
4752
}
4753
4754
BOOL
4755
AccessBridgeJavaEntryPoints::addAccessibilityEventNotification(jlong type) {
4756
jthrowable exception;
4757
4758
PrintDebugString("[INFO]: in AccessBridgeJavaEntryPoints::addAccessibilityEventNotification(%016I64X);", type);
4759
4760
// Let AccessBridge know we want to add an event type
4761
if (addAccessibilityEventNotificationMethod != (jmethodID) 0) {
4762
PrintDebugString("[INFO]: addAccessibilityEventNotification: calling void method: accessBridgeObject = %p", accessBridgeObject);
4763
jniEnv->CallVoidMethod(accessBridgeObject,
4764
addAccessibilityEventNotificationMethod, type);
4765
EXCEPTION_CHECK("Doing addAccessibilityEvent - call to CallVoidMethod()", FALSE);
4766
} else {
4767
PrintDebugString("[ERROR]: either env == 0 or addAccessibilityEventNotificationMethod == 0");
4768
return FALSE;
4769
}
4770
PrintDebugString("[INFO]: addAccessibilityEventNotification: just returning true");
4771
return TRUE;
4772
}
4773
4774
BOOL
4775
AccessBridgeJavaEntryPoints::removeAccessibilityEventNotification(jlong type) {
4776
jthrowable exception;
4777
4778
PrintDebugString("[INFO]: in AccessBridgeJavaEntryPoints::removeAccessibilityEventNotification(%016I64X):", type);
4779
4780
// Let AccessBridge know we want to remove an event type
4781
if (removeAccessibilityEventNotificationMethod != (jmethodID) 0) {
4782
jniEnv->CallVoidMethod(accessBridgeObject,
4783
removeAccessibilityEventNotificationMethod, type);
4784
EXCEPTION_CHECK("Doing removeAccessibilityEvent - call to CallVoidMethod()", FALSE);
4785
} else {
4786
PrintDebugString("[ERROR]: either env == 0 or removeAccessibilityEventNotificationMethod == 0");
4787
return FALSE;
4788
}
4789
return TRUE;
4790
}
4791
4792