13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 /*
27 * A DLL which is loaded by Java applications to handle communication
28 * between Java VMs purposes of Accessbility.
29 */
30
31 #include "AccessBridgeDebug.h"
32 #include "JavaAccessBridge.h"
33 #include "com_sun_java_accessibility_AccessBridge.h" // programatically generated by JNI
34 #include "accessBridgeResource.h"
35 #include "accessBridgeCallbacks.h"
36 #include "AccessBridgeMessages.h"
37
38
39 #include <windows.h>
40 #include <stdio.h>
41
42 #include <jawt.h>
43 #include <jawt_md.h>
44
45 JavaAccessBridge *theJavaAccessBridge;
46 HWND theDialogWindow;
47
48 // re-entrance lock for receiving memory messages
49 CRITICAL_SECTION receiveMemoryIPCLock;
50
51
52 // unique broadcast msg. IDs gotten dymanically
53 extern UINT theFromJavaHelloMsgID;
67 case DLL_PROCESS_ATTACH:
68 InitializeCriticalSection(&receiveMemoryIPCLock);
69 theJavaAccessBridge = new JavaAccessBridge(hinstDll);
70 break;
71
72 case DLL_PROCESS_DETACH: // A Windows executable unloaded us
73 if (theJavaAccessBridge != (JavaAccessBridge *) 0) {
74 delete theJavaAccessBridge;
75 DeleteCriticalSection(&receiveMemoryIPCLock);
76 }
77 break;
78 }
79 return TRUE;
80 }
81
82 /**
83 * Open a native window (and init the wrappers we'll be using)
84 *
85 */
86 JNIEXPORT void JNICALL
87 Java_com_sun_java_accessibility_AccessBridge_runDLL(JNIEnv *env, jobject obj) {
88 PrintDebugString("\r\nJavaAccessBridge.DLL runDLL() called");
89 theJavaAccessBridge->javaRun(env, obj);
90 }
91
92 #if 0 // SetDlgItemText has caused problems with JAWS
93 /**
94 * Append debug info to dialog
95 *
96 */
97 void AppendToCallInfo(char *s) {
98 char buffer[4096];
99
100 PrintDebugString(s);
101
102 GetDlgItemText(theDialogWindow, cCallInfo, buffer, sizeof(buffer));
103 if (strlen(buffer) < (sizeof(buffer) - strlen(s))) {
104 strncat(buffer, s, sizeof(buffer));
105 SetDlgItemText(theDialogWindow, cCallInfo, buffer);
106 } else {
107 SetDlgItemText(theDialogWindow, cCallInfo, s);
1717 if (!(globalEventMask & type)) {
1718 // no other ATs wanted this event;
1719 // stop getting them from Java
1720 PrintDebugString(" no other AT wanted this Accessibility event (so can remove); removing from AccessBridge.java");
1721 windowsThreadEntryPoints->removeAccessibilityEventNotification(type);
1722 }
1723 }
1724
1725
1726
1727
1728 /**
1729 * firePropertyCaretChange
1730 *
1731 */
1732 void
1733 JavaAccessBridge::firePropertyCaretChange(JNIEnv *env, jobject callingObj,
1734 jobject event, jobject source,
1735 jint oldValue, jint newValue) {
1736
1737 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyCaretChanged(%p, %p, %p, %p, %d, %d)",
1738 env, callingObj, event,
1739 source, oldValue, newValue);
1740
1741 // sanity check
1742 if (ATs == (AccessBridgeATInstance *) 0) {
1743 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
1744 return; // panic!
1745 }
1746
1747 // common setup
1748 char buffer[sizeof(PackageType) + sizeof(PropertyCaretChangePackage)];
1749 PackageType *type = (PackageType *) buffer;
1750 PropertyCaretChangePackage *pkg = (PropertyCaretChangePackage *) (buffer + sizeof(PackageType));
1751 *type = cPropertyCaretChangePackage;
1752 pkg->vmID = (long) dialogWindow;
1753
1754 // make new Global Refs and send events only to those ATs that want 'em
1755 AccessBridgeATInstance *ati = ATs;
1756 while (ati != (AccessBridgeATInstance *) 0) {
1757 if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) {
1771
1772 pkg->oldPosition = oldValue;
1773 pkg->newPosition = newValue;
1774
1775 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyCaretChangeEvent);
1776 }
1777 ati = ati->nextATInstance;
1778 }
1779 PrintDebugString(" done with propertyCaretChange event");
1780 }
1781
1782 /**
1783 * firePropertyDescriptionChange
1784 *
1785 */
1786 void
1787 JavaAccessBridge::firePropertyDescriptionChange(JNIEnv *env, jobject callingObj,
1788 jobject event, jobject source,
1789 jstring oldValue, jstring newValue){
1790
1791 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyDescriptionChanged(%p, %p, %p, %p, %p, %p)",
1792 env, callingObj, event,
1793 source, oldValue, newValue);
1794
1795 // sanity check
1796 if (ATs == (AccessBridgeATInstance *) 0) {
1797 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
1798 return; // panic!
1799 }
1800
1801 // common setup
1802 const wchar_t *stringBytes;
1803 char buffer[sizeof(PackageType) + sizeof(PropertyDescriptionChangePackage)];
1804 PackageType *type = (PackageType *) buffer;
1805 PropertyDescriptionChangePackage *pkg = (PropertyDescriptionChangePackage *) (buffer + sizeof(PackageType));
1806 *type = cPropertyDescriptionChangePackage;
1807 pkg->vmID = (long) dialogWindow;
1808
1809 // make new Global Refs and send events only to those ATs that want 'em
1810 AccessBridgeATInstance *ati = ATs;
1811 while (ati != (AccessBridgeATInstance *) 0) {
1857 } else {
1858 wcsncpy(pkg->newDescription, L"(null)", (sizeof(pkg->newDescription) / sizeof(wchar_t)));
1859 }
1860
1861 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyDescriptionChangeEvent);
1862 }
1863 ati = ati->nextATInstance;
1864 }
1865 PrintDebugString(" done with propertyDescriptionChange event");
1866 }
1867
1868 /**
1869 * firePropertyNameChange
1870 *
1871 */
1872 void
1873 JavaAccessBridge::firePropertyNameChange(JNIEnv *env, jobject callingObj,
1874 jobject event, jobject source,
1875 jstring oldValue, jstring newValue){
1876
1877 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyNameChanged(%p, %p, %p, %p, %p, %p)",
1878 env, callingObj, event,
1879 source, oldValue, newValue);
1880
1881 // sanity check
1882 if (ATs == (AccessBridgeATInstance *) 0) {
1883 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
1884 return; // panic!
1885 }
1886
1887 // common setup
1888 const wchar_t *stringBytes;
1889 char buffer[sizeof(PackageType) + sizeof(PropertyNameChangePackage)];
1890 PackageType *type = (PackageType *) buffer;
1891 PropertyNameChangePackage *pkg = (PropertyNameChangePackage *) (buffer + sizeof(PackageType));
1892 *type = cPropertyNameChangePackage;
1893 pkg->vmID = (long) dialogWindow;
1894
1895 // make new Global Refs and send events only to those ATs that want 'em
1896 AccessBridgeATInstance *ati = ATs;
1897 while (ati != (AccessBridgeATInstance *) 0) {
1943 } else {
1944 wcsncpy(pkg->newName, L"(null)", (sizeof(pkg->newName) / sizeof(wchar_t)));
1945 }
1946
1947 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyNameChangeEvent);
1948 }
1949 ati = ati->nextATInstance;
1950 }
1951 PrintDebugString(" done with propertyNameChange event");
1952 }
1953
1954
1955 /**
1956 * firePropertySelectionChange
1957 *
1958 */
1959 void
1960 JavaAccessBridge::firePropertySelectionChange(JNIEnv *env, jobject callingObj,
1961 jobject event, jobject source) {
1962
1963 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertySelectionChanged(%p, %p, %p, %p)",
1964 env, callingObj, event, source);
1965
1966 // sanity check
1967 if (ATs == (AccessBridgeATInstance *) 0) {
1968 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
1969 return; // panic!
1970 }
1971
1972 // common setup
1973 char buffer[sizeof(PackageType) + sizeof(PropertySelectionChangePackage)];
1974 PackageType *type = (PackageType *) buffer;
1975 PropertySelectionChangePackage *pkg = (PropertySelectionChangePackage *) (buffer + sizeof(PackageType));
1976 *type = cPropertySelectionChangePackage;
1977 pkg->vmID = (long) dialogWindow;
1978
1979 // make new Global Refs and send events only to those ATs that want 'em
1980 AccessBridgeATInstance *ati = ATs;
1981 while (ati != (AccessBridgeATInstance *) 0) {
1982 if (ati->accessibilityEventMask & cPropertySelectionChangeEvent) {
1983
1994 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
1995 #endif
1996
1997 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertySelectionChangeEvent);
1998 }
1999 ati = ati->nextATInstance;
2000 }
2001 PrintDebugString(" done with propertySelectionChange event");
2002 }
2003
2004
2005 /**
2006 * firePropertyStateChange
2007 *
2008 */
2009 void
2010 JavaAccessBridge::firePropertyStateChange(JNIEnv *env, jobject callingObj,
2011 jobject event, jobject source,
2012 jstring oldValue, jstring newValue){
2013
2014 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyStateChanged(%p, %p, %p, %p, %p, %p)",
2015 env, callingObj, event,
2016 source, oldValue, newValue);
2017
2018 // sanity check
2019 if (ATs == (AccessBridgeATInstance *) 0) {
2020 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2021 return; // panic!
2022 }
2023
2024 // common setup
2025 const wchar_t *stringBytes;
2026 char buffer[sizeof(PackageType) + sizeof(PropertyStateChangePackage)];
2027 PackageType *type = (PackageType *) buffer;
2028 PropertyStateChangePackage *pkg = (PropertyStateChangePackage *) (buffer + sizeof(PackageType));
2029 *type = cPropertyStateChangePackage;
2030 pkg->vmID = (long) dialogWindow;
2031
2032 // make new Global Refs and send events only to those ATs that want 'em
2033 AccessBridgeATInstance *ati = ATs;
2034 while (ati != (AccessBridgeATInstance *) 0) {
2080 } else {
2081 wcsncpy(pkg->newState, L"(null)", (sizeof(pkg->newState) / sizeof(wchar_t)));
2082 }
2083
2084 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyStateChangeEvent);
2085 }
2086 ati = ati->nextATInstance;
2087 }
2088 PrintDebugString(" done with propertyStateChange event");
2089 }
2090
2091
2092 /**
2093 * firePropertyTextChange
2094 *
2095 */
2096 void
2097 JavaAccessBridge::firePropertyTextChange(JNIEnv *env, jobject callingObj,
2098 jobject event, jobject source) {
2099
2100 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyTextChanged(%p, %p, %p, %p)",
2101 env, callingObj, event, source);
2102
2103 // sanity check
2104 if (ATs == (AccessBridgeATInstance *) 0) {
2105 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2106 return; // panic!
2107 }
2108
2109 // common setup
2110 char buffer[sizeof(PackageType) + sizeof(PropertyTextChangePackage)];
2111 PackageType *type = (PackageType *) buffer;
2112 PropertyTextChangePackage *pkg = (PropertyTextChangePackage *) (buffer + sizeof(PackageType));
2113 *type = cPropertyTextChangePackage;
2114 pkg->vmID = (long) dialogWindow;
2115
2116 // make new Global Refs and send events only to those ATs that want 'em
2117 AccessBridgeATInstance *ati = ATs;
2118 while (ati != (AccessBridgeATInstance *) 0) {
2119 if (ati->accessibilityEventMask & cPropertyTextChangeEvent) {
2120
2131 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
2132 #endif
2133
2134 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTextChangeEvent);
2135 }
2136 ati = ati->nextATInstance;
2137 }
2138 PrintDebugString(" done with propertyTextChange event");
2139 }
2140
2141
2142 /**
2143 * firePropertyValueChange
2144 *
2145 */
2146 void
2147 JavaAccessBridge::firePropertyValueChange(JNIEnv *env, jobject callingObj,
2148 jobject event, jobject source,
2149 jstring oldValue, jstring newValue){
2150
2151 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyValueChanged(%p, %p, %p, %p, %p, %p)",
2152 env, callingObj, event,
2153 source, oldValue, newValue);
2154
2155 // sanity check
2156 if (ATs == (AccessBridgeATInstance *) 0) {
2157 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2158 return; // panic!
2159 }
2160
2161 // common setup
2162 const wchar_t *stringBytes;
2163 char buffer[sizeof(PackageType) + sizeof(PropertyValueChangePackage)];
2164 PackageType *type = (PackageType *) buffer;
2165 PropertyValueChangePackage *pkg = (PropertyValueChangePackage *) (buffer + sizeof(PackageType));
2166 *type = cPropertyValueChangePackage;
2167 pkg->vmID = (long) dialogWindow;
2168
2169 // make new Global Refs and send events only to those ATs that want 'em
2170 AccessBridgeATInstance *ati = ATs;
2171 while (ati != (AccessBridgeATInstance *) 0) {
2216 env->ReleaseStringChars(newValue, stringBytes);
2217 } else {
2218 wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t)));
2219 }
2220
2221 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyValueChangeEvent);
2222 }
2223 ati = ati->nextATInstance;
2224 }
2225 PrintDebugString(" done with propertyValueChange event");
2226 }
2227
2228 /**
2229 * firePropertyVisibleDataChange
2230 *
2231 */
2232 void
2233 JavaAccessBridge::firePropertyVisibleDataChange(JNIEnv *env, jobject callingObj,
2234 jobject event, jobject source) {
2235
2236 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyVisibleDataChanged(%p, %p, %p, %p)",
2237 env, callingObj, event, source);
2238
2239 // sanity check
2240 if (ATs == (AccessBridgeATInstance *) 0) {
2241 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2242 return; // panic!
2243 }
2244
2245 // common setup
2246 char buffer[sizeof(PackageType) + sizeof(PropertyVisibleDataChangePackage)];
2247 PackageType *type = (PackageType *) buffer;
2248 PropertyVisibleDataChangePackage *pkg = (PropertyVisibleDataChangePackage *) (buffer + sizeof(PackageType));
2249 *type = cPropertyVisibleDataChangePackage;
2250 pkg->vmID = (long) dialogWindow;
2251
2252 // make new Global Refs and send events only to those ATs that want 'em
2253 AccessBridgeATInstance *ati = ATs;
2254 while (ati != (AccessBridgeATInstance *) 0) {
2255 if (ati->accessibilityEventMask & cPropertyVisibleDataChangeEvent) {
2256
2267 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
2268 #endif
2269
2270 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyVisibleDataChangeEvent);
2271 }
2272 ati = ati->nextATInstance;
2273 }
2274 PrintDebugString(" done with propertyVisibleDataChange event");
2275 }
2276
2277
2278 /**
2279 * firePropertyChildChange
2280 *
2281 */
2282 void
2283 JavaAccessBridge::firePropertyChildChange(JNIEnv *env, jobject callingObj,
2284 jobject event, jobject source,
2285 jobject oldValue, jobject newValue){
2286
2287 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyChildPropertyChanged(%p, %p, %p, %p, %p, %p)",
2288 env, callingObj, event,
2289 source, oldValue, newValue);
2290
2291 // sanity check
2292 if (ATs == (AccessBridgeATInstance *) 0) {
2293 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2294 return; // panic!
2295 }
2296
2297 // common setup
2298 char buffer[sizeof(PackageType) + sizeof(PropertyChildChangePackage)];
2299 PackageType *type = (PackageType *) buffer;
2300 PropertyChildChangePackage *pkg = (PropertyChildChangePackage *) (buffer + sizeof(PackageType));
2301 *type = cPropertyChildChangePackage;
2302 pkg->vmID = (long) dialogWindow;
2303
2304 // make new Global Refs and send events only to those ATs that want 'em
2305 AccessBridgeATInstance *ati = ATs;
2306 while (ati != (AccessBridgeATInstance *) 0) {
2307 if (ati->accessibilityEventMask & cPropertyChildChangeEvent) {
2325 PrintDebugString(" GlobalRef'd NewChildAC: %016I64X", pkg->newChildAccessibleContext);
2326 #endif
2327
2328 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyChildChangeEvent);
2329 }
2330 ati = ati->nextATInstance;
2331 }
2332 PrintDebugString(" done with propertyChildChange event");
2333 }
2334
2335
2336 /**
2337 * firePropertyActiveDescendentChange
2338 *
2339 */
2340 void
2341 JavaAccessBridge::firePropertyActiveDescendentChange(JNIEnv *env, jobject callingObj,
2342 jobject event, jobject source,
2343 jobject oldValue, jobject newValue){
2344
2345 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyActiveDescendentPropertyChanged(%p, %p, %p, %p, %p, %p)",
2346 env, callingObj, event,
2347 source, oldValue, newValue);
2348
2349 // sanity check
2350 if (ATs == (AccessBridgeATInstance *) 0) {
2351 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2352 return; // panic!
2353 }
2354
2355 // common setup
2356 char buffer[sizeof(PackageType) + sizeof(PropertyActiveDescendentChangePackage)];
2357 PackageType *type = (PackageType *) buffer;
2358 PropertyActiveDescendentChangePackage *pkg = (PropertyActiveDescendentChangePackage *) (buffer + sizeof(PackageType));
2359 *type = cPropertyActiveDescendentChangePackage;
2360 pkg->vmID = (long) dialogWindow;
2361
2362 // make new Global Refs and send events only to those ATs that want 'em
2363 AccessBridgeATInstance *ati = ATs;
2364 while (ati != (AccessBridgeATInstance *) 0) {
2365 if (ati->accessibilityEventMask & cPropertyActiveDescendentChangeEvent) {
2382 PrintDebugString(" GlobalRef'd OldActiveDescendentAC: %016I64X", pkg->oldActiveDescendentAccessibleContext);
2383 PrintDebugString(" GlobalRef'd NewActiveDescendentAC: %016I64X", pkg->newActiveDescendentAccessibleContext);
2384 #endif
2385
2386 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyActiveDescendentChangeEvent);
2387 }
2388 ati = ati->nextATInstance;
2389 }
2390 PrintDebugString(" done with propertyActiveChange event");
2391 }
2392
2393 /**
2394 * firePropertyValueChange
2395 *
2396 */
2397 void
2398 JavaAccessBridge::firePropertyTableModelChange(JNIEnv *env, jobject callingObj,
2399 jobject event, jobject source,
2400 jstring oldValue, jstring newValue){
2401
2402 PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyTableModelChange(%p, %p, %p, %p, %p, %p)",
2403 env, callingObj, event,
2404 source, oldValue, newValue);
2405
2406 // sanity check
2407 if (ATs == (AccessBridgeATInstance *) 0) {
2408 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2409 return; // panic!
2410 }
2411
2412 // common setup
2413 const wchar_t *stringBytes;
2414 char buffer[sizeof(PackageType) + sizeof(PropertyTableModelChangePackage)];
2415 PackageType *type = (PackageType *) buffer;
2416 PropertyTableModelChangePackage *pkg = (PropertyTableModelChangePackage *) (buffer + sizeof(PackageType));
2417 *type = cPropertyTableModelChangePackage;
2418 pkg->vmID = (long) dialogWindow;
2419
2420 // make new Global Refs and send events only to those ATs that want 'em
2421 AccessBridgeATInstance *ati = ATs;
2422 while (ati != (AccessBridgeATInstance *) 0) {
2563 FIRE_EVENT(fireCaretUpdate, CaretUpdatePackage, cCaretUpdatePackage, cCaretUpdateEvent)
2564 FIRE_EVENT(fireMouseClicked, MouseClickedPackage, cMouseClickedPackage, cMouseClickedEvent)
2565 FIRE_EVENT(fireMouseEntered, MouseEnteredPackage, cMouseEnteredPackage, cMouseEnteredEvent)
2566 FIRE_EVENT(fireMouseExited, MouseExitedPackage, cMouseExitedPackage, cMouseExitedEvent)
2567 FIRE_EVENT(fireMousePressed, MousePressedPackage, cMousePressedPackage, cMousePressedEvent)
2568 FIRE_EVENT(fireMouseReleased, MouseReleasedPackage, cMouseReleasedPackage, cMouseReleasedEvent)
2569 FIRE_EVENT(fireMenuCanceled, MenuCanceledPackage, cMenuCanceledPackage, cMenuCanceledEvent)
2570 FIRE_EVENT(fireMenuDeselected, MenuDeselectedPackage, cMenuDeselectedPackage, cMenuDeselectedEvent)
2571 FIRE_EVENT(fireMenuSelected, MenuSelectedPackage, cMenuSelectedPackage, cMenuSelectedEvent)
2572 FIRE_EVENT(firePopupMenuCanceled, PopupMenuCanceledPackage, cPopupMenuCanceledPackage, cPopupMenuCanceledEvent)
2573 FIRE_EVENT(firePopupMenuWillBecomeInvisible, PopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisibleEvent)
2574 FIRE_EVENT(firePopupMenuWillBecomeVisible, PopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisibleEvent)
2575
2576
2577 // -----------------------------
2578
2579
2580 extern "C" { // event stuff from AccessBridge.h, generated by JNI
2581
2582 JNIEXPORT void JNICALL
2583 Java_com_sun_java_accessibility_AccessBridge_sendDebugString(JNIEnv *env, jobject callingObj, jstring debugStr) {
2584
2585 const wchar_t *stringBytes;
2586 stringBytes = (const wchar_t *) env->GetStringChars(debugStr, 0);
2587 if (stringBytes == NULL) {
2588 if (!env->ExceptionCheck()) {
2589 jclass cls = env->FindClass("java/lang/OutOfMemoryError");
2590 if (cls != NULL) {
2591 env->ThrowNew(cls, NULL);
2592 }
2593 }
2594 return;
2595 }
2596 wPrintJavaDebugString(L"AccessBridge.java: %ls", stringBytes);
2597 env->ReleaseStringChars(debugStr, stringBytes);
2598 }
2599
2600 JNIEXPORT void JNICALL
2601 Java_com_sun_java_accessibility_AccessBridge_propertyCaretChange(JNIEnv *env, jobject callingObj,
2602 jobject event, jobject source,
2603 jint oldValue, jint newValue) {
2604 theJavaAccessBridge->firePropertyCaretChange(env, callingObj,
2605 event, source,
2606 oldValue, newValue);
2607 }
2608
2609 JNIEXPORT void JNICALL
2610 Java_com_sun_java_accessibility_AccessBridge_propertyDescriptionChange(JNIEnv *env, jobject callingObj,
2611 jobject event, jobject source,
2612 jstring oldValue, jstring newValue) {
2613 theJavaAccessBridge->firePropertyDescriptionChange(env, callingObj,
2614 event, source,
2615 oldValue, newValue);
2616 }
2617
2618 JNIEXPORT void JNICALL
2619 Java_com_sun_java_accessibility_AccessBridge_propertyNameChange(JNIEnv *env, jobject callingObj,
2620 jobject event, jobject source,
2621 jstring oldValue, jstring newValue) {
2622 theJavaAccessBridge->firePropertyNameChange(env, callingObj,
2623 event, source,
2624 oldValue, newValue);
2625 }
2626
2627 JNIEXPORT void JNICALL
2628 Java_com_sun_java_accessibility_AccessBridge_propertySelectionChange(JNIEnv *env, jobject callingObj,
2629 jobject event, jobject source) {
2630 theJavaAccessBridge->firePropertySelectionChange(env, callingObj,
2631 event, source);
2632 }
2633
2634 JNIEXPORT void JNICALL
2635 Java_com_sun_java_accessibility_AccessBridge_propertyStateChange(JNIEnv *env, jobject callingObj,
2636 jobject event, jobject source,
2637 jstring oldValue, jstring newValue) {
2638 theJavaAccessBridge->firePropertyStateChange(env, callingObj,
2639 event, source,
2640 oldValue, newValue);
2641 }
2642
2643 JNIEXPORT void JNICALL
2644 Java_com_sun_java_accessibility_AccessBridge_propertyTextChange(JNIEnv *env, jobject callingObj,
2645 jobject event, jobject source) {
2646 theJavaAccessBridge->firePropertyTextChange(env, callingObj,
2647 event, source);
2648 }
2649
2650 JNIEXPORT void JNICALL
2651 Java_com_sun_java_accessibility_AccessBridge_propertyValueChange(JNIEnv *env, jobject callingObj,
2652 jobject event, jobject source,
2653 jstring oldValue, jstring newValue) {
2654 theJavaAccessBridge->firePropertyValueChange(env, callingObj,
2655 event, source,
2656 oldValue, newValue);
2657 }
2658
2659 JNIEXPORT void JNICALL
2660 Java_com_sun_java_accessibility_AccessBridge_propertyVisibleDataChange(JNIEnv *env, jobject callingObj,
2661 jobject event, jobject source) {
2662 theJavaAccessBridge->firePropertyVisibleDataChange(env, callingObj,
2663 event, source);
2664 }
2665
2666 JNIEXPORT void JNICALL
2667 Java_com_sun_java_accessibility_AccessBridge_propertyChildChange(JNIEnv *env, jobject callingObj,
2668 jobject event, jobject source,
2669 jobject oldValue, jobject newValue) {
2670 theJavaAccessBridge->firePropertyChildChange(env, callingObj,
2671 event, source,
2672 oldValue, newValue);
2673 }
2674
2675 JNIEXPORT void JNICALL
2676 Java_com_sun_java_accessibility_AccessBridge_propertyActiveDescendentChange(JNIEnv *env, jobject callingObj,
2677 jobject event, jobject source,
2678 jobject oldValue,
2679 jobject newValue) {
2680 theJavaAccessBridge->firePropertyActiveDescendentChange(env, callingObj,
2681 event, source,
2682 oldValue, newValue);
2683 }
2684
2685 JNIEXPORT void JNICALL
2686 Java_com_sun_java_accessibility_AccessBridge_propertyTableModelChange(JNIEnv *env, jobject callingObj,
2687 jobject event, jobject source,
2688 jstring oldValue, jstring newValue) {
2689
2690 theJavaAccessBridge->firePropertyTableModelChange(env, callingObj,
2691 event, source,
2692 oldValue, newValue);
2693 }
2694
2695 #define HANDLE_STANDARD_EVENT_FROM_JAVA(function, method) \
2696 JNIEXPORT void JNICALL \
2697 function(JNIEnv *env, jobject callingObj, jobject event, jobject source) { \
2698 theJavaAccessBridge->method(env, callingObj, event, source); \
2699 }
2700
2701
2702 JNIEXPORT void JNICALL
2703 Java_com_sun_java_accessibility_AccessBridge_javaShutdown(JNIEnv *env, jobject callingObj) {
2704 theJavaAccessBridge->javaShutdown(env, callingObj);
2705 }
2706
2707 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_focusGained, fireFocusGained)
2708 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_focusLost, fireFocusLost)
2709 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_caretUpdate, fireCaretUpdate)
2710 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseClicked, fireMouseClicked)
2711 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseEntered, fireMouseEntered)
2712 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseExited, fireMouseExited)
2713 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mousePressed, fireMousePressed)
2714 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseReleased, fireMouseReleased)
2715 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuCanceled, fireMenuCanceled)
2716 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuDeselected, fireMenuDeselected)
2717 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuSelected, fireMenuSelected)
2718 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuCanceled, firePopupMenuCanceled)
2719 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuWillBecomeInvisible, firePopupMenuWillBecomeInvisible)
2720 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuWillBecomeVisible, firePopupMenuWillBecomeVisible)
2721
2722 /*
2723 * Map a HWND to a Java component
2724 *
2725 * Class: com_sun_java_accessibility_AccessBridge
2726 * Method: jawtGetComponentFromNativeWindowHandle
2727 * Signature: (I)Ljava/awt/Component;
2728 */
2729 JNIEXPORT jobject JNICALL
2730 Java_com_sun_java_accessibility_AccessBridge_jawtGetComponentFromNativeWindowHandle
2731 (JNIEnv *env, jobject callingObj, jint windowHandle) {
2732
2733 JAWT awt;
2734 jboolean result;
2735 jobject component = (jobject)0;
2736
2737 // Get the AWT
2738 awt.version = JAWT_VERSION_1_4;
2739 result = JAWT_GetAWT(env, &awt);
2740 if (result == JNI_FALSE) {
2741 return (jobject)0;
2742 }
2743
2744 // Get the component
2745 return awt.GetComponent(env, (void *)windowHandle);
2746 }
2747
2748
2749 /*
2750 * Map a Java component to a HWND
2751 *
2752 * Class: com_sun_java_accessibility_AccessBridge
2753 * Method: jawtGetNativeWindowHandleFromComponent
2754 * Signature: (Ljava/awt/Component;)I
2755 */
2756 JNIEXPORT jint JNICALL
2757 Java_com_sun_java_accessibility_AccessBridge_jawtGetNativeWindowHandleFromComponent
2758 (JNIEnv *env, jobject callingObj, jobject component) {
2759
2760 JAWT awt;
2761 JAWT_DrawingSurface* ds;
2762 JAWT_DrawingSurfaceInfo* dsi;
2763 JAWT_Win32DrawingSurfaceInfo* dsi_win;
2764 jboolean result;
2765 // jint lock;
2766 jint windowHandle = -1;
2767
2768 // Get the AWT
2769 awt.version = JAWT_VERSION_1_4;
2770 result = JAWT_GetAWT(env, &awt);
2771 if (result == JNI_FALSE) {
2772 return -1;
2773 }
2774
2775 // Get the drawing surface
2776 ds = awt.GetDrawingSurface(env, component);
2777 if (ds == NULL) {
|
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 /*
27 * A DLL which is loaded by Java applications to handle communication
28 * between Java VMs purposes of Accessbility.
29 */
30
31 #include "AccessBridgeDebug.h"
32 #include "JavaAccessBridge.h"
33 #include "com_sun_java_accessibility_internal_AccessBridge.h" // programatically generated by JNI
34 #include "accessBridgeResource.h"
35 #include "accessBridgeCallbacks.h"
36 #include "AccessBridgeMessages.h"
37
38
39 #include <windows.h>
40 #include <stdio.h>
41
42 #include <jawt.h>
43 #include <jawt_md.h>
44
45 JavaAccessBridge *theJavaAccessBridge;
46 HWND theDialogWindow;
47
48 // re-entrance lock for receiving memory messages
49 CRITICAL_SECTION receiveMemoryIPCLock;
50
51
52 // unique broadcast msg. IDs gotten dymanically
53 extern UINT theFromJavaHelloMsgID;
67 case DLL_PROCESS_ATTACH:
68 InitializeCriticalSection(&receiveMemoryIPCLock);
69 theJavaAccessBridge = new JavaAccessBridge(hinstDll);
70 break;
71
72 case DLL_PROCESS_DETACH: // A Windows executable unloaded us
73 if (theJavaAccessBridge != (JavaAccessBridge *) 0) {
74 delete theJavaAccessBridge;
75 DeleteCriticalSection(&receiveMemoryIPCLock);
76 }
77 break;
78 }
79 return TRUE;
80 }
81
82 /**
83 * Open a native window (and init the wrappers we'll be using)
84 *
85 */
86 JNIEXPORT void JNICALL
87 Java_com_sun_java_accessibility_internal_AccessBridge_runDLL(JNIEnv *env, jobject obj) {
88 PrintDebugString("\r\nJavaAccessBridge.DLL runDLL() called");
89 theJavaAccessBridge->javaRun(env, obj);
90 }
91
92 #if 0 // SetDlgItemText has caused problems with JAWS
93 /**
94 * Append debug info to dialog
95 *
96 */
97 void AppendToCallInfo(char *s) {
98 char buffer[4096];
99
100 PrintDebugString(s);
101
102 GetDlgItemText(theDialogWindow, cCallInfo, buffer, sizeof(buffer));
103 if (strlen(buffer) < (sizeof(buffer) - strlen(s))) {
104 strncat(buffer, s, sizeof(buffer));
105 SetDlgItemText(theDialogWindow, cCallInfo, buffer);
106 } else {
107 SetDlgItemText(theDialogWindow, cCallInfo, s);
1717 if (!(globalEventMask & type)) {
1718 // no other ATs wanted this event;
1719 // stop getting them from Java
1720 PrintDebugString(" no other AT wanted this Accessibility event (so can remove); removing from AccessBridge.java");
1721 windowsThreadEntryPoints->removeAccessibilityEventNotification(type);
1722 }
1723 }
1724
1725
1726
1727
1728 /**
1729 * firePropertyCaretChange
1730 *
1731 */
1732 void
1733 JavaAccessBridge::firePropertyCaretChange(JNIEnv *env, jobject callingObj,
1734 jobject event, jobject source,
1735 jint oldValue, jint newValue) {
1736
1737 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyCaretChanged(%p, %p, %p, %p, %d, %d)",
1738 env, callingObj, event,
1739 source, oldValue, newValue);
1740
1741 // sanity check
1742 if (ATs == (AccessBridgeATInstance *) 0) {
1743 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
1744 return; // panic!
1745 }
1746
1747 // common setup
1748 char buffer[sizeof(PackageType) + sizeof(PropertyCaretChangePackage)];
1749 PackageType *type = (PackageType *) buffer;
1750 PropertyCaretChangePackage *pkg = (PropertyCaretChangePackage *) (buffer + sizeof(PackageType));
1751 *type = cPropertyCaretChangePackage;
1752 pkg->vmID = (long) dialogWindow;
1753
1754 // make new Global Refs and send events only to those ATs that want 'em
1755 AccessBridgeATInstance *ati = ATs;
1756 while (ati != (AccessBridgeATInstance *) 0) {
1757 if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) {
1771
1772 pkg->oldPosition = oldValue;
1773 pkg->newPosition = newValue;
1774
1775 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyCaretChangeEvent);
1776 }
1777 ati = ati->nextATInstance;
1778 }
1779 PrintDebugString(" done with propertyCaretChange event");
1780 }
1781
1782 /**
1783 * firePropertyDescriptionChange
1784 *
1785 */
1786 void
1787 JavaAccessBridge::firePropertyDescriptionChange(JNIEnv *env, jobject callingObj,
1788 jobject event, jobject source,
1789 jstring oldValue, jstring newValue){
1790
1791 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyDescriptionChanged(%p, %p, %p, %p, %p, %p)",
1792 env, callingObj, event,
1793 source, oldValue, newValue);
1794
1795 // sanity check
1796 if (ATs == (AccessBridgeATInstance *) 0) {
1797 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
1798 return; // panic!
1799 }
1800
1801 // common setup
1802 const wchar_t *stringBytes;
1803 char buffer[sizeof(PackageType) + sizeof(PropertyDescriptionChangePackage)];
1804 PackageType *type = (PackageType *) buffer;
1805 PropertyDescriptionChangePackage *pkg = (PropertyDescriptionChangePackage *) (buffer + sizeof(PackageType));
1806 *type = cPropertyDescriptionChangePackage;
1807 pkg->vmID = (long) dialogWindow;
1808
1809 // make new Global Refs and send events only to those ATs that want 'em
1810 AccessBridgeATInstance *ati = ATs;
1811 while (ati != (AccessBridgeATInstance *) 0) {
1857 } else {
1858 wcsncpy(pkg->newDescription, L"(null)", (sizeof(pkg->newDescription) / sizeof(wchar_t)));
1859 }
1860
1861 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyDescriptionChangeEvent);
1862 }
1863 ati = ati->nextATInstance;
1864 }
1865 PrintDebugString(" done with propertyDescriptionChange event");
1866 }
1867
1868 /**
1869 * firePropertyNameChange
1870 *
1871 */
1872 void
1873 JavaAccessBridge::firePropertyNameChange(JNIEnv *env, jobject callingObj,
1874 jobject event, jobject source,
1875 jstring oldValue, jstring newValue){
1876
1877 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyNameChanged(%p, %p, %p, %p, %p, %p)",
1878 env, callingObj, event,
1879 source, oldValue, newValue);
1880
1881 // sanity check
1882 if (ATs == (AccessBridgeATInstance *) 0) {
1883 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
1884 return; // panic!
1885 }
1886
1887 // common setup
1888 const wchar_t *stringBytes;
1889 char buffer[sizeof(PackageType) + sizeof(PropertyNameChangePackage)];
1890 PackageType *type = (PackageType *) buffer;
1891 PropertyNameChangePackage *pkg = (PropertyNameChangePackage *) (buffer + sizeof(PackageType));
1892 *type = cPropertyNameChangePackage;
1893 pkg->vmID = (long) dialogWindow;
1894
1895 // make new Global Refs and send events only to those ATs that want 'em
1896 AccessBridgeATInstance *ati = ATs;
1897 while (ati != (AccessBridgeATInstance *) 0) {
1943 } else {
1944 wcsncpy(pkg->newName, L"(null)", (sizeof(pkg->newName) / sizeof(wchar_t)));
1945 }
1946
1947 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyNameChangeEvent);
1948 }
1949 ati = ati->nextATInstance;
1950 }
1951 PrintDebugString(" done with propertyNameChange event");
1952 }
1953
1954
1955 /**
1956 * firePropertySelectionChange
1957 *
1958 */
1959 void
1960 JavaAccessBridge::firePropertySelectionChange(JNIEnv *env, jobject callingObj,
1961 jobject event, jobject source) {
1962
1963 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertySelectionChanged(%p, %p, %p, %p)",
1964 env, callingObj, event, source);
1965
1966 // sanity check
1967 if (ATs == (AccessBridgeATInstance *) 0) {
1968 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
1969 return; // panic!
1970 }
1971
1972 // common setup
1973 char buffer[sizeof(PackageType) + sizeof(PropertySelectionChangePackage)];
1974 PackageType *type = (PackageType *) buffer;
1975 PropertySelectionChangePackage *pkg = (PropertySelectionChangePackage *) (buffer + sizeof(PackageType));
1976 *type = cPropertySelectionChangePackage;
1977 pkg->vmID = (long) dialogWindow;
1978
1979 // make new Global Refs and send events only to those ATs that want 'em
1980 AccessBridgeATInstance *ati = ATs;
1981 while (ati != (AccessBridgeATInstance *) 0) {
1982 if (ati->accessibilityEventMask & cPropertySelectionChangeEvent) {
1983
1994 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
1995 #endif
1996
1997 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertySelectionChangeEvent);
1998 }
1999 ati = ati->nextATInstance;
2000 }
2001 PrintDebugString(" done with propertySelectionChange event");
2002 }
2003
2004
2005 /**
2006 * firePropertyStateChange
2007 *
2008 */
2009 void
2010 JavaAccessBridge::firePropertyStateChange(JNIEnv *env, jobject callingObj,
2011 jobject event, jobject source,
2012 jstring oldValue, jstring newValue){
2013
2014 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyStateChanged(%p, %p, %p, %p, %p, %p)",
2015 env, callingObj, event,
2016 source, oldValue, newValue);
2017
2018 // sanity check
2019 if (ATs == (AccessBridgeATInstance *) 0) {
2020 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2021 return; // panic!
2022 }
2023
2024 // common setup
2025 const wchar_t *stringBytes;
2026 char buffer[sizeof(PackageType) + sizeof(PropertyStateChangePackage)];
2027 PackageType *type = (PackageType *) buffer;
2028 PropertyStateChangePackage *pkg = (PropertyStateChangePackage *) (buffer + sizeof(PackageType));
2029 *type = cPropertyStateChangePackage;
2030 pkg->vmID = (long) dialogWindow;
2031
2032 // make new Global Refs and send events only to those ATs that want 'em
2033 AccessBridgeATInstance *ati = ATs;
2034 while (ati != (AccessBridgeATInstance *) 0) {
2080 } else {
2081 wcsncpy(pkg->newState, L"(null)", (sizeof(pkg->newState) / sizeof(wchar_t)));
2082 }
2083
2084 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyStateChangeEvent);
2085 }
2086 ati = ati->nextATInstance;
2087 }
2088 PrintDebugString(" done with propertyStateChange event");
2089 }
2090
2091
2092 /**
2093 * firePropertyTextChange
2094 *
2095 */
2096 void
2097 JavaAccessBridge::firePropertyTextChange(JNIEnv *env, jobject callingObj,
2098 jobject event, jobject source) {
2099
2100 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyTextChanged(%p, %p, %p, %p)",
2101 env, callingObj, event, source);
2102
2103 // sanity check
2104 if (ATs == (AccessBridgeATInstance *) 0) {
2105 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2106 return; // panic!
2107 }
2108
2109 // common setup
2110 char buffer[sizeof(PackageType) + sizeof(PropertyTextChangePackage)];
2111 PackageType *type = (PackageType *) buffer;
2112 PropertyTextChangePackage *pkg = (PropertyTextChangePackage *) (buffer + sizeof(PackageType));
2113 *type = cPropertyTextChangePackage;
2114 pkg->vmID = (long) dialogWindow;
2115
2116 // make new Global Refs and send events only to those ATs that want 'em
2117 AccessBridgeATInstance *ati = ATs;
2118 while (ati != (AccessBridgeATInstance *) 0) {
2119 if (ati->accessibilityEventMask & cPropertyTextChangeEvent) {
2120
2131 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
2132 #endif
2133
2134 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTextChangeEvent);
2135 }
2136 ati = ati->nextATInstance;
2137 }
2138 PrintDebugString(" done with propertyTextChange event");
2139 }
2140
2141
2142 /**
2143 * firePropertyValueChange
2144 *
2145 */
2146 void
2147 JavaAccessBridge::firePropertyValueChange(JNIEnv *env, jobject callingObj,
2148 jobject event, jobject source,
2149 jstring oldValue, jstring newValue){
2150
2151 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyValueChanged(%p, %p, %p, %p, %p, %p)",
2152 env, callingObj, event,
2153 source, oldValue, newValue);
2154
2155 // sanity check
2156 if (ATs == (AccessBridgeATInstance *) 0) {
2157 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2158 return; // panic!
2159 }
2160
2161 // common setup
2162 const wchar_t *stringBytes;
2163 char buffer[sizeof(PackageType) + sizeof(PropertyValueChangePackage)];
2164 PackageType *type = (PackageType *) buffer;
2165 PropertyValueChangePackage *pkg = (PropertyValueChangePackage *) (buffer + sizeof(PackageType));
2166 *type = cPropertyValueChangePackage;
2167 pkg->vmID = (long) dialogWindow;
2168
2169 // make new Global Refs and send events only to those ATs that want 'em
2170 AccessBridgeATInstance *ati = ATs;
2171 while (ati != (AccessBridgeATInstance *) 0) {
2216 env->ReleaseStringChars(newValue, stringBytes);
2217 } else {
2218 wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t)));
2219 }
2220
2221 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyValueChangeEvent);
2222 }
2223 ati = ati->nextATInstance;
2224 }
2225 PrintDebugString(" done with propertyValueChange event");
2226 }
2227
2228 /**
2229 * firePropertyVisibleDataChange
2230 *
2231 */
2232 void
2233 JavaAccessBridge::firePropertyVisibleDataChange(JNIEnv *env, jobject callingObj,
2234 jobject event, jobject source) {
2235
2236 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyVisibleDataChanged(%p, %p, %p, %p)",
2237 env, callingObj, event, source);
2238
2239 // sanity check
2240 if (ATs == (AccessBridgeATInstance *) 0) {
2241 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2242 return; // panic!
2243 }
2244
2245 // common setup
2246 char buffer[sizeof(PackageType) + sizeof(PropertyVisibleDataChangePackage)];
2247 PackageType *type = (PackageType *) buffer;
2248 PropertyVisibleDataChangePackage *pkg = (PropertyVisibleDataChangePackage *) (buffer + sizeof(PackageType));
2249 *type = cPropertyVisibleDataChangePackage;
2250 pkg->vmID = (long) dialogWindow;
2251
2252 // make new Global Refs and send events only to those ATs that want 'em
2253 AccessBridgeATInstance *ati = ATs;
2254 while (ati != (AccessBridgeATInstance *) 0) {
2255 if (ati->accessibilityEventMask & cPropertyVisibleDataChangeEvent) {
2256
2267 PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
2268 #endif
2269
2270 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyVisibleDataChangeEvent);
2271 }
2272 ati = ati->nextATInstance;
2273 }
2274 PrintDebugString(" done with propertyVisibleDataChange event");
2275 }
2276
2277
2278 /**
2279 * firePropertyChildChange
2280 *
2281 */
2282 void
2283 JavaAccessBridge::firePropertyChildChange(JNIEnv *env, jobject callingObj,
2284 jobject event, jobject source,
2285 jobject oldValue, jobject newValue){
2286
2287 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyChildPropertyChanged(%p, %p, %p, %p, %p, %p)",
2288 env, callingObj, event,
2289 source, oldValue, newValue);
2290
2291 // sanity check
2292 if (ATs == (AccessBridgeATInstance *) 0) {
2293 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2294 return; // panic!
2295 }
2296
2297 // common setup
2298 char buffer[sizeof(PackageType) + sizeof(PropertyChildChangePackage)];
2299 PackageType *type = (PackageType *) buffer;
2300 PropertyChildChangePackage *pkg = (PropertyChildChangePackage *) (buffer + sizeof(PackageType));
2301 *type = cPropertyChildChangePackage;
2302 pkg->vmID = (long) dialogWindow;
2303
2304 // make new Global Refs and send events only to those ATs that want 'em
2305 AccessBridgeATInstance *ati = ATs;
2306 while (ati != (AccessBridgeATInstance *) 0) {
2307 if (ati->accessibilityEventMask & cPropertyChildChangeEvent) {
2325 PrintDebugString(" GlobalRef'd NewChildAC: %016I64X", pkg->newChildAccessibleContext);
2326 #endif
2327
2328 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyChildChangeEvent);
2329 }
2330 ati = ati->nextATInstance;
2331 }
2332 PrintDebugString(" done with propertyChildChange event");
2333 }
2334
2335
2336 /**
2337 * firePropertyActiveDescendentChange
2338 *
2339 */
2340 void
2341 JavaAccessBridge::firePropertyActiveDescendentChange(JNIEnv *env, jobject callingObj,
2342 jobject event, jobject source,
2343 jobject oldValue, jobject newValue){
2344
2345 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyActiveDescendentPropertyChanged(%p, %p, %p, %p, %p, %p)",
2346 env, callingObj, event,
2347 source, oldValue, newValue);
2348
2349 // sanity check
2350 if (ATs == (AccessBridgeATInstance *) 0) {
2351 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2352 return; // panic!
2353 }
2354
2355 // common setup
2356 char buffer[sizeof(PackageType) + sizeof(PropertyActiveDescendentChangePackage)];
2357 PackageType *type = (PackageType *) buffer;
2358 PropertyActiveDescendentChangePackage *pkg = (PropertyActiveDescendentChangePackage *) (buffer + sizeof(PackageType));
2359 *type = cPropertyActiveDescendentChangePackage;
2360 pkg->vmID = (long) dialogWindow;
2361
2362 // make new Global Refs and send events only to those ATs that want 'em
2363 AccessBridgeATInstance *ati = ATs;
2364 while (ati != (AccessBridgeATInstance *) 0) {
2365 if (ati->accessibilityEventMask & cPropertyActiveDescendentChangeEvent) {
2382 PrintDebugString(" GlobalRef'd OldActiveDescendentAC: %016I64X", pkg->oldActiveDescendentAccessibleContext);
2383 PrintDebugString(" GlobalRef'd NewActiveDescendentAC: %016I64X", pkg->newActiveDescendentAccessibleContext);
2384 #endif
2385
2386 ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyActiveDescendentChangeEvent);
2387 }
2388 ati = ati->nextATInstance;
2389 }
2390 PrintDebugString(" done with propertyActiveChange event");
2391 }
2392
2393 /**
2394 * firePropertyValueChange
2395 *
2396 */
2397 void
2398 JavaAccessBridge::firePropertyTableModelChange(JNIEnv *env, jobject callingObj,
2399 jobject event, jobject source,
2400 jstring oldValue, jstring newValue){
2401
2402 PrintDebugString("\r\nJava_com_sun_java_accessibility_internal_AccessBridge_propertyTableModelChange(%p, %p, %p, %p, %p, %p)",
2403 env, callingObj, event,
2404 source, oldValue, newValue);
2405
2406 // sanity check
2407 if (ATs == (AccessBridgeATInstance *) 0) {
2408 PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)");
2409 return; // panic!
2410 }
2411
2412 // common setup
2413 const wchar_t *stringBytes;
2414 char buffer[sizeof(PackageType) + sizeof(PropertyTableModelChangePackage)];
2415 PackageType *type = (PackageType *) buffer;
2416 PropertyTableModelChangePackage *pkg = (PropertyTableModelChangePackage *) (buffer + sizeof(PackageType));
2417 *type = cPropertyTableModelChangePackage;
2418 pkg->vmID = (long) dialogWindow;
2419
2420 // make new Global Refs and send events only to those ATs that want 'em
2421 AccessBridgeATInstance *ati = ATs;
2422 while (ati != (AccessBridgeATInstance *) 0) {
2563 FIRE_EVENT(fireCaretUpdate, CaretUpdatePackage, cCaretUpdatePackage, cCaretUpdateEvent)
2564 FIRE_EVENT(fireMouseClicked, MouseClickedPackage, cMouseClickedPackage, cMouseClickedEvent)
2565 FIRE_EVENT(fireMouseEntered, MouseEnteredPackage, cMouseEnteredPackage, cMouseEnteredEvent)
2566 FIRE_EVENT(fireMouseExited, MouseExitedPackage, cMouseExitedPackage, cMouseExitedEvent)
2567 FIRE_EVENT(fireMousePressed, MousePressedPackage, cMousePressedPackage, cMousePressedEvent)
2568 FIRE_EVENT(fireMouseReleased, MouseReleasedPackage, cMouseReleasedPackage, cMouseReleasedEvent)
2569 FIRE_EVENT(fireMenuCanceled, MenuCanceledPackage, cMenuCanceledPackage, cMenuCanceledEvent)
2570 FIRE_EVENT(fireMenuDeselected, MenuDeselectedPackage, cMenuDeselectedPackage, cMenuDeselectedEvent)
2571 FIRE_EVENT(fireMenuSelected, MenuSelectedPackage, cMenuSelectedPackage, cMenuSelectedEvent)
2572 FIRE_EVENT(firePopupMenuCanceled, PopupMenuCanceledPackage, cPopupMenuCanceledPackage, cPopupMenuCanceledEvent)
2573 FIRE_EVENT(firePopupMenuWillBecomeInvisible, PopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisibleEvent)
2574 FIRE_EVENT(firePopupMenuWillBecomeVisible, PopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisibleEvent)
2575
2576
2577 // -----------------------------
2578
2579
2580 extern "C" { // event stuff from AccessBridge.h, generated by JNI
2581
2582 JNIEXPORT void JNICALL
2583 Java_com_sun_java_accessibility_internal_AccessBridge_sendDebugString(JNIEnv *env, jobject callingObj, jstring debugStr) {
2584
2585 const wchar_t *stringBytes;
2586 stringBytes = (const wchar_t *) env->GetStringChars(debugStr, 0);
2587 if (stringBytes == NULL) {
2588 if (!env->ExceptionCheck()) {
2589 jclass cls = env->FindClass("java/lang/OutOfMemoryError");
2590 if (cls != NULL) {
2591 env->ThrowNew(cls, NULL);
2592 }
2593 }
2594 return;
2595 }
2596 wPrintJavaDebugString(L"AccessBridge.java: %ls", stringBytes);
2597 env->ReleaseStringChars(debugStr, stringBytes);
2598 }
2599
2600 JNIEXPORT void JNICALL
2601 Java_com_sun_java_accessibility_internal_AccessBridge_propertyCaretChange(JNIEnv *env, jobject callingObj,
2602 jobject event, jobject source,
2603 jint oldValue, jint newValue) {
2604 theJavaAccessBridge->firePropertyCaretChange(env, callingObj,
2605 event, source,
2606 oldValue, newValue);
2607 }
2608
2609 JNIEXPORT void JNICALL
2610 Java_com_sun_java_accessibility_internal_AccessBridge_propertyDescriptionChange(JNIEnv *env, jobject callingObj,
2611 jobject event, jobject source,
2612 jstring oldValue, jstring newValue) {
2613 theJavaAccessBridge->firePropertyDescriptionChange(env, callingObj,
2614 event, source,
2615 oldValue, newValue);
2616 }
2617
2618 JNIEXPORT void JNICALL
2619 Java_com_sun_java_accessibility_internal_AccessBridge_propertyNameChange(JNIEnv *env, jobject callingObj,
2620 jobject event, jobject source,
2621 jstring oldValue, jstring newValue) {
2622 theJavaAccessBridge->firePropertyNameChange(env, callingObj,
2623 event, source,
2624 oldValue, newValue);
2625 }
2626
2627 JNIEXPORT void JNICALL
2628 Java_com_sun_java_accessibility_internal_AccessBridge_propertySelectionChange(JNIEnv *env, jobject callingObj,
2629 jobject event, jobject source) {
2630 theJavaAccessBridge->firePropertySelectionChange(env, callingObj,
2631 event, source);
2632 }
2633
2634 JNIEXPORT void JNICALL
2635 Java_com_sun_java_accessibility_internal_AccessBridge_propertyStateChange(JNIEnv *env, jobject callingObj,
2636 jobject event, jobject source,
2637 jstring oldValue, jstring newValue) {
2638 theJavaAccessBridge->firePropertyStateChange(env, callingObj,
2639 event, source,
2640 oldValue, newValue);
2641 }
2642
2643 JNIEXPORT void JNICALL
2644 Java_com_sun_java_accessibility_internal_AccessBridge_propertyTextChange(JNIEnv *env, jobject callingObj,
2645 jobject event, jobject source) {
2646 theJavaAccessBridge->firePropertyTextChange(env, callingObj,
2647 event, source);
2648 }
2649
2650 JNIEXPORT void JNICALL
2651 Java_com_sun_java_accessibility_internal_AccessBridge_propertyValueChange(JNIEnv *env, jobject callingObj,
2652 jobject event, jobject source,
2653 jstring oldValue, jstring newValue) {
2654 theJavaAccessBridge->firePropertyValueChange(env, callingObj,
2655 event, source,
2656 oldValue, newValue);
2657 }
2658
2659 JNIEXPORT void JNICALL
2660 Java_com_sun_java_accessibility_internal_AccessBridge_propertyVisibleDataChange(JNIEnv *env, jobject callingObj,
2661 jobject event, jobject source) {
2662 theJavaAccessBridge->firePropertyVisibleDataChange(env, callingObj,
2663 event, source);
2664 }
2665
2666 JNIEXPORT void JNICALL
2667 Java_com_sun_java_accessibility_internal_AccessBridge_propertyChildChange(JNIEnv *env, jobject callingObj,
2668 jobject event, jobject source,
2669 jobject oldValue, jobject newValue) {
2670 theJavaAccessBridge->firePropertyChildChange(env, callingObj,
2671 event, source,
2672 oldValue, newValue);
2673 }
2674
2675 JNIEXPORT void JNICALL
2676 Java_com_sun_java_accessibility_internal_AccessBridge_propertyActiveDescendentChange(JNIEnv *env, jobject callingObj,
2677 jobject event, jobject source,
2678 jobject oldValue,
2679 jobject newValue) {
2680 theJavaAccessBridge->firePropertyActiveDescendentChange(env, callingObj,
2681 event, source,
2682 oldValue, newValue);
2683 }
2684
2685 JNIEXPORT void JNICALL
2686 Java_com_sun_java_accessibility_internal_AccessBridge_propertyTableModelChange(JNIEnv *env, jobject callingObj,
2687 jobject event, jobject source,
2688 jstring oldValue, jstring newValue) {
2689
2690 theJavaAccessBridge->firePropertyTableModelChange(env, callingObj,
2691 event, source,
2692 oldValue, newValue);
2693 }
2694
2695 #define HANDLE_STANDARD_EVENT_FROM_JAVA(function, method) \
2696 JNIEXPORT void JNICALL \
2697 function(JNIEnv *env, jobject callingObj, jobject event, jobject source) { \
2698 theJavaAccessBridge->method(env, callingObj, event, source); \
2699 }
2700
2701
2702 JNIEXPORT void JNICALL
2703 Java_com_sun_java_accessibility_internal_AccessBridge_javaShutdown(JNIEnv *env, jobject callingObj) {
2704 theJavaAccessBridge->javaShutdown(env, callingObj);
2705 }
2706
2707 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_focusGained, fireFocusGained)
2708 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_focusLost, fireFocusLost)
2709 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_caretUpdate, fireCaretUpdate)
2710 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mouseClicked, fireMouseClicked)
2711 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mouseEntered, fireMouseEntered)
2712 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mouseExited, fireMouseExited)
2713 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mousePressed, fireMousePressed)
2714 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mouseReleased, fireMouseReleased)
2715 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_menuCanceled, fireMenuCanceled)
2716 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_menuDeselected, fireMenuDeselected)
2717 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_menuSelected, fireMenuSelected)
2718 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_popupMenuCanceled, firePopupMenuCanceled)
2719 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_popupMenuWillBecomeInvisible, firePopupMenuWillBecomeInvisible)
2720 HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_popupMenuWillBecomeVisible, firePopupMenuWillBecomeVisible)
2721
2722 /*
2723 * Map a HWND to a Java component
2724 *
2725 * Class: com_sun_java_accessibility_internal_AccessBridge
2726 * Method: jawtGetComponentFromNativeWindowHandle
2727 * Signature: (I)Ljava/awt/Component;
2728 */
2729 JNIEXPORT jobject JNICALL
2730 Java_com_sun_java_accessibility_internal_AccessBridge_jawtGetComponentFromNativeWindowHandle
2731 (JNIEnv *env, jobject callingObj, jint windowHandle) {
2732
2733 JAWT awt;
2734 jboolean result;
2735 jobject component = (jobject)0;
2736
2737 // Get the AWT
2738 awt.version = JAWT_VERSION_1_4;
2739 result = JAWT_GetAWT(env, &awt);
2740 if (result == JNI_FALSE) {
2741 return (jobject)0;
2742 }
2743
2744 // Get the component
2745 return awt.GetComponent(env, (void *)windowHandle);
2746 }
2747
2748
2749 /*
2750 * Map a Java component to a HWND
2751 *
2752 * Class: com_sun_java_accessibility_internal_AccessBridge
2753 * Method: jawtGetNativeWindowHandleFromComponent
2754 * Signature: (Ljava/awt/Component;)I
2755 */
2756 JNIEXPORT jint JNICALL
2757 Java_com_sun_java_accessibility_internal_AccessBridge_jawtGetNativeWindowHandleFromComponent
2758 (JNIEnv *env, jobject callingObj, jobject component) {
2759
2760 JAWT awt;
2761 JAWT_DrawingSurface* ds;
2762 JAWT_DrawingSurfaceInfo* dsi;
2763 JAWT_Win32DrawingSurfaceInfo* dsi_win;
2764 jboolean result;
2765 // jint lock;
2766 jint windowHandle = -1;
2767
2768 // Get the AWT
2769 awt.version = JAWT_VERSION_1_4;
2770 result = JAWT_GetAWT(env, &awt);
2771 if (result == JNI_FALSE) {
2772 return -1;
2773 }
2774
2775 // Get the drawing surface
2776 ds = awt.GetDrawingSurface(env, component);
2777 if (ds == NULL) {
|