NOT PART OF BUILD. Add support to track the type of the interfaces in an array

This commit is contained in:
jband%netscape.com 2001-10-12 01:51:08 +00:00
parent b52f0c152a
commit 72a1c5713f
3 changed files with 30 additions and 21 deletions

View File

@ -98,8 +98,8 @@ interface nsIVariant : nsISupports
[noscript] void getAsInterface(out nsIIDPtr iid,
[iid_is(iid), retval] out nsQIResult iface);
[noscript] void getAsArray(out PRUint16 type, out PRUint32 count,
out voidPtr ptr);
[notxpcom] nsresult getAsArray(out PRUint16 type, out nsIID iid,
out PRUint32 count, out voidPtr ptr);
[noscript] void getAsStringWithSize(out PRUint32 size,
[size_is(size), retval] out string str);
@ -145,8 +145,8 @@ interface nsIWritableVariant : nsIVariant
void setAsInterface(in nsIIDRef iid,
[iid_is(iid)] in nsQIResult iface);
[noscript] void setAsArray(in PRUint16 type, in PRUint32 count,
in voidPtr ptr);
[noscript] void setAsArray(in PRUint16 type, in nsIIDPtr iid,
in PRUint32 count, in voidPtr ptr);
void setAsStringWithSize(in PRUint32 size,
[size_is(size)] in string str);

View File

@ -212,8 +212,10 @@ static void FreeArray(nsDiscriminatedUnion* data)
#undef CASE__FREE_ARRAY_IFACE
}
static nsresult CloneArray(PRUint16 inType, PRUint32 inCount, void* inValue,
PRUint16* outType, PRUint32* outCount, void** outValue)
static nsresult CloneArray(PRUint16 inType, const nsIID* inIID,
PRUint32 inCount, void* inValue,
PRUint16* outType, nsIID* outIID,
PRUint32* outCount, void** outValue)
{
NS_ASSERTION(inCount, "bad param");
NS_ASSERTION(inValue, "bad param");
@ -277,6 +279,7 @@ static nsresult CloneArray(PRUint16 inType, PRUint32 inCount, void* inValue,
case nsIDataType::TYPE_CHAR_STR:
case nsIDataType::TYPE_WCHAR_STR:
case nsIDataType::TYPE_INTERFACE:
case nsIDataType::TYPE_INTERFACE_IS:
elementSize = sizeof(void*);
break;
@ -284,7 +287,6 @@ static nsresult CloneArray(PRUint16 inType, PRUint32 inCount, void* inValue,
case nsIDataType::TYPE_ASTRING:
case nsIDataType::TYPE_STRING_SIZE_IS:
case nsIDataType::TYPE_WSTRING_SIZE_IS:
case nsIDataType::TYPE_INTERFACE_IS:
case nsIDataType::TYPE_VOID:
case nsIDataType::TYPE_ARRAY:
case nsIDataType::TYPE_EMPTY:
@ -321,6 +323,10 @@ static nsresult CloneArray(PRUint16 inType, PRUint32 inCount, void* inValue,
memcpy(*outValue, inValue, allocSize);
break;
case nsIDataType::TYPE_INTERFACE_IS:
if(outIID)
*outIID = *inIID;
// fall through...
case nsIDataType::TYPE_INTERFACE:
{
memcpy(*outValue, inValue, allocSize);
@ -401,7 +407,6 @@ static nsresult CloneArray(PRUint16 inType, PRUint32 inCount, void* inValue,
case nsIDataType::TYPE_ASTRING:
case nsIDataType::TYPE_STRING_SIZE_IS:
case nsIDataType::TYPE_WSTRING_SIZE_IS:
case nsIDataType::TYPE_INTERFACE_IS:
default:
NS_ERROR("bad type in array!");
return NS_ERROR_CANNOT_CONVERT_DATA;
@ -959,15 +964,16 @@ nsVariant::ConvertToInterface(const nsDiscriminatedUnion& data, nsIID * *iid, vo
}
/* static */ nsresult
nsVariant::ConvertToArray(const nsDiscriminatedUnion& data, PRUint16 *type, PRUint32 *count, void * *ptr)
nsVariant::ConvertToArray(const nsDiscriminatedUnion& data, PRUint16 *type, nsIID* iid, PRUint32 *count, void * *ptr)
{
// XXX perhaps we'd like to add support for converting each of the various
// types into an array containing one element of that type. We can leverage
// CloneArray to do this if we want to support this.
if(data.mType == nsIDataType::TYPE_ARRAY)
return CloneArray(data.mArrayType, data.mArrayCount, data.mArrayValue,
type, count, ptr);
return CloneArray(data.mArrayType, &data.mArrayInterfaceID,
data.mArrayCount, data.mArrayValue,
type, iid, count, ptr);
return NS_ERROR_CANNOT_CONVERT_DATA;
}
@ -1086,6 +1092,7 @@ nsVariant::SetFromVariant(nsDiscriminatedUnion* data, nsIVariant* aValue)
case nsIDataType::TYPE_ARRAY:
CASE__SET_FROM_VARIANT_TYPE_PROLOGUE(TYPE_ARRAY);
rv = aValue->GetAsArray(&data->mArrayType,
&data->mArrayInterfaceID,
&data->mArrayCount,
&data->mArrayValue);
CASE__SET_FROM_VARIANT_TYPE_EPILOGUE(TYPE_ARRAY)
@ -1215,14 +1222,15 @@ nsVariant::SetFromInterface(nsDiscriminatedUnion* data, const nsIID& iid, nsISup
DATA_SETTER_EPILOGUE(data, TYPE_INTERFACE_IS);
}
/* static */ nsresult
nsVariant::SetFromArray(nsDiscriminatedUnion* data, PRUint16 type, PRUint32 count, void * aValue)
nsVariant::SetFromArray(nsDiscriminatedUnion* data, PRUint16 type, const nsIID* iid, PRUint32 count, void * aValue)
{
DATA_SETTER_PROLOGUE(data);
if(!aValue || !count)
return NS_ERROR_NULL_POINTER;
nsresult rv = CloneArray(type, count, aValue,
nsresult rv = CloneArray(type, iid, count, aValue,
&data->mArrayType,
&data->mArrayInterfaceID,
&data->mArrayCount,
&data->mArrayValue);
if(NS_FAILED(rv))
@ -1509,10 +1517,10 @@ NS_IMETHODIMP nsVariant::GetAsInterface(nsIID * *iid, void * *iface)
return nsVariant::ConvertToInterface(mData, iid, iface);
}
/* [noscript] void getAsArray (out PRUint16 type, out PRUint32 count, out voidPtr ptr); */
NS_IMETHODIMP nsVariant::GetAsArray(PRUint16 *type, PRUint32 *count, void * *ptr)
/* [notxpcom] nsresult getAsArray (out PRUint16 type, out nsIID iid, out PRUint32 count, out voidPtr ptr); */
NS_IMETHODIMP_(nsresult) nsVariant::GetAsArray(PRUint16 *type, nsIID *iid, PRUint32 *count, void * *ptr)
{
return nsVariant::ConvertToArray(mData, type, count, ptr);
return nsVariant::ConvertToArray(mData, type, iid, count, ptr);
}
/* void getAsStringWithSize (out PRUint32 size, [size_is (size), retval] out string str); */
@ -1681,11 +1689,11 @@ NS_IMETHODIMP nsVariant::SetAsInterface(const nsIID & iid, void * iface)
return nsVariant::SetFromInterface(&mData, iid, (nsISupports*)iface);
}
/* [noscript] void setAsArray (in PRUint16 type, in PRUint32 count, in voidPtr ptr); */
NS_IMETHODIMP nsVariant::SetAsArray(PRUint16 type, PRUint32 count, void * ptr)
/* [noscript] void setAsArray (in PRUint16 type, in nsIIDPtr iid, in PRUint32 count, in voidPtr ptr); */
NS_IMETHODIMP nsVariant::SetAsArray(PRUint16 type, const nsIID * iid, PRUint32 count, void * ptr)
{
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
return nsVariant::SetFromArray(&mData, type, count, ptr);
return nsVariant::SetFromArray(&mData, type, iid, count, ptr);
}
/* void setAsStringWithSize (in PRUint32 size, [size_is (size)] in string str); */

View File

@ -55,6 +55,7 @@ struct NS_COM nsDiscriminatedUnion
nsIID mInterfaceID;
};
struct {
nsIID mArrayInterfaceID;
void* mArrayValue;
PRUint32 mArrayCount;
PRUint16 mArrayType;
@ -114,7 +115,7 @@ public:
static nsresult ConvertToWString(const nsDiscriminatedUnion& data, PRUnichar **_retval);
static nsresult ConvertToISupports(const nsDiscriminatedUnion& data, nsISupports **_retval);
static nsresult ConvertToInterface(const nsDiscriminatedUnion& data, nsIID * *iid, void * *iface);
static nsresult ConvertToArray(const nsDiscriminatedUnion& data, PRUint16 *type, PRUint32 *count, void * *ptr);
static nsresult ConvertToArray(const nsDiscriminatedUnion& data, PRUint16 *type, nsIID* iid, PRUint32 *count, void * *ptr);
static nsresult ConvertToStringWithSize(const nsDiscriminatedUnion& data, PRUint32 *size, char **str);
static nsresult ConvertToWStringWithSize(const nsDiscriminatedUnion& data, PRUint32 *size, PRUnichar **str);
@ -139,7 +140,7 @@ public:
static nsresult SetFromWString(nsDiscriminatedUnion* data, const PRUnichar *aValue);
static nsresult SetFromISupports(nsDiscriminatedUnion* data, nsISupports *aValue);
static nsresult SetFromInterface(nsDiscriminatedUnion* data, const nsIID& iid, nsISupports *aValue);
static nsresult SetFromArray(nsDiscriminatedUnion* data, PRUint16 type, PRUint32 count, void * aValue);
static nsresult SetFromArray(nsDiscriminatedUnion* data, PRUint16 type, const nsIID* iid, PRUint32 count, void * aValue);
static nsresult SetFromStringWithSize(nsDiscriminatedUnion* data, PRUint32 size, const char *aValue);
static nsresult SetFromWStringWithSize(nsDiscriminatedUnion* data, PRUint32 size, const PRUnichar *aValue);