1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
3
* ***** BEGIN LICENSE BLOCK *****
4
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
6
* The contents of this file are subject to the Mozilla Public License Version
7
* 1.1 (the "License"); you may not use this file except in compliance with
8
* the License. You may obtain a copy of the License at
9
* http://www.mozilla.org/MPL/
11
* Software distributed under the License is distributed on an "AS IS" basis,
12
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
* for the specific language governing rights and limitations under the
16
* The Original Code is mozilla.org code.
18
* The Initial Developer of the Original Code is
19
* Netscape Communications Corporation.
20
* Portions created by the Initial Developer are Copyright (C) 1998
21
* the Initial Developer. All Rights Reserved.
24
* John Bandhauer <jband@netscape.com>
26
* Alternatively, the contents of this file may be used under the terms of
27
* either of the GNU General Public License Version 2 or later (the "GPL"),
28
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
* in which case the provisions of the GPL or the LGPL are applicable instead
30
* of those above. If you wish to allow use of your version of this file only
31
* under the terms of either the GPL or the LGPL, and not to allow others to
32
* use your version of this file under the terms of the MPL, indicate your
33
* decision by deleting the provisions above and replace them with the notice
34
* and other provisions required by the GPL or the LGPL. If you do not delete
35
* the provisions above, a recipient may use your version of this file under
36
* the terms of any one of the MPL, the GPL or the LGPL.
38
* ***** END LICENSE BLOCK ***** */
40
/* The long avoided variant support for xpcom. */
42
#include "nsVariant.h"
49
/***************************************************************************/
50
// Helpers for static convert functions...
52
static nsresult String2Double(const char* aString, double* retval)
55
double value = PR_strtod(aString, &next);
57
return NS_ERROR_CANNOT_CONVERT_DATA;
62
static nsresult AString2Double(const nsAString& aString, double* retval)
64
char* pChars = ToNewCString(aString);
66
return NS_ERROR_OUT_OF_MEMORY;
67
nsresult rv = String2Double(pChars, retval);
68
nsMemory::Free(pChars);
72
static nsresult AUTF8String2Double(const nsAUTF8String& aString, double* retval)
74
return String2Double(PromiseFlatUTF8String(aString).get(), retval);
77
static nsresult ACString2Double(const nsACString& aString, double* retval)
79
return String2Double(PromiseFlatCString(aString).get(), retval);
82
// Fills outVariant with double, PRUint32, or PRInt32.
83
// Returns NS_OK, an error code, or a non-NS_OK success code
84
static nsresult ToManageableNumber(const nsDiscriminatedUnion& inData,
85
nsDiscriminatedUnion* outData)
91
// This group results in a PRInt32...
93
#define CASE__NUMBER_INT32(type_, member_) \
94
case nsIDataType :: type_ : \
95
outData->u.mInt32Value = inData.u. member_ ; \
96
outData->mType = nsIDataType::VTYPE_INT32; \
99
CASE__NUMBER_INT32(VTYPE_INT8, mInt8Value)
100
CASE__NUMBER_INT32(VTYPE_INT16, mInt16Value)
101
CASE__NUMBER_INT32(VTYPE_INT32, mInt32Value)
102
CASE__NUMBER_INT32(VTYPE_UINT8, mUint8Value)
103
CASE__NUMBER_INT32(VTYPE_UINT16, mUint16Value)
104
CASE__NUMBER_INT32(VTYPE_BOOL, mBoolValue)
105
CASE__NUMBER_INT32(VTYPE_CHAR, mCharValue)
106
CASE__NUMBER_INT32(VTYPE_WCHAR, mWCharValue)
108
#undef CASE__NUMBER_INT32
110
// This group results in a PRUint32...
112
case nsIDataType::VTYPE_UINT32:
113
outData->u.mInt32Value = inData.u.mUint32Value;
114
outData->mType = nsIDataType::VTYPE_INT32;
117
// This group results in a double...
119
case nsIDataType::VTYPE_INT64:
120
case nsIDataType::VTYPE_UINT64:
121
// XXX Need boundary checking here.
122
// We may need to return NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA
123
LL_L2D(outData->u.mDoubleValue, inData.u.mInt64Value);
124
outData->mType = nsIDataType::VTYPE_DOUBLE;
126
case nsIDataType::VTYPE_FLOAT:
127
outData->u.mDoubleValue = inData.u.mFloatValue;
128
outData->mType = nsIDataType::VTYPE_DOUBLE;
130
case nsIDataType::VTYPE_DOUBLE:
131
outData->u.mDoubleValue = inData.u.mDoubleValue;
132
outData->mType = nsIDataType::VTYPE_DOUBLE;
134
case nsIDataType::VTYPE_CHAR_STR:
135
case nsIDataType::VTYPE_STRING_SIZE_IS:
136
rv = String2Double(inData.u.str.mStringValue, &outData->u.mDoubleValue);
139
outData->mType = nsIDataType::VTYPE_DOUBLE;
141
case nsIDataType::VTYPE_DOMSTRING:
142
case nsIDataType::VTYPE_ASTRING:
143
rv = AString2Double(*inData.u.mAStringValue, &outData->u.mDoubleValue);
146
outData->mType = nsIDataType::VTYPE_DOUBLE;
148
case nsIDataType::VTYPE_UTF8STRING:
149
rv = AUTF8String2Double(*inData.u.mUTF8StringValue,
150
&outData->u.mDoubleValue);
153
outData->mType = nsIDataType::VTYPE_DOUBLE;
155
case nsIDataType::VTYPE_CSTRING:
156
rv = ACString2Double(*inData.u.mCStringValue,
157
&outData->u.mDoubleValue);
160
outData->mType = nsIDataType::VTYPE_DOUBLE;
162
case nsIDataType::VTYPE_WCHAR_STR:
163
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
164
rv = AString2Double(nsDependentString(inData.u.wstr.mWStringValue),
165
&outData->u.mDoubleValue);
168
outData->mType = nsIDataType::VTYPE_DOUBLE;
171
// This group fails...
173
case nsIDataType::VTYPE_VOID:
174
case nsIDataType::VTYPE_ID:
175
case nsIDataType::VTYPE_INTERFACE:
176
case nsIDataType::VTYPE_INTERFACE_IS:
177
case nsIDataType::VTYPE_ARRAY:
178
case nsIDataType::VTYPE_EMPTY_ARRAY:
179
case nsIDataType::VTYPE_EMPTY:
181
return NS_ERROR_CANNOT_CONVERT_DATA;
185
/***************************************************************************/
188
static void FreeArray(nsDiscriminatedUnion* data)
190
NS_ASSERTION(data->mType == nsIDataType::VTYPE_ARRAY, "bad FreeArray call");
191
NS_ASSERTION(data->u.array.mArrayValue, "bad array");
192
NS_ASSERTION(data->u.array.mArrayCount, "bad array count");
194
#define CASE__FREE_ARRAY_PTR(type_, ctype_) \
195
case nsIDataType:: type_ : \
197
ctype_ ** p = (ctype_ **) data->u.array.mArrayValue; \
198
for(PRUint32 i = data->u.array.mArrayCount; i > 0; p++, i--) \
200
nsMemory::Free((char*)*p); \
204
#define CASE__FREE_ARRAY_IFACE(type_, ctype_) \
205
case nsIDataType:: type_ : \
207
ctype_ ** p = (ctype_ **) data->u.array.mArrayValue; \
208
for(PRUint32 i = data->u.array.mArrayCount; i > 0; p++, i--) \
214
switch(data->u.array.mArrayType)
216
case nsIDataType::VTYPE_INT8:
217
case nsIDataType::VTYPE_INT16:
218
case nsIDataType::VTYPE_INT32:
219
case nsIDataType::VTYPE_INT64:
220
case nsIDataType::VTYPE_UINT8:
221
case nsIDataType::VTYPE_UINT16:
222
case nsIDataType::VTYPE_UINT32:
223
case nsIDataType::VTYPE_UINT64:
224
case nsIDataType::VTYPE_FLOAT:
225
case nsIDataType::VTYPE_DOUBLE:
226
case nsIDataType::VTYPE_BOOL:
227
case nsIDataType::VTYPE_CHAR:
228
case nsIDataType::VTYPE_WCHAR:
231
// XXX We ASSUME that "array of nsID" means "array of pointers to nsID".
232
CASE__FREE_ARRAY_PTR(VTYPE_ID, nsID)
233
CASE__FREE_ARRAY_PTR(VTYPE_CHAR_STR, char)
234
CASE__FREE_ARRAY_PTR(VTYPE_WCHAR_STR, PRUnichar)
235
CASE__FREE_ARRAY_IFACE(VTYPE_INTERFACE, nsISupports)
236
CASE__FREE_ARRAY_IFACE(VTYPE_INTERFACE_IS, nsISupports)
238
// The rest are illegal.
239
case nsIDataType::VTYPE_VOID:
240
case nsIDataType::VTYPE_ASTRING:
241
case nsIDataType::VTYPE_DOMSTRING:
242
case nsIDataType::VTYPE_UTF8STRING:
243
case nsIDataType::VTYPE_CSTRING:
244
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
245
case nsIDataType::VTYPE_STRING_SIZE_IS:
246
case nsIDataType::VTYPE_ARRAY:
247
case nsIDataType::VTYPE_EMPTY_ARRAY:
248
case nsIDataType::VTYPE_EMPTY:
250
NS_ERROR("bad type in array!");
254
// Free the array memory.
255
nsMemory::Free((char*)data->u.array.mArrayValue);
257
#undef CASE__FREE_ARRAY_PTR
258
#undef CASE__FREE_ARRAY_IFACE
261
static nsresult CloneArray(PRUint16 inType, const nsIID* inIID,
262
PRUint32 inCount, void* inValue,
263
PRUint16* outType, nsIID* outIID,
264
PRUint32* outCount, void** outValue)
266
NS_ASSERTION(inCount, "bad param");
267
NS_ASSERTION(inValue, "bad param");
268
NS_ASSERTION(outType, "bad param");
269
NS_ASSERTION(outCount, "bad param");
270
NS_ASSERTION(outValue, "bad param");
272
PRUint32 allocatedValueCount = 0;
276
// First we figure out the size of the elements for the new u.array.
283
case nsIDataType::VTYPE_INT8:
284
elementSize = sizeof(PRInt8);
286
case nsIDataType::VTYPE_INT16:
287
elementSize = sizeof(PRInt16);
289
case nsIDataType::VTYPE_INT32:
290
elementSize = sizeof(PRInt32);
292
case nsIDataType::VTYPE_INT64:
293
elementSize = sizeof(PRInt64);
295
case nsIDataType::VTYPE_UINT8:
296
elementSize = sizeof(PRUint8);
298
case nsIDataType::VTYPE_UINT16:
299
elementSize = sizeof(PRUint16);
301
case nsIDataType::VTYPE_UINT32:
302
elementSize = sizeof(PRUint32);
304
case nsIDataType::VTYPE_UINT64:
305
elementSize = sizeof(PRUint64);
307
case nsIDataType::VTYPE_FLOAT:
308
elementSize = sizeof(float);
310
case nsIDataType::VTYPE_DOUBLE:
311
elementSize = sizeof(double);
313
case nsIDataType::VTYPE_BOOL:
314
elementSize = sizeof(PRBool);
316
case nsIDataType::VTYPE_CHAR:
317
elementSize = sizeof(char);
319
case nsIDataType::VTYPE_WCHAR:
320
elementSize = sizeof(PRUnichar);
323
// XXX We ASSUME that "array of nsID" means "array of pointers to nsID".
324
case nsIDataType::VTYPE_ID:
325
case nsIDataType::VTYPE_CHAR_STR:
326
case nsIDataType::VTYPE_WCHAR_STR:
327
case nsIDataType::VTYPE_INTERFACE:
328
case nsIDataType::VTYPE_INTERFACE_IS:
329
elementSize = sizeof(void*);
332
// The rest are illegal.
333
case nsIDataType::VTYPE_ASTRING:
334
case nsIDataType::VTYPE_DOMSTRING:
335
case nsIDataType::VTYPE_UTF8STRING:
336
case nsIDataType::VTYPE_CSTRING:
337
case nsIDataType::VTYPE_STRING_SIZE_IS:
338
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
339
case nsIDataType::VTYPE_VOID:
340
case nsIDataType::VTYPE_ARRAY:
341
case nsIDataType::VTYPE_EMPTY_ARRAY:
342
case nsIDataType::VTYPE_EMPTY:
344
NS_ERROR("bad type in array!");
345
return NS_ERROR_CANNOT_CONVERT_DATA;
349
// Alloc the u.array.
351
allocSize = inCount * elementSize;
352
*outValue = nsMemory::Alloc(allocSize);
354
return NS_ERROR_OUT_OF_MEMORY;
356
// Clone the elements.
360
case nsIDataType::VTYPE_INT8:
361
case nsIDataType::VTYPE_INT16:
362
case nsIDataType::VTYPE_INT32:
363
case nsIDataType::VTYPE_INT64:
364
case nsIDataType::VTYPE_UINT8:
365
case nsIDataType::VTYPE_UINT16:
366
case nsIDataType::VTYPE_UINT32:
367
case nsIDataType::VTYPE_UINT64:
368
case nsIDataType::VTYPE_FLOAT:
369
case nsIDataType::VTYPE_DOUBLE:
370
case nsIDataType::VTYPE_BOOL:
371
case nsIDataType::VTYPE_CHAR:
372
case nsIDataType::VTYPE_WCHAR:
373
memcpy(*outValue, inValue, allocSize);
376
case nsIDataType::VTYPE_INTERFACE_IS:
380
case nsIDataType::VTYPE_INTERFACE:
382
memcpy(*outValue, inValue, allocSize);
384
nsISupports** p = (nsISupports**) *outValue;
385
for(i = inCount; i > 0; p++, i--)
391
// XXX We ASSUME that "array of nsID" means "array of pointers to nsID".
392
case nsIDataType::VTYPE_ID:
394
nsID** inp = (nsID**) inValue;
395
nsID** outp = (nsID**) *outValue;
396
for(i = inCount; i > 0; i--)
398
nsID* idp = *(inp++);
401
if(nsnull == (*(outp++) = (nsID*)
402
nsMemory::Clone((char*)idp, sizeof(nsID))))
407
allocatedValueCount++;
412
case nsIDataType::VTYPE_CHAR_STR:
414
char** inp = (char**) inValue;
415
char** outp = (char**) *outValue;
416
for(i = inCount; i > 0; i--)
418
char* str = *(inp++);
421
if(nsnull == (*(outp++) = (char*)
422
nsMemory::Clone(str, (strlen(str)+1)*sizeof(char))))
427
allocatedValueCount++;
432
case nsIDataType::VTYPE_WCHAR_STR:
434
PRUnichar** inp = (PRUnichar**) inValue;
435
PRUnichar** outp = (PRUnichar**) *outValue;
436
for(i = inCount; i > 0; i--)
438
PRUnichar* str = *(inp++);
441
if(nsnull == (*(outp++) = (PRUnichar*)
443
(nsCRT::strlen(str)+1)*sizeof(PRUnichar))))
448
allocatedValueCount++;
453
// The rest are illegal.
454
case nsIDataType::VTYPE_VOID:
455
case nsIDataType::VTYPE_ARRAY:
456
case nsIDataType::VTYPE_EMPTY_ARRAY:
457
case nsIDataType::VTYPE_EMPTY:
458
case nsIDataType::VTYPE_ASTRING:
459
case nsIDataType::VTYPE_DOMSTRING:
460
case nsIDataType::VTYPE_UTF8STRING:
461
case nsIDataType::VTYPE_CSTRING:
462
case nsIDataType::VTYPE_STRING_SIZE_IS:
463
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
465
NS_ERROR("bad type in array!");
466
return NS_ERROR_CANNOT_CONVERT_DATA;
476
char** p = (char**) *outValue;
477
for(i = allocatedValueCount; i > 0; p++, i--)
480
nsMemory::Free((char*)*outValue);
486
/***************************************************************************/
488
#define TRIVIAL_DATA_CONVERTER(type_, data_, member_, retval_) \
489
if(data_.mType == nsIDataType :: type_) { \
490
*retval_ = data_.u.member_; \
494
#define NUMERIC_CONVERSION_METHOD_BEGIN(type_, Ctype_, name_) \
495
/* static */ nsresult \
496
nsVariant::ConvertTo##name_ (const nsDiscriminatedUnion& data, \
499
TRIVIAL_DATA_CONVERTER(type_, data, m##name_##Value, _retval) \
500
nsDiscriminatedUnion tempData; \
501
nsVariant::Initialize(&tempData); \
502
nsresult rv = ToManageableNumber(data, &tempData); \
504
/* NOTE: rv may indicate a success code that we want to preserve */ \
505
/* For the final return. So all the return cases below should return */ \
506
/* this rv when indicating success. */ \
510
switch(tempData.mType) \
513
#define CASE__NUMERIC_CONVERSION_INT32_JUST_CAST(Ctype_) \
514
case nsIDataType::VTYPE_INT32: \
515
*_retval = ( Ctype_ ) tempData.u.mInt32Value; \
518
#define CASE__NUMERIC_CONVERSION_INT32_MIN_MAX(Ctype_, min_, max_) \
519
case nsIDataType::VTYPE_INT32: \
521
PRInt32 value = tempData.u.mInt32Value; \
522
if(value < min_ || value > max_) \
523
return NS_ERROR_LOSS_OF_SIGNIFICANT_DATA; \
524
*_retval = ( Ctype_ ) value; \
528
#define CASE__NUMERIC_CONVERSION_UINT32_JUST_CAST(Ctype_) \
529
case nsIDataType::VTYPE_UINT32: \
530
*_retval = ( Ctype_ ) tempData.u.mUint32Value; \
533
#define CASE__NUMERIC_CONVERSION_UINT32_MAX(Ctype_, max_) \
534
case nsIDataType::VTYPE_UINT32: \
536
PRUint32 value = tempData.u.mUint32Value; \
538
return NS_ERROR_LOSS_OF_SIGNIFICANT_DATA; \
539
*_retval = ( Ctype_ ) value; \
543
#define CASE__NUMERIC_CONVERSION_DOUBLE_JUST_CAST(Ctype_) \
544
case nsIDataType::VTYPE_DOUBLE: \
545
*_retval = ( Ctype_ ) tempData.u.mDoubleValue; \
548
#define CASE__NUMERIC_CONVERSION_DOUBLE_MIN_MAX(Ctype_, min_, max_) \
549
case nsIDataType::VTYPE_DOUBLE: \
551
double value = tempData.u.mDoubleValue; \
552
if(value < min_ || value > max_) \
553
return NS_ERROR_LOSS_OF_SIGNIFICANT_DATA; \
554
*_retval = ( Ctype_ ) value; \
558
#define CASE__NUMERIC_CONVERSION_DOUBLE_MIN_MAX_INT(Ctype_, min_, max_) \
559
case nsIDataType::VTYPE_DOUBLE: \
561
double value = tempData.u.mDoubleValue; \
562
if(value < min_ || value > max_) \
563
return NS_ERROR_LOSS_OF_SIGNIFICANT_DATA; \
564
*_retval = ( Ctype_ ) value; \
565
return (0.0 == fmod(value,1.0)) ? \
566
rv : NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA; \
569
#define CASES__NUMERIC_CONVERSION_NORMAL(Ctype_, min_, max_) \
570
CASE__NUMERIC_CONVERSION_INT32_MIN_MAX(Ctype_, min_, max_) \
571
CASE__NUMERIC_CONVERSION_UINT32_MAX(Ctype_, max_) \
572
CASE__NUMERIC_CONVERSION_DOUBLE_MIN_MAX_INT(Ctype_, min_, max_)
574
#define NUMERIC_CONVERSION_METHOD_END \
576
NS_ERROR("bad type returned from ToManageableNumber"); \
577
return NS_ERROR_CANNOT_CONVERT_DATA; \
581
#define NUMERIC_CONVERSION_METHOD_NORMAL(type_, Ctype_, name_, min_, max_) \
582
NUMERIC_CONVERSION_METHOD_BEGIN(type_, Ctype_, name_) \
583
CASES__NUMERIC_CONVERSION_NORMAL(Ctype_, min_, max_) \
584
NUMERIC_CONVERSION_METHOD_END
586
/***************************************************************************/
587
// These expand into full public methods...
589
NUMERIC_CONVERSION_METHOD_NORMAL(VTYPE_INT8, PRUint8, Int8, (-127-1), 127)
590
NUMERIC_CONVERSION_METHOD_NORMAL(VTYPE_INT16, PRInt16, Int16, (-32767-1), 32767)
592
NUMERIC_CONVERSION_METHOD_BEGIN(VTYPE_INT32, PRInt32, Int32)
593
CASE__NUMERIC_CONVERSION_INT32_JUST_CAST(PRInt32)
594
CASE__NUMERIC_CONVERSION_UINT32_MAX(PRInt32, 2147483647)
595
CASE__NUMERIC_CONVERSION_DOUBLE_MIN_MAX_INT(PRInt32, (-2147483647-1), 2147483647)
596
NUMERIC_CONVERSION_METHOD_END
598
NUMERIC_CONVERSION_METHOD_NORMAL(VTYPE_UINT8, PRUint8, Uint8, 0, 255)
599
NUMERIC_CONVERSION_METHOD_NORMAL(VTYPE_UINT16, PRUint16, Uint16, 0, 65535)
601
NUMERIC_CONVERSION_METHOD_BEGIN(VTYPE_UINT32, PRUint32, Uint32)
602
CASE__NUMERIC_CONVERSION_INT32_MIN_MAX(PRUint32, 0, 2147483647)
603
CASE__NUMERIC_CONVERSION_UINT32_JUST_CAST(PRUint32)
604
CASE__NUMERIC_CONVERSION_DOUBLE_MIN_MAX_INT(PRUint32, 0, 4294967295U)
605
NUMERIC_CONVERSION_METHOD_END
607
// XXX toFloat convertions need to be fixed!
608
NUMERIC_CONVERSION_METHOD_BEGIN(VTYPE_FLOAT, float, Float)
609
CASE__NUMERIC_CONVERSION_INT32_JUST_CAST(float)
610
CASE__NUMERIC_CONVERSION_UINT32_JUST_CAST(float)
611
CASE__NUMERIC_CONVERSION_DOUBLE_JUST_CAST(float)
612
NUMERIC_CONVERSION_METHOD_END
614
NUMERIC_CONVERSION_METHOD_BEGIN(VTYPE_DOUBLE, double, Double)
615
CASE__NUMERIC_CONVERSION_INT32_JUST_CAST(double)
616
CASE__NUMERIC_CONVERSION_UINT32_JUST_CAST(double)
617
CASE__NUMERIC_CONVERSION_DOUBLE_JUST_CAST(double)
618
NUMERIC_CONVERSION_METHOD_END
620
// XXX toChar convertions need to be fixed!
621
NUMERIC_CONVERSION_METHOD_BEGIN(VTYPE_CHAR, char, Char)
622
CASE__NUMERIC_CONVERSION_INT32_JUST_CAST(char)
623
CASE__NUMERIC_CONVERSION_UINT32_JUST_CAST(char)
624
CASE__NUMERIC_CONVERSION_DOUBLE_JUST_CAST(char)
625
NUMERIC_CONVERSION_METHOD_END
627
// XXX toWChar convertions need to be fixed!
628
NUMERIC_CONVERSION_METHOD_BEGIN(VTYPE_WCHAR, PRUnichar, WChar)
629
CASE__NUMERIC_CONVERSION_INT32_JUST_CAST(PRUnichar)
630
CASE__NUMERIC_CONVERSION_UINT32_JUST_CAST(PRUnichar)
631
CASE__NUMERIC_CONVERSION_DOUBLE_JUST_CAST(PRUnichar)
632
NUMERIC_CONVERSION_METHOD_END
634
#undef NUMERIC_CONVERSION_METHOD_BEGIN
635
#undef CASE__NUMERIC_CONVERSION_INT32_JUST_CAST
636
#undef CASE__NUMERIC_CONVERSION_INT32_MIN_MAX
637
#undef CASE__NUMERIC_CONVERSION_UINT32_JUST_CAST
638
#undef CASE__NUMERIC_CONVERSION_UINT32_MIN_MAX
639
#undef CASE__NUMERIC_CONVERSION_DOUBLE_JUST_CAST
640
#undef CASE__NUMERIC_CONVERSION_DOUBLE_MIN_MAX
641
#undef CASE__NUMERIC_CONVERSION_DOUBLE_MIN_MAX_INT
642
#undef CASES__NUMERIC_CONVERSION_NORMAL
643
#undef NUMERIC_CONVERSION_METHOD_END
644
#undef NUMERIC_CONVERSION_METHOD_NORMAL
646
/***************************************************************************/
648
// Just leverage a numeric converter for bool (but restrict the values).
649
// XXX Is this really what we want to do?
651
/* static */ nsresult
652
nsVariant::ConvertToBool(const nsDiscriminatedUnion& data, PRBool *_retval)
654
TRIVIAL_DATA_CONVERTER(VTYPE_BOOL, data, mBoolValue, _retval)
657
nsresult rv = nsVariant::ConvertToDouble(data, &val);
660
*_retval = 0.0 != val;
664
/***************************************************************************/
666
/* static */ nsresult
667
nsVariant::ConvertToInt64(const nsDiscriminatedUnion& data, PRInt64 *_retval)
669
TRIVIAL_DATA_CONVERTER(VTYPE_INT64, data, mInt64Value, _retval)
670
TRIVIAL_DATA_CONVERTER(VTYPE_UINT64, data, mUint64Value, _retval)
672
nsDiscriminatedUnion tempData;
673
nsVariant::Initialize(&tempData);
674
nsresult rv = ToManageableNumber(data, &tempData);
677
switch(tempData.mType)
679
case nsIDataType::VTYPE_INT32:
680
LL_I2L(*_retval, tempData.u.mInt32Value);
682
case nsIDataType::VTYPE_UINT32:
683
LL_UI2L(*_retval, tempData.u.mUint32Value);
685
case nsIDataType::VTYPE_DOUBLE:
686
// XXX should check for data loss here!
687
LL_D2L(*_retval, tempData.u.mDoubleValue);
690
NS_ERROR("bad type returned from ToManageableNumber");
691
return NS_ERROR_CANNOT_CONVERT_DATA;
695
/* static */ nsresult
696
nsVariant::ConvertToUint64(const nsDiscriminatedUnion& data, PRUint64 *_retval)
698
return nsVariant::ConvertToInt64(data, (PRInt64 *)_retval);
701
/***************************************************************************/
703
static PRBool String2ID(const nsDiscriminatedUnion& data, nsID* pid)
705
nsAutoString tempString;
710
case nsIDataType::VTYPE_CHAR_STR:
711
case nsIDataType::VTYPE_STRING_SIZE_IS:
712
return pid->Parse(data.u.str.mStringValue);
713
case nsIDataType::VTYPE_CSTRING:
714
return pid->Parse(PromiseFlatCString(*data.u.mCStringValue).get());
715
case nsIDataType::VTYPE_UTF8STRING:
716
return pid->Parse(PromiseFlatUTF8String(*data.u.mUTF8StringValue).get());
717
case nsIDataType::VTYPE_ASTRING:
718
case nsIDataType::VTYPE_DOMSTRING:
719
pString = data.u.mAStringValue;
721
case nsIDataType::VTYPE_WCHAR_STR:
722
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
723
tempString.Assign(data.u.wstr.mWStringValue);
724
pString = &tempString;
727
NS_ERROR("bad type in call to String2ID");
731
char* pChars = ToNewCString(*pString);
734
PRBool result = pid->Parse(pChars);
735
nsMemory::Free(pChars);
739
/* static */ nsresult
740
nsVariant::ConvertToID(const nsDiscriminatedUnion& data, nsID * _retval)
746
case nsIDataType::VTYPE_ID:
747
*_retval = data.u.mIDValue;
749
case nsIDataType::VTYPE_INTERFACE:
750
*_retval = NS_GET_IID(nsISupports);
752
case nsIDataType::VTYPE_INTERFACE_IS:
753
*_retval = data.u.iface.mInterfaceID;
755
case nsIDataType::VTYPE_ASTRING:
756
case nsIDataType::VTYPE_DOMSTRING:
757
case nsIDataType::VTYPE_UTF8STRING:
758
case nsIDataType::VTYPE_CSTRING:
759
case nsIDataType::VTYPE_CHAR_STR:
760
case nsIDataType::VTYPE_WCHAR_STR:
761
case nsIDataType::VTYPE_STRING_SIZE_IS:
762
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
763
if(!String2ID(data, &id))
764
return NS_ERROR_CANNOT_CONVERT_DATA;
768
return NS_ERROR_CANNOT_CONVERT_DATA;
772
/***************************************************************************/
774
static nsresult ToString(const nsDiscriminatedUnion& data,
775
nsACString & outString)
781
// all the stuff we don't handle...
782
case nsIDataType::VTYPE_ASTRING:
783
case nsIDataType::VTYPE_DOMSTRING:
784
case nsIDataType::VTYPE_UTF8STRING:
785
case nsIDataType::VTYPE_CSTRING:
786
case nsIDataType::VTYPE_CHAR_STR:
787
case nsIDataType::VTYPE_WCHAR_STR:
788
case nsIDataType::VTYPE_STRING_SIZE_IS:
789
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
790
case nsIDataType::VTYPE_WCHAR:
791
NS_ERROR("ToString being called for a string type - screwy logic!");
794
// XXX We might want stringified versions of these... ???
796
case nsIDataType::VTYPE_VOID:
797
case nsIDataType::VTYPE_EMPTY_ARRAY:
798
case nsIDataType::VTYPE_EMPTY:
799
case nsIDataType::VTYPE_ARRAY:
800
case nsIDataType::VTYPE_INTERFACE:
801
case nsIDataType::VTYPE_INTERFACE_IS:
803
return NS_ERROR_CANNOT_CONVERT_DATA;
805
// nsID has its own text formater.
807
case nsIDataType::VTYPE_ID:
808
ptr = data.u.mIDValue.ToString();
810
return NS_ERROR_OUT_OF_MEMORY;
811
outString.Assign(ptr);
815
// the rest can be PR_smprintf'd and use common code.
817
#define CASE__SMPRINTF_NUMBER(type_, format_, cast_, member_) \
818
case nsIDataType :: type_ : \
819
ptr = PR_smprintf( format_ , (cast_) data.u. member_ ); \
822
CASE__SMPRINTF_NUMBER(VTYPE_INT8, "%d", int, mInt8Value)
823
CASE__SMPRINTF_NUMBER(VTYPE_INT16, "%d", int, mInt16Value)
824
CASE__SMPRINTF_NUMBER(VTYPE_INT32, "%d", int, mInt32Value)
825
CASE__SMPRINTF_NUMBER(VTYPE_INT64, "%lld", PRInt64, mInt64Value)
827
CASE__SMPRINTF_NUMBER(VTYPE_UINT8, "%u", unsigned, mUint8Value)
828
CASE__SMPRINTF_NUMBER(VTYPE_UINT16, "%u", unsigned, mUint16Value)
829
CASE__SMPRINTF_NUMBER(VTYPE_UINT32, "%u", unsigned, mUint32Value)
830
CASE__SMPRINTF_NUMBER(VTYPE_UINT64, "%llu", PRInt64, mUint64Value)
832
CASE__SMPRINTF_NUMBER(VTYPE_FLOAT, "%f", float, mFloatValue)
833
CASE__SMPRINTF_NUMBER(VTYPE_DOUBLE, "%f", double, mDoubleValue)
835
// XXX Would we rather print "true" / "false" ?
836
CASE__SMPRINTF_NUMBER(VTYPE_BOOL, "%d", int, mBoolValue)
838
CASE__SMPRINTF_NUMBER(VTYPE_CHAR, "%c", char, mCharValue)
840
#undef CASE__SMPRINTF_NUMBER
844
return NS_ERROR_OUT_OF_MEMORY;
845
outString.Assign(ptr);
846
PR_smprintf_free(ptr);
850
/* static */ nsresult
851
nsVariant::ConvertToAString(const nsDiscriminatedUnion& data,
856
case nsIDataType::VTYPE_ASTRING:
857
case nsIDataType::VTYPE_DOMSTRING:
858
_retval.Assign(*data.u.mAStringValue);
860
case nsIDataType::VTYPE_CSTRING:
861
CopyASCIItoUCS2(*data.u.mCStringValue, _retval);
863
case nsIDataType::VTYPE_UTF8STRING:
864
CopyUTF8toUTF16(*data.u.mUTF8StringValue, _retval);
866
case nsIDataType::VTYPE_CHAR_STR:
867
CopyASCIItoUTF16(data.u.str.mStringValue, _retval);
869
case nsIDataType::VTYPE_WCHAR_STR:
870
_retval.Assign(data.u.wstr.mWStringValue);
872
case nsIDataType::VTYPE_STRING_SIZE_IS:
873
CopyASCIItoUCS2(nsDependentCString(data.u.str.mStringValue,
874
data.u.str.mStringLength),
877
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
878
_retval.Assign(data.u.wstr.mWStringValue, data.u.wstr.mWStringLength);
880
case nsIDataType::VTYPE_WCHAR:
881
_retval.Assign(data.u.mWCharValue);
885
nsCAutoString tempCString;
886
nsresult rv = ToString(data, tempCString);
889
CopyASCIItoUTF16(tempCString, _retval);
895
/* static */ nsresult
896
nsVariant::ConvertToACString(const nsDiscriminatedUnion& data,
897
nsACString & _retval)
901
case nsIDataType::VTYPE_ASTRING:
902
case nsIDataType::VTYPE_DOMSTRING:
903
CopyUCS2toASCII(*data.u.mAStringValue, _retval);
905
case nsIDataType::VTYPE_CSTRING:
906
_retval.Assign(*data.u.mCStringValue);
908
case nsIDataType::VTYPE_UTF8STRING:
909
// XXX This is an extra copy that should be avoided
910
// once Jag lands support for UTF8String and associated
911
// conversion methods.
912
CopyUCS2toASCII(NS_ConvertUTF8toUCS2(*data.u.mUTF8StringValue),
915
case nsIDataType::VTYPE_CHAR_STR:
916
_retval.Assign(*data.u.str.mStringValue);
918
case nsIDataType::VTYPE_WCHAR_STR:
919
CopyUCS2toASCII(nsDependentString(data.u.wstr.mWStringValue),
922
case nsIDataType::VTYPE_STRING_SIZE_IS:
923
_retval.Assign(data.u.str.mStringValue, data.u.str.mStringLength);
925
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
926
CopyUCS2toASCII(nsDependentString(data.u.wstr.mWStringValue,
927
data.u.wstr.mWStringLength), _retval);
929
case nsIDataType::VTYPE_WCHAR:
931
const PRUnichar* str = &data.u.mWCharValue;
932
CopyUCS2toASCII(Substring(str, str + 1), _retval);
936
return ToString(data, _retval);
940
/* static */ nsresult
941
nsVariant::ConvertToAUTF8String(const nsDiscriminatedUnion& data,
942
nsAUTF8String & _retval)
946
case nsIDataType::VTYPE_ASTRING:
947
case nsIDataType::VTYPE_DOMSTRING:
948
CopyUTF16toUTF8(*data.u.mAStringValue, _retval);
950
case nsIDataType::VTYPE_CSTRING:
951
// XXX Extra copy, can be removed if we're sure CSTRING can
952
// only contain ASCII.
953
CopyUTF16toUTF8(NS_ConvertASCIItoUTF16(*data.u.mCStringValue),
956
case nsIDataType::VTYPE_UTF8STRING:
957
_retval.Assign(*data.u.mUTF8StringValue);
959
case nsIDataType::VTYPE_CHAR_STR:
960
// XXX Extra copy, can be removed if we're sure CHAR_STR can
961
// only contain ASCII.
962
CopyUTF16toUTF8(NS_ConvertASCIItoUTF16(data.u.str.mStringValue),
965
case nsIDataType::VTYPE_WCHAR_STR:
966
CopyUTF16toUTF8(data.u.wstr.mWStringValue, _retval);
968
case nsIDataType::VTYPE_STRING_SIZE_IS:
969
// XXX Extra copy, can be removed if we're sure CHAR_STR can
970
// only contain ASCII.
971
CopyUTF16toUTF8(NS_ConvertASCIItoUTF16(
972
nsDependentCString(data.u.str.mStringValue,
973
data.u.str.mStringLength)), _retval);
975
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
976
CopyUTF16toUTF8(nsDependentString(data.u.wstr.mWStringValue,
977
data.u.wstr.mWStringLength),
980
case nsIDataType::VTYPE_WCHAR:
982
const PRUnichar* str = &data.u.mWCharValue;
983
CopyUTF16toUTF8(Substring(str, str + 1), _retval);
988
nsCAutoString tempCString;
989
nsresult rv = ToString(data, tempCString);
992
// XXX Extra copy, can be removed if we're sure tempCString can
993
// only contain ASCII.
994
CopyUTF16toUTF8(NS_ConvertASCIItoUTF16(tempCString), _retval);
1000
/* static */ nsresult
1001
nsVariant::ConvertToString(const nsDiscriminatedUnion& data, char **_retval)
1004
return nsVariant::ConvertToStringWithSize(data, &ignored, _retval);
1007
/* static */ nsresult
1008
nsVariant::ConvertToWString(const nsDiscriminatedUnion& data, PRUnichar **_retval)
1011
return nsVariant::ConvertToWStringWithSize(data, &ignored, _retval);
1014
/* static */ nsresult
1015
nsVariant::ConvertToStringWithSize(const nsDiscriminatedUnion& data,
1016
PRUint32 *size, char **str)
1018
nsAutoString tempString;
1019
nsCAutoString tempCString;
1024
case nsIDataType::VTYPE_ASTRING:
1025
case nsIDataType::VTYPE_DOMSTRING:
1026
*size = data.u.mAStringValue->Length();
1027
*str = ToNewCString(*data.u.mAStringValue);
1029
case nsIDataType::VTYPE_CSTRING:
1030
*size = data.u.mCStringValue->Length();
1031
*str = ToNewCString(*data.u.mCStringValue);
1033
case nsIDataType::VTYPE_UTF8STRING:
1035
// XXX This is doing 1 extra copy. Need to fix this
1036
// when Jag lands UTF8String
1038
// *size = *data.mUTF8StringValue->Length();
1039
// *str = ToNewCString(*data.mUTF8StringValue);
1040
// But this will have to do for now.
1041
NS_ConvertUTF8toUCS2 tempString(*data.u.mUTF8StringValue);
1042
*size = tempString.Length();
1043
*str = ToNewCString(tempString);
1046
case nsIDataType::VTYPE_CHAR_STR:
1048
nsDependentCString cString(data.u.str.mStringValue);
1049
*size = cString.Length();
1050
*str = ToNewCString(cString);
1053
case nsIDataType::VTYPE_WCHAR_STR:
1055
nsDependentString string(data.u.wstr.mWStringValue);
1056
*size = string.Length();
1057
*str = ToNewCString(string);
1060
case nsIDataType::VTYPE_STRING_SIZE_IS:
1062
nsDependentCString cString(data.u.str.mStringValue,
1063
data.u.str.mStringLength);
1064
*size = cString.Length();
1065
*str = ToNewCString(cString);
1068
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
1070
nsDependentString string(data.u.wstr.mWStringValue,
1071
data.u.wstr.mWStringLength);
1072
*size = string.Length();
1073
*str = ToNewCString(string);
1076
case nsIDataType::VTYPE_WCHAR:
1077
tempString.Assign(data.u.mWCharValue);
1078
*size = tempString.Length();
1079
*str = ToNewCString(tempString);
1082
rv = ToString(data, tempCString);
1085
*size = tempCString.Length();
1086
*str = ToNewCString(tempCString);
1090
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
1092
/* static */ nsresult
1093
nsVariant::ConvertToWStringWithSize(const nsDiscriminatedUnion& data,
1094
PRUint32 *size, PRUnichar **str)
1096
nsAutoString tempString;
1097
nsCAutoString tempCString;
1102
case nsIDataType::VTYPE_ASTRING:
1103
case nsIDataType::VTYPE_DOMSTRING:
1104
*size = data.u.mAStringValue->Length();
1105
*str = ToNewUnicode(*data.u.mAStringValue);
1107
case nsIDataType::VTYPE_CSTRING:
1108
*size = data.u.mCStringValue->Length();
1109
*str = ToNewUnicode(*data.u.mCStringValue);
1111
case nsIDataType::VTYPE_UTF8STRING:
1113
*str = UTF8ToNewUnicode(*data.u.mUTF8StringValue, size);
1116
case nsIDataType::VTYPE_CHAR_STR:
1118
nsDependentCString cString(data.u.str.mStringValue);
1119
*size = cString.Length();
1120
*str = ToNewUnicode(cString);
1123
case nsIDataType::VTYPE_WCHAR_STR:
1125
nsDependentString string(data.u.wstr.mWStringValue);
1126
*size = string.Length();
1127
*str = ToNewUnicode(string);
1130
case nsIDataType::VTYPE_STRING_SIZE_IS:
1132
nsDependentCString cString(data.u.str.mStringValue,
1133
data.u.str.mStringLength);
1134
*size = cString.Length();
1135
*str = ToNewUnicode(cString);
1138
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
1140
nsDependentString string(data.u.wstr.mWStringValue,
1141
data.u.wstr.mWStringLength);
1142
*size = string.Length();
1143
*str = ToNewUnicode(string);
1146
case nsIDataType::VTYPE_WCHAR:
1147
tempString.Assign(data.u.mWCharValue);
1148
*size = tempString.Length();
1149
*str = ToNewUnicode(tempString);
1152
rv = ToString(data, tempCString);
1155
*size = tempCString.Length();
1156
*str = ToNewUnicode(tempCString);
1160
return *str ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
1163
/* static */ nsresult
1164
nsVariant::ConvertToISupports(const nsDiscriminatedUnion& data,
1165
nsISupports **_retval)
1169
case nsIDataType::VTYPE_INTERFACE:
1170
case nsIDataType::VTYPE_INTERFACE_IS:
1171
if (data.u.iface.mInterfaceValue) {
1172
return data.u.iface.mInterfaceValue->
1173
QueryInterface(NS_GET_IID(nsISupports), (void**)_retval);
1179
return NS_ERROR_CANNOT_CONVERT_DATA;
1183
/* static */ nsresult
1184
nsVariant::ConvertToInterface(const nsDiscriminatedUnion& data, nsIID * *iid,
1191
case nsIDataType::VTYPE_INTERFACE:
1192
piid = &NS_GET_IID(nsISupports);
1194
case nsIDataType::VTYPE_INTERFACE_IS:
1195
piid = &data.u.iface.mInterfaceID;
1198
return NS_ERROR_CANNOT_CONVERT_DATA;
1201
*iid = (nsIID*) nsMemory::Clone(piid, sizeof(nsIID));
1203
return NS_ERROR_OUT_OF_MEMORY;
1205
if (data.u.iface.mInterfaceValue) {
1206
return data.u.iface.mInterfaceValue->QueryInterface(*piid, iface);
1213
/* static */ nsresult
1214
nsVariant::ConvertToArray(const nsDiscriminatedUnion& data, PRUint16 *type,
1215
nsIID* iid, PRUint32 *count, void * *ptr)
1217
// XXX perhaps we'd like to add support for converting each of the various
1218
// types into an array containing one element of that type. We can leverage
1219
// CloneArray to do this if we want to support this.
1221
if(data.mType == nsIDataType::VTYPE_ARRAY)
1222
return CloneArray(data.u.array.mArrayType, &data.u.array.mArrayInterfaceID,
1223
data.u.array.mArrayCount, data.u.array.mArrayValue,
1224
type, iid, count, ptr);
1225
return NS_ERROR_CANNOT_CONVERT_DATA;
1228
/***************************************************************************/
1229
// static setter functions...
1231
#define DATA_SETTER_PROLOGUE(data_) \
1232
nsVariant::Cleanup(data_);
1234
#define DATA_SETTER_EPILOGUE(data_, type_) \
1235
data_->mType = nsIDataType :: type_; \
1238
#define DATA_SETTER(data_, type_, member_, value_) \
1239
DATA_SETTER_PROLOGUE(data_) \
1240
data_->u.member_ = value_; \
1241
DATA_SETTER_EPILOGUE(data_, type_)
1243
#define DATA_SETTER_WITH_CAST(data_, type_, member_, cast_, value_) \
1244
DATA_SETTER_PROLOGUE(data_) \
1245
data_->u.member_ = cast_ value_; \
1246
DATA_SETTER_EPILOGUE(data_, type_)
1249
/********************************************/
1251
#define CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(type_) \
1254
#define CASE__SET_FROM_VARIANT_VTYPE__GETTER(member_, name_) \
1255
rv = aValue->GetAs##name_ (&(data->u. member_ ));
1257
#define CASE__SET_FROM_VARIANT_VTYPE__GETTER_CAST(cast_, member_, name_) \
1258
rv = aValue->GetAs##name_ ( cast_ &(data->u. member_ ));
1260
#define CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(type_) \
1261
if(NS_SUCCEEDED(rv)) \
1263
data->mType = nsIDataType :: type_ ; \
1268
#define CASE__SET_FROM_VARIANT_TYPE(type_, member_, name_) \
1269
case nsIDataType :: type_ : \
1270
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(type_) \
1271
CASE__SET_FROM_VARIANT_VTYPE__GETTER(member_, name_) \
1272
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(type_)
1274
#define CASE__SET_FROM_VARIANT_VTYPE_CAST(type_, cast_, member_, name_) \
1275
case nsIDataType :: type_ : \
1276
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(type_) \
1277
CASE__SET_FROM_VARIANT_VTYPE__GETTER_CAST(cast_, member_, name_) \
1278
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(type_)
1281
/* static */ nsresult
1282
nsVariant::SetFromVariant(nsDiscriminatedUnion* data, nsIVariant* aValue)
1287
nsVariant::Cleanup(data);
1289
rv = aValue->GetDataType(&type);
1295
CASE__SET_FROM_VARIANT_VTYPE_CAST(VTYPE_INT8, (PRUint8*), mInt8Value,
1297
CASE__SET_FROM_VARIANT_TYPE(VTYPE_INT16, mInt16Value, Int16)
1298
CASE__SET_FROM_VARIANT_TYPE(VTYPE_INT32, mInt32Value, Int32)
1299
CASE__SET_FROM_VARIANT_TYPE(VTYPE_UINT8, mUint8Value, Uint8)
1300
CASE__SET_FROM_VARIANT_TYPE(VTYPE_UINT16, mUint16Value, Uint16)
1301
CASE__SET_FROM_VARIANT_TYPE(VTYPE_UINT32, mUint32Value, Uint32)
1302
CASE__SET_FROM_VARIANT_TYPE(VTYPE_FLOAT, mFloatValue, Float)
1303
CASE__SET_FROM_VARIANT_TYPE(VTYPE_DOUBLE, mDoubleValue, Double)
1304
CASE__SET_FROM_VARIANT_TYPE(VTYPE_BOOL , mBoolValue, Bool)
1305
CASE__SET_FROM_VARIANT_TYPE(VTYPE_CHAR, mCharValue, Char)
1306
CASE__SET_FROM_VARIANT_TYPE(VTYPE_WCHAR, mWCharValue, WChar)
1307
CASE__SET_FROM_VARIANT_TYPE(VTYPE_ID, mIDValue, ID)
1309
case nsIDataType::VTYPE_ASTRING:
1310
case nsIDataType::VTYPE_DOMSTRING:
1311
case nsIDataType::VTYPE_WCHAR_STR:
1312
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
1313
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_ASTRING);
1314
data->u.mAStringValue = new nsString();
1315
if(!data->u.mAStringValue)
1316
return NS_ERROR_OUT_OF_MEMORY;
1317
rv = aValue->GetAsAString(*data->u.mAStringValue);
1319
delete data->u.mAStringValue;
1320
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_ASTRING)
1322
case nsIDataType::VTYPE_CSTRING:
1323
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_CSTRING);
1324
data->u.mCStringValue = new nsCString();
1325
if(!data->u.mCStringValue)
1326
return NS_ERROR_OUT_OF_MEMORY;
1327
rv = aValue->GetAsACString(*data->u.mCStringValue);
1329
delete data->u.mCStringValue;
1330
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_CSTRING)
1332
case nsIDataType::VTYPE_UTF8STRING:
1333
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_UTF8STRING);
1334
data->u.mUTF8StringValue = new nsUTF8String();
1335
if(!data->u.mUTF8StringValue)
1336
return NS_ERROR_OUT_OF_MEMORY;
1337
rv = aValue->GetAsAUTF8String(*data->u.mUTF8StringValue);
1339
delete data->u.mUTF8StringValue;
1340
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_UTF8STRING)
1342
case nsIDataType::VTYPE_CHAR_STR:
1343
case nsIDataType::VTYPE_STRING_SIZE_IS:
1344
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_STRING_SIZE_IS);
1345
rv = aValue->GetAsStringWithSize(&data->u.str.mStringLength,
1346
&data->u.str.mStringValue);
1347
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_STRING_SIZE_IS)
1349
case nsIDataType::VTYPE_INTERFACE:
1350
case nsIDataType::VTYPE_INTERFACE_IS:
1351
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_INTERFACE_IS);
1352
// XXX This iid handling is ugly!
1354
rv = aValue->GetAsInterface(&iid, (void**)&data->u.iface.mInterfaceValue);
1355
if(NS_SUCCEEDED(rv))
1357
data->u.iface.mInterfaceID = *iid;
1358
nsMemory::Free((char*)iid);
1360
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_INTERFACE_IS)
1362
case nsIDataType::VTYPE_ARRAY:
1363
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_ARRAY);
1364
rv = aValue->GetAsArray(&data->u.array.mArrayType,
1365
&data->u.array.mArrayInterfaceID,
1366
&data->u.array.mArrayCount,
1367
&data->u.array.mArrayValue);
1368
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_ARRAY)
1370
case nsIDataType::VTYPE_VOID:
1371
rv = nsVariant::SetToVoid(data);
1373
case nsIDataType::VTYPE_EMPTY_ARRAY:
1374
rv = nsVariant::SetToEmptyArray(data);
1376
case nsIDataType::VTYPE_EMPTY:
1377
rv = nsVariant::SetToEmpty(data);
1380
NS_ERROR("bad type in variant!");
1381
rv = NS_ERROR_FAILURE;
1387
/* static */ nsresult
1388
nsVariant::SetFromInt8(nsDiscriminatedUnion* data, PRUint8 aValue)
1390
DATA_SETTER_WITH_CAST(data, VTYPE_INT8, mInt8Value, (PRUint8), aValue)
1392
/* static */ nsresult
1393
nsVariant::SetFromInt16(nsDiscriminatedUnion* data, PRInt16 aValue)
1395
DATA_SETTER(data, VTYPE_INT16, mInt16Value, aValue)
1397
/* static */ nsresult
1398
nsVariant::SetFromInt32(nsDiscriminatedUnion* data, PRInt32 aValue)
1400
DATA_SETTER(data, VTYPE_INT32, mInt32Value, aValue)
1402
/* static */ nsresult
1403
nsVariant::SetFromInt64(nsDiscriminatedUnion* data, PRInt64 aValue)
1405
DATA_SETTER(data, VTYPE_INT64, mInt64Value, aValue)
1407
/* static */ nsresult
1408
nsVariant::SetFromUint8(nsDiscriminatedUnion* data, PRUint8 aValue)
1410
DATA_SETTER(data, VTYPE_UINT8, mUint8Value, aValue)
1412
/* static */ nsresult
1413
nsVariant::SetFromUint16(nsDiscriminatedUnion* data, PRUint16 aValue)
1415
DATA_SETTER(data, VTYPE_UINT16, mUint16Value, aValue)
1417
/* static */ nsresult
1418
nsVariant::SetFromUint32(nsDiscriminatedUnion* data, PRUint32 aValue)
1420
DATA_SETTER(data, VTYPE_UINT32, mUint32Value, aValue)
1422
/* static */ nsresult
1423
nsVariant::SetFromUint64(nsDiscriminatedUnion* data, PRUint64 aValue)
1425
DATA_SETTER(data, VTYPE_UINT64, mUint64Value, aValue)
1427
/* static */ nsresult
1428
nsVariant::SetFromFloat(nsDiscriminatedUnion* data, float aValue)
1430
DATA_SETTER(data, VTYPE_FLOAT, mFloatValue, aValue)
1432
/* static */ nsresult
1433
nsVariant::SetFromDouble(nsDiscriminatedUnion* data, double aValue)
1435
DATA_SETTER(data, VTYPE_DOUBLE, mDoubleValue, aValue)
1437
/* static */ nsresult
1438
nsVariant::SetFromBool(nsDiscriminatedUnion* data, PRBool aValue)
1440
DATA_SETTER(data, VTYPE_BOOL, mBoolValue, aValue)
1442
/* static */ nsresult
1443
nsVariant::SetFromChar(nsDiscriminatedUnion* data, char aValue)
1445
DATA_SETTER(data, VTYPE_CHAR, mCharValue, aValue)
1447
/* static */ nsresult
1448
nsVariant::SetFromWChar(nsDiscriminatedUnion* data, PRUnichar aValue)
1450
DATA_SETTER(data, VTYPE_WCHAR, mWCharValue, aValue)
1452
/* static */ nsresult
1453
nsVariant::SetFromID(nsDiscriminatedUnion* data, const nsID & aValue)
1455
DATA_SETTER(data, VTYPE_ID, mIDValue, aValue)
1457
/* static */ nsresult
1458
nsVariant::SetFromAString(nsDiscriminatedUnion* data, const nsAString & aValue)
1460
DATA_SETTER_PROLOGUE(data);
1461
if(!(data->u.mAStringValue = new nsString(aValue)))
1462
return NS_ERROR_OUT_OF_MEMORY;
1463
DATA_SETTER_EPILOGUE(data, VTYPE_ASTRING);
1466
/* static */ nsresult
1467
nsVariant::SetFromACString(nsDiscriminatedUnion* data,
1468
const nsACString & aValue)
1470
DATA_SETTER_PROLOGUE(data);
1471
if(!(data->u.mCStringValue = new nsCString(aValue)))
1472
return NS_ERROR_OUT_OF_MEMORY;
1473
DATA_SETTER_EPILOGUE(data, VTYPE_CSTRING);
1476
/* static */ nsresult
1477
nsVariant::SetFromAUTF8String(nsDiscriminatedUnion* data,
1478
const nsAUTF8String & aValue)
1480
DATA_SETTER_PROLOGUE(data);
1481
if(!(data->u.mUTF8StringValue = new nsUTF8String(aValue)))
1482
return NS_ERROR_OUT_OF_MEMORY;
1483
DATA_SETTER_EPILOGUE(data, VTYPE_UTF8STRING);
1486
/* static */ nsresult
1487
nsVariant::SetFromString(nsDiscriminatedUnion* data, const char *aValue)
1489
DATA_SETTER_PROLOGUE(data);
1491
return NS_ERROR_NULL_POINTER;
1492
return SetFromStringWithSize(data, strlen(aValue), aValue);
1494
/* static */ nsresult
1495
nsVariant::SetFromWString(nsDiscriminatedUnion* data, const PRUnichar *aValue)
1497
DATA_SETTER_PROLOGUE(data);
1499
return NS_ERROR_NULL_POINTER;
1500
return SetFromWStringWithSize(data, nsCRT::strlen(aValue), aValue);
1502
/* static */ nsresult
1503
nsVariant::SetFromISupports(nsDiscriminatedUnion* data, nsISupports *aValue)
1505
return SetFromInterface(data, NS_GET_IID(nsISupports), aValue);
1507
/* static */ nsresult
1508
nsVariant::SetFromInterface(nsDiscriminatedUnion* data, const nsIID& iid,
1509
nsISupports *aValue)
1511
DATA_SETTER_PROLOGUE(data);
1512
NS_IF_ADDREF(aValue);
1513
data->u.iface.mInterfaceValue = aValue;
1514
data->u.iface.mInterfaceID = iid;
1515
DATA_SETTER_EPILOGUE(data, VTYPE_INTERFACE_IS);
1517
/* static */ nsresult
1518
nsVariant::SetFromArray(nsDiscriminatedUnion* data, PRUint16 type,
1519
const nsIID* iid, PRUint32 count, void * aValue)
1521
DATA_SETTER_PROLOGUE(data);
1522
if(!aValue || !count)
1523
return NS_ERROR_NULL_POINTER;
1525
nsresult rv = CloneArray(type, iid, count, aValue,
1526
&data->u.array.mArrayType,
1527
&data->u.array.mArrayInterfaceID,
1528
&data->u.array.mArrayCount,
1529
&data->u.array.mArrayValue);
1532
DATA_SETTER_EPILOGUE(data, VTYPE_ARRAY);
1534
/* static */ nsresult
1535
nsVariant::SetFromStringWithSize(nsDiscriminatedUnion* data, PRUint32 size, const char *aValue)
1537
DATA_SETTER_PROLOGUE(data);
1539
return NS_ERROR_NULL_POINTER;
1540
if(!(data->u.str.mStringValue =
1541
(char*) nsMemory::Clone(aValue, (size+1)*sizeof(char))))
1542
return NS_ERROR_OUT_OF_MEMORY;
1543
data->u.str.mStringLength = size;
1544
DATA_SETTER_EPILOGUE(data, VTYPE_STRING_SIZE_IS);
1546
/* static */ nsresult
1547
nsVariant::SetFromWStringWithSize(nsDiscriminatedUnion* data, PRUint32 size, const PRUnichar *aValue)
1549
DATA_SETTER_PROLOGUE(data);
1551
return NS_ERROR_NULL_POINTER;
1552
if(!(data->u.wstr.mWStringValue =
1553
(PRUnichar*) nsMemory::Clone(aValue, (size+1)*sizeof(PRUnichar))))
1554
return NS_ERROR_OUT_OF_MEMORY;
1555
data->u.wstr.mWStringLength = size;
1556
DATA_SETTER_EPILOGUE(data, VTYPE_WSTRING_SIZE_IS);
1558
/* static */ nsresult
1559
nsVariant::SetToVoid(nsDiscriminatedUnion* data)
1561
DATA_SETTER_PROLOGUE(data);
1562
DATA_SETTER_EPILOGUE(data, VTYPE_VOID);
1564
/* static */ nsresult
1565
nsVariant::SetToEmpty(nsDiscriminatedUnion* data)
1567
DATA_SETTER_PROLOGUE(data);
1568
DATA_SETTER_EPILOGUE(data, VTYPE_EMPTY);
1570
/* static */ nsresult
1571
nsVariant::SetToEmptyArray(nsDiscriminatedUnion* data)
1573
DATA_SETTER_PROLOGUE(data);
1574
DATA_SETTER_EPILOGUE(data, VTYPE_EMPTY_ARRAY);
1577
/***************************************************************************/
1579
/* static */ nsresult
1580
nsVariant::Initialize(nsDiscriminatedUnion* data)
1582
data->mType = nsIDataType::VTYPE_EMPTY;
1586
/* static */ nsresult
1587
nsVariant::Cleanup(nsDiscriminatedUnion* data)
1591
case nsIDataType::VTYPE_INT8:
1592
case nsIDataType::VTYPE_INT16:
1593
case nsIDataType::VTYPE_INT32:
1594
case nsIDataType::VTYPE_INT64:
1595
case nsIDataType::VTYPE_UINT8:
1596
case nsIDataType::VTYPE_UINT16:
1597
case nsIDataType::VTYPE_UINT32:
1598
case nsIDataType::VTYPE_UINT64:
1599
case nsIDataType::VTYPE_FLOAT:
1600
case nsIDataType::VTYPE_DOUBLE:
1601
case nsIDataType::VTYPE_BOOL:
1602
case nsIDataType::VTYPE_CHAR:
1603
case nsIDataType::VTYPE_WCHAR:
1604
case nsIDataType::VTYPE_VOID:
1605
case nsIDataType::VTYPE_ID:
1607
case nsIDataType::VTYPE_ASTRING:
1608
case nsIDataType::VTYPE_DOMSTRING:
1609
delete data->u.mAStringValue;
1611
case nsIDataType::VTYPE_CSTRING:
1612
delete data->u.mCStringValue;
1614
case nsIDataType::VTYPE_UTF8STRING:
1615
delete data->u.mUTF8StringValue;
1617
case nsIDataType::VTYPE_CHAR_STR:
1618
case nsIDataType::VTYPE_STRING_SIZE_IS:
1619
nsMemory::Free((char*)data->u.str.mStringValue);
1621
case nsIDataType::VTYPE_WCHAR_STR:
1622
case nsIDataType::VTYPE_WSTRING_SIZE_IS:
1623
nsMemory::Free((char*)data->u.wstr.mWStringValue);
1625
case nsIDataType::VTYPE_INTERFACE:
1626
case nsIDataType::VTYPE_INTERFACE_IS:
1627
NS_IF_RELEASE(data->u.iface.mInterfaceValue);
1629
case nsIDataType::VTYPE_ARRAY:
1632
case nsIDataType::VTYPE_EMPTY_ARRAY:
1633
case nsIDataType::VTYPE_EMPTY:
1636
NS_ERROR("bad type in variant!");
1640
data->mType = nsIDataType::VTYPE_EMPTY;
1644
/***************************************************************************/
1645
/***************************************************************************/
1648
NS_IMPL_ISUPPORTS2(nsVariant, nsIVariant, nsIWritableVariant)
1650
nsVariant::nsVariant()
1651
: mWritable(PR_TRUE)
1653
nsVariant::Initialize(&mData);
1657
// Assert that the nsIDataType consts match the values #defined in
1658
// xpt_struct.h. Bad things happen somewhere if they don't.
1659
struct THE_TYPES {PRUint16 a; PRUint16 b;};
1660
static const THE_TYPES array[] = {
1661
{nsIDataType::VTYPE_INT8 , TD_INT8 },
1662
{nsIDataType::VTYPE_INT16 , TD_INT16 },
1663
{nsIDataType::VTYPE_INT32 , TD_INT32 },
1664
{nsIDataType::VTYPE_INT64 , TD_INT64 },
1665
{nsIDataType::VTYPE_UINT8 , TD_UINT8 },
1666
{nsIDataType::VTYPE_UINT16 , TD_UINT16 },
1667
{nsIDataType::VTYPE_UINT32 , TD_UINT32 },
1668
{nsIDataType::VTYPE_UINT64 , TD_UINT64 },
1669
{nsIDataType::VTYPE_FLOAT , TD_FLOAT },
1670
{nsIDataType::VTYPE_DOUBLE , TD_DOUBLE },
1671
{nsIDataType::VTYPE_BOOL , TD_BOOL },
1672
{nsIDataType::VTYPE_CHAR , TD_CHAR },
1673
{nsIDataType::VTYPE_WCHAR , TD_WCHAR },
1674
{nsIDataType::VTYPE_VOID , TD_VOID },
1675
{nsIDataType::VTYPE_ID , TD_PNSIID },
1676
{nsIDataType::VTYPE_DOMSTRING , TD_DOMSTRING },
1677
{nsIDataType::VTYPE_CHAR_STR , TD_PSTRING },
1678
{nsIDataType::VTYPE_WCHAR_STR , TD_PWSTRING },
1679
{nsIDataType::VTYPE_INTERFACE , TD_INTERFACE_TYPE },
1680
{nsIDataType::VTYPE_INTERFACE_IS , TD_INTERFACE_IS_TYPE},
1681
{nsIDataType::VTYPE_ARRAY , TD_ARRAY },
1682
{nsIDataType::VTYPE_STRING_SIZE_IS , TD_PSTRING_SIZE_IS },
1683
{nsIDataType::VTYPE_WSTRING_SIZE_IS , TD_PWSTRING_SIZE_IS },
1684
{nsIDataType::VTYPE_UTF8STRING , TD_UTF8STRING },
1685
{nsIDataType::VTYPE_CSTRING , TD_CSTRING },
1686
{nsIDataType::VTYPE_ASTRING , TD_ASTRING }
1688
static const int length = sizeof(array)/sizeof(array[0]);
1689
static PRBool inited = PR_FALSE;
1692
for(int i = 0; i < length; i++)
1693
NS_ASSERTION(array[i].a == array[i].b, "bad const declaration");
1700
nsVariant::~nsVariant()
1702
nsVariant::Cleanup(&mData);
1705
// For all the data getters we just forward to the static (and sharable)
1706
// 'ConvertTo' functions.
1708
/* readonly attribute PRUint16 dataType; */
1709
NS_IMETHODIMP nsVariant::GetDataType(PRUint16 *aDataType)
1711
*aDataType = mData.mType;
1715
/* PRUint8 getAsInt8 (); */
1716
NS_IMETHODIMP nsVariant::GetAsInt8(PRUint8 *_retval)
1718
return nsVariant::ConvertToInt8(mData, _retval);
1721
/* PRInt16 getAsInt16 (); */
1722
NS_IMETHODIMP nsVariant::GetAsInt16(PRInt16 *_retval)
1724
return nsVariant::ConvertToInt16(mData, _retval);
1727
/* PRInt32 getAsInt32 (); */
1728
NS_IMETHODIMP nsVariant::GetAsInt32(PRInt32 *_retval)
1730
return nsVariant::ConvertToInt32(mData, _retval);
1733
/* PRInt64 getAsInt64 (); */
1734
NS_IMETHODIMP nsVariant::GetAsInt64(PRInt64 *_retval)
1736
return nsVariant::ConvertToInt64(mData, _retval);
1739
/* PRUint8 getAsUint8 (); */
1740
NS_IMETHODIMP nsVariant::GetAsUint8(PRUint8 *_retval)
1742
return nsVariant::ConvertToUint8(mData, _retval);
1745
/* PRUint16 getAsUint16 (); */
1746
NS_IMETHODIMP nsVariant::GetAsUint16(PRUint16 *_retval)
1748
return nsVariant::ConvertToUint16(mData, _retval);
1751
/* PRUint32 getAsUint32 (); */
1752
NS_IMETHODIMP nsVariant::GetAsUint32(PRUint32 *_retval)
1754
return nsVariant::ConvertToUint32(mData, _retval);
1757
/* PRUint64 getAsUint64 (); */
1758
NS_IMETHODIMP nsVariant::GetAsUint64(PRUint64 *_retval)
1760
return nsVariant::ConvertToUint64(mData, _retval);
1763
/* float getAsFloat (); */
1764
NS_IMETHODIMP nsVariant::GetAsFloat(float *_retval)
1766
return nsVariant::ConvertToFloat(mData, _retval);
1769
/* double getAsDouble (); */
1770
NS_IMETHODIMP nsVariant::GetAsDouble(double *_retval)
1772
return nsVariant::ConvertToDouble(mData, _retval);
1775
/* PRBool getAsBool (); */
1776
NS_IMETHODIMP nsVariant::GetAsBool(PRBool *_retval)
1778
return nsVariant::ConvertToBool(mData, _retval);
1781
/* char getAsChar (); */
1782
NS_IMETHODIMP nsVariant::GetAsChar(char *_retval)
1784
return nsVariant::ConvertToChar(mData, _retval);
1787
/* wchar getAsWChar (); */
1788
NS_IMETHODIMP nsVariant::GetAsWChar(PRUnichar *_retval)
1790
return nsVariant::ConvertToWChar(mData, _retval);
1793
/* [notxpcom] nsresult getAsID (out nsID retval); */
1794
NS_IMETHODIMP_(nsresult) nsVariant::GetAsID(nsID *retval)
1796
return nsVariant::ConvertToID(mData, retval);
1799
/* AString getAsAString (); */
1800
NS_IMETHODIMP nsVariant::GetAsAString(nsAString & _retval)
1802
return nsVariant::ConvertToAString(mData, _retval);
1805
/* DOMString getAsDOMString (); */
1806
NS_IMETHODIMP nsVariant::GetAsDOMString(nsAString & _retval)
1808
// A DOMString maps to an AString internally, so we can re-use
1809
// ConvertToAString here.
1810
return nsVariant::ConvertToAString(mData, _retval);
1813
/* ACString getAsACString (); */
1814
NS_IMETHODIMP nsVariant::GetAsACString(nsACString & _retval)
1816
return nsVariant::ConvertToACString(mData, _retval);
1819
/* AUTF8String getAsAUTF8String (); */
1820
NS_IMETHODIMP nsVariant::GetAsAUTF8String(nsAUTF8String & _retval)
1822
return nsVariant::ConvertToAUTF8String(mData, _retval);
1825
/* string getAsString (); */
1826
NS_IMETHODIMP nsVariant::GetAsString(char **_retval)
1828
return nsVariant::ConvertToString(mData, _retval);
1831
/* wstring getAsWString (); */
1832
NS_IMETHODIMP nsVariant::GetAsWString(PRUnichar **_retval)
1834
return nsVariant::ConvertToWString(mData, _retval);
1837
/* nsISupports getAsISupports (); */
1838
NS_IMETHODIMP nsVariant::GetAsISupports(nsISupports **_retval)
1840
return nsVariant::ConvertToISupports(mData, _retval);
1843
/* void getAsInterface (out nsIIDPtr iid, [iid_is (iid), retval] out nsQIResult iface); */
1844
NS_IMETHODIMP nsVariant::GetAsInterface(nsIID * *iid, void * *iface)
1846
return nsVariant::ConvertToInterface(mData, iid, iface);
1849
/* [notxpcom] nsresult getAsArray (out PRUint16 type, out nsIID iid, out PRUint32 count, out voidPtr ptr); */
1850
NS_IMETHODIMP_(nsresult) nsVariant::GetAsArray(PRUint16 *type, nsIID *iid, PRUint32 *count, void * *ptr)
1852
return nsVariant::ConvertToArray(mData, type, iid, count, ptr);
1855
/* void getAsStringWithSize (out PRUint32 size, [size_is (size), retval] out string str); */
1856
NS_IMETHODIMP nsVariant::GetAsStringWithSize(PRUint32 *size, char **str)
1858
return nsVariant::ConvertToStringWithSize(mData, size, str);
1861
/* void getAsWStringWithSize (out PRUint32 size, [size_is (size), retval] out wstring str); */
1862
NS_IMETHODIMP nsVariant::GetAsWStringWithSize(PRUint32 *size, PRUnichar **str)
1864
return nsVariant::ConvertToWStringWithSize(mData, size, str);
1867
/***************************************************************************/
1869
/* attribute PRBool writable; */
1870
NS_IMETHODIMP nsVariant::GetWritable(PRBool *aWritable)
1872
*aWritable = mWritable;
1875
NS_IMETHODIMP nsVariant::SetWritable(PRBool aWritable)
1877
if(!mWritable && aWritable)
1878
return NS_ERROR_FAILURE;
1879
mWritable = aWritable;
1883
/***************************************************************************/
1885
// For all the data setters we just forward to the static (and sharable)
1886
// 'SetFrom' functions.
1888
/* void setAsInt8 (in PRUint8 aValue); */
1889
NS_IMETHODIMP nsVariant::SetAsInt8(PRUint8 aValue)
1891
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1892
return nsVariant::SetFromInt8(&mData, aValue);
1895
/* void setAsInt16 (in PRInt16 aValue); */
1896
NS_IMETHODIMP nsVariant::SetAsInt16(PRInt16 aValue)
1898
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1899
return nsVariant::SetFromInt16(&mData, aValue);
1902
/* void setAsInt32 (in PRInt32 aValue); */
1903
NS_IMETHODIMP nsVariant::SetAsInt32(PRInt32 aValue)
1905
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1906
return nsVariant::SetFromInt32(&mData, aValue);
1909
/* void setAsInt64 (in PRInt64 aValue); */
1910
NS_IMETHODIMP nsVariant::SetAsInt64(PRInt64 aValue)
1912
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1913
return nsVariant::SetFromInt64(&mData, aValue);
1916
/* void setAsUint8 (in PRUint8 aValue); */
1917
NS_IMETHODIMP nsVariant::SetAsUint8(PRUint8 aValue)
1919
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1920
return nsVariant::SetFromUint8(&mData, aValue);
1923
/* void setAsUint16 (in PRUint16 aValue); */
1924
NS_IMETHODIMP nsVariant::SetAsUint16(PRUint16 aValue)
1926
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1927
return nsVariant::SetFromUint16(&mData, aValue);
1930
/* void setAsUint32 (in PRUint32 aValue); */
1931
NS_IMETHODIMP nsVariant::SetAsUint32(PRUint32 aValue)
1933
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1934
return nsVariant::SetFromUint32(&mData, aValue);
1937
/* void setAsUint64 (in PRUint64 aValue); */
1938
NS_IMETHODIMP nsVariant::SetAsUint64(PRUint64 aValue)
1940
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1941
return nsVariant::SetFromUint64(&mData, aValue);
1944
/* void setAsFloat (in float aValue); */
1945
NS_IMETHODIMP nsVariant::SetAsFloat(float aValue)
1947
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1948
return nsVariant::SetFromFloat(&mData, aValue);
1951
/* void setAsDouble (in double aValue); */
1952
NS_IMETHODIMP nsVariant::SetAsDouble(double aValue)
1954
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1955
return nsVariant::SetFromDouble(&mData, aValue);
1958
/* void setAsBool (in PRBool aValue); */
1959
NS_IMETHODIMP nsVariant::SetAsBool(PRBool aValue)
1961
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1962
return nsVariant::SetFromBool(&mData, aValue);
1965
/* void setAsChar (in char aValue); */
1966
NS_IMETHODIMP nsVariant::SetAsChar(char aValue)
1968
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1969
return nsVariant::SetFromChar(&mData, aValue);
1972
/* void setAsWChar (in wchar aValue); */
1973
NS_IMETHODIMP nsVariant::SetAsWChar(PRUnichar aValue)
1975
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1976
return nsVariant::SetFromWChar(&mData, aValue);
1979
/* void setAsID (in nsIDRef aValue); */
1980
NS_IMETHODIMP nsVariant::SetAsID(const nsID & aValue)
1982
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1983
return nsVariant::SetFromID(&mData, aValue);
1986
/* void setAsAString (in AString aValue); */
1987
NS_IMETHODIMP nsVariant::SetAsAString(const nsAString & aValue)
1989
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1990
return nsVariant::SetFromAString(&mData, aValue);
1993
/* void setAsDOMString (in DOMString aValue); */
1994
NS_IMETHODIMP nsVariant::SetAsDOMString(const nsAString & aValue)
1996
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
1998
// A DOMString maps to an AString internally, so we can re-use
1999
// SetFromAString here.
2000
return nsVariant::SetFromAString(&mData, aValue);
2003
/* void setAsACString (in ACString aValue); */
2004
NS_IMETHODIMP nsVariant::SetAsACString(const nsACString & aValue)
2006
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2007
return nsVariant::SetFromACString(&mData, aValue);
2010
/* void setAsAUTF8String (in AUTF8String aValue); */
2011
NS_IMETHODIMP nsVariant::SetAsAUTF8String(const nsAUTF8String & aValue)
2013
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2014
return nsVariant::SetFromAUTF8String(&mData, aValue);
2017
/* void setAsString (in string aValue); */
2018
NS_IMETHODIMP nsVariant::SetAsString(const char *aValue)
2020
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2021
return nsVariant::SetFromString(&mData, aValue);
2024
/* void setAsWString (in wstring aValue); */
2025
NS_IMETHODIMP nsVariant::SetAsWString(const PRUnichar *aValue)
2027
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2028
return nsVariant::SetFromWString(&mData, aValue);
2031
/* void setAsISupports (in nsISupports aValue); */
2032
NS_IMETHODIMP nsVariant::SetAsISupports(nsISupports *aValue)
2034
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2035
return nsVariant::SetFromISupports(&mData, aValue);
2038
/* void setAsInterface (in nsIIDRef iid, [iid_is (iid)] in nsQIResult iface); */
2039
NS_IMETHODIMP nsVariant::SetAsInterface(const nsIID & iid, void * iface)
2041
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2042
return nsVariant::SetFromInterface(&mData, iid, (nsISupports*)iface);
2045
/* [noscript] void setAsArray (in PRUint16 type, in nsIIDPtr iid, in PRUint32 count, in voidPtr ptr); */
2046
NS_IMETHODIMP nsVariant::SetAsArray(PRUint16 type, const nsIID * iid, PRUint32 count, void * ptr)
2048
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2049
return nsVariant::SetFromArray(&mData, type, iid, count, ptr);
2052
/* void setAsStringWithSize (in PRUint32 size, [size_is (size)] in string str); */
2053
NS_IMETHODIMP nsVariant::SetAsStringWithSize(PRUint32 size, const char *str)
2055
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2056
return nsVariant::SetFromStringWithSize(&mData, size, str);
2059
/* void setAsWStringWithSize (in PRUint32 size, [size_is (size)] in wstring str); */
2060
NS_IMETHODIMP nsVariant::SetAsWStringWithSize(PRUint32 size, const PRUnichar *str)
2062
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2063
return nsVariant::SetFromWStringWithSize(&mData, size, str);
2066
/* void setAsVoid (); */
2067
NS_IMETHODIMP nsVariant::SetAsVoid()
2069
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2070
return nsVariant::SetToVoid(&mData);
2073
/* void setAsEmpty (); */
2074
NS_IMETHODIMP nsVariant::SetAsEmpty()
2076
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2077
return nsVariant::SetToEmpty(&mData);
2080
/* void setAsEmptyArray (); */
2081
NS_IMETHODIMP nsVariant::SetAsEmptyArray()
2083
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2084
return nsVariant::SetToEmptyArray(&mData);
2087
/* void setFromVariant (in nsIVariant aValue); */
2088
NS_IMETHODIMP nsVariant::SetFromVariant(nsIVariant *aValue)
2090
if(!mWritable) return NS_ERROR_OBJECT_IS_IMMUTABLE;
2091
return nsVariant::SetFromVariant(&mData, aValue);