Mozilla/mozilla/java/webclient/src/BrowserControlNativeShim.cpp
edburns%acm.org cdc1a79633 Put #include <unistd.h> inside #ifdef XP_UNIX
git-svn-id: svn://10.0.0.236/trunk@61308 18797224-902f-48f8-a5cc-f745e15eee43
2000-02-18 19:33:28 +00:00

1661 lines
46 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is RaptorCanvas.
*
* The Initial Developer of the Original Code is Kirk Baker and
* Ian Wilkinson. Portions created by Kirk Baker and Ian Wilkinson are
* Copyright (C) 1999 Kirk Baker and Ian Wilkinson. All
* Rights Reserved.
*
* Contributor(s): Kirk Baker <kbaker@eb.com>
* Ian Wilkinson <iw@ennoble.com>
* Mark Lin <mark.lin@eng.sun.com>
* Mark Goddard
* Ed Burns <edburns@acm.org>
* Ann Sunhachawee
*/
/*
* BrowserControlNativeShim.cpp
*/
#include <jni.h>
#include "BrowserControlNativeShim.h"
#ifdef XP_PC
#include <windows.h>
#endif
// Raptor includes
#include <nsGUIEvent.h>
#include "nsIWidget.h"
#include "nsIWebShell.h"
#include "nsISessionHistory.h"
#include "nsAppShellCIDs.h"
#include "nsWidgetsCID.h"
#include "nsIGlobalHistory.h"
#include "nsIComponentManager.h"
#include "nsIThread.h"
#include "nsString.h"
#include "nsRepository.h"
#ifdef NECKO
#include "nsNetUtil.h"
#else
#include "nsINetService.h"
#endif
#include "nsIServiceManager.h"
#include "nsIEventQueueService.h"
#include "prmem.h"
#ifdef XP_MAC
#include "nsMacMessageSink.h"
#include "nsRepeater.h"
nsMacMessageSink gMessageSink;
#endif
#ifdef XP_UNIX
#include <gtk/gtk.h>
#include "motif/NativeEventThread.h"
#endif
#include "nsActions.h"
#include "nsIRegistry.h"
#include "nsIServiceManager.h"
#include "nsIPref.h"
#include "DocumentObserver.h"
#include "nsIDocumentLoader.h"
#include "nsCOMPtr.h"
#include "nsIBaseWindow.h"
#ifdef XP_UNIX
#include <unistd.h>
#include "gdksuperwin.h"
#include "gtkmozarea.h"
#endif
#ifdef XP_PC
#define APPSHELL_DLL "appshell.dll"
#define BROWSER_DLL "nsbrowser.dll"
#define EDITOR_DLL "ender.dll"
#else
#ifdef XP_MAC
#define APPSHELL_DLL "APPSHELL_DLL"
#define EDITOR_DLL "ENDER_DLL"
#else
// XP_UNIX || XP_BEOS
#define APPSHELL_DLL "libnsappshell"MOZ_DLL_SUFFIX
#define APPCORES_DLL "libappcores"MOZ_DLL_SUFFIX
#define EDITOR_DLL "libender"MOZ_DLL_SUFFIX
#endif // XP_MAC
#endif // XP_PC
#define DEBUG_RAPTOR_CANVAS 1
static NS_DEFINE_IID(kWindowCID, NS_WINDOW_CID); // PENDING(edburns): should this be NS_DEFINE_CID?
static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID);
static NS_DEFINE_IID(kISessionHistoryIID, NS_ISESSIONHISTORY_IID);
static NS_DEFINE_CID(kSessionHistoryCID, NS_SESSIONHISTORY_CID);
static NS_DEFINE_IID(kWebShellCID, NS_WEB_SHELL_CID);
static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID);
static NS_DEFINE_IID(kIEventQueueServiceIID, NS_IEVENTQUEUESERVICE_IID);
static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
extern "C" void NS_SetupRegistry();
extern nsresult NS_AutoregisterComponents();
static nsFileSpec gBinDir;
static nsISessionHistory *gHistory;
struct WebShellInitContext {
#ifdef XP_UNIX
GtkWidget * parentHWnd;
#else
// PENDING(mark): Don't we need something for Mac?
HWND parentHWnd;
#endif
nsIWebShell * webShell;
PLEventQueue * actionQueue;
PRThread * embeddedThread;
JNIEnv * env;
int stopThread;
int initComplete;
int initFailCode;
int x;
int y;
int w;
int h;
int gtkPtr;
};
void PostEvent (WebShellInitContext * initContext, PLEvent * event);
void * PostSynchronousEvent (WebShellInitContext * initContext, PLEvent * event);
static void
ThrowExceptionToJava (JNIEnv * env, const char * message)
{
if (env->ExceptionOccurred())
env->ExceptionClear();
jclass excCls = env->FindClass("java/lang/Exception");
if (excCls == 0) { // Unable to find the exception class, give up.
if (env->ExceptionOccurred())
env->ExceptionClear();
return;
}
// Throw the exception with the error code and description
jmethodID jID = env->GetMethodID(excCls, "<init>", "(Ljava/lang/String;)V"); // void Exception(String)
if (jID != NULL) {
jstring exceptionString = env->NewStringUTF(message);
jthrowable newException = (jthrowable) env->NewObject(excCls, jID, exceptionString);
if (newException != NULL) {
env->Throw(newException);
}
else {
if (env->ExceptionOccurred())
env->ExceptionClear();
}
} else {
if (env->ExceptionOccurred())
env->ExceptionClear();
}
} // ThrowExceptionToJava()
enum {
kEventQueueError = 1,
kCreateWebShellError,
kInitWebShellError,
kShowWebShellError,
kHistoryWebShellError
};
char * errorMessages[] = {
"No Error",
"Could not obtain the event queue service.",
"Unable to create the WebShell instance.",
"Unable to initialize the WebShell instance.",
"Unable to show the WebShell."
};
int processEventLoop(WebShellInitContext * initContext) {
#ifdef XP_UNIX
while(gtk_events_pending()) {
gtk_main_iteration();
}
#else
// PENDING(mark): Does this work on the Mac?
MSG msg;
if (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
if (::GetMessage(&msg, NULL, 0, 0)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
#endif
::PR_Sleep(PR_INTERVAL_NO_WAIT);
if ((initContext->initComplete) && (initContext->actionQueue)) {
PL_ENTER_EVENT_QUEUE_MONITOR(initContext->actionQueue);
if (::PL_EventAvailable(initContext->actionQueue)) {
PLEvent * event = ::PL_GetEvent(initContext->actionQueue);
if (event != NULL) {
::PL_HandleEvent(event);
}
}
PL_EXIT_EVENT_QUEUE_MONITOR(initContext->actionQueue);
}
if (initContext->stopThread) {
initContext->stopThread++;
return 0;
}
return 1;
}
#ifdef XP_UNIX
static void event_processor_callback(gpointer data,
gint source,
GdkInputCondition condition) {
#if DEBUG_RAPTOR_CANVAS
printf("EventHandler: event_processor_callback()\n");
#endif
nsIEventQueue *eventQueue = (nsIEventQueue*)data;
eventQueue->ProcessPendingEvents();
#if DEBUG_RAPTOR_CANVAS
printf("EventHandler: Done processing pending events\n");
#endif
}
#endif
void
EmbeddedEventHandler (void * arg) {
WebShellInitContext * initContext = (WebShellInitContext *) arg;
nsIEventQueueService * aEventQService = nsnull;
nsresult rv;
PRBool allowPlugins = PR_FALSE;
//TODO Add tracing from nspr.
#if DEBUG_RAPTOR_CANVAS
printf("EmbeddedEventHandler(%lx): Create the Event Queue for the UI thread...\n", initContext);
#endif
// Create the Event Queue for the UI thread...
rv = nsServiceManager::GetService(kEventQueueServiceCID,
kIEventQueueServiceIID,
(nsISupports **) &aEventQService);
if (NS_FAILED(rv)) {
initContext->initFailCode = kEventQueueError;
return;
}
// Create the event queue.
rv = aEventQService->CreateThreadEventQueue();
#ifndef NECKO
NS_InitINetService();
#endif
// HACK(mark): On Unix, embeddedThread isn't set until after this method returns!!
initContext->embeddedThread = PR_GetCurrentThread();
// Create the action queue
if (initContext->embeddedThread) {
#if DEBUG_RAPTOR_CANVAS
printf("EmbeddedEventHandler(%lx): embeddedThread != NULL\n", initContext);
#endif
if (initContext->actionQueue == NULL) {
#if DEBUG_RAPTOR_CANVAS
printf("EmbeddedEventHandler(%lx): Create the action queue\n", initContext);
#endif
#ifdef XP_UNIX
// We need to do something different for Unix
nsIEventQueue * EQueue = nsnull;
rv = aEventQService->GetThreadEventQueue(PR_GetCurrentThread(), &EQueue);
gdk_input_add(EQueue->GetEventQueueSelectFD(),
GDK_INPUT_READ,
event_processor_callback,
EQueue);
PLEventQueue * plEventQueue = nsnull;
EQueue->GetPLEventQueue(&plEventQueue);
initContext->actionQueue = plEventQueue;
#else
initContext->actionQueue = ::PL_CreateMonitoredEventQueue("Action Queue", initContext->embeddedThread);
#endif
}
}
#if DEBUG_RAPTOR_CANVAS
printf("EmbeddedEventHandler(%lx): Create the WebShell...\n", initContext);
#endif
// Create the WebShell.
rv = nsRepository::CreateInstance(kWebShellCID, nsnull, kIWebShellIID, (void**)&initContext->webShell);
if (NS_FAILED(rv)) {
initContext->initFailCode = kCreateWebShellError;
return;
}
#if DEBUG_RAPTOR_CANVAS
printf("EmbeddedEventHandler(%lx): Init the WebShell...%p\n", initContext, initContext->env);
#endif
#ifdef XP_UNIX
GdkSuperWin * superwin;
GtkMozArea * mozarea;
mozarea = (GtkMozArea *) initContext->gtkPtr;
superwin = mozarea->superwin;
rv = initContext->webShell->Init((nsNativeWidget *)superwin, initContext->x, initContext->y, initContext->w, initContext->h);
#else
rv = initContext->webShell->Init((nsNativeWidget *)initContext->parentHWnd,
initContext->x, initContext->y, initContext->w, initContext->h);
#endif
if (NS_FAILED(rv)) {
initContext->initFailCode = kInitWebShellError;
return;
}
#if DEBUG_RAPTOR_CANVAS
printf("EmbeddedEventHandler(%lx): Install Prefs in the Webshell...\n", initContext);
#endif
nsIPref *prefs;
rv = nsServiceManager::GetService(kPrefCID,
nsIPref::GetIID(),
(nsISupports **)&prefs);
if (NS_SUCCEEDED(rv)) {
// Set the prefs in the outermost webshell.
initContext->webShell->SetPrefs(prefs);
nsServiceManager::ReleaseService(kPrefCID, prefs);
}
rv = nsComponentManager::CreateInstance(kSessionHistoryCID, nsnull, kISessionHistoryIID,
(void**)&gHistory);
if (NS_FAILED(rv)) {
initContext->initFailCode = kHistoryWebShellError;
return;
}
initContext->webShell->SetSessionHistory(gHistory);
#if DEBUG_RAPTOR_CANVAS
printf("EmbeddedEventHandler(%lx): Show the WebShell...\n", initContext);
#endif
nsCOMPtr<nsIBaseWindow> baseWindow;
rv = initContext->webShell->QueryInterface(NS_GET_IID(nsIBaseWindow),
getter_AddRefs(baseWindow));
if (NS_FAILED(rv)) {
initContext->initFailCode = kShowWebShellError;
return;
}
rv = baseWindow->SetVisibility(PR_TRUE);
if (NS_FAILED(rv)) {
initContext->initFailCode = kShowWebShellError;
return;
}
initContext->initComplete = TRUE;
#if DEBUG_RAPTOR_CANVAS
printf("EmbeddedEventHandler(%lx): enter event loop\n", initContext);
#endif
// Don't loop here. The looping will be handled by a Java Thread
// (see org.mozilla.webclient.motif.NativeEventThread).
#ifndef XP_UNIX
do {
if (!processEventLoop(initContext)) {
break;
}
} while (PR_TRUE);
#else
// Just need to loop once for Unix
processEventLoop(initContext);
#endif
}
// It appears the current thread (belonging to Java) is assumed to be
// the "main GUI thread." (Creation story given below.) Hence the
// RunPump() of the nsToolkit conflicting with the Java event dispatching.
//
// I'm unsure whether threads created PR_LOCAL_THREAD have
// a one-to-one correspondence with the threads appearing
// on Win32. Changed the "main GUI thread" to be
// a global thread, rather than a local thread.
//
// Creation story...
// nsWebShell::Init() [ webshell/src/nsWebShell.cpp ] calling
// nsWindow::StandardWindowCreate() [ widget/src/windows/nsWindow.cpp ] calling
// nsBaseWidget::BaseCreate() [ widget/src/xpwidgets/nsBaseWidget.cpp ] calling
// nsToolkit::Init() [ widget/src/windows/nsToolkit.cpp ]
//
void
InitEmbeddedEventHandler (WebShellInitContext* initContext)
{
#if DEBUG_RAPTOR_CANVAS
printf("InitEmbeddedEventHandler(%lx): Creating embedded thread...\n", initContext);
#endif
// Don't create a NSPR Thread on Unix, because we will use a Java Thread instead.
// (see org.mozilla.webclient.motif.NativeEventThread).
#ifndef XP_UNIX
initContext->embeddedThread = ::PR_CreateThread(PR_SYSTEM_THREAD,
EmbeddedEventHandler,
(void*)initContext,
PR_PRIORITY_NORMAL,
PR_GLOBAL_THREAD,
PR_UNJOINABLE_THREAD,
0);
#else
EmbeddedEventHandler((void *) initContext);
#endif
#if DEBUG_RAPTOR_CANVAS
printf("InitEmbeddedEventHandler(%lx): Embedded Thread created...\n", initContext);
#endif
while (initContext->initComplete == FALSE) {
::PR_Sleep(PR_INTERVAL_NO_WAIT);
if (initContext->initFailCode != 0) {
::ThrowExceptionToJava(initContext->env, errorMessages[initContext->initFailCode]);
return;
}
}
}
static nsEventStatus PR_CALLBACK
HandleRaptorEvent (nsGUIEvent *)
{
nsEventStatus result = nsEventStatus_eIgnore;
return result;
} // HandleRaptorEvent()
static void
DispatchEvent (nsGUIEvent* eventPtr, nsIWidget* widgetPtr)
{
// PENDING(mark): DO I NEED TO DO ANYTHING SPECIAL HERE FOR UNIX?????????
#ifdef XP_MAC
// Enable Raptor background activity
// Note: This will be moved to nsMacMessageSink very soon.
// The application will not have to do it anymore.
EventRecord * macEventPtr = (EventRecord *) eventPtr->nativeMsg;
gMessageSink.DispatchOSEvent(*macEventPtr, FrontWindow());
Repeater::DoRepeaters(*macEventPtr);
if (macEventPtr->what == nullEvent)
Repeater::DoIdlers(*macEventPtr);
#else
nsEventStatus aStatus = nsEventStatus_eIgnore;
widgetPtr->DispatchEvent(eventPtr, aStatus);
#endif
} // DispatchEvent()
const jint SHIFT_MASK = 1 << 0;
const jint CTRL_MASK = 1 << 1;
const jint META_MASK = 1 << 2;
const jint ALT_MASK = 1 << 3;
const jint BUTTON1_MASK = 1 << 4;
const jint BUTTON2_MASK = ALT_MASK;
const jint BUTTON3_MASK = META_MASK;
#ifdef XP_MAC
static unsigned short
ConvertModifiersToMacModifiers (jint modifiers)
{
unsigned short convertedModifiers = 0;
if (modifiers & META_MASK)
convertedModifiers |= cmdKey;
if (modifiers & SHIFT_MASK)
convertedModifiers |= shiftKey;
if (modifiers & ALT_MASK)
convertedModifiers |= optionKey;
if (modifiers & CTRL_MASK)
convertedModifiers |= controlKey;
if (modifiers & BUTTON1_MASK)
convertedModifiers |= btnState;
// KAB alphaLock would be nice too...
return convertedModifiers;
} // ConvertModifiersToMacModifiers()
static void
ConvertMouseCoordsToMacMouseCoords (jint windowPtr, jint x, jint y, Point& pt)
{
GrafPtr savePort;
pt.h = (short) x;
pt.v = (short) y;
GetPort(&savePort);
SetPort((WindowPtr) windowPtr);
LocalToGlobal(&pt);
SetPort(savePort);
} // ConvertMouseCoordsToMacMouseCoords()
#endif // ifdef XP_MAC
static void
ConvertModifiersTo_nsInputEvent (jint modifiers, nsInputEvent& event)
{
event.isShift = (modifiers & SHIFT_MASK) ? PR_TRUE : PR_FALSE;
event.isControl = (modifiers & CTRL_MASK) ? PR_TRUE : PR_FALSE;
event.isAlt = (modifiers & ALT_MASK) ? PR_TRUE : PR_FALSE;
#ifdef XP_MAC
event.isCommand = (modifiers & META_MASK) ? PR_TRUE : PR_FALSE;
#endif
} // ConvertModifiersTo_nsInputEvent()
static unsigned long
ConvertKeys (jchar keyChar, jint keyCode)
{
return 0;
} // ConvertKeys()
const jint MOUSE_FIRST = 500;
const jint MOUSE_CLICKED = MOUSE_FIRST;
const jint MOUSE_PRESSED = 1 + MOUSE_FIRST; // Event.MOUSE_DOWN
const jint MOUSE_RELEASED = 2 + MOUSE_FIRST; // Event.MOUSE_UP
const jint RAPTOR_MOUSE_MOVED = 3 + MOUSE_FIRST; // Event.MOUSE_MOVE
const jint MOUSE_ENTERED = 4 + MOUSE_FIRST; //Event.MOUSE_ENTER
const jint MOUSE_EXITED = 5 + MOUSE_FIRST; //Event.MOUSE_EXIT
const jint MOUSE_DRAGGED = 6 + MOUSE_FIRST; //Event.MOUSE_DRAG
static PRUint32
ConvertMouseMessageTo_nsMouseMessage (jint message, jint modifiers, jint numClicks)
{
if (RAPTOR_MOUSE_MOVED == message)
{
return NS_MOUSE_MOVE;
}
else if (MOUSE_CLICKED == message)
{
PRBool doubleClick = (numClicks & 1) ? PR_FALSE : PR_TRUE;
if (modifiers & BUTTON1_MASK)
{
if (doubleClick)
return NS_MOUSE_LEFT_DOUBLECLICK;
return NS_MOUSE_LEFT_CLICK;
}
else if (modifiers & BUTTON2_MASK)
{
if (doubleClick)
return NS_MOUSE_MIDDLE_DOUBLECLICK;
return NS_MOUSE_MIDDLE_CLICK;
}
else if (modifiers & BUTTON3_MASK)
{
if (doubleClick)
return NS_MOUSE_RIGHT_DOUBLECLICK;
return NS_MOUSE_RIGHT_CLICK;
}
}
else if ((MOUSE_PRESSED == message) || (MOUSE_DRAGGED == message))
{
if (modifiers & BUTTON1_MASK)
{
return NS_MOUSE_LEFT_BUTTON_DOWN;
}
else if (modifiers & BUTTON2_MASK)
{
return NS_MOUSE_MIDDLE_BUTTON_DOWN;
}
else if (modifiers & BUTTON3_MASK)
{
return NS_MOUSE_RIGHT_BUTTON_DOWN;
}
}
else if (MOUSE_RELEASED == message)
{
if (modifiers & BUTTON1_MASK)
{
return NS_MOUSE_LEFT_BUTTON_UP;
}
else if (modifiers & BUTTON2_MASK)
{
return NS_MOUSE_MIDDLE_BUTTON_UP;
}
else if (modifiers & BUTTON3_MASK)
{
return NS_MOUSE_RIGHT_BUTTON_UP;
}
}
else if (MOUSE_ENTERED == message)
{
return NS_MOUSE_ENTER;
}
else if (MOUSE_EXITED == message)
{
return NS_MOUSE_EXIT;
}
return NS_MOUSE_MOVE;
} // ConvertMouseMessageTo_nsMouseMessage()
#ifdef XP_MAC
static unsigned short
ConvertMouseMessageToMacMouseEvent (jint message)
{
if (RAPTOR_MOUSE_MOVED == message)
{
return nullEvent;
}
else if (MOUSE_CLICKED == message)
{
return nullEvent;
}
else if ((MOUSE_PRESSED == message) || (MOUSE_DRAGGED == message))
{
return mouseDown;
}
else if (MOUSE_RELEASED == message)
{
return mouseUp;
}
return nullEvent;
} // ConvertMouseMessageToMacMouseEvent()
#endif
/*
* JNI interfaces
*/
// I need this extern "C" for reasons I won't go into right now....
// - Mark
#ifdef XP_UNIX
extern "C" {
#endif
/*
* Class: BrowserControlNativeShim
* Method: raptorInitialize
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeInitialize(
JNIEnv *env,
jobject obj,
jstring verifiedBinDirAbsolutePath)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
static PRBool gFirstTime = PR_TRUE;
if (gFirstTime)
{
const char *nativePath = (const char *) env->GetStringUTFChars(verifiedBinDirAbsolutePath, 0);
gBinDir = nativePath;
NS_InitXPCOM(NULL, &gBinDir);
NS_SetupRegistry();
nsComponentManager::RegisterComponentLib(kSessionHistoryCID, NULL,
NULL, APPSHELL_DLL,
PR_FALSE, PR_FALSE);
NS_AutoregisterComponents();
gFirstTime = PR_FALSE;
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeInitialize()
/*
* Class: BrowserControlNativeShim
* Method: raptorTerminate
* Signature: ()V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeTerminate (
JNIEnv * env,
jobject obj)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
#if DEBUG_RAPTOR_CANVAS
printf("raptorTerminate() called\n");
#endif
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeTerminate()
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeDummy (
JNIEnv * env,
jobject obj,
jobject shimObj)
{
printf("Inside C++ - before GetObjectClass call\n");
jclass cls = env->GetObjectClass(shimObj);
jfieldID fid = env->GetFieldID(cls, "initialized", "Z");
jboolean ans = env->GetBooleanField(cls, fid);
printf("Inside C++ - value of Initialized is %b\n", ans);
return;
}
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellCreate
* Signature: (IIIIII)I
*/
JNIEXPORT jint JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellCreate (
JNIEnv * env,
jobject obj,
jint windowPtr,
jint x,
jint y,
jint width,
jint height,
jobject implObj)
{
jobject jobj = obj;
#ifdef XP_MAC
WindowPtr pWindow = (WindowPtr) windowPtr;
Rect webRect = pWindow->portRect;
// nsIWidget * pWidget = (nsIWidget *) widgetPtr;
#elif defined(XP_PC)
// elif defined(XP_WIN)
HWND parentHWnd = (HWND)windowPtr;
#elif defined(XP_UNIX)
GtkWidget * parentHWnd = (GtkWidget *) windowPtr;
#endif
if (parentHWnd == nsnull) {
::ThrowExceptionToJava(env, "Exception: null window handle passed to raptorWebShellCreate");
return (jint) 0;
}
WebShellInitContext* initContext = new WebShellInitContext;
initContext->initComplete = FALSE;
initContext->initFailCode = 0;
initContext->parentHWnd = parentHWnd;
initContext->webShell = NULL;
initContext->embeddedThread = NULL;
initContext->actionQueue = NULL;
initContext->env = env;
initContext->stopThread = FALSE;
initContext->x = x;
initContext->y = y;
initContext->w = width;
initContext->h = height;
#ifdef XP_UNIX
jclass cls = env->GetObjectClass(implObj); // Get Class for BrowserControlImpl object
// Get myCanvas IVar
jfieldID fid = env->GetFieldID(cls, "myCanvas", "Ljava/awt/Canvas;");
if (NULL == fid) {
::ThrowExceptionToJava(env, "Exception: field myCanvas not found in the jobject for BrowserControlImpl");
return (jint) 0;
}
jobject canvasObj = env->GetObjectField(implObj, fid);
jclass canvasCls = env->GetObjectClass(canvasObj);
if (NULL == canvasCls) {
::ThrowExceptionToJava(env, "Exception: ");
return (jint) 0;
}
jfieldID gtkfid = env->GetFieldID(canvasCls, "gtkWinPtr", "I");
if (NULL == gtkfid) {
::ThrowExceptionToJava(env, "Exception: field gtkWinPtr not found in the jobject for BrowserControlCanvas");
return (jint) 0;
}
jint mozPtr = env->GetIntField(canvasObj, gtkfid);
initContext->gtkPtr = (int) mozPtr;
#else
initContext->gtkPtr = NULL;
#endif
#ifdef XP_UNIX
// This probably needs some explaining...
// On Unix, instead of using a NSPR thread to manage our Mozilla event loop, we
// use a Java Thread (for reasons I won't go into now, see
// org.mozilla.webclient.motif.NativeEventThread for more details). This java thread will
// process any pending native events in
// org.mozilla.webclient.motif.NativeEventThread.processNativeEventQueue()
// (see below). However, when processNativeEventQueue() gets called, it needs access to it's associated
// WebShellInitContext structure in order to process any GTK / Mozilla related events. So what we
// do is we keep a static Hashtable inside the class NativeEventThread to store mappings of
// gtkWindowID's to WebShellInitContext's (since there is one WebShellInitContext to one GTK Window).
// This is what this part of the code does:
//
// 1) It first accesses the class org.mozilla.webclient.motif.NativeEventThread
// 2) It then accesses a static method in this class called "storeContext()" which takes as
// arguments, a GTK window pointer and a WebShellInitContext pointer
// 3) Then it invokes the method
// 4) Inside NativeEventThread.run(), you can see the code which fetches the appropriate
// WebShellInitContext and then calls processNativeEventQueue() with it below.
// PENDING(mark): Should we cache this? Probably....
jclass mozillaEventThreadClass = env->FindClass("org/mozilla/webclient/motif/NativeEventThread");
if (mozillaEventThreadClass == NULL) {
printf("Error: Cannot find class org.mozilla.webclient.motif.NativeEventThread!\n");
ThrowExceptionToJava(env, "Error: Cannot find class org.mozilla.webclient.motif.NativeEventThread!");
return 0;
}
jmethodID storeMethodID = env->GetStaticMethodID(mozillaEventThreadClass, "storeContext", "(II)V");
if (storeMethodID == NULL) {
printf("Error: Cannot get static method storeContext(int, int) from NativeEventThread!\n");
ThrowExceptionToJava(env, "Error: Cannot get static method storeContext(int, int) from NativeEventThread!");
return 0;
}
// PENDING(mark): How do I catch this if there's an exception?
env->CallStaticVoidMethod(mozillaEventThreadClass, storeMethodID, windowPtr, (int) initContext);
#else
InitEmbeddedEventHandler(initContext);
#endif
return (jint) initContext;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellCreate()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellDelete
* Signature: (I)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellDelete (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
if (webShellPtr)
{
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
// stop the event thread
initContext->stopThread = 1;
while (initContext->stopThread <= 1) {
; // TODO there's got to be a better way than this. ::PR_Interrupt()?
}
delete (initContext->webShell);
// TODO delete the other things too (thread, action queue, etc.)
delete initContext;
}
else {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellDelete");
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellDelete()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellLoadURL
* Signature: (ILjava/lang/String;)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellLoadURL (
JNIEnv * env,
jobject obj,
jint webShellPtr,
jstring urlString)
{
jobject jobj = obj;
const char * urlChars = (char *) env->GetStringUTFChars(urlString, 0);
printf("Native URL = \"%s\"\n", urlChars);
env->ReleaseStringUTFChars(urlString, urlChars);
PRUnichar * urlStringChars = (PRUnichar *) env->GetStringChars(urlString, 0);
if (env->ExceptionOccurred())
{
::ThrowExceptionToJava(env, "raptorWebShellLoadURL Exception: unable to extract Java string");
if (urlStringChars != NULL)
env->ReleaseStringChars(urlString, urlStringChars);
return;
}
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellLoadURL");
if (urlStringChars != NULL)
env->ReleaseStringChars(urlString, urlStringChars);
return;
}
if (initContext->initComplete) {
wsLoadURLEvent * actionEvent = new wsLoadURLEvent(initContext->webShell, urlStringChars);
PLEvent * event = (PLEvent*) *actionEvent;
::PostEvent(initContext, event);
}
env->ReleaseStringChars(urlString, urlStringChars);
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellLoadURL()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellStop
* Signature: (I)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellStop (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellStop");
return;
}
if (initContext->initComplete) {
wsStopEvent * actionEvent = new wsStopEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
::PostEvent(initContext, event);
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellStop()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellShow
* Signature: (I)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellShow (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellShow");
return;
}
if (initContext->initComplete) {
wsShowEvent * actionEvent = new wsShowEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
::PostEvent(initContext, event);
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellShow()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellHide
* Signature: (I)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellHide (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellHide");
return;
}
if (initContext->initComplete) {
wsHideEvent * actionEvent = new wsHideEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
::PostEvent(initContext, event);
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellHide()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellSetBounds
* Signature: (IIIII)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellSetBounds (
JNIEnv * env,
jobject obj,
jint webShellPtr,
jint x,
jint y,
jint width,
jint height)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellSetBounds");
return;
}
if (initContext->initComplete) {
wsResizeEvent * actionEvent = new wsResizeEvent(initContext->webShell, x, y, width, height);
PLEvent * event = (PLEvent*) *actionEvent;
::PostEvent(initContext, event);
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellSetBounds()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellMoveTo
* Signature: (III)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellMoveTo (
JNIEnv * env,
jobject obj,
jint webShellPtr,
jint x,
jint y)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellMoveTo");
return;
}
if (initContext->initComplete) {
wsMoveToEvent * actionEvent = new wsMoveToEvent(initContext->webShell, x, y);
PLEvent * event = (PLEvent*) *actionEvent;
::PostEvent(initContext, event);
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellMoveTo()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellSetFocus
* Signature: (I)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellSetFocus (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellSetFocus");
return;
}
if (initContext->initComplete) {
wsSetFocusEvent * actionEvent = new wsSetFocusEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
::PostEvent(initContext, event);
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellSetFocus()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellRemoveFocus
* Signature: (I)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellRemoveFocus (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellRemoveFocus");
return;
}
if (initContext->initComplete) {
wsRemoveFocusEvent * actionEvent = new wsRemoveFocusEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
::PostEvent(initContext, event);
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellRemoveFocus()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellRepaint
* Signature: (IZ)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellRepaint (
JNIEnv * env,
jobject obj,
jint webShellPtr,
jboolean forceRepaint)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellRepaint");
return;
}
if (initContext->initComplete) {
wsRepaintEvent * actionEvent = new wsRepaintEvent(initContext->webShell, (PRBool) forceRepaint);
PLEvent * event = (PLEvent*) *actionEvent;
::PostEvent(initContext, event);
}
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellRepaint()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellCanBack
* Signature: (I)Z
*/
JNIEXPORT jboolean JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellCanBack (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
void * voidResult = nsnull;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellCanBack");
return JNI_FALSE;
}
if (initContext->initComplete) {
wsCanBackEvent * actionEvent = new wsCanBackEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
voidResult = ::PostSynchronousEvent(initContext, event);
return (NS_FAILED((nsresult) voidResult)) ? JNI_FALSE : JNI_TRUE;
}
return JNI_FALSE;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellCanBack()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellCanForward
* Signature: (I)Z
*/
JNIEXPORT jboolean JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellCanForward (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
void * voidResult = nsnull;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellCanForward");
return JNI_FALSE;
}
if (initContext->initComplete) {
wsCanForwardEvent * actionEvent = new wsCanForwardEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
voidResult = ::PostSynchronousEvent(initContext, event);
return (NS_FAILED((nsresult) voidResult)) ? JNI_FALSE : JNI_TRUE;
}
return JNI_FALSE;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellCanForward()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellBack
* Signature: (I)Z
*/
JNIEXPORT jboolean JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellBack (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
void * voidResult = nsnull;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellBack");
return JNI_FALSE;
}
if (initContext->initComplete) {
wsBackEvent * actionEvent = new wsBackEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
voidResult = ::PostSynchronousEvent(initContext, event);
return (NS_FAILED((nsresult) voidResult)) ? JNI_FALSE : JNI_TRUE;
}
return JNI_FALSE;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellBack()
JNIEXPORT jboolean JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellAddDocListener
(JNIEnv *env,
jobject obj,
jint webShellPtr,
jobject doclistener)
{
// need to pass in the environment to the addition of c doclistener, so
// that it can call into the java stuff again
DocumentObserver * documentObserver = new DocumentObserver(env, obj, webShellPtr, doclistener);
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellAddDocListener");
return JNI_FALSE;
}
if (initContext->initComplete) {
nsIDocumentLoader *docloader;
initContext->webShell->GetDocumentLoader(docloader );
if (docloader != nsnull) {
docloader->AddObserver((nsIDocumentLoaderObserver *) documentObserver);
}
}
return JNI_TRUE;
}
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellForward
* Signature: (I)Z
*/
JNIEXPORT jboolean JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellForward (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
void * voidResult = nsnull;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellForward");
return JNI_FALSE;
}
if (initContext->initComplete) {
wsForwardEvent * actionEvent = new wsForwardEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
voidResult = ::PostSynchronousEvent(initContext, event);
return (NS_FAILED((nsresult) voidResult)) ? JNI_FALSE : JNI_TRUE;
}
return JNI_FALSE;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellForward()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellGoTo
* Signature: (II)Z
*/
JNIEXPORT jboolean JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellGoTo (
JNIEnv * env,
jobject obj,
jint webShellPtr,
jint historyIndex)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
void * voidResult = nsnull;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellGoTo");
return JNI_FALSE;
}
if (initContext->initComplete) {
wsGoToEvent * actionEvent = new wsGoToEvent(initContext->webShell, historyIndex);
PLEvent * event = (PLEvent*) *actionEvent;
voidResult = ::PostSynchronousEvent(initContext, event);
return (NS_FAILED((nsresult) voidResult)) ? JNI_FALSE : JNI_TRUE;
}
return JNI_FALSE;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellGoTo()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellGetHistoryLength
* Signature: (I)I
*/
JNIEXPORT jint JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellGetHistoryLength (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
void * voidResult = nsnull;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellGetHistoryLength");
return 0;
}
if (initContext->initComplete) {
wsGetHistoryLengthEvent * actionEvent = new wsGetHistoryLengthEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
voidResult = ::PostSynchronousEvent(initContext, event);
return ((jint) voidResult);
}
return 0;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellGetHistoryLength()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellGetHistoryIndex
* Signature: (I)I
*/
JNIEXPORT jint JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellGetHistoryIndex (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
void * voidResult = nsnull;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellGetHistoryIndex");
return 0;
}
if (initContext->initComplete) {
wsGetHistoryIndexEvent * actionEvent = new wsGetHistoryIndexEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
voidResult = ::PostSynchronousEvent(initContext, event);
return ((jint) voidResult);
}
return 0;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellGetHistoryIndex()
/*
* Class: BrowserControlNativeShim
* Method: raptorWebShellGetURL
* Signature: (II)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellGetURL (
JNIEnv * env,
jobject obj,
jint webShellPtr,
jint historyIndex)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
void * voidResult = nsnull;
jstring urlString = nsnull;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellGetURL");
return nsnull;
}
if (initContext->initComplete) {
wsGetURLEvent * actionEvent = new wsGetURLEvent(initContext->webShell, historyIndex);
PLEvent * event = (PLEvent*) *actionEvent;
voidResult = ::PostSynchronousEvent(initContext, event);
if (voidResult != nsnull) {
#ifdef NECKO
nsString * string = new nsString((PRUnichar *) voidResult);
#else
nsString1 * string = new nsString1((PRUnichar *) voidResult);
#endif
if (string == nsnull) {
::ThrowExceptionToJava(env, "raptorWebShellGetURL Exception: unable to create Java string");
return nsnull;
}
int length = string->Length();
delete string;
urlString = env->NewString((PRUnichar *) voidResult, length);
if (env->ExceptionOccurred())
{
::ThrowExceptionToJava(env, "raptorWebShellGetURL Exception: unable to create Java string");
return nsnull;
}
}
else {
::ThrowExceptionToJava(env, "raptorWebShellGetURL Exception: GetURL() returned NULL");
return nsnull;
}
}
return urlString;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellGetURL()
// added my Mark Goddard OTMP 9/2/1999
/*
* Class: org_mozilla_webclient_BrowserControlNativeShim
* Method: nativeWebShellRefresh
* Signature: (I)V
*/
JNIEXPORT jboolean JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellRefresh (
JNIEnv * env,
jobject obj,
jint webShellPtr)
{
JNIEnv * pEnv = env;
jobject jobj = obj;
void * voidResult = nsnull;
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
if (initContext == nsnull) {
::ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellRefresh");
return JNI_FALSE;
}
if (initContext->initComplete) {
wsRefreshEvent * actionEvent = new wsRefreshEvent(initContext->webShell);
PLEvent * event = (PLEvent*) *actionEvent;
voidResult = ::PostSynchronousEvent(initContext, event);
return (NS_FAILED((nsresult) voidResult)) ? JNI_FALSE : JNI_TRUE;
}
return JNI_FALSE;
} // Java_org_mozilla_webclient_BrowserControlNativeShim_nativeWebShellBack()
#ifdef XP_UNIX
/*
* Class: org_mozilla_webclient_motif_MotifMozillaEventQueue
* Method: processNativeEventQueue
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_mozilla_webclient_motif_NativeEventThread_processNativeEventQueue
(JNIEnv * env, jobject obj, jint webShellInitContextPtr) {
// Given a WebShellInitContext pointer, process any pending Mozilla / GTK events
WebShellInitContext * initContext = (WebShellInitContext *) webShellInitContextPtr;
// Initialize the WebShellInitContext if it's hasn't been already
if (initContext->initComplete == FALSE) {
InitEmbeddedEventHandler(initContext);
}
// Process any pending events...
processEventLoop(initContext);
}
#endif
/*
* Class: org_mozilla_webclient_BrowserControlNativeShim
* Method: nativeDebugBreak
* Signature: (Ljava/lang/String;I)V
*/
JNIEXPORT void JNICALL
Java_org_mozilla_webclient_BrowserControlNativeShim_nativeDebugBreak(JNIEnv *jEnv,
jclass myClass,
jstring fileName,
jint lineNumber)
{
const char *charFileName = (char *) jEnv->GetStringUTFChars(fileName, 0);
nsDebug::Break(charFileName, lineNumber);
}
#ifdef XP_UNIX
}// End extern "C"
#endif
void
PostEvent (WebShellInitContext * initContext, PLEvent * event)
{
PL_ENTER_EVENT_QUEUE_MONITOR(initContext->actionQueue);
::PL_PostEvent(initContext->actionQueue, event);
PL_EXIT_EVENT_QUEUE_MONITOR(initContext->actionQueue);
} // PostEvent()
void *
PostSynchronousEvent (WebShellInitContext * initContext, PLEvent * event)
{
void * voidResult = nsnull;
PL_ENTER_EVENT_QUEUE_MONITOR(initContext->actionQueue);
voidResult = ::PL_PostSynchronousEvent(initContext->actionQueue, event);
PL_EXIT_EVENT_QUEUE_MONITOR(initContext->actionQueue);
return voidResult;
} // PostSynchronousEvent()
// EOF