This commit is contained in:
beard 1998-06-23 01:31:44 +00:00
Родитель a4ead17823
Коммит 3c43366f5f
5 изменённых файлов: 347 добавлений и 0 удалений

Двоичные данные
js/ref/macbuild/JSRef.mcp Normal file

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,154 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
JavaSession.cpp
Uses MRJ to open a Java VM.
by Patrick C. Beard.
*/
#include "JavaSession.h"
#include <Errors.h>
#include <string.h>
#include <stdio.h>
#include <Resources.h>
extern "C" {
static void java_stdout(JMSessionRef session, const void *message, UInt32 messageLengthInBytes);
static void java_stderr(JMSessionRef session, const void *message, UInt32 messageLengthInBytes);
static SInt32 java_stdin(JMSessionRef session, void *buffer, SInt32 maxBufferLength);
static Boolean java_exit(JMSessionRef session, int value);
static Boolean java_authenticate(JMSessionRef session, const char *url, const char *realm,
char userName[255], char password[255]);
static void java_lowmem(JMSessionRef session);
}
static JMSessionCallbacks callbacks = {
kJMVersion, /* should be set to kJMVersion */
&java_stdout, /* JM will route "stdout" to this function. */
&java_stderr, /* JM will route "stderr" to this function. */
&java_stdin, /* read from console - can be nil for default behavior (no console IO) */
&java_exit, /* handle System.exit(int) requests */
&java_authenticate, /* present basic authentication dialog */
&java_lowmem /* Low Memory notification Proc */
};
JavaSession::JavaSession() : mSession(NULL)
{
OSStatus status = ::JMOpenSession(&mSession, /* eDisableJITC */ eJManager2Defaults, eCheckRemoteCode,
&callbacks, kTextEncodingMacRoman, NULL);
checkStatus(status);
}
JavaSession::~JavaSession()
{
if (mSession != NULL) {
OSStatus status = ::JMCloseSession(mSession);
checkStatus(status);
}
}
JNIEnv* JavaSession::getEnv()
{
return ::JMGetCurrentEnv(mSession);
}
static StringPtr c2p(const char* str, StringPtr pstr)
{
unsigned char len = strlen(str);
memcpy(pstr + 1, str, len);
*pstr = len;
return pstr;
}
jclass JavaSession::getClass(const char* className)
{
JNIEnv* env = getEnv();
jclass result = env->FindClass(className);
if (result == NULL) throw OSStatusException(fnfErr);
/* if (result == NULL) {
Str255 pClassName;
c2p(className, pClassName);
Handle classHandle = ::GetNamedResource(ClassResType, pClassName);
if (classHandle != NULL) {
::HLock(classHandle);
result = env->DefineClass(className, NULL, (signed char*)*classHandle, ::GetHandleSize(classHandle));
::ReleaseResource(classHandle);
}
} */
return result;
}
/**
* Adds a Mac-style path name to the MRJ class path.
*/
void JavaSession::addClassPath(const char* jarFilePath)
{
Str255 pJarFilePath;
FSSpec jarFileSpec;
OSStatus status = FSMakeFSSpec( 0, 0, // use "current working directory"
c2p(jarFilePath, pJarFilePath),
&jarFileSpec);
checkStatus(status);
status = JMAddToClassPath(mSession, &jarFileSpec);
checkStatus(status);
}
// OBLIGATORY JMSession callbacks.
static void java_stdout(JMSessionRef session, const void *message, UInt32 messageLengthInBytes)
{
char* msg = (char*)message;
while (messageLengthInBytes--) {
char c = *msg++;
if (c == '\r')
c = '\n';
fputc(c, stdout);
}
}
static void java_stderr(JMSessionRef session, const void *message, UInt32 messageLengthInBytes)
{
char* msg = (char*)message;
while (messageLengthInBytes--) {
char c = *msg++;
if (c == '\r')
c = '\n';
fputc(c, stderr);
}
}
static SInt32 java_stdin(JMSessionRef session, void *buffer, SInt32 maxBufferLength) { return -1; }
static Boolean java_exit(JMSessionRef session, int value) { return false; }
static Boolean java_authenticate(JMSessionRef session, const char *url, const char *realm,
char userName[255], char password[255])
{
return true;
}
static void java_lowmem(JMSessionRef session)
{
}

Просмотреть файл

@ -0,0 +1,46 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
JavaSession.h
Uses MRJ to open a Java VM.
by Patrick C. Beard
*/
#pragma once
#include <jni.h>
#include <JManager.h>
#include "OSStatusException.h"
class JavaSession {
public:
JavaSession();
~JavaSession();
JNIEnv* getEnv();
jclass getClass(const char* className);
void addClassPath(const char* jarFilePath);
private:
JMSessionRef mSession;
};

Просмотреть файл

@ -0,0 +1,46 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
OSStatusException.h
MacOS OSStatus exception.
by Patrick C. Beard.
*/
#pragma once
#ifndef __TYPES__
#include <Types.h>
#endif
class OSStatusException {
public:
OSStatusException(OSStatus status) : mStatus(status) {}
OSStatus getStatus() { return mStatus; }
private:
OSStatus mStatus;
};
inline void checkStatus(OSStatus status)
{
if (status != noErr)
throw OSStatusException(status);
}

101
js/ref/prmacos.cpp Normal file
Просмотреть файл

@ -0,0 +1,101 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
prmacos.cpp
Mac OS Support functions for LiveConnect. Provides standard JNI JavaVM creation
functions, and strdup.
by Patrick C. Beard.
*/
#include <string.h>
#include <stdlib.h>
#include "JavaSession.h"
#include "prtypes.h"
#include "prmacos.h"
char* strdup(const char *str)
{
char* dup = (char*) malloc(1 + strlen(str));
if (dup != NULL)
strcpy(dup, str);
return dup;
}
// Fake VM initialization
jint JNICALL JNI_GetDefaultJavaVMInitArgs(void* args)
{
if (args != NULL) {
JDK1_1InitArgs* initArgs = (JDK1_1InitArgs*)args;
memset(initArgs, 0, sizeof(JDK1_1InitArgs));
return 0;
}
return -1;
}
static JavaSession* theSession = NULL;
static const JNIInvokeInterface_* theActualFunctions;
static JNIInvokeInterface_ thePatchedFunctions;
static jint MRJ_DestroyJavaVM(JavaVM* javaVM)
{
// Restore the original functions.
javaVM->functions = theActualFunctions;
// Toss the Java session instead.
if (theSession != NULL) {
delete theSession;
theSession = NULL;
return 0;
}
return -1;
}
jint JNICALL JNI_CreateJavaVM(JavaVM** outVM, JNIEnv ** outEnv, void* args)
{
int result = -1;
*outVM = NULL;
*outEnv = NULL;
try {
if (theSession == NULL)
theSession = new JavaSession();
JNIEnv* env = theSession->getEnv();
JavaVM* javaVM = NULL;
result = env->GetJavaVM(&javaVM);
if (result == 0) {
*outEnv = env;
*outVM = javaVM;
// patch the JavaVM so it won't actually destroy itself. This crashes MRJ right now.
theActualFunctions = javaVM->functions;
thePatchedFunctions = *theActualFunctions;
thePatchedFunctions.DestroyJavaVM = MRJ_DestroyJavaVM;
javaVM->functions = &thePatchedFunctions;
}
} catch (OSStatusException status) {
*outVM = NULL;
*outEnv = NULL;
}
return result;
}