mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 20:35:50 +00:00
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:
parent
0f2a5892d7
commit
23ac64ad8e
@ -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
|
||||
|
75
embedding/browser/activex/src/plugin/LegacyPlugin.h
Normal file
75
embedding/browser/activex/src/plugin/LegacyPlugin.h
Normal 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
|
534
embedding/browser/activex/src/plugin/LiveConnect.cpp
Normal file
534
embedding/browser/activex/src/plugin/LiveConnect.cpp
Normal 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;
|
||||
}
|
488
embedding/browser/activex/src/plugin/XPConnect.cpp
Normal file
488
embedding/browser/activex/src/plugin/XPConnect.cpp
Normal 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;
|
||||
}
|
@ -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)
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user