Path: blob/master/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp
40957 views
/*1* Copyright (c) 2005, 2020, 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 Windows executables to handle communication27* between Java VMs purposes of Accessbility.28*/2930#include "AccessBridgeDebug.h"31#include "WinAccessBridge.h"32#include "accessBridgeResource.h"33#include "accessBridgeCallbacks.h"34#include "AccessBridgeMessages.h"35#include "AccessBridgeMessageQueue.h"3637#include <windows.h>38#include <jni.h>39#include <stdio.h>4041// send memory lock42//43// This lock is need to serialize access to the buffer used by sendMemoryPackage.44// If a JVM goes away while the associated memory buffer is in use, a thread switch45// allows a call to JavaVMDestroyed and deallocation of the memory buffer.46CRITICAL_SECTION sendMemoryIPCLock;4748// registry paths to newly found JVMs that don't have the bridge installed49char **newJVMs;5051WinAccessBridge *theWindowsAccessBridge;52HWND theDialogWindow;5354// unique broadcast msg. IDs gotten dymanically55extern UINT theFromJavaHelloMsgID;56extern UINT theFromWindowsHelloMsgID;5758// protects the javaVMs chain while in use59bool isVMInstanceChainInUse;6061/* =================================================================================== */62636465/**66* Proc for "New JVM Found" dialog67*/68BOOL CALLBACK newJVMFoundDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) {6970switch (message) {71case WM_COMMAND:72// PrintDebugString(" newJVMDialogProc: LOWORD(wParam) = %d", LOWORD(wParam));7374switch (LOWORD(wParam)) {7576// Remind user later that a new JVM was installed77case cRemindThereIsNewJVM:78PrintDebugString("[INFO]: newJVMDialogProc: cRemindThereIsNewJVM");79// do nothing80EndDialog(hwndDlg, wParam);81return TRUE;8283// Do not remind user later that a new JVM was installed84/*85case cDoNotRemindThereIsNewJVM:86PrintDebugString(" newJVMDialogProc: cDoNotRemindThereIsNewJVM");87// remember to not remind the user there are new JVMs88PrintDebugString("theWindowsAccessBridge = %x", theWindowsAccessBridge);89if (theWindowsAccessBridge != NULL) {90dontRemindUser(newJVMs);91}92EndDialog(hwndDlg, wParam);93return TRUE;94*/9596// Run the AccessBridge installer97/*98case cInstallAccessBridge:99PrintDebugString(" newJVMDialogProc: cInstallAccessBridge");100// start the installer101if (theWindowsAccessBridge != NULL) {102startInstaller(newJVMs);103}104EndDialog(hwndDlg, wParam);105return TRUE;106*/107108default:109;110}111default:112;113}114return FALSE;115}116117118119/* =========================================================================== */120121// ---------------------------------------------------------------------------122123extern "C" {124/**125* DllMain - where Windows executables will load/unload us126*127*/128BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) {129130switch (fdwReason) {131case DLL_PROCESS_ATTACH: // A Windows executable loaded us132initializeFileLogger("windows_access_bridge");133PrintDebugString("[INFO]: DLL_PROCESS_ATTACH");134theWindowsAccessBridge = new WinAccessBridge(hinstDll);135break;136137case DLL_PROCESS_DETACH: // A Windows executable unloaded us138if (theWindowsAccessBridge != (WinAccessBridge *) 0) {139PrintDebugString("[INFO]: *** AccessBridgeDialogProc -> deleting theWindowsAccessBridge");140delete theWindowsAccessBridge;141}142break;143}144145return(TRUE);146}147148/**149* Append debug info to dialog150*151* replaced with code to send output to debug file152*153*/154void AppendToCallInfo(char *s) {155156/*157_CrtDbgReport(_CRT_WARN, (const char *) NULL, NULL, (const char *) NULL,158(const char *) "WinAccessBridge: %s", s);159*/160161char buf[1024];162sprintf(buf, "WinAccessBridge: %s", s);163OutputDebugString(buf);164}165166/**167* Our window proc168*169*/170BOOL CALLBACK AccessBridgeDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {171COPYDATASTRUCT *sentToUs;172char *package;173174switch (message) {175case WM_INITDIALOG:176PrintDebugString("[INFO]: AccessBridgeDialogProc -> Initializing");177break;178179// call from Java with data for us to deliver180case WM_COPYDATA:181if (theDialogWindow == (HWND) wParam) {182PrintDebugString("[INFO]: AccessBridgeDialogProc -> Got WM_COPYDATA from Java Bridge DLL");183} else {184PrintDebugString("[INFO]: AccessBridgeDialogProc -> Got WM_COPYDATA from HWND %p", wParam);185sentToUs = (COPYDATASTRUCT *) lParam;186package = (char *) sentToUs->lpData;187theWindowsAccessBridge->preProcessPackage(package, sentToUs->cbData);188}189break;190191// message to ourselves -> de-queue messages and send 'em192case AB_MESSAGE_QUEUED:193PrintDebugString("[INFO]: AccessBridgeDialogProc -> Got AB_MESSAGE_QUEUED from ourselves");194theWindowsAccessBridge->receiveAQueuedPackage();195break;196197// a JavaAccessBridge DLL is going away198//199// When JavaVMDestroyed is called a AccessBridgeJavaVMInstance in the200// javaVMs chain will be removed. If that chain is in use this will201// cause a crash. One way AB_DLL_GOING_AWAY can arrive is on any202// outgoing SendMessage call. SendMessage normally spins waiting for203// a response. However, if there is an incoming SendMessage, e.g. for204// AB_DLL_GOING_AWAY Windows will send that request to this DialogProc.205// One seemingly easy way to combat that is to use SendMessageTimeout206// with the SMTO_BLOCK flag set. However, it has been the case that207// even after using that technique AB_DLL_GOING_AWAY can still arrive208// in the middle of processing the javaVMs chain. An alternative that209// was tried was to use a critical section around any access ot the210// javaVMs chain but unfortunately the AB_DLL_GOING_AWAY message arrives211// on the same thread and thus the use of a critical section is ineffective.212// The solution then is to set a flag whenever the javaVMs chain is being213// used and if that flag is set at this point the message will be posted214// to the message queue. That would delay the destruction of the instance215// until the chain is not being traversed.216case AB_DLL_GOING_AWAY:217PrintDebugString("[INFO]: ***** AccessBridgeDialogProc -> Got AB_DLL_GOING_AWAY message");218if (isVMInstanceChainInUse) {219PrintDebugString("[INFO]: javaVMs chain in use, calling PostMessage");220PostMessage(hDlg, AB_DLL_GOING_AWAY, wParam, (LPARAM)0);221} else {222PrintDebugString("[INFO]: calling javaVMDestroyed");223theWindowsAccessBridge->JavaVMDestroyed((HWND) wParam);224}225break;226227default:228// the JavaVM is saying "hi"!229// wParam == sourceHwnd; lParam == JavaVMID230if (message == theFromJavaHelloMsgID) {231PrintDebugString("[INFO]: AccessBridgeDialogProc -> Got theFromJavaHelloMsgID; wParam = %p, lParam = %p", wParam, lParam);232theWindowsAccessBridge->rendezvousWithNewJavaDLL((HWND) wParam, (long ) lParam);233}234break;235}236237return (FALSE);238}239240}241242243244245// ---------------------------------------------------------------------------246247/**248* Initialize the WinAccessBridge249*250*/251WinAccessBridge::WinAccessBridge(HINSTANCE hInstance) {252253PrintDebugString("[INFO]: WinAccessBridge ctor");254255// IntializeCriticalSection should only be called once.256InitializeCriticalSection(&sendMemoryIPCLock);257windowsInstance = hInstance;258javaVMs = (AccessBridgeJavaVMInstance *) 0;259eventHandler = new AccessBridgeEventHandler();260messageQueue = new AccessBridgeMessageQueue();261initBroadcastMessageIDs(); // get the unique to us broadcast msg. IDs262theWindowsAccessBridge = this;263isVMInstanceChainInUse = false;264265ShowWindow(theDialogWindow, SW_SHOW);266}267268269270/**271* Destroy the WinAccessBridge272*273*/274WinAccessBridge::~WinAccessBridge() {275// inform all other AccessBridges that we're going away276// -> shut down all event listening277// -> release all objects held in the JVM by us278279PrintDebugString("[INFO]: *****in WinAccessBridge::~WinAccessBridge()");280281// send a broadcast msg.; let other AccessBridge DLLs know we're going away282AccessBridgeJavaVMInstance *current = javaVMs;283while (current != (AccessBridgeJavaVMInstance *) 0) {284PrintDebugString("[INFO]: telling %p we're going away", current->javaAccessBridgeWindow);285SendMessage(current->javaAccessBridgeWindow,286AB_DLL_GOING_AWAY, (WPARAM) dialogWindow, (LPARAM) 0);287current = current->nextJVMInstance;288}289290PrintDebugString("[INFO]: finished telling JVMs about our demise");291292delete eventHandler;293delete messageQueue;294delete javaVMs;295296PrintDebugString("[INFO]: finished deleting eventHandler, messageQueue, and javaVMs");297PrintDebugString("[INFO]: GOODBYE CRUEL WORLD...");298finalizeFileLogger();299DestroyWindow(theDialogWindow);300}301302303/**304* Bring up our window; make a connection to the rest of the world305*306*/307BOOL308WinAccessBridge::initWindow() {309theDialogWindow = CreateDialog(windowsInstance,310"ACCESSBRIDGESTATUSWINDOW", NULL,311(DLGPROC) AccessBridgeDialogProc);312313// If window could not be created, return "failure".314if (!theDialogWindow)315return (FALSE);316317dialogWindow = theDialogWindow;318319// Make the window visible, update its client area, & return "success".320// DEBUG_CODE(ShowWindow (theDialogWindow, SW_SHOWNORMAL));321// DEBUG_CODE(UpdateWindow (theDialogWindow));322323// post a broadcast msg.; let other AccessBridge DLLs know we exist324PostMessage(HWND_BROADCAST, theFromWindowsHelloMsgID, (WPARAM) dialogWindow, (LPARAM) 0);325326return (TRUE);327}328329// -----------------------330331/**332* rendezvousWithNewJavaDLL333* - Build AccessBridgeJavaVMInstance data structure334* (including setting up Memory-Mapped file info)335*336*/337LRESULT338WinAccessBridge::rendezvousWithNewJavaDLL(HWND JavaBridgeDLLwindow, long vmID) {339LRESULT returnVal;340341PrintDebugString("[INFO]: in WinAccessBridge::rendezvousWithNewJavaDLL(%p, %X)",342JavaBridgeDLLwindow, vmID);343344isVMInstanceChainInUse = true;345AccessBridgeJavaVMInstance *newVM =346new AccessBridgeJavaVMInstance(dialogWindow, JavaBridgeDLLwindow, vmID, javaVMs);347javaVMs = newVM;348isVMInstanceChainInUse = false;349350returnVal = javaVMs->initiateIPC();351if (returnVal == 0) {352353// tell the newly created JavaVM what events we're interested in, if any354long javaEventMask = eventHandler->getJavaEventMask();355long accessibilityEventMask = eventHandler->getAccessibilityEventMask();356357PrintDebugString("[INFO]: Setting Java event mask to: %X", javaEventMask);358359if (javaEventMask != 0) {360addJavaEventNotification(javaEventMask);361}362363PrintDebugString("[INFO]: Setting Accessibility event mask to: %X", accessibilityEventMask);364365if (accessibilityEventMask != 0) {366addAccessibilityEventNotification(accessibilityEventMask);367}368} else {369PrintDebugString("[ERROR]: Failed to initiate IPC with newly created JavaVM!!!");370return FALSE;371}372373PrintDebugString("[INFO]: Success!! We rendezvoused with the JavaDLL");374return returnVal;375}376377// -----------------------378379/**380* sendPackage - uses SendMessage(WM_COPYDATA) to do IPC messaging381* with the Java AccessBridge DLL382*383* NOTE: WM_COPYDATA is only for one-way IPC; there384* is now way to return parameters (especially big ones)385* Use sendMemoryPackage() to do that!386*/387void388WinAccessBridge::sendPackage(char *buffer, long bufsize, HWND destWindow) {389COPYDATASTRUCT toCopy;390toCopy.dwData = 0; // 32-bits we could use for something...391toCopy.cbData = bufsize;392toCopy.lpData = buffer;393394SendMessage(destWindow, WM_COPYDATA, (WPARAM) dialogWindow, (LPARAM) &toCopy);395}396397398/**399* sendMemoryPackage - uses Memory-Mapped files to do IPC messaging400* with the Java AccessBridge DLL, informing the401* Java AccessBridge DLL via SendMessage that something402* is waiting for it in the shared file...403*404* In the SendMessage call, the third param (WPARAM) is405* the source HWND (theDialogWindow in this case), and406* the fourth param (LPARAM) is the size in bytes of407* the package put into shared memory.408*409*/410BOOL411WinAccessBridge::sendMemoryPackage(char *buffer, long bufsize, HWND destWindow) {412if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {413return FALSE;414}415AccessBridgeJavaVMInstance *ourABJavaVMInstance;416ourABJavaVMInstance = javaVMs->findABJavaVMInstanceFromJavaHWND(destWindow);417if (ourABJavaVMInstance != (AccessBridgeJavaVMInstance *) 0) {418if (!ourABJavaVMInstance->sendMemoryPackage(buffer, bufsize)) {419// return falue to the caller420memset(buffer, 0, bufsize);421return FALSE;422}423} else {424PrintDebugString("[ERROR]: sending memory package: couldn't find destWindow");425return FALSE;426}427return TRUE;428}429430431/**432* queuePackage - put a package onto the queue for latter processing433*434*/435BOOL436WinAccessBridge::queuePackage(char *buffer, long bufsize) {437PrintDebugString("[INFO]: in WinAccessBridge::queuePackage(%p, %d)", buffer, bufsize);438439AccessBridgeQueueElement *element = new AccessBridgeQueueElement(buffer, bufsize);440441messageQueue->add(element);442PostMessage(dialogWindow, AB_MESSAGE_QUEUED, (WPARAM) 0, (LPARAM) 0);443return TRUE;444}445446447/**448* receiveAQueuedPackage - remove a pending packge from the queue and449* handle it. If the queue is busy, post a450* message to self to retrieve it later451*452*/453BOOL454WinAccessBridge::receiveAQueuedPackage() {455AccessBridgeQueueElement *element = NULL;456457PrintDebugString("[INFO]: in WinAccessBridge::receiveAQueuedPackage()");458459// ensure against re-entrancy problems...460if (messageQueue->getRemoveLockSetting() == FALSE) {461messageQueue->setRemoveLock(TRUE);462463PrintDebugString("[INFO]: dequeueing message");464465QueueReturns result = messageQueue->remove(&element);466467switch (result) {468469case cQueueBroken:470PrintDebugString("[ERROR]: Queue seems to be broken!");471messageQueue->setRemoveLock(FALSE);472return FALSE;473474case cMoreMessages:475case cQueueEmpty:476if (element != (AccessBridgeQueueElement *) 0) {477PrintDebugString("[INFO]: found one; sending it!");478processPackage(element->buffer, element->bufsize);479delete element;480} else {481PrintDebugString("[WARN]: ODD... element == 0!");482return FALSE;483}484break;485486case cQueueInUse:487PrintDebugString("[WARN]: Queue in use, will try again later...");488PostMessage(dialogWindow, AB_MESSAGE_QUEUED, (WPARAM) 0, (LPARAM) 0);489break;490491default:492messageQueue->setRemoveLock(FALSE);493return FALSE; // should never get something we don't recognize!494}495} else {496PrintDebugString("[WARN]: unable to dequeue message; remove lock is set");497PostMessage(dialogWindow, AB_MESSAGE_QUEUED, (WPARAM) 0, (LPARAM) 0); // Fix for 6995891498}499500messageQueue->setRemoveLock(FALSE);501return TRUE;502}503504// -----------------------505506/**507* preProcessPackage508* - do triage on incoming packages; queue some, deal with others509*510*/511void512WinAccessBridge::preProcessPackage(char *buffer, long bufsize) {513PrintDebugString("[INFO]: PreProcessing package sent from Java:");514515PackageType *type = (PackageType *) buffer;516517switch (*type) {518519PrintDebugString("[INFO]: type == %X", *type);520521// event packages all get queued for later handling522//case cPropertyChangePackage:523case cJavaShutdownPackage:524case cFocusGainedPackage:525case cFocusLostPackage:526case cCaretUpdatePackage:527case cMouseClickedPackage:528case cMouseEnteredPackage:529case cMouseExitedPackage:530case cMousePressedPackage:531case cMouseReleasedPackage:532case cMenuCanceledPackage:533case cMenuDeselectedPackage:534case cMenuSelectedPackage:535case cPopupMenuCanceledPackage:536case cPopupMenuWillBecomeInvisiblePackage:537case cPopupMenuWillBecomeVisiblePackage:538539case cPropertyCaretChangePackage:540case cPropertyDescriptionChangePackage:541case cPropertyNameChangePackage:542case cPropertySelectionChangePackage:543case cPropertyStateChangePackage:544case cPropertyTextChangePackage:545case cPropertyValueChangePackage:546case cPropertyVisibleDataChangePackage:547case cPropertyChildChangePackage:548case cPropertyActiveDescendentChangePackage:549550case cPropertyTableModelChangePackage:551552queuePackage(buffer, bufsize);553break;554555// perhaps there will be some other packages to process at some point... //556557default:558PrintDebugString("[ERROR]: processing FAILED!! -> don't know how to handle type = %X", *type);559break;560}561562PrintDebugString("[INFO]: package preprocessing completed");563}564565566#define DISPATCH_EVENT_PACKAGE(packageID, eventPackage, fireEventMethod) \567case packageID: \568if (bufsize == sizeof(PackageType) + sizeof(eventPackage)) { \569eventPackage *pkg = \570(eventPackage *) (buffer + sizeof(PackageType)); \571PrintDebugString("[INFO]: begin callback to AT, type == %X", *type); \572theWindowsAccessBridge->eventHandler->fireEventMethod( \573pkg->vmID, pkg->Event, pkg->AccessibleContextSource); \574PrintDebugString("[INFO]: event callback complete!"); \575} else { \576PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d", \577bufsize, sizeof(PackageType) + sizeof(eventPackage)); \578} \579break;580581#define DISPATCH_PROPERTY_CHANGE_PACKAGE(packageID, eventPackage, fireEventMethod, oldValue, newValue) \582case packageID: \583if (bufsize == sizeof(PackageType) + sizeof(eventPackage)) { \584eventPackage *pkg = \585(eventPackage *) (buffer + sizeof(PackageType)); \586PrintDebugString("[INFO]: begin callback to AT, type == %X", *type); \587theWindowsAccessBridge->eventHandler->fireEventMethod( \588pkg->vmID, pkg->Event, pkg->AccessibleContextSource, \589pkg->oldValue, pkg->newValue); \590PrintDebugString("[INFO]: event callback complete!"); \591} else { \592PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d", \593bufsize, sizeof(PackageType) + sizeof(eventPackage)); \594} \595break;596597#define DISPATCH_PROPERTY_TABLE_MODEL_CHANGE_PACKAGE(packageID, eventPackage, fireEventMethod, oldValue, newValue) \598case packageID: \599if (bufsize == sizeof(PackageType) + sizeof(eventPackage)) { \600eventPackage *pkg = \601(eventPackage *) (buffer + sizeof(PackageType)); \602PrintDebugString("[INFO]: begin callback to AT, type == %X", *type); \603theWindowsAccessBridge->eventHandler->fireEventMethod( \604pkg->vmID, pkg->Event, pkg->AccessibleContextSource, \605pkg->oldValue, pkg->newValue); \606PrintDebugString("[INFO]: event callback complete!"); \607} else { \608PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d", \609bufsize, sizeof(PackageType) + sizeof(eventPackage)); \610} \611break;612613/**614* processPackage - processes the output of SendMessage(WM_COPYDATA)615* to do IPC messaging with the Java AccessBridge DLL616*617*/618void619WinAccessBridge::processPackage(char *buffer, long bufsize) {620PrintDebugString("[INFO]: WinAccessBridge::Processing package sent from Java:");621622PackageType *type = (PackageType *) buffer;623624switch (*type) {625626PrintDebugString("[INFO]: type == %X", *type);627628case cJavaShutdownPackage:629PrintDebugString("[INFO]: type == cJavaShutdownPackage");630if (bufsize == sizeof(PackageType) + sizeof(JavaShutdownPackage)) {631JavaShutdownPackage *pkg =632(JavaShutdownPackage *) (buffer + sizeof(PackageType));633theWindowsAccessBridge->eventHandler->fireJavaShutdown(pkg->vmID);634PrintDebugString("[INFO]: event callback complete!");635PrintDebugString("[INFO]: event fired!");636} else {637PrintDebugString("[ERROR]: processing FAILED!! -> bufsize = %d; expectation = %d",638bufsize, sizeof(PackageType) + sizeof(JavaShutdownPackage));639}640break;641642643DISPATCH_EVENT_PACKAGE(cFocusGainedPackage, FocusGainedPackage, fireFocusGained);644DISPATCH_EVENT_PACKAGE(cFocusLostPackage, FocusLostPackage, fireFocusLost);645646DISPATCH_EVENT_PACKAGE(cCaretUpdatePackage, CaretUpdatePackage, fireCaretUpdate);647648DISPATCH_EVENT_PACKAGE(cMouseClickedPackage, MouseClickedPackage, fireMouseClicked);649DISPATCH_EVENT_PACKAGE(cMouseEnteredPackage, MouseEnteredPackage, fireMouseEntered);650DISPATCH_EVENT_PACKAGE(cMouseExitedPackage, MouseExitedPackage, fireMouseExited);651DISPATCH_EVENT_PACKAGE(cMousePressedPackage, MousePressedPackage, fireMousePressed);652DISPATCH_EVENT_PACKAGE(cMouseReleasedPackage, MouseReleasedPackage, fireMouseReleased);653654DISPATCH_EVENT_PACKAGE(cMenuCanceledPackage, MenuCanceledPackage, fireMenuCanceled);655DISPATCH_EVENT_PACKAGE(cMenuDeselectedPackage, MenuDeselectedPackage, fireMenuDeselected);656DISPATCH_EVENT_PACKAGE(cMenuSelectedPackage, MenuSelectedPackage, fireMenuSelected);657DISPATCH_EVENT_PACKAGE(cPopupMenuCanceledPackage, PopupMenuCanceledPackage, firePopupMenuCanceled);658DISPATCH_EVENT_PACKAGE(cPopupMenuWillBecomeInvisiblePackage, PopupMenuWillBecomeInvisiblePackage, firePopupMenuWillBecomeInvisible);659DISPATCH_EVENT_PACKAGE(cPopupMenuWillBecomeVisiblePackage, PopupMenuWillBecomeVisiblePackage, firePopupMenuWillBecomeVisible);660661DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyNameChangePackage,662PropertyNameChangePackage,663firePropertyNameChange, oldName, newName)664DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyDescriptionChangePackage,665PropertyDescriptionChangePackage,666firePropertyDescriptionChange,667oldDescription, newDescription)668DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyStateChangePackage,669PropertyStateChangePackage,670firePropertyStateChange, oldState, newState)671DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyValueChangePackage,672PropertyValueChangePackage,673firePropertyValueChange, oldValue, newValue)674DISPATCH_EVENT_PACKAGE(cPropertySelectionChangePackage,675PropertySelectionChangePackage, firePropertySelectionChange)676DISPATCH_EVENT_PACKAGE(cPropertyTextChangePackage,677PropertyTextChangePackage, firePropertyTextChange)678DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyCaretChangePackage,679PropertyCaretChangePackage,680firePropertyCaretChange, oldPosition, newPosition)681DISPATCH_EVENT_PACKAGE(cPropertyVisibleDataChangePackage,682PropertyVisibleDataChangePackage, firePropertyVisibleDataChange)683DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyChildChangePackage,684PropertyChildChangePackage,685firePropertyChildChange,686oldChildAccessibleContext,687newChildAccessibleContext)688DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyActiveDescendentChangePackage,689PropertyActiveDescendentChangePackage,690firePropertyActiveDescendentChange,691oldActiveDescendentAccessibleContext,692newActiveDescendentAccessibleContext)693694DISPATCH_PROPERTY_TABLE_MODEL_CHANGE_PACKAGE(cPropertyTableModelChangePackage,695PropertyTableModelChangePackage,696firePropertyTableModelChange,697oldValue, newValue)698699700default:701PrintDebugString("[ERROR]: processing FAILED!! -> don't know how to handle type = %X", *type);702break;703}704705PrintDebugString("[INFO]: package processing completed");706}707708709// -----------------------------710711void712WinAccessBridge::JavaVMDestroyed(HWND VMBridgeDLLWindow) {713PrintDebugString("[INFO]: ***** WinAccessBridge::JavaVMDestroyed(%p)", VMBridgeDLLWindow);714715if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {716return;717}718719isVMInstanceChainInUse = true;720AccessBridgeJavaVMInstance *currentVM = javaVMs;721AccessBridgeJavaVMInstance *previousVM = javaVMs;722if (javaVMs->javaAccessBridgeWindow == VMBridgeDLLWindow) {723javaVMs = javaVMs->nextJVMInstance;724delete currentVM;725726PrintDebugString("[INFO]: data structures successfully removed");727728// [[[FIXME]]] inform Windows AT that a JVM went away,729// and that any jobjects it's got lying around for that JVM730// are now invalid731732} else {733while (currentVM != (AccessBridgeJavaVMInstance *) 0) {734if (currentVM->javaAccessBridgeWindow == VMBridgeDLLWindow) {735previousVM->nextJVMInstance = currentVM->nextJVMInstance;736delete currentVM;737738PrintDebugString("[INFO]: data structures successfully removed");739740// [[[FIXME]]] inform Windows AT that a JVM went away,741// and that any jobjects it's got lying around for that JVM742// are now invalid743isVMInstanceChainInUse = false;744return;745} else {746previousVM = currentVM;747currentVM = currentVM->nextJVMInstance;748}749}750PrintDebugString("[ERROR]: couldn't find matching data structures!");751}752isVMInstanceChainInUse = false;753}754755// -----------------------756757/**758* releaseJavaObject - lets the JavaVM know it can release the Java Object759*760* Note: once you have made this call, the JavaVM will garbage collect761* the jobject you pass in. If you later use that jobject in another762* call, you will cause all maner of havoc!763*764*/765void766WinAccessBridge::releaseJavaObject(long vmID, JOBJECT64 object) {767#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)768PrintDebugString("[INFO]: WinAccessBridge::releaseJavaObject(%X, %p)", vmID, object);769#else // JOBJECT64 is jlong (64 bit)770PrintDebugString("[INFO]: WinAccessBridge::releaseJavaObject(%X, %016I64X)", vmID, object);771#endif772if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {773return;774}775char buffer[sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage)];776PackageType *type = (PackageType *) buffer;777ReleaseJavaObjectPackage *pkg = (ReleaseJavaObjectPackage *) (buffer + sizeof(PackageType));778*type = cReleaseJavaObjectPackage;779pkg->vmID = vmID;780pkg->object = object;781782HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);783if (destABWindow != (HWND) 0) {784sendPackage(buffer, sizeof(buffer), destABWindow); // no return values!785}786}787788// -----------------------789790/**791* getVersionInfo - fill the AccessBridgeVersionInfo struct792*793*/794BOOL795WinAccessBridge::getVersionInfo(long vmID, AccessBridgeVersionInfo *info) {796if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {797return FALSE;798}799char buffer[sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage)];800PackageType *type = (PackageType *) buffer;801GetAccessBridgeVersionPackage *pkg = (GetAccessBridgeVersionPackage *) (buffer + sizeof(PackageType));802*type = cGetAccessBridgeVersionPackage;803pkg->vmID = vmID;804805PrintDebugString("[INFO]: WinAccessBridge::getVersionInfo(%X, )", vmID);806HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);807if (destABWindow != (HWND) 0) {808if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {809memcpy(info, &(pkg->rVersionInfo), sizeof(AccessBridgeVersionInfo));810PrintDebugString("[INFO]: VMversion: %ls\n"\811" bridgeJavaClassVersion: %ls\n"\812" bridgeJavaDLLVersion: %ls\n"\813" bridgeWinDLLVersion: %ls\n"\814, info->VMversion, info->bridgeJavaClassVersion, info->bridgeJavaDLLVersion, info->bridgeWinDLLVersion);815return TRUE;816}817}818return FALSE;819}820821822/********** Window-related routines ***********************************/823824/**825* isJavaWindow - returns TRUE if the HWND is a top-level Java Window826*827* Note: just because the Windnow is a top-level Java window, that doesn't828* mean that it is accessible. Call getAccessibleContextFromHWND(HWND) to get the829* AccessibleContext, if any, for an HWND that is a Java Window.830*831*/832BOOL833WinAccessBridge::isJavaWindow(HWND window) {834HWND hwnd;835836if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {837return FALSE;838}839840// quick check to see if 'window' is top-level; if not, it's not interesting...841// [[[FIXME]]] is this for sure an OK optimization?842hwnd = getTopLevelHWND(window);843if (hwnd == (HWND) NULL) {844return FALSE;845}846847PrintDebugString("[INFO]: In WinAccessBridge::isJavaWindow");848849850851char buffer[sizeof(PackageType) + sizeof(IsJavaWindowPackage)];852PackageType *type = (PackageType *) buffer;853IsJavaWindowPackage *pkg = (IsJavaWindowPackage *) (buffer + sizeof(PackageType));854*type = cIsJavaWindowPackage;855pkg->window = (jint) window;856857PrintDebugString("[INFO]: WinAccessBridge::isJavaWindow(%p)", window);858859isVMInstanceChainInUse = true;860AccessBridgeJavaVMInstance *current = javaVMs;861while (current != (AccessBridgeJavaVMInstance *) 0) {862if (sendMemoryPackage(buffer, sizeof(buffer), current->javaAccessBridgeWindow) == TRUE) {863if (pkg->rResult != 0) {864isVMInstanceChainInUse = false;865return TRUE;866}867}868current = current->nextJVMInstance;869}870isVMInstanceChainInUse = false;871return FALSE;872873874/*875char classname[256];876HWND hwnd;877878hwnd = getTopLevelHWND(window);879if (hwnd == (HWND) NULL) {880return FALSE;881}882GetClassName(hwnd, classname, 256);883884if (strstr(classname, "AwtFrame") != 0) {885return TRUE;886} else if (strstr(classname, "AwtWindow") != 0) {887return TRUE;888} else if (strstr(classname, "AwtDialog") != 0) {889return TRUE;890}891*/892// JDK 1.4 introduces new (and changes old) classnames893/*894else if (strstr(classname, "SunAwtToolkit") != 0) {895return TRUE;896} else if (strstr(classname, "javax.swing.JFrame") != 0) {897return TRUE;898}899*/900901return FALSE;902}903904/**905* isSameObject - returns TRUE if the two object references refer to906* the same object. Otherwise, this method returns FALSE:907*/908BOOL909WinAccessBridge::isSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2) {910911#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)912PrintDebugString("[INFO]: WinAccessBridge::isSameObject(%p %p)", obj1, obj2);913#else // JOBJECT64 is jlong (64 bit)914PrintDebugString("[INFO]: WinAccessBridge::isSameObject(%016I64X %016I64X)", obj1, obj2);915#endif916917if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {918return FALSE;919}920921char buffer[sizeof(PackageType) + sizeof(IsSameObjectPackage)];922PackageType *type = (PackageType *) buffer;923IsSameObjectPackage *pkg = (IsSameObjectPackage *) (buffer + sizeof(PackageType));924*type = cIsSameObjectPackage;925pkg->vmID = vmID;926pkg->obj1 = obj1;927pkg->obj2 = obj2;928929HWND destABWindow = javaVMs->findAccessBridgeWindow(pkg->vmID);930if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {931if (pkg->rResult != 0) {932PrintDebugString("[INFO]: WinAccessBridge::isSameObject returning TRUE (same object)");933return TRUE;934} else {935PrintDebugString("[INFO]: WinAccessBridge::isSameObject returning FALSE (different object)");936return FALSE;937}938}939PrintDebugString("[ERROR]: WinAccessBridge::isSameObject returning FALSE (sendMemoryPackage failed)");940return FALSE;941}942943/**944* FromHWND - returns the AccessibleContext jobject for the HWND945*946* Note: this routine can return null, even if the HWND is a Java Window,947* because the Java Window may not be accessible.948*949*/950BOOL951WinAccessBridge::getAccessibleContextFromHWND(HWND window, long *vmID, JOBJECT64 *AccessibleContext) {952if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {953return FALSE;954}955956char buffer[sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage)];957PackageType *type = (PackageType *) buffer;958GetAccessibleContextFromHWNDPackage *pkg = (GetAccessibleContextFromHWNDPackage *) (buffer + sizeof(PackageType));959*type = cGetAccessibleContextFromHWNDPackage;960pkg->window = (jint) window;961962PrintDebugString("[INFO]: WinAccessBridge::getAccessibleContextFromHWND(%p, )", window);963964DEBUG_CODE(pkg->rVMID = (long ) 0x01010101);965DEBUG_CODE(pkg->rAccessibleContext = (JOBJECT64) 0x01010101);966967isVMInstanceChainInUse = true;968AccessBridgeJavaVMInstance *current = javaVMs;969while (current != (AccessBridgeJavaVMInstance *) 0) {970971if (sendMemoryPackage(buffer, sizeof(buffer), current->javaAccessBridgeWindow) == TRUE) {972if (pkg->rAccessibleContext != 0) {973*vmID = pkg->rVMID;974*AccessibleContext = (JOBJECT64)pkg->rAccessibleContext;975PrintDebugString("[INFO]: current->vmID = %X, pkg->rVMID = %X", current->vmID, pkg->rVMID);976#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)977PrintDebugString("[INFO]: pkg->rAccessibleContext = %p", pkg->rAccessibleContext);978#else // JOBJECT64 is jlong (64 bit)979PrintDebugString("[INFO]: pkg->rAccessibleContext = %016I64X", pkg->rAccessibleContext);980#endif981if (pkg->rVMID != current->vmID) {982PrintDebugString("[ERROR]: getAccessibleContextFromHWND vmIDs don't match!");983isVMInstanceChainInUse = false;984return FALSE;985}986isVMInstanceChainInUse = false;987return TRUE;988}989}990current = current->nextJVMInstance;991}992isVMInstanceChainInUse = false;993994// This isn't really an error; it just means that the HWND was for a non-Java995// window. It's also possible the HWND was for a Java window but the JVM has996// since been shut down and sendMemoryPackage returned FALSE.997PrintDebugString("[ERROR]: getAccessibleContextFromHWND no matching HWND found!");998return FALSE;999}10001001/**1002* Returns the HWND for an AccessibleContext. Returns (HWND)0 on error.1003*/1004HWND1005WinAccessBridge::getHWNDFromAccessibleContext(long vmID, JOBJECT64 accessibleContext) {1006PrintDebugString("[INFO]: in WinAccessBridge::getHWNDFromAccessibleContext");1007if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1008return (HWND)0;1009}10101011char buffer[sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage)];1012PackageType *type = (PackageType *) buffer;1013GetHWNDFromAccessibleContextPackage *pkg = (GetHWNDFromAccessibleContextPackage *) (buffer + sizeof(PackageType));1014*type = cGetHWNDFromAccessibleContextPackage;1015pkg->accessibleContext = accessibleContext;10161017#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1018PrintDebugString("[INFO]: WinAccessBridge::getHWNDFromAccessibleContext(%p)", accessibleContext);1019#else // JOBJECT64 is jlong (64 bit)1020PrintDebugString("[INFO]: WinAccessBridge::getHWNDFromAccessibleContext(%016I64X)", accessibleContext);1021#endif10221023HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1024if (destABWindow != (HWND) 0) {1025if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1026return ((HWND)ABLongToHandle(pkg->rHWND));1027}1028}1029return (HWND)0;1030}10311032/********** AccessibleContext routines ***********************************/10331034/**1035* Walk through Java Windows, in front-to-back Z-order.1036* If NULL is passed it, this function starts at the top.1037*1038*/1039HWND1040WinAccessBridge::getNextJavaWindow(HWND previous) {1041HWND current = previous;1042if (current == NULL) {1043current = GetTopWindow(NULL);1044} else {1045current = GetNextWindow(current, GW_HWNDNEXT);1046}1047while (current != NULL) {1048if (isJavaWindow(current)) {1049return current;1050}1051current = GetNextWindow(current, GW_HWNDNEXT);1052}1053return NULL;1054}105510561057/**1058* getAccessibleContextAt - performs the Java code:1059* Accessible a = EventQueueMonitor.getAccessibleAt(x, y);1060* return a.getAccessibleContext();1061*1062* Note: this call explicitly goes through the AccessBridge,1063* so that the AccessBridge can hide expected changes in how this functions1064* between JDK 1.1.x w/AccessibilityUtility classes, and JDK 1.2, when some1065* of this functionality may be built into the platform1066*1067*/1068BOOL1069WinAccessBridge::getAccessibleContextAt(long vmID, JOBJECT64 AccessibleContextParent,1070jint x, jint y, JOBJECT64 *AccessibleContext) {1071if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1072return FALSE;1073}10741075char buffer[sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage)];1076PackageType *type = (PackageType *) buffer;1077GetAccessibleContextAtPackage *pkg = (GetAccessibleContextAtPackage *) (buffer + sizeof(PackageType));1078*type = cGetAccessibleContextAtPackage;1079pkg->vmID = vmID;1080pkg->AccessibleContext = AccessibleContextParent;1081pkg->x = x;1082pkg->y = y;10831084PrintDebugString("[INFO]: WinAccessBridge::getAccessibleContextAt(%X, %p, %d, %c)", vmID, AccessibleContextParent, x, y);1085HWND destABWindow = javaVMs->findAccessBridgeWindow(pkg->vmID);1086if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1087*AccessibleContext = pkg->rAccessibleContext;1088return TRUE;1089}10901091return FALSE;1092}109310941095/**1096* getAccessibleContextWithFocus - performs the Java code:1097* Accessible a = Translator.getAccessible(SwingEventMonitor.getComponentWithFocus());1098* return a.getAccessibleContext();1099*1100* Note: this call explicitly goes through the AccessBridge,1101* so that the AccessBridge can hide expected changes in how this functions1102* between JDK 1.1.x w/AccessibilityUtility classes, and JDK 1.2, when some1103* of this functionality may be built into the platform1104*1105*/1106BOOL1107WinAccessBridge::getAccessibleContextWithFocus(HWND window, long *vmID, JOBJECT64 *AccessibleContext) {11081109if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1110return FALSE;1111}1112char buffer[sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage)];1113PackageType *type = (PackageType *) buffer;1114GetAccessibleContextWithFocusPackage *pkg = (GetAccessibleContextWithFocusPackage *) (buffer + sizeof(PackageType));1115*type = cGetAccessibleContextWithFocusPackage;11161117PrintDebugString("[INFO]: WinAccessBridge::getAccessibleContextWithFocus(%p, %X, )", window, vmID);1118// find vmID, etc. from HWND; ask that VM for the AC w/Focus1119HWND pkgVMID;1120if (getAccessibleContextFromHWND(window, (long *)&(pkgVMID), &(pkg->rAccessibleContext)) == TRUE) {1121HWND destABWindow = javaVMs->findAccessBridgeWindow((long)pkgVMID); // ineffecient [[[FIXME]]]1122if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1123*vmID = pkg->rVMID;1124*AccessibleContext = pkg->rAccessibleContext;1125return TRUE;1126}1127}11281129return FALSE;1130}11311132/**1133* getAccessibleContextInfo - fills a struct with a bunch of information1134* contained in the Java Accessibility API1135*1136*1137* Note: if the AccessibleContext parameter is bogus, this call will blow up1138*/1139BOOL1140WinAccessBridge::getAccessibleContextInfo(long vmID,1141JOBJECT64 accessibleContext,1142AccessibleContextInfo *info) {1143if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1144return FALSE;1145}1146char buffer[sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage)];1147PackageType *type = (PackageType *) buffer;1148GetAccessibleContextInfoPackage *pkg = (GetAccessibleContextInfoPackage *) (buffer + sizeof(PackageType));1149*type = cGetAccessibleContextInfoPackage;1150pkg->vmID = vmID;1151pkg->AccessibleContext = accessibleContext;11521153#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1154PrintDebugString("[INFO]: WinAccessBridge::getAccessibleContextInfo(%X, %p, )", vmID, accessibleContext);1155#else // JOBJECT64 is jlong (64 bit)1156PrintDebugString("[INFO]: WinAccessBridge::getAccessibleContextInfo(%X, %016I64X, )", vmID, accessibleContext);1157#endif1158// need to call only the HWND/VM that contains this AC1159HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1160if (destABWindow != (HWND) 0) {1161if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1162memcpy(info, &(pkg->rAccessibleContextInfo), sizeof(AccessibleContextInfo));1163PrintDebugString("[INFO]: name: %ls\n"\1164" description: %ls\n"\1165" role: %ls\n"\1166" role_en_US: %ls\n"\1167" states: %ls\n"\1168" states_en_US: %ls\n"\1169, info->name, info->description, info->role, info->role_en_US, info->states, info->states_en_US);1170return TRUE;1171}1172}11731174return FALSE;1175}11761177/**1178* getAccessibleChildFromContext - performs the Java code:1179* Accessible child = ac.getAccessibleChild(i);1180* return child.getAccessibleContext();1181*1182* Note: this call explicitly goes through the AccessBridge,1183* so that the AccessBridge can hide expected changes in how this functions1184* between JDK 1.1.x w/AccessibilityUtility classes, and JDK 1.2, when some1185* of this functionality may be built into the platform1186*1187*/1188JOBJECT641189WinAccessBridge::getAccessibleChildFromContext(long vmID,1190JOBJECT64 AccessibleContext,1191jint childIndex) {1192if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1193return (JOBJECT64)0;1194}1195char buffer[sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage)];1196PackageType *type = (PackageType *) buffer;1197GetAccessibleChildFromContextPackage *pkg = (GetAccessibleChildFromContextPackage *) (buffer + sizeof(PackageType));1198*type = cGetAccessibleChildFromContextPackage;1199pkg->vmID = vmID;1200pkg->AccessibleContext = AccessibleContext;1201pkg->childIndex = childIndex;12021203#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1204PrintDebugString("[INFO]: WinAccessBridge::getAccessibleChildFromContext(%X, %p, %d)", vmID, AccessibleContext, childIndex);1205#else // JOBJECT64 is jlong (64 bit)1206PrintDebugString("[INFO]: WinAccessBridge::getAccessibleChildFromContext(%X, %016I64X, %d)", vmID, AccessibleContext, childIndex);1207#endif1208// need to call only the HWND/VM that contains this AC1209HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1210if (destABWindow != (HWND) 0) {1211if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1212return pkg->rAccessibleContext;1213}1214}12151216return (JOBJECT64) 0;1217}12181219/**1220* getAccessibleParentFromContext - returns the parent AccessibleContext jobject1221*1222* Note: this may be null, if the AccessibleContext passed in is a top-level1223* window, then it has no parent.1224*1225*/1226JOBJECT641227WinAccessBridge::getAccessibleParentFromContext(long vmID,1228JOBJECT64 AccessibleContext) {1229if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1230return (JOBJECT64)0;1231}1232char buffer[sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage)];1233PackageType *type = (PackageType *) buffer;1234GetAccessibleParentFromContextPackage *pkg = (GetAccessibleParentFromContextPackage *) (buffer + sizeof(PackageType));1235*type = cGetAccessibleParentFromContextPackage;1236pkg->vmID = vmID;1237pkg->AccessibleContext = AccessibleContext;12381239PrintDebugString("[INFO]: WinAccessBridge::getAccessibleParentFromContext(%X, %p)", vmID, AccessibleContext);1240// need to call only the HWND/VM that contains this AC1241HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1242if (destABWindow != (HWND) 0) {1243if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1244return pkg->rAccessibleContext;1245}1246}12471248return (JOBJECT64) 0;1249}12501251/********** AccessibleTable routines ***********************************/12521253BOOL1254WinAccessBridge::getAccessibleTableInfo(long vmID,1255JOBJECT64 accessibleContext,1256AccessibleTableInfo *tableInfo) {12571258#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1259PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableInfo(%X, %p, %p)", vmID, accessibleContext,1260tableInfo);1261#else // JOBJECT64 is jlong (64 bit)1262PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableInfo(%X, %016I64X, %p)", vmID, accessibleContext,1263tableInfo);1264#endif12651266if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1267return FALSE;1268}1269char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage)];1270PackageType *type = (PackageType *) buffer;1271GetAccessibleTableInfoPackage *pkg = (GetAccessibleTableInfoPackage *) (buffer + sizeof(PackageType));1272*type = cGetAccessibleTableInfoPackage;1273pkg->vmID = vmID;1274pkg->accessibleContext = accessibleContext;12751276// need to call only the HWND/VM that contains this AC1277HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1278if (destABWindow != (HWND) 0) {1279if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1280memcpy(tableInfo, &(pkg->rTableInfo), sizeof(AccessibleTableInfo));1281if (pkg->rTableInfo.rowCount != -1) {1282PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableInfo succeeded");1283return TRUE;1284}1285}1286}1287PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableInfo failed");1288return FALSE;1289}12901291BOOL1292WinAccessBridge::getAccessibleTableCellInfo(long vmID, JOBJECT64 accessibleTable,1293jint row, jint column,1294AccessibleTableCellInfo *tableCellInfo) {12951296PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableCellInfo(%X, %p, %d, %d, %p)", vmID,1297accessibleTable, row, column, tableCellInfo);12981299if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1300return FALSE;1301}13021303char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage)];1304PackageType *type = (PackageType *) buffer;1305GetAccessibleTableCellInfoPackage *pkg = (GetAccessibleTableCellInfoPackage *) (buffer + sizeof(PackageType));1306*type = cGetAccessibleTableCellInfoPackage;1307pkg->vmID = vmID;1308pkg->accessibleTable = accessibleTable;1309pkg->row = row;1310pkg->column = column;1311HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);13121313if (destABWindow != (HWND) 0) {1314if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1315PrintDebugString("[INFO]: XXXX pkg->rTableCellInfo.accessibleContext = %p", pkg->rTableCellInfo.accessibleContext);1316memcpy(tableCellInfo, &(pkg->rTableCellInfo), sizeof(AccessibleTableCellInfo));1317PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableCellInfo succeeded");1318return TRUE;1319}1320}1321PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableCellInfo failed");1322return FALSE;1323}132413251326BOOL1327WinAccessBridge::getAccessibleTableRowHeader(long vmID, JOBJECT64 accessibleContext, AccessibleTableInfo *tableInfo) {13281329#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1330PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowHeader(%X, %p)", vmID, accessibleContext);1331#else // JOBJECT64 is jlong (64 bit)1332PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowHeader(%X, %016I64X)", vmID, accessibleContext);1333#endif13341335if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1336return FALSE;1337}1338char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage)];1339PackageType *type = (PackageType *) buffer;1340GetAccessibleTableRowHeaderPackage *pkg = (GetAccessibleTableRowHeaderPackage *) (buffer + sizeof(PackageType));1341*type = cGetAccessibleTableRowHeaderPackage;1342pkg->vmID = vmID;1343pkg->accessibleContext = accessibleContext;13441345// need to call only the HWND/VM that contains this AC1346HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1347if (destABWindow != (HWND) 0) {1348if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1349PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowHeader succeeded");1350memcpy(tableInfo, &(pkg->rTableInfo), sizeof(AccessibleTableInfo));1351return TRUE;1352}1353}1354PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableRowHeader failed");1355return FALSE;1356}13571358BOOL1359WinAccessBridge::getAccessibleTableColumnHeader(long vmID, JOBJECT64 accessibleContext, AccessibleTableInfo *tableInfo) {13601361#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1362PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnHeader(%X, %p)", vmID, accessibleContext);1363#else // JOBJECT64 is jlong (64 bit)1364PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnHeader(%X, %016I64X)", vmID, accessibleContext);1365#endif13661367if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1368return FALSE;1369}1370char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage)];1371PackageType *type = (PackageType *) buffer;1372GetAccessibleTableColumnHeaderPackage *pkg = (GetAccessibleTableColumnHeaderPackage *) (buffer + sizeof(PackageType));1373*type = cGetAccessibleTableColumnHeaderPackage;1374pkg->vmID = vmID;1375pkg->accessibleContext = accessibleContext;13761377// need to call only the HWND/VM that contains this AC1378HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1379if (destABWindow != (HWND) 0) {1380if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1381PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnHeader succeeded");1382memcpy(tableInfo, &(pkg->rTableInfo), sizeof(AccessibleTableInfo));1383return TRUE;1384}1385}1386PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableColumnHeader failed");1387return FALSE;1388}13891390JOBJECT641391WinAccessBridge::getAccessibleTableRowDescription(long vmID,1392JOBJECT64 accessibleContext,1393jint row) {13941395#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1396PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowDescription(%X, %p, %d)", vmID, accessibleContext,1397row);1398#else // JOBJECT64 is jlong (64 bit)1399PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowDescription(%X, %016I64X, %d)", vmID, accessibleContext,1400row);1401#endif14021403if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1404return FALSE;1405}1406char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage)];1407PackageType *type = (PackageType *) buffer;1408GetAccessibleTableRowDescriptionPackage *pkg = (GetAccessibleTableRowDescriptionPackage *) (buffer + sizeof(PackageType));1409*type = cGetAccessibleTableRowDescriptionPackage;1410pkg->vmID = vmID;1411pkg->row = row;1412pkg->accessibleContext = accessibleContext;14131414// need to call only the HWND/VM that contains this AC1415HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1416if (destABWindow != (HWND) 0) {1417if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1418PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowDescription succeeded");1419return pkg->rAccessibleContext;1420}1421}1422PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableRowDescription failed");1423return (JOBJECT64)0;1424}14251426JOBJECT641427WinAccessBridge::getAccessibleTableColumnDescription(long vmID,1428JOBJECT64 accessibleContext,1429jint column) {14301431#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1432PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnDescription(%X, %p, %d)", vmID, accessibleContext,1433column);1434#else // JOBJECT64 is jlong (64 bit)1435PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnDescription(%X, %016I64X, %d)", vmID, accessibleContext,1436column);1437#endif14381439if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1440return FALSE;1441}1442char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage)];1443PackageType *type = (PackageType *) buffer;1444GetAccessibleTableColumnDescriptionPackage *pkg =1445(GetAccessibleTableColumnDescriptionPackage *) (buffer + sizeof(PackageType));1446*type = cGetAccessibleTableColumnDescriptionPackage;1447pkg->vmID = vmID;1448pkg->column = column;1449pkg->accessibleContext = accessibleContext;14501451// need to call only the HWND/VM that contains this AC1452HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1453if (destABWindow != (HWND) 0) {1454if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1455PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnDescription succeeded");1456return pkg->rAccessibleContext;1457}1458}1459PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableColumnDescription failed");1460return (JOBJECT64)0;1461}14621463jint1464WinAccessBridge::getAccessibleTableRowSelectionCount(long vmID, JOBJECT64 accessibleTable) {14651466#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1467PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowSelectionCount(%X, %p)", vmID, accessibleTable);1468#else // JOBJECT64 is jlong (64 bit)1469PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowSelectionCount(%X, %016I64X)", vmID, accessibleTable);1470#endif14711472if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1473return 0;1474}1475char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage)];1476PackageType *type = (PackageType *) buffer;1477GetAccessibleTableRowSelectionCountPackage *pkg =1478(GetAccessibleTableRowSelectionCountPackage *) (buffer + sizeof(PackageType));1479*type = cGetAccessibleTableRowSelectionCountPackage;1480pkg->vmID = vmID;1481pkg->accessibleTable = accessibleTable;14821483// need to call only the HWND/VM that contains this AC1484HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1485if (destABWindow != (HWND) 0) {1486if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1487PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowSelectionCount succeeded");1488return pkg->rCount;1489}1490}1491PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableRowSelectionCount failed");1492return 0;1493}14941495BOOL1496WinAccessBridge::isAccessibleTableRowSelected(long vmID, JOBJECT64 accessibleTable, jint row) {14971498#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1499PrintDebugString("[INFO]: ##### WinAccessBridge::isAccessibleTableRowSelected(%X, %p)", vmID, accessibleTable);1500#else // JOBJECT64 is jlong (64 bit)1501PrintDebugString("[INFO]: ##### WinAccessBridge::isAccessibleTableRowSelected(%X, %016I64X)", vmID, accessibleTable);1502#endif15031504if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1505return FALSE;1506}1507char buffer[sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage)];1508PackageType *type = (PackageType *) buffer;1509IsAccessibleTableRowSelectedPackage *pkg = (IsAccessibleTableRowSelectedPackage *) (buffer + sizeof(PackageType));1510*type = cIsAccessibleTableRowSelectedPackage;1511pkg->vmID = vmID;1512pkg->accessibleTable = accessibleTable;1513pkg->row = row;15141515// need to call only the HWND/VM that contains this AC1516HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1517if (destABWindow != (HWND) 0) {1518if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1519PrintDebugString("[INFO]: ##### WinAccessBridge::isAccessibleTableRowSelected succeeded");1520return pkg->rResult;1521}1522}1523PrintDebugString("[ERROR]: ##### WinAccessBridge::isAccessibleTableRowSelected failed");1524return FALSE;1525}15261527BOOL1528WinAccessBridge::getAccessibleTableRowSelections(long vmID, JOBJECT64 accessibleTable, jint count, jint *selections) {15291530#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1531PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowSelections(%X, %p)", vmID, accessibleTable);1532#else // JOBJECT64 is jlong (64 bit)1533PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowSelections(%X, %016I64X)", vmID, accessibleTable);1534#endif15351536if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1537return FALSE;1538}1539char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage)];1540PackageType *type = (PackageType *) buffer;1541GetAccessibleTableRowSelectionsPackage *pkg =1542(GetAccessibleTableRowSelectionsPackage *) (buffer + sizeof(PackageType));1543*type = cGetAccessibleTableRowSelectionsPackage;1544pkg->vmID = vmID;1545pkg->accessibleTable = accessibleTable;1546pkg->count = count;15471548// need to call only the HWND/VM that contains this AC1549HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1550if (destABWindow != (HWND) 0) {1551if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1552PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRowSelections succeeded");1553memcpy(selections, pkg->rSelections, count * sizeof(jint));1554return TRUE;1555}1556}1557PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableRowSelections failed");1558return FALSE;1559}156015611562jint1563WinAccessBridge::getAccessibleTableColumnSelectionCount(long vmID, JOBJECT64 accessibleTable) {15641565#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1566PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnSelectionCount(%X, %p)", vmID,1567accessibleTable);1568#else // JOBJECT64 is jlong (64 bit)1569PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnSelectionCount(%X, %016I64X)", vmID,1570accessibleTable);1571#endif15721573if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1574return FALSE;1575}1576char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage)];1577PackageType *type = (PackageType *) buffer;1578GetAccessibleTableColumnSelectionCountPackage *pkg =1579(GetAccessibleTableColumnSelectionCountPackage *) (buffer + sizeof(PackageType));1580*type = cGetAccessibleTableColumnSelectionCountPackage;1581pkg->vmID = vmID;1582pkg->accessibleTable = accessibleTable;15831584// need to call only the HWND/VM that contains this AC1585HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1586if (destABWindow != (HWND) 0) {1587if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1588PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnSelectionCount succeeded");1589return pkg->rCount;1590}1591}1592PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableColumnSelectionCount failed");1593return 0;1594}15951596BOOL1597WinAccessBridge::isAccessibleTableColumnSelected(long vmID, JOBJECT64 accessibleTable, jint column) {1598#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1599PrintDebugString("[INFO]: ##### WinAccessBridge::isAccessibleTableColumnSelected(%X, %p)", vmID, accessibleTable);1600#else // JOBJECT64 is jlong (64 bit)1601PrintDebugString("[INFO]: ##### WinAccessBridge::isAccessibleTableColumnSelected(%X, %016I64X)", vmID, accessibleTable);1602#endif16031604if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1605return FALSE;1606}1607char buffer[sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage)];1608PackageType *type = (PackageType *) buffer;1609IsAccessibleTableColumnSelectedPackage *pkg = (IsAccessibleTableColumnSelectedPackage *) (buffer + sizeof(PackageType));1610*type = cIsAccessibleTableColumnSelectedPackage;1611pkg->vmID = vmID;1612pkg->accessibleTable = accessibleTable;1613pkg->column = column;16141615// need to call only the HWND/VM that contains this AC1616HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1617if (destABWindow != (HWND) 0) {1618if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1619PrintDebugString("[INFO]: ##### WinAccessBridge::isAccessibleTableColumnSelected succeeded");1620return pkg->rResult;1621}1622}1623PrintDebugString("[ERROR]: ##### WinAccessBridge::isAccessibleTableColumnSelected failed");1624return FALSE;1625}16261627BOOL1628WinAccessBridge::getAccessibleTableColumnSelections(long vmID, JOBJECT64 accessibleTable, jint count,1629jint *selections) {16301631#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1632PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnSelections(%X, %p)", vmID, accessibleTable);1633#else // JOBJECT64 is jlong (64 bit)1634PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableColumnSelections(%X, %016I64X)", vmID, accessibleTable);1635#endif16361637if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1638return FALSE;1639}1640char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage)];1641PackageType *type = (PackageType *) buffer;1642GetAccessibleTableColumnSelectionsPackage *pkg =1643(GetAccessibleTableColumnSelectionsPackage *) (buffer + sizeof(PackageType));1644*type = cGetAccessibleTableColumnSelectionsPackage;1645pkg->vmID = vmID;1646pkg->count = count;1647pkg->accessibleTable = accessibleTable;16481649// need to call only the HWND/VM that contains this AC1650HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1651if (destABWindow != (HWND) 0) {1652if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1653PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumnSelections succeeded");1654memcpy(selections, pkg->rSelections, count * sizeof(jint));1655return TRUE;1656}1657}1658PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableColumnSelections failed");1659return FALSE;1660}16611662jint1663WinAccessBridge::getAccessibleTableRow(long vmID, JOBJECT64 accessibleTable, jint index) {16641665#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1666PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRow(%X, %p, index=%d)", vmID,1667accessibleTable, index);1668#else // JOBJECT64 is jlong (64 bit)1669PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRow(%X, %016I64X, index=%d)", vmID,1670accessibleTable, index);1671#endif16721673if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1674return FALSE;1675}1676char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage)];1677PackageType *type = (PackageType *) buffer;1678GetAccessibleTableRowPackage *pkg =1679(GetAccessibleTableRowPackage *) (buffer + sizeof(PackageType));1680*type = cGetAccessibleTableRowPackage;1681pkg->vmID = vmID;1682pkg->accessibleTable = accessibleTable;1683pkg->index = index;16841685// need to call only the HWND/VM that contains this AC1686HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1687if (destABWindow != (HWND) 0) {1688if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1689PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableRow succeeded");1690return pkg->rRow;1691}1692}1693PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableRow failed");1694return 0;1695}16961697jint1698WinAccessBridge::getAccessibleTableColumn(long vmID, JOBJECT64 accessibleTable, jint index) {16991700#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1701PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumn(%X, %p, index=%d)", vmID,1702accessibleTable, index);1703#else // JOBJECT64 is jlong (64 bit)1704PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumn(%X, %016I64X, index=%d)", vmID,1705accessibleTable, index);1706#endif17071708if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1709return FALSE;1710}1711char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage)];1712PackageType *type = (PackageType *) buffer;1713GetAccessibleTableColumnPackage *pkg =1714(GetAccessibleTableColumnPackage *) (buffer + sizeof(PackageType));1715*type = cGetAccessibleTableColumnPackage;1716pkg->vmID = vmID;1717pkg->accessibleTable = accessibleTable;1718pkg->index = index;17191720// need to call only the HWND/VM that contains this AC1721HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1722if (destABWindow != (HWND) 0) {1723if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1724PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableColumn succeeded");1725return pkg->rColumn;1726}1727}1728PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableColumn failed");1729return 0;1730}17311732jint1733WinAccessBridge::getAccessibleTableIndex(long vmID, JOBJECT64 accessibleTable, jint row, jint column) {17341735#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1736PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableIndex(%X, %p, row=%d, col=%d)", vmID,1737accessibleTable, row, column);1738#else // JOBJECT64 is jlong (64 bit)1739PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableIndex(%X, %016I64X, row=%d, col=%d)", vmID,1740accessibleTable, row, column);1741#endif17421743if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1744return FALSE;1745}1746char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage)];1747PackageType *type = (PackageType *) buffer;1748GetAccessibleTableIndexPackage *pkg =1749(GetAccessibleTableIndexPackage *) (buffer + sizeof(PackageType));1750*type = cGetAccessibleTableIndexPackage;1751pkg->vmID = vmID;1752pkg->accessibleTable = accessibleTable;1753pkg->row = row;1754pkg->column = column;17551756// need to call only the HWND/VM that contains this AC1757HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1758if (destABWindow != (HWND) 0) {1759if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1760PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleTableIndex succeeded");1761return pkg->rIndex;1762}1763}1764PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleTableIndex failed");1765return 0;1766}17671768/********** end AccessibleTable routines ******************************/17691770BOOL1771WinAccessBridge::getAccessibleRelationSet(long vmID, JOBJECT64 accessibleContext,1772AccessibleRelationSetInfo *relationSetInfo) {17731774#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1775PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleRelationSet(%X, %p, %X)", vmID,1776accessibleContext, relationSetInfo);1777#else // JOBJECT64 is jlong (64 bit)1778PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleRelationSet(%X, %016I64X, %X)", vmID,1779accessibleContext, relationSetInfo);1780#endif17811782if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1783return FALSE;1784}17851786char buffer[sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage)];1787PackageType *type = (PackageType *) buffer;1788GetAccessibleRelationSetPackage *pkg = (GetAccessibleRelationSetPackage *) (buffer + sizeof(PackageType));1789*type = cGetAccessibleRelationSetPackage;1790pkg->vmID = vmID;1791pkg->accessibleContext = accessibleContext;17921793HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1794if (destABWindow != (HWND) 0) {1795if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1796PrintDebugString("[INFO]: ##### pkg->rAccessibleRelationSetInfo.relationCount = %X",1797pkg->rAccessibleRelationSetInfo.relationCount);1798memcpy(relationSetInfo, &(pkg->rAccessibleRelationSetInfo), sizeof(AccessibleRelationSetInfo));1799PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleRelationSet succeeded");1800return TRUE;1801}1802}1803PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleRelationSet failed");1804return FALSE;1805}180618071808/********** AccessibleHypertext routines ***********/18091810BOOL1811WinAccessBridge::getAccessibleHypertext(long vmID, JOBJECT64 accessibleContext,1812AccessibleHypertextInfo *hypertextInfo) {18131814#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1815PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHypertext(%X, %p, %X)", vmID,1816accessibleContext, hypertextInfo);1817#else // JOBJECT64 is jlong (64 bit)1818PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHypertext(%X, %016I64X, %X)", vmID,1819accessibleContext, hypertextInfo);1820#endif18211822if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1823return FALSE;1824}18251826char buffer[sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage)];1827PackageType *type = (PackageType *) buffer;1828GetAccessibleHypertextPackage *pkg = (GetAccessibleHypertextPackage *) (buffer + sizeof(PackageType));1829*type = cGetAccessibleHypertextPackage;1830pkg->vmID = vmID;1831pkg->accessibleContext = accessibleContext;18321833HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1834if (destABWindow != (HWND) 0) {1835if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1836memcpy(hypertextInfo, &(pkg->rAccessibleHypertextInfo), sizeof(AccessibleHypertextInfo));18371838PrintDebugString("[INFO]: ##### hypertextInfo.linkCount = %d", hypertextInfo->linkCount);1839PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHypertext succeeded");18401841return TRUE;1842}1843}1844PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleHypertext failed");1845return FALSE;1846}184718481849BOOL1850WinAccessBridge::activateAccessibleHyperlink(long vmID, JOBJECT64 accessibleContext,1851JOBJECT64 accessibleHyperlink) {18521853#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1854PrintDebugString("[INFO]: WinAccessBridge::activateAccessibleHyperlink(%p %p)", accessibleContext,1855accessibleHyperlink);1856#else // JOBJECT64 is jlong (64 bit)1857PrintDebugString("[INFO]: WinAccessBridge::activateAccessibleHyperlink(%016I64X %016I64X)", accessibleContext,1858accessibleHyperlink);1859#endif18601861if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1862return FALSE;1863}18641865char buffer[sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage)];1866PackageType *type = (PackageType *) buffer;1867ActivateAccessibleHyperlinkPackage *pkg = (ActivateAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType));1868*type = cActivateAccessibleHyperlinkPackage;1869pkg->vmID = vmID;1870pkg->accessibleContext = accessibleContext;1871pkg->accessibleHyperlink = accessibleHyperlink;18721873HWND destABWindow = javaVMs->findAccessBridgeWindow(pkg->vmID);1874if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1875return pkg->rResult;1876}1877PrintDebugString("[ERROR]: WinAccessBridge::activateAccessibleHyperlink returning FALSE (sendMemoryPackage failed)");1878return FALSE;1879}18801881/*1882* Returns the number of hyperlinks in a component1883* Maps to AccessibleHypertext.getLinkCount.1884* Returns -1 on error.1885*/1886jint1887WinAccessBridge::getAccessibleHyperlinkCount(const long vmID,1888const AccessibleContext accessibleContext) {18891890#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1891PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHyperlinkCount(%X, %p)",1892vmID, accessibleContext);1893#else // JOBJECT64 is jlong (64 bit)1894PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHyperlinkCount(%X, %016I64X)",1895vmID, accessibleContext);1896#endif18971898if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1899return FALSE;1900}19011902char buffer[sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage)];1903PackageType *type = (PackageType *) buffer;1904GetAccessibleHyperlinkCountPackage *pkg = (GetAccessibleHyperlinkCountPackage *) (buffer + sizeof(PackageType));1905*type = cGetAccessibleHyperlinkCountPackage;1906pkg->vmID = vmID;1907pkg->accessibleContext = accessibleContext;19081909HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1910if (destABWindow != (HWND) 0) {1911if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1912PrintDebugString("[INFO]: ##### hypetext link count = %d", pkg->rLinkCount);1913PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHyperlinkCount succeeded");1914return pkg->rLinkCount;1915}1916}1917PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleHyperlinkCount failed");1918return -1;1919}19201921/*1922* This method is used to iterate through the hyperlinks in a component. It1923* returns hypertext information for a component starting at hyperlink index1924* nStartIndex. No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will1925* be returned for each call to this method.1926* returns FALSE on error.1927*/1928BOOL1929WinAccessBridge::getAccessibleHypertextExt(const long vmID,1930const AccessibleContext accessibleContext,1931const jint startIndex,1932/* OUT */ AccessibleHypertextInfo *hypertextInfo) {19331934#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1935PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHypertextExt(%X, %p %p)", vmID,1936accessibleContext, hypertextInfo);1937#else // JOBJECT64 is jlong (64 bit)1938PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHypertextExt(%X, %016I64X %p)", vmID,1939accessibleContext, hypertextInfo);1940#endif19411942if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1943return FALSE;1944}19451946char buffer[sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage)];1947PackageType *type = (PackageType *) buffer;1948GetAccessibleHypertextExtPackage *pkg = (GetAccessibleHypertextExtPackage *) (buffer + sizeof(PackageType));1949*type = cGetAccessibleHypertextExtPackage;1950pkg->vmID = vmID;1951pkg->accessibleContext = accessibleContext;1952pkg->startIndex = startIndex;19531954HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);1955if (destABWindow != (HWND) 0) {1956if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {1957PrintDebugString("[INFO]: ##### pkg->rSuccess = %d", pkg->rSuccess);19581959memcpy(hypertextInfo, &(pkg->rAccessibleHypertextInfo), sizeof(AccessibleHypertextInfo));1960if (pkg->rSuccess == TRUE) {1961PrintDebugString("[INFO]: ##### hypertextInfo.linkCount = %d", hypertextInfo->linkCount);1962} else {1963PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleHypertextExt failed");1964}1965return pkg->rSuccess;1966}1967}1968PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleHypertextExt failed");1969return FALSE;1970}197119721973/*1974* Returns the index into an array of hyperlinks that is associated with1975* a character index in document;1976* Maps to AccessibleHypertext.getLinkIndex.1977* Returns -1 on error.1978*/1979jint1980WinAccessBridge::getAccessibleHypertextLinkIndex(const long vmID,1981const AccessibleHyperlink hypertext,1982const jint charIndex) {19831984#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)1985PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHypertextLinkIndex(%X, %p)",1986vmID, hypertext);1987#else // JOBJECT64 is jlong (64 bit)1988PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHypertextLinkIndex(%X, %016I64X)",1989vmID, hypertext);1990#endif19911992if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {1993return FALSE;1994}19951996char buffer[sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage)];1997PackageType *type = (PackageType *) buffer;1998GetAccessibleHypertextLinkIndexPackage *pkg = (GetAccessibleHypertextLinkIndexPackage *) (buffer + sizeof(PackageType));1999*type = cGetAccessibleHypertextLinkIndexPackage;2000pkg->vmID = vmID;2001pkg->hypertext = hypertext;2002pkg->charIndex = charIndex;20032004HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2005if (destABWindow != (HWND) 0) {2006if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2007PrintDebugString("[INFO]: ##### hypetext link index = %d", pkg->rLinkIndex);2008PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHypertextLinkIndex succeeded");2009return pkg->rLinkIndex;2010}2011}2012PrintDebugString("[ERROR] ##### WinAccessBridge::getAccessibleHypertextLinkIndex failed");2013return -1;2014}20152016/*2017* Returns the nth hyperlink in a document.2018* Maps to AccessibleHypertext.getLink.2019* Returns -1 on error2020*/2021BOOL2022WinAccessBridge::getAccessibleHyperlink(const long vmID,2023const AccessibleHyperlink hypertext,2024const jint linkIndex,2025/* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo) {20262027#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2028PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHyperlink(%X, %p, %p)", vmID,2029hypertext, hyperlinkInfo);2030#else // JOBJECT64 is jlong (64 bit)2031PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHyperlink(%X, %016I64X, %p)", vmID,2032hypertext, hyperlinkInfo);2033#endif20342035if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2036return FALSE;2037}20382039char buffer[sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage)];2040PackageType *type = (PackageType *) buffer;2041GetAccessibleHyperlinkPackage *pkg = (GetAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType));2042*type = cGetAccessibleHyperlinkPackage;2043pkg->vmID = vmID;2044pkg->hypertext = hypertext;2045pkg->linkIndex = linkIndex;20462047HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2048if (destABWindow != (HWND) 0) {2049if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2050memcpy(hyperlinkInfo, &(pkg->rAccessibleHyperlinkInfo),2051sizeof(AccessibleHyperlinkInfo));2052PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleHypertext succeeded");2053return TRUE;2054}2055}2056PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleHypertext failed");2057return FALSE;2058}205920602061/********** AccessibleKeyBinding routines ***********/20622063BOOL2064WinAccessBridge::getAccessibleKeyBindings(long vmID, JOBJECT64 accessibleContext,2065AccessibleKeyBindings *keyBindings) {20662067#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2068PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleKeyBindings(%X, %p, %p)", vmID,2069accessibleContext, keyBindings);2070#else // JOBJECT64 is jlong (64 bit)2071PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleKeyBindings(%X, %016I64X, %p)", vmID,2072accessibleContext, keyBindings);2073#endif20742075if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2076return FALSE;2077}20782079char buffer[sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage)];2080PackageType *type = (PackageType *) buffer;2081GetAccessibleKeyBindingsPackage *pkg = (GetAccessibleKeyBindingsPackage *) (buffer + sizeof(PackageType));2082*type = cGetAccessibleKeyBindingsPackage;2083pkg->vmID = vmID;2084pkg->accessibleContext = accessibleContext;20852086HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2087if (destABWindow != (HWND) 0) {2088if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2089memcpy(keyBindings, &(pkg->rAccessibleKeyBindings), sizeof(AccessibleKeyBindings));20902091PrintDebugString("[INFO]: ##### keyBindings.keyBindingsCount = %d", keyBindings->keyBindingsCount);2092for (int i = 0; i < keyBindings->keyBindingsCount; ++i) {2093PrintDebugString("[INFO]: Key Binding # %d"\2094" Modifiers: 0x%x"\2095" Character (hex): 0x%x"\2096" Character (wide char): %lc"\2097, i+1, keyBindings->keyBindingInfo[i].modifiers, keyBindings->keyBindingInfo[i].character, keyBindings->keyBindingInfo[i].character);2098}2099PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleKeyBindings succeeded");21002101return TRUE;2102}2103}2104PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleKeyBindings failed");2105return FALSE;2106}21072108BOOL2109WinAccessBridge::getAccessibleIcons(long vmID, JOBJECT64 accessibleContext, AccessibleIcons *icons) {21102111#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2112PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleIcons(%X, %p, %p)", vmID,2113accessibleContext, icons);2114#else // JOBJECT64 is jlong (64 bit)2115PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleIcons(%X, %016I64X, %p)", vmID,2116accessibleContext, icons);2117#endif21182119if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2120return FALSE;2121}21222123char buffer[sizeof(PackageType) + sizeof(GetAccessibleIconsPackage)];2124PackageType *type = (PackageType *) buffer;2125GetAccessibleIconsPackage *pkg = (GetAccessibleIconsPackage *) (buffer + sizeof(PackageType));2126*type = cGetAccessibleIconsPackage;2127pkg->vmID = vmID;2128pkg->accessibleContext = accessibleContext;21292130HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2131if (destABWindow != (HWND) 0) {2132if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2133memcpy(icons, &(pkg->rAccessibleIcons), sizeof(AccessibleIcons));21342135PrintDebugString("[INFO]: ##### icons.iconsCount = %d", icons->iconsCount);2136PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleIcons succeeded");21372138return TRUE;2139}2140}2141PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleIcons failed");2142return FALSE;2143}21442145BOOL2146WinAccessBridge::getAccessibleActions(long vmID, JOBJECT64 accessibleContext, AccessibleActions *actions) {21472148#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2149PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleActions(%X, %p, %p)", vmID,2150accessibleContext, actions);2151#else // JOBJECT64 is jlong (64 bit)2152PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleActions(%X, %016I64X, %p)", vmID,2153accessibleContext, actions);2154#endif21552156if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2157return FALSE;2158}21592160char buffer[sizeof(PackageType) + sizeof(GetAccessibleActionsPackage)];2161PackageType *type = (PackageType *) buffer;2162GetAccessibleActionsPackage *pkg = (GetAccessibleActionsPackage *) (buffer + sizeof(PackageType));2163*type = cGetAccessibleActionsPackage;2164pkg->vmID = vmID;2165pkg->accessibleContext = accessibleContext;21662167HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2168if (destABWindow != (HWND) 0) {2169if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2170memcpy(actions, &(pkg->rAccessibleActions), sizeof(AccessibleActions));21712172PrintDebugString("[INFO]: ##### actions.actionsCount = %d", actions->actionsCount);2173PrintDebugString("[INFO]: ##### WinAccessBridge::getAccessibleActions succeeded");21742175return TRUE;2176}2177}2178PrintDebugString("[ERROR]: ##### WinAccessBridge::getAccessibleActions failed");2179return FALSE;2180}21812182BOOL2183WinAccessBridge::doAccessibleActions(long vmID, JOBJECT64 accessibleContext,2184AccessibleActionsToDo *actionsToDo, jint *failure) {21852186#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2187PrintDebugString("[INFO]: WinAccessBridge::doAccessibleActions(%p #actions %d %ls)", accessibleContext,2188actionsToDo->actionsCount,2189actionsToDo->actions[0].name);2190#else // JOBJECT64 is jlong (64 bit)2191PrintDebugString("[INFO]: WinAccessBridge::doAccessibleActions(%016I64X #actions %d %ls)", accessibleContext,2192actionsToDo->actionsCount,2193actionsToDo->actions[0].name);2194#endif21952196if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2197return FALSE;2198}2199char buffer[sizeof(PackageType) + sizeof(DoAccessibleActionsPackage)];2200PackageType *type = (PackageType *) buffer;2201DoAccessibleActionsPackage *pkg = (DoAccessibleActionsPackage *) (buffer + sizeof(PackageType));2202*type = cDoAccessibleActionsPackage;2203pkg->vmID = vmID;2204pkg->accessibleContext = accessibleContext;2205memcpy((void *)(&(pkg->actionsToDo)), (void *)actionsToDo, sizeof(AccessibleActionsToDo));2206pkg->failure = -1;22072208HWND destABWindow = javaVMs->findAccessBridgeWindow(pkg->vmID);2209if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2210*failure = pkg->failure;2211return pkg->rResult;2212}2213PrintDebugString("[ERROR]: WinAccessBridge::doAccessibleActions returning FALSE (sendMemoryPackage failed)");2214return FALSE;2215}22162217/* ====== Utility methods ====== */22182219/**2220* Sets a text field to the specified string. Returns whether successful.2221*/2222BOOL2223WinAccessBridge::setTextContents (const long vmID, const AccessibleContext accessibleContext,2224const wchar_t *text) {22252226if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2227return FALSE;2228}2229char buffer[sizeof(PackageType) + sizeof(SetTextContentsPackage)];2230PackageType *type = (PackageType *) buffer;2231SetTextContentsPackage *pkg = (SetTextContentsPackage *) (buffer + sizeof(PackageType));2232*type = cSetTextContentsPackage;2233pkg->vmID = vmID;2234pkg->accessibleContext = accessibleContext;2235wcsncpy(pkg->text, text, sizeof(pkg->text)/sizeof(wchar_t)); // wide character copy22362237#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2238PrintDebugString("[INFO]: WinAccessBridge::setTextContents(%X, %016I64X %ls)", vmID, accessibleContext, text);2239#else // JOBJECT64 is jlong (64 bit)2240PrintDebugString("[INFO]: WinAccessBridge::setTextContents(%X, %p %ls)", vmID, accessibleContext, text);2241#endif2242// need to call only the HWND/VM that contains this AC2243HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2244if (destABWindow != (HWND) 0) {2245if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2246return pkg->rResult;2247}2248}2249return FALSE;2250}22512252/**2253* Returns the Accessible Context of a Page Tab object that is the2254* ancestor of a given object. If the object is a Page Tab object2255* or a Page Tab ancestor object was found, returns the object2256* AccessibleContext.2257* If there is no ancestor object that has an Accessible Role of Page Tab,2258* returns (AccessibleContext)0.2259*/2260AccessibleContext2261WinAccessBridge::getParentWithRole (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role) {22622263if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2264return (JOBJECT64)0;2265}2266char buffer[sizeof(PackageType) + sizeof(GetParentWithRolePackage)];2267PackageType *type = (PackageType *) buffer;2268GetParentWithRolePackage *pkg = (GetParentWithRolePackage *) (buffer + sizeof(PackageType));2269*type = cGetParentWithRolePackage;2270pkg->vmID = vmID;2271pkg->accessibleContext = accessibleContext;2272memcpy((void *)(&(pkg->role)), (void *)role, sizeof(pkg->role));22732274#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2275PrintDebugString("[INFO]: WinAccessBridge::getParentWithRole(%X, %p)", vmID, accessibleContext);2276#else // JOBJECT64 is jlong (64 bit)2277PrintDebugString("[INFO]: WinAccessBridge::getParentWithRole(%X, %016I64X)", vmID, accessibleContext);2278#endif2279PrintDebugString("[INFO]: pkg->vmID: %X"\2280" pkg->accessibleContext: %p"\2281" pkg->role: %ls"\2282, pkg->vmID, pkg->accessibleContext, pkg->role);2283// need to call only the HWND/VM that contains this AC2284HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2285if (destABWindow != (HWND) 0) {2286if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2287PrintDebugString("[INFO]: pkg->rAccessibleContext: %p", pkg->rAccessibleContext);2288return pkg->rAccessibleContext;2289}2290}2291return (JOBJECT64) 0;2292}229322942295/**2296* Returns the Accessible Context for the top level object in2297* a Java Window. This is same Accessible Context that is obtained2298* from GetAccessibleContextFromHWND for that window. Returns2299* (AccessibleContext)0 on error.2300*/2301AccessibleContext2302WinAccessBridge::getTopLevelObject (const long vmID, const AccessibleContext accessibleContext) {23032304if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2305return (JOBJECT64)0;2306}2307char buffer[sizeof(PackageType) + sizeof(GetTopLevelObjectPackage)];2308PackageType *type = (PackageType *) buffer;2309GetTopLevelObjectPackage *pkg = (GetTopLevelObjectPackage *) (buffer + sizeof(PackageType));2310*type = cGetTopLevelObjectPackage;2311pkg->vmID = vmID;2312pkg->accessibleContext = accessibleContext;23132314#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2315PrintDebugString("[INFO]: WinAccessBridge::getTopLevelObject(%X, %p)", vmID, accessibleContext);2316#else // JOBJECT64 is jlong (64 bit)2317PrintDebugString("[INFO]: WinAccessBridge::getTopLevelObject(%X, %016I64X)", vmID, accessibleContext);2318#endif2319// need to call only the HWND/VM that contains this AC2320HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2321if (destABWindow != (HWND) 0) {2322if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2323return pkg->rAccessibleContext;2324}2325}2326return (JOBJECT64) 0;2327}23282329/**2330* If there is an Ancestor object that has an Accessible Role of2331* Internal Frame, returns the Accessible Context of the Internal2332* Frame object. Otherwise, returns the top level object for that2333* Java Window. Returns (AccessibleContext)0 on error.2334*/2335AccessibleContext2336WinAccessBridge::getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role) {23372338if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2339return (JOBJECT64)0;2340}2341char buffer[sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage)];2342PackageType *type = (PackageType *) buffer;2343GetParentWithRoleElseRootPackage *pkg = (GetParentWithRoleElseRootPackage *) (buffer + sizeof(PackageType));2344*type = cGetParentWithRoleElseRootPackage;2345pkg->vmID = vmID;2346pkg->accessibleContext = accessibleContext;2347memcpy((void *)(&(pkg->role)), (void *)role, sizeof(pkg->role));23482349#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2350PrintDebugString("[INFO]: WinAccessBridge::getParentWithRoleElseRoot(%X, %p)", vmID, accessibleContext);2351#else // JOBJECT64 is jlong (64 bit)2352PrintDebugString("[INFO]: WinAccessBridge::getParentWithRoleElseRoot(%X, %016I64X)", vmID, accessibleContext);2353#endif2354// need to call only the HWND/VM that contains this AC2355HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2356if (destABWindow != (HWND) 0) {2357if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2358return pkg->rAccessibleContext;2359}2360}2361return (JOBJECT64) 0;2362}23632364/**2365* Returns how deep in the object hierarchy a given object is.2366* The top most object in the object hierarchy has an object depth of 0.2367* Returns -1 on error.2368*/2369int2370WinAccessBridge::getObjectDepth (const long vmID, const AccessibleContext accessibleContext) {23712372if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2373return -1;2374}2375char buffer[sizeof(PackageType) + sizeof(GetObjectDepthPackage)];2376PackageType *type = (PackageType *) buffer;2377GetObjectDepthPackage *pkg = (GetObjectDepthPackage *) (buffer + sizeof(PackageType));2378*type = cGetObjectDepthPackage;2379pkg->vmID = vmID;2380pkg->accessibleContext = accessibleContext;23812382#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2383PrintDebugString("[INFO]: WinAccessBridge::getObjectDepth(%X, %p)", vmID, accessibleContext);2384#else // JOBJECT64 is jlong (64 bit)2385PrintDebugString("[INFO]: WinAccessBridge::getObjectDepth(%X, %016I64X)", vmID, accessibleContext);2386#endif2387// need to call only the HWND/VM that contains this AC2388HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2389if (destABWindow != (HWND) 0) {2390if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2391return pkg->rResult;2392}2393}2394return -1;2395}23962397/**2398* Returns the Accessible Context of the currently ActiveDescendent of an object.2399* Returns (AccessibleContext)0 on error.2400*/2401AccessibleContext2402WinAccessBridge::getActiveDescendent (const long vmID, const AccessibleContext accessibleContext) {24032404if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2405return (JOBJECT64)0;2406}2407char buffer[sizeof(PackageType) + sizeof(GetActiveDescendentPackage)];2408PackageType *type = (PackageType *) buffer;2409GetActiveDescendentPackage *pkg = (GetActiveDescendentPackage *) (buffer + sizeof(PackageType));2410*type = cGetActiveDescendentPackage;2411pkg->vmID = vmID;2412pkg->accessibleContext = accessibleContext;24132414#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2415PrintDebugString("[INFO]: WinAccessBridge::getActiveDescendent(%X, %p)", vmID, accessibleContext);2416#else // JOBJECT64 is jlong (64 bit)2417PrintDebugString("[INFO]: WinAccessBridge::getActiveDescendent(%X, %016I64X)", vmID, accessibleContext);2418#endif2419// need to call only the HWND/VM that contains this AC2420HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2421if (destABWindow != (HWND) 0) {2422if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2423return pkg->rAccessibleContext;2424}2425}2426return (JOBJECT64) 0;2427}24282429/**2430* Additional methods for Teton2431*/24322433/**2434* Gets the AccessibleName for a component based upon the JAWS algorithm. Returns2435* whether successful.2436*2437* Bug ID 4916682 - Implement JAWS AccessibleName policy2438*/2439BOOL2440WinAccessBridge::getVirtualAccessibleName(long vmID, AccessibleContext accessibleContext,2441wchar_t *name, int len) {24422443if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2444return FALSE;2445}2446char buffer[sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage)];2447PackageType *type = (PackageType *) buffer;2448GetVirtualAccessibleNamePackage *pkg = (GetVirtualAccessibleNamePackage *) (buffer + sizeof(PackageType));2449*type = cGetVirtualAccessibleNamePackage;2450pkg->vmID = vmID;2451pkg->accessibleContext = accessibleContext;2452size_t max = (len > sizeof(pkg->rName)) ? sizeof(pkg->rName) : len;2453pkg->len = (int)max;24542455#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2456PrintDebugString("[INFO]: WinAccessBridge::getVirtualAccessibleName(%X, %p)", vmID, accessibleContext);2457#else // JOBJECT64 is jlong (64 bit)2458PrintDebugString("[INFO]: WinAccessBridge::getVirtualAccessibleName(%X, %016I64X)", vmID, accessibleContext);2459#endif2460// need to call only the HWND/VM that contains this AC2461HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2462if (destABWindow != (HWND) 0) {2463if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2464wcsncpy(name, pkg->rName, max);2465PrintDebugString("[INFO]: WinAccessBridge::getVirtualAccessibleName: Virtual name = %ls", name);2466return TRUE;2467}2468}2469return FALSE;2470}24712472/**2473* Request focus for a component. Returns whether successful;2474*2475* Bug ID 4944757 - requestFocus method needed2476*/2477BOOL2478WinAccessBridge::requestFocus(long vmID, AccessibleContext accessibleContext) {24792480if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2481return FALSE;2482}2483char buffer[sizeof(PackageType) + sizeof(RequestFocusPackage)];2484PackageType *type = (PackageType *) buffer;2485RequestFocusPackage *pkg = (RequestFocusPackage *) (buffer + sizeof(PackageType));2486*type = cRequestFocusPackage;2487pkg->vmID = vmID;2488pkg->accessibleContext = accessibleContext;24892490#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2491PrintDebugString("[INFO]: WinAccessBridge::requestFocus(%X, %p)", vmID, accessibleContext);2492#else // JOBJECT64 is jlong (64 bit)2493PrintDebugString("[INFO]: WinAccessBridge::requestFocus(%X, %016I64X)", vmID, accessibleContext);2494#endif2495// need to call only the HWND/VM that contains this AC2496HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2497if (destABWindow != (HWND) 0) {2498if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2499return TRUE;2500}2501}2502return FALSE;2503}25042505/**2506* Selects text between two indices. Selection includes the text at the start index2507* and the text at the end index. Returns whether successful;2508*2509* Bug ID 4944758 - selectTextRange method needed2510*/2511BOOL2512WinAccessBridge::selectTextRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex) {2513if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2514return FALSE;2515}2516char buffer[sizeof(PackageType) + sizeof(SelectTextRangePackage)];2517PackageType *type = (PackageType *) buffer;2518SelectTextRangePackage *pkg = (SelectTextRangePackage *) (buffer + sizeof(PackageType));2519*type = cSelectTextRangePackage;2520pkg->vmID = vmID;2521pkg->accessibleContext = accessibleContext;2522pkg->startIndex = startIndex;2523pkg->endIndex = endIndex;25242525#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2526PrintDebugString("[INFO]: WinAccessBridge::selectTextRange(%X, %p %d %d)", vmID, accessibleContext,2527startIndex, endIndex);2528#else // JOBJECT64 is jlong (64 bit)2529PrintDebugString("[INFO]: WinAccessBridge::selectTextRange(%X, %016I64X %d %d)", vmID, accessibleContext,2530startIndex, endIndex);2531#endif2532// need to call only the HWND/VM that contains this AC2533HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2534if (destABWindow != (HWND) 0) {2535if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2536return TRUE;2537}2538}2539return FALSE;2540}25412542/**2543* Get text attributes between two indices. The attribute list includes the text at the2544* start index and the text at the end index. Returns whether successful;2545*2546* Bug ID 4944761 - getTextAttributes between two indices method needed2547*/2548BOOL2549WinAccessBridge::getTextAttributesInRange(long vmID, AccessibleContext accessibleContext,2550int startIndex, int endIndex,2551AccessibleTextAttributesInfo *attributes, short *len) {25522553if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2554return FALSE;2555}2556char buffer[sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage)];2557PackageType *type = (PackageType *) buffer;2558GetTextAttributesInRangePackage *pkg = (GetTextAttributesInRangePackage *) (buffer + sizeof(PackageType));2559*type = cGetTextAttributesInRangePackage;2560pkg->vmID = vmID;2561pkg->accessibleContext = accessibleContext;2562pkg->startIndex = startIndex;2563pkg->endIndex = endIndex;2564memcpy(&(pkg->attributes), attributes, sizeof(AccessibleTextAttributesInfo));256525662567#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2568PrintDebugString("[INFO]: WinAccessBridge::getTextAttributesInRange(%X, %p %d %d)", vmID, accessibleContext,2569startIndex, endIndex);2570#else // JOBJECT64 is jlong (64 bit)2571PrintDebugString("[INFO]: WinAccessBridge::getTextAttributesInRange(%X, %016I64X %d %d)", vmID, accessibleContext,2572startIndex, endIndex);2573#endif2574// need to call only the HWND/VM that contains this AC2575HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2576if (destABWindow != (HWND) 0) {2577if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2578*attributes = pkg->attributes;2579*len = pkg->rLength;2580return TRUE;2581}2582}2583return FALSE;2584}25852586/**2587* Gets the number of visible children of a component. Returns -1 on error.2588*2589* Bug ID 4944762- getVisibleChildren for list-like components needed2590*/2591int2592WinAccessBridge::getVisibleChildrenCount(long vmID, AccessibleContext accessibleContext) {25932594if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2595return -1;2596}2597char buffer[sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage)];2598PackageType *type = (PackageType *) buffer;2599GetVisibleChildrenCountPackage *pkg = (GetVisibleChildrenCountPackage *) (buffer + sizeof(PackageType));2600*type = cGetVisibleChildrenCountPackage;2601pkg->vmID = vmID;2602pkg->accessibleContext = accessibleContext;26032604#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2605PrintDebugString("[INFO]: WinAccessBridge::getVisibleChildrenCount(%X, %p)", vmID, accessibleContext);2606#else // JOBJECT64 is jlong (64 bit)2607PrintDebugString("[INFO]: WinAccessBridge::getVisibleChildrenCount(%X, %016I64X)", vmID, accessibleContext);2608#endif2609// need to call only the HWND/VM that contains this AC2610HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2611if (destABWindow != (HWND) 0) {2612if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2613return pkg->rChildrenCount;2614}2615}2616return -1;2617}26182619/**2620* Gets the visible children of an AccessibleContext. Returns whether successful;2621*2622* Bug ID 4944762- getVisibleChildren for list-like components needed2623*/2624BOOL2625WinAccessBridge::getVisibleChildren(long vmID, AccessibleContext accessibleContext, int startIndex,2626VisibleChildrenInfo *visibleChildrenInfo) {26272628if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2629return FALSE;2630}2631char buffer[sizeof(PackageType) + sizeof(GetVisibleChildrenPackage)];2632PackageType *type = (PackageType *) buffer;2633GetVisibleChildrenPackage *pkg = (GetVisibleChildrenPackage *) (buffer + sizeof(PackageType));2634*type = cGetVisibleChildrenPackage;2635pkg->vmID = vmID;2636pkg->accessibleContext = accessibleContext;2637pkg->startIndex = startIndex;26382639#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2640PrintDebugString("[INFO]: WinAccessBridge::getVisibleChildren(%X, %p)", vmID, accessibleContext);2641#else // JOBJECT64 is jlong (64 bit)2642PrintDebugString("[INFO]: WinAccessBridge::getVisibleChildren(%X, %016I64X)", vmID, accessibleContext);2643#endif2644// need to call only the HWND/VM that contains this AC2645HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2646if (destABWindow != (HWND) 0) {2647if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2648memcpy(visibleChildrenInfo, &(pkg->rVisibleChildrenInfo), sizeof(pkg->rVisibleChildrenInfo));2649return pkg->rSuccess;2650}2651}2652return FALSE;2653}26542655/**2656* Set the caret to a text position. Returns whether successful;2657*2658* Bug ID 4944770 - setCaretPosition method needed2659*/2660BOOL2661WinAccessBridge::setCaretPosition(long vmID, AccessibleContext accessibleContext, int position) {26622663if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2664return FALSE;2665}2666char buffer[sizeof(PackageType) + sizeof(SetCaretPositionPackage)];2667PackageType *type = (PackageType *) buffer;2668SetCaretPositionPackage *pkg = (SetCaretPositionPackage *) (buffer + sizeof(PackageType));2669*type = cSetCaretPositionPackage;2670pkg->vmID = vmID;2671pkg->accessibleContext = accessibleContext;2672pkg->position = position;26732674#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2675PrintDebugString("[INFO]: WinAccessBridge::setCaretPosition(%X, %p %ls)", vmID, accessibleContext);2676#else // JOBJECT64 is jlong (64 bit)2677PrintDebugString("[INFO]: WinAccessBridge::setCaretPosition(%X, %016I64X %ls)", vmID, accessibleContext);2678#endif2679// need to call only the HWND/VM that contains this AC2680HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2681if (destABWindow != (HWND) 0) {2682if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2683return TRUE;2684}2685}2686return FALSE;2687}268826892690/********** AccessibleText routines ***********************************/26912692/**2693* getAccessibleTextInfo - fills a struct with a bunch of information2694* contained in the Java Accessibility AccessibleText API2695*2696*2697* Note: if the AccessibleContext parameter is bogus, this call will blow up2698*/2699BOOL2700WinAccessBridge::getAccessibleTextInfo(long vmID,2701JOBJECT64 AccessibleContext,2702AccessibleTextInfo *textInfo,2703jint x, jint y) {2704if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2705return FALSE;2706}2707char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage)];2708PackageType *type = (PackageType *) buffer;2709GetAccessibleTextInfoPackage *pkg = (GetAccessibleTextInfoPackage *) (buffer + sizeof(PackageType));2710*type = cGetAccessibleTextInfoPackage;2711pkg->vmID = vmID;2712pkg->AccessibleContext = AccessibleContext;2713pkg->x = x;2714pkg->y = y;27152716#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2717PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextInfo(%X, %p, %p, %d, %d)", vmID, AccessibleContext, textInfo, x, y);2718#else // JOBJECT64 is jlong (64 bit)2719PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextInfo(%X, %016I64X, %p, %d, %d)", vmID, AccessibleContext, textInfo, x, y);2720#endif2721// need to call only the HWND/VM that contains this AC2722HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2723if (destABWindow != (HWND) 0) {2724if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2725memcpy(textInfo, &(pkg->rTextInfo), sizeof(AccessibleTextInfo));2726if (pkg->rTextInfo.charCount != -1) {2727PrintDebugString("[INFO]: charCount: %d"\2728" caretIndex: %d"\2729" indexAtPoint: %d"\2730, textInfo->charCount, textInfo->caretIndex, textInfo->indexAtPoint);2731return TRUE;2732}2733}2734}27352736return FALSE;2737}27382739/**2740* getAccessibleTextItems - fills a struct with letter, word, and sentence info2741* of the AccessibleText interface at a given index2742*2743* Note: if the AccessibleContext parameter is bogus, this call will blow up2744*/2745BOOL2746WinAccessBridge::getAccessibleTextItems(long vmID,2747JOBJECT64 AccessibleContext,2748AccessibleTextItemsInfo *textItems,2749jint index) {2750if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2751return FALSE;2752}2753char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextItemsPackage)];2754PackageType *type = (PackageType *) buffer;2755GetAccessibleTextItemsPackage *pkg = (GetAccessibleTextItemsPackage *) (buffer + sizeof(PackageType));2756*type = cGetAccessibleTextItemsPackage;2757pkg->vmID = vmID;2758pkg->AccessibleContext = AccessibleContext;2759pkg->index = index;2760// zero things out, in case the call fails2761pkg->rTextItemsInfo.letter = '\0';2762pkg->rTextItemsInfo.word[0] = '\0';2763pkg->rTextItemsInfo.sentence[0] = '\0';27642765#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2766PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextItems(%X, %p, %p, %d)", vmID, AccessibleContext, textItems, index);2767#else // JOBJECT64 is jlong (64 bit)2768PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextItems(%X, %016I64X, %p, %d)", vmID, AccessibleContext, textItems, index);2769#endif2770// need to call only the HWND/VM that contains this AC2771HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2772if (destABWindow != (HWND) 0) {2773if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2774memcpy(textItems, &(pkg->rTextItemsInfo), sizeof(AccessibleTextItemsInfo));2775if (pkg->rTextItemsInfo.letter != '/0') {2776return TRUE;2777}2778}2779}27802781return FALSE;2782}27832784/**2785* getAccessibleTextSelectionInfo - returns information about the selected2786* text of the object implementing AccessibleText2787*2788* Note: if the AccessibleContext parameter is bogus, this call will blow up2789*/2790BOOL2791WinAccessBridge::getAccessibleTextSelectionInfo(long vmID,2792JOBJECT64 AccessibleContext,2793AccessibleTextSelectionInfo *selectionInfo) {2794if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2795return FALSE;2796}2797char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage)];2798PackageType *type = (PackageType *) buffer;2799GetAccessibleTextSelectionInfoPackage *pkg = (GetAccessibleTextSelectionInfoPackage *) (buffer + sizeof(PackageType));2800*type = cGetAccessibleTextSelectionInfoPackage;2801pkg->vmID = vmID;2802pkg->AccessibleContext = AccessibleContext;28032804#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2805PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextSelectionInfo(%X, %p, %p)", vmID, AccessibleContext, selectionInfo);2806#else // JOBJECT64 is jlong (64 bit)2807PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextSelectionInfo(%X, %016I64X, %p)", vmID, AccessibleContext, selectionInfo);2808#endif2809// need to call only the HWND/VM that contains this AC2810HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2811if (destABWindow != (HWND) 0) {2812if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2813memcpy(selectionInfo, &(pkg->rTextSelectionItemsInfo), sizeof(AccessibleTextSelectionInfo));2814// [[[FIXME]]] should test to see if valid info returned; return FALSE if not2815return TRUE;2816}2817}28182819return FALSE;2820}28212822/**2823* getAccessibleTextAttributes - performs the Java code:2824* ...[[[FIXME]]] fill in this comment...2825*2826* Note: if the AccessibleContext parameter is bogus, this call will blow up2827*/2828BOOL2829WinAccessBridge::getAccessibleTextAttributes(long vmID,2830JOBJECT64 AccessibleContext,2831jint index,2832AccessibleTextAttributesInfo *attributes) {2833if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2834return FALSE;2835}2836char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage)];2837PackageType *type = (PackageType *) buffer;2838GetAccessibleTextAttributeInfoPackage *pkg = (GetAccessibleTextAttributeInfoPackage *) (buffer + sizeof(PackageType));2839*type = cGetAccessibleTextAttributeInfoPackage;2840pkg->vmID = vmID;2841pkg->AccessibleContext = AccessibleContext;2842pkg->index = index;28432844#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2845PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextAttributes(%X, %p, %d, %p)", vmID, AccessibleContext, index, attributes);2846#else // JOBJECT64 is jlong (64 bit)2847PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextAttributes(%X, %016I64X, %d, %p)", vmID, AccessibleContext, index, attributes);2848#endif2849// need to call only the HWND/VM that contains this AC2850HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2851if (destABWindow != (HWND) 0) {2852if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2853memcpy(attributes, &(pkg->rAttributeInfo), sizeof(AccessibleTextAttributesInfo));2854return TRUE;2855}2856}28572858return FALSE;2859}28602861/**2862* getAccessibleTextRect - gets the text bounding rectangle2863*2864* Note: if the AccessibleContext parameter is bogus, this call will blow up2865*/2866BOOL2867WinAccessBridge::getAccessibleTextRect(long vmID,2868JOBJECT64 AccessibleContext,2869AccessibleTextRectInfo *rectInfo,2870jint index) {2871if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2872return FALSE;2873}2874char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage)];2875PackageType *type = (PackageType *) buffer;2876GetAccessibleTextRectInfoPackage *pkg = (GetAccessibleTextRectInfoPackage *) (buffer + sizeof(PackageType));2877*type = cGetAccessibleTextRectInfoPackage;2878pkg->vmID = vmID;2879pkg->AccessibleContext = AccessibleContext;2880pkg->index = index;28812882#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2883PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextRect(%X, %p, %p, %d)", vmID, AccessibleContext, rectInfo, index);2884#else // JOBJECT64 is jlong (64 bit)2885PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextRect(%X, %016I64X, %p, %d)", vmID, AccessibleContext, rectInfo, index);2886#endif2887// need to call only the HWND/VM that contains this AC2888HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2889if (destABWindow != (HWND) 0) {2890if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2891memcpy(rectInfo, (&pkg->rTextRectInfo), sizeof(AccessibleTextRectInfo));2892// [[[FIXME]]] should test to see if valid info returned; return FALSE if not2893return TRUE;2894}2895}28962897return FALSE;2898}289929002901/**2902* getAccessibleTextRect - gets the text bounding rectangle2903*2904* Note: if the AccessibleContext parameter is bogus, this call will blow up2905*/2906BOOL2907WinAccessBridge::getCaretLocation(long vmID,2908JOBJECT64 AccessibleContext,2909AccessibleTextRectInfo *rectInfo,2910jint index) {2911if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2912return FALSE;2913}2914char buffer[sizeof(PackageType) + sizeof(GetCaretLocationPackage)];2915PackageType *type = (PackageType *) buffer;2916GetCaretLocationPackage *pkg = (GetCaretLocationPackage *) (buffer + sizeof(PackageType));2917*type = cGetCaretLocationPackage;2918pkg->vmID = vmID;2919pkg->AccessibleContext = AccessibleContext;2920pkg->index = index;29212922#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2923PrintDebugString("[INFO]: WinAccessBridge::getCaretLocation(%X, %p, %p, %d)", vmID, AccessibleContext, rectInfo, index);2924#else // JOBJECT64 is jlong (64 bit)2925PrintDebugString("[INFO]: WinAccessBridge::getCaretLocation(%X, %016I64X, %p, %d)", vmID, AccessibleContext, rectInfo, index);2926#endif2927// need to call only the HWND/VM that contains this AC2928HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2929if (destABWindow != (HWND) 0) {2930if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2931memcpy(rectInfo, (&pkg->rTextRectInfo), sizeof(AccessibleTextRectInfo));2932return TRUE;2933}2934}29352936return FALSE;2937}293829392940/**2941* getEventsWaiting - gets the number of events waiting to fire2942*2943* Note: if the AccessibleContext parameter is bogus, this call will blow up2944*/2945int2946WinAccessBridge::getEventsWaiting() {2947if(messageQueue) {2948return(messageQueue->getEventsWaiting());2949}2950return(0);2951}295229532954/**2955* getAccessibleTextLineBounds - gets the bounding rectangle for the text line2956*2957* Note: if the AccessibleContext parameter is bogus, this call will blow up2958*/2959BOOL2960WinAccessBridge::getAccessibleTextLineBounds(long vmID,2961JOBJECT64 AccessibleContext,2962jint index, jint *startIndex, jint *endIndex) {2963if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {2964return FALSE;2965}2966char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage)];2967PackageType *type = (PackageType *) buffer;2968GetAccessibleTextLineBoundsPackage *pkg = (GetAccessibleTextLineBoundsPackage *) (buffer + sizeof(PackageType));2969*type = cGetAccessibleTextLineBoundsPackage;2970pkg->vmID = vmID;2971pkg->AccessibleContext = AccessibleContext;2972pkg->index = index;29732974#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)2975PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextLineBounds(%X, %p, %d, )", vmID, AccessibleContext, index);2976#else // JOBJECT64 is jlong (64 bit)2977PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextLineBounds(%X, %016I64X, %d, )", vmID, AccessibleContext, index);2978#endif2979// need to call only the HWND/VM that contains this AC2980HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);2981if (destABWindow != (HWND) 0) {2982if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {2983*startIndex = pkg->rLineStart;2984*endIndex = pkg->rLineEnd;2985// [[[FIXME]]] should test to see if valid info returned; return FALSE if not2986return TRUE;2987}2988}29892990return FALSE;2991}299229932994/**2995* getAccessibleTextLineBounds - performs the Java code:2996* ...[[[FIXME]]] fill in this comment...2997*2998* Note: if the AccessibleContext parameter is bogus, this call will blow up2999*/3000BOOL3001WinAccessBridge::getAccessibleTextRange(long vmID,3002JOBJECT64 AccessibleContext,3003jint start, jint end, wchar_t *text, short len) {3004if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3005return FALSE;3006}3007char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage)];3008PackageType *type = (PackageType *) buffer;3009GetAccessibleTextRangePackage *pkg = (GetAccessibleTextRangePackage *) (buffer + sizeof(PackageType));3010*type = cGetAccessibleTextRangePackage;3011pkg->vmID = vmID;3012pkg->AccessibleContext = AccessibleContext;3013pkg->start = start;3014pkg->end = end;30153016#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)3017PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextRange(%X, %p, %d, %d, )", vmID, AccessibleContext, start, end);3018#else // JOBJECT64 is jlong (64 bit)3019PrintDebugString("[INFO]: WinAccessBridge::getAccessibleTextRange(%X, %016I64X, %d, %d, )", vmID, AccessibleContext, start, end);3020#endif3021// need to call only the HWND/VM that contains this AC3022HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3023if (destABWindow != (HWND) 0) {3024if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {3025wcsncpy(text, pkg->rText, len);3026// [[[FIXME]]] should test to see if valid info returned; return FALSE if not3027return TRUE;3028}3029}30303031return FALSE;3032}30333034303530363037/********** AccessibleValue routines ***************/30383039BOOL3040WinAccessBridge::getCurrentAccessibleValueFromContext(long vmID,3041JOBJECT64 AccessibleContext,3042wchar_t *value, short len) {3043if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3044return FALSE;3045}3046char buffer[sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage)];3047PackageType *type = (PackageType *) buffer;3048GetCurrentAccessibleValueFromContextPackage *pkg = (GetCurrentAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));3049*type = cGetCurrentAccessibleValueFromContextPackage;3050pkg->vmID = vmID;3051pkg->AccessibleContext = AccessibleContext;30523053// need to call only the HWND/VM that contains this AC3054HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3055if (destABWindow != (HWND) 0) {3056if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {3057wcsncpy(value, pkg->rValue, len);3058// [[[FIXME]]] should test to see if valid info returned; return FALSE if not3059return TRUE;3060}3061}30623063return FALSE;3064}30653066BOOL3067WinAccessBridge::getMaximumAccessibleValueFromContext(long vmID,3068JOBJECT64 AccessibleContext,3069wchar_t *value, short len) {3070if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3071return FALSE;3072}3073char buffer[sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage)];3074PackageType *type = (PackageType *) buffer;3075GetMaximumAccessibleValueFromContextPackage *pkg = (GetMaximumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));3076*type = cGetMaximumAccessibleValueFromContextPackage;3077pkg->vmID = vmID;3078pkg->AccessibleContext = AccessibleContext;30793080// need to call only the HWND/VM that contains this AC3081HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3082if (destABWindow != (HWND) 0) {3083if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {3084wcsncpy(value, pkg->rValue, len);3085// [[[FIXME]]] should test to see if valid info returned; return FALSE if not3086return TRUE;3087}3088}30893090return FALSE;3091}30923093BOOL3094WinAccessBridge::getMinimumAccessibleValueFromContext(long vmID,3095JOBJECT64 AccessibleContext,3096wchar_t *value, short len) {3097if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3098return FALSE;3099}3100char buffer[sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage)];3101PackageType *type = (PackageType *) buffer;3102GetMinimumAccessibleValueFromContextPackage *pkg = (GetMinimumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));3103*type = cGetMinimumAccessibleValueFromContextPackage;3104pkg->vmID = vmID;3105pkg->AccessibleContext = AccessibleContext;31063107// need to call only the HWND/VM that contains this AC3108HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3109if (destABWindow != (HWND) 0) {3110if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {3111wcsncpy(value, pkg->rValue, len);3112// [[[FIXME]]] should test to see if valid info returned; return FALSE if not3113return TRUE;3114}3115}31163117return FALSE;3118}311931203121/********** AccessibleSelection routines ***************/31223123void3124WinAccessBridge::addAccessibleSelectionFromContext(long vmID,3125JOBJECT64 AccessibleContext, int i) {3126if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3127return;3128}3129char buffer[sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage)];3130PackageType *type = (PackageType *) buffer;3131AddAccessibleSelectionFromContextPackage *pkg = (AddAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));3132*type = cAddAccessibleSelectionFromContextPackage;3133pkg->vmID = vmID;3134pkg->AccessibleContext = AccessibleContext;3135pkg->index = i;31363137// need to call only the HWND/VM that contains this AC3138HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3139if (destABWindow != (HWND) 0) {3140sendMemoryPackage(buffer, sizeof(buffer), destABWindow);3141}3142}31433144void3145WinAccessBridge::clearAccessibleSelectionFromContext(long vmID,3146JOBJECT64 AccessibleContext) {3147if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3148return;3149}3150char buffer[sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage)];3151PackageType *type = (PackageType *) buffer;3152ClearAccessibleSelectionFromContextPackage *pkg = (ClearAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));3153*type = cClearAccessibleSelectionFromContextPackage;3154pkg->vmID = vmID;3155pkg->AccessibleContext = AccessibleContext;31563157// need to call only the HWND/VM that contains this AC3158HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3159if (destABWindow != (HWND) 0) {3160sendMemoryPackage(buffer, sizeof(buffer), destABWindow);3161}3162}31633164JOBJECT643165WinAccessBridge::getAccessibleSelectionFromContext(long vmID,3166JOBJECT64 AccessibleContext, int i) {3167if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3168return (JOBJECT64)0;3169}3170char buffer[sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage)];3171PackageType *type = (PackageType *) buffer;3172GetAccessibleSelectionFromContextPackage *pkg = (GetAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));3173*type = cGetAccessibleSelectionFromContextPackage;3174pkg->vmID = vmID;3175pkg->AccessibleContext = AccessibleContext;3176pkg->index = i;31773178// need to call only the HWND/VM that contains this AC3179HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3180if (destABWindow != (HWND) 0) {3181if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {3182return pkg->rAccessibleContext;3183}3184}31853186return (JOBJECT64) 0;3187}31883189int3190WinAccessBridge::getAccessibleSelectionCountFromContext(long vmID,3191JOBJECT64 AccessibleContext) {3192if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3193return -1;3194}3195char buffer[sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage)];3196PackageType *type = (PackageType *) buffer;3197GetAccessibleSelectionCountFromContextPackage *pkg = (GetAccessibleSelectionCountFromContextPackage *) (buffer + sizeof(PackageType));3198*type = cGetAccessibleSelectionCountFromContextPackage;3199pkg->vmID = vmID;3200pkg->AccessibleContext = AccessibleContext;32013202// need to call only the HWND/VM that contains this AC3203HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3204if (destABWindow != (HWND) 0) {3205if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {3206return (int) pkg->rCount;3207}3208}32093210return -1;3211}32123213BOOL3214WinAccessBridge::isAccessibleChildSelectedFromContext(long vmID,3215JOBJECT64 AccessibleContext, int i) {3216if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3217return FALSE;3218}3219char buffer[sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage)];3220PackageType *type = (PackageType *) buffer;3221IsAccessibleChildSelectedFromContextPackage *pkg = (IsAccessibleChildSelectedFromContextPackage *) (buffer + sizeof(PackageType));3222*type = cIsAccessibleChildSelectedFromContextPackage;3223pkg->vmID = vmID;3224pkg->AccessibleContext = AccessibleContext;3225pkg->index = i;32263227// need to call only the HWND/VM that contains this AC3228HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3229if (destABWindow != (HWND) 0) {3230if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {3231if (pkg->rResult != 0) {3232return TRUE;3233}3234}3235}32363237return FALSE;3238}323932403241void3242WinAccessBridge::removeAccessibleSelectionFromContext(long vmID,3243JOBJECT64 AccessibleContext, int i) {3244if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3245return;3246}3247char buffer[sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage)];3248PackageType *type = (PackageType *) buffer;3249RemoveAccessibleSelectionFromContextPackage *pkg = (RemoveAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));3250*type = cRemoveAccessibleSelectionFromContextPackage;3251pkg->vmID = vmID;3252pkg->AccessibleContext = AccessibleContext;3253pkg->index = i;32543255// need to call only the HWND/VM that contains this AC3256HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3257if (destABWindow != (HWND) 0) {3258sendMemoryPackage(buffer, sizeof(buffer), destABWindow);3259}3260}32613262void3263WinAccessBridge::selectAllAccessibleSelectionFromContext(long vmID,3264JOBJECT64 AccessibleContext) {3265if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3266return;3267}3268char buffer[sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage)];3269PackageType *type = (PackageType *) buffer;3270SelectAllAccessibleSelectionFromContextPackage *pkg = (SelectAllAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));3271*type = cSelectAllAccessibleSelectionFromContextPackage;3272pkg->vmID = vmID;3273pkg->AccessibleContext = AccessibleContext;32743275// need to call only the HWND/VM that contains this AC3276HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);3277if (destABWindow != (HWND) 0) {3278sendMemoryPackage(buffer, sizeof(buffer), destABWindow);3279}3280}328132823283/*********** Event handling methods **********************************/32843285/**3286* addEventNotification - tell all Java-launched AccessBridge DLLs3287* that we want events of the specified type3288*3289* [[[FIXME]]] since we're just sending a long & a source window,3290* we could use a private message rather than WM_COPYDATA3291* (though we still may want it to be synchronous; dunno...)3292*3293*/3294void3295WinAccessBridge::addJavaEventNotification(jlong type) {3296PrintDebugString("[INFO]: WinAccessBridge::addJavaEventNotification(%016I64X)", type);3297if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3298return;3299}33003301char buffer[sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage)];3302PackageType *pkgType = (PackageType *) buffer;3303AddJavaEventNotificationPackage *pkg = (AddJavaEventNotificationPackage *) (buffer + sizeof(PackageType));3304*pkgType = cAddJavaEventNotificationPackage;3305pkg->type = type;3306pkg->DLLwindow = ABHandleToLong(dialogWindow);33073308PrintDebugString("[INFO]: ->pkgType = %X, eventType = %016I64X, DLLwindow = %p",3309*pkgType, pkg->type, pkg->DLLwindow);33103311// send addEventNotification message to all JVMs3312isVMInstanceChainInUse = true;3313AccessBridgeJavaVMInstance *current = javaVMs;3314while (current != (AccessBridgeJavaVMInstance *) 0) {3315current->sendPackage(buffer, sizeof(buffer)); // no return values!3316current = current->nextJVMInstance;3317}3318isVMInstanceChainInUse = false;3319}33203321/**3322* removeEventNotification - tell all Java-launched AccessBridge DLLs3323* that we no longer want events of the3324* specified type3325*3326* [[[FIXME]]] since we're just sending a long & a source window,3327* we could use a private message rather than WM_COPYDATA3328* (though we still may want it to be synchronous; dunno...)3329*3330*/3331void3332WinAccessBridge::removeJavaEventNotification(jlong type) {3333PrintDebugString("[INFO]: in WinAccessBridge::removeJavaEventNotification(%016I64X)", type);3334if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3335return;3336}3337char buffer[sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage)];3338PackageType *pkgType = (PackageType *) buffer;3339RemoveJavaEventNotificationPackage *pkg = (RemoveJavaEventNotificationPackage *) (buffer + sizeof(PackageType));3340*pkgType = cRemoveJavaEventNotificationPackage;3341pkg->type = type;3342pkg->DLLwindow = ABHandleToLong(dialogWindow);33433344PrintDebugString("[INFO]: ->pkgType = %X, eventType = %016I64X, DLLwindow = %p",3345*pkgType, pkg->type, pkg->DLLwindow);33463347// send removeEventNotification message to all JVMs3348isVMInstanceChainInUse = true;3349AccessBridgeJavaVMInstance *current = javaVMs;3350while (current != (AccessBridgeJavaVMInstance *) 0) {3351current->sendPackage(buffer, sizeof(buffer)); // no return values!3352current = current->nextJVMInstance;3353}3354isVMInstanceChainInUse = false;3355}335633573358/*********** Event handling methods **********************************/33593360/**3361* addAccessibilityEventNotification - tell all Java-launched AccessBridge DLLs3362* that we want events of the specified type3363*3364* [[[FIXME]]] since we're just sending a long & a source window,3365* we could use a private message rather than WM_COPYDATA3366* (though we still may want it to be synchronous; dunno...)3367*3368*/3369void3370WinAccessBridge::addAccessibilityEventNotification(jlong type) {3371PrintDebugString("[INFO]: in WinAccessBridge::addAccessibilityEventNotification(%016I64X)", type);3372if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3373return;3374}3375char buffer[sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage)];3376PackageType *pkgType = (PackageType *) buffer;3377AddAccessibilityEventNotificationPackage *pkg = (AddAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType));3378*pkgType = cAddAccessibilityEventNotificationPackage;3379pkg->type = type;3380pkg->DLLwindow = ABHandleToLong(dialogWindow);33813382PrintDebugString("[INFO]: ->pkgType = %X, eventType = %016I64X, DLLwindow = %X",3383*pkgType, pkg->type, pkg->DLLwindow);33843385// send addEventNotification message to all JVMs3386isVMInstanceChainInUse = true;3387AccessBridgeJavaVMInstance *current = javaVMs;3388while (current != (AccessBridgeJavaVMInstance *) 0) {3389current->sendPackage(buffer, sizeof(buffer)); // no return values!3390current = current->nextJVMInstance;3391}3392isVMInstanceChainInUse = false;3393}33943395/**3396* removeAccessibilityEventNotification - tell all Java-launched AccessBridge DLLs3397* that we no longer want events of the3398* specified type3399*3400* [[[FIXME]]] since we're just sending a long & a source window,3401* we could use a private message rather than WM_COPYDATA3402* (though we still may want it to be synchronous; dunno...)3403*3404*/3405void3406WinAccessBridge::removeAccessibilityEventNotification(jlong type) {3407PrintDebugString("[INFO]: in WinAccessBridge::removeAccessibilityEventNotification(%016I64X)", type);3408if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {3409return;3410}3411char buffer[sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage)];3412PackageType *pkgType = (PackageType *) buffer;3413RemoveAccessibilityEventNotificationPackage *pkg = (RemoveAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType));3414*pkgType = cRemoveAccessibilityEventNotificationPackage;3415pkg->type = type;3416pkg->DLLwindow = ABHandleToLong(dialogWindow);34173418PrintDebugString("[INFO]: ->pkgType = %X, eventType = %016I64X, DLLwindow = %X",3419*pkgType, pkg->type, pkg->DLLwindow);34203421// send removeEventNotification message to all JVMs3422isVMInstanceChainInUse = true;3423AccessBridgeJavaVMInstance *current = javaVMs;3424while (current != (AccessBridgeJavaVMInstance *) 0) {3425current->sendPackage(buffer, sizeof(buffer)); // no return values!3426current = current->nextJVMInstance;3427}3428isVMInstanceChainInUse = false;3429}343034313432#define CALL_SET_EVENT_FP(function, callbackFP) \3433void WinAccessBridge::function(callbackFP fp) { \3434eventHandler->function(fp, this); \3435/* eventHandler calls back to winAccessBridgeDLL to set eventMask */ \3436}34373438void WinAccessBridge::setJavaShutdownFP(AccessBridge_JavaShutdownFP fp) {3439eventHandler->setJavaShutdownFP(fp, this);3440}34413442CALL_SET_EVENT_FP(setPropertyChangeFP, AccessBridge_PropertyChangeFP)3443CALL_SET_EVENT_FP(setFocusGainedFP, AccessBridge_FocusGainedFP)3444CALL_SET_EVENT_FP(setFocusLostFP, AccessBridge_FocusLostFP)3445CALL_SET_EVENT_FP(setCaretUpdateFP, AccessBridge_CaretUpdateFP)3446CALL_SET_EVENT_FP(setMouseClickedFP, AccessBridge_MouseClickedFP)3447CALL_SET_EVENT_FP(setMouseEnteredFP, AccessBridge_MouseEnteredFP)3448CALL_SET_EVENT_FP(setMouseExitedFP, AccessBridge_MouseExitedFP)3449CALL_SET_EVENT_FP(setMousePressedFP, AccessBridge_MousePressedFP)3450CALL_SET_EVENT_FP(setMouseReleasedFP, AccessBridge_MouseReleasedFP)3451CALL_SET_EVENT_FP(setMenuCanceledFP, AccessBridge_MenuCanceledFP)3452CALL_SET_EVENT_FP(setMenuDeselectedFP, AccessBridge_MenuDeselectedFP)3453CALL_SET_EVENT_FP(setMenuSelectedFP, AccessBridge_MenuSelectedFP)3454CALL_SET_EVENT_FP(setPopupMenuCanceledFP, AccessBridge_PopupMenuCanceledFP)3455CALL_SET_EVENT_FP(setPopupMenuWillBecomeInvisibleFP, AccessBridge_PopupMenuWillBecomeInvisibleFP)3456CALL_SET_EVENT_FP(setPopupMenuWillBecomeVisibleFP, AccessBridge_PopupMenuWillBecomeVisibleFP)34573458CALL_SET_EVENT_FP(setPropertyNameChangeFP, AccessBridge_PropertyNameChangeFP)3459CALL_SET_EVENT_FP(setPropertyDescriptionChangeFP, AccessBridge_PropertyDescriptionChangeFP)3460CALL_SET_EVENT_FP(setPropertyStateChangeFP, AccessBridge_PropertyStateChangeFP)3461CALL_SET_EVENT_FP(setPropertyValueChangeFP, AccessBridge_PropertyValueChangeFP)3462CALL_SET_EVENT_FP(setPropertySelectionChangeFP, AccessBridge_PropertySelectionChangeFP)3463CALL_SET_EVENT_FP(setPropertyTextChangeFP, AccessBridge_PropertyTextChangeFP)3464CALL_SET_EVENT_FP(setPropertyCaretChangeFP, AccessBridge_PropertyCaretChangeFP)3465CALL_SET_EVENT_FP(setPropertyVisibleDataChangeFP, AccessBridge_PropertyVisibleDataChangeFP)3466CALL_SET_EVENT_FP(setPropertyChildChangeFP, AccessBridge_PropertyChildChangeFP)3467CALL_SET_EVENT_FP(setPropertyActiveDescendentChangeFP, AccessBridge_PropertyActiveDescendentChangeFP)34683469CALL_SET_EVENT_FP(setPropertyTableModelChangeFP, AccessBridge_PropertyTableModelChangeFP)347034713472