--- /dev/null 2015-03-24 15:46:40.000000000 -0500 +++ new/jdk/src/jdk.accessibility/windows/native/libjavaaccessbridge/JavaAccessBridge.cpp 2015-03-24 15:46:39.776605300 -0500 @@ -0,0 +1,2799 @@ +/* + * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * A DLL which is loaded by Java applications to handle communication + * between Java VMs purposes of Accessbility. + */ + +#include "AccessBridgeDebug.h" +#include "JavaAccessBridge.h" +#include "com_sun_java_accessibility_AccessBridge.h" // programatically generated by JNI +#include "accessBridgeResource.h" +#include "accessBridgeCallbacks.h" +#include "AccessBridgeMessages.h" + + +#include +#include + +#include +#include + +JavaAccessBridge *theJavaAccessBridge; +HWND theDialogWindow; + +// re-entrance lock for receiving memory messages +CRITICAL_SECTION receiveMemoryIPCLock; + + +// unique broadcast msg. IDs gotten dymanically +extern UINT theFromJavaHelloMsgID; +extern UINT theFromWindowsHelloMsgID; + + +// --------------------------------------------------------------------------- + +extern "C" { + /** + * DllMain - where Windows executables will load/unload us + * + */ + BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) { + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + InitializeCriticalSection(&receiveMemoryIPCLock); + theJavaAccessBridge = new JavaAccessBridge(hinstDll); + break; + + case DLL_PROCESS_DETACH: // A Windows executable unloaded us + if (theJavaAccessBridge != (JavaAccessBridge *) 0) { + delete theJavaAccessBridge; + DeleteCriticalSection(&receiveMemoryIPCLock); + } + break; + } + return TRUE; + } + + /** + * Open a native window (and init the wrappers we'll be using) + * + */ + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_runDLL(JNIEnv *env, jobject obj) { + PrintDebugString("\r\nJavaAccessBridge.DLL runDLL() called"); + theJavaAccessBridge->javaRun(env, obj); + } + +#if 0 // SetDlgItemText has caused problems with JAWS + /** + * Append debug info to dialog + * + */ + void AppendToCallInfo(char *s) { + char buffer[4096]; + + PrintDebugString(s); + + GetDlgItemText(theDialogWindow, cCallInfo, buffer, sizeof(buffer)); + if (strlen(buffer) < (sizeof(buffer) - strlen(s))) { + strncat(buffer, s, sizeof(buffer)); + SetDlgItemText(theDialogWindow, cCallInfo, buffer); + } else { + SetDlgItemText(theDialogWindow, cCallInfo, s); + } + } +#endif + + + /** + * Our window proc + * + */ + BOOL APIENTRY AccessBridgeDialogProc (HWND hDlg, UINT message, UINT wParam, LONG lParam) { + int command; + COPYDATASTRUCT *sentToUs; + char *package; + //DEBUG_CODE(char buffer[256]); + + switch (message) { + case WM_INITDIALOG: + //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Initializing")); + break; + + case WM_COMMAND: + command = LOWORD (wParam); + break; + + // call from Java with data for us to deliver + case WM_COPYDATA: + if (theDialogWindow == (HWND) wParam) { + //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Got WM_COPYDATA from ourselves")); + } else { + //DEBUG_CODE(sprintf(buffer, "Got WM_COPYDATA from HWND %p", wParam)); + //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, buffer)); + sentToUs = (COPYDATASTRUCT *) lParam; + package = (char *) sentToUs->lpData; + theJavaAccessBridge->processPackage(package, sentToUs->cbData); + } + break; + + // call from Java with data for us retrieve from memory mapped file and deliver + case AB_MESSAGE_WAITING: + // wParam == sourceHwnd + // lParam == buffer size in shared memory + if (theDialogWindow == (HWND) wParam) { + //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Got AB_MESSAGE_WAITING from ourselves")); + } else { + //DEBUG_CODE(sprintf(buffer, "Got AB_MESSAGE_WAITING from HWND %p", wParam)); + //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, buffer)); + LRESULT returnVal = theJavaAccessBridge->receiveMemoryPackage((HWND) wParam, lParam); + } + break; + + // a JavaAccessBridge DLL is going away + case AB_DLL_GOING_AWAY: + // wParam == sourceHwnd + //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Got AB_DLL_GOING_AWAY message")); + theJavaAccessBridge->WindowsATDestroyed((HWND) wParam); + break; + + default: + // the Windows AT is saying "hi"! + // wParam == sourceHwnc; lParam unused + if (message == theFromWindowsHelloMsgID) { + // A new Windows AT just said "hi"; + // say "hi" back so it can mate up with us + // otherwise don't do anything (e.g. don't set up data structures yet) + theJavaAccessBridge->postHelloToWindowsDLLMsg((HWND) wParam); + } + } + return FALSE; + } + +} + + +// ----------------------------- + + +/** + * Initialize the JavaAccessBridge + * + */ +JavaAccessBridge::JavaAccessBridge(HINSTANCE hInstance) { + windowsInstance = hInstance; + ATs = (AccessBridgeATInstance *) 0; + initBroadcastMessageIDs(); // get the unique to us broadcast msg. IDs +} + +extern DWORD JavaBridgeThreadId; + +/** + * Destroy the JavaAccessBridge + * + */ +JavaAccessBridge::~JavaAccessBridge() { + // inform all other AccessBridges that we're going away + + PrintDebugString("\r\nin JavaAccessBridge::~JavaAccessBridge()"); + + // Send a shutdown message for those applications like StarOffice that do + // send a shutdown message themselves. + javaShutdown(NULL, 0); + + AccessBridgeATInstance *current = ATs; + while (current != (AccessBridgeATInstance *) 0) { + PrintDebugString(" telling %p we're going away", current->winAccessBridgeWindow); + SendMessage(current->winAccessBridgeWindow, + AB_DLL_GOING_AWAY, (WPARAM) dialogWindow, (LPARAM) 0); + current = current->nextATInstance; + } + + PrintDebugString(" finished telling ATs about our demise"); + + if(JavaBridgeThreadId) + { + PostThreadMessage(JavaBridgeThreadId,WM_USER+1,0,0); + Sleep(100); + } + + delete ATs; + + PrintDebugString(" finished deleting ATs"); + PrintDebugString("GOODBYE CRUEL WORLD..."); +} + + +void +JavaAccessBridge::javaRun(JNIEnv *env, jobject obj) { + MSG msg; + + PrintDebugString("JavaAccessBridge::javaRun(%p, %p) called", env, obj); + + if (env->GetJavaVM(&javaVM) != 0) { + return; // huh!?!?! + } + PrintDebugString(" -> javaVM = %p", javaVM); + + if (javaVM->AttachCurrentThread((void **) &windowsThreadJNIEnv, NULL) != 0) { + return; // huh!?!?! + } + PrintDebugString(" -> windowsThreadJNIEnv = %p", windowsThreadJNIEnv); + + javaThreadABObject = env->NewGlobalRef(obj); + windowsThreadABObject = windowsThreadJNIEnv->NewGlobalRef(obj); + + // initialize the Java thread AccessBridge entry points + javaThreadEntryPoints = new AccessBridgeJavaEntryPoints(env, javaThreadABObject); + if (javaThreadEntryPoints->BuildJavaEntryPoints() == FALSE) { + return; // couldn't build our entry points; let's get out of here! + } + PrintDebugString(" all Java thread entry points successfully found."); + + // initialize the Windows thread AccessBridge entry points + windowsThreadEntryPoints = new AccessBridgeJavaEntryPoints(windowsThreadJNIEnv, + windowsThreadABObject); + if (windowsThreadEntryPoints->BuildJavaEntryPoints() == FALSE) { + return; // couldn't build our entry points; let's get out of here! + } + PrintDebugString(" all Windows thread entry points successfully found."); + + + // open our window + if (initWindow() == TRUE) { + PrintDebugString(" Window created. HWND = %p", dialogWindow); + + // post a broadcast msg.; let other AccessBridge DLLs know we exist + postHelloToWindowsDLLMsg(HWND_BROADCAST); + + // do that message loop thing + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } else { + PrintDebugString(" FAILED TO CREATE WINDOW!!!"); + } + + javaVM->DetachCurrentThread(); +} + +/** + * Bring up our window; make a connection to the rest of the world + * + */ +BOOL +JavaAccessBridge::initWindow() { + theDialogWindow = CreateDialog(windowsInstance, + "ACCESSBRIDGESTATUSWINDOW", NULL, + (DLGPROC) AccessBridgeDialogProc); + + // If window could not be created, return "failure". + if (!theDialogWindow) + return FALSE; + + dialogWindow = theDialogWindow; + + // Make the window visible, update its client area, & return "success". + // DEBUG_CODE(ShowWindow (theDialogWindow, SW_SHOWNORMAL)); + // DEBUG_CODE(UpdateWindow (theDialogWindow)); + + return TRUE; +} + + + +// ----------------------- + + +/** + * postHelloToWindowsDLLMsg + * - PostMessage(theFromJavaHelloMsgID) to let one or + * all WindowDLLs we're here and have a vmID + * + * destHwnd is either a single hwnd or HWND_BROADCAST + * (former if a reply, latter if we're just born) + * wParam is our HWND + * lParam is our vmID + * + */ +void +JavaAccessBridge::postHelloToWindowsDLLMsg(HWND destHwnd) { + PrintDebugString("\r\nin JavaAccessBridge::postHelloToWindowsDLLMsg"); + PrintDebugString(" calling PostMessage(%p, %X, %p, %p)", + destHwnd, theFromJavaHelloMsgID, dialogWindow, javaVM); + PostMessage(destHwnd, theFromJavaHelloMsgID, (WPARAM) dialogWindow, (LPARAM) dialogWindow); +} + + +// ----------------------- + +/** + * sendPackage - uses SendMessage(WM_COPYDATA) to do IPC messaging + * with the Java AccessBridge DLL + * + */ +void +JavaAccessBridge::sendPackage(char *buffer, int bufsize, HWND destHwnd) { + COPYDATASTRUCT toCopy; + toCopy.dwData = 0; // 32-bits we could use for something... + toCopy.cbData = bufsize; + toCopy.lpData = buffer; + + SendMessage(destHwnd, WM_COPYDATA, (WPARAM) dialogWindow, (LPARAM) &toCopy); +} + + +/** + * sendJavaEventPackage - walk through ATs, sending event messages to 'em + * + */ +void +JavaAccessBridge::sendJavaEventPackage(char *buffer, int bufsize, long type) { + + PrintDebugString("JavaAccessBridge::sendJavaEventPackage(), type = %X", type); + + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + } + + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + ati->sendJavaEventPackage(buffer, bufsize, type); + ati = ati->nextATInstance; + } +} + +/** + * sendAccessibilityEventPackage - walk through ATs, sending event messages to 'em + * + */ +void +JavaAccessBridge::sendAccessibilityEventPackage(char *buffer, int bufsize, long type) { + + PrintDebugString("JavaAccessBridge::sendAccessibilityEventPackage(), type = %X", type); + + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + } + + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + ati->sendAccessibilityEventPackage(buffer, bufsize, type); + ati = ati->nextATInstance; + } +} + + + + +/** + * receiveMemoryPackage - uses Memory-Mapped files to do IPC messaging + * with the Java AccessBridge DLL, receiving the + * message from Java AccessBridge DLL by reading the + * contents of the shared memory mapped file that + * is used for Java-initiated messages + * + */ +BOOL +JavaAccessBridge::receiveMemoryPackage(HWND srcWindow, long bufsize) { + char *IPCview; + + PrintDebugString("\r\nJavaAccessBridge::receiveMemoryPackage(%p, %d)", srcWindow, bufsize); + + // look-up the appropriate IPCview based on the srcHWND of the Windows AccessBridge DLL + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR! - ATs == 0 (shouldn't happen in receiveMemoryPackage()!"); + return FALSE; + } + AccessBridgeATInstance *ati = ATs->findABATInstanceFromATHWND(srcWindow); + if (ati != (AccessBridgeATInstance *) 0) { + IPCview = (char *) ati->memoryMappedView; + + // wait for the lock if someone else has it (re-entrancy) + EnterCriticalSection(&receiveMemoryIPCLock); + { + // set byte at end of buffer to indicate to caller that we have reached this point + IPCview[bufsize] = 1; + + // process the package + processPackage(IPCview, bufsize); + } + // release re-entrance lock + LeaveCriticalSection(&receiveMemoryIPCLock); + + return TRUE; + + } else { + //DEBUG_CODE(AppendToCallInfo("ERROR receiving memory package: couldn't find srcWindow")); + PrintDebugString("ERROR receiving memory package: couldn't find srcWindow"); + return FALSE; + } +} + +/** + * processPackage - processes the output of SendMessage(WM_COPYDATA) + * to do IPC messaging with the Windows AccessBridge DLL + * + */ +LRESULT +JavaAccessBridge::processPackage(char *buffer, int bufsize) { + PrintDebugString("\r\nProcessing package sent from Windows, bufsize = %d:", bufsize); + + PackageType *type = (PackageType *) buffer; + LRESULT returnVal = 0; + PrintDebugString(" PackageType = %X:", *type); + jobject rAC; + + switch (*type) { + + + case cMemoryMappedFileCreatedPackage: + // Windows is telling us it created a memory mapped file for us to use + // in repsonding to various information querying packages (see below) + PrintDebugString(" type == cMemoryMappedFileCreatedPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(MemoryMappedFileCreatedPackage))) { + MemoryMappedFileCreatedPackage *pkg = + (MemoryMappedFileCreatedPackage *) (buffer + sizeof(PackageType)); + returnVal = MemoryMappedFileCreated((HWND)ABLongToHandle(pkg->bridgeWindow), pkg->filename); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(MemoryMappedFileCreatedPackage)); + } + break; + + // ------------ information querying packages ------------------ + + case cReleaseJavaObjectPackage: + PrintDebugString(" type == cReleaseJavaObjectPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage))) { + ReleaseJavaObjectPackage *pkg = + (ReleaseJavaObjectPackage *) (buffer + sizeof(PackageType)); + releaseJavaObject((jobject)pkg->object); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage)); + } + break; + + case cGetAccessBridgeVersionPackage: + PrintDebugString(" type == cGetAccessBridgeVersionPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage))) { + GetAccessBridgeVersionPackage *pkg = + (GetAccessBridgeVersionPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getVersionInfo(&(pkg->rVersionInfo)); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage)); + } + break; + + case cIsJavaWindowPackage: + PrintDebugString(" type == cIsJavaWindowPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(IsJavaWindowPackage))) { + IsJavaWindowPackage *pkg = + (IsJavaWindowPackage *) (buffer + sizeof(PackageType)); + pkg->rResult = + windowsThreadEntryPoints->isJavaWindow(pkg->window); + PrintDebugString(" -> returning result = %d", pkg->rResult); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(IsJavaWindowPackage)); + } + break; + + case cIsSameObjectPackage: + PrintDebugString(" type == cIsSameObjectPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(IsSameObjectPackage))) { + IsSameObjectPackage *pkg = + (IsSameObjectPackage *) (buffer + sizeof(PackageType)); + pkg->rResult = + windowsThreadEntryPoints->isSameObject((jobject)pkg->obj1, (jobject)pkg->obj2); + PrintDebugString(" -> returning result = %d", pkg->rResult); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(IsSameObjectPackage)); + } + break; + + + case cGetAccessibleContextFromHWNDPackage: + PrintDebugString(" type == cGetAccessibleContextFromHWNDPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage))) { + GetAccessibleContextFromHWNDPackage *pkg = + (GetAccessibleContextFromHWNDPackage *) (buffer + sizeof(PackageType)); + rAC = windowsThreadEntryPoints->getAccessibleContextFromHWND(pkg->window); + pkg->rAccessibleContext = (JOBJECT64)rAC; + pkg->rVMID = HandleToLong(dialogWindow); + PrintDebugString(" -> returning AC = %p, vmID = %X", rAC, pkg->rVMID); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage)); + } + break; + + + case cGetHWNDFromAccessibleContextPackage: + PrintDebugString(" type == cGetHWNDFromAccessibleContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage))) { + GetHWNDFromAccessibleContextPackage *pkg = + (GetHWNDFromAccessibleContextPackage *) (buffer + sizeof(PackageType)); + pkg->rHWND = + ABHandleToLong( windowsThreadEntryPoints->getHWNDFromAccessibleContext((jobject)pkg->accessibleContext) ); + PrintDebugString(" -> returning HWND = %p", pkg->rHWND); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage)); + } + break; + + + /* ===== utility methods ===== */ + + case cSetTextContentsPackage: + PrintDebugString(" type == cSetTextContentsPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(SetTextContentsPackage))) { + SetTextContentsPackage *pkg = + (SetTextContentsPackage *) (buffer + sizeof(PackageType)); + pkg->rResult = + windowsThreadEntryPoints->setTextContents((jobject)pkg->accessibleContext, pkg->text); + PrintDebugString(" -> returning result = %d", pkg->rResult); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(SetTextContentsPackage)); + } + break; + + case cGetParentWithRolePackage: + if (bufsize == (sizeof(PackageType) + sizeof(GetParentWithRolePackage))) { + GetParentWithRolePackage *pkg = + (GetParentWithRolePackage *) (buffer + sizeof(PackageType)); + rAC = windowsThreadEntryPoints->getParentWithRole((jobject)pkg->accessibleContext, pkg->role); + pkg->rAccessibleContext = (JOBJECT64)rAC; + PrintDebugString(" type == cGetParentWithRolePackage"); + PrintDebugString(" pkg->vmID: %X", pkg->vmID); + PrintDebugString(" pkg->accessibleContext: %p", (jobject)pkg->accessibleContext); + PrintDebugString(" pkg->role: %ls", pkg->role); + PrintDebugString(" -> returning rAccessibleContext = %p", rAC); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetParentWithRolePackage)); + } + break; + + case cGetTopLevelObjectPackage: + PrintDebugString(" type == cGetTopLevelObjectPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetTopLevelObjectPackage))) { + GetTopLevelObjectPackage *pkg = + (GetTopLevelObjectPackage *) (buffer + sizeof(PackageType)); + rAC = windowsThreadEntryPoints->getTopLevelObject((jobject)pkg->accessibleContext); + pkg->rAccessibleContext = (JOBJECT64)rAC; + PrintDebugString(" -> returning rAccessibleContext = %p", rAC); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetTopLevelObjectPackage)); + } + break; + + case cGetParentWithRoleElseRootPackage: + PrintDebugString(" type == cGetParentWithRoleElseRootPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage))) { + GetParentWithRoleElseRootPackage *pkg = + (GetParentWithRoleElseRootPackage *) (buffer + sizeof(PackageType)); + rAC = windowsThreadEntryPoints->getParentWithRoleElseRoot((jobject)pkg->accessibleContext, pkg->role); + pkg->rAccessibleContext = (JOBJECT64)rAC; + PrintDebugString(" -> returning rAccessibleContext = %p", rAC); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage)); + } + break; + + case cGetObjectDepthPackage: + PrintDebugString(" type == cGetObjectDepthPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetObjectDepthPackage))) { + GetObjectDepthPackage *pkg = + (GetObjectDepthPackage *) (buffer + sizeof(PackageType)); + pkg->rResult = + windowsThreadEntryPoints->getObjectDepth((jobject)pkg->accessibleContext); + PrintDebugString(" -> returning rResult = %d", pkg->rResult); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetObjectDepthPackage)); + } + break; + + case cGetActiveDescendentPackage: + PrintDebugString(" type == cGetActiveDescendentPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetActiveDescendentPackage))) { + GetActiveDescendentPackage *pkg = + (GetActiveDescendentPackage *) (buffer + sizeof(PackageType)); + rAC = windowsThreadEntryPoints->getActiveDescendent((jobject)pkg->accessibleContext); + pkg->rAccessibleContext = (JOBJECT64)rAC; + PrintDebugString(" -> returning rAccessibleContext = %p", rAC); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetActiveDescendentPackage)); + } + break; + + case cGetAccessibleContextAtPackage: + PrintDebugString(" type == cGetAccessibleContextAtPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage))) { + GetAccessibleContextAtPackage *pkg = + (GetAccessibleContextAtPackage *) (buffer + sizeof(PackageType)); + pkg->rAccessibleContext = (JOBJECT64) + windowsThreadEntryPoints->getAccessibleContextAt(pkg->x, pkg->y, + (jobject)pkg->AccessibleContext); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage)); + } + break; + + case cGetAccessibleContextWithFocusPackage: + PrintDebugString(" type == cGetAccessibleContextWithFocusPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage))) { + GetAccessibleContextWithFocusPackage *pkg = + (GetAccessibleContextWithFocusPackage *) (buffer + sizeof(PackageType)); + pkg->rAccessibleContext = (JOBJECT64) + windowsThreadEntryPoints->getAccessibleContextWithFocus(); + pkg->rVMID = HandleToLong(dialogWindow); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage)); + } + break; + + case cGetAccessibleContextInfoPackage: + PrintDebugString(" type == cGetAccessibleContextInfoPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage))) { + GetAccessibleContextInfoPackage *pkg = + (GetAccessibleContextInfoPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleContextInfo( + (jobject)pkg->AccessibleContext, &(pkg->rAccessibleContextInfo)); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage)); + } + break; + + case cGetAccessibleChildFromContextPackage: + PrintDebugString(" type == cGetAccessibleChildFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage))) { + GetAccessibleChildFromContextPackage *pkg = + (GetAccessibleChildFromContextPackage *) (buffer + sizeof(PackageType)); + pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleChildFromContext( + (jobject)pkg->AccessibleContext, pkg->childIndex); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage)); + } + break; + + case cGetAccessibleParentFromContextPackage: + PrintDebugString(" type == cGetAccessibleParentFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage))) { + GetAccessibleParentFromContextPackage *pkg = + (GetAccessibleParentFromContextPackage *) (buffer + sizeof(PackageType)); + pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleParentFromContext( + (jobject)pkg->AccessibleContext); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage)); + } + break; + + // ------------ begin AccessibleTable packages ------------------ + + case cGetAccessibleTableInfoPackage: + PrintDebugString(" ##### type == cGetAccessibleTableInfoPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage))) { + GetAccessibleTableInfoPackage *pkg = + (GetAccessibleTableInfoPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTableInfo((jobject)pkg->accessibleContext, + &(pkg->rTableInfo)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage)); + } + break; + + case cGetAccessibleTableCellInfoPackage: + PrintDebugString(" ##### type == cGetAccessibleTableCellInfoPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage))) { + GetAccessibleTableCellInfoPackage *pkg = + (GetAccessibleTableCellInfoPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTableCellInfo((jobject)pkg->accessibleTable, pkg->row, + pkg->column, &(pkg->rTableCellInfo)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage)); + } + break; + + case cGetAccessibleTableRowHeaderPackage: + PrintDebugString(" ##### type == cGetAccessibleTableRowHeaderPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage))) { + GetAccessibleTableRowHeaderPackage *pkg = + (GetAccessibleTableRowHeaderPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTableRowHeader((jobject)pkg->accessibleContext, + &(pkg->rTableInfo)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage)); + } + break; + + case cGetAccessibleTableColumnHeaderPackage: + PrintDebugString(" ##### type == cGetAccessibleTableColumnHeaderPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage))) { + GetAccessibleTableColumnHeaderPackage *pkg = + (GetAccessibleTableColumnHeaderPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTableColumnHeader((jobject)pkg->accessibleContext, + &(pkg->rTableInfo)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage)); + } + break; + + + case cGetAccessibleTableRowDescriptionPackage: + PrintDebugString(" ##### type == cGetAccessibleTableRowDescriptionPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage))) { + GetAccessibleTableRowDescriptionPackage *pkg = + (GetAccessibleTableRowDescriptionPackage *) (buffer + sizeof(PackageType)); + pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleTableRowDescription( + (jobject)pkg->accessibleContext, pkg->row); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage)); + } + break; + + case cGetAccessibleTableColumnDescriptionPackage: + PrintDebugString(" ##### type == cGetAccessibleTableColumnDescriptionPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage))) { + GetAccessibleTableColumnDescriptionPackage *pkg = + (GetAccessibleTableColumnDescriptionPackage *) (buffer + sizeof(PackageType)); + pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleTableColumnDescription( + (jobject)pkg->accessibleContext, pkg->column); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage)); + } + break; + + case cGetAccessibleTableColumnSelectionCountPackage: + PrintDebugString(" ##### type == cGetAccessibleTableColumnSelectionCountPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage))) { + GetAccessibleTableColumnSelectionCountPackage *pkg = + (GetAccessibleTableColumnSelectionCountPackage *) (buffer + sizeof(PackageType)); + pkg->rCount = windowsThreadEntryPoints->getAccessibleTableColumnSelectionCount( + (jobject)pkg->accessibleTable); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage)); + } + break; + + case cGetAccessibleTableRowSelectionCountPackage: + PrintDebugString(" ##### type == cGetAccessibleTableRowSelectionCountPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage))) { + GetAccessibleTableRowSelectionCountPackage *pkg = + (GetAccessibleTableRowSelectionCountPackage *) (buffer + sizeof(PackageType)); + + pkg->rCount = windowsThreadEntryPoints->getAccessibleTableRowSelectionCount( + (jobject)pkg->accessibleTable); + + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage)); + } + break; + + case cIsAccessibleTableRowSelectedPackage: + PrintDebugString(" ##### type == cIsAccessibleTableRowSelectedPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage))) { + IsAccessibleTableRowSelectedPackage *pkg = + (IsAccessibleTableRowSelectedPackage *) (buffer + sizeof(PackageType)); + pkg->rResult = windowsThreadEntryPoints->isAccessibleTableRowSelected( + (jobject)pkg->accessibleTable, pkg->row); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage)); + } + break; + + case cIsAccessibleTableColumnSelectedPackage: + PrintDebugString(" ##### type == cIsAccessibleTableColumnSelectedPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage))) { + IsAccessibleTableColumnSelectedPackage *pkg = + (IsAccessibleTableColumnSelectedPackage *) (buffer + sizeof(PackageType)); + pkg->rResult = windowsThreadEntryPoints->isAccessibleTableColumnSelected( + (jobject)pkg->accessibleTable, pkg->column); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage)); + } + break; + + case cGetAccessibleTableColumnSelectionsPackage: + PrintDebugString(" ##### type == cGetAccessibleTableColumnSelectionsPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage))) { + GetAccessibleTableColumnSelectionsPackage *pkg = + (GetAccessibleTableColumnSelectionsPackage *) (buffer + sizeof(PackageType)); + PrintDebugString(" ##### cGetAccessibleTableColumnSelectionsPackage count=%d", pkg->count); + windowsThreadEntryPoints->getAccessibleTableColumnSelections( + (jobject)pkg->accessibleTable, pkg->count, pkg->rSelections); + + for (int i = 0; i < pkg->count; i++) { + PrintDebugString(" ##### cGetAccessibleTableColumnSelectionsPackage(%d)=%d", i, pkg->rSelections[i]); + } + + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage)); + } + break; + + + case cGetAccessibleTableRowSelectionsPackage: + PrintDebugString(" ##### type == cGetAccessibleTableRowSelectionsPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage))) { + GetAccessibleTableRowSelectionsPackage *pkg = + (GetAccessibleTableRowSelectionsPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTableRowSelections( + (jobject)pkg->accessibleTable, pkg->count, pkg->rSelections); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage)); + } + break; + + case cGetAccessibleTableRowPackage: + PrintDebugString(" ##### type == cGetAccessibleTableRowPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage))) { + GetAccessibleTableRowPackage *pkg = + (GetAccessibleTableRowPackage *) (buffer + sizeof(PackageType)); + pkg->rRow = windowsThreadEntryPoints->getAccessibleTableRow( + (jobject)pkg->accessibleTable, pkg->index); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage)); + } + break; + + case cGetAccessibleTableColumnPackage: + PrintDebugString(" ##### type == cGetAccessibleTableColumnPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage))) { + GetAccessibleTableColumnPackage *pkg = + (GetAccessibleTableColumnPackage *) (buffer + sizeof(PackageType)); + pkg->rColumn = windowsThreadEntryPoints->getAccessibleTableColumn( + (jobject)pkg->accessibleTable, pkg->index); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage)); + } + break; + + case cGetAccessibleTableIndexPackage: + PrintDebugString(" ##### type == cGetAccessibleTableIndexPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage))) { + GetAccessibleTableIndexPackage *pkg = + (GetAccessibleTableIndexPackage *) (buffer + sizeof(PackageType)); + pkg->rIndex = windowsThreadEntryPoints->getAccessibleTableIndex( + (jobject)pkg->accessibleTable, pkg->row, pkg->column); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage)); + } + break; + + // ------------ end AccessibleTable packages ------------------ + + + // ------------ begin AccessibleRelationSet packages ------------------ + + case cGetAccessibleRelationSetPackage: + PrintDebugString(" ##### type == cGetAccessibleRelationSetPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage))) { + GetAccessibleRelationSetPackage *pkg = + (GetAccessibleRelationSetPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleRelationSet( + (jobject)pkg->accessibleContext, &(pkg->rAccessibleRelationSetInfo)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage)); + } + break; + + // ------------ end AccessibleRelationSet packages ------------------ + + // ------------ begin AccessibleHypertext packages ------------------ + + case cGetAccessibleHypertextPackage: + PrintDebugString(" ##### type == cGetAccessibleHypertextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage))) { + GetAccessibleHypertextPackage *pkg = + (GetAccessibleHypertextPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleHypertext( + (jobject)pkg->accessibleContext, &(pkg->rAccessibleHypertextInfo)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage)); + } + break; + + case cActivateAccessibleHyperlinkPackage: + PrintDebugString(" ##### type == cActivateAccessibleHyperlinkPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage))) { + ActivateAccessibleHyperlinkPackage *pkg = + (ActivateAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType)); + pkg->rResult = windowsThreadEntryPoints->activateAccessibleHyperlink( + (jobject)pkg->accessibleContext, (jobject)pkg->accessibleHyperlink); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage)); + } + break; + + case cGetAccessibleHyperlinkCountPackage: + PrintDebugString(" ##### type == cGetAccessibleHyperlinkCountPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage))) { + GetAccessibleHyperlinkCountPackage *pkg = + (GetAccessibleHyperlinkCountPackage *) (buffer + sizeof(PackageType)); + pkg->rLinkCount = windowsThreadEntryPoints->getAccessibleHyperlinkCount( + (jobject)pkg->accessibleContext); + PrintDebugString(" ##### processing succeeded: pkg->rLinkCount = %d", pkg->rLinkCount); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage)); + } + break; + + case cGetAccessibleHypertextExtPackage: + PrintDebugString(" ##### type == cGetAccessibleHypertextExtPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage))) { + GetAccessibleHypertextExtPackage *pkg = + (GetAccessibleHypertextExtPackage *) (buffer + sizeof(PackageType)); + pkg->rSuccess = windowsThreadEntryPoints->getAccessibleHypertextExt( + (jobject)pkg->accessibleContext, pkg->startIndex, &(pkg->rAccessibleHypertextInfo)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage)); + } + break; + + case cGetAccessibleHypertextLinkIndexPackage: + PrintDebugString(" ##### type == cGetAccessibleHypertextLinkIndexPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage))) { + GetAccessibleHypertextLinkIndexPackage *pkg = + (GetAccessibleHypertextLinkIndexPackage *) (buffer + sizeof(PackageType)); + pkg->rLinkIndex = windowsThreadEntryPoints->getAccessibleHypertextLinkIndex( + (jobject)pkg->hypertext, pkg->charIndex); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage)); + } + break; + + case cGetAccessibleHyperlinkPackage: + PrintDebugString(" ##### type == cGetAccessibleHyperlinkPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage))) { + GetAccessibleHyperlinkPackage *pkg = + (GetAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleHyperlink((jobject)pkg->hypertext, pkg->linkIndex, + &(pkg->rAccessibleHyperlinkInfo)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage)); + } + break; + + // ------------ end AccessibleHypertext packages + + // ------------ begin Accessible KeyBindings, Icons and Actions + + case cGetAccessibleKeyBindingsPackage: + PrintDebugString(" ##### type == cGetAccessibleKeyBindingsPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage))) { + GetAccessibleKeyBindingsPackage *pkg = + (GetAccessibleKeyBindingsPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleKeyBindings ( + (jobject)pkg->accessibleContext, &(pkg->rAccessibleKeyBindings)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage)); + } + break; + + case cGetAccessibleIconsPackage: + PrintDebugString(" ##### type == cGetAccessibleIconsPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleIconsPackage))) { + GetAccessibleIconsPackage *pkg = + (GetAccessibleIconsPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleIcons ( + (jobject)pkg->accessibleContext, &(pkg->rAccessibleIcons)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleIconsPackage)); + } + break; + + + case cGetAccessibleActionsPackage: + PrintDebugString(" ##### type == cGetAccessibleActionsPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleActionsPackage))) { + GetAccessibleActionsPackage *pkg = + (GetAccessibleActionsPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleActions ( + (jobject)pkg->accessibleContext, &(pkg->rAccessibleActions)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleActionsPackage)); + } + break; + + case cDoAccessibleActionsPackage: + PrintDebugString(" ##### type == cDoAccessibleActionsPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(DoAccessibleActionsPackage))) { + DoAccessibleActionsPackage *pkg = + (DoAccessibleActionsPackage *) (buffer + sizeof(PackageType)); + pkg->rResult = + windowsThreadEntryPoints->doAccessibleActions((jobject)pkg->accessibleContext, &(pkg->actionsToDo), + &(pkg->failure)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(DoAccessibleActionsPackage)); + } + break; + + // ------------ begin addtional methods for Teton + + case cGetVirtualAccessibleNamePackage: + PrintDebugString(" ##### type == GetVirtualAccessibleNamePackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage))) { + GetVirtualAccessibleNamePackage *pkg = + (GetVirtualAccessibleNamePackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getVirtualAccessibleName ((const jobject)pkg->accessibleContext, + pkg->rName, + pkg->len); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage)); + } + break; + + case cRequestFocusPackage: + PrintDebugString(" ##### type == RequestFocusPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(RequestFocusPackage))) { + RequestFocusPackage *pkg = + (RequestFocusPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->requestFocus ( + (jobject)pkg->accessibleContext); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(RequestFocusPackage)); + } + break; + + case cSelectTextRangePackage: + PrintDebugString(" ##### type == SelectTextRangePackage"); + if (bufsize == (sizeof(PackageType) + sizeof(SelectTextRangePackage))) { + SelectTextRangePackage *pkg = + (SelectTextRangePackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->selectTextRange ( + (jobject)pkg->accessibleContext, pkg->startIndex, pkg->endIndex); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(SelectTextRangePackage)); + } + break; + + case cGetTextAttributesInRangePackage: + PrintDebugString(" ##### type == GetTextAttributesInRangePackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage))) { + GetTextAttributesInRangePackage *pkg = + (GetTextAttributesInRangePackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getTextAttributesInRange ( + (jobject)pkg->accessibleContext, pkg->startIndex, pkg->endIndex, + (AccessibleTextAttributesInfo *)&(pkg->attributes), + &(pkg->rLength)); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage)); + } + break; + + + case cGetVisibleChildrenCountPackage: + PrintDebugString(" ##### type == GetVisibleChildrenCountPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage))) { + GetVisibleChildrenCountPackage *pkg = + (GetVisibleChildrenCountPackage *) (buffer + sizeof(PackageType)); + pkg->rChildrenCount = windowsThreadEntryPoints->getVisibleChildrenCount ((jobject)pkg->accessibleContext); + + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage)); + } + break; + + case cGetVisibleChildrenPackage: + PrintDebugString(" ##### type == GetVisibleChildrenPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetVisibleChildrenPackage))) { + GetVisibleChildrenPackage *pkg = + (GetVisibleChildrenPackage *) (buffer + sizeof(PackageType)); + pkg->rSuccess = windowsThreadEntryPoints->getVisibleChildren ((jobject)pkg->accessibleContext, + pkg->startIndex, + &(pkg->rVisibleChildrenInfo)); + + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetVisibleChildrenPackage)); + } + break; + + case cSetCaretPositionPackage: + PrintDebugString(" ##### type == SetCaretPositionPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(SetCaretPositionPackage))) { + SetCaretPositionPackage *pkg = + (SetCaretPositionPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->setCaretPosition ( + (jobject)pkg->accessibleContext, pkg->position); + PrintDebugString(" ##### processing succeeded"); + } else { + PrintDebugString(" ##### processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(SetCaretPositionPackage)); + } + break; + + // ------------ end additional methods for Teton + + // ------------ end Accessible KeyBindings, Icons and Actions + + // ------------ Accessible Text packages ------------------ + + case cGetAccessibleTextInfoPackage: + PrintDebugString(" type == cGetAccessibleTextInfoPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage))) { + GetAccessibleTextInfoPackage *pkg = + (GetAccessibleTextInfoPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTextInfo((jobject)pkg->AccessibleContext, + &(pkg->rTextInfo), pkg->x, pkg->y); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage)); + } + break; + + case cGetAccessibleTextItemsPackage: + PrintDebugString(" type == cGetAccessibleTextItemsPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextItemsPackage))) { + GetAccessibleTextItemsPackage *pkg = + (GetAccessibleTextItemsPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTextItems((jobject)pkg->AccessibleContext, + &(pkg->rTextItemsInfo), pkg->index); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage)); + } + break; + + case cGetAccessibleTextSelectionInfoPackage: + PrintDebugString(" type == cGetAccessibleTextSelectionInfoPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage))) { + GetAccessibleTextSelectionInfoPackage *pkg = + (GetAccessibleTextSelectionInfoPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTextSelectionInfo( + (jobject)pkg->AccessibleContext, &(pkg->rTextSelectionItemsInfo)); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage)); + } + break; + + case cGetAccessibleTextAttributeInfoPackage: + PrintDebugString(" type == cGetAccessibleTextAttributeInfoPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage))) { + GetAccessibleTextAttributeInfoPackage *pkg = + (GetAccessibleTextAttributeInfoPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTextAttributes( + (jobject)pkg->AccessibleContext, pkg->index, (AccessibleTextAttributesInfo *) &(pkg->rAttributeInfo)); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage)); + } + break; + + case cGetAccessibleTextRectInfoPackage: + PrintDebugString(" type == cGetAccessibleTextRectInfoPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage))) { + GetAccessibleTextRectInfoPackage *pkg = + (GetAccessibleTextRectInfoPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTextRect((jobject)pkg->AccessibleContext, + &(pkg->rTextRectInfo), pkg->index); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage)); + } + break; + + case cGetCaretLocationPackage: + PrintDebugString(" type == cGetCaretLocationPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetCaretLocationPackage))) { + GetCaretLocationPackage *pkg = + (GetCaretLocationPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getCaretLocation((jobject)pkg->AccessibleContext, + &(pkg->rTextRectInfo), pkg->index); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetCaretLocationPackage)); + } + break; + + case cGetAccessibleTextLineBoundsPackage: + PrintDebugString(" type == cGetAccessibleTextLineBoundsPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage))) { + GetAccessibleTextLineBoundsPackage *pkg = + (GetAccessibleTextLineBoundsPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTextLineBounds((jobject)pkg->AccessibleContext, + pkg->index, &(pkg->rLineStart), &(pkg->rLineEnd)); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage)); + } + break; + + case cGetAccessibleTextRangePackage: + PrintDebugString(" type == cGetAccessibleTextRangePackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage))) { + GetAccessibleTextRangePackage *pkg = + (GetAccessibleTextRangePackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getAccessibleTextRange((jobject)pkg->AccessibleContext, + pkg->start, pkg->end, (wchar_t *) &(pkg->rText), (sizeof(pkg->rText) / sizeof(wchar_t))); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage)); + } + break; + + + // ------------ Accessible Value packages ------------------ + + case cGetCurrentAccessibleValueFromContextPackage: + PrintDebugString(" type == cGetCurrentAccessibleValueFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage))) { + GetCurrentAccessibleValueFromContextPackage *pkg = + (GetCurrentAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getCurrentAccessibleValueFromContext((jobject)pkg->AccessibleContext, + (wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t))); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage)); + } + break; + + case cGetMaximumAccessibleValueFromContextPackage: + PrintDebugString(" type == cGetMaximumAccessibleValueFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage))) { + GetMaximumAccessibleValueFromContextPackage *pkg = + (GetMaximumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getMaximumAccessibleValueFromContext((jobject)pkg->AccessibleContext, + (wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t))); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage)); + } + break; + + case cGetMinimumAccessibleValueFromContextPackage: + PrintDebugString(" type == cGetMinimumAccessibleValueFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage))) { + GetMinimumAccessibleValueFromContextPackage *pkg = + (GetMinimumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->getMinimumAccessibleValueFromContext((jobject)pkg->AccessibleContext, + (wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t))); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage)); + } + break; + + // ------------ Accessible Selection packages ------------------ + + case cAddAccessibleSelectionFromContextPackage: + PrintDebugString(" type == cAddAccessibleSelectionFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage))) { + AddAccessibleSelectionFromContextPackage *pkg = + (AddAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->addAccessibleSelectionFromContext((jobject)pkg->AccessibleContext, + pkg->index); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage)); + } + break; + + case cClearAccessibleSelectionFromContextPackage: + PrintDebugString(" type == cClearAccessibleSelectionFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage))) { + ClearAccessibleSelectionFromContextPackage *pkg = + (ClearAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->clearAccessibleSelectionFromContext((jobject)pkg->AccessibleContext); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage)); + } + break; + + case cGetAccessibleSelectionFromContextPackage: + PrintDebugString(" type == cGetAccessibleSelectionFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage))) { + GetAccessibleSelectionFromContextPackage *pkg = + (GetAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); + pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleSelectionFromContext( + (jobject)pkg->AccessibleContext, pkg->index); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage)); + } + break; + + case cGetAccessibleSelectionCountFromContextPackage: + PrintDebugString(" type == cGetAccessibleSelectionCountFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage))) { + GetAccessibleSelectionCountFromContextPackage *pkg = + (GetAccessibleSelectionCountFromContextPackage *) (buffer + sizeof(PackageType)); + pkg->rCount = windowsThreadEntryPoints->getAccessibleSelectionCountFromContext( + (jobject)pkg->AccessibleContext); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage)); + } + break; + + case cIsAccessibleChildSelectedFromContextPackage: + PrintDebugString(" type == cIsAccessibleChildSelectedFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage))) { + IsAccessibleChildSelectedFromContextPackage *pkg = + (IsAccessibleChildSelectedFromContextPackage *) (buffer + sizeof(PackageType)); + pkg->rResult = windowsThreadEntryPoints->isAccessibleChildSelectedFromContext( + (jobject)pkg->AccessibleContext, pkg->index); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage)); + } + break; + + case cRemoveAccessibleSelectionFromContextPackage: + PrintDebugString(" type == cRemoveAccessibleSelectionFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage))) { + RemoveAccessibleSelectionFromContextPackage *pkg = + (RemoveAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->removeAccessibleSelectionFromContext((jobject)pkg->AccessibleContext, + pkg->index); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage)); + } + break; + + case cSelectAllAccessibleSelectionFromContextPackage: + PrintDebugString(" type == cSelectAllAccessibleSelectionFromContextPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage))) { + SelectAllAccessibleSelectionFromContextPackage *pkg = + (SelectAllAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType)); + windowsThreadEntryPoints->selectAllAccessibleSelectionFromContext((jobject)pkg->AccessibleContext); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage)); + } + break; + + + // ------------ event notification management packages ------------------ + + case cAddJavaEventNotificationPackage: + PrintDebugString(" type = cAddJavaEventNotificationPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage))) { + AddJavaEventNotificationPackage *pkg = + (AddJavaEventNotificationPackage *) (buffer + sizeof(PackageType)); + addJavaEventNotification(pkg->type, (HWND)ABLongToHandle( pkg->DLLwindow ) ); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage)); + } + break; + + case cRemoveJavaEventNotificationPackage: + PrintDebugString(" type = cRemoveJavaEventNotificationPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage))) { + RemoveJavaEventNotificationPackage *pkg = + (RemoveJavaEventNotificationPackage *) (buffer + sizeof(PackageType)); + removeJavaEventNotification(pkg->type, (HWND)ABLongToHandle( pkg->DLLwindow )); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage)); + } + break; + + case cAddAccessibilityEventNotificationPackage: + PrintDebugString(" type = cAddAccessibilityEventNotificationPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage))) { + AddAccessibilityEventNotificationPackage *pkg = + (AddAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType)); + addAccessibilityEventNotification(pkg->type, (HWND)ABLongToHandle(pkg->DLLwindow)); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage)); + } + break; + + case cRemoveAccessibilityEventNotificationPackage: + PrintDebugString(" type = cRemoveAccessibilityEventNotificationPackage"); + if (bufsize == (sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage))) { + RemoveAccessibilityEventNotificationPackage *pkg = + (RemoveAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType)); + removeAccessibilityEventNotification(pkg->type, (HWND)ABLongToHandle(pkg->DLLwindow)); + } else { + PrintDebugString(" processing FAILED!! -> bufsize = %d; expectation = %d", + bufsize, sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage)); + } + break; + + default: + PrintDebugString(" processing FAILED!! -> don't know how to handle type = %X", *type); + returnVal = -1; + break; + } + + PrintDebugString(" package processing completed"); + return returnVal; +} + + +// ----------------------------- + + +/** + * MemoryMappedFileCreated + * - WindowsDLL letting us know it's created a memory-mapped file + * for IPC. We need to open it and write a magic string into + * it to let the WindowsDLL know all is OK. Also we need to + * set up our own data structures to communicate with the + * WindowsDLL + * + */ +LRESULT +JavaAccessBridge::MemoryMappedFileCreated(HWND ATBridgeDLLWindow, char *filename) { + PrintDebugString(" in MemoryMappedFileCreated(%p, %s)!", ATBridgeDLLWindow, filename); + AccessBridgeATInstance *newAT = + new AccessBridgeATInstance(dialogWindow, ATBridgeDLLWindow, filename, ATs); + PrintDebugString(" just created a new ATInstance = %p, old = %p", newAT, ATs); + ATs = newAT; + + LRESULT returnVal = ATs->initiateIPC(); + if (returnVal == 0) { + PrintDebugString(" Successfully initiated IPC with AT!!!"); + } else { + PrintDebugString(" ERROR: Failed to initiate IPC with AT!!!"); + } + + return returnVal; +} + + +/** + * WindowsATDestroyed - lets the JavaABDLL know a Windows AT disappeared + * + */ +void +JavaAccessBridge::WindowsATDestroyed(HWND ATBridgeDLLWindow) { + PrintDebugString("\r\nin JavaAccessBridge::WindowsATDestroyed(%p)", ATBridgeDLLWindow); + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! -> ATs == 0! (shouldn't happen here)"); + return; + } + + AccessBridgeATInstance *currentAT = ATs; + AccessBridgeATInstance *previousAT = ATs; + if (ATs->winAccessBridgeWindow == ATBridgeDLLWindow) { + ATs = ATs->nextATInstance; + // remove event notification for this AT + removeJavaEventNotification(currentAT->javaEventMask, ATBridgeDLLWindow); + removeAccessibilityEventNotification(currentAT->accessibilityEventMask, ATBridgeDLLWindow); + delete currentAT; + PrintDebugString(" data structures successfully removed"); + } else { + while (currentAT != (AccessBridgeATInstance *) NULL) { + if (currentAT->winAccessBridgeWindow == ATBridgeDLLWindow) { + previousAT->nextATInstance = currentAT->nextATInstance; + delete currentAT; + PrintDebugString(" data structures successfully removed"); + return; + } else { + previousAT = currentAT; + currentAT = currentAT->nextATInstance; + } + } + PrintDebugString(" ERROR!! couldn't find matching data structures!"); + } +} + + +// ----------------------------- + + +/** + * releaseJavaObject - lets the JavaVM know it can release the Java Object + * + * Note: once you have made this call, the JavaVM will garbage collect + * the jobject you pass in. If you later use that jobject in another + * call, you will cause all maner of havoc! + * + */ +void +JavaAccessBridge::releaseJavaObject(jobject object) { + PrintDebugString("In JavaAccessBridge::releaseJavaObject"); + PrintDebugString(" object X: %p", object); + if (windowsThreadJNIEnv != (JNIEnv *) 0) { + windowsThreadJNIEnv->DeleteGlobalRef(object); + PrintDebugString(" global reference deleted.", object); + } else { + PrintDebugString(" Error! windowsThreadJNIEnv == 0"); + } +} + +// ----------------------------- + +/** + * addJavaEventNotification - this AT now wants this type of events + * + */ +void +JavaAccessBridge::addJavaEventNotification(jlong type, HWND DLLwindow) { + // walk through list of ATs, find this one and add this type + // and, if we weren't listening for these before, ask Java for 'em + PrintDebugString(" adding Java event type %016I64X to HWND %p", type, DLLwindow); + AccessBridgeATInstance *ati = ATs; + long globalEventMask = 0; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->winAccessBridgeWindow == DLLwindow) { + ati->javaEventMask |= type; + PrintDebugString(" found HWND, javaEventMask now is %X", ati->javaEventMask); + } else { + globalEventMask |= ati->javaEventMask; + } + ati = ati->nextATInstance; + } + PrintDebugString(" union of all Java AT event masks: %X", globalEventMask); + if (!(globalEventMask & type)) { + // no other ATs wanted this event; + // start getting them from Java + PrintDebugString(" no other AT wanted this Java event (so not registered); adding to AccessBridge.java"); + windowsThreadEntryPoints->addJavaEventNotification(type); + } +} + +/** + * removeJavaEventNotification - this AT no longer wants this type of events + * + */ +void +JavaAccessBridge::removeJavaEventNotification(jlong type, HWND DLLwindow) { + // walk through list of ATs, find this one and remove this type + // and, if no other AT wants 'em either, tell Java we no longer want 'em + PrintDebugString(" removing Java event type %016I64X from HWND %p", type, DLLwindow); + AccessBridgeATInstance *ati = ATs; + long globalEventMask = 0; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->winAccessBridgeWindow == DLLwindow) { + ati->javaEventMask &= (0xFFFFFFFF - type); + PrintDebugString(" found HWND, javaEventMask now is %X", ati->javaEventMask); + } else { + globalEventMask |= ati->javaEventMask; + } + ati = ati->nextATInstance; + } + PrintDebugString(" union of all Java AT event masks: %X", globalEventMask); + if (!(globalEventMask & type)) { + // no other ATs wanted this event; + // stop getting them from Java + PrintDebugString(" no other AT wanted this Java event (so can remove); removing from AccessBridge.java"); + windowsThreadEntryPoints->removeJavaEventNotification(type); + } +} + + +/** + * addAccesibilityEventNotification - this AT now wants this type of events + * + */ +void +JavaAccessBridge::addAccessibilityEventNotification(jlong type, HWND DLLwindow) { + // walk through list of ATs, find this one and add this type + // and, if we weren't listening for these before, ask Java for 'em + PrintDebugString(" adding Accesibility event type %016I64X to HWND %p", type, DLLwindow); + AccessBridgeATInstance *ati = ATs; + long globalEventMask = 0; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->winAccessBridgeWindow == DLLwindow) { + ati->accessibilityEventMask |= type; + PrintDebugString(" found HWND, accessibilityEventMask now is %X", ati->accessibilityEventMask); + } else { + globalEventMask |= ati->accessibilityEventMask; + } + ati = ati->nextATInstance; + } + PrintDebugString(" union of all Accessibility AT event masks: %X", globalEventMask); + if (!(globalEventMask & type)) { + // no other ATs wanted this event; + // start getting them from Java + PrintDebugString(" no other AT wanted this Accesibility event (so not registered); adding to AccessBridge.java"); + windowsThreadEntryPoints->addAccessibilityEventNotification(type); + } +} + +/** + * removeAccesibilityEventNotification - this AT no longer wants this type of events + * + */ +void +JavaAccessBridge::removeAccessibilityEventNotification(jlong type, HWND DLLwindow) { + // walk through list of ATs, find this one and remove this type + // and, if no other AT wants 'em either, tell Java we no longer want 'em + PrintDebugString(" removing Accesibility event type %016I64X from HWND %p", type, DLLwindow); + AccessBridgeATInstance *ati = ATs; + long globalEventMask = 0; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->winAccessBridgeWindow == DLLwindow) { + ati->accessibilityEventMask &= (0xFFFFFFFF - type); + PrintDebugString(" found HWND, accessibilityEventMask now is %X", ati->accessibilityEventMask); + } else { + globalEventMask |= ati->accessibilityEventMask; + } + ati = ati->nextATInstance; + } + PrintDebugString(" union of all Accessibility AT event masks: %X", globalEventMask); + if (!(globalEventMask & type)) { + // no other ATs wanted this event; + // stop getting them from Java + PrintDebugString(" no other AT wanted this Accessibility event (so can remove); removing from AccessBridge.java"); + windowsThreadEntryPoints->removeAccessibilityEventNotification(type); + } +} + + + + +/** + * firePropertyCaretChange + * + */ +void +JavaAccessBridge::firePropertyCaretChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jint oldValue, jint newValue) { + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyCaretChanged(%p, %p, %p, %p, %d, %d)", + env, callingObj, event, + source, oldValue, newValue); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + char buffer[sizeof(PackageType) + sizeof(PropertyCaretChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyCaretChangePackage *pkg = (PropertyCaretChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyCaretChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + + pkg->oldPosition = oldValue; + pkg->newPosition = newValue; + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyCaretChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyCaretChange event"); +} + +/** + * firePropertyDescriptionChange + * + */ +void +JavaAccessBridge::firePropertyDescriptionChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue){ + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyDescriptionChanged(%p, %p, %p, %p, %p, %p)", + env, callingObj, event, + source, oldValue, newValue); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + const wchar_t *stringBytes; + char buffer[sizeof(PackageType) + sizeof(PropertyDescriptionChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyDescriptionChangePackage *pkg = (PropertyDescriptionChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyDescriptionChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + + if (oldValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->oldDescription, stringBytes, (sizeof(pkg->oldDescription) / sizeof(wchar_t))); + env->ReleaseStringChars(oldValue, stringBytes); + } else { + wcsncpy(pkg->oldDescription, L"(null)", (sizeof(pkg->oldDescription) / sizeof(wchar_t))); + } + + if (newValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->newDescription, stringBytes, (sizeof(pkg->newDescription) / sizeof(wchar_t))); + env->ReleaseStringChars(newValue, stringBytes); + } else { + wcsncpy(pkg->newDescription, L"(null)", (sizeof(pkg->newDescription) / sizeof(wchar_t))); + } + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyDescriptionChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyDescriptionChange event"); +} + +/** + * firePropertyNameChange + * + */ +void +JavaAccessBridge::firePropertyNameChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue){ + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyNameChanged(%p, %p, %p, %p, %p, %p)", + env, callingObj, event, + source, oldValue, newValue); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + const wchar_t *stringBytes; + char buffer[sizeof(PackageType) + sizeof(PropertyNameChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyNameChangePackage *pkg = (PropertyNameChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyNameChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyNameChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + + if (oldValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->oldName, stringBytes, (sizeof(pkg->oldName) / sizeof(wchar_t))); + env->ReleaseStringChars(oldValue, stringBytes); + } else { + wcsncpy(pkg->oldName, L"(null)", (sizeof(pkg->oldName) / sizeof(wchar_t))); + } + + if (newValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->newName, stringBytes, (sizeof(pkg->newName) / sizeof(wchar_t))); + env->ReleaseStringChars(newValue, stringBytes); + } else { + wcsncpy(pkg->newName, L"(null)", (sizeof(pkg->newName) / sizeof(wchar_t))); + } + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyNameChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyNameChange event"); +} + + +/** + * firePropertySelectionChange + * + */ +void +JavaAccessBridge::firePropertySelectionChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source) { + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertySelectionChanged(%p, %p, %p, %p)", + env, callingObj, event, source); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + char buffer[sizeof(PackageType) + sizeof(PropertySelectionChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertySelectionChangePackage *pkg = (PropertySelectionChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertySelectionChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertySelectionChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertySelectionChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertySelectionChange event"); +} + + +/** + * firePropertyStateChange + * + */ +void +JavaAccessBridge::firePropertyStateChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue){ + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyStateChanged(%p, %p, %p, %p, %p, %p)", + env, callingObj, event, + source, oldValue, newValue); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + const wchar_t *stringBytes; + char buffer[sizeof(PackageType) + sizeof(PropertyStateChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyStateChangePackage *pkg = (PropertyStateChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyStateChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyStateChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + + if (oldValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->oldState, stringBytes, (sizeof(pkg->oldState) / sizeof(wchar_t))); + env->ReleaseStringChars(oldValue, stringBytes); + } else { + wcsncpy(pkg->oldState, L"(null)", (sizeof(pkg->oldState) / sizeof(wchar_t))); + } + + if (newValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->newState, stringBytes, (sizeof(pkg->newState) / sizeof(wchar_t))); + env->ReleaseStringChars(newValue, stringBytes); + } else { + wcsncpy(pkg->newState, L"(null)", (sizeof(pkg->newState) / sizeof(wchar_t))); + } + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyStateChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyStateChange event"); +} + + +/** + * firePropertyTextChange + * + */ +void +JavaAccessBridge::firePropertyTextChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source) { + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyTextChanged(%p, %p, %p, %p)", + env, callingObj, event, source); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + char buffer[sizeof(PackageType) + sizeof(PropertyTextChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyTextChangePackage *pkg = (PropertyTextChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyTextChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyTextChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTextChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyTextChange event"); +} + + +/** + * firePropertyValueChange + * + */ +void +JavaAccessBridge::firePropertyValueChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue){ + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyValueChanged(%p, %p, %p, %p, %p, %p)", + env, callingObj, event, + source, oldValue, newValue); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + const wchar_t *stringBytes; + char buffer[sizeof(PackageType) + sizeof(PropertyValueChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyValueChangePackage *pkg = (PropertyValueChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyValueChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyValueChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + + if (oldValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->oldValue, stringBytes, (sizeof(pkg->oldValue) / sizeof(wchar_t))); + env->ReleaseStringChars(oldValue, stringBytes); + } else { + wcsncpy(pkg->oldValue, L"(null)", (sizeof(pkg->oldValue) / sizeof(wchar_t))); + } + + if (newValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->newValue, stringBytes, (sizeof(pkg->newValue) / sizeof(wchar_t))); + env->ReleaseStringChars(newValue, stringBytes); + } else { + wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t))); + } + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyValueChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyValueChange event"); +} + +/** + * firePropertyVisibleDataChange + * + */ +void +JavaAccessBridge::firePropertyVisibleDataChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source) { + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyVisibleDataChanged(%p, %p, %p, %p)", + env, callingObj, event, source); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + char buffer[sizeof(PackageType) + sizeof(PropertyVisibleDataChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyVisibleDataChangePackage *pkg = (PropertyVisibleDataChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyVisibleDataChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyVisibleDataChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyVisibleDataChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyVisibleDataChange event"); +} + + +/** + * firePropertyChildChange + * + */ +void +JavaAccessBridge::firePropertyChildChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jobject oldValue, jobject newValue){ + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyChildPropertyChanged(%p, %p, %p, %p, %p, %p)", + env, callingObj, event, + source, oldValue, newValue); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + char buffer[sizeof(PackageType) + sizeof(PropertyChildChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyChildChangePackage *pkg = (PropertyChildChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyChildChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyChildChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); + pkg->oldChildAccessibleContext = (JOBJECT64)env->NewGlobalRef(oldValue); + pkg->newChildAccessibleContext = (JOBJECT64)env->NewGlobalRef(newValue); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); + PrintDebugString(" GlobalRef'd OldChildAC: %p", pkg->oldChildAccessibleContext); + PrintDebugString(" GlobalRef'd NewChildAC: %p", pkg->newChildAccessibleContext); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); + PrintDebugString(" GlobalRef'd OldChildAC: %016I64X", pkg->oldChildAccessibleContext); + PrintDebugString(" GlobalRef'd NewChildAC: %016I64X", pkg->newChildAccessibleContext); +#endif + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyChildChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyChildChange event"); +} + + +/** + * firePropertyActiveDescendentChange + * + */ +void +JavaAccessBridge::firePropertyActiveDescendentChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jobject oldValue, jobject newValue){ + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyActiveDescendentPropertyChanged(%p, %p, %p, %p, %p, %p)", + env, callingObj, event, + source, oldValue, newValue); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + char buffer[sizeof(PackageType) + sizeof(PropertyActiveDescendentChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyActiveDescendentChangePackage *pkg = (PropertyActiveDescendentChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyActiveDescendentChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyActiveDescendentChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); + pkg->oldActiveDescendentAccessibleContext = (JOBJECT64)env->NewGlobalRef(oldValue); + pkg->newActiveDescendentAccessibleContext = (JOBJECT64)env->NewGlobalRef(newValue); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); + PrintDebugString(" GlobalRef'd OldActiveDescendentAC: %p", pkg->oldActiveDescendentAccessibleContext); + PrintDebugString(" GlobalRef'd NewActiveDescendentAC: %p", pkg->newActiveDescendentAccessibleContext); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); + PrintDebugString(" GlobalRef'd OldActiveDescendentAC: %016I64X", pkg->oldActiveDescendentAccessibleContext); + PrintDebugString(" GlobalRef'd NewActiveDescendentAC: %016I64X", pkg->newActiveDescendentAccessibleContext); +#endif + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyActiveDescendentChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyActiveChange event"); +} + +/** + * firePropertyValueChange + * + */ +void +JavaAccessBridge::firePropertyTableModelChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue){ + + PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyTableModelChange(%p, %p, %p, %p, %p, %p)", + env, callingObj, event, + source, oldValue, newValue); + + // sanity check + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; // panic! + } + + // common setup + const wchar_t *stringBytes; + char buffer[sizeof(PackageType) + sizeof(PropertyTableModelChangePackage)]; + PackageType *type = (PackageType *) buffer; + PropertyTableModelChangePackage *pkg = (PropertyTableModelChangePackage *) (buffer + sizeof(PackageType)); + *type = cPropertyTableModelChangePackage; + pkg->vmID = (long) dialogWindow; + + // make new Global Refs and send events only to those ATs that want 'em + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->accessibilityEventMask & cPropertyTableModelChangeEvent) { + + PrintDebugString(" sending to AT"); + + // make new GlobalRefs for this AT + pkg->Event = (JOBJECT64)env->NewGlobalRef(event); + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + + if (oldValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->oldValue, stringBytes, (sizeof(pkg->oldValue) / sizeof(wchar_t))); + env->ReleaseStringChars(oldValue, stringBytes); + } else { + wcsncpy(pkg->oldValue, L"(null)", (sizeof(pkg->oldValue) / sizeof(wchar_t))); + } + + if (newValue != (jstring) 0) { + stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wcsncpy(pkg->newValue, stringBytes, (sizeof(pkg->newValue) / sizeof(wchar_t))); + env->ReleaseStringChars(newValue, stringBytes); + } else { + wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t))); + } + + ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTableModelChangeEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with propertyTableModelChange event"); +} + + + +#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer) +#define PRINT_GLOBALREFS() \ + PrintDebugString(" GlobalRef'd Event: %p", pkg->Event); \ + PrintDebugString(" GlobalRef'd Source: %p", pkg->AccessibleContextSource); +#else // JOBJECT64 is jlong (64 bit) +#define PRINT_GLOBALREFS() \ + PrintDebugString(" GlobalRef'd Event: %016I64X", pkg->Event); \ + PrintDebugString(" GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource); +#endif + +#define FIRE_EVENT(function, packageStruct, packageConstant, eventConstant) \ + void JavaAccessBridge::function(JNIEnv *env, jobject callingObj, \ + jobject eventObj, jobject source) { \ + \ + PrintDebugString("\r\nFiring event id = %d(%p, %p, %p, %p); vmID = %X", \ + eventConstant, env, callingObj, eventObj, source, javaVM); \ + \ + /* sanity check */ \ + if (ATs == (AccessBridgeATInstance *) 0) { \ + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); \ + return; /* panic! */ \ + } \ + \ + /* common setup */ \ + char buffer[sizeof(PackageType) + sizeof(packageStruct)]; \ + PackageType *type = (PackageType *) buffer; \ + packageStruct *pkg = (packageStruct *) (buffer + sizeof(PackageType)); \ + *type = packageConstant; \ + pkg->vmID = (long) dialogWindow; \ + \ + /* make new Global Refs, send events only to those ATs that want 'em */ \ + AccessBridgeATInstance *ati = ATs; \ + while (ati != (AccessBridgeATInstance *) 0) { \ + PrintDebugString("\r\njavaEventMask = %X eventConstant=%d pkg->vmID=%X", \ + ati->javaEventMask, eventConstant, pkg->vmID ); \ + if (ati->javaEventMask & eventConstant) { \ + \ + PrintDebugString(" sending to AT"); \ + /* make new GlobalRefs for this AT */ \ + pkg->Event = (JOBJECT64)env->NewGlobalRef(eventObj); \ + pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); \ + PRINT_GLOBALREFS() \ + \ + ati->sendJavaEventPackage(buffer, sizeof(buffer), eventConstant); \ + } \ + ati = ati->nextATInstance; \ + } \ + PrintDebugString(" done with firing AWT event"); \ + } + + void JavaAccessBridge::javaShutdown(JNIEnv *env, jobject callingObj) { + + PrintDebugString("\r\nFiring event id = %d(%p, %p); vmID = %X", + cJavaShutdownEvent, env, callingObj, javaVM); + + /* sanity check */ + if (ATs == (AccessBridgeATInstance *) 0) { + PrintDebugString(" ERROR!! ATs == 0! (shouldn't happen here!)"); + return; /* panic! */ + } + + /* common setup */ + char buffer[sizeof(PackageType) + sizeof(JavaShutdownPackage)]; + PackageType *type = (PackageType *) buffer; + JavaShutdownPackage *pkg = (JavaShutdownPackage *) (buffer + sizeof(PackageType)); + *type = cJavaShutdownPackage; + pkg->vmID = (long) dialogWindow; + + /* make new Global Refs, send events only to those ATs that want 'em */ + AccessBridgeATInstance *ati = ATs; + while (ati != (AccessBridgeATInstance *) 0) { + if (ati->javaEventMask & cJavaShutdownEvent) { + PrintDebugString(" sending to AT"); + ati->sendJavaEventPackage(buffer, sizeof(buffer), cJavaShutdownEvent); + } + ati = ati->nextATInstance; + } + PrintDebugString(" done with firing AWT event"); + } + + FIRE_EVENT(fireFocusGained, FocusGainedPackage, cFocusGainedPackage, cFocusGainedEvent) + FIRE_EVENT(fireFocusLost, FocusLostPackage, cFocusLostPackage, cFocusLostEvent) + FIRE_EVENT(fireCaretUpdate, CaretUpdatePackage, cCaretUpdatePackage, cCaretUpdateEvent) + FIRE_EVENT(fireMouseClicked, MouseClickedPackage, cMouseClickedPackage, cMouseClickedEvent) + FIRE_EVENT(fireMouseEntered, MouseEnteredPackage, cMouseEnteredPackage, cMouseEnteredEvent) + FIRE_EVENT(fireMouseExited, MouseExitedPackage, cMouseExitedPackage, cMouseExitedEvent) + FIRE_EVENT(fireMousePressed, MousePressedPackage, cMousePressedPackage, cMousePressedEvent) + FIRE_EVENT(fireMouseReleased, MouseReleasedPackage, cMouseReleasedPackage, cMouseReleasedEvent) + FIRE_EVENT(fireMenuCanceled, MenuCanceledPackage, cMenuCanceledPackage, cMenuCanceledEvent) + FIRE_EVENT(fireMenuDeselected, MenuDeselectedPackage, cMenuDeselectedPackage, cMenuDeselectedEvent) + FIRE_EVENT(fireMenuSelected, MenuSelectedPackage, cMenuSelectedPackage, cMenuSelectedEvent) + FIRE_EVENT(firePopupMenuCanceled, PopupMenuCanceledPackage, cPopupMenuCanceledPackage, cPopupMenuCanceledEvent) + FIRE_EVENT(firePopupMenuWillBecomeInvisible, PopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisibleEvent) + FIRE_EVENT(firePopupMenuWillBecomeVisible, PopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisibleEvent) + + + // ----------------------------- + + +extern "C" { // event stuff from AccessBridge.h, generated by JNI + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_sendDebugString(JNIEnv *env, jobject callingObj, jstring debugStr) { + + const wchar_t *stringBytes; + stringBytes = (const wchar_t *) env->GetStringChars(debugStr, 0); + if (stringBytes == NULL) { + if (!env->ExceptionCheck()) { + jclass cls = env->FindClass("java/lang/OutOfMemoryError"); + if (cls != NULL) { + env->ThrowNew(cls, NULL); + } + } + return; + } + wPrintJavaDebugString(L"AccessBridge.java: %ls", stringBytes); + env->ReleaseStringChars(debugStr, stringBytes); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyCaretChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jint oldValue, jint newValue) { + theJavaAccessBridge->firePropertyCaretChange(env, callingObj, + event, source, + oldValue, newValue); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyDescriptionChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue) { + theJavaAccessBridge->firePropertyDescriptionChange(env, callingObj, + event, source, + oldValue, newValue); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyNameChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue) { + theJavaAccessBridge->firePropertyNameChange(env, callingObj, + event, source, + oldValue, newValue); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertySelectionChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source) { + theJavaAccessBridge->firePropertySelectionChange(env, callingObj, + event, source); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyStateChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue) { + theJavaAccessBridge->firePropertyStateChange(env, callingObj, + event, source, + oldValue, newValue); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyTextChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source) { + theJavaAccessBridge->firePropertyTextChange(env, callingObj, + event, source); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyValueChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue) { + theJavaAccessBridge->firePropertyValueChange(env, callingObj, + event, source, + oldValue, newValue); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyVisibleDataChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source) { + theJavaAccessBridge->firePropertyVisibleDataChange(env, callingObj, + event, source); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyChildChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jobject oldValue, jobject newValue) { + theJavaAccessBridge->firePropertyChildChange(env, callingObj, + event, source, + oldValue, newValue); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyActiveDescendentChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jobject oldValue, + jobject newValue) { + theJavaAccessBridge->firePropertyActiveDescendentChange(env, callingObj, + event, source, + oldValue, newValue); + } + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_propertyTableModelChange(JNIEnv *env, jobject callingObj, + jobject event, jobject source, + jstring oldValue, jstring newValue) { + + theJavaAccessBridge->firePropertyTableModelChange(env, callingObj, + event, source, + oldValue, newValue); + } + +#define HANDLE_STANDARD_EVENT_FROM_JAVA(function, method) \ + JNIEXPORT void JNICALL \ + function(JNIEnv *env, jobject callingObj, jobject event, jobject source) { \ + theJavaAccessBridge->method(env, callingObj, event, source); \ + } + + + JNIEXPORT void JNICALL + Java_com_sun_java_accessibility_AccessBridge_javaShutdown(JNIEnv *env, jobject callingObj) { + theJavaAccessBridge->javaShutdown(env, callingObj); + } + + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_focusGained, fireFocusGained) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_focusLost, fireFocusLost) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_caretUpdate, fireCaretUpdate) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseClicked, fireMouseClicked) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseEntered, fireMouseEntered) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseExited, fireMouseExited) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mousePressed, fireMousePressed) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseReleased, fireMouseReleased) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuCanceled, fireMenuCanceled) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuDeselected, fireMenuDeselected) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuSelected, fireMenuSelected) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuCanceled, firePopupMenuCanceled) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuWillBecomeInvisible, firePopupMenuWillBecomeInvisible) + HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuWillBecomeVisible, firePopupMenuWillBecomeVisible) + + /* + * Map a HWND to a Java component + * + * Class: com_sun_java_accessibility_AccessBridge + * Method: jawtGetComponentFromNativeWindowHandle + * Signature: (I)Ljava/awt/Component; + */ + JNIEXPORT jobject JNICALL + Java_com_sun_java_accessibility_AccessBridge_jawtGetComponentFromNativeWindowHandle + (JNIEnv *env, jobject callingObj, jint windowHandle) { + + JAWT awt; + jboolean result; + jobject component = (jobject)0; + + // Get the AWT + awt.version = JAWT_VERSION_1_4; + result = JAWT_GetAWT(env, &awt); + if (result == JNI_FALSE) { + return (jobject)0; + } + + // Get the component + return awt.GetComponent(env, (void *)windowHandle); + } + + + /* + * Map a Java component to a HWND + * + * Class: com_sun_java_accessibility_AccessBridge + * Method: jawtGetNativeWindowHandleFromComponent + * Signature: (Ljava/awt/Component;)I + */ + JNIEXPORT jint JNICALL + Java_com_sun_java_accessibility_AccessBridge_jawtGetNativeWindowHandleFromComponent + (JNIEnv *env, jobject callingObj, jobject component) { + + JAWT awt; + JAWT_DrawingSurface* ds; + JAWT_DrawingSurfaceInfo* dsi; + JAWT_Win32DrawingSurfaceInfo* dsi_win; + jboolean result; + // jint lock; + jint windowHandle = -1; + + // Get the AWT + awt.version = JAWT_VERSION_1_4; + result = JAWT_GetAWT(env, &awt); + if (result == JNI_FALSE) { + return -1; + } + + // Get the drawing surface + ds = awt.GetDrawingSurface(env, component); + if (ds == NULL) { + return -1; + } + + // Get the drawing surface info + dsi = ds->GetDrawingSurfaceInfo(ds); + + // Get the platform-specific drawing info + dsi_win = (JAWT_Win32DrawingSurfaceInfo *)dsi->platformInfo; + + // Get the window handle + windowHandle = (jint)dsi_win->hwnd; + + // Free the drawing surface info + ds->FreeDrawingSurfaceInfo(dsi); + + // Free the drawing surface + awt.FreeDrawingSurface(ds); + + return windowHandle; + } + +}