NOT PART OF BUILD. More XPConnect scripting improvements

This commit is contained in:
locka%iol.ie 2002-05-23 13:28:38 +00:00
parent 5db62cc0e0
commit b1b2f0f865
4 changed files with 291 additions and 139 deletions

View File

@ -48,8 +48,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1 FILEVERSION 1,0,0,2
PRODUCTVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,2
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L

View File

@ -41,6 +41,7 @@
#include "nsIMozAxPlugin.h" #include "nsIMozAxPlugin.h"
#include "nsIClassInfo.h" #include "nsIClassInfo.h"
#include "nsIVariant.h"
#include "nsMemory.h" #include "nsMemory.h"
#include "LegacyPlugin.h" #include "LegacyPlugin.h"
@ -97,7 +98,11 @@ public:
NS_DECL_ISUPPORTS NS_DECL_ISUPPORTS
NS_DECL_NSIMOZAXPLUGIN NS_DECL_NSIMOZAXPLUGIN
private:
HRESULT GetIDispatch(IDispatch **pdisp); HRESULT GetIDispatch(IDispatch **pdisp);
HRESULT ConvertVariants(nsIVariant *aIn, VARIANT *aOut);
HRESULT ConvertVariants(VARIANT *aIn, nsIVariant **aOut);
NS_IMETHOD InternalInvoke(const char *aMethod, unsigned int aNumArgs, nsIVariant *aArgs[]);
}; };
// Happy happy fun fun - redefine some NPPVariable values that we might // Happy happy fun fun - redefine some NPPVariable values that we might
@ -183,6 +188,198 @@ nsScriptablePeer::GetIDispatch(IDispatch **pdisp)
return S_OK; return S_OK;
} }
HRESULT
nsScriptablePeer::ConvertVariants(nsIVariant *aIn, VARIANT *aOut)
{
if (aIn == NULL || aOut == NULL)
{
return NS_ERROR_INVALID_ARG;
}
PRUint16 type;
nsresult rv = aIn->GetDataType(&type);
switch (type)
{
case nsIDataType::VTYPE_INT8:
{
PRUint8 value = 0;
rv = aIn->GetAsInt8(&value);
aOut->vt = VT_I1;
aOut->cVal = value;
}
break;
case nsIDataType::VTYPE_INT16:
{
PRInt16 value = 0;
rv = aIn->GetAsInt16(&value);
aOut->vt = VT_I2;
aOut->iVal = value;
}
break;
case nsIDataType::VTYPE_INT32:
{
PRInt32 value = 0;
rv = aIn->GetAsInt32(&value);
aOut->vt = VT_I4;
aOut->lVal = value;
}
break;
case nsIDataType::VTYPE_CHAR:
case nsIDataType::VTYPE_UINT8:
{
PRUint8 value = 0;
rv = aIn->GetAsInt8(&value);
aOut->vt = VT_UI1;
aOut->bVal = value;
}
break;
case nsIDataType::VTYPE_WCHAR:
case nsIDataType::VTYPE_UINT16:
{
PRUint16 value = 0;
rv = aIn->GetAsUint16(&value);
aOut->vt = VT_I2;
aOut->uiVal = value;
}
break;
case nsIDataType::VTYPE_UINT32:
{
PRUint32 value = 0;
rv = aIn->GetAsUint32(&value);
aOut->vt = VT_I4;
aOut->ulVal = value;
}
break;
case nsIDataType::VTYPE_FLOAT:
{
float value = 0;
rv = aIn->GetAsFloat(&value);
aOut->vt = VT_R4;
aOut->fltVal = value;
}
break;
case nsIDataType::VTYPE_DOUBLE:
{
double value = 0;
rv = aIn->GetAsDouble(&value);
aOut->vt = VT_R4;
aOut->dblVal = value;
}
break;
case nsIDataType::VTYPE_BOOL:
{
PRBool value = 0;
rv = aIn->GetAsBool(&value);
aOut->vt = VT_BOOL;
aOut->dblVal = value ? VARIANT_TRUE : VARIANT_FALSE;
}
break;
case nsIDataType::VTYPE_EMPTY:
VariantClear(aOut);
break;
// TODO
case nsIDataType::VTYPE_CSTRING:
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
// Unsupported types
default:
case nsIDataType::VTYPE_INT64:
case nsIDataType::VTYPE_UINT64:
case nsIDataType::VTYPE_VOID:
case nsIDataType::VTYPE_ID:
case nsIDataType::VTYPE_CHAR_STR:
case nsIDataType::VTYPE_WCHAR_STR:
case nsIDataType::VTYPE_INTERFACE:
case nsIDataType::VTYPE_INTERFACE_IS:
case nsIDataType::VTYPE_ARRAY:
case nsIDataType::VTYPE_STRING_SIZE_IS:
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
case nsIDataType::VTYPE_UTF8STRING:
case nsIDataType::VTYPE_EMPTY_ARRAY:
return E_INVALIDARG;
}
return S_OK;
}
HRESULT
nsScriptablePeer::ConvertVariants(VARIANT *aIn, nsIVariant **aOut)
{
if (aIn == NULL || aOut == NULL)
{
return NS_ERROR_INVALID_ARG;
}
return E_NOTIMPL;
}
NS_IMETHODIMP
nsScriptablePeer::InternalInvoke(const char *aMethod, unsigned int aNumArgs, nsIVariant *aArgs[])
{
HRESULT hr;
DISPID dispid;
IDispatchPtr disp;
if (FAILED(GetIDispatch(&disp)))
{
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(aMethod);
hr = disp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr))
{
return NPERR_GENERIC_ERROR;
}
_variant_t *pArgs = NULL;
if (aNumArgs > 0)
{
pArgs = new _variant_t[aNumArgs];
if (pArgs == NULL)
{
return NS_ERROR_OUT_OF_MEMORY;
}
for (unsigned int i = 0; i < aNumArgs; i++)
{
hr = ConvertVariants(aArgs[i], &pArgs[i]);
if (FAILED(hr))
{
delete []pArgs;
return NS_ERROR_INVALID_ARG;
}
}
}
DISPPARAMS dispparams = {NULL, NULL, 0, 0};
_variant_t vResult;
dispparams.cArgs = aNumArgs;
dispparams.rgvarg = pArgs;
hr = disp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&dispparams, &vResult, NULL, NULL);
if (pArgs)
{
delete []pArgs;
}
if (FAILED(hr))
{
return NPERR_GENERIC_ERROR;
}
return NS_OK;
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// nsISupports // nsISupports
@ -239,42 +436,52 @@ NS_IMETHODIMP_(nsrefcnt) nsScriptablePeer::Release()
// the following method will be callable from JavaScript // the following method will be callable from JavaScript
NS_IMETHODIMP NS_IMETHODIMP
nsScriptablePeer::Invoke(const char *str) nsScriptablePeer::Invoke(const char *aMethod)
{ {
HRESULT hr; return InternalInvoke(aMethod, 0, NULL);
DISPID dispid; }
IDispatchPtr disp; NS_IMETHODIMP
if (FAILED(GetIDispatch(&disp))) nsScriptablePeer::Invoke1(const char *aMethod, nsIVariant *a)
{ {
return NPERR_GENERIC_ERROR; nsIVariant *args[1];
} args[0] = a;
USES_CONVERSION; return InternalInvoke(aMethod, sizeof(args) / sizeof(args[0]), args);
OLECHAR FAR* szMember = A2OLE(str); }
hr = disp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr))
{
return NPERR_GENERIC_ERROR;
}
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; NS_IMETHODIMP
hr = disp->Invoke( nsScriptablePeer::Invoke2(const char *aMethod, nsIVariant *a, nsIVariant *b)
dispid, {
IID_NULL, nsIVariant *args[2];
LOCALE_USER_DEFAULT, args[0] = a;
DISPATCH_METHOD, args[1] = b;
&dispparamsNoArgs, NULL, NULL, NULL); return InternalInvoke(aMethod, sizeof(args) / sizeof(args[0]), args);
if (FAILED(hr)) }
{
return NPERR_GENERIC_ERROR;
}
return NS_OK; NS_IMETHODIMP
nsScriptablePeer::Invoke3(const char *aMethod, nsIVariant *a, nsIVariant *b, nsIVariant *c)
{
nsIVariant *args[3];
args[0] = a;
args[1] = b;
args[2] = c;
return InternalInvoke(aMethod, sizeof(args) / sizeof(args[0]), args);
}
NS_IMETHODIMP
nsScriptablePeer::Invoke4(const char *aMethod, nsIVariant *a, nsIVariant *b, nsIVariant *c, nsIVariant *d)
{
nsIVariant *args[4];
args[0] = a;
args[1] = b;
args[2] = c;
args[3] = d;
return InternalInvoke(aMethod, sizeof(args) / sizeof(args[0]), args);
} }
NS_IMETHODIMP NS_IMETHODIMP
nsScriptablePeer::GetProperty(const char *propertyName, char **_retval) nsScriptablePeer::GetProperty(const char *propertyName, nsIVariant **_retval)
{ {
/* HRESULT hr; /* HRESULT hr;
DISPID dispid; DISPID dispid;
@ -347,58 +554,8 @@ nsScriptablePeer::GetProperty(const char *propertyName, char **_retval)
return NS_OK; 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); */ /* void setProperty (in string propertyName, in string propertyValue); */
NS_IMETHODIMP nsScriptablePeer::SetProperty(const char *propertyName, const char *propertyValue) NS_IMETHODIMP nsScriptablePeer::SetProperty(const char *propertyName, nsIVariant *propertyValue)
{ {
HRESULT hr; HRESULT hr;
DISPID dispid; DISPID dispid;
@ -415,16 +572,15 @@ NS_IMETHODIMP nsScriptablePeer::SetProperty(const char *propertyName, const char
return NPERR_GENERIC_ERROR; return NPERR_GENERIC_ERROR;
} }
_variant_t *pvars = new _variant_t[1]; _variant_t v;
pvars->vt = VT_BSTR; ConvertVariants(propertyValue, &v);
pvars->bstrVal = ::SysAllocString(A2OLE(propertyValue));
DISPID dispIdPut = DISPID_PROPERTYPUT; DISPID dispIdPut = DISPID_PROPERTYPUT;
DISPPARAMS functionArgs; DISPPARAMS functionArgs;
_variant_t vResult; _variant_t vResult;
functionArgs.rgdispidNamedArgs = &dispIdPut; functionArgs.rgdispidNamedArgs = &dispIdPut;
functionArgs.rgvarg = pvars; functionArgs.rgvarg = &v;
functionArgs.cArgs = 1; functionArgs.cArgs = 1;
functionArgs.cNamedArgs = 1; functionArgs.cNamedArgs = 1;
@ -435,52 +591,6 @@ NS_IMETHODIMP nsScriptablePeer::SetProperty(const char *propertyName, const char
DISPATCH_PROPERTYPUT, DISPATCH_PROPERTYPUT,
&functionArgs, &vResult, NULL, NULL); &functionArgs, &vResult, NULL, NULL);
delete []pvars;
if (FAILED(hr))
{
return NPERR_GENERIC_ERROR;
}
return NS_OK;
}
/* void setNProperty (in string propertyName, in string propertyValue); */
NS_IMETHODIMP nsScriptablePeer::SetNProperty(const char *propertyName, PRInt16 propertyValue)
{
HRESULT hr;
DISPID dispid;
IDispatchPtr disp;
if (FAILED(GetIDispatch(&disp)))
{
return NPERR_GENERIC_ERROR;
}
USES_CONVERSION;
OLECHAR FAR* szMember = A2OLE(propertyName);
hr = disp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
return NPERR_GENERIC_ERROR;
}
_variant_t *pvars = new _variant_t[1];
pvars->vt = VT_I2;
pvars->iVal = propertyValue;
DISPID dispIdPut = DISPID_PROPERTYPUT;
DISPPARAMS functionArgs;
_variant_t vResult;
functionArgs.rgdispidNamedArgs = &dispIdPut;
functionArgs.rgvarg = pvars;
functionArgs.cArgs = 1;
functionArgs.cNamedArgs = 1;
hr = disp->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYPUT,
&functionArgs, &vResult, NULL, NULL);
delete []pvars;
if (FAILED(hr)) if (FAILED(hr))
{ {
return NPERR_GENERIC_ERROR; return NPERR_GENERIC_ERROR;

View File

@ -22,16 +22,18 @@
#include "nsISupports.idl" #include "nsISupports.idl"
interface nsIVariant;
[scriptable, uuid(b30c2717-2bbf-4475-9ddf-9e26f893f32a)] [scriptable, uuid(b30c2717-2bbf-4475-9ddf-9e26f893f32a)]
interface nsIMozAxPlugin : nsISupports interface nsIMozAxPlugin : nsISupports
{ {
void invoke(in string str); void invoke(in string str);
void invoke1(in string str, in nsIVariant a);
void invoke2(in string str, in nsIVariant a, in nsIVariant b);
void invoke3(in string str, in nsIVariant a, in nsIVariant b, in nsIVariant c);
void invoke4(in string str, in nsIVariant a, in nsIVariant b, in nsIVariant c, in nsIVariant d);
/* Set and return string values */ /* Set and get values */
string getProperty(in string propertyName); nsIVariant getProperty(in string propertyName);
void setProperty(in string propertyName, in string propertyValue); void setProperty(in string propertyName, in nsIVariant propertyValue);
/* Set or return an integer value */
short getNProperty(in string propertyName);
void setNProperty(in string propertyName, in short propertyValue);
}; };

View File

@ -0,0 +1,40 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<title>Mozilla Plugin Test Page</title>
<link rel="stylesheet" type="text/css" href="mozilla.css">
</head>
<body>
<p>This page is designed for Mozilla with the Mozilla
ActiveX plugin installed! You also need to have the MS Rich Text control
installed to see anything</p>
<p>
<!-- The object tag is used to add controls to the page. The width and height
parameters specify the control dimensions. The control is initialised
with parameters
of the form param_SomeControlProperty="value".
-->
<form action="#" method="post">
</form>
<embed
name="rtf"
TYPE="application/x-oleobject"
ALIGN="baseline" BORDER="0"
WIDTH="300" HEIGHT="300"
CLSID="{3B7C8860-D78F-101B-B9B5-04021C009402}"
PARAM_BACKCOLOR="16776960"
>
</p>
<p>
<script>
</script>
</p>
</body>
</html>