michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* The long avoided variant support for xpcom. */ michael@0: michael@0: #ifndef nsVariant_h michael@0: #define nsVariant_h michael@0: michael@0: #include "nsIVariant.h" michael@0: #include "nsStringFwd.h" michael@0: #include "mozilla/Attributes.h" michael@0: michael@0: class nsCycleCollectionTraversalCallback; michael@0: michael@0: /** michael@0: * Map the nsAUTF8String, nsUTF8String classes to the nsACString and michael@0: * nsCString classes respectively for now. These defines need to be removed michael@0: * once Jag lands his nsUTF8String implementation. michael@0: */ michael@0: #define nsAUTF8String nsACString michael@0: #define nsUTF8String nsCString michael@0: #define PromiseFlatUTF8String PromiseFlatCString michael@0: michael@0: /** michael@0: * nsDiscriminatedUnion is a type that nsIVariant implementors *may* use michael@0: * to hold underlying data. It has no methods. So, its use requires no linkage michael@0: * to the xpcom module. michael@0: */ michael@0: michael@0: struct nsDiscriminatedUnion michael@0: { michael@0: union { michael@0: int8_t mInt8Value; michael@0: int16_t mInt16Value; michael@0: int32_t mInt32Value; michael@0: int64_t mInt64Value; michael@0: uint8_t mUint8Value; michael@0: uint16_t mUint16Value; michael@0: uint32_t mUint32Value; michael@0: uint64_t mUint64Value; michael@0: float mFloatValue; michael@0: double mDoubleValue; michael@0: bool mBoolValue; michael@0: char mCharValue; michael@0: char16_t mWCharValue; michael@0: nsIID mIDValue; michael@0: nsAString* mAStringValue; michael@0: nsAUTF8String* mUTF8StringValue; michael@0: nsACString* mCStringValue; michael@0: struct { michael@0: nsISupports* mInterfaceValue; michael@0: nsIID mInterfaceID; michael@0: } iface; michael@0: struct { michael@0: nsIID mArrayInterfaceID; michael@0: void* mArrayValue; michael@0: uint32_t mArrayCount; michael@0: uint16_t mArrayType; michael@0: } array; michael@0: struct { michael@0: char* mStringValue; michael@0: uint32_t mStringLength; michael@0: } str; michael@0: struct { michael@0: char16_t* mWStringValue; michael@0: uint32_t mWStringLength; michael@0: } wstr; michael@0: } u; michael@0: uint16_t mType; michael@0: }; michael@0: michael@0: /** michael@0: * nsVariant implements the generic variant support. The xpcom module registers michael@0: * a factory (see NS_VARIANT_CONTRACTID in nsIVariant.idl) that will create michael@0: * these objects. They are created 'empty' and 'writable'. michael@0: * michael@0: * nsIVariant users won't usually need to see this class. michael@0: * michael@0: * This class also has static helper methods that nsIVariant *implementors* can michael@0: * use to help them do all the 'standard' nsIVariant data conversions. michael@0: */ michael@0: michael@0: class nsVariant MOZ_FINAL : public nsIWritableVariant michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS michael@0: NS_DECL_NSIVARIANT michael@0: NS_DECL_NSIWRITABLEVARIANT michael@0: michael@0: nsVariant(); michael@0: michael@0: static nsresult Initialize(nsDiscriminatedUnion* data); michael@0: static nsresult Cleanup(nsDiscriminatedUnion* data); michael@0: michael@0: static nsresult ConvertToInt8(const nsDiscriminatedUnion& data, uint8_t *_retval); michael@0: static nsresult ConvertToInt16(const nsDiscriminatedUnion& data, int16_t *_retval); michael@0: static nsresult ConvertToInt32(const nsDiscriminatedUnion& data, int32_t *_retval); michael@0: static nsresult ConvertToInt64(const nsDiscriminatedUnion& data, int64_t *_retval); michael@0: static nsresult ConvertToUint8(const nsDiscriminatedUnion& data, uint8_t *_retval); michael@0: static nsresult ConvertToUint16(const nsDiscriminatedUnion& data, uint16_t *_retval); michael@0: static nsresult ConvertToUint32(const nsDiscriminatedUnion& data, uint32_t *_retval); michael@0: static nsresult ConvertToUint64(const nsDiscriminatedUnion& data, uint64_t *_retval); michael@0: static nsresult ConvertToFloat(const nsDiscriminatedUnion& data, float *_retval); michael@0: static nsresult ConvertToDouble(const nsDiscriminatedUnion& data, double *_retval); michael@0: static nsresult ConvertToBool(const nsDiscriminatedUnion& data, bool *_retval); michael@0: static nsresult ConvertToChar(const nsDiscriminatedUnion& data, char *_retval); michael@0: static nsresult ConvertToWChar(const nsDiscriminatedUnion& data, char16_t *_retval); michael@0: static nsresult ConvertToID(const nsDiscriminatedUnion& data, nsID * _retval); michael@0: static nsresult ConvertToAString(const nsDiscriminatedUnion& data, nsAString & _retval); michael@0: static nsresult ConvertToAUTF8String(const nsDiscriminatedUnion& data, nsAUTF8String & _retval); michael@0: static nsresult ConvertToACString(const nsDiscriminatedUnion& data, nsACString & _retval); michael@0: static nsresult ConvertToString(const nsDiscriminatedUnion& data, char **_retval); michael@0: static nsresult ConvertToWString(const nsDiscriminatedUnion& data, char16_t **_retval); michael@0: static nsresult ConvertToISupports(const nsDiscriminatedUnion& data, nsISupports **_retval); michael@0: static nsresult ConvertToInterface(const nsDiscriminatedUnion& data, nsIID * *iid, void * *iface); michael@0: static nsresult ConvertToArray(const nsDiscriminatedUnion& data, uint16_t *type, nsIID* iid, uint32_t *count, void * *ptr); michael@0: static nsresult ConvertToStringWithSize(const nsDiscriminatedUnion& data, uint32_t *size, char **str); michael@0: static nsresult ConvertToWStringWithSize(const nsDiscriminatedUnion& data, uint32_t *size, char16_t **str); michael@0: michael@0: static nsresult SetFromVariant(nsDiscriminatedUnion* data, nsIVariant* aValue); michael@0: michael@0: static nsresult SetFromInt8(nsDiscriminatedUnion* data, uint8_t aValue); michael@0: static nsresult SetFromInt16(nsDiscriminatedUnion* data, int16_t aValue); michael@0: static nsresult SetFromInt32(nsDiscriminatedUnion* data, int32_t aValue); michael@0: static nsresult SetFromInt64(nsDiscriminatedUnion* data, int64_t aValue); michael@0: static nsresult SetFromUint8(nsDiscriminatedUnion* data, uint8_t aValue); michael@0: static nsresult SetFromUint16(nsDiscriminatedUnion* data, uint16_t aValue); michael@0: static nsresult SetFromUint32(nsDiscriminatedUnion* data, uint32_t aValue); michael@0: static nsresult SetFromUint64(nsDiscriminatedUnion* data, uint64_t aValue); michael@0: static nsresult SetFromFloat(nsDiscriminatedUnion* data, float aValue); michael@0: static nsresult SetFromDouble(nsDiscriminatedUnion* data, double aValue); michael@0: static nsresult SetFromBool(nsDiscriminatedUnion* data, bool aValue); michael@0: static nsresult SetFromChar(nsDiscriminatedUnion* data, char aValue); michael@0: static nsresult SetFromWChar(nsDiscriminatedUnion* data, char16_t aValue); michael@0: static nsresult SetFromID(nsDiscriminatedUnion* data, const nsID & aValue); michael@0: static nsresult SetFromAString(nsDiscriminatedUnion* data, const nsAString & aValue); michael@0: static nsresult SetFromAUTF8String(nsDiscriminatedUnion* data, const nsAUTF8String & aValue); michael@0: static nsresult SetFromACString(nsDiscriminatedUnion* data, const nsACString & aValue); michael@0: static nsresult SetFromString(nsDiscriminatedUnion* data, const char *aValue); michael@0: static nsresult SetFromWString(nsDiscriminatedUnion* data, const char16_t *aValue); michael@0: static nsresult SetFromISupports(nsDiscriminatedUnion* data, nsISupports *aValue); michael@0: static nsresult SetFromInterface(nsDiscriminatedUnion* data, const nsIID& iid, nsISupports *aValue); michael@0: static nsresult SetFromArray(nsDiscriminatedUnion* data, uint16_t type, const nsIID* iid, uint32_t count, void * aValue); michael@0: static nsresult SetFromStringWithSize(nsDiscriminatedUnion* data, uint32_t size, const char *aValue); michael@0: static nsresult SetFromWStringWithSize(nsDiscriminatedUnion* data, uint32_t size, const char16_t *aValue); michael@0: michael@0: static nsresult SetToVoid(nsDiscriminatedUnion* data); michael@0: static nsresult SetToEmpty(nsDiscriminatedUnion* data); michael@0: static nsresult SetToEmptyArray(nsDiscriminatedUnion* data); michael@0: michael@0: static void Traverse(const nsDiscriminatedUnion& data, michael@0: nsCycleCollectionTraversalCallback &cb); michael@0: michael@0: private: michael@0: ~nsVariant(); michael@0: michael@0: protected: michael@0: nsDiscriminatedUnion mData; michael@0: bool mWritable; michael@0: }; michael@0: michael@0: /** michael@0: * Users of nsIVariant should be using the contractID and not this CID. michael@0: * - see NS_VARIANT_CONTRACTID in nsIVariant.idl. michael@0: */ michael@0: michael@0: #define NS_VARIANT_CID \ michael@0: { /* 0D6EA1D0-879C-11d5-90EF-0010A4E73D9A */ \ michael@0: 0xd6ea1d0, \ michael@0: 0x879c, \ michael@0: 0x11d5, \ michael@0: {0x90, 0xef, 0x0, 0x10, 0xa4, 0xe7, 0x3d, 0x9a}} michael@0: michael@0: #endif // nsVariant_h