зеркало из https://github.com/mozilla/pjs.git
First Checked In.
This commit is contained in:
Родитель
bdc2f9c474
Коммит
f3ba83684d
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
MRJPlugin_4.x_config.h
|
||||
|
||||
Global configuration defines used by the MRJ plugin.
|
||||
|
||||
by Patrick C. Beard.
|
||||
*/
|
||||
|
||||
#include "MacHeaders.h"
|
||||
|
||||
#define MRJPLUGIN_4X 1
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
nsLiveConnect.cpp
|
||||
*/
|
||||
|
||||
#include "nsLiveconnect.h"
|
||||
#include "MRJMonitor.h"
|
||||
#include "MRJPlugin.h"
|
||||
#include "nsIPluginManager.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
extern nsIPluginManager* thePluginManager;
|
||||
|
||||
const InterfaceInfo nsLiveconnect::sInterfaces[] = {
|
||||
{ NS_ILIVECONNECT_IID, INTERFACE_OFFSET(nsLiveconnect, nsILiveconnect) },
|
||||
{ NS_IPLUGINSTREAMLISTENER_IID, INTERFACE_OFFSET(nsLiveconnect, nsIPluginStreamListener) },
|
||||
};
|
||||
const UInt32 nsLiveconnect::kInterfaceCount = sizeof(sInterfaces) / sizeof(InterfaceInfo);
|
||||
|
||||
nsLiveconnect::nsLiveconnect()
|
||||
: SupportsMixin(this, sInterfaces, kInterfaceCount),
|
||||
mJavaScriptMonitor(NULL), mScript(NULL), mResult(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
nsLiveconnect::~nsLiveconnect()
|
||||
{
|
||||
if (mJavaScriptMonitor != NULL)
|
||||
delete mJavaScriptMonitor;
|
||||
}
|
||||
|
||||
static char* u2c(const jchar *ustr, jsize length)
|
||||
{
|
||||
char* result = new char[length + 1];
|
||||
if (result != NULL) {
|
||||
char* cstr = result;
|
||||
while (length-- > 0) {
|
||||
*cstr++ = (char) *ustr++;
|
||||
}
|
||||
*cstr = '\0';
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
const char* kJavaScriptPrefix = "javascript:";
|
||||
|
||||
NS_METHOD
|
||||
nsLiveconnect::Eval(JNIEnv *env, jsobject obj, const jchar *script, jsize length, void* principalsArray[],
|
||||
int numPrincipals, void *securityContext, jobject *outResult)
|
||||
{
|
||||
MRJPluginInstance* pluginInstance = (MRJPluginInstance*) obj;
|
||||
nsIPluginStreamListener* listener = this;
|
||||
|
||||
if (mJavaScriptMonitor == NULL)
|
||||
mJavaScriptMonitor = new MRJMonitor(pluginInstance->getSession());
|
||||
|
||||
mJavaScriptMonitor->enter();
|
||||
|
||||
while (mScript != NULL) {
|
||||
// some other thread is evaluating a script.
|
||||
mJavaScriptMonitor->wait();
|
||||
}
|
||||
|
||||
// convert the script to ASCII, construct a "javascript:" URL.
|
||||
char* cscript = u2c(script, length);
|
||||
mScript = new char[strlen(kJavaScriptPrefix) + length + 1];
|
||||
strcpy(mScript, kJavaScriptPrefix);
|
||||
strcat(mScript, cscript);
|
||||
delete[] cscript;
|
||||
nsresult result = thePluginManager->GetURL((nsIPluginInstance*)pluginInstance, mScript, NULL, listener);
|
||||
|
||||
// need to block until the result is ready.
|
||||
mJavaScriptMonitor->wait();
|
||||
|
||||
// default result is NULL, in case JavaScript returns undefined value.
|
||||
*outResult = NULL;
|
||||
|
||||
// result should now be ready, convert it to a Java string and return.
|
||||
if (mResult != NULL) {
|
||||
*outResult = env->NewStringUTF(mResult);
|
||||
delete[] mResult;
|
||||
mResult = NULL;
|
||||
}
|
||||
|
||||
delete[] mScript;
|
||||
mScript = NULL;
|
||||
|
||||
mJavaScriptMonitor->notifyAll();
|
||||
|
||||
mJavaScriptMonitor->exit();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_METHOD nsLiveconnect::OnDataAvailable(nsIPluginStreamInfo* pluginInfo, nsIInputStream* input, PRUint32 length)
|
||||
{
|
||||
// hopefully all our data is available.
|
||||
mResult = new char[length + 1];
|
||||
if (mResult != NULL) {
|
||||
if (input->Read(mResult, length, &length) == NS_OK) {
|
||||
// We've delayed processing the applet tag, because we
|
||||
// don't know the location of the curren document yet.
|
||||
mResult[length] = '\0';
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_METHOD nsLiveconnect::OnStopBinding(nsIPluginStreamInfo* pluginInfo, nsresult status)
|
||||
{
|
||||
// the stream has been closed, notify any waiting Java threads.
|
||||
mJavaScriptMonitor->notifyAll();
|
||||
return NS_OK;
|
||||
}
|
|
@ -0,0 +1,232 @@
|
|||
/*
|
||||
nsLiveConnect.h
|
||||
*/
|
||||
|
||||
#include "nsILiveconnect.h"
|
||||
#include "nsIPluginStreamListener.h"
|
||||
#include "SupportsMixin.h"
|
||||
|
||||
class MRJMonitor;
|
||||
|
||||
class nsLiveconnect : public nsILiveconnect,
|
||||
public nsIPluginStreamListener,
|
||||
public SupportsMixin {
|
||||
public:
|
||||
DECL_SUPPORTS_MIXIN
|
||||
|
||||
nsLiveconnect();
|
||||
virtual ~nsLiveconnect();
|
||||
|
||||
/**
|
||||
* get member of a Native JSObject for a given name.
|
||||
*
|
||||
* @param obj - A Native JS Object.
|
||||
* @param name - Name of a member.
|
||||
* @param pjobj - return parameter as a java object representing
|
||||
* the member. If it is a basic data type it is converted to
|
||||
* a corresponding java type. If it is a NJSObject, then it is
|
||||
* wrapped up as java wrapper netscape.javascript.JSObject.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
GetMember(JNIEnv *env, jsobject jsobj, const jchar *name, jsize length, void* principalsArray[],
|
||||
int numPrincipals, void *securityContext, jobject *pjobj)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* get member of a Native JSObject for a given index.
|
||||
*
|
||||
* @param obj - A Native JS Object.
|
||||
* @param slot - Index of a member.
|
||||
* @param pjobj - return parameter as a java object representing
|
||||
* the member.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
GetSlot(JNIEnv *env, jsobject jsobj, jint slot, void* principalsArray[],
|
||||
int numPrincipals, void *securityContext, jobject *pjobj)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* set member of a Native JSObject for a given name.
|
||||
*
|
||||
* @param obj - A Native JS Object.
|
||||
* @param name - Name of a member.
|
||||
* @param jobj - Value to set. If this is a basic data type, it is converted
|
||||
* using standard JNI calls but if it is a wrapper to a JSObject
|
||||
* then a internal mapping is consulted to convert to a NJSObject.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
SetMember(JNIEnv *env, jsobject jsobj, const jchar* name, jsize length, jobject jobj, void* principalsArray[],
|
||||
int numPrincipals, void *securityContext)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* set member of a Native JSObject for a given index.
|
||||
*
|
||||
* @param obj - A Native JS Object.
|
||||
* @param index - Index of a member.
|
||||
* @param jobj - Value to set. If this is a basic data type, it is converted
|
||||
* using standard JNI calls but if it is a wrapper to a JSObject
|
||||
* then a internal mapping is consulted to convert to a NJSObject.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
SetSlot(JNIEnv *env, jsobject jsobj, jint slot, jobject jobj, void* principalsArray[],
|
||||
int numPrincipals, void *securityContext)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* remove member of a Native JSObject for a given name.
|
||||
*
|
||||
* @param obj - A Native JS Object.
|
||||
* @param name - Name of a member.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
RemoveMember(JNIEnv *env, jsobject jsobj, const jchar* name, jsize length, void* principalsArray[],
|
||||
int numPrincipals, void *securityContext)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* call a method of Native JSObject.
|
||||
*
|
||||
* @param obj - A Native JS Object.
|
||||
* @param name - Name of a method.
|
||||
* @param jobjArr - Array of jobjects representing parameters of method being caled.
|
||||
* @param pjobj - return value.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
Call(JNIEnv *env, jsobject jsobj, const jchar* name, jsize length, jobjectArray jobjArr, void* principalsArray[],
|
||||
int numPrincipals, void *securityContext, jobject *pjobj)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluate a script with a Native JS Object representing scope.
|
||||
*
|
||||
* @param obj - A Native JS Object.
|
||||
* @param principalsArray - Array of principals to be used to compare privileges.
|
||||
* @param numPrincipals - Number of principals being passed.
|
||||
* @param script - Script to be executed.
|
||||
* @param pjobj - return value.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
Eval(JNIEnv *env, jsobject obj, const jchar *script, jsize length, void* principalsArray[],
|
||||
int numPrincipals, void *securityContext, jobject *outResult);
|
||||
|
||||
/**
|
||||
* Get the window object for a plugin instance.
|
||||
*
|
||||
* @param pJavaObject - Either a jobject or a pointer to a plugin instance
|
||||
* representing the java object.
|
||||
* @param pjobj - return value. This is a native js object
|
||||
* representing the window object of a frame
|
||||
* in which a applet/bean resides.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
GetWindow(JNIEnv *env, void *pJavaObject, void* principalsArray[],
|
||||
int numPrincipals, void *securityContext, jsobject *pobj)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalize a JSObject instance.
|
||||
*
|
||||
* @param env - JNIEnv on which the call is being made.
|
||||
* @param obj - A Native JS Object.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
FinalizeJSObject(JNIEnv *env, jsobject jsobj)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a JSObject to a string.
|
||||
*
|
||||
* @param env - JNIEnv on which the call is being made.
|
||||
* @param obj - A Native JS Object.
|
||||
* @param jstring - Return value as a jstring representing a JS object.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
ToString(JNIEnv *env, jsobject obj, jstring *pjstring)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
// nsIPluginStreamListener implementation.
|
||||
|
||||
/**
|
||||
* Notify the observer that the URL has started to load. This method is
|
||||
* called only once, at the beginning of a URL load.<BR><BR>
|
||||
*
|
||||
* @return The return value is currently ignored. In the future it may be
|
||||
* used to cancel the URL load..
|
||||
*/
|
||||
NS_IMETHOD
|
||||
OnStartBinding(nsIPluginStreamInfo* pluginInfo)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify the client that data is available in the input stream. This
|
||||
* method is called whenver data is written into the input stream by the
|
||||
* networking library...<BR><BR>
|
||||
*
|
||||
* @param aIStream The input stream containing the data. This stream can
|
||||
* be either a blocking or non-blocking stream.
|
||||
* @param length The amount of data that was just pushed into the stream.
|
||||
* @return The return value is currently ignored.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
OnDataAvailable(nsIPluginStreamInfo* pluginInfo, nsIInputStream* input, PRUint32 length);
|
||||
|
||||
NS_IMETHOD
|
||||
OnFileAvailable(nsIPluginStreamInfo* pluginInfo, const char* fileName)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify the observer that the URL has finished loading. This method is
|
||||
* called once when the networking library has finished processing the
|
||||
* URL transaction initiatied via the nsINetService::Open(...) call.<BR><BR>
|
||||
*
|
||||
* This method is called regardless of whether the URL loaded successfully.<BR><BR>
|
||||
*
|
||||
* @param status Status code for the URL load.
|
||||
* @param msg A text string describing the error.
|
||||
* @return The return value is currently ignored.
|
||||
*/
|
||||
NS_IMETHOD
|
||||
OnStopBinding(nsIPluginStreamInfo* pluginInfo, nsresult status);
|
||||
|
||||
/**
|
||||
* What is this method supposed to do?
|
||||
*/
|
||||
NS_IMETHOD
|
||||
GetStreamType(nsPluginStreamType *result)
|
||||
{
|
||||
*result = nsPluginStreamType_Normal;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
MRJMonitor* mJavaScriptMonitor;
|
||||
char* mScript;
|
||||
char* mResult;
|
||||
|
||||
// support for SupportsMixin.
|
||||
static const InterfaceInfo sInterfaces[];
|
||||
static const UInt32 kInterfaceCount;
|
||||
};
|
Загрузка…
Ссылка в новой задаче