Path: blob/master/src/jdk.accessibility/windows/native/libjavaaccessbridge/JavaAccessBridge.cpp
40957 views
/*1* Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425/*26* A DLL which is loaded by Java applications to handle communication27* between Java VMs purposes of Accessbility.28*/2930#include "AccessBridgeDebug.h"31#include "JavaAccessBridge.h"32#include "com_sun_java_accessibility_internal_AccessBridge.h" // programatically generated by JNI33#include "accessBridgeResource.h"34#include "accessBridgeCallbacks.h"35#include "AccessBridgeMessages.h"363738#include <windows.h>39#include <stdio.h>4041#include <jawt.h>42#include <jawt_md.h>4344JavaAccessBridge *theJavaAccessBridge;45HWND theDialogWindow;4647// re-entrance lock for receiving memory messages48CRITICAL_SECTION receiveMemoryIPCLock;495051// unique broadcast msg. IDs gotten dymanically52extern UINT theFromJavaHelloMsgID;53extern UINT theFromWindowsHelloMsgID;545556// ---------------------------------------------------------------------------5758extern "C" {59/**60* DllMain - where Windows executables will load/unload us61*62*/63BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) {6465switch (fdwReason) {66case DLL_PROCESS_ATTACH:67InitializeCriticalSection(&receiveMemoryIPCLock);68theJavaAccessBridge = new JavaAccessBridge(hinstDll);69break;7071case DLL_PROCESS_DETACH: // A Windows executable unloaded us72if (theJavaAccessBridge != (JavaAccessBridge *) 0) {73delete theJavaAccessBridge;74DeleteCriticalSection(&receiveMemoryIPCLock);75}76break;77}78return TRUE;79}8081/**82* Open a native window (and init the wrappers we'll be using)83*84*/85JNIEXPORT void JNICALL86Java_com_sun_java_accessibility_internal_AccessBridge_runDLL(JNIEnv *env, jobject obj) {87PrintDebugString("[INFO]: JavaAccessBridge.DLL runDLL() called");88theJavaAccessBridge->javaRun(env, obj);89}9091/**92* Our window proc93*94*/95BOOL APIENTRY AccessBridgeDialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {96int command;97COPYDATASTRUCT *sentToUs;98char *package;99100switch (message) {101case WM_INITDIALOG:102PrintDebugString("[INFO]: In AccessBridgeDialog - Initializing");103break;104105case WM_COMMAND:106command = LOWORD (wParam);107PrintDebugString("[INFO]: In AccessBridgeDialog - Got WM_COMMAND, command: %X", command);108break;109110// call from Java with data for us to deliver111case WM_COPYDATA:112if (theDialogWindow == (HWND) wParam) {113PrintDebugString("[INFO]: In AccessBridgeDialog - Got WM_COPYDATA from ourselves");114} else {115PrintDebugString("[INFO]: In AccessBridgeDialog - Got WM_COPYDATA from HWND %p", wParam);116sentToUs = (COPYDATASTRUCT *) lParam;117package = (char *) sentToUs->lpData;118theJavaAccessBridge->processPackage(package, sentToUs->cbData);119}120break;121122// call from Java with data for us retrieve from memory mapped file and deliver123case AB_MESSAGE_WAITING:124// wParam == sourceHwnd125// lParam == buffer size in shared memory126if (theDialogWindow == (HWND) wParam) {127PrintDebugString("[INFO]: In AccessBridgeDialog - Got AB_MESSAGE_WAITING from ourselves");128} else {129PrintDebugString("[INFO]: In AccessBridgeDialog - Got AB_MESSAGE_WAITING from HWND %p", wParam);130LRESULT returnVal = theJavaAccessBridge->receiveMemoryPackage((HWND) wParam, (long) lParam);131}132break;133134// a JavaAccessBridge DLL is going away135case AB_DLL_GOING_AWAY:136PrintDebugString("[INFO]: In AccessBridgeDialog - Got AB_DLL_GOING_AWAY message");137theJavaAccessBridge->WindowsATDestroyed((HWND) wParam);138break;139140default:141// the Windows AT is saying "hi"!142// wParam == sourceHwnc; lParam unused143if (message == theFromWindowsHelloMsgID) {144// A new Windows AT just said "hi";145// say "hi" back so it can mate up with us146// otherwise don't do anything (e.g. don't set up data structures yet)147PrintDebugString("[INFO]: In AccessBridgeDialog - Got theFromWindowsHelloMsgID message");148theJavaAccessBridge->postHelloToWindowsDLLMsg((HWND) wParam);149}150}151return FALSE;152}153154}155156157// -----------------------------158159160/**161* Initialize the JavaAccessBridge162*163*/164JavaAccessBridge::JavaAccessBridge(HINSTANCE hInstance) {165windowsInstance = hInstance;166ATs = (AccessBridgeATInstance *) 0;167initializeFileLogger("java_access_bridge");168initBroadcastMessageIDs(); // get the unique to us broadcast msg. IDs169}170171extern DWORD JavaBridgeThreadId;172173/**174* Destroy the JavaAccessBridge175*176*/177JavaAccessBridge::~JavaAccessBridge() {178// inform all other AccessBridges that we're going away179180PrintDebugString("[INFO]: in JavaAccessBridge::~JavaAccessBridge()");181182// Send a shutdown message for those applications like StarOffice that do183// send a shutdown message themselves.184javaShutdown(NULL, 0);185186AccessBridgeATInstance *current = ATs;187while (current != (AccessBridgeATInstance *) 0) {188PrintDebugString("[INFO]: telling %p we're going away", current->winAccessBridgeWindow);189SendMessage(current->winAccessBridgeWindow,190AB_DLL_GOING_AWAY, (WPARAM) dialogWindow, (LPARAM) 0);191current = current->nextATInstance;192}193194PrintDebugString("[INFO]: finished telling ATs about our demise");195196if(JavaBridgeThreadId)197{198PostThreadMessage(JavaBridgeThreadId,WM_USER+1,0,0);199Sleep(100);200}201202delete ATs;203204PrintDebugString("[INFO]: finished deleting ATs");205PrintDebugString("[INFO]: GOODBYE CRUEL WORLD...");206finalizeFileLogger();207}208209210void211JavaAccessBridge::javaRun(JNIEnv *env, jobject obj) {212MSG msg;213214PrintDebugString("[INFO]: JavaAccessBridge::javaRun(%p, %p) called", env, obj);215216if (env->GetJavaVM(&javaVM) != 0) {217return; // huh!?!?!218}219PrintDebugString("[INFO]: -> javaVM = %p", javaVM);220221if (javaVM->AttachCurrentThread((void **) &windowsThreadJNIEnv, NULL) != 0) {222return; // huh!?!?!223}224PrintDebugString("[INFO]: -> windowsThreadJNIEnv = %p", windowsThreadJNIEnv);225226javaThreadABObject = env->NewGlobalRef(obj);227windowsThreadABObject = windowsThreadJNIEnv->NewGlobalRef(obj);228229// initialize the Java thread AccessBridge entry points230javaThreadEntryPoints = new AccessBridgeJavaEntryPoints(env, javaThreadABObject);231if (javaThreadEntryPoints->BuildJavaEntryPoints() == FALSE) {232return; // couldn't build our entry points; let's get out of here!233}234PrintDebugString("[INFO]: all Java thread entry points successfully found.");235236// initialize the Windows thread AccessBridge entry points237windowsThreadEntryPoints = new AccessBridgeJavaEntryPoints(windowsThreadJNIEnv,238windowsThreadABObject);239if (windowsThreadEntryPoints->BuildJavaEntryPoints() == FALSE) {240return; // couldn't build our entry points; let's get out of here!241}242PrintDebugString("[INFO]: all Windows thread entry points successfully found.");243244245// open our window246if (initWindow() == TRUE) {247PrintDebugString("[INFO]: Window created. HWND = %p", dialogWindow);248249// post a broadcast msg.; let other AccessBridge DLLs know we exist250postHelloToWindowsDLLMsg(HWND_BROADCAST);251252// do that message loop thing253while (GetMessage(&msg, NULL, 0, 0)) {254TranslateMessage(&msg);255DispatchMessage(&msg);256}257} else {258PrintDebugString("[ERROR]: FAILED TO CREATE WINDOW!!!");259}260261javaVM->DetachCurrentThread();262}263264/**265* Bring up our window; make a connection to the rest of the world266*267*/268BOOL269JavaAccessBridge::initWindow() {270theDialogWindow = CreateDialog(windowsInstance,271"ACCESSBRIDGESTATUSWINDOW", NULL,272(DLGPROC) AccessBridgeDialogProc);273274// If window could not be created, return "failure".275if (!theDialogWindow)276return FALSE;277278dialogWindow = theDialogWindow;279280// Make the window visible, update its client area, & return "success".281// DEBUG_CODE(ShowWindow (theDialogWindow, SW_SHOWNORMAL));282// DEBUG_CODE(UpdateWindow (theDialogWindow));283284return TRUE;285}286287288289// -----------------------290291292/**293* postHelloToWindowsDLLMsg294* - PostMessage(theFromJavaHelloMsgID) to let one or295* all WindowDLLs we're here and have a vmID296*297* destHwnd is either a single hwnd or HWND_BROADCAST298* (former if a reply, latter if we're just born)299* wParam is our HWND300* lParam is our vmID301*302*/303void304JavaAccessBridge::postHelloToWindowsDLLMsg(HWND destHwnd) {305PrintDebugString("[INFO]: In JavaAccessBridge::postHelloToWindowsDLLMsg");306PrintDebugString("[INFO]: calling PostMessage(%p, %X, %p, %p)",307destHwnd, theFromJavaHelloMsgID, dialogWindow, dialogWindow);308PostMessage(destHwnd, theFromJavaHelloMsgID, (WPARAM) dialogWindow, (LPARAM) dialogWindow);309}310311312// -----------------------313314/**315* sendPackage - uses SendMessage(WM_COPYDATA) to do IPC messaging316* with the Java AccessBridge DLL317*318*/319void320JavaAccessBridge::sendPackage(char *buffer, int bufsize, HWND destHwnd) {321COPYDATASTRUCT toCopy;322toCopy.dwData = 0; // 32-bits we could use for something...323toCopy.cbData = bufsize;324toCopy.lpData = buffer;325326SendMessage(destHwnd, WM_COPYDATA, (WPARAM) dialogWindow, (LPARAM) &toCopy);327}328329330/**331* sendJavaEventPackage - walk through ATs, sending event messages to 'em332*333*/334void335JavaAccessBridge::sendJavaEventPackage(char *buffer, int bufsize, long type) {336337PrintDebugString("[INFO]: JavaAccessBridge::sendJavaEventPackage(), type = %X", type);338339if (ATs == (AccessBridgeATInstance *) 0) {340PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");341}342343AccessBridgeATInstance *ati = ATs;344while (ati != (AccessBridgeATInstance *) 0) {345ati->sendJavaEventPackage(buffer, bufsize, type);346ati = ati->nextATInstance;347}348}349350/**351* sendAccessibilityEventPackage - walk through ATs, sending event messages to 'em352*353*/354void355JavaAccessBridge::sendAccessibilityEventPackage(char *buffer, int bufsize, long type) {356357PrintDebugString("[INFO]: JavaAccessBridge::sendAccessibilityEventPackage(), type = %X", type);358359if (ATs == (AccessBridgeATInstance *) 0) {360PrintDebugString("[ERROR] ATs == 0! (shouldn't happen here!)");361}362363AccessBridgeATInstance *ati = ATs;364while (ati != (AccessBridgeATInstance *) 0) {365ati->sendAccessibilityEventPackage(buffer, bufsize, type);366ati = ati->nextATInstance;367}368}369370371372373/**374* receiveMemoryPackage - uses Memory-Mapped files to do IPC messaging375* with the Java AccessBridge DLL, receiving the376* message from Java AccessBridge DLL by reading the377* contents of the shared memory mapped file that378* is used for Java-initiated messages379*380*/381BOOL382JavaAccessBridge::receiveMemoryPackage(HWND srcWindow, long bufsize) {383char *IPCview;384385PrintDebugString("[INFO]: JavaAccessBridge::receiveMemoryPackage(%p, %d)", srcWindow, bufsize);386387// look-up the appropriate IPCview based on the srcHWND of the Windows AccessBridge DLL388if (ATs == (AccessBridgeATInstance *) 0) {389PrintDebugString("[ERROR]: - ATs == 0 (shouldn't happen in receiveMemoryPackage()!");390return FALSE;391}392AccessBridgeATInstance *ati = ATs->findABATInstanceFromATHWND(srcWindow);393if (ati != (AccessBridgeATInstance *) 0) {394IPCview = (char *) ati->memoryMappedView;395396// wait for the lock if someone else has it (re-entrancy)397EnterCriticalSection(&receiveMemoryIPCLock);398{399// set byte at end of buffer to indicate to caller that we have reached this point400IPCview[bufsize] = 1;401402// process the package403processPackage(IPCview, bufsize);404}405// release re-entrance lock406LeaveCriticalSection(&receiveMemoryIPCLock);407408return TRUE;409410} else {411//DEBUG_CODE(AppendToCallInfo("ERROR receiving memory package: couldn't find srcWindow"));412PrintDebugString("[ERROR]: receiving memory package: couldn't find srcWindow");413return FALSE;414}415}416417/**418* processPackage - processes the output of SendMessage(WM_COPYDATA)419* to do IPC messaging with the Windows AccessBridge DLL420*421*/422LRESULT423JavaAccessBridge::processPackage(char *buffer, int bufsize) {424PrintDebugString("[INFO]: Processing package sent from Windows, bufsize = %d:", bufsize);425426PackageType *type = (PackageType *) buffer;427LRESULT returnVal = 0;428PrintDebugString("[INFO]: PackageType = %X:", *type);429jobject rAC;430431switch (*type) {432433434case cMemoryMappedFileCreatedPackage:435// Windows is telling us it created a memory mapped file for us to use436// in repsonding to various information querying packages (see below)437PrintDebugString("[INFO]: type == cMemoryMappedFileCreatedPackage");438if (bufsize == (sizeof(PackageType) + sizeof(MemoryMappedFileCreatedPackage))) {439MemoryMappedFileCreatedPackage *pkg =440(MemoryMappedFileCreatedPackage *) (buffer + sizeof(PackageType));441returnVal = MemoryMappedFileCreated((HWND)ABLongToHandle(pkg->bridgeWindow), pkg->filename);442} else {443PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",444bufsize, sizeof(PackageType) + sizeof(MemoryMappedFileCreatedPackage));445}446break;447448// ------------ information querying packages ------------------449450case cReleaseJavaObjectPackage:451PrintDebugString("[INFO]: type == cReleaseJavaObjectPackage");452if (bufsize == (sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage))) {453ReleaseJavaObjectPackage *pkg =454(ReleaseJavaObjectPackage *) (buffer + sizeof(PackageType));455releaseJavaObject((jobject)pkg->object);456} else {457PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",458bufsize, sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage));459}460break;461462case cGetAccessBridgeVersionPackage:463PrintDebugString("[INFO]: type == cGetAccessBridgeVersionPackage");464if (bufsize == (sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage))) {465GetAccessBridgeVersionPackage *pkg =466(GetAccessBridgeVersionPackage *) (buffer + sizeof(PackageType));467windowsThreadEntryPoints->getVersionInfo(&(pkg->rVersionInfo));468} else {469PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",470bufsize, sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage));471}472break;473474case cIsJavaWindowPackage:475PrintDebugString("[INFO]: type == cIsJavaWindowPackage");476if (bufsize == (sizeof(PackageType) + sizeof(IsJavaWindowPackage))) {477IsJavaWindowPackage *pkg =478(IsJavaWindowPackage *) (buffer + sizeof(PackageType));479pkg->rResult =480windowsThreadEntryPoints->isJavaWindow(pkg->window);481PrintDebugString("[INFO]: -> returning result = %d", pkg->rResult);482} else {483PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",484bufsize, sizeof(PackageType) + sizeof(IsJavaWindowPackage));485}486break;487488case cIsSameObjectPackage:489PrintDebugString("[INFO]: type == cIsSameObjectPackage");490if (bufsize == (sizeof(PackageType) + sizeof(IsSameObjectPackage))) {491IsSameObjectPackage *pkg =492(IsSameObjectPackage *) (buffer + sizeof(PackageType));493pkg->rResult =494windowsThreadEntryPoints->isSameObject((jobject)pkg->obj1, (jobject)pkg->obj2);495PrintDebugString("[INFO]: -> returning result = %d", pkg->rResult);496} else {497PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",498bufsize, sizeof(PackageType) + sizeof(IsSameObjectPackage));499}500break;501502503case cGetAccessibleContextFromHWNDPackage:504PrintDebugString("[INFO]: type == cGetAccessibleContextFromHWNDPackage");505if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage))) {506GetAccessibleContextFromHWNDPackage *pkg =507(GetAccessibleContextFromHWNDPackage *) (buffer + sizeof(PackageType));508rAC = windowsThreadEntryPoints->getAccessibleContextFromHWND(pkg->window);509pkg->rAccessibleContext = (JOBJECT64)rAC;510pkg->rVMID = HandleToLong(dialogWindow);511PrintDebugString("[INFO]: -> returning AC = %p, vmID = %X", rAC, pkg->rVMID);512} else {513PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",514bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage));515}516break;517518519case cGetHWNDFromAccessibleContextPackage:520PrintDebugString("[INFO]: type == cGetHWNDFromAccessibleContextPackage");521if (bufsize == (sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage))) {522GetHWNDFromAccessibleContextPackage *pkg =523(GetHWNDFromAccessibleContextPackage *) (buffer + sizeof(PackageType));524pkg->rHWND =525ABHandleToLong( windowsThreadEntryPoints->getHWNDFromAccessibleContext((jobject)pkg->accessibleContext) );526PrintDebugString("[INFO]: -> returning HWND = %p", pkg->rHWND);527} else {528PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",529bufsize, sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage));530}531break;532533534/* ===== utility methods ===== */535536case cSetTextContentsPackage:537PrintDebugString("[INFO]: type == cSetTextContentsPackage");538if (bufsize == (sizeof(PackageType) + sizeof(SetTextContentsPackage))) {539SetTextContentsPackage *pkg =540(SetTextContentsPackage *) (buffer + sizeof(PackageType));541pkg->rResult =542windowsThreadEntryPoints->setTextContents((jobject)pkg->accessibleContext, pkg->text);543PrintDebugString("[INFO]: -> returning result = %d", pkg->rResult);544} else {545PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",546bufsize, sizeof(PackageType) + sizeof(SetTextContentsPackage));547}548break;549550case cGetParentWithRolePackage:551if (bufsize == (sizeof(PackageType) + sizeof(GetParentWithRolePackage))) {552GetParentWithRolePackage *pkg =553(GetParentWithRolePackage *) (buffer + sizeof(PackageType));554rAC = windowsThreadEntryPoints->getParentWithRole((jobject)pkg->accessibleContext, pkg->role);555pkg->rAccessibleContext = (JOBJECT64)rAC;556PrintDebugString("[INFO]: type == cGetParentWithRolePackage\n"\557" pkg->vmID: %X"\558" pkg->accessibleContext: %p"\559" pkg->role: %ls"\560" -> returning rAccessibleContext = %p"\561, pkg->vmID, (jobject)pkg->accessibleContext, pkg->role, rAC);562} else {563PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",564bufsize, sizeof(PackageType) + sizeof(GetParentWithRolePackage));565}566break;567568case cGetTopLevelObjectPackage:569PrintDebugString("[INFO]: type == cGetTopLevelObjectPackage");570if (bufsize == (sizeof(PackageType) + sizeof(GetTopLevelObjectPackage))) {571GetTopLevelObjectPackage *pkg =572(GetTopLevelObjectPackage *) (buffer + sizeof(PackageType));573rAC = windowsThreadEntryPoints->getTopLevelObject((jobject)pkg->accessibleContext);574pkg->rAccessibleContext = (JOBJECT64)rAC;575PrintDebugString("[INFO]: -> returning rAccessibleContext = %p", rAC);576} else {577PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",578bufsize, sizeof(PackageType) + sizeof(GetTopLevelObjectPackage));579}580break;581582case cGetParentWithRoleElseRootPackage:583PrintDebugString("[INFO]: type == cGetParentWithRoleElseRootPackage");584if (bufsize == (sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage))) {585GetParentWithRoleElseRootPackage *pkg =586(GetParentWithRoleElseRootPackage *) (buffer + sizeof(PackageType));587rAC = windowsThreadEntryPoints->getParentWithRoleElseRoot((jobject)pkg->accessibleContext, pkg->role);588pkg->rAccessibleContext = (JOBJECT64)rAC;589PrintDebugString("[INFO]: -> returning rAccessibleContext = %p", rAC);590} else {591PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",592bufsize, sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage));593}594break;595596case cGetObjectDepthPackage:597PrintDebugString("[INFO]: type == cGetObjectDepthPackage");598if (bufsize == (sizeof(PackageType) + sizeof(GetObjectDepthPackage))) {599GetObjectDepthPackage *pkg =600(GetObjectDepthPackage *) (buffer + sizeof(PackageType));601pkg->rResult =602windowsThreadEntryPoints->getObjectDepth((jobject)pkg->accessibleContext);603PrintDebugString("[INFO]: -> returning rResult = %d", pkg->rResult);604} else {605PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",606bufsize, sizeof(PackageType) + sizeof(GetObjectDepthPackage));607}608break;609610case cGetActiveDescendentPackage:611PrintDebugString("[INFO]: type == cGetActiveDescendentPackage");612if (bufsize == (sizeof(PackageType) + sizeof(GetActiveDescendentPackage))) {613GetActiveDescendentPackage *pkg =614(GetActiveDescendentPackage *) (buffer + sizeof(PackageType));615rAC = windowsThreadEntryPoints->getActiveDescendent((jobject)pkg->accessibleContext);616pkg->rAccessibleContext = (JOBJECT64)rAC;617PrintDebugString("[INFO]: -> returning rAccessibleContext = %p", rAC);618} else {619PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",620bufsize, sizeof(PackageType) + sizeof(GetActiveDescendentPackage));621}622break;623624case cGetAccessibleContextAtPackage:625PrintDebugString("[INFO]: type == cGetAccessibleContextAtPackage");626if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage))) {627GetAccessibleContextAtPackage *pkg =628(GetAccessibleContextAtPackage *) (buffer + sizeof(PackageType));629pkg->rAccessibleContext = (JOBJECT64)630windowsThreadEntryPoints->getAccessibleContextAt(pkg->x, pkg->y,631(jobject)pkg->AccessibleContext);632} else {633PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",634bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage));635}636break;637638case cGetAccessibleContextWithFocusPackage:639PrintDebugString("[INFO]: type == cGetAccessibleContextWithFocusPackage");640if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage))) {641GetAccessibleContextWithFocusPackage *pkg =642(GetAccessibleContextWithFocusPackage *) (buffer + sizeof(PackageType));643pkg->rAccessibleContext = (JOBJECT64)644windowsThreadEntryPoints->getAccessibleContextWithFocus();645pkg->rVMID = HandleToLong(dialogWindow);646} else {647PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",648bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage));649}650break;651652case cGetAccessibleContextInfoPackage:653PrintDebugString("[INFO]: type == cGetAccessibleContextInfoPackage");654if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage))) {655GetAccessibleContextInfoPackage *pkg =656(GetAccessibleContextInfoPackage *) (buffer + sizeof(PackageType));657windowsThreadEntryPoints->getAccessibleContextInfo(658(jobject)pkg->AccessibleContext, &(pkg->rAccessibleContextInfo));659} else {660PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",661bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage));662}663break;664665case cGetAccessibleChildFromContextPackage:666PrintDebugString("[INFO]: type == cGetAccessibleChildFromContextPackage");667if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage))) {668GetAccessibleChildFromContextPackage *pkg =669(GetAccessibleChildFromContextPackage *) (buffer + sizeof(PackageType));670pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleChildFromContext(671(jobject)pkg->AccessibleContext, pkg->childIndex);672} else {673PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",674bufsize, sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage));675}676break;677678case cGetAccessibleParentFromContextPackage:679PrintDebugString("[INFO]: type == cGetAccessibleParentFromContextPackage");680if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage))) {681GetAccessibleParentFromContextPackage *pkg =682(GetAccessibleParentFromContextPackage *) (buffer + sizeof(PackageType));683pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleParentFromContext(684(jobject)pkg->AccessibleContext);685} else {686PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",687bufsize, sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage));688}689break;690691// ------------ begin AccessibleTable packages ------------------692693case cGetAccessibleTableInfoPackage:694PrintDebugString("[INFO]: ##### type == cGetAccessibleTableInfoPackage");695if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage))) {696GetAccessibleTableInfoPackage *pkg =697(GetAccessibleTableInfoPackage *) (buffer + sizeof(PackageType));698windowsThreadEntryPoints->getAccessibleTableInfo((jobject)pkg->accessibleContext,699&(pkg->rTableInfo));700PrintDebugString("[INFO]: ##### processing succeeded");701} else {702PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",703bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage));704}705break;706707case cGetAccessibleTableCellInfoPackage:708PrintDebugString("[INFO]: ##### type == cGetAccessibleTableCellInfoPackage");709if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage))) {710GetAccessibleTableCellInfoPackage *pkg =711(GetAccessibleTableCellInfoPackage *) (buffer + sizeof(PackageType));712windowsThreadEntryPoints->getAccessibleTableCellInfo((jobject)pkg->accessibleTable, pkg->row,713pkg->column, &(pkg->rTableCellInfo));714PrintDebugString("[INFO]: ##### processing succeeded");715} else {716PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",717bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage));718}719break;720721case cGetAccessibleTableRowHeaderPackage:722PrintDebugString("[INFO]: ##### type == cGetAccessibleTableRowHeaderPackage");723if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage))) {724GetAccessibleTableRowHeaderPackage *pkg =725(GetAccessibleTableRowHeaderPackage *) (buffer + sizeof(PackageType));726windowsThreadEntryPoints->getAccessibleTableRowHeader((jobject)pkg->accessibleContext,727&(pkg->rTableInfo));728PrintDebugString("[INFO]: ##### processing succeeded");729} else {730PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",731bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage));732}733break;734735case cGetAccessibleTableColumnHeaderPackage:736PrintDebugString("[INFO]: ##### type == cGetAccessibleTableColumnHeaderPackage");737if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage))) {738GetAccessibleTableColumnHeaderPackage *pkg =739(GetAccessibleTableColumnHeaderPackage *) (buffer + sizeof(PackageType));740windowsThreadEntryPoints->getAccessibleTableColumnHeader((jobject)pkg->accessibleContext,741&(pkg->rTableInfo));742PrintDebugString("[INFO]: ##### processing succeeded");743} else {744PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",745bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage));746}747break;748749750case cGetAccessibleTableRowDescriptionPackage:751PrintDebugString("[INFO]: ##### type == cGetAccessibleTableRowDescriptionPackage");752if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage))) {753GetAccessibleTableRowDescriptionPackage *pkg =754(GetAccessibleTableRowDescriptionPackage *) (buffer + sizeof(PackageType));755pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleTableRowDescription(756(jobject)pkg->accessibleContext, pkg->row);757PrintDebugString("[INFO]: ##### processing succeeded");758} else {759PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",760bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage));761}762break;763764case cGetAccessibleTableColumnDescriptionPackage:765PrintDebugString("[INFO]: ##### type == cGetAccessibleTableColumnDescriptionPackage");766if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage))) {767GetAccessibleTableColumnDescriptionPackage *pkg =768(GetAccessibleTableColumnDescriptionPackage *) (buffer + sizeof(PackageType));769pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleTableColumnDescription(770(jobject)pkg->accessibleContext, pkg->column);771PrintDebugString("[INFO]: ##### processing succeeded");772} else {773PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",774bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage));775}776break;777778case cGetAccessibleTableColumnSelectionCountPackage:779PrintDebugString("[INFO]: ##### type == cGetAccessibleTableColumnSelectionCountPackage");780if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage))) {781GetAccessibleTableColumnSelectionCountPackage *pkg =782(GetAccessibleTableColumnSelectionCountPackage *) (buffer + sizeof(PackageType));783pkg->rCount = windowsThreadEntryPoints->getAccessibleTableColumnSelectionCount(784(jobject)pkg->accessibleTable);785PrintDebugString("[INFO]: ##### processing succeeded");786} else {787PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",788bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage));789}790break;791792case cGetAccessibleTableRowSelectionCountPackage:793PrintDebugString("[INFO]: ##### type == cGetAccessibleTableRowSelectionCountPackage");794if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage))) {795GetAccessibleTableRowSelectionCountPackage *pkg =796(GetAccessibleTableRowSelectionCountPackage *) (buffer + sizeof(PackageType));797798pkg->rCount = windowsThreadEntryPoints->getAccessibleTableRowSelectionCount(799(jobject)pkg->accessibleTable);800801PrintDebugString("[INFO]: ##### processing succeeded");802} else {803PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",804bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage));805}806break;807808case cIsAccessibleTableRowSelectedPackage:809PrintDebugString("[INFO]: ##### type == cIsAccessibleTableRowSelectedPackage");810if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage))) {811IsAccessibleTableRowSelectedPackage *pkg =812(IsAccessibleTableRowSelectedPackage *) (buffer + sizeof(PackageType));813pkg->rResult = windowsThreadEntryPoints->isAccessibleTableRowSelected(814(jobject)pkg->accessibleTable, pkg->row);815PrintDebugString("[INFO]: ##### processing succeeded");816} else {817PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",818bufsize, sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage));819}820break;821822case cIsAccessibleTableColumnSelectedPackage:823PrintDebugString("[INFO]: ##### type == cIsAccessibleTableColumnSelectedPackage");824if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage))) {825IsAccessibleTableColumnSelectedPackage *pkg =826(IsAccessibleTableColumnSelectedPackage *) (buffer + sizeof(PackageType));827pkg->rResult = windowsThreadEntryPoints->isAccessibleTableColumnSelected(828(jobject)pkg->accessibleTable, pkg->column);829PrintDebugString("[INFO]: ##### processing succeeded");830} else {831PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",832bufsize, sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage));833}834break;835836case cGetAccessibleTableColumnSelectionsPackage:837PrintDebugString("[INFO]: ##### type == cGetAccessibleTableColumnSelectionsPackage");838if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage))) {839GetAccessibleTableColumnSelectionsPackage *pkg =840(GetAccessibleTableColumnSelectionsPackage *) (buffer + sizeof(PackageType));841PrintDebugString("[INFO]: ##### cGetAccessibleTableColumnSelectionsPackage count=%d", pkg->count);842windowsThreadEntryPoints->getAccessibleTableColumnSelections(843(jobject)pkg->accessibleTable, pkg->count, pkg->rSelections);844845for (int i = 0; i < pkg->count; i++) {846PrintDebugString("[INFO]: ##### cGetAccessibleTableColumnSelectionsPackage(%d)=%d", i, pkg->rSelections[i]);847}848849PrintDebugString("[INFO]: ##### processing succeeded");850} else {851PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",852bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage));853}854break;855856857case cGetAccessibleTableRowSelectionsPackage:858PrintDebugString("[INFO]: ##### type == cGetAccessibleTableRowSelectionsPackage");859if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage))) {860GetAccessibleTableRowSelectionsPackage *pkg =861(GetAccessibleTableRowSelectionsPackage *) (buffer + sizeof(PackageType));862windowsThreadEntryPoints->getAccessibleTableRowSelections(863(jobject)pkg->accessibleTable, pkg->count, pkg->rSelections);864PrintDebugString("[INFO]: ##### processing succeeded");865} else {866PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",867bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage));868}869break;870871case cGetAccessibleTableRowPackage:872PrintDebugString("[INFO]: ##### type == cGetAccessibleTableRowPackage");873if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage))) {874GetAccessibleTableRowPackage *pkg =875(GetAccessibleTableRowPackage *) (buffer + sizeof(PackageType));876pkg->rRow = windowsThreadEntryPoints->getAccessibleTableRow(877(jobject)pkg->accessibleTable, pkg->index);878PrintDebugString("[INFO]: ##### processing succeeded");879} else {880PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",881bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage));882}883break;884885case cGetAccessibleTableColumnPackage:886PrintDebugString("[INFO]: ##### type == cGetAccessibleTableColumnPackage");887if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage))) {888GetAccessibleTableColumnPackage *pkg =889(GetAccessibleTableColumnPackage *) (buffer + sizeof(PackageType));890pkg->rColumn = windowsThreadEntryPoints->getAccessibleTableColumn(891(jobject)pkg->accessibleTable, pkg->index);892PrintDebugString("[INFO]: ##### processing succeeded");893} else {894PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",895bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage));896}897break;898899case cGetAccessibleTableIndexPackage:900PrintDebugString("[INFO]: ##### type == cGetAccessibleTableIndexPackage");901if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage))) {902GetAccessibleTableIndexPackage *pkg =903(GetAccessibleTableIndexPackage *) (buffer + sizeof(PackageType));904pkg->rIndex = windowsThreadEntryPoints->getAccessibleTableIndex(905(jobject)pkg->accessibleTable, pkg->row, pkg->column);906PrintDebugString("[INFO]: ##### processing succeeded");907} else {908PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",909bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage));910}911break;912913// ------------ end AccessibleTable packages ------------------914915916// ------------ begin AccessibleRelationSet packages ------------------917918case cGetAccessibleRelationSetPackage:919PrintDebugString("[INFO]: ##### type == cGetAccessibleRelationSetPackage");920if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage))) {921GetAccessibleRelationSetPackage *pkg =922(GetAccessibleRelationSetPackage *) (buffer + sizeof(PackageType));923windowsThreadEntryPoints->getAccessibleRelationSet(924(jobject)pkg->accessibleContext, &(pkg->rAccessibleRelationSetInfo));925PrintDebugString("[INFO]: ##### processing succeeded");926} else {927PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",928bufsize, sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage));929}930break;931932// ------------ end AccessibleRelationSet packages ------------------933934// ------------ begin AccessibleHypertext packages ------------------935936case cGetAccessibleHypertextPackage:937PrintDebugString("[INFO]: ##### type == cGetAccessibleHypertextPackage");938if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage))) {939GetAccessibleHypertextPackage *pkg =940(GetAccessibleHypertextPackage *) (buffer + sizeof(PackageType));941windowsThreadEntryPoints->getAccessibleHypertext(942(jobject)pkg->accessibleContext, &(pkg->rAccessibleHypertextInfo));943PrintDebugString("[INFO]: ##### processing succeeded");944} else {945PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",946bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage));947}948break;949950case cActivateAccessibleHyperlinkPackage:951PrintDebugString("[INFO]: ##### type == cActivateAccessibleHyperlinkPackage");952if (bufsize == (sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage))) {953ActivateAccessibleHyperlinkPackage *pkg =954(ActivateAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType));955pkg->rResult = windowsThreadEntryPoints->activateAccessibleHyperlink(956(jobject)pkg->accessibleContext, (jobject)pkg->accessibleHyperlink);957PrintDebugString("[INFO]: ##### processing succeeded");958} else {959PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",960bufsize, sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage));961}962break;963964case cGetAccessibleHyperlinkCountPackage:965PrintDebugString("[INFO]: ##### type == cGetAccessibleHyperlinkCountPackage");966if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage))) {967GetAccessibleHyperlinkCountPackage *pkg =968(GetAccessibleHyperlinkCountPackage *) (buffer + sizeof(PackageType));969pkg->rLinkCount = windowsThreadEntryPoints->getAccessibleHyperlinkCount(970(jobject)pkg->accessibleContext);971PrintDebugString("[INFO]: ##### processing succeeded: pkg->rLinkCount = %d", pkg->rLinkCount);972} else {973PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",974bufsize, sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage));975}976break;977978case cGetAccessibleHypertextExtPackage:979PrintDebugString("[INFO]: ##### type == cGetAccessibleHypertextExtPackage");980if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage))) {981GetAccessibleHypertextExtPackage *pkg =982(GetAccessibleHypertextExtPackage *) (buffer + sizeof(PackageType));983pkg->rSuccess = windowsThreadEntryPoints->getAccessibleHypertextExt(984(jobject)pkg->accessibleContext, pkg->startIndex, &(pkg->rAccessibleHypertextInfo));985PrintDebugString("[INFO]: ##### processing succeeded");986} else {987PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",988bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage));989}990break;991992case cGetAccessibleHypertextLinkIndexPackage:993PrintDebugString("[INFO]: ##### type == cGetAccessibleHypertextLinkIndexPackage");994if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage))) {995GetAccessibleHypertextLinkIndexPackage *pkg =996(GetAccessibleHypertextLinkIndexPackage *) (buffer + sizeof(PackageType));997pkg->rLinkIndex = windowsThreadEntryPoints->getAccessibleHypertextLinkIndex(998(jobject)pkg->hypertext, pkg->charIndex);999PrintDebugString("[INFO]: ##### processing succeeded");1000} else {1001PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1002bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage));1003}1004break;10051006case cGetAccessibleHyperlinkPackage:1007PrintDebugString("[INFO]: ##### type == cGetAccessibleHyperlinkPackage");1008if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage))) {1009GetAccessibleHyperlinkPackage *pkg =1010(GetAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType));1011windowsThreadEntryPoints->getAccessibleHyperlink((jobject)pkg->hypertext, pkg->linkIndex,1012&(pkg->rAccessibleHyperlinkInfo));1013PrintDebugString("[INFO]: ##### processing succeeded");1014} else {1015PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1016bufsize, sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage));1017}1018break;10191020// ------------ end AccessibleHypertext packages10211022// ------------ begin Accessible KeyBindings, Icons and Actions10231024case cGetAccessibleKeyBindingsPackage:1025PrintDebugString("[INFO]: ##### type == cGetAccessibleKeyBindingsPackage");1026if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage))) {1027GetAccessibleKeyBindingsPackage *pkg =1028(GetAccessibleKeyBindingsPackage *) (buffer + sizeof(PackageType));1029windowsThreadEntryPoints->getAccessibleKeyBindings (1030(jobject)pkg->accessibleContext, &(pkg->rAccessibleKeyBindings));1031PrintDebugString("[INFO]: ##### processing succeeded");1032} else {1033PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1034bufsize, sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage));1035}1036break;10371038case cGetAccessibleIconsPackage:1039PrintDebugString("[INFO]: ##### type == cGetAccessibleIconsPackage");1040if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleIconsPackage))) {1041GetAccessibleIconsPackage *pkg =1042(GetAccessibleIconsPackage *) (buffer + sizeof(PackageType));1043windowsThreadEntryPoints->getAccessibleIcons (1044(jobject)pkg->accessibleContext, &(pkg->rAccessibleIcons));1045PrintDebugString("[INFO]: ##### processing succeeded");1046} else {1047PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1048bufsize, sizeof(PackageType) + sizeof(GetAccessibleIconsPackage));1049}1050break;105110521053case cGetAccessibleActionsPackage:1054PrintDebugString("[INFO]: ##### type == cGetAccessibleActionsPackage");1055if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleActionsPackage))) {1056GetAccessibleActionsPackage *pkg =1057(GetAccessibleActionsPackage *) (buffer + sizeof(PackageType));1058windowsThreadEntryPoints->getAccessibleActions (1059(jobject)pkg->accessibleContext, &(pkg->rAccessibleActions));1060PrintDebugString("[INFO]: ##### processing succeeded");1061} else {1062PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1063bufsize, sizeof(PackageType) + sizeof(GetAccessibleActionsPackage));1064}1065break;10661067case cDoAccessibleActionsPackage:1068PrintDebugString("[INFO]: ##### type == cDoAccessibleActionsPackage");1069if (bufsize == (sizeof(PackageType) + sizeof(DoAccessibleActionsPackage))) {1070DoAccessibleActionsPackage *pkg =1071(DoAccessibleActionsPackage *) (buffer + sizeof(PackageType));1072pkg->rResult =1073windowsThreadEntryPoints->doAccessibleActions((jobject)pkg->accessibleContext, &(pkg->actionsToDo),1074&(pkg->failure));1075PrintDebugString("[INFO]: ##### processing succeeded");1076} else {1077PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1078bufsize, sizeof(PackageType) + sizeof(DoAccessibleActionsPackage));1079}1080break;10811082// ------------ begin addtional methods for Teton10831084case cGetVirtualAccessibleNamePackage:1085PrintDebugString("[INFO]: ##### type == GetVirtualAccessibleNamePackage");1086if (bufsize == (sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage))) {1087GetVirtualAccessibleNamePackage *pkg =1088(GetVirtualAccessibleNamePackage *) (buffer + sizeof(PackageType));1089windowsThreadEntryPoints->getVirtualAccessibleName ((const jobject)pkg->accessibleContext,1090pkg->rName,1091pkg->len);1092PrintDebugString("[INFO]: ##### processing succeeded");1093} else {1094PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1095bufsize, sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage));1096}1097break;10981099case cRequestFocusPackage:1100PrintDebugString("[INFO]: ##### type == RequestFocusPackage");1101if (bufsize == (sizeof(PackageType) + sizeof(RequestFocusPackage))) {1102RequestFocusPackage *pkg =1103(RequestFocusPackage *) (buffer + sizeof(PackageType));1104windowsThreadEntryPoints->requestFocus (1105(jobject)pkg->accessibleContext);1106PrintDebugString("[INFO]: ##### processing succeeded");1107} else {1108PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1109bufsize, sizeof(PackageType) + sizeof(RequestFocusPackage));1110}1111break;11121113case cSelectTextRangePackage:1114PrintDebugString("[INFO]: ##### type == SelectTextRangePackage");1115if (bufsize == (sizeof(PackageType) + sizeof(SelectTextRangePackage))) {1116SelectTextRangePackage *pkg =1117(SelectTextRangePackage *) (buffer + sizeof(PackageType));1118windowsThreadEntryPoints->selectTextRange (1119(jobject)pkg->accessibleContext, pkg->startIndex, pkg->endIndex);1120PrintDebugString("[INFO]: ##### processing succeeded");1121} else {1122PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1123bufsize, sizeof(PackageType) + sizeof(SelectTextRangePackage));1124}1125break;11261127case cGetTextAttributesInRangePackage:1128PrintDebugString("[INFO]: ##### type == GetTextAttributesInRangePackage");1129if (bufsize == (sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage))) {1130GetTextAttributesInRangePackage *pkg =1131(GetTextAttributesInRangePackage *) (buffer + sizeof(PackageType));1132windowsThreadEntryPoints->getTextAttributesInRange (1133(jobject)pkg->accessibleContext, pkg->startIndex, pkg->endIndex,1134(AccessibleTextAttributesInfo *)&(pkg->attributes),1135&(pkg->rLength));1136PrintDebugString("[INFO]: ##### processing succeeded");1137} else {1138PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1139bufsize, sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage));1140}1141break;114211431144case cGetVisibleChildrenCountPackage:1145PrintDebugString("[INFO]: ##### type == GetVisibleChildrenCountPackage");1146if (bufsize == (sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage))) {1147GetVisibleChildrenCountPackage *pkg =1148(GetVisibleChildrenCountPackage *) (buffer + sizeof(PackageType));1149pkg->rChildrenCount = windowsThreadEntryPoints->getVisibleChildrenCount ((jobject)pkg->accessibleContext);11501151PrintDebugString("[INFO]: ##### processing succeeded");1152} else {1153PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1154bufsize, sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage));1155}1156break;11571158case cGetVisibleChildrenPackage:1159PrintDebugString("[INFO]: ##### type == GetVisibleChildrenPackage");1160if (bufsize == (sizeof(PackageType) + sizeof(GetVisibleChildrenPackage))) {1161GetVisibleChildrenPackage *pkg =1162(GetVisibleChildrenPackage *) (buffer + sizeof(PackageType));1163pkg->rSuccess = windowsThreadEntryPoints->getVisibleChildren ((jobject)pkg->accessibleContext,1164pkg->startIndex,1165&(pkg->rVisibleChildrenInfo));11661167PrintDebugString("[INFO]: ##### processing succeeded");1168} else {1169PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1170bufsize, sizeof(PackageType) + sizeof(GetVisibleChildrenPackage));1171}1172break;11731174case cSetCaretPositionPackage:1175PrintDebugString("[INFO]: ##### type == SetCaretPositionPackage");1176if (bufsize == (sizeof(PackageType) + sizeof(SetCaretPositionPackage))) {1177SetCaretPositionPackage *pkg =1178(SetCaretPositionPackage *) (buffer + sizeof(PackageType));1179windowsThreadEntryPoints->setCaretPosition (1180(jobject)pkg->accessibleContext, pkg->position);1181PrintDebugString("[INFO]: ##### processing succeeded");1182} else {1183PrintDebugString("[ERROR]: ##### processing FAILED!! -> bufsize = %d; expectation = %d",1184bufsize, sizeof(PackageType) + sizeof(SetCaretPositionPackage));1185}1186break;11871188// ------------ end additional methods for Teton11891190// ------------ end Accessible KeyBindings, Icons and Actions11911192// ------------ Accessible Text packages ------------------11931194case cGetAccessibleTextInfoPackage:1195PrintDebugString("[INFO]: type == cGetAccessibleTextInfoPackage");1196if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage))) {1197GetAccessibleTextInfoPackage *pkg =1198(GetAccessibleTextInfoPackage *) (buffer + sizeof(PackageType));1199windowsThreadEntryPoints->getAccessibleTextInfo((jobject)pkg->AccessibleContext,1200&(pkg->rTextInfo), pkg->x, pkg->y);1201} else {1202PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1203bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage));1204}1205break;12061207case cGetAccessibleTextItemsPackage:1208PrintDebugString("[INFO]: type == cGetAccessibleTextItemsPackage");1209if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextItemsPackage))) {1210GetAccessibleTextItemsPackage *pkg =1211(GetAccessibleTextItemsPackage *) (buffer + sizeof(PackageType));1212windowsThreadEntryPoints->getAccessibleTextItems((jobject)pkg->AccessibleContext,1213&(pkg->rTextItemsInfo), pkg->index);1214} else {1215PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1216bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage));1217}1218break;12191220case cGetAccessibleTextSelectionInfoPackage:1221PrintDebugString("[INFO]: type == cGetAccessibleTextSelectionInfoPackage");1222if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage))) {1223GetAccessibleTextSelectionInfoPackage *pkg =1224(GetAccessibleTextSelectionInfoPackage *) (buffer + sizeof(PackageType));1225windowsThreadEntryPoints->getAccessibleTextSelectionInfo(1226(jobject)pkg->AccessibleContext, &(pkg->rTextSelectionItemsInfo));1227} else {1228PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1229bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage));1230}1231break;12321233case cGetAccessibleTextAttributeInfoPackage:1234PrintDebugString("[INFO]: type == cGetAccessibleTextAttributeInfoPackage");1235if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage))) {1236GetAccessibleTextAttributeInfoPackage *pkg =1237(GetAccessibleTextAttributeInfoPackage *) (buffer + sizeof(PackageType));1238windowsThreadEntryPoints->getAccessibleTextAttributes(1239(jobject)pkg->AccessibleContext, pkg->index, (AccessibleTextAttributesInfo *) &(pkg->rAttributeInfo));1240} else {1241PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1242bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage));1243}1244break;12451246case cGetAccessibleTextRectInfoPackage:1247PrintDebugString("[INFO]: type == cGetAccessibleTextRectInfoPackage");1248if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage))) {1249GetAccessibleTextRectInfoPackage *pkg =1250(GetAccessibleTextRectInfoPackage *) (buffer + sizeof(PackageType));1251windowsThreadEntryPoints->getAccessibleTextRect((jobject)pkg->AccessibleContext,1252&(pkg->rTextRectInfo), pkg->index);1253} else {1254PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1255bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage));1256}1257break;12581259case cGetCaretLocationPackage:1260PrintDebugString("[INFO]: type == cGetCaretLocationPackage");1261if (bufsize == (sizeof(PackageType) + sizeof(GetCaretLocationPackage))) {1262GetCaretLocationPackage *pkg =1263(GetCaretLocationPackage *) (buffer + sizeof(PackageType));1264windowsThreadEntryPoints->getCaretLocation((jobject)pkg->AccessibleContext,1265&(pkg->rTextRectInfo), pkg->index);1266} else {1267PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1268bufsize, sizeof(PackageType) + sizeof(GetCaretLocationPackage));1269}1270break;12711272case cGetAccessibleTextLineBoundsPackage:1273PrintDebugString("[INFO]: type == cGetAccessibleTextLineBoundsPackage");1274if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage))) {1275GetAccessibleTextLineBoundsPackage *pkg =1276(GetAccessibleTextLineBoundsPackage *) (buffer + sizeof(PackageType));1277windowsThreadEntryPoints->getAccessibleTextLineBounds((jobject)pkg->AccessibleContext,1278pkg->index, &(pkg->rLineStart), &(pkg->rLineEnd));1279} else {1280PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1281bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage));1282}1283break;12841285case cGetAccessibleTextRangePackage:1286PrintDebugString("[INFO]: type == cGetAccessibleTextRangePackage");1287if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage))) {1288GetAccessibleTextRangePackage *pkg =1289(GetAccessibleTextRangePackage *) (buffer + sizeof(PackageType));1290windowsThreadEntryPoints->getAccessibleTextRange((jobject)pkg->AccessibleContext,1291pkg->start, pkg->end, (wchar_t *) &(pkg->rText), (sizeof(pkg->rText) / sizeof(wchar_t)));1292} else {1293PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1294bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage));1295}1296break;129712981299// ------------ Accessible Value packages ------------------13001301case cGetCurrentAccessibleValueFromContextPackage:1302PrintDebugString("[INFO]: type == cGetCurrentAccessibleValueFromContextPackage");1303if (bufsize == (sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage))) {1304GetCurrentAccessibleValueFromContextPackage *pkg =1305(GetCurrentAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));1306windowsThreadEntryPoints->getCurrentAccessibleValueFromContext((jobject)pkg->AccessibleContext,1307(wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t)));1308} else {1309PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1310bufsize, sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage));1311}1312break;13131314case cGetMaximumAccessibleValueFromContextPackage:1315PrintDebugString("[INFO]: type == cGetMaximumAccessibleValueFromContextPackage");1316if (bufsize == (sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage))) {1317GetMaximumAccessibleValueFromContextPackage *pkg =1318(GetMaximumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));1319windowsThreadEntryPoints->getMaximumAccessibleValueFromContext((jobject)pkg->AccessibleContext,1320(wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t)));1321} else {1322PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1323bufsize, sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage));1324}1325break;13261327case cGetMinimumAccessibleValueFromContextPackage:1328PrintDebugString("[INFO]: type == cGetMinimumAccessibleValueFromContextPackage");1329if (bufsize == (sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage))) {1330GetMinimumAccessibleValueFromContextPackage *pkg =1331(GetMinimumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));1332windowsThreadEntryPoints->getMinimumAccessibleValueFromContext((jobject)pkg->AccessibleContext,1333(wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t)));1334} else {1335PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1336bufsize, sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage));1337}1338break;13391340// ------------ Accessible Selection packages ------------------13411342case cAddAccessibleSelectionFromContextPackage:1343PrintDebugString("[INFO]: type == cAddAccessibleSelectionFromContextPackage");1344if (bufsize == (sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage))) {1345AddAccessibleSelectionFromContextPackage *pkg =1346(AddAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));1347windowsThreadEntryPoints->addAccessibleSelectionFromContext((jobject)pkg->AccessibleContext,1348pkg->index);1349} else {1350PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1351bufsize, sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage));1352}1353break;13541355case cClearAccessibleSelectionFromContextPackage:1356PrintDebugString("[INFO]: type == cClearAccessibleSelectionFromContextPackage");1357if (bufsize == (sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage))) {1358ClearAccessibleSelectionFromContextPackage *pkg =1359(ClearAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));1360windowsThreadEntryPoints->clearAccessibleSelectionFromContext((jobject)pkg->AccessibleContext);1361} else {1362PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1363bufsize, sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage));1364}1365break;13661367case cGetAccessibleSelectionFromContextPackage:1368PrintDebugString("[INFO]: type == cGetAccessibleSelectionFromContextPackage");1369if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage))) {1370GetAccessibleSelectionFromContextPackage *pkg =1371(GetAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));1372pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleSelectionFromContext(1373(jobject)pkg->AccessibleContext, pkg->index);1374} else {1375PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1376bufsize, sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage));1377}1378break;13791380case cGetAccessibleSelectionCountFromContextPackage:1381PrintDebugString("[INFO]: type == cGetAccessibleSelectionCountFromContextPackage");1382if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage))) {1383GetAccessibleSelectionCountFromContextPackage *pkg =1384(GetAccessibleSelectionCountFromContextPackage *) (buffer + sizeof(PackageType));1385pkg->rCount = windowsThreadEntryPoints->getAccessibleSelectionCountFromContext(1386(jobject)pkg->AccessibleContext);1387} else {1388PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1389bufsize, sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage));1390}1391break;13921393case cIsAccessibleChildSelectedFromContextPackage:1394PrintDebugString("[INFO]: type == cIsAccessibleChildSelectedFromContextPackage");1395if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage))) {1396IsAccessibleChildSelectedFromContextPackage *pkg =1397(IsAccessibleChildSelectedFromContextPackage *) (buffer + sizeof(PackageType));1398pkg->rResult = windowsThreadEntryPoints->isAccessibleChildSelectedFromContext(1399(jobject)pkg->AccessibleContext, pkg->index);1400} else {1401PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1402bufsize, sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage));1403}1404break;14051406case cRemoveAccessibleSelectionFromContextPackage:1407PrintDebugString("[INFO]: type == cRemoveAccessibleSelectionFromContextPackage");1408if (bufsize == (sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage))) {1409RemoveAccessibleSelectionFromContextPackage *pkg =1410(RemoveAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));1411windowsThreadEntryPoints->removeAccessibleSelectionFromContext((jobject)pkg->AccessibleContext,1412pkg->index);1413} else {1414PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1415bufsize, sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage));1416}1417break;14181419case cSelectAllAccessibleSelectionFromContextPackage:1420PrintDebugString("[INFO]: type == cSelectAllAccessibleSelectionFromContextPackage");1421if (bufsize == (sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage))) {1422SelectAllAccessibleSelectionFromContextPackage *pkg =1423(SelectAllAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));1424windowsThreadEntryPoints->selectAllAccessibleSelectionFromContext((jobject)pkg->AccessibleContext);1425} else {1426PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1427bufsize, sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage));1428}1429break;143014311432// ------------ event notification management packages ------------------14331434case cAddJavaEventNotificationPackage:1435PrintDebugString("[INFO]: type = cAddJavaEventNotificationPackage");1436if (bufsize == (sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage))) {1437AddJavaEventNotificationPackage *pkg =1438(AddJavaEventNotificationPackage *) (buffer + sizeof(PackageType));1439addJavaEventNotification(pkg->type, (HWND)ABLongToHandle( pkg->DLLwindow ) );1440} else {1441PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1442bufsize, sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage));1443}1444break;14451446case cRemoveJavaEventNotificationPackage:1447PrintDebugString("[INFO]: type = cRemoveJavaEventNotificationPackage");1448if (bufsize == (sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage))) {1449RemoveJavaEventNotificationPackage *pkg =1450(RemoveJavaEventNotificationPackage *) (buffer + sizeof(PackageType));1451removeJavaEventNotification(pkg->type, (HWND)ABLongToHandle( pkg->DLLwindow ));1452} else {1453PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1454bufsize, sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage));1455}1456break;14571458case cAddAccessibilityEventNotificationPackage:1459PrintDebugString("[INFO]: type = cAddAccessibilityEventNotificationPackage");1460if (bufsize == (sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage))) {1461AddAccessibilityEventNotificationPackage *pkg =1462(AddAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType));1463addAccessibilityEventNotification(pkg->type, (HWND)ABLongToHandle(pkg->DLLwindow));1464} else {1465PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1466bufsize, sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage));1467}1468break;14691470case cRemoveAccessibilityEventNotificationPackage:1471PrintDebugString("[INFO]: type = cRemoveAccessibilityEventNotificationPackage");1472if (bufsize == (sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage))) {1473RemoveAccessibilityEventNotificationPackage *pkg =1474(RemoveAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType));1475removeAccessibilityEventNotification(pkg->type, (HWND)ABLongToHandle(pkg->DLLwindow));1476} else {1477PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",1478bufsize, sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage));1479}1480break;14811482default:1483PrintDebugString("[ERROR]: processing FAILED!! -> don't know how to handle type = %X", *type);1484returnVal = -1;1485break;1486}14871488PrintDebugString("[INFO]: package processing completed");1489return returnVal;1490}149114921493// -----------------------------149414951496/**1497* MemoryMappedFileCreated1498* - WindowsDLL letting us know it's created a memory-mapped file1499* for IPC. We need to open it and write a magic string into1500* it to let the WindowsDLL know all is OK. Also we need to1501* set up our own data structures to communicate with the1502* WindowsDLL1503*1504*/1505LRESULT1506JavaAccessBridge::MemoryMappedFileCreated(HWND ATBridgeDLLWindow, char *filename) {1507PrintDebugString("[INFO]: in MemoryMappedFileCreated(%p, %s)!", ATBridgeDLLWindow, filename);1508AccessBridgeATInstance *newAT =1509new AccessBridgeATInstance(dialogWindow, ATBridgeDLLWindow, filename, ATs);1510PrintDebugString("[INFO]: just created a new ATInstance = %p, old = %p", newAT, ATs);1511ATs = newAT;15121513LRESULT returnVal = ATs->initiateIPC();1514if (returnVal == 0) {1515PrintDebugString("[INFO]: Successfully initiated IPC with AT!!!");1516} else {1517PrintDebugString("[ERROR]: Failed to initiate IPC with AT!!!");1518}15191520return returnVal;1521}152215231524/**1525* WindowsATDestroyed - lets the JavaABDLL know a Windows AT disappeared1526*1527*/1528void1529JavaAccessBridge::WindowsATDestroyed(HWND ATBridgeDLLWindow) {1530PrintDebugString("[INFO]: in JavaAccessBridge::WindowsATDestroyed(%p)", ATBridgeDLLWindow);1531if (ATs == (AccessBridgeATInstance *) 0) {1532PrintDebugString("[ERROR]: -> ATs == 0! (shouldn't happen here)");1533return;1534}15351536AccessBridgeATInstance *currentAT = ATs;1537AccessBridgeATInstance *previousAT = ATs;1538if (ATs->winAccessBridgeWindow == ATBridgeDLLWindow) {1539ATs = ATs->nextATInstance;1540// remove event notification for this AT1541removeJavaEventNotification(currentAT->javaEventMask, ATBridgeDLLWindow);1542removeAccessibilityEventNotification(currentAT->accessibilityEventMask, ATBridgeDLLWindow);1543delete currentAT;1544PrintDebugString("[INFO]: data structures successfully removed");1545} else {1546while (currentAT != (AccessBridgeATInstance *) NULL) {1547if (currentAT->winAccessBridgeWindow == ATBridgeDLLWindow) {1548previousAT->nextATInstance = currentAT->nextATInstance;1549delete currentAT;1550PrintDebugString("[INFO]: data structures successfully removed");1551return;1552} else {1553previousAT = currentAT;1554currentAT = currentAT->nextATInstance;1555}1556}1557PrintDebugString("[ERROR]: couldn't find matching data structures!");1558}1559}156015611562// -----------------------------156315641565/**1566* releaseJavaObject - lets the JavaVM know it can release the Java Object1567*1568* Note: once you have made this call, the JavaVM will garbage collect1569* the jobject you pass in. If you later use that jobject in another1570* call, you will cause all maner of havoc!1571*1572*/1573void1574JavaAccessBridge::releaseJavaObject(jobject object) {1575PrintDebugString("[INFO]: In JavaAccessBridge::releaseJavaObject");1576PrintDebugString("[INFO]: object X: %p", object);1577if (windowsThreadJNIEnv != (JNIEnv *) 0) {1578windowsThreadJNIEnv->DeleteGlobalRef(object);1579PrintDebugString("[INFO]: global reference deleted.", object);1580} else {1581PrintDebugString("[ERROR]: windowsThreadJNIEnv == 0");1582}1583}15841585// -----------------------------15861587/**1588* addJavaEventNotification - this AT now wants this type of events1589*1590*/1591void1592JavaAccessBridge::addJavaEventNotification(jlong type, HWND DLLwindow) {1593// walk through list of ATs, find this one and add this type1594// and, if we weren't listening for these before, ask Java for 'em1595PrintDebugString("[INFO]: adding Java event type %016I64X to HWND %p", type, DLLwindow);1596AccessBridgeATInstance *ati = ATs;1597long globalEventMask = 0;1598while (ati != (AccessBridgeATInstance *) 0) {1599if (ati->winAccessBridgeWindow == DLLwindow) {1600ati->javaEventMask |= type;1601PrintDebugString("[INFO]: found HWND, javaEventMask now is %X", ati->javaEventMask);1602} else {1603globalEventMask |= ati->javaEventMask;1604}1605ati = ati->nextATInstance;1606}1607PrintDebugString("[INFO]: union of all Java AT event masks: %X", globalEventMask);1608if (!(globalEventMask & type)) {1609// no other ATs wanted this event;1610// start getting them from Java1611PrintDebugString("[INFO]: no other AT wanted this Java event (so not registered); adding to AccessBridge.java");1612windowsThreadEntryPoints->addJavaEventNotification(type);1613}1614}16151616/**1617* removeJavaEventNotification - this AT no longer wants this type of events1618*1619*/1620void1621JavaAccessBridge::removeJavaEventNotification(jlong type, HWND DLLwindow) {1622// walk through list of ATs, find this one and remove this type1623// and, if no other AT wants 'em either, tell Java we no longer want 'em1624PrintDebugString("[INFO]: removing Java event type %016I64X from HWND %p", type, DLLwindow);1625AccessBridgeATInstance *ati = ATs;1626long globalEventMask = 0;1627while (ati != (AccessBridgeATInstance *) 0) {1628if (ati->winAccessBridgeWindow == DLLwindow) {1629ati->javaEventMask &= (0xFFFFFFFF - type);1630PrintDebugString("[INFO]: found HWND, javaEventMask now is %X", ati->javaEventMask);1631} else {1632globalEventMask |= ati->javaEventMask;1633}1634ati = ati->nextATInstance;1635}1636PrintDebugString("[INFO]: union of all Java AT event masks: %X", globalEventMask);1637if (!(globalEventMask & type)) {1638// no other ATs wanted this event;1639// stop getting them from Java1640PrintDebugString("[INFO]: no other AT wanted this Java event (so can remove); removing from AccessBridge.java");1641windowsThreadEntryPoints->removeJavaEventNotification(type);1642}1643}164416451646/**1647* addAccesibilityEventNotification - this AT now wants this type of events1648*1649*/1650void1651JavaAccessBridge::addAccessibilityEventNotification(jlong type, HWND DLLwindow) {1652// walk through list of ATs, find this one and add this type1653// and, if we weren't listening for these before, ask Java for 'em1654PrintDebugString("[INFO]: adding Accesibility event type %016I64X to HWND %p", type, DLLwindow);1655AccessBridgeATInstance *ati = ATs;1656long globalEventMask = 0;1657while (ati != (AccessBridgeATInstance *) 0) {1658if (ati->winAccessBridgeWindow == DLLwindow) {1659ati->accessibilityEventMask |= type;1660PrintDebugString("[INFO]: found HWND, accessibilityEventMask now is %X", ati->accessibilityEventMask);1661} else {1662globalEventMask |= ati->accessibilityEventMask;1663}1664ati = ati->nextATInstance;1665}1666PrintDebugString("[INFO]: union of all Accessibility AT event masks: %X", globalEventMask);1667if (!(globalEventMask & type)) {1668// no other ATs wanted this event;1669// start getting them from Java1670PrintDebugString("[INFO]: no other AT wanted this Accesibility event (so not registered); adding to AccessBridge.java");1671windowsThreadEntryPoints->addAccessibilityEventNotification(type);1672}1673}16741675/**1676* removeAccesibilityEventNotification - this AT no longer wants this type of events1677*1678*/1679void1680JavaAccessBridge::removeAccessibilityEventNotification(jlong type, HWND DLLwindow) {1681// walk through list of ATs, find this one and remove this type1682// and, if no other AT wants 'em either, tell Java we no longer want 'em1683PrintDebugString("[INFO]: removing Accesibility event type %016I64X from HWND %p", type, DLLwindow);1684AccessBridgeATInstance *ati = ATs;1685long globalEventMask = 0;1686while (ati != (AccessBridgeATInstance *) 0) {1687if (ati->winAccessBridgeWindow == DLLwindow) {1688ati->accessibilityEventMask &= (0xFFFFFFFF - type);1689PrintDebugString("[INFO]: found HWND, accessibilityEventMask now is %X", ati->accessibilityEventMask);1690} else {1691globalEventMask |= ati->accessibilityEventMask;1692}1693ati = ati->nextATInstance;1694}1695PrintDebugString("[INFO]: union of all Accessibility AT event masks: %X", globalEventMask);1696if (!(globalEventMask & type)) {1697// no other ATs wanted this event;1698// stop getting them from Java1699PrintDebugString("[INFO]: no other AT wanted this Accessibility event (so can remove); removing from AccessBridge.java");1700windowsThreadEntryPoints->removeAccessibilityEventNotification(type);1701}1702}17031704170517061707/**1708* firePropertyCaretChange1709*1710*/1711void1712JavaAccessBridge::firePropertyCaretChange(JNIEnv *env, jobject callingObj,1713jobject event, jobject source,1714jint oldValue, jint newValue) {17151716PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyCaretChanged(%p, %p, %p, %p, %d, %d)",1717env, callingObj, event,1718source, oldValue, newValue);17191720// sanity check1721if (ATs == (AccessBridgeATInstance *) 0) {1722PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");1723return; // panic!1724}17251726// common setup1727char buffer[sizeof(PackageType) + sizeof(PropertyCaretChangePackage)];1728PackageType *type = (PackageType *) buffer;1729PropertyCaretChangePackage *pkg = (PropertyCaretChangePackage *) (buffer + sizeof(PackageType));1730*type = cPropertyCaretChangePackage;1731pkg->vmID = (long) dialogWindow;17321733// make new Global Refs and send events only to those ATs that want 'em1734AccessBridgeATInstance *ati = ATs;1735while (ati != (AccessBridgeATInstance *) 0) {1736if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) {17371738PrintDebugString("[INFO]: sending to AT");17391740// make new GlobalRefs for this AT1741pkg->Event = (JOBJECT64)env->NewGlobalRef(event);1742pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);1743#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1744PrintDebugString("[INFO]: GlobalRef'd Event: %p"\1745" GlobalRef'd Source: %p", pkg->Event, pkg->AccessibleContextSource);1746#else // JOBJECT64 is jlong (64 bit)1747PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\1748" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);1749#endif17501751pkg->oldPosition = oldValue;1752pkg->newPosition = newValue;17531754ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyCaretChangeEvent);1755}1756ati = ati->nextATInstance;1757}1758PrintDebugString("[INFO]: done with propertyCaretChange event");1759}17601761/**1762* firePropertyDescriptionChange1763*1764*/1765void1766JavaAccessBridge::firePropertyDescriptionChange(JNIEnv *env, jobject callingObj,1767jobject event, jobject source,1768jstring oldValue, jstring newValue){17691770PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyDescriptionChanged(%p, %p, %p, %p, %p, %p)",1771env, callingObj, event,1772source, oldValue, newValue);17731774// sanity check1775if (ATs == (AccessBridgeATInstance *) 0) {1776PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");1777return; // panic!1778}17791780// common setup1781const wchar_t *stringBytes;1782char buffer[sizeof(PackageType) + sizeof(PropertyDescriptionChangePackage)];1783PackageType *type = (PackageType *) buffer;1784PropertyDescriptionChangePackage *pkg = (PropertyDescriptionChangePackage *) (buffer + sizeof(PackageType));1785*type = cPropertyDescriptionChangePackage;1786pkg->vmID = (long) dialogWindow;17871788// make new Global Refs and send events only to those ATs that want 'em1789AccessBridgeATInstance *ati = ATs;1790while (ati != (AccessBridgeATInstance *) 0) {1791if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) {17921793PrintDebugString("[INFO]: sending to AT");17941795// make new GlobalRefs for this AT1796pkg->Event = (JOBJECT64)env->NewGlobalRef(event);1797pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);1798#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1799PrintDebugString("[INFO]: GlobalRef'd Event: %p"\1800" GlobalRef'd Source: %p", pkg->Event, pkg->AccessibleContextSource);1801#else // JOBJECT64 is jlong (64 bit)1802PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\1803" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);1804#endif18051806if (oldValue != (jstring) 0) {1807stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);1808if (stringBytes == NULL) {1809if (!env->ExceptionCheck()) {1810jclass cls = env->FindClass("java/lang/OutOfMemoryError");1811if (cls != NULL) {1812env->ThrowNew(cls, NULL);1813}1814}1815return;1816}1817wcsncpy(pkg->oldDescription, stringBytes, (sizeof(pkg->oldDescription) / sizeof(wchar_t)));1818env->ReleaseStringChars(oldValue, stringBytes);1819} else {1820wcsncpy(pkg->oldDescription, L"(null)", (sizeof(pkg->oldDescription) / sizeof(wchar_t)));1821}18221823if (newValue != (jstring) 0) {1824stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);1825if (stringBytes == NULL) {1826if (!env->ExceptionCheck()) {1827jclass cls = env->FindClass("java/lang/OutOfMemoryError");1828if (cls != NULL) {1829env->ThrowNew(cls, NULL);1830}1831}1832return;1833}1834wcsncpy(pkg->newDescription, stringBytes, (sizeof(pkg->newDescription) / sizeof(wchar_t)));1835env->ReleaseStringChars(newValue, stringBytes);1836} else {1837wcsncpy(pkg->newDescription, L"(null)", (sizeof(pkg->newDescription) / sizeof(wchar_t)));1838}18391840ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyDescriptionChangeEvent);1841}1842ati = ati->nextATInstance;1843}1844PrintDebugString("[INFO]: done with propertyDescriptionChange event");1845}18461847/**1848* firePropertyNameChange1849*1850*/1851void1852JavaAccessBridge::firePropertyNameChange(JNIEnv *env, jobject callingObj,1853jobject event, jobject source,1854jstring oldValue, jstring newValue){18551856PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyNameChanged(%p, %p, %p, %p, %p, %p)",1857env, callingObj, event,1858source, oldValue, newValue);18591860// sanity check1861if (ATs == (AccessBridgeATInstance *) 0) {1862PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");1863return; // panic!1864}18651866// common setup1867const wchar_t *stringBytes;1868char buffer[sizeof(PackageType) + sizeof(PropertyNameChangePackage)];1869PackageType *type = (PackageType *) buffer;1870PropertyNameChangePackage *pkg = (PropertyNameChangePackage *) (buffer + sizeof(PackageType));1871*type = cPropertyNameChangePackage;1872pkg->vmID = (long) dialogWindow;18731874// make new Global Refs and send events only to those ATs that want 'em1875AccessBridgeATInstance *ati = ATs;1876while (ati != (AccessBridgeATInstance *) 0) {1877if (ati->accessibilityEventMask & cPropertyNameChangeEvent) {18781879PrintDebugString("[INFO]: sending to AT");18801881// make new GlobalRefs for this AT1882pkg->Event = (JOBJECT64)env->NewGlobalRef(event);1883pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);1884#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1885PrintDebugString("[INFO]: GlobalRef'd Event: %p"\1886" GlobalRef'd Source: %p", pkg->Event, pkg->AccessibleContextSource);1887#else // JOBJECT64 is jlong (64 bit)1888PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\1889" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);1890#endif18911892if (oldValue != (jstring) 0) {1893stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);1894if (stringBytes == NULL) {1895if (!env->ExceptionCheck()) {1896jclass cls = env->FindClass("java/lang/OutOfMemoryError");1897if (cls != NULL) {1898env->ThrowNew(cls, NULL);1899}1900}1901return;1902}1903wcsncpy(pkg->oldName, stringBytes, (sizeof(pkg->oldName) / sizeof(wchar_t)));1904env->ReleaseStringChars(oldValue, stringBytes);1905} else {1906wcsncpy(pkg->oldName, L"(null)", (sizeof(pkg->oldName) / sizeof(wchar_t)));1907}19081909if (newValue != (jstring) 0) {1910stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);1911if (stringBytes == NULL) {1912if (!env->ExceptionCheck()) {1913jclass cls = env->FindClass("java/lang/OutOfMemoryError");1914if (cls != NULL) {1915env->ThrowNew(cls, NULL);1916}1917}1918return;1919}1920wcsncpy(pkg->newName, stringBytes, (sizeof(pkg->newName) / sizeof(wchar_t)));1921env->ReleaseStringChars(newValue, stringBytes);1922} else {1923wcsncpy(pkg->newName, L"(null)", (sizeof(pkg->newName) / sizeof(wchar_t)));1924}19251926ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyNameChangeEvent);1927}1928ati = ati->nextATInstance;1929}1930PrintDebugString("[INFO]: done with propertyNameChange event");1931}193219331934/**1935* firePropertySelectionChange1936*1937*/1938void1939JavaAccessBridge::firePropertySelectionChange(JNIEnv *env, jobject callingObj,1940jobject event, jobject source) {19411942PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertySelectionChanged(%p, %p, %p, %p)",1943env, callingObj, event, source);19441945// sanity check1946if (ATs == (AccessBridgeATInstance *) 0) {1947PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");1948return; // panic!1949}19501951// common setup1952char buffer[sizeof(PackageType) + sizeof(PropertySelectionChangePackage)];1953PackageType *type = (PackageType *) buffer;1954PropertySelectionChangePackage *pkg = (PropertySelectionChangePackage *) (buffer + sizeof(PackageType));1955*type = cPropertySelectionChangePackage;1956pkg->vmID = (long) dialogWindow;19571958// make new Global Refs and send events only to those ATs that want 'em1959AccessBridgeATInstance *ati = ATs;1960while (ati != (AccessBridgeATInstance *) 0) {1961if (ati->accessibilityEventMask & cPropertySelectionChangeEvent) {19621963PrintDebugString("[INFO]: sending to AT");19641965// make new GlobalRefs for this AT1966pkg->Event = (JOBJECT64)env->NewGlobalRef(event);1967pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);1968#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1969PrintDebugString("[INFO]: GlobalRef'd Event: %p"\1970" GlobalRef'd Source: %p", pkg->Event, pkg->AccessibleContextSource);1971#else // JOBJECT64 is jlong (64 bit)1972PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\1973" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);1974#endif19751976ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertySelectionChangeEvent);1977}1978ati = ati->nextATInstance;1979}1980PrintDebugString("[INFO]: done with propertySelectionChange event");1981}198219831984/**1985* firePropertyStateChange1986*1987*/1988void1989JavaAccessBridge::firePropertyStateChange(JNIEnv *env, jobject callingObj,1990jobject event, jobject source,1991jstring oldValue, jstring newValue){19921993PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyStateChanged(%p, %p, %p, %p, %p, %p)",1994env, callingObj, event,1995source, oldValue, newValue);19961997// sanity check1998if (ATs == (AccessBridgeATInstance *) 0) {1999PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");2000return; // panic!2001}20022003// common setup2004const wchar_t *stringBytes;2005char buffer[sizeof(PackageType) + sizeof(PropertyStateChangePackage)];2006PackageType *type = (PackageType *) buffer;2007PropertyStateChangePackage *pkg = (PropertyStateChangePackage *) (buffer + sizeof(PackageType));2008*type = cPropertyStateChangePackage;2009pkg->vmID = (long) dialogWindow;20102011// make new Global Refs and send events only to those ATs that want 'em2012AccessBridgeATInstance *ati = ATs;2013while (ati != (AccessBridgeATInstance *) 0) {2014if (ati->accessibilityEventMask & cPropertyStateChangeEvent) {20152016PrintDebugString("[INFO]: sending to AT");20172018// make new GlobalRefs for this AT2019pkg->Event = (JOBJECT64)env->NewGlobalRef(event);2020pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);2021#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2022PrintDebugString("[INFO]: GlobalRef'd Event: %p"\2023" GlobalRef'd Source: %p", pkg->Event, pkg->AccessibleContextSource);2024#else // JOBJECT64 is jlong (64 bit)2025PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\2026" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);2027#endif20282029if (oldValue != (jstring) 0) {2030stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);2031if (stringBytes == NULL) {2032if (!env->ExceptionCheck()) {2033jclass cls = env->FindClass("java/lang/OutOfMemoryError");2034if (cls != NULL) {2035env->ThrowNew(cls, NULL);2036}2037}2038return;2039}2040wcsncpy(pkg->oldState, stringBytes, (sizeof(pkg->oldState) / sizeof(wchar_t)));2041env->ReleaseStringChars(oldValue, stringBytes);2042} else {2043wcsncpy(pkg->oldState, L"(null)", (sizeof(pkg->oldState) / sizeof(wchar_t)));2044}20452046if (newValue != (jstring) 0) {2047stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);2048if (stringBytes == NULL) {2049if (!env->ExceptionCheck()) {2050jclass cls = env->FindClass("java/lang/OutOfMemoryError");2051if (cls != NULL) {2052env->ThrowNew(cls, NULL);2053}2054}2055return;2056}2057wcsncpy(pkg->newState, stringBytes, (sizeof(pkg->newState) / sizeof(wchar_t)));2058env->ReleaseStringChars(newValue, stringBytes);2059} else {2060wcsncpy(pkg->newState, L"(null)", (sizeof(pkg->newState) / sizeof(wchar_t)));2061}20622063ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyStateChangeEvent);2064}2065ati = ati->nextATInstance;2066}2067PrintDebugString("[INFO]: done with propertyStateChange event");2068}206920702071/**2072* firePropertyTextChange2073*2074*/2075void2076JavaAccessBridge::firePropertyTextChange(JNIEnv *env, jobject callingObj,2077jobject event, jobject source) {20782079PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyTextChanged(%p, %p, %p, %p)",2080env, callingObj, event, source);20812082// sanity check2083if (ATs == (AccessBridgeATInstance *) 0) {2084PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");2085return; // panic!2086}20872088// common setup2089char buffer[sizeof(PackageType) + sizeof(PropertyTextChangePackage)];2090PackageType *type = (PackageType *) buffer;2091PropertyTextChangePackage *pkg = (PropertyTextChangePackage *) (buffer + sizeof(PackageType));2092*type = cPropertyTextChangePackage;2093pkg->vmID = (long) dialogWindow;20942095// make new Global Refs and send events only to those ATs that want 'em2096AccessBridgeATInstance *ati = ATs;2097while (ati != (AccessBridgeATInstance *) 0) {2098if (ati->accessibilityEventMask & cPropertyTextChangeEvent) {20992100PrintDebugString("[INFO]: sending to AT");21012102// make new GlobalRefs for this AT2103pkg->Event = (JOBJECT64)env->NewGlobalRef(event);2104pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);2105#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2106PrintDebugString("[INFO]: GlobalRef'd Event: %p"\2107" GlobalRef'd Source: %p",pkg->Event, pkg->AccessibleContextSource);2108#else // JOBJECT64 is jlong (64 bit)2109PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\2110" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);2111#endif21122113ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTextChangeEvent);2114}2115ati = ati->nextATInstance;2116}2117PrintDebugString("[INFO]: done with propertyTextChange event");2118}211921202121/**2122* firePropertyValueChange2123*2124*/2125void2126JavaAccessBridge::firePropertyValueChange(JNIEnv *env, jobject callingObj,2127jobject event, jobject source,2128jstring oldValue, jstring newValue){21292130PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyValueChanged(%p, %p, %p, %p, %p, %p)",2131env, callingObj, event,2132source, oldValue, newValue);21332134// sanity check2135if (ATs == (AccessBridgeATInstance *) 0) {2136PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");2137return; // panic!2138}21392140// common setup2141const wchar_t *stringBytes;2142char buffer[sizeof(PackageType) + sizeof(PropertyValueChangePackage)];2143PackageType *type = (PackageType *) buffer;2144PropertyValueChangePackage *pkg = (PropertyValueChangePackage *) (buffer + sizeof(PackageType));2145*type = cPropertyValueChangePackage;2146pkg->vmID = (long) dialogWindow;21472148// make new Global Refs and send events only to those ATs that want 'em2149AccessBridgeATInstance *ati = ATs;2150while (ati != (AccessBridgeATInstance *) 0) {2151if (ati->accessibilityEventMask & cPropertyValueChangeEvent) {21522153PrintDebugString("[INFO]: sending to AT");21542155// make new GlobalRefs for this AT2156pkg->Event = (JOBJECT64)env->NewGlobalRef(event);2157pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);2158#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2159PrintDebugString("[INFO]: GlobalRef'd Event: %p"\2160" GlobalRef'd Source: %p", pkg->Event, pkg->AccessibleContextSource);2161#else // JOBJECT64 is jlong (64 bit)2162PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\2163" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);2164#endif21652166if (oldValue != (jstring) 0) {2167stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);2168if (stringBytes == NULL) {2169if (!env->ExceptionCheck()) {2170jclass cls = env->FindClass("java/lang/OutOfMemoryError");2171if (cls != NULL) {2172env->ThrowNew(cls, NULL);2173}2174}2175return;2176}2177wcsncpy(pkg->oldValue, stringBytes, (sizeof(pkg->oldValue) / sizeof(wchar_t)));2178env->ReleaseStringChars(oldValue, stringBytes);2179} else {2180wcsncpy(pkg->oldValue, L"(null)", (sizeof(pkg->oldValue) / sizeof(wchar_t)));2181}21822183if (newValue != (jstring) 0) {2184stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);2185if (stringBytes == NULL) {2186if (!env->ExceptionCheck()) {2187jclass cls = env->FindClass("java/lang/OutOfMemoryError");2188if (cls != NULL) {2189env->ThrowNew(cls, NULL);2190}2191}2192return;2193}2194wcsncpy(pkg->newValue, stringBytes, (sizeof(pkg->newValue) / sizeof(wchar_t)));2195env->ReleaseStringChars(newValue, stringBytes);2196} else {2197wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t)));2198}21992200ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyValueChangeEvent);2201}2202ati = ati->nextATInstance;2203}2204PrintDebugString("[INFO]: done with propertyValueChange event");2205}22062207/**2208* firePropertyVisibleDataChange2209*2210*/2211void2212JavaAccessBridge::firePropertyVisibleDataChange(JNIEnv *env, jobject callingObj,2213jobject event, jobject source) {22142215PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyVisibleDataChanged(%p, %p, %p, %p)",2216env, callingObj, event, source);22172218// sanity check2219if (ATs == (AccessBridgeATInstance *) 0) {2220PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");2221return; // panic!2222}22232224// common setup2225char buffer[sizeof(PackageType) + sizeof(PropertyVisibleDataChangePackage)];2226PackageType *type = (PackageType *) buffer;2227PropertyVisibleDataChangePackage *pkg = (PropertyVisibleDataChangePackage *) (buffer + sizeof(PackageType));2228*type = cPropertyVisibleDataChangePackage;2229pkg->vmID = (long) dialogWindow;22302231// make new Global Refs and send events only to those ATs that want 'em2232AccessBridgeATInstance *ati = ATs;2233while (ati != (AccessBridgeATInstance *) 0) {2234if (ati->accessibilityEventMask & cPropertyVisibleDataChangeEvent) {22352236PrintDebugString("[INFO]: sending to AT");22372238// make new GlobalRefs for this AT2239pkg->Event = (JOBJECT64)env->NewGlobalRef(event);2240pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);2241#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2242PrintDebugString("[INFO]: GlobalRef'd Event: %p"\2243" GlobalRef'd Source: %p", pkg->Event, pkg->AccessibleContextSource);2244#else // JOBJECT64 is jlong (64 bit)2245PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\2246" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);2247#endif22482249ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyVisibleDataChangeEvent);2250}2251ati = ati->nextATInstance;2252}2253PrintDebugString("[INFO]: done with propertyVisibleDataChange event");2254}225522562257/**2258* firePropertyChildChange2259*2260*/2261void2262JavaAccessBridge::firePropertyChildChange(JNIEnv *env, jobject callingObj,2263jobject event, jobject source,2264jobject oldValue, jobject newValue){22652266PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyChildPropertyChanged(%p, %p, %p, %p, %p, %p)",2267env, callingObj, event,2268source, oldValue, newValue);22692270// sanity check2271if (ATs == (AccessBridgeATInstance *) 0) {2272PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");2273return; // panic!2274}22752276// common setup2277char buffer[sizeof(PackageType) + sizeof(PropertyChildChangePackage)];2278PackageType *type = (PackageType *) buffer;2279PropertyChildChangePackage *pkg = (PropertyChildChangePackage *) (buffer + sizeof(PackageType));2280*type = cPropertyChildChangePackage;2281pkg->vmID = (long) dialogWindow;22822283// make new Global Refs and send events only to those ATs that want 'em2284AccessBridgeATInstance *ati = ATs;2285while (ati != (AccessBridgeATInstance *) 0) {2286if (ati->accessibilityEventMask & cPropertyChildChangeEvent) {22872288PrintDebugString("[INFO]: sending to AT");22892290// make new GlobalRefs for this AT2291pkg->Event = (JOBJECT64)env->NewGlobalRef(event);2292pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);2293pkg->oldChildAccessibleContext = (JOBJECT64)env->NewGlobalRef(oldValue);2294pkg->newChildAccessibleContext = (JOBJECT64)env->NewGlobalRef(newValue);2295#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2296PrintDebugString("[INFO]: GlobalRef'd Event: %p"\2297" GlobalRef'd Source: %p"\2298" GlobalRef'd OldChildAC: %p"\2299" GlobalRef'd NewChildAC: %p"\2300, pkg->Event, pkg->AccessibleContextSource, pkg->oldChildAccessibleContext, pkg->newChildAccessibleContext);2301#else // JOBJECT64 is jlong (64 bit)2302PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\2303" GlobalRef'd Source: %016I64X"\2304" GlobalRef'd OldChildAC: %016I64X"\2305" GlobalRef'd NewChildAC: %016I64X"\2306, pkg->Event, pkg->AccessibleContextSource, pkg->oldChildAccessibleContext, pkg->newChildAccessibleContext);2307#endif23082309ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyChildChangeEvent);2310}2311ati = ati->nextATInstance;2312}2313PrintDebugString("[INFO]: done with propertyChildChange event");2314}231523162317/**2318* firePropertyActiveDescendentChange2319*2320*/2321void2322JavaAccessBridge::firePropertyActiveDescendentChange(JNIEnv *env, jobject callingObj,2323jobject event, jobject source,2324jobject oldValue, jobject newValue){23252326PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyActiveDescendentPropertyChanged(%p, %p, %p, %p, %p, %p)",2327env, callingObj, event,2328source, oldValue, newValue);23292330// sanity check2331if (ATs == (AccessBridgeATInstance *) 0) {2332PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");2333return; // panic!2334}23352336// common setup2337char buffer[sizeof(PackageType) + sizeof(PropertyActiveDescendentChangePackage)];2338PackageType *type = (PackageType *) buffer;2339PropertyActiveDescendentChangePackage *pkg = (PropertyActiveDescendentChangePackage *) (buffer + sizeof(PackageType));2340*type = cPropertyActiveDescendentChangePackage;2341pkg->vmID = (long) dialogWindow;23422343// make new Global Refs and send events only to those ATs that want 'em2344AccessBridgeATInstance *ati = ATs;2345while (ati != (AccessBridgeATInstance *) 0) {2346if (ati->accessibilityEventMask & cPropertyActiveDescendentChangeEvent) {23472348PrintDebugString("[INFO]: sending to AT");23492350// make new GlobalRefs for this AT2351pkg->Event = (JOBJECT64)env->NewGlobalRef(event);2352pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);2353pkg->oldActiveDescendentAccessibleContext = (JOBJECT64)env->NewGlobalRef(oldValue);2354pkg->newActiveDescendentAccessibleContext = (JOBJECT64)env->NewGlobalRef(newValue);2355#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2356PrintDebugString("[INFO]: GlobalRef'd Event: %p"\2357" GlobalRef'd Source: %p"\2358" GlobalRef'd OldActiveDescendentAC: %p"\2359" GlobalRef'd NewActiveDescendentAC: %p"\2360, pkg->Event, pkg->AccessibleContextSource, pkg->oldActiveDescendentAccessibleContext, pkg->newActiveDescendentAccessibleContext);2361#else // JOBJECT64 is jlong (64 bit)2362PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\2363" GlobalRef'd Source: %016I64X"\2364" GlobalRef'd OldActiveDescendentAC: %016I64X"\2365" GlobalRef'd NewActiveDescendentAC: %016I64X"\2366, pkg->Event, pkg->AccessibleContextSource, pkg->oldActiveDescendentAccessibleContext, pkg->newActiveDescendentAccessibleContext);2367#endif23682369ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyActiveDescendentChangeEvent);2370}2371ati = ati->nextATInstance;2372}2373PrintDebugString("[INFO]: done with propertyActiveChange event");2374}23752376/**2377* firePropertyValueChange2378*2379*/2380void2381JavaAccessBridge::firePropertyTableModelChange(JNIEnv *env, jobject callingObj,2382jobject event, jobject source,2383jstring oldValue, jstring newValue){23842385PrintDebugString("[INFO]: Java_com_sun_java_accessibility_internal_AccessBridge_propertyTableModelChange(%p, %p, %p, %p, %p, %p)",2386env, callingObj, event,2387source, oldValue, newValue);23882389// sanity check2390if (ATs == (AccessBridgeATInstance *) 0) {2391PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");2392return; // panic!2393}23942395// common setup2396const wchar_t *stringBytes;2397char buffer[sizeof(PackageType) + sizeof(PropertyTableModelChangePackage)];2398PackageType *type = (PackageType *) buffer;2399PropertyTableModelChangePackage *pkg = (PropertyTableModelChangePackage *) (buffer + sizeof(PackageType));2400*type = cPropertyTableModelChangePackage;2401pkg->vmID = (long) dialogWindow;24022403// make new Global Refs and send events only to those ATs that want 'em2404AccessBridgeATInstance *ati = ATs;2405while (ati != (AccessBridgeATInstance *) 0) {2406if (ati->accessibilityEventMask & cPropertyTableModelChangeEvent) {24072408PrintDebugString(" sending to AT");24092410// make new GlobalRefs for this AT2411pkg->Event = (JOBJECT64)env->NewGlobalRef(event);2412pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);2413#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2414PrintDebugString("[INFO]: GlobalRef'd Event: %p"\2415" GlobalRef'd Source: %p", pkg->Event, pkg->AccessibleContextSource);2416#else // JOBJECT64 is jlong (64 bit)2417PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\2418" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);2419#endif24202421if (oldValue != (jstring) 0) {2422stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);2423if (stringBytes == NULL) {2424if (!env->ExceptionCheck()) {2425jclass cls = env->FindClass("java/lang/OutOfMemoryError");2426if (cls != NULL) {2427env->ThrowNew(cls, NULL);2428}2429}2430return;2431}2432wcsncpy(pkg->oldValue, stringBytes, (sizeof(pkg->oldValue) / sizeof(wchar_t)));2433env->ReleaseStringChars(oldValue, stringBytes);2434} else {2435wcsncpy(pkg->oldValue, L"(null)", (sizeof(pkg->oldValue) / sizeof(wchar_t)));2436}24372438if (newValue != (jstring) 0) {2439stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);2440if (stringBytes == NULL) {2441if (!env->ExceptionCheck()) {2442jclass cls = env->FindClass("java/lang/OutOfMemoryError");2443if (cls != NULL) {2444env->ThrowNew(cls, NULL);2445}2446}2447return;2448}2449wcsncpy(pkg->newValue, stringBytes, (sizeof(pkg->newValue) / sizeof(wchar_t)));2450env->ReleaseStringChars(newValue, stringBytes);2451} else {2452wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t)));2453}24542455ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTableModelChangeEvent);2456}2457ati = ati->nextATInstance;2458}2459PrintDebugString("[INFO]: done with propertyTableModelChange event");2460}2461246224632464#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2465#define PRINT_GLOBALREFS() \2466PrintDebugString("[INFO]: GlobalRef'd Event: %p"\2467" GlobalRef'd Source: %p", pkg->Event, pkg->AccessibleContextSource);2468#else // JOBJECT64 is jlong (64 bit)2469#define PRINT_GLOBALREFS() \2470PrintDebugString("[INFO]: GlobalRef'd Event: %016I64X"\2471" GlobalRef'd Source: %016I64X", pkg->Event, pkg->AccessibleContextSource);2472#endif24732474#define FIRE_EVENT(function, packageStruct, packageConstant, eventConstant) \2475void JavaAccessBridge::function(JNIEnv *env, jobject callingObj, \2476jobject eventObj, jobject source) { \2477\2478PrintDebugString("[INFO]: Firing event id = %d(%p, %p, %p, %p); vmID = %X", \2479eventConstant, env, callingObj, eventObj, source, dialogWindow);\2480\2481/* sanity check */ \2482if (ATs == (AccessBridgeATInstance *) 0) { \2483PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)"); \2484return; /* panic! */ \2485} \2486\2487/* common setup */ \2488char buffer[sizeof(PackageType) + sizeof(packageStruct)]; \2489PackageType *type = (PackageType *) buffer; \2490packageStruct *pkg = (packageStruct *) (buffer + sizeof(PackageType)); \2491*type = packageConstant; \2492pkg->vmID = (long) dialogWindow; \2493\2494/* make new Global Refs, send events only to those ATs that want 'em */ \2495AccessBridgeATInstance *ati = ATs; \2496while (ati != (AccessBridgeATInstance *) 0) { \2497PrintDebugString("[INFO]: javaEventMask = %X eventConstant=%d pkg->vmID=%X",\2498ati->javaEventMask, eventConstant, pkg->vmID ); \2499if (ati->javaEventMask & eventConstant) { \2500\2501PrintDebugString("[INFO]: sending to AT"); \2502/* make new GlobalRefs for this AT */ \2503pkg->Event = (JOBJECT64)env->NewGlobalRef(eventObj); \2504pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source); \2505PRINT_GLOBALREFS() \2506\2507ati->sendJavaEventPackage(buffer, sizeof(buffer), eventConstant); \2508} \2509ati = ati->nextATInstance; \2510} \2511PrintDebugString("[INFO]: done with firing AWT event"); \2512}25132514void JavaAccessBridge::javaShutdown(JNIEnv *env, jobject callingObj) {25152516PrintDebugString("[INFO]: Firing event id = %d(%p, %p); vmID = %X",2517cJavaShutdownEvent, env, callingObj, dialogWindow);25182519/* sanity check */2520if (ATs == (AccessBridgeATInstance *) 0) {2521PrintDebugString("[ERROR]: ATs == 0! (shouldn't happen here!)");2522return; /* panic! */2523}25242525/* common setup */2526char buffer[sizeof(PackageType) + sizeof(JavaShutdownPackage)];2527PackageType *type = (PackageType *) buffer;2528JavaShutdownPackage *pkg = (JavaShutdownPackage *) (buffer + sizeof(PackageType));2529*type = cJavaShutdownPackage;2530pkg->vmID = (long) dialogWindow;25312532/* make new Global Refs, send events only to those ATs that want 'em */2533AccessBridgeATInstance *ati = ATs;2534while (ati != (AccessBridgeATInstance *) 0) {2535if (ati->javaEventMask & cJavaShutdownEvent) {2536PrintDebugString("[INFO]: sending to AT");2537ati->sendJavaEventPackage(buffer, sizeof(buffer), cJavaShutdownEvent);2538}2539ati = ati->nextATInstance;2540}2541PrintDebugString("[INFO]: done with firing AWT event");2542}25432544FIRE_EVENT(fireFocusGained, FocusGainedPackage, cFocusGainedPackage, cFocusGainedEvent)2545FIRE_EVENT(fireFocusLost, FocusLostPackage, cFocusLostPackage, cFocusLostEvent)2546FIRE_EVENT(fireCaretUpdate, CaretUpdatePackage, cCaretUpdatePackage, cCaretUpdateEvent)2547FIRE_EVENT(fireMouseClicked, MouseClickedPackage, cMouseClickedPackage, cMouseClickedEvent)2548FIRE_EVENT(fireMouseEntered, MouseEnteredPackage, cMouseEnteredPackage, cMouseEnteredEvent)2549FIRE_EVENT(fireMouseExited, MouseExitedPackage, cMouseExitedPackage, cMouseExitedEvent)2550FIRE_EVENT(fireMousePressed, MousePressedPackage, cMousePressedPackage, cMousePressedEvent)2551FIRE_EVENT(fireMouseReleased, MouseReleasedPackage, cMouseReleasedPackage, cMouseReleasedEvent)2552FIRE_EVENT(fireMenuCanceled, MenuCanceledPackage, cMenuCanceledPackage, cMenuCanceledEvent)2553FIRE_EVENT(fireMenuDeselected, MenuDeselectedPackage, cMenuDeselectedPackage, cMenuDeselectedEvent)2554FIRE_EVENT(fireMenuSelected, MenuSelectedPackage, cMenuSelectedPackage, cMenuSelectedEvent)2555FIRE_EVENT(firePopupMenuCanceled, PopupMenuCanceledPackage, cPopupMenuCanceledPackage, cPopupMenuCanceledEvent)2556FIRE_EVENT(firePopupMenuWillBecomeInvisible, PopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisibleEvent)2557FIRE_EVENT(firePopupMenuWillBecomeVisible, PopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisibleEvent)255825592560// -----------------------------256125622563extern "C" { // event stuff from AccessBridge.h, generated by JNI25642565JNIEXPORT void JNICALL2566Java_com_sun_java_accessibility_internal_AccessBridge_sendDebugString(JNIEnv *env, jobject callingObj, jstring debugStr) {25672568const wchar_t *stringBytes;2569stringBytes = (const wchar_t *) env->GetStringChars(debugStr, 0);2570if (stringBytes == NULL) {2571if (!env->ExceptionCheck()) {2572jclass cls = env->FindClass("java/lang/OutOfMemoryError");2573if (cls != NULL) {2574env->ThrowNew(cls, NULL);2575}2576}2577return;2578}2579wPrintJavaDebugString(L"AccessBridge.java: %ls", stringBytes);2580env->ReleaseStringChars(debugStr, stringBytes);2581}25822583JNIEXPORT void JNICALL2584Java_com_sun_java_accessibility_internal_AccessBridge_propertyCaretChange(JNIEnv *env, jobject callingObj,2585jobject event, jobject source,2586jint oldValue, jint newValue) {2587theJavaAccessBridge->firePropertyCaretChange(env, callingObj,2588event, source,2589oldValue, newValue);2590}25912592JNIEXPORT void JNICALL2593Java_com_sun_java_accessibility_internal_AccessBridge_propertyDescriptionChange(JNIEnv *env, jobject callingObj,2594jobject event, jobject source,2595jstring oldValue, jstring newValue) {2596theJavaAccessBridge->firePropertyDescriptionChange(env, callingObj,2597event, source,2598oldValue, newValue);2599}26002601JNIEXPORT void JNICALL2602Java_com_sun_java_accessibility_internal_AccessBridge_propertyNameChange(JNIEnv *env, jobject callingObj,2603jobject event, jobject source,2604jstring oldValue, jstring newValue) {2605theJavaAccessBridge->firePropertyNameChange(env, callingObj,2606event, source,2607oldValue, newValue);2608}26092610JNIEXPORT void JNICALL2611Java_com_sun_java_accessibility_internal_AccessBridge_propertySelectionChange(JNIEnv *env, jobject callingObj,2612jobject event, jobject source) {2613theJavaAccessBridge->firePropertySelectionChange(env, callingObj,2614event, source);2615}26162617JNIEXPORT void JNICALL2618Java_com_sun_java_accessibility_internal_AccessBridge_propertyStateChange(JNIEnv *env, jobject callingObj,2619jobject event, jobject source,2620jstring oldValue, jstring newValue) {2621theJavaAccessBridge->firePropertyStateChange(env, callingObj,2622event, source,2623oldValue, newValue);2624}26252626JNIEXPORT void JNICALL2627Java_com_sun_java_accessibility_internal_AccessBridge_propertyTextChange(JNIEnv *env, jobject callingObj,2628jobject event, jobject source) {2629theJavaAccessBridge->firePropertyTextChange(env, callingObj,2630event, source);2631}26322633JNIEXPORT void JNICALL2634Java_com_sun_java_accessibility_internal_AccessBridge_propertyValueChange(JNIEnv *env, jobject callingObj,2635jobject event, jobject source,2636jstring oldValue, jstring newValue) {2637theJavaAccessBridge->firePropertyValueChange(env, callingObj,2638event, source,2639oldValue, newValue);2640}26412642JNIEXPORT void JNICALL2643Java_com_sun_java_accessibility_internal_AccessBridge_propertyVisibleDataChange(JNIEnv *env, jobject callingObj,2644jobject event, jobject source) {2645theJavaAccessBridge->firePropertyVisibleDataChange(env, callingObj,2646event, source);2647}26482649JNIEXPORT void JNICALL2650Java_com_sun_java_accessibility_internal_AccessBridge_propertyChildChange(JNIEnv *env, jobject callingObj,2651jobject event, jobject source,2652jobject oldValue, jobject newValue) {2653theJavaAccessBridge->firePropertyChildChange(env, callingObj,2654event, source,2655oldValue, newValue);2656}26572658JNIEXPORT void JNICALL2659Java_com_sun_java_accessibility_internal_AccessBridge_propertyActiveDescendentChange(JNIEnv *env, jobject callingObj,2660jobject event, jobject source,2661jobject oldValue,2662jobject newValue) {2663theJavaAccessBridge->firePropertyActiveDescendentChange(env, callingObj,2664event, source,2665oldValue, newValue);2666}26672668JNIEXPORT void JNICALL2669Java_com_sun_java_accessibility_internal_AccessBridge_propertyTableModelChange(JNIEnv *env, jobject callingObj,2670jobject event, jobject source,2671jstring oldValue, jstring newValue) {26722673theJavaAccessBridge->firePropertyTableModelChange(env, callingObj,2674event, source,2675oldValue, newValue);2676}26772678#define HANDLE_STANDARD_EVENT_FROM_JAVA(function, method) \2679JNIEXPORT void JNICALL \2680function(JNIEnv *env, jobject callingObj, jobject event, jobject source) { \2681theJavaAccessBridge->method(env, callingObj, event, source); \2682}268326842685JNIEXPORT void JNICALL2686Java_com_sun_java_accessibility_internal_AccessBridge_javaShutdown(JNIEnv *env, jobject callingObj) {2687theJavaAccessBridge->javaShutdown(env, callingObj);2688}26892690HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_focusGained, fireFocusGained)2691HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_focusLost, fireFocusLost)2692HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_caretUpdate, fireCaretUpdate)2693HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mouseClicked, fireMouseClicked)2694HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mouseEntered, fireMouseEntered)2695HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mouseExited, fireMouseExited)2696HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mousePressed, fireMousePressed)2697HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_mouseReleased, fireMouseReleased)2698HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_menuCanceled, fireMenuCanceled)2699HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_menuDeselected, fireMenuDeselected)2700HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_menuSelected, fireMenuSelected)2701HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_popupMenuCanceled, firePopupMenuCanceled)2702HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_popupMenuWillBecomeInvisible, firePopupMenuWillBecomeInvisible)2703HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_internal_AccessBridge_popupMenuWillBecomeVisible, firePopupMenuWillBecomeVisible)27042705/*2706* Map a HWND to a Java component2707*2708* Class: com_sun_java_accessibility_internal_AccessBridge2709* Method: jawtGetComponentFromNativeWindowHandle2710* Signature: (I)Ljava/awt/Component;2711*/2712JNIEXPORT jobject JNICALL2713Java_com_sun_java_accessibility_internal_AccessBridge_jawtGetComponentFromNativeWindowHandle2714(JNIEnv *env, jobject callingObj, jint windowHandle) {27152716JAWT awt;2717jboolean result;2718jobject component = (jobject)0;27192720// Get the AWT2721awt.version = JAWT_VERSION_1_4;2722result = JAWT_GetAWT(env, &awt);2723if (result == JNI_FALSE) {2724return (jobject)0;2725}27262727// Get the component2728return awt.GetComponent(env, (void *)windowHandle);2729}273027312732/*2733* Map a Java component to a HWND2734*2735* Class: com_sun_java_accessibility_internal_AccessBridge2736* Method: jawtGetNativeWindowHandleFromComponent2737* Signature: (Ljava/awt/Component;)I2738*/2739JNIEXPORT jint JNICALL2740Java_com_sun_java_accessibility_internal_AccessBridge_jawtGetNativeWindowHandleFromComponent2741(JNIEnv *env, jobject callingObj, jobject component) {27422743JAWT awt;2744JAWT_DrawingSurface* ds;2745JAWT_DrawingSurfaceInfo* dsi;2746JAWT_Win32DrawingSurfaceInfo* dsi_win;2747jboolean result;2748// jint lock;2749jint windowHandle = -1;27502751// Get the AWT2752awt.version = JAWT_VERSION_1_4;2753result = JAWT_GetAWT(env, &awt);2754if (result == JNI_FALSE) {2755return -1;2756}27572758// Get the drawing surface2759ds = awt.GetDrawingSurface(env, component);2760if (ds == NULL) {2761return -1;2762}27632764// Get the drawing surface info2765dsi = ds->GetDrawingSurfaceInfo(ds);27662767// Get the platform-specific drawing info2768dsi_win = (JAWT_Win32DrawingSurfaceInfo *)dsi->platformInfo;27692770// Get the window handle2771windowHandle = (jint)dsi_win->hwnd;27722773// Free the drawing surface info2774ds->FreeDrawingSurfaceInfo(dsi);27752776// Free the drawing surface2777awt.FreeDrawingSurface(ds);27782779return windowHandle;2780}27812782}278327842785