Fix for bug 125465. r=jag, sr=jband, a=asa. Add AString, ACString, and AUTF8String support to XPCOM's variant data type. Also, add forward declarations of AString and ACString to nsrootidl.idl.

This commit is contained in:
nisheeth@netscape.com
2002-03-05 02:22:02 +00:00
parent e7e7402f08
commit b2dc7013bb
7 changed files with 739 additions and 311 deletions

View File

@@ -352,6 +352,8 @@ XPCVariant::VariantDataToJS(XPCCallContext& ccx,
nsXPTCVariant xpctvar;
nsID iid;
nsAutoString astring;
nsCAutoString cString;
nsUTF8String utf8String;
PRUint32 size;
xpctvar.flags = 0;
JSBool success;
@@ -399,11 +401,29 @@ XPCVariant::VariantDataToJS(XPCCallContext& ccx,
xpctvar.val.p = &iid;
break;
case nsIDataType::VTYPE_ASTRING:
if(NS_FAILED(variant->GetAsAString(astring)))
return JS_FALSE;
xpctvar.type = (uint8)(TD_ASTRING | XPT_TDP_POINTER);
xpctvar.val.p = &astring;
break;
case nsIDataType::VTYPE_DOMSTRING:
if(NS_FAILED(variant->GetAsAString(astring)))
return JS_FALSE;
xpctvar.type = (uint8)(TD_DOMSTRING | XPT_TDP_POINTER);
xpctvar.val.p = &astring;
break;
case nsIDataType::VTYPE_CSTRING:
if(NS_FAILED(variant->GetAsACString(cString)))
return JS_FALSE;
xpctvar.type = (uint8)(TD_CSTRING | XPT_TDP_POINTER);
xpctvar.val.p = &cString;
break;
case nsIDataType::VTYPE_UTF8STRING:
if(NS_FAILED(variant->GetAsAUTF8String(utf8String)))
return JS_FALSE;
xpctvar.type = (uint8)(TD_UTF8STRING | XPT_TDP_POINTER);
xpctvar.val.p = &utf8String;
break;
case nsIDataType::VTYPE_CHAR_STR:
if(NS_FAILED(variant->GetAsString((char**)&xpctvar.val.p)))
return JS_FALSE;
@@ -501,6 +521,9 @@ XPCVariant::VariantDataToJS(XPCCallContext& ccx,
// The rest are illegal.
case nsIDataType::VTYPE_VOID:
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
case nsIDataType::VTYPE_CSTRING:
case nsIDataType::VTYPE_UTF8STRING:
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
case nsIDataType::VTYPE_STRING_SIZE_IS:
case nsIDataType::VTYPE_ARRAY:
@@ -659,6 +682,26 @@ NS_IMETHODIMP XPCVariant::GetAsAString(nsAWritableString & _retval)
return nsVariant::ConvertToAString(mData, _retval);
}
/* DOMString getAsDOMString (); */
NS_IMETHODIMP XPCVariant::GetAsDOMString(nsAWritableString & _retval)
{
// A DOMString maps to an AString internally, so we can re-use
// ConvertToAString here.
return nsVariant::ConvertToAString(mData, _retval);
}
/* ACString getAsACString (); */
NS_IMETHODIMP XPCVariant::GetAsACString(nsACString & _retval)
{
return nsVariant::ConvertToACString(mData, _retval);
}
/* AUTF8String getAsAUTF8String (); */
NS_IMETHODIMP XPCVariant::GetAsAUTF8String(nsAUTF8String & _retval)
{
return nsVariant::ConvertToAUTF8String(mData, _retval);
}
/* string getAsString (); */
NS_IMETHODIMP XPCVariant::GetAsString(char **_retval)
{

View File

@@ -152,6 +152,7 @@ static nsresult ConvertAndCopyVariant(nsIVariant *inVar, PRUint16 type, nsIVaria
MEMBER_COPY(ID)
break;
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
{
nsAutoString str;
rv = inVar->GetAsAString(str);
@@ -160,6 +161,24 @@ static nsresult ConvertAndCopyVariant(nsIVariant *inVar, PRUint16 type, nsIVaria
NS_ENSURE_SUCCESS(rv,rv);
break;
}
case nsIDataType::VTYPE_UTF8STRING:
{
nsUTF8String str;
rv = inVar->GetAsAUTF8String(str);
if(NS_FAILED(rv)) return rv;
rv = outVar->SetAsAUTF8String(str);
NS_ENSURE_SUCCESS(rv,rv);
break;
}
case nsIDataType::VTYPE_CSTRING:
{
nsCAutoString str;
rv = inVar->GetAsACString(str);
if(NS_FAILED(rv)) return rv;
rv = outVar->SetAsACString(str);
NS_ENSURE_SUCCESS(rv,rv);
break;
}
case nsIDataType::VTYPE_CHAR_STR:
{
char* str;

View File

@@ -20,7 +20,7 @@ const DataTypeArray = [
Components.interfaces.nsIDataType.VTYPE_WCHAR ,
Components.interfaces.nsIDataType.VTYPE_VOID ,
Components.interfaces.nsIDataType.VTYPE_ID ,
Components.interfaces.nsIDataType.VTYPE_ASTRING ,
Components.interfaces.nsIDataType.VTYPE_DOMSTRING ,
Components.interfaces.nsIDataType.VTYPE_CHAR_STR ,
Components.interfaces.nsIDataType.VTYPE_WCHAR_STR ,
Components.interfaces.nsIDataType.VTYPE_INTERFACE ,
@@ -28,6 +28,9 @@ const DataTypeArray = [
Components.interfaces.nsIDataType.VTYPE_ARRAY ,
Components.interfaces.nsIDataType.VTYPE_STRING_SIZE_IS ,
Components.interfaces.nsIDataType.VTYPE_WSTRING_SIZE_IS ,
Components.interfaces.nsIDataType.VTYPE_UTF8STRING ,
Components.interfaces.nsIDataType.VTYPE_CSTRING ,
Components.interfaces.nsIDataType.VTYPE_ASTRING ,
Components.interfaces.nsIDataType.VTYPE_EMPTY
];
@@ -47,7 +50,7 @@ const ShortNames = [
{name: "WC", number: Components.interfaces.nsIDataType.VTYPE_WCHAR },
{name: "VD", number: Components.interfaces.nsIDataType.VTYPE_VOID },
{name: "ID", number: Components.interfaces.nsIDataType.VTYPE_ID },
{name: "AS", number: Components.interfaces.nsIDataType.VTYPE_ASTRING },
{name: "DS", number: Components.interfaces.nsIDataType.VTYPE_DOMSTRING },
{name: "ST", number: Components.interfaces.nsIDataType.VTYPE_CHAR_STR },
{name: "WS", number: Components.interfaces.nsIDataType.VTYPE_WCHAR_STR },
{name: "NS", number: Components.interfaces.nsIDataType.VTYPE_INTERFACE },
@@ -55,6 +58,9 @@ const ShortNames = [
{name: "AR", number: Components.interfaces.nsIDataType.VTYPE_ARRAY },
{name: "Ss", number: Components.interfaces.nsIDataType.VTYPE_STRING_SIZE_IS },
{name: "Ws", number: Components.interfaces.nsIDataType.VTYPE_WSTRING_SIZE_IS},
{name: "US", number: Components.interfaces.nsIDataType.VTYPE_UTF8STRING },
{name: "CS", number: Components.interfaces.nsIDataType.VTYPE_CSTRING },
{name: "AS", number: Components.interfaces.nsIDataType.VTYPE_ASTRING },
{name: "EM", number: Components.interfaces.nsIDataType.VTYPE_EMPTY }
];
@@ -191,74 +197,80 @@ function TestDoubleConvert(value, comment, eq_fun, table) {
//
const SingleConvertResultsTableFor_String_Foo = [
/*I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,AS,ST,WS,NS,IF,AR,Ss,Ws,EM */
_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e
/*I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,DS,ST,WS,NS,IF,AR,Ss,Ws,US,CS,AS,EM */
_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e
];
const SingleConvertResultsTableFor_String_5 = [
/*I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,AS,ST,WS,NS,IF,AR,Ss,Ws,EM */
eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e
/*I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,DS,ST,WS,NS,IF,AR,Ss,Ws,US,CS,AS,EM */
eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e
];
const SingleConvertResultsTableFor_Number_20 = [
/*I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,AS,ST,WS,NS,IF,AR,Ss,Ws,EM */
eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e
/*I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,DS,ST,WS,NS,IF,AR,Ss,Ws,US,CS,AS,EM */
eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e
];
const DoubleConvertResultsTableFor_String_Foo = [
/* I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,AS,ST,WS,NS,IF,AR,Ss,Ws,EM */
/*I1*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*I1*/
/*I2*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*I2*/
/*I4*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*I4*/
/*I8*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*I8*/
/*U1*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*U1*/
/*U2*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*U2*/
/*U4*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*U4*/
/*U8*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*U8*/
/*FL*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*FL*/
/*DB*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*DB*/
/*BO*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*BO*/
/*CH*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*CH*/
/*WC*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*WC*/
/*VD*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*VD*/
/*ID*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*ID*/
/*AS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*AS*/
/*ST*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*ST*/
/*WS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*WS*/
/*NS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*NS*/
/*IF*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*IF*/
/*AR*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*AR*/
/*Ss*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*Ss*/
/*Ws*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*Ws*/
/*EM*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e] /*EM*/
/* I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,DS,ST,WS,NS,IF,AR,Ss,Ws,US,CS,AS,EM */
/*I1*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*I1*/
/*I2*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*I2*/
/*I4*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*I4*/
/*I8*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*I8*/
/*U1*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*U1*/
/*U2*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*U2*/
/*U4*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*U4*/
/*U8*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*U8*/
/*FL*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*FL*/
/*DB*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*DB*/
/*BO*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*BO*/
/*CH*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*CH*/
/*WC*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*WC*/
/*VD*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*VD*/
/*ID*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*ID*/
/*DS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*DS*/
/*ST*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*ST*/
/*WS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*WS*/
/*NS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*NS*/
/*IF*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*IF*/
/*AR*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*AR*/
/*Ss*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*Ss*/
/*Ws*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*Ws*/
/*US*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*US*/
/*CS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*CS*/
/*AS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*AS*/
/*EM*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e] /*EM*/
];
const DoubleConvertResultsTableFor_String_Five = [
/* I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,AS,ST,WS,NS,IF,AR,Ss,Ws,EM */
/*I1*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*I1*/
/*I2*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*I2*/
/*I4*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*I4*/
/*I8*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*I8*/
/*U1*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*U1*/
/*U2*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*U2*/
/*U4*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*U4*/
/*U8*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*U8*/
/*FL*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*FL*/
/*DB*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*DB*/
/*BO*/[_T,_T,_T,_T,_T,_T,_T,_T,_T,_T,_T,NE,NE,_e,_e,_T,_T,_T,_e,_e,_e,_T,_T,_e],/*BO*/
/*CH*/[NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,_e,_e,NE,NE,NE,_e,_e,_e,NE,NE,_e],/*CH*/
/*WC*/[NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,_e,_e,NE,NE,NE,_e,_e,_e,NE,NE,_e],/*WC*/
/*VD*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*VD*/
/*ID*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*ID*/
/*AS*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*AS*/
/*ST*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*ST*/
/*WS*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*WS*/
/*NS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*NS*/
/*IF*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*IF*/
/*AR*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*AR*/
/*Ss*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*Ss*/
/*Ws*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,_e],/*Ws*/
/*EM*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e] /*EM*/
/* I1,I2,I4,I8,U1,U2,U4,U8,FL,DB,BO,CH,WC,VD,ID,DS,ST,WS,NS,IF,AR,Ss,Ws,US,CS,AS,EM */
/*I1*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*I1*/
/*I2*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*I2*/
/*I4*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*I4*/
/*I8*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*I8*/
/*U1*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*U1*/
/*U2*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*U2*/
/*U4*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*U4*/
/*U8*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*U8*/
/*FL*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*FL*/
/*DB*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,_T,eq,eq,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*DB*/
/*BO*/[_T,_T,_T,_T,_T,_T,_T,_T,_T,_T,_T,NE,NE,_e,_e,_T,_T,_T,_e,_e,_e,_T,_T,_T,_T,_T,_e],/*BO*/
/*CH*/[NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,_e,_e,NE,NE,NE,_e,_e,_e,NE,NE,NE,NE,NE,_e],/*CH*/
/*WC*/[NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,NE,_e,_e,NE,NE,NE,_e,_e,_e,NE,NE,NE,NE,NE,_e],/*WC*/
/*VD*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*VD*/
/*ID*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*ID*/
/*DS*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*DS*/
/*ST*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*ST*/
/*WS*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*WS*/
/*NS*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*NS*/
/*IF*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*IF*/
/*AR*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e],/*AR*/
/*Ss*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*Ss*/
/*Ws*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*Ws*/
/*US*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*US*/
/*CS*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*CS*/
/*AS*/[eq,eq,eq,eq,eq,eq,eq,eq,eq,eq,NE,NE,NE,_e,_e,eq,eq,eq,_e,_e,_e,eq,eq,eq,eq,eq,_e],/*AS*/
/*EM*/[_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e,_e] /*EM*/
];
var values = [

View File

@@ -46,6 +46,12 @@
#include "nscore.h"
#include "prtime.h"
/*
* Forward declarations for new string types
*/
class nsAString;
class nsACString;
/*
* Start commenting out the C++ versions of the below in the output header
*/

View File

@@ -50,15 +50,17 @@ interface nsIDataType : nsISupports
const PRUint16 VTYPE_WCHAR = 12; // TD_WCHAR = 12,
const PRUint16 VTYPE_VOID = 13; // TD_VOID = 13,
const PRUint16 VTYPE_ID = 14; // TD_PNSIID = 14,
const PRUint16 VTYPE_ASTRING = 15; // TD_DOMSTRING = 15,
const PRUint16 VTYPE_DOMSTRING = 15; // TD_DOMSTRING = 15,
const PRUint16 VTYPE_CHAR_STR = 16; // TD_PSTRING = 16,
const PRUint16 VTYPE_WCHAR_STR = 17; // TD_PWSTRING = 17,
const PRUint16 VTYPE_INTERFACE = 18; // TD_INTERFACE_TYPE = 18,
const PRUint16 VTYPE_INTERFACE_IS = 19; // TD_INTERFACE_IS_TYPE = 19,
const PRUint16 VTYPE_ARRAY = 20; // TD_ARRAY = 20,
const PRUint16 VTYPE_STRING_SIZE_IS = 21; // TD_PSTRING_SIZE_IS = 21,
const PRUint16 VTYPE_WSTRING_SIZE_IS = 22; // TD_PWSTRING_SIZE_IS = 22
const PRUint16 VTYPE_WSTRING_SIZE_IS = 22; // TD_PWSTRING_SIZE_IS = 22,
const PRUint16 VTYPE_UTF8STRING = 23; // TD_UTF8STRING = 23,
const PRUint16 VTYPE_CSTRING = 24; // TD_CSTRING = 24,
const PRUint16 VTYPE_ASTRING = 25; // TD_ASTRING = 25,
const PRUint16 VTYPE_EMPTY = 255;
};
@@ -91,6 +93,9 @@ interface nsIVariant : nsISupports
[noscript] wchar getAsWChar();
[notxpcom] nsresult getAsID(out nsID retval);
[noscript] AString getAsAString();
[noscript] DOMString getAsDOMString();
[noscript] ACString getAsACString();
[noscript] AUTF8String getAsAUTF8String();
[noscript] string getAsString();
[noscript] wstring getAsWString();
[noscript] nsISupports getAsISupports();
@@ -138,6 +143,9 @@ interface nsIWritableVariant : nsIVariant
void setAsWChar(in wchar aValue);
void setAsID(in nsIDRef aValue);
void setAsAString(in AString aValue);
void setAsDOMString(in DOMString aValue);
void setAsACString(in ACString aValue);
void setAsAUTF8String(in AUTF8String aValue);
void setAsString(in string aValue);
void setAsWString(in wstring aValue);
void setAsISupports(in nsISupports aValue);

View File

@@ -52,6 +52,16 @@ static nsresult AString2Double(const nsAString& aString, double* retval)
return rv;
}
static nsresult AUTF8String2Double(const nsAUTF8String& aString, double* retval)
{
return String2Double(PromiseFlatUTF8String(aString).get(), retval);
}
static nsresult ACString2Double(const nsACString& aString, double* retval)
{
return String2Double(PromiseFlatCString(aString).get(), retval);
}
// Fills outVariant with double, PRUint32, or PRInt32.
// Returns NS_OK, an error code, or a non-NS_OK success code
static nsresult ToManageableNumber(const nsDiscriminatedUnion& inData,
@@ -112,12 +122,27 @@ static nsresult ToManageableNumber(const nsDiscriminatedUnion& inData,
return rv;
outData->mType = nsIDataType::VTYPE_DOUBLE;
return NS_OK;
case nsIDataType::VTYPE_DOMSTRING:
case nsIDataType::VTYPE_ASTRING:
rv = AString2Double(*inData.u.mAStringValue, &outData->u.mDoubleValue);
if(NS_FAILED(rv))
return rv;
outData->mType = nsIDataType::VTYPE_DOUBLE;
return NS_OK;
case nsIDataType::VTYPE_UTF8STRING:
rv = AUTF8String2Double(*inData.u.mUTF8StringValue,
&outData->u.mDoubleValue);
if(NS_FAILED(rv))
return rv;
outData->mType = nsIDataType::VTYPE_DOUBLE;
return NS_OK;
case nsIDataType::VTYPE_CSTRING:
rv = ACString2Double(*inData.u.mCStringValue,
&outData->u.mDoubleValue);
if(NS_FAILED(rv))
return rv;
outData->mType = nsIDataType::VTYPE_DOUBLE;
return NS_OK;
case nsIDataType::VTYPE_WCHAR_STR:
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
tempString.Assign(inData.u.wstr.mWStringValue);
@@ -196,6 +221,9 @@ static void FreeArray(nsDiscriminatedUnion* data)
// The rest are illegal.
case nsIDataType::VTYPE_VOID:
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
case nsIDataType::VTYPE_UTF8STRING:
case nsIDataType::VTYPE_CSTRING:
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
case nsIDataType::VTYPE_STRING_SIZE_IS:
case nsIDataType::VTYPE_ARRAY:
@@ -285,6 +313,9 @@ static nsresult CloneArray(PRUint16 inType, const nsIID* inIID,
// The rest are illegal.
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
case nsIDataType::VTYPE_UTF8STRING:
case nsIDataType::VTYPE_CSTRING:
case nsIDataType::VTYPE_STRING_SIZE_IS:
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
case nsIDataType::VTYPE_VOID:
@@ -405,6 +436,9 @@ static nsresult CloneArray(PRUint16 inType, const nsIID* inIID,
case nsIDataType::VTYPE_ARRAY:
case nsIDataType::VTYPE_EMPTY:
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
case nsIDataType::VTYPE_UTF8STRING:
case nsIDataType::VTYPE_CSTRING:
case nsIDataType::VTYPE_STRING_SIZE_IS:
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
default:
@@ -656,7 +690,12 @@ static PRBool String2ID(const nsDiscriminatedUnion& data, nsID* pid)
case nsIDataType::VTYPE_CHAR_STR:
case nsIDataType::VTYPE_STRING_SIZE_IS:
return pid->Parse(data.u.str.mStringValue);
case nsIDataType::VTYPE_CSTRING:
return pid->Parse(PromiseFlatCString(*data.u.mCStringValue).get());
case nsIDataType::VTYPE_UTF8STRING:
return pid->Parse(PromiseFlatUTF8String(*data.u.mUTF8StringValue).get());
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
pString = data.u.mAStringValue;
break;
case nsIDataType::VTYPE_WCHAR_STR:
@@ -694,6 +733,9 @@ nsVariant::ConvertToID(const nsDiscriminatedUnion& data, nsID * _retval)
*_retval = data.u.iface.mInterfaceID;
return NS_OK;
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
case nsIDataType::VTYPE_UTF8STRING:
case nsIDataType::VTYPE_CSTRING:
case nsIDataType::VTYPE_CHAR_STR:
case nsIDataType::VTYPE_WCHAR_STR:
case nsIDataType::VTYPE_STRING_SIZE_IS:
@@ -718,6 +760,9 @@ static nsresult ToString(const nsDiscriminatedUnion& data,
{
// all the stuff we don't handle...
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
case nsIDataType::VTYPE_UTF8STRING:
case nsIDataType::VTYPE_CSTRING:
case nsIDataType::VTYPE_CHAR_STR:
case nsIDataType::VTYPE_WCHAR_STR:
case nsIDataType::VTYPE_STRING_SIZE_IS:
@@ -782,7 +827,8 @@ static nsresult ToString(const nsDiscriminatedUnion& data,
}
/* static */ nsresult
nsVariant::ConvertToAString(const nsDiscriminatedUnion& data, nsAWritableString & _retval)
nsVariant::ConvertToAString(const nsDiscriminatedUnion& data,
nsAWritableString & _retval)
{
nsCAutoString tempCString;
nsresult rv;
@@ -790,18 +836,28 @@ nsVariant::ConvertToAString(const nsDiscriminatedUnion& data, nsAWritableString
switch(data.mType)
{
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
_retval.Assign(*data.u.mAStringValue);
return NS_OK;
case nsIDataType::VTYPE_CSTRING:
CopyASCIItoUCS2(*data.u.mCStringValue, _retval);
return NS_OK;
case nsIDataType::VTYPE_UTF8STRING:
// XXX This is an extra copy that should be avoided
// once Jag lands support for UTF8String and associated
// conversion methods.
_retval.Assign(NS_ConvertUTF8toUCS2(*data.u.mUTF8StringValue));
return NS_OK;
case nsIDataType::VTYPE_CHAR_STR:
tempCString.Assign(data.u.str.mStringValue);
CopyASCIItoUCS2(tempCString, _retval);
CopyASCIItoUCS2(nsDependentCString(data.u.str.mStringValue), _retval);
return NS_OK;
case nsIDataType::VTYPE_WCHAR_STR:
_retval.Assign(data.u.wstr.mWStringValue);
return NS_OK;
case nsIDataType::VTYPE_STRING_SIZE_IS:
tempCString.Assign(data.u.str.mStringValue, data.u.str.mStringLength);
CopyASCIItoUCS2(tempCString, _retval);
CopyASCIItoUCS2(nsDependentCString(data.u.str.mStringValue,
data.u.str.mStringLength),
_retval);
return NS_OK;
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
_retval.Assign(data.u.wstr.mWStringValue, data.u.wstr.mWStringLength);
@@ -818,12 +874,131 @@ nsVariant::ConvertToAString(const nsDiscriminatedUnion& data, nsAWritableString
}
}
/* static */ nsresult
nsVariant::ConvertToACString(const nsDiscriminatedUnion& data,
nsACString & _retval)
{
nsresult rv;
switch(data.mType)
{
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
CopyUCS2toASCII(*data.u.mAStringValue, _retval);
return NS_OK;
case nsIDataType::VTYPE_CSTRING:
_retval.Assign(*data.u.mCStringValue);
return NS_OK;
case nsIDataType::VTYPE_UTF8STRING:
// XXX This is an extra copy that should be avoided
// once Jag lands support for UTF8String and associated
// conversion methods.
CopyUCS2toASCII(NS_ConvertUTF8toUCS2(*data.u.mUTF8StringValue),
_retval);
return NS_OK;
case nsIDataType::VTYPE_CHAR_STR:
_retval.Assign(*data.u.str.mStringValue);
return NS_OK;
case nsIDataType::VTYPE_WCHAR_STR:
CopyUCS2toASCII(nsDependentString(data.u.wstr.mWStringValue),
_retval);
return NS_OK;
case nsIDataType::VTYPE_STRING_SIZE_IS:
_retval.Assign(data.u.str.mStringValue, data.u.str.mStringLength);
return NS_OK;
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
CopyUCS2toASCII(nsDependentString(data.u.wstr.mWStringValue,
data.u.wstr.mWStringLength), _retval);
return NS_OK;
case nsIDataType::VTYPE_WCHAR:
{
const PRUnichar* str = &data.u.mWCharValue;
CopyUCS2toASCII(Substring(str, str), _retval);
return NS_OK;
}
default:
rv = ToString(data, _retval);
if(NS_FAILED(rv))
return rv;
return NS_OK;
}
}
/* static */ nsresult
nsVariant::ConvertToAUTF8String(const nsDiscriminatedUnion& data,
nsAUTF8String & _retval)
{
nsCAutoString tempCString;
nsresult rv;
switch(data.mType)
{
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
// XXX Extra copy. Jag will fix when he lands UTF8String
_retval.Assign(NS_ConvertUCS2toUTF8(*data.u.mAStringValue));
return NS_OK;
case nsIDataType::VTYPE_CSTRING:
// XXX Extra copy and conversion.
// Jag will fix when he lands UTF8String
_retval.Assign(NS_ConvertUCS2toUTF8(
NS_ConvertASCIItoUCS2(*data.u.mCStringValue)));
return NS_OK;
case nsIDataType::VTYPE_UTF8STRING:
_retval.Assign(*data.u.mUTF8StringValue);
return NS_OK;
case nsIDataType::VTYPE_CHAR_STR:
// XXX Extra copy and conversion.
// Jag will fix when he lands UTF8String
_retval.Assign(NS_ConvertUCS2toUTF8(
NS_ConvertASCIItoUCS2(
nsDependentCString(data.u.str.mStringValue))));
return NS_OK;
case nsIDataType::VTYPE_WCHAR_STR:
// XXX Extra copy. Jag will fix when he lands UTF8String
_retval.Assign(NS_ConvertUCS2toUTF8(
nsDependentString(data.u.wstr.mWStringValue)));
return NS_OK;
case nsIDataType::VTYPE_STRING_SIZE_IS:
// XXX Extra copy and conversion.
// Jag will fix when he lands UTF8String
_retval.Assign(NS_ConvertUCS2toUTF8(
NS_ConvertASCIItoUCS2(
nsDependentCString(data.u.str.mStringValue,
data.u.str.mStringLength))));
return NS_OK;
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
// XXX Extra copy. Jag will fix when he lands UTF8String
_retval.Assign(NS_ConvertUCS2toUTF8(
nsDependentString(data.u.wstr.mWStringValue,
data.u.wstr.mWStringLength)));
return NS_OK;
case nsIDataType::VTYPE_WCHAR:
{
// XXX Extra copies. Jag will fix when he lands UTF8String
nsAutoString tempString(data.u.mWCharValue);
_retval.Assign(NS_ConvertUCS2toUTF8(tempString));
return NS_OK;
}
default:
rv = ToString(data, tempCString);
if(NS_FAILED(rv))
return rv;
// XXX Extra copy and conversion.
// Jag will fix when he lands UTF8String
_retval.Assign(NS_ConvertUCS2toUTF8(
NS_ConvertASCIItoUCS2(tempCString)));
return NS_OK;
}
}
/* static */ nsresult
nsVariant::ConvertToString(const nsDiscriminatedUnion& data, char **_retval)
{
PRUint32 ignored;
return nsVariant::ConvertToStringWithSize(data, &ignored, _retval);
}
/* static */ nsresult
nsVariant::ConvertToWString(const nsDiscriminatedUnion& data, PRUnichar **_retval)
{
@@ -841,29 +1016,57 @@ nsVariant::ConvertToStringWithSize(const nsDiscriminatedUnion& data, PRUint32 *s
switch(data.mType)
{
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
*size = data.u.mAStringValue->Length();
*str = ToNewCString(*data.u.mAStringValue);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
case nsIDataType::VTYPE_CSTRING:
*size = data.u.mCStringValue->Length();
*str = ToNewCString(*data.u.mCStringValue);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
case nsIDataType::VTYPE_UTF8STRING:
{
// XXX This is doing 1 extra copy. Need to fix this
// when Jag lands UTF8String
// we want:
// *size = *data.mUTF8StringValue->Length();
// *str = ToNewCString(*data.mUTF8StringValue);
// But this will have to do for now.
NS_ConvertUTF8toUCS2 tempString(*data.u.mUTF8StringValue);
*size = tempString.Length();
*str = ToNewCString(tempString);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_CHAR_STR:
tempCString.Assign(data.u.str.mStringValue);
*size = tempCString.Length();
*str = ToNewCString(tempCString);
{
nsDependentCString cString(data.u.str.mStringValue);
*size = cString.Length();
*str = ToNewCString(cString);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_WCHAR_STR:
tempString.Assign(data.u.wstr.mWStringValue);
*size = tempString.Length();
*str = ToNewCString(tempString);
{
nsDependentString string(data.u.wstr.mWStringValue);
*size = string.Length();
*str = ToNewCString(string);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_STRING_SIZE_IS:
tempCString.Assign(data.u.str.mStringValue, data.u.str.mStringLength);
*size = tempCString.Length();
*str = ToNewCString(tempCString);
{
nsDependentCString cString(data.u.str.mStringValue,
data.u.str.mStringLength);
*size = cString.Length();
*str = ToNewCString(cString);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
tempString.Assign(data.u.wstr.mWStringValue, data.u.wstr.mWStringLength);
*size = tempString.Length();
*str = ToNewCString(tempString);
{
nsDependentString string(data.u.wstr.mWStringValue,
data.u.wstr.mWStringLength);
*size = string.Length();
*str = ToNewCString(string);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_WCHAR:
tempString.Assign(data.u.mWCharValue);
*size = tempString.Length();
@@ -888,29 +1091,57 @@ nsVariant::ConvertToWStringWithSize(const nsDiscriminatedUnion& data, PRUint32 *
switch(data.mType)
{
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
*size = data.u.mAStringValue->Length();
*str = ToNewUnicode(*data.u.mAStringValue);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
case nsIDataType::VTYPE_CSTRING:
*size = data.u.mCStringValue->Length();
*str = ToNewUnicode(*data.u.mCStringValue);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
case nsIDataType::VTYPE_UTF8STRING:
{
// XXX This is an extra copy that should be avoided
// once Jag lands his new UTF8String code.
// We want this:
// *size = data.u.mUTF8StringValue->Length();
// *str = ToNewUnicode(*data.u.mUTF8StringValue);
// But this will have to do for now.
NS_ConvertUTF8toUCS2 ucString(*data.u.mUTF8StringValue);
*size = ucString.Length();
*str = ToNewUnicode(ucString);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_CHAR_STR:
tempCString.Assign(data.u.str.mStringValue);
*size = tempCString.Length();
*str = ToNewUnicode(tempCString);
{
nsDependentCString cString(data.u.str.mStringValue);
*size = cString.Length();
*str = ToNewUnicode(cString);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_WCHAR_STR:
tempString.Assign(data.u.wstr.mWStringValue);
*size = tempString.Length();
*str = ToNewUnicode(tempString);
{
nsDependentString string(data.u.wstr.mWStringValue);
*size = string.Length();
*str = ToNewUnicode(string);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_STRING_SIZE_IS:
tempCString.Assign(data.u.str.mStringValue, data.u.str.mStringLength);
*size = tempCString.Length();
*str = ToNewUnicode(tempCString);
{
nsDependentCString cString(data.u.str.mStringValue,
data.u.str.mStringLength);
*size = cString.Length();
*str = ToNewUnicode(cString);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
tempString.Assign(data.u.wstr.mWStringValue, data.u.wstr.mWStringLength);
*size = tempString.Length();
*str = ToNewUnicode(tempString);
{
nsDependentString string(data.u.wstr.mWStringValue,
data.u.wstr.mWStringLength);
*size = string.Length();
*str = ToNewUnicode(string);
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
case nsIDataType::VTYPE_WCHAR:
tempString.Assign(data.u.mWCharValue);
*size = tempString.Length();
@@ -1058,6 +1289,7 @@ nsVariant::SetFromVariant(nsDiscriminatedUnion* data, nsIVariant* aValue)
CASE__SET_FROM_VARIANT_TYPE(VTYPE_ID, mIDValue, ID)
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
case nsIDataType::VTYPE_WCHAR_STR:
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_ASTRING);
@@ -1069,6 +1301,26 @@ nsVariant::SetFromVariant(nsDiscriminatedUnion* data, nsIVariant* aValue)
delete data->u.mAStringValue;
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_ASTRING)
case nsIDataType::VTYPE_CSTRING:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_CSTRING);
data->u.mCStringValue = new nsCString();
if(!data->u.mCStringValue)
return NS_ERROR_OUT_OF_MEMORY;
rv = aValue->GetAsACString(*data->u.mCStringValue);
if(NS_FAILED(rv))
delete data->u.mCStringValue;
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_CSTRING)
case nsIDataType::VTYPE_UTF8STRING:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_UTF8STRING);
data->u.mUTF8StringValue = new nsUTF8String();
if(!data->u.mUTF8StringValue)
return NS_ERROR_OUT_OF_MEMORY;
rv = aValue->GetAsAUTF8String(*data->u.mUTF8StringValue);
if(NS_FAILED(rv))
delete data->u.mUTF8StringValue;
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_UTF8STRING)
case nsIDataType::VTYPE_CHAR_STR:
case nsIDataType::VTYPE_STRING_SIZE_IS:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_STRING_SIZE_IS);
@@ -1189,6 +1441,25 @@ nsVariant::SetFromAString(nsDiscriminatedUnion* data, const nsAReadableString &
return NS_ERROR_OUT_OF_MEMORY;
DATA_SETTER_EPILOGUE(data, VTYPE_ASTRING);
}
/* static */ nsresult
nsVariant::SetFromACString(nsDiscriminatedUnion* data, const nsACString & aValue)
{
DATA_SETTER_PROLOGUE(data);
if(!(data->u.mCStringValue = new nsCString(aValue)))
return NS_ERROR_OUT_OF_MEMORY;
DATA_SETTER_EPILOGUE(data, VTYPE_CSTRING);
}
/* static */ nsresult
nsVariant::SetFromAUTF8String(nsDiscriminatedUnion* data, const nsAUTF8String & aValue)
{
DATA_SETTER_PROLOGUE(data);
if(!(data->u.mUTF8StringValue = new nsUTF8String(aValue)))
return NS_ERROR_OUT_OF_MEMORY;
DATA_SETTER_EPILOGUE(data, VTYPE_UTF8STRING);
}
/* static */ nsresult
nsVariant::SetFromString(nsDiscriminatedUnion* data, const char *aValue)
{
@@ -1305,8 +1576,15 @@ nsVariant::Cleanup(nsDiscriminatedUnion* data)
case nsIDataType::VTYPE_ID:
break;
case nsIDataType::VTYPE_ASTRING:
case nsIDataType::VTYPE_DOMSTRING:
delete data->u.mAStringValue;
break;
case nsIDataType::VTYPE_CSTRING:
delete data->u.mCStringValue;
break;
case nsIDataType::VTYPE_UTF8STRING:
delete data->u.mUTF8StringValue;
break;
case nsIDataType::VTYPE_CHAR_STR:
case nsIDataType::VTYPE_STRING_SIZE_IS:
nsMemory::Free((char*)data->u.str.mStringValue);
@@ -1367,14 +1645,17 @@ nsVariant::nsVariant()
{nsIDataType::VTYPE_WCHAR , TD_WCHAR },
{nsIDataType::VTYPE_VOID , TD_VOID },
{nsIDataType::VTYPE_ID , TD_PNSIID },
{nsIDataType::VTYPE_ASTRING , TD_DOMSTRING },
{nsIDataType::VTYPE_DOMSTRING , TD_DOMSTRING },
{nsIDataType::VTYPE_CHAR_STR , TD_PSTRING },
{nsIDataType::VTYPE_WCHAR_STR , TD_PWSTRING },
{nsIDataType::VTYPE_INTERFACE , TD_INTERFACE_TYPE },
{nsIDataType::VTYPE_INTERFACE_IS , TD_INTERFACE_IS_TYPE},
{nsIDataType::VTYPE_ARRAY , TD_ARRAY },
{nsIDataType::VTYPE_STRING_SIZE_IS , TD_PSTRING_SIZE_IS },
{nsIDataType::VTYPE_WSTRING_SIZE_IS , TD_PWSTRING_SIZE_IS }
{nsIDataType::VTYPE_WSTRING_SIZE_IS , TD_PWSTRING_SIZE_IS },
{nsIDataType::VTYPE_UTF8STRING , TD_UTF8STRING },
{nsIDataType::VTYPE_CSTRING , TD_CSTRING },
{nsIDataType::VTYPE_ASTRING , TD_ASTRING }
};
static const int length = sizeof(array)/sizeof(array[0]);
static PRBool inited = PR_FALSE;
@@ -1493,6 +1774,26 @@ NS_IMETHODIMP nsVariant::GetAsAString(nsAWritableString & _retval)
return nsVariant::ConvertToAString(mData, _retval);
}
/* DOMString getAsDOMString (); */
NS_IMETHODIMP nsVariant::GetAsDOMString(nsAWritableString & _retval)
{
// A DOMString maps to an AString internally, so we can re-use
// ConvertToAString here.
return nsVariant::ConvertToAString(mData, _retval);
}
/* ACString getAsACString (); */
NS_IMETHODIMP nsVariant::GetAsACString(nsACString & _retval)
{
return nsVariant::ConvertToACString(mData, _retval);
}
/* AUTF8String getAsAUTF8String (); */
NS_IMETHODIMP nsVariant::GetAsAUTF8String(nsAUTF8String & _retval)
{
return nsVariant::ConvertToAUTF8String(mData, _retval);
}
/* string getAsString (); */
NS_IMETHODIMP nsVariant::GetAsString(char **_retval)
{
@@ -1661,6 +1962,30 @@ NS_IMETHODIMP nsVariant::SetAsAString(const nsAReadableString & aValue)
return nsVariant::SetFromAString(&mData, aValue);
}
/* void setAsDOMString (in DOMString aValue); */
NS_IMETHODIMP nsVariant::SetAsDOMString(const nsAString & aValue)
{
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
// A DOMString maps to an AString internally, so we can re-use
// SetFromAString here.
return nsVariant::SetFromAString(&mData, aValue);
}
/* void setAsACString (in ACString aValue); */
NS_IMETHODIMP nsVariant::SetAsACString(const nsACString & aValue)
{
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
return nsVariant::SetFromACString(&mData, aValue);
}
/* void setAsAUTF8String (in AUTF8String aValue); */
NS_IMETHODIMP nsVariant::SetAsAUTF8String(const nsAUTF8String & aValue)
{
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
return nsVariant::SetFromAUTF8String(&mData, aValue);
}
/* void setAsString (in string aValue); */
NS_IMETHODIMP nsVariant::SetAsString(const char *aValue)
{

View File

@@ -26,6 +26,15 @@
#include "nsIVariant.h"
#include "xpt_struct.h"
/**
* Map the nsAUTF8String, nsUTF8String classes to the nsACString and
* nsCString classes respectively for now. These defines need to be removed
* once Jag lands his nsUTF8String implementation.
*/
#define nsAUTF8String nsACString
#define nsUTF8String nsCString
#define PromiseFlatUTF8String PromiseFlatCString
/**
* nsDiscriminatedUnion is a type that nsIVariant implementors *may* use
* to hold underlying data. It has no methods. So, its use requires no linkage
@@ -50,6 +59,8 @@ struct NS_COM nsDiscriminatedUnion
PRUnichar mWCharValue;
nsIID mIDValue;
nsAString* mAStringValue;
nsAUTF8String* mUTF8StringValue;
nsACString* mCStringValue;
struct {
nsISupports* mInterfaceValue;
nsIID mInterfaceID;
@@ -111,6 +122,8 @@ public:
static nsresult ConvertToWChar(const nsDiscriminatedUnion& data, PRUnichar *_retval);
static nsresult ConvertToID(const nsDiscriminatedUnion& data, nsID * _retval);
static nsresult ConvertToAString(const nsDiscriminatedUnion& data, nsAWritableString & _retval);
static nsresult ConvertToAUTF8String(const nsDiscriminatedUnion& data, nsAUTF8String & _retval);
static nsresult ConvertToACString(const nsDiscriminatedUnion& data, nsACString & _retval);
static nsresult ConvertToString(const nsDiscriminatedUnion& data, char **_retval);
static nsresult ConvertToWString(const nsDiscriminatedUnion& data, PRUnichar **_retval);
static nsresult ConvertToISupports(const nsDiscriminatedUnion& data, nsISupports **_retval);
@@ -136,6 +149,8 @@ public:
static nsresult SetFromWChar(nsDiscriminatedUnion* data, PRUnichar aValue);
static nsresult SetFromID(nsDiscriminatedUnion* data, const nsID & aValue);
static nsresult SetFromAString(nsDiscriminatedUnion* data, const nsAReadableString & aValue);
static nsresult SetFromAUTF8String(nsDiscriminatedUnion* data, const nsAUTF8String & aValue);
static nsresult SetFromACString(nsDiscriminatedUnion* data, const nsACString & aValue);
static nsresult SetFromString(nsDiscriminatedUnion* data, const char *aValue);
static nsresult SetFromWString(nsDiscriminatedUnion* data, const PRUnichar *aValue);
static nsresult SetFromISupports(nsDiscriminatedUnion* data, nsISupports *aValue);