NOT PART OF BUILD. Implemented variant to java object class, getProperty and return codes from Invoke(). Moved LiveConnect & XPConnect stuff into their own files.

This commit is contained in:
locka%iol.ie 2002-05-13 21:06:14 +00:00
parent 0f2a5892d7
commit 23ac64ad8e
6 changed files with 1143 additions and 922 deletions

View File

@ -21,7 +21,8 @@
*
* Contributor(s):
*
* Paul Oswald <paul.oswald@isinet.com>
* Adam Lock <adamlock@netscape.com>
* Paul Oswald <paul.oswald@isinet.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@ -42,46 +43,7 @@
#include "npapi.h"
#include "nsISupports.h"
#ifdef MOZ_ACTIVEX_PLUGIN_LIVECONNECT
#include "_gen/java_lang_Throwable.h"
#include "_gen/java_lang_Error.h"
#include "_gen/java_lang_String.h"
#include "_gen/java_lang_Boolean.h"
#include "_gen/java_lang_Number.h"
#include "_gen/java_lang_Integer.h"
#include "_gen/java_lang_Long.h"
//#include "_gen/java_lang_Double.h"
//#include "_gen/java_lang_Float.h"
#include "_gen/java_lang_Character.h"
#include "_gen/netscape_plugin_Plugin.h"
#include "_gen/MozAxPlugin.h"
#endif
#ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
#include "nsMemory.h"
#endif /* MOZ_ACTIVEX_PLUGIN_XPCONNECT */
// Plugin types supported
enum PluginInstanceType
{
itScript,
itControl
};
// Data associated with a plugin instance
struct PluginInstanceData {
PluginInstanceType nType;
union
{
CActiveScriptSiteInstance *pScriptSite;
CControlSiteInstance *pControlSite;
};
#ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
nsISupports *pScriptingPeer;
#endif
};
#include "LegacyPlugin.h"
// NPP_Initialize
//
@ -104,27 +66,13 @@ void NPP_Shutdown(void)
{
NG_TRACE_METHOD(NPP_Shutdown);
#ifdef MOZ_ACTIVEX_PLUGIN_LIVECONNECT
JRIEnv* env = NPN_GetJavaEnv();
if (env) {
unuse_MozAxPlugin(env);
unuse_netscape_plugin_Plugin(env);
unuse_java_lang_Error(env);
// unuse_java_lang_String(env);
unuse_java_lang_Number(env);
unuse_java_lang_Boolean(env);
unuse_java_lang_Integer(env);
unuse_java_lang_Long(env);
// unuse_java_lang_Float(env);
// unuse_java_lang_Double(env);
unuse_java_lang_Character(env);
}
liveconnect_shutdown();
#endif
_Module.Unlock();
}
// npp_GetJavaClass
// NPP_GetJavaClass
//
// Return the Java class representing this plugin
//
@ -132,34 +80,15 @@ jref NPP_GetJavaClass(void)
{
NG_TRACE_METHOD(NPP_GetJavaClass);
#ifdef MOZ_ACTIVEX_PLUGIN_LIVECONNECT
JRIEnv* env = NPN_GetJavaEnv();
if (env) {
// Note: The order of these is important (for some unknown reason)
// and was determined through trial and error. Do not rearrange
// without testing the new order!
use_netscape_plugin_Plugin(env);
jref myClass = (jref) use_MozAxPlugin(env);
use_java_lang_Error(env);
// use_java_lang_String(env);
use_java_lang_Number(env);
use_java_lang_Boolean(env);
use_java_lang_Integer(env);
use_java_lang_Long(env);
// use_java_lang_Float(env);
// use_java_lang_Double(env);
use_java_lang_Character(env);
return myClass;
}
return liveconnect_getjavaclass();
#endif
return NULL;
}
#define MIME_OLEOBJECT1 "application/x-oleobject"
#define MIME_OLEOBJECT2 "application/oleobject"
#define MIME_ACTIVESCRIPT "text/x-activescript"
NPError NewScript(const char *pluginType,
PluginInstanceData *pData,
uint16 mode,
@ -664,444 +593,14 @@ NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData)
{
}
#ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
#include "nsIMozAxPlugin.h"
#include "nsIClassInfo.h"
// We must implement nsIClassInfo because it signals the
// Mozilla Security Manager to allow calls from JavaScript.
// helper class to implement all necessary nsIClassInfo method stubs
// and to set flags used by the security system
class nsClassInfoMozAxPlugin : public nsIClassInfo
{
// These flags are used by the DOM and security systems to signal that
// JavaScript callers are allowed to call this object's scritable methods.
NS_IMETHOD GetFlags(PRUint32 *aFlags)
{*aFlags = nsIClassInfo::PLUGIN_OBJECT | nsIClassInfo::DOM_OBJECT;
return NS_OK;}
NS_IMETHOD GetImplementationLanguage(PRUint32 *aImplementationLanguage)
{*aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
return NS_OK;}
// The rest of the methods can safely return error codes...
NS_IMETHOD GetInterfaces(PRUint32 *count, nsIID * **array)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetHelperForLanguage(PRUint32 language, nsISupports **_retval)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetContractID(char * *aContractID)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetClassDescription(char * *aClassDescription)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetClassID(nsCID * *aClassID)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
{return NS_ERROR_NOT_IMPLEMENTED;}
};
// Defines to be used as interface names by nsScriptablePeer
static NS_DEFINE_IID(kIMoxAxPluginIID, NS_IMOZAXPLUGIN_IID);
static NS_DEFINE_IID(kIClassInfoIID, NS_ICLASSINFO_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
class nsScriptablePeer : public nsIMozAxPlugin,
public nsClassInfoMozAxPlugin
{
long mRef;
PluginInstanceData* mPlugin;
protected:
virtual ~nsScriptablePeer();
public:
nsScriptablePeer();
NS_DECL_ISUPPORTS
NS_DECL_NSIMOZAXPLUGIN
};
nsScriptablePeer::nsScriptablePeer()
{
mRef = 0;
}
nsScriptablePeer::~nsScriptablePeer()
{
}
///////////////////////////////////////////////////////////////////////////////
// nsISupports
// NOTE: We're not using the helpful NS_IMPL_ISUPPORTS macro because they drag
// in dependencies to xpcom that a plugin like ourselves is better off
// without.
/* void QueryInterface (in nsIIDRef uuid, [iid_is (uuid), retval] out nsQIResult result); */
NS_IMETHODIMP nsScriptablePeer::QueryInterface(const nsIID & aIID, void * *aInstancePtr)
{
if (aIID.Equals(NS_GET_IID(nsISupports)))
{
*aInstancePtr = NS_STATIC_CAST(void *, this);
AddRef();
return NS_OK;
}
else if (aIID.Equals(NS_GET_IID(nsIMozAxPlugin)))
{
*aInstancePtr = NS_STATIC_CAST(void *, this);
AddRef();
return NS_OK;
}
else if (aIID.Equals(kIClassInfoIID))
{
*aInstancePtr = static_cast<nsIClassInfo*>(this);
AddRef();
return NS_OK;
}
return NS_NOINTERFACE;
}
/* [noscript, notxpcom] nsrefcnt AddRef (); */
NS_IMETHODIMP_(nsrefcnt) nsScriptablePeer::AddRef()
{
mRef++;
return NS_OK;
}
/* [noscript, notxpcom] nsrefcnt Release (); */
NS_IMETHODIMP_(nsrefcnt) nsScriptablePeer::Release()
{
mRef--;
if (mRef <= 0)
{
delete this;
}
return NS_OK;
}
///////////////////////////////////////////////////////////////////////////////
// nsIMozAxPlugin
// the following method will be callable from JavaScript
NS_IMETHODIMP
nsScriptablePeer::Invoke(const char *str)
{
/* HRESULT hr;
DISPID dispid;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
// call the requested function
const char* funcName = str; //_T("Update");
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(funcName);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&dispparamsNoArgs, NULL, NULL, NULL);
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release(); */
return NS_OK;
}
NS_IMETHODIMP
nsScriptablePeer::GetProperty(const char *propertyName, char **_retval)
{
/* HRESULT hr;
DISPID dispid;
//VARIANT VarResult;
_variant_t VarResult;
//char* propertyValue;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
const char* property = propertyName;
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) { return NULL; }
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(property);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET,
&dispparamsNoArgs, &VarResult, NULL, NULL);
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release();
char* tempStr;
switch(VarResult.vt & VT_TYPEMASK) {
case VT_BSTR:
tempStr = OLE2A(VarResult.bstrVal);
if(!_retval) return NS_ERROR_NULL_POINTER;
*_retval = (char*) nsMemory::Alloc(strlen(tempStr) + 1);
if (! *_retval) return NS_ERROR_NULL_POINTER;
if (VarResult.bstrVal == NULL) {
*_retval = NULL;
} else {
strcpy(*_retval, tempStr);
}
break;
// case VT_I2:
default:
VarResult.ChangeType(VT_BSTR);
tempStr = OLE2A(VarResult.bstrVal);
if(!_retval) return NS_ERROR_NULL_POINTER;
*_retval = (char*) nsMemory::Alloc(strlen(tempStr) + 1);
if (! *_retval) return NS_ERROR_NULL_POINTER;
if (VarResult.bstrVal == NULL) {
*_retval = NULL;
} else {
strcpy(*_retval, tempStr);
}
break;
} */
// caller will be responsible for any memory allocated.
return NS_OK;
}
NS_IMETHODIMP nsScriptablePeer::GetNProperty(const char *propertyName, PRInt16 *_retval)
{
/* HRESULT hr;
DISPID dispid;
VARIANT VarResult;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
const char* property = propertyName;
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) { return NULL; }
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(property);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET,
&dispparamsNoArgs, &VarResult, NULL, NULL);
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release();
if(!_retval) return NS_ERROR_NULL_POINTER;
// make sure we are dealing with an int
if ((VarResult.vt & VT_TYPEMASK) != VT_I2) {
*_retval = NULL;
return NPERR_GENERIC_ERROR;
}
*_retval = VarResult.iVal; */
// caller will be responsible for any memory allocated.
return NS_OK;
}
/* void setProperty (in string propertyName, in string propertyValue); */
NS_IMETHODIMP nsScriptablePeer::SetProperty(const char *propertyName, const char *propertyValue)
{
HRESULT hr;
DISPID dispid;
VARIANT VarResult;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
const char* property = propertyName;
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) { return NULL; }
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(property);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
VARIANT *pvars = new VARIANT[1];
VariantInit(&pvars[0]);
pvars->vt = VT_BSTR;
pvars->bstrVal = A2OLE(propertyValue);
DISPID dispIdPut = DISPID_PROPERTYPUT;
DISPPARAMS functionArgs;
functionArgs.rgdispidNamedArgs = &dispIdPut;
functionArgs.rgvarg = pvars;
functionArgs.cArgs = 1;
functionArgs.cNamedArgs = 1;
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYPUT,
&functionArgs, &VarResult, NULL, NULL);
delete []pvars;
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release();
return NS_OK;
}
/* void setNProperty (in string propertyName, in string propertyValue); */
NS_IMETHODIMP nsScriptablePeer::SetNProperty(const char *propertyName, PRInt16 propertyValue)
{
HRESULT hr;
DISPID dispid;
VARIANT VarResult;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
const char* property = propertyName;
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) { return NULL; }
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(property);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
VARIANT *pvars = new VARIANT[1];
VariantInit(&pvars[0]);
pvars->vt = VT_I2;
pvars->iVal = propertyValue;
DISPID dispIdPut = DISPID_PROPERTYPUT;
DISPPARAMS functionArgs;
functionArgs.rgdispidNamedArgs = &dispIdPut;
functionArgs.rgvarg = pvars;
functionArgs.cArgs = 1;
functionArgs.cNamedArgs = 1;
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYPUT,
&functionArgs, &VarResult, NULL, NULL);
delete []pvars;
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release();
return NS_OK;
}
// Happy happy fun fun - redefine some NPPVariable values that we might
// be asked for but not defined by every PluginSDK
const int kVarScriptableInstance = 10; // NPPVpluginScriptableInstance
const int kVarScriptableIID = 11; // NPPVpluginScriptableIID
NPError NP_LOADDS
NPP_GetValue(NPP instance, NPPVariable variable, void *value)
{
if (instance == NULL)
{
return NPERR_INVALID_INSTANCE_ERROR;
}
if (variable == kVarScriptableInstance)
{
PluginInstanceData *pData = (PluginInstanceData *) instance->pdata;
if (!pData->pScriptingPeer)
{
nsScriptablePeer *peer = new nsScriptablePeer();
peer->AddRef();
pData->pScriptingPeer = (nsIMozAxPlugin *) peer;
}
if (pData->pScriptingPeer)
{
pData->pScriptingPeer->AddRef();
*((nsISupports **) value)= pData->pScriptingPeer;
return NPERR_NO_ERROR;
}
}
else if (variable == kVarScriptableIID)
{
static nsIID kIMozAxPluginIID = NS_IMOZAXPLUGIN_IID;
nsIID *piid = (nsIID *) NPN_MemAlloc(sizeof(nsIID));
*piid = kIMozAxPluginIID;
*((nsIID **) value) = piid;
return NPERR_NO_ERROR;
}
return NPERR_GENERIC_ERROR;
NPError rv = NPERR_GENERIC_ERROR;
#ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
rv = xpconnect_getvalue(instance, variable, value);
#endif
return rv;
}
NPError NP_LOADDS
@ -1109,391 +608,3 @@ NPP_SetValue(NPP instance, NPNVariable variable, void *value)
{
return NPERR_GENERIC_ERROR;
}
#endif
#ifdef MOZ_ACTIVEX_PLUGIN_LIVECONNECT
// The following will be callable from Javascript through LiveConnect
HRESULT
_GetIDispatchFromJRI(JRIEnv *env, struct MozAxPlugin* self, IDispatch **pdisp)
{
*pdisp = NULL;
// Note: You get a nasty crash calling self->getPeer(env), this obscure cast fixes
// it. More details in the link:
//
// http://groups.google.com/groups?selm=385D9543.4087F1C6%40ermapper.com.au&output=gplain
NPP npp = (NPP) netscape_plugin_Plugin_getPeer(env,
reinterpret_cast<netscape_plugin_Plugin*> (self));
PluginInstanceData *pData = (PluginInstanceData *) npp->pdata;
if (pData == NULL)
{
return E_FAIL;
}
IUnknownPtr unk;
HRESULT hr = pData->pControlSite->GetControlUnknown(&unk);
if (unk.GetInterfacePtr() == NULL)
{
return E_FAIL;
}
IDispatchPtr disp = unk;
if (disp.GetInterfacePtr() == NULL)
{
return E_FAIL;
}
*pdisp = disp.GetInterfacePtr();
(*pdisp)->AddRef();
return S_OK;
}
HRESULT
_VariantToJRIObject(JRIEnv *env, VARIANT *v, jref **o)
{
// TODO make a JRI object from a variant
return E_NOTIMPL;
}
HRESULT
_JRIObjectToVariant(JRIEnv *env, java_lang_Object *o, VARIANT *v)
{
VariantInit(v);
if (JRI_IsInstanceOf(env, (jref) o, class_java_lang_String(env)))
{
USES_CONVERSION;
const char *value = JRI_GetStringUTFChars(env, reinterpret_cast<java_lang_String *>(o));
v->vt = VT_BSTR;
v->bstrVal = SysAllocString(A2COLE(value));
}
else if (JRI_IsInstanceOf(env, (jref) o, class_java_lang_Boolean(env)))
{
jbool value = java_lang_Boolean_booleanValue(env, reinterpret_cast<java_lang_Boolean *>(o));
v->vt = VT_BOOL;
v->boolVal = value == JRITrue ? VARIANT_TRUE : VARIANT_FALSE;
}
else if (JRI_IsInstanceOf(env, o, class_java_lang_Integer(env)))
{
jint value = java_lang_Integer_intValue(env, reinterpret_cast<java_lang_Integer *>(o));
v->vt = VT_I4;
v->lVal = value;
}
else if (JRI_IsInstanceOf(env, o, class_java_lang_Long(env)))
{
jlong value = java_lang_Long_longValue(env, reinterpret_cast<java_lang_Long *>(o));
v->vt = VT_I4;
v->lVal = value;
}
/* else if (JRI_IsInstanceOf(env, o, class_java_lang_Double(env)))
{
jdouble value = java_lang_Double_doubleValue(env, reinterpret_cast<java_lang_Double *>(o));
v->vt = VT_R8;
v->dblVal = value;
}
else if (JRI_IsInstanceOf(env, o, class_java_lang_Float(env)))
{
jfloat value = java_lang_Float_floatValue(env, reinterpret_cast<java_lang_Float *>(o));
v->vt = VT_UI1;
v->fltVal = value;
} */
else if (JRI_IsInstanceOf(env, o, class_java_lang_Character(env)))
{
jchar value = java_lang_Character_charValue(env, reinterpret_cast<java_lang_Character *>(o));
v->vt = VT_UI1;
v->bVal = value;
}
else if (JRI_IsInstanceOf(env, o, class_java_lang_Number(env)))
{
jlong value = java_lang_Number_longValue(env, reinterpret_cast<java_lang_Number *>(o));
v->vt = VT_I4;
v->lVal = value;
}
else
{
// TODO dump diagnostic error here
return E_FAIL;
}
return S_OK;
}
struct java_lang_Object *
_InvokeFromJRI(JRIEnv *env, struct MozAxPlugin* self, struct java_lang_String *func, int nargs, java_lang_Object *args[])
{
HRESULT hr;
DISPID dispid = 0;
// call the requested function
const char* funcName = JRI_GetStringUTFChars(env, func);
IDispatchPtr disp;
if (FAILED(_GetIDispatchFromJRI(env, self, &disp)))
{
return NULL;
}
_variant_t *vargs = new _variant_t[nargs];
for (int i = 0; i < nargs; i++)
{
if (FAILED(_JRIObjectToVariant(env, args[i], &vargs[i])))
{
delete []vargs;
char error[64];
sprintf(error, "Argument %d could not be converted into a variant", i);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(funcName);
hr = disp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr))
{
char error[128];
memset(error, 0, sizeof(error));
_snprintf(error, sizeof(error) - 1, "invoke failed, member \"%s\" not found, hr=0x%08x", funcName, hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
DISPPARAMS dispparams = {NULL, NULL, 0, 0};
dispparams.rgvarg = vargs;
dispparams.cArgs = nargs;
hr = disp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&dispparams, NULL, NULL, NULL);
if (FAILED(hr))
{
char error[64];
sprintf(error, "invoke failed, result from object = 0x%08x", hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
return NULL;
}
/*******************************************************************************
* Native Methods:
* These are the native methods which we are implementing.
******************************************************************************/
extern "C" JRI_PUBLIC_API(void)
native_MozAxPlugin_x(JRIEnv* env, struct MozAxPlugin* self, jint a)
{
::MessageBox(NULL, "x() called", "Result", MB_OK);
}
/*** private native xinvoke (Ljava/lang/String;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a)
{
return _InvokeFromJRI(env, self, a, 0, NULL);
}
/*** private native xinvoke1 (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke1(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b)
{
java_lang_Object *args[1];
args[0] = b;
return _InvokeFromJRI(env, self, a, sizeof(args) / sizeof(args[0]), args);
}
/*** private native xinvoke2 (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke2(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b, struct java_lang_Object *c)
{
java_lang_Object *args[2];
args[0] = b;
args[1] = c;
return _InvokeFromJRI(env, self, a, sizeof(args) / sizeof(args[0]), args);
}
/*** private native xinvoke3 (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke3(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b, struct java_lang_Object *c, struct java_lang_Object *d)
{
java_lang_Object *args[3];
args[0] = b;
args[1] = c;
args[2] = d;
return _InvokeFromJRI(env, self, a, sizeof(args) / sizeof(args[0]), args);
}
/*** private native xinvoke4 (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke4(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b, struct java_lang_Object *c, struct java_lang_Object *d, struct java_lang_Object *e)
{
java_lang_Object *args[4];
args[0] = b;
args[1] = c;
args[2] = d;
args[3] = e;
return _InvokeFromJRI(env, self, a, sizeof(args) / sizeof(args[0]), args);
}
/*** private native xinvokeX (Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvokeX(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, jobjectArray b)
{
// TODO
return NULL;
}
/*** private native xgetProperty (Ljava/lang/String;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xgetProperty(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a)
{
HRESULT hr;
DISPID dispid;
_variant_t VarResult;
IDispatchPtr disp;
if (FAILED(_GetIDispatchFromJRI(env, self, &disp)))
{
return NULL;
}
// return the requested property to the Java peer
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(JRI_GetStringUTFChars(env, a));
hr = disp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr))
{
char error[128];
memset(error, 0, sizeof(error));
_snprintf(error, sizeof(error) - 1, "getProperty failed, member \"%s\" not found, hr=0x%08x", szMember, hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = disp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET,
&dispparamsNoArgs, &VarResult, NULL, NULL);
if (FAILED(hr))
{
char error[64];
sprintf(error, "getProperty failed, result from object = 0x%08x", hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
_bstr_t strVal;
switch(VarResult.vt & VT_TYPEMASK)
{
case VT_BSTR:
strVal = _bstr_t(VarResult.bstrVal);
return (java_lang_Object*)JRI_NewStringUTF( env, strVal, strVal.length() );
break;
case VT_I2:
VarResult.ChangeType(VT_BSTR);
strVal = _bstr_t(VarResult.bstrVal);
return (java_lang_Object*)JRI_NewStringUTF( env, strVal, strVal.length() );
break;
}
// caller will be responsible for any memory allocated by JRI_NewStringUTF
return NULL;
}
/*** private native xsetProperty2 (Ljava/lang/String;Ljava/lang/Object;)V ***/
extern "C" JRI_PUBLIC_API(void)
native_MozAxPlugin_xsetProperty2(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b)
{
HRESULT hr;
DISPID dispid;
VARIANT VarResult;
IDispatchPtr disp;
if (FAILED(_GetIDispatchFromJRI(env, self, &disp)))
{
return;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(JRI_GetStringUTFChars(env, a));
hr = disp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr))
{
char error[128];
memset(error, 0, sizeof(error));
_snprintf(error, sizeof(error) - 1, "setProperty failed, member \"%s\" not found, hr=0x%08x", szMember, hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return;
}
_variant_t *pvars = new _variant_t[1];
if (FAILED(_JRIObjectToVariant(env, b, &pvars[0])))
{
delete []pvars;
char error[64];
sprintf(error, "Property value could not be converted into a variant");
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return;
}
DISPID dispIdPut = DISPID_PROPERTYPUT;
DISPPARAMS functionArgs;
functionArgs.rgdispidNamedArgs = &dispIdPut;
functionArgs.rgvarg = pvars;
functionArgs.cArgs = 1;
functionArgs.cNamedArgs = 1;
hr = disp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYPUT,
&functionArgs, &VarResult, NULL, NULL);
delete []pvars;
if (FAILED(hr))
{
char error[64];
sprintf(error, "setProperty failed, result from object = 0x%08x", hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return;
}
}
/*** private native xsetProperty1 (Ljava/lang/String;Ljava/lang/String;)V ***/
extern "C" JRI_PUBLIC_API(void)
native_MozAxPlugin_xsetProperty1(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_String *b)
{
native_MozAxPlugin_xsetProperty2(env, self, a, reinterpret_cast<java_lang_Object *>(b));
}
///////////////////////////////////////////////////////////////////////////////
/*** private native printStackTrace0 (Ljava/io/PrintStream;)V ***/
extern "C" JRI_PUBLIC_API(void)
native_java_lang_Throwable_printStackTrace0(JRIEnv* env, struct java_lang_Throwable* self, struct java_io_PrintStream *a)
{
}
/*** public native fillInStackTrace ()Ljava/lang/Throwable; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Throwable *)
native_java_lang_Throwable_fillInStackTrace(JRIEnv* env, struct java_lang_Throwable* self)
{
return self;
}
#endif

View File

@ -0,0 +1,75 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape 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/NPL/
*
* 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 mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Adam Lock <adamlock@netscape.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef LEGACYPLUGIN_H
#define LEGACYPLUGIN_H
#include "npapi.h"
#include "nsISupports.h"
// Plugin types supported
enum PluginInstanceType
{
itScript,
itControl
};
// Data associated with a plugin instance
struct PluginInstanceData {
PluginInstanceType nType;
union
{
CActiveScriptSiteInstance *pScriptSite;
CControlSiteInstance *pControlSite;
};
#ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
nsISupports *pScriptingPeer;
#endif
};
#ifdef MOZ_ACTIVEX_PLUGIN_LIVECONNECT
extern void liveconnect_shutdown();
extern jref liveconnect_getjavaclass();
#endif
#ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
extern NPError xpconnect_getvalue(NPP instance, NPPVariable variable, void *value);
#endif
#endif

View File

@ -0,0 +1,534 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape 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/NPL/
*
* 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 mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Adam Lock <adamlock@netscape.com>
* Paul Oswald <paul.oswald@isinet.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "stdafx.h"
#include "jni.h"
#include "npapi.h"
#include "_gen/java_lang_Throwable.h"
#include "_gen/java_lang_Error.h"
#include "_gen/java_lang_String.h"
#include "_gen/java_lang_Boolean.h"
#include "_gen/java_lang_Number.h"
#include "_gen/java_lang_Integer.h"
#include "_gen/java_lang_Long.h"
// TODO:
// These things require certain native statics to be implemented
// so they're commented out for the time being.
//#include "_gen/java_lang_Double.h"
//#include "_gen/java_lang_Float.h"
#include "_gen/java_lang_Character.h"
#include "_gen/netscape_plugin_Plugin.h"
#include "_gen/MozAxPlugin.h"
#include "LegacyPlugin.h"
void liveconnect_shutdown()
{
JRIEnv* env = NPN_GetJavaEnv();
if (env) {
unuse_MozAxPlugin(env);
unuse_netscape_plugin_Plugin(env);
unuse_java_lang_Error(env);
// unuse_java_lang_String(env);
unuse_java_lang_Number(env);
unuse_java_lang_Boolean(env);
unuse_java_lang_Integer(env);
unuse_java_lang_Long(env);
// unuse_java_lang_Float(env);
// unuse_java_lang_Double(env);
unuse_java_lang_Character(env);
}
}
jref liveconnect_getjavaclass()
{
JRIEnv* env = NPN_GetJavaEnv();
if (env) {
// Note: The order of these is important (for some unknown reason)
// and was determined through trial and error. Do not rearrange
// without testing the new order!
use_netscape_plugin_Plugin(env);
jref myClass = (jref) use_MozAxPlugin(env);
use_java_lang_Error(env);
// use_java_lang_String(env);
use_java_lang_Number(env);
use_java_lang_Boolean(env);
use_java_lang_Integer(env);
use_java_lang_Long(env);
// use_java_lang_Float(env);
// use_java_lang_Double(env);
use_java_lang_Character(env);
return myClass;
}
return NULL;
}
// The following will be callable from Javascript through LiveConnect
HRESULT
_GetIDispatchFromJRI(JRIEnv *env, struct MozAxPlugin* self, IDispatch **pdisp)
{
if (pdisp == NULL || env == NULL || self == NULL)
{
return E_INVALIDARG;
}
*pdisp = NULL;
// Note: You get a nasty crash calling self->getPeer(env), this obscure cast fixes
// it. More details in the link:
//
// http://groups.google.com/groups?selm=385D9543.4087F1C6%40ermapper.com.au&output=gplain
NPP npp = (NPP) netscape_plugin_Plugin_getPeer(env,
reinterpret_cast<netscape_plugin_Plugin*> (self));
PluginInstanceData *pData = (PluginInstanceData *) npp->pdata;
if (pData == NULL)
{
return E_FAIL;
}
IUnknownPtr unk;
HRESULT hr = pData->pControlSite->GetControlUnknown(&unk);
if (unk.GetInterfacePtr() == NULL)
{
return E_FAIL;
}
IDispatchPtr disp = unk;
if (disp.GetInterfacePtr() == NULL)
{
return E_FAIL;
}
*pdisp = disp.GetInterfacePtr();
(*pdisp)->AddRef();
return S_OK;
}
HRESULT
_VariantToJRIObject(JRIEnv *env, VARIANT *v, java_lang_Object **o)
{
if (v == NULL || env == NULL || o == NULL)
{
return E_INVALIDARG;
}
*o = NULL;
// TODO - VT_BYREF will cause problems
if (v->vt == VT_EMPTY)
{
return S_OK;
}
else if (v->vt == VT_BOOL)
{
jbool value = (v->boolVal == VARIANT_TRUE) ? JRITrue : JRIFalse;
java_lang_Boolean *j = java_lang_Boolean_new(env,
class_java_lang_Boolean(env), value);
*o = reinterpret_cast<java_lang_Object *>(j);
return S_OK;
}
else if (v->vt == VT_I4)
{
jlong value = v->lVal;
java_lang_Long *j = java_lang_Long_new(env,
class_java_lang_Long(env), value);
*o = reinterpret_cast<java_lang_Object *>(j);
return S_OK;
}
else if (v->vt == VT_I2)
{
jlong value = v->iVal;
java_lang_Long *j = java_lang_Long_new(env,
class_java_lang_Long(env), value);
*o = reinterpret_cast<java_lang_Object *>(j);
return S_OK;
}
/*
else if (v->vt == VT_R8)
{
jdouble value = v->dblVal;
java_lang_Double *j = java_lang_Double_new(env,
class_java_lang_Double(env), value);
*o = reinterpret_cast<java_lang_Object *>(j);
return S_OK;
}
*/
else if (v->vt == VT_BSTR)
{
USES_CONVERSION;
char * value = OLE2A(v->bstrVal);
java_lang_String *j = JRI_NewStringUTF(env, value, strlen(value));
*o = reinterpret_cast<java_lang_Object *>(j);
return S_OK;
}
/* TODO else if VT_UI1 etc. */
return E_FAIL;
}
HRESULT
_JRIObjectToVariant(JRIEnv *env, java_lang_Object *o, VARIANT *v)
{
VariantInit(v);
if (JRI_IsInstanceOf(env, (jref) o, class_java_lang_String(env)))
{
USES_CONVERSION;
const char *value = JRI_GetStringUTFChars(env, reinterpret_cast<java_lang_String *>(o));
v->vt = VT_BSTR;
v->bstrVal = SysAllocString(A2COLE(value));
}
else if (JRI_IsInstanceOf(env, (jref) o, class_java_lang_Boolean(env)))
{
jbool value = java_lang_Boolean_booleanValue(env, reinterpret_cast<java_lang_Boolean *>(o));
v->vt = VT_BOOL;
v->boolVal = value == JRITrue ? VARIANT_TRUE : VARIANT_FALSE;
}
else if (JRI_IsInstanceOf(env, o, class_java_lang_Integer(env)))
{
jint value = java_lang_Integer_intValue(env, reinterpret_cast<java_lang_Integer *>(o));
v->vt = VT_I4;
v->lVal = value;
}
else if (JRI_IsInstanceOf(env, o, class_java_lang_Long(env)))
{
jlong value = java_lang_Long_longValue(env, reinterpret_cast<java_lang_Long *>(o));
v->vt = VT_I4;
v->lVal = value;
}
/* else if (JRI_IsInstanceOf(env, o, class_java_lang_Double(env)))
{
jdouble value = java_lang_Double_doubleValue(env, reinterpret_cast<java_lang_Double *>(o));
v->vt = VT_R8;
v->dblVal = value;
}
else if (JRI_IsInstanceOf(env, o, class_java_lang_Float(env)))
{
jfloat value = java_lang_Float_floatValue(env, reinterpret_cast<java_lang_Float *>(o));
v->vt = VT_R4;
v->fltVal = value;
} */
else if (JRI_IsInstanceOf(env, o, class_java_lang_Character(env)))
{
jchar value = java_lang_Character_charValue(env, reinterpret_cast<java_lang_Character *>(o));
v->vt = VT_UI1;
v->bVal = value;
}
else if (JRI_IsInstanceOf(env, o, class_java_lang_Number(env)))
{
jlong value = java_lang_Number_longValue(env, reinterpret_cast<java_lang_Number *>(o));
v->vt = VT_I4;
v->lVal = value;
}
else
{
// TODO dump diagnostic error here
return E_FAIL;
}
return S_OK;
}
struct java_lang_Object *
_InvokeFromJRI(JRIEnv *env, struct MozAxPlugin* self, struct java_lang_String *func, int nargs, java_lang_Object *args[])
{
HRESULT hr;
DISPID dispid = 0;
// call the requested function
const char* funcName = JRI_GetStringUTFChars(env, func);
IDispatchPtr disp;
if (FAILED(_GetIDispatchFromJRI(env, self, &disp)))
{
return NULL;
}
_variant_t *vargs = new _variant_t[nargs];
for (int i = 0; i < nargs; i++)
{
if (FAILED(_JRIObjectToVariant(env, args[i], &vargs[i])))
{
delete []vargs;
char error[64];
sprintf(error, "Argument %d could not be converted into a variant", i);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(funcName);
hr = disp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr))
{
char error[128];
memset(error, 0, sizeof(error));
_snprintf(error, sizeof(error) - 1, "invoke failed, member \"%s\" not found, hr=0x%08x", funcName, hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
DISPPARAMS dispparams = {NULL, NULL, 0, 0};
dispparams.rgvarg = vargs;
dispparams.cArgs = nargs;
_variant_t vResult;
hr = disp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&dispparams, &vResult, NULL, NULL);
if (FAILED(hr))
{
char error[64];
sprintf(error, "invoke failed, result from object = 0x%08x", hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
java_lang_Object *oResult = NULL;
_VariantToJRIObject(env, &vResult, &oResult);
return reinterpret_cast<java_lang_Object *>(oResult);
}
/*******************************************************************************
* Native Methods:
* These are the native methods which we are implementing.
******************************************************************************/
extern "C" JRI_PUBLIC_API(void)
native_MozAxPlugin_x(JRIEnv* env, struct MozAxPlugin* self, jint a)
{
::MessageBox(NULL, "x() called", "Result", MB_OK);
}
/*** private native xinvoke (Ljava/lang/String;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a)
{
return _InvokeFromJRI(env, self, a, 0, NULL);
}
/*** private native xinvoke1 (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke1(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b)
{
java_lang_Object *args[1];
args[0] = b;
return _InvokeFromJRI(env, self, a, sizeof(args) / sizeof(args[0]), args);
}
/*** private native xinvoke2 (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke2(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b, struct java_lang_Object *c)
{
java_lang_Object *args[2];
args[0] = b;
args[1] = c;
return _InvokeFromJRI(env, self, a, sizeof(args) / sizeof(args[0]), args);
}
/*** private native xinvoke3 (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke3(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b, struct java_lang_Object *c, struct java_lang_Object *d)
{
java_lang_Object *args[3];
args[0] = b;
args[1] = c;
args[2] = d;
return _InvokeFromJRI(env, self, a, sizeof(args) / sizeof(args[0]), args);
}
/*** private native xinvoke4 (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvoke4(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b, struct java_lang_Object *c, struct java_lang_Object *d, struct java_lang_Object *e)
{
java_lang_Object *args[4];
args[0] = b;
args[1] = c;
args[2] = d;
args[3] = e;
return _InvokeFromJRI(env, self, a, sizeof(args) / sizeof(args[0]), args);
}
/*** private native xinvokeX (Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xinvokeX(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, jobjectArray b)
{
// TODO
return NULL;
}
/*** private native xgetProperty (Ljava/lang/String;)Ljava/lang/Object; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Object *)
native_MozAxPlugin_xgetProperty(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a)
{
HRESULT hr;
DISPID dispid;
_variant_t vResult;
IDispatchPtr disp;
if (FAILED(_GetIDispatchFromJRI(env, self, &disp)))
{
return NULL;
}
// return the requested property to the Java peer
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(JRI_GetStringUTFChars(env, a));
hr = disp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr))
{
char error[128];
memset(error, 0, sizeof(error));
_snprintf(error, sizeof(error) - 1, "getProperty failed, member \"%s\" not found, hr=0x%08x", szMember, hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = disp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET,
&dispparamsNoArgs, &vResult, NULL, NULL);
if (FAILED(hr))
{
char error[64];
sprintf(error, "getProperty failed, result from object = 0x%08x", hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return NULL;
}
java_lang_Object *oResult = NULL;
_VariantToJRIObject(env, &vResult, &oResult);
return oResult;
}
/*** private native xsetProperty2 (Ljava/lang/String;Ljava/lang/Object;)V ***/
extern "C" JRI_PUBLIC_API(void)
native_MozAxPlugin_xsetProperty2(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_Object *b)
{
HRESULT hr;
DISPID dispid;
VARIANT VarResult;
IDispatchPtr disp;
if (FAILED(_GetIDispatchFromJRI(env, self, &disp)))
{
return;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(JRI_GetStringUTFChars(env, a));
hr = disp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr))
{
char error[128];
memset(error, 0, sizeof(error));
_snprintf(error, sizeof(error) - 1, "setProperty failed, member \"%s\" not found, hr=0x%08x", szMember, hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return;
}
_variant_t *pvars = new _variant_t[1];
if (FAILED(_JRIObjectToVariant(env, b, &pvars[0])))
{
delete []pvars;
char error[64];
sprintf(error, "Property value could not be converted into a variant");
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return;
}
DISPID dispIdPut = DISPID_PROPERTYPUT;
DISPPARAMS functionArgs;
functionArgs.rgdispidNamedArgs = &dispIdPut;
functionArgs.rgvarg = pvars;
functionArgs.cArgs = 1;
functionArgs.cNamedArgs = 1;
hr = disp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYPUT,
&functionArgs, &VarResult, NULL, NULL);
delete []pvars;
if (FAILED(hr))
{
char error[64];
sprintf(error, "setProperty failed, result from object = 0x%08x", hr);
JRI_ThrowNew(env, class_java_lang_Error(env), error);
return;
}
}
/*** private native xsetProperty1 (Ljava/lang/String;Ljava/lang/String;)V ***/
extern "C" JRI_PUBLIC_API(void)
native_MozAxPlugin_xsetProperty1(JRIEnv* env, struct MozAxPlugin* self, struct java_lang_String *a, struct java_lang_String *b)
{
native_MozAxPlugin_xsetProperty2(env, self, a, reinterpret_cast<java_lang_Object *>(b));
}
///////////////////////////////////////////////////////////////////////////////
/*** private native printStackTrace0 (Ljava/io/PrintStream;)V ***/
extern "C" JRI_PUBLIC_API(void)
native_java_lang_Throwable_printStackTrace0(JRIEnv* env, struct java_lang_Throwable* self, struct java_io_PrintStream *a)
{
}
/*** public native fillInStackTrace ()Ljava/lang/Throwable; ***/
extern "C" JRI_PUBLIC_API(struct java_lang_Throwable *)
native_java_lang_Throwable_fillInStackTrace(JRIEnv* env, struct java_lang_Throwable* self)
{
return self;
}

View File

@ -0,0 +1,488 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape 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/NPL/
*
* 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 mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Adam Lock <adamlock@netscape.com>
* Paul Oswald <paul.oswald@isinet.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "stdafx.h"
#include "nsIMozAxPlugin.h"
#include "nsIClassInfo.h"
#include "nsMemory.h"
#include "LegacyPlugin.h"
// We must implement nsIClassInfo because it signals the
// Mozilla Security Manager to allow calls from JavaScript.
// helper class to implement all necessary nsIClassInfo method stubs
// and to set flags used by the security system
class nsClassInfoMozAxPlugin : public nsIClassInfo
{
// These flags are used by the DOM and security systems to signal that
// JavaScript callers are allowed to call this object's scritable methods.
NS_IMETHOD GetFlags(PRUint32 *aFlags)
{*aFlags = nsIClassInfo::PLUGIN_OBJECT | nsIClassInfo::DOM_OBJECT;
return NS_OK;}
NS_IMETHOD GetImplementationLanguage(PRUint32 *aImplementationLanguage)
{*aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
return NS_OK;}
// The rest of the methods can safely return error codes...
NS_IMETHOD GetInterfaces(PRUint32 *count, nsIID * **array)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetHelperForLanguage(PRUint32 language, nsISupports **_retval)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetContractID(char * *aContractID)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetClassDescription(char * *aClassDescription)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetClassID(nsCID * *aClassID)
{return NS_ERROR_NOT_IMPLEMENTED;}
NS_IMETHOD GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
{return NS_ERROR_NOT_IMPLEMENTED;}
};
// Defines to be used as interface names by nsScriptablePeer
static NS_DEFINE_IID(kIMoxAxPluginIID, NS_IMOZAXPLUGIN_IID);
static NS_DEFINE_IID(kIClassInfoIID, NS_ICLASSINFO_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
class nsScriptablePeer : public nsIMozAxPlugin,
public nsClassInfoMozAxPlugin
{
long mRef;
PluginInstanceData* mPlugin;
protected:
virtual ~nsScriptablePeer();
public:
nsScriptablePeer();
NS_DECL_ISUPPORTS
NS_DECL_NSIMOZAXPLUGIN
};
// Happy happy fun fun - redefine some NPPVariable values that we might
// be asked for but not defined by every PluginSDK
const int kVarScriptableInstance = 10; // NPPVpluginScriptableInstance
const int kVarScriptableIID = 11; // NPPVpluginScriptableIID
NPError
xpconnect_getvalue(NPP instance, NPPVariable variable, void *value)
{
if (instance == NULL)
{
return NPERR_INVALID_INSTANCE_ERROR;
}
if (variable == kVarScriptableInstance)
{
PluginInstanceData *pData = (PluginInstanceData *) instance->pdata;
if (!pData->pScriptingPeer)
{
nsScriptablePeer *peer = new nsScriptablePeer();
peer->AddRef();
pData->pScriptingPeer = (nsIMozAxPlugin *) peer;
}
if (pData->pScriptingPeer)
{
pData->pScriptingPeer->AddRef();
*((nsISupports **) value)= pData->pScriptingPeer;
return NPERR_NO_ERROR;
}
}
else if (variable == kVarScriptableIID)
{
static nsIID kIMozAxPluginIID = NS_IMOZAXPLUGIN_IID;
nsIID *piid = (nsIID *) NPN_MemAlloc(sizeof(nsIID));
*piid = kIMozAxPluginIID;
*((nsIID **) value) = piid;
return NPERR_NO_ERROR;
}
return NPERR_GENERIC_ERROR;
}
///////////////////////////////////////////////////////////////////////////////
// nsScriptablePeer
nsScriptablePeer::nsScriptablePeer()
{
mRef = 0;
}
nsScriptablePeer::~nsScriptablePeer()
{
}
///////////////////////////////////////////////////////////////////////////////
// nsISupports
// NOTE: We're not using the helpful NS_IMPL_ISUPPORTS macro because they drag
// in dependencies to xpcom that a plugin like ourselves is better off
// without.
/* void QueryInterface (in nsIIDRef uuid, [iid_is (uuid), retval] out nsQIResult result); */
NS_IMETHODIMP nsScriptablePeer::QueryInterface(const nsIID & aIID, void * *aInstancePtr)
{
if (aIID.Equals(NS_GET_IID(nsISupports)))
{
*aInstancePtr = NS_STATIC_CAST(void *, this);
AddRef();
return NS_OK;
}
else if (aIID.Equals(NS_GET_IID(nsIMozAxPlugin)))
{
*aInstancePtr = NS_STATIC_CAST(void *, this);
AddRef();
return NS_OK;
}
else if (aIID.Equals(kIClassInfoIID))
{
*aInstancePtr = static_cast<nsIClassInfo*>(this);
AddRef();
return NS_OK;
}
return NS_NOINTERFACE;
}
/* [noscript, notxpcom] nsrefcnt AddRef (); */
NS_IMETHODIMP_(nsrefcnt) nsScriptablePeer::AddRef()
{
mRef++;
return NS_OK;
}
/* [noscript, notxpcom] nsrefcnt Release (); */
NS_IMETHODIMP_(nsrefcnt) nsScriptablePeer::Release()
{
mRef--;
if (mRef <= 0)
{
delete this;
}
return NS_OK;
}
///////////////////////////////////////////////////////////////////////////////
// nsIMozAxPlugin
// the following method will be callable from JavaScript
NS_IMETHODIMP
nsScriptablePeer::Invoke(const char *str)
{
/* HRESULT hr;
DISPID dispid;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
// call the requested function
const char* funcName = str; //_T("Update");
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(funcName);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&dispparamsNoArgs, NULL, NULL, NULL);
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release(); */
return NS_OK;
}
NS_IMETHODIMP
nsScriptablePeer::GetProperty(const char *propertyName, char **_retval)
{
/* HRESULT hr;
DISPID dispid;
//VARIANT VarResult;
_variant_t VarResult;
//char* propertyValue;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
const char* property = propertyName;
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) { return NULL; }
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(property);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET,
&dispparamsNoArgs, &VarResult, NULL, NULL);
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release();
char* tempStr;
switch(VarResult.vt & VT_TYPEMASK) {
case VT_BSTR:
tempStr = OLE2A(VarResult.bstrVal);
if(!_retval) return NS_ERROR_NULL_POINTER;
*_retval = (char*) nsMemory::Alloc(strlen(tempStr) + 1);
if (! *_retval) return NS_ERROR_NULL_POINTER;
if (VarResult.bstrVal == NULL) {
*_retval = NULL;
} else {
strcpy(*_retval, tempStr);
}
break;
// case VT_I2:
default:
VarResult.ChangeType(VT_BSTR);
tempStr = OLE2A(VarResult.bstrVal);
if(!_retval) return NS_ERROR_NULL_POINTER;
*_retval = (char*) nsMemory::Alloc(strlen(tempStr) + 1);
if (! *_retval) return NS_ERROR_NULL_POINTER;
if (VarResult.bstrVal == NULL) {
*_retval = NULL;
} else {
strcpy(*_retval, tempStr);
}
break;
} */
// caller will be responsible for any memory allocated.
return NS_OK;
}
NS_IMETHODIMP nsScriptablePeer::GetNProperty(const char *propertyName, PRInt16 *_retval)
{
/* HRESULT hr;
DISPID dispid;
VARIANT VarResult;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
const char* property = propertyName;
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) { return NULL; }
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(property);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET,
&dispparamsNoArgs, &VarResult, NULL, NULL);
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release();
if(!_retval) return NS_ERROR_NULL_POINTER;
// make sure we are dealing with an int
if ((VarResult.vt & VT_TYPEMASK) != VT_I2) {
*_retval = NULL;
return NPERR_GENERIC_ERROR;
}
*_retval = VarResult.iVal; */
// caller will be responsible for any memory allocated.
return NS_OK;
}
/* void setProperty (in string propertyName, in string propertyValue); */
NS_IMETHODIMP nsScriptablePeer::SetProperty(const char *propertyName, const char *propertyValue)
{
HRESULT hr;
DISPID dispid;
VARIANT VarResult;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
const char* property = propertyName;
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) { return NULL; }
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(property);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
VARIANT *pvars = new VARIANT[1];
VariantInit(&pvars[0]);
pvars->vt = VT_BSTR;
pvars->bstrVal = A2OLE(propertyValue);
DISPID dispIdPut = DISPID_PROPERTYPUT;
DISPPARAMS functionArgs;
functionArgs.rgdispidNamedArgs = &dispIdPut;
functionArgs.rgvarg = pvars;
functionArgs.cArgs = 1;
functionArgs.cNamedArgs = 1;
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYPUT,
&functionArgs, &VarResult, NULL, NULL);
delete []pvars;
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release();
return NS_OK;
}
/* void setNProperty (in string propertyName, in string propertyValue); */
NS_IMETHODIMP nsScriptablePeer::SetNProperty(const char *propertyName, PRInt16 propertyValue)
{
HRESULT hr;
DISPID dispid;
VARIANT VarResult;
IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
const char* property = propertyName;
PluginInstanceData *pData = mPlugin;
if (pData == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
IUnknown FAR* punk;
hr = pData->pControlSite->GetControlUnknown(&punk);
if (FAILED(hr)) { return NULL; }
punk->AddRef();
hr = punk->QueryInterface(IID_IDispatch,(void FAR* FAR*)&pdisp);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(property);
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
punk->Release();
return NPERR_GENERIC_ERROR;
}
VARIANT *pvars = new VARIANT[1];
VariantInit(&pvars[0]);
pvars->vt = VT_I2;
pvars->iVal = propertyValue;
DISPID dispIdPut = DISPID_PROPERTYPUT;
DISPPARAMS functionArgs;
functionArgs.rgdispidNamedArgs = &dispIdPut;
functionArgs.rgvarg = pvars;
functionArgs.cArgs = 1;
functionArgs.cNamedArgs = 1;
hr = pdisp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYPUT,
&functionArgs, &VarResult, NULL, NULL);
delete []pvars;
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
punk->Release();
return NS_OK;
}

View File

@ -65,10 +65,10 @@ MOZ_ACTIVEX_PLUGIN_SUPPORT = 1
# the JRI stubs.
!ifdef MOZ_ACTIVEX_PLUGIN_LIVECONNECT
MOZ_PLUGINSDK = C:\m\PluginSDK3
JAVADIR = C:\j2sdk1.3.1
MOZ_PLUGINSDK = d:\m\PluginSDK
JAVADIR = d:\jdk-1.0.2
JAVAH = $(MOZ_PLUGINSDK)\bin\win32\javah
JAVAC = $(JAVADIR)\bin\oldjavac
JAVAC = $(JAVADIR)\bin\javac
JAVACLASSES = $(MOZ_PLUGINSDK)\classes\java_30.zip
CLASSPATH = $(JAVACLASSES);.
!endif
@ -79,8 +79,7 @@ CLASSPATH = $(JAVACLASSES);.
# MOZ_ACTIVEX_PLUGIN_XPCONNECT = 1
# Uncomment these if you wish the plugin to support LiveConnect (Netscape4.x)
# or XPConnect (Netscape 6.x/Mozilla) for scripting purposes.
# XPConnect support in (Netscape 6.1+/Mozilla)
############
@ -107,7 +106,11 @@ OBJS = \
.\$(OBJDIR)\LegacyPlugin.obj \
.\$(OBJDIR)\MozActiveX.obj \
.\$(OBJDIR)\npwin.obj \
!ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
.\$(OBJDIR)\XPConnect.obj \
!endif
!ifdef MOZ_ACTIVEX_PLUGIN_LIVECONNECT
.\$(OBJDIR)\LiveConnect.obj \
.\$(OBJDIR)\javastubs.obj \
!endif
$(NULL)
@ -252,17 +255,6 @@ $(DEFFILE) : mkctldef.bat
$(JAVAH) -classpath $(CLASSPATH) -jri -d _gen netscape.plugin.Plugin
$(JAVAH) -classpath $(CLASSPATH) -jri -stubs -d _stubs netscape.plugin.Plugin
!endif
ActiveScriptSite.cpp: $(MOZCTLSRC)/ActiveScriptSite.cpp
-cp $(MOZCTLSRC)/ActiveScriptSite.cpp .
MozActiveX.res: MozActiveX.rc resource.h
MozActiveX.cpp: StdAfx.h
!ifdef MOZ_ACTIVEX_PLUGIN_LIVECONNECT
.\$(OBJDIR)\javastubs.obj : javastubs.c
javastubs.c : \
@ -280,13 +272,8 @@ javastubs.c : \
.\_stubs\java_lang_Float.c \
.\_stubs\java_lang_Character.c \
$(NULL)
!endif
LegacyPlugin.cpp: StdAfx.h \
!ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
.\_xpidlgen\nsIMozAxPlugin.h \
!endif
!ifdef MOZ_ACTIVEX_PLUGIN_LIVECONNECT
LiveConnect.cpp: StdAfx.h \
.\MozAxPlugin.class \
.\_gen\netscape_plugin_Plugin.h \
.\_gen\java_lang_Object.h \
@ -300,6 +287,27 @@ LegacyPlugin.cpp: StdAfx.h \
.\_gen\java_lang_Double.h \
.\_gen\java_lang_Float.h \
.\_gen\java_lang_Character.h \
$(NULL)
!endif
ActiveScriptSite.cpp: $(MOZCTLSRC)/ActiveScriptSite.cpp
-cp $(MOZCTLSRC)/ActiveScriptSite.cpp .
MozActiveX.res: MozActiveX.rc resource.h
MozActiveX.cpp: StdAfx.h
!ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
XPConnect.cpp: StdAfx.h \
.\_xpidlgen\nsIMozAxPlugin.h \
$(NULL)
!endif
LegacyPlugin.cpp: StdAfx.h \
.\LegacyPlugin.h \
!ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
.\_xpidlgen\nsIMozAxPlugin.h \
!endif
$(NULL)

View File

@ -35,6 +35,7 @@ installed to see anything</p>
<input type="button" value="Next Day >>" onclick="nextDay()"></input><br>
Change the current day: <input name="day_to_set" type="text" size="3" value="1"></input>
<input type="button" value="Set" onclick="setDay()"></input><br>
<input type="button" value="Refresh" onclick="getDay()"></input><br>
<input type="button" value="Sanity test" onclick="document.cal.x(1)"></input><br>
These tests should cause exceptions by calling with duff property names etc.</br>
<input type="button" value="Invoke (no such method)" onclick="document.cal.invoke('blah')"></input>
@ -67,6 +68,10 @@ installed to see anything</p>
{
document.cal.setProperty("day", document.forms[0].elements["day_to_set"].value);
}
function getDay()
{
document.forms[0].elements["day_to_set"].value = document.cal.getProperty("day");
}
</script>
</p>