< prev index next >

src/jdk.accessibility/windows/native/libjavaaccessbridge/JavaAccessBridge.cpp

Print this page




  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) {


< prev index next >