xpcom/ds/nsVariant.h

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/xpcom/ds/nsVariant.h	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,177 @@
     1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     1.5 + *
     1.6 + * This Source Code Form is subject to the terms of the Mozilla Public
     1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.9 +
    1.10 +/* The long avoided variant support for xpcom. */
    1.11 +
    1.12 +#ifndef nsVariant_h
    1.13 +#define nsVariant_h
    1.14 +
    1.15 +#include "nsIVariant.h"
    1.16 +#include "nsStringFwd.h"
    1.17 +#include "mozilla/Attributes.h"
    1.18 +
    1.19 +class nsCycleCollectionTraversalCallback;
    1.20 +
    1.21 +/** 
    1.22 + * Map the nsAUTF8String, nsUTF8String classes to the nsACString and
    1.23 + * nsCString classes respectively for now.  These defines need to be removed
    1.24 + * once Jag lands his nsUTF8String implementation.
    1.25 + */
    1.26 +#define nsAUTF8String nsACString
    1.27 +#define nsUTF8String nsCString
    1.28 +#define PromiseFlatUTF8String PromiseFlatCString
    1.29 +
    1.30 +/**
    1.31 + * nsDiscriminatedUnion is a type that nsIVariant implementors *may* use 
    1.32 + * to hold underlying data. It has no methods. So, its use requires no linkage
    1.33 + * to the xpcom module.
    1.34 + */
    1.35 +
    1.36 +struct nsDiscriminatedUnion
    1.37 +{
    1.38 +    union {
    1.39 +        int8_t         mInt8Value;
    1.40 +        int16_t        mInt16Value;
    1.41 +        int32_t        mInt32Value;
    1.42 +        int64_t        mInt64Value;
    1.43 +        uint8_t        mUint8Value;
    1.44 +        uint16_t       mUint16Value;
    1.45 +        uint32_t       mUint32Value;
    1.46 +        uint64_t       mUint64Value;
    1.47 +        float          mFloatValue;
    1.48 +        double         mDoubleValue;
    1.49 +        bool           mBoolValue;
    1.50 +        char           mCharValue;
    1.51 +        char16_t      mWCharValue;
    1.52 +        nsIID          mIDValue;
    1.53 +        nsAString*     mAStringValue;
    1.54 +        nsAUTF8String* mUTF8StringValue;
    1.55 +        nsACString*    mCStringValue;
    1.56 +        struct {
    1.57 +            nsISupports* mInterfaceValue;
    1.58 +            nsIID        mInterfaceID;
    1.59 +        } iface;
    1.60 +        struct {
    1.61 +            nsIID        mArrayInterfaceID;
    1.62 +            void*        mArrayValue;
    1.63 +            uint32_t     mArrayCount;
    1.64 +            uint16_t     mArrayType;
    1.65 +        } array;
    1.66 +        struct {
    1.67 +            char*        mStringValue;
    1.68 +            uint32_t     mStringLength;
    1.69 +        } str;
    1.70 +        struct {
    1.71 +            char16_t*   mWStringValue;
    1.72 +            uint32_t     mWStringLength;
    1.73 +        } wstr;
    1.74 +    } u;
    1.75 +    uint16_t       mType;
    1.76 +};
    1.77 +
    1.78 +/**
    1.79 + * nsVariant implements the generic variant support. The xpcom module registers
    1.80 + * a factory (see NS_VARIANT_CONTRACTID in nsIVariant.idl) that will create 
    1.81 + * these objects. They are created 'empty' and 'writable'. 
    1.82 + *
    1.83 + * nsIVariant users won't usually need to see this class.
    1.84 + *
    1.85 + * This class also has static helper methods that nsIVariant *implementors* can
    1.86 + * use to help them do all the 'standard' nsIVariant data conversions.
    1.87 + */
    1.88 +
    1.89 +class nsVariant MOZ_FINAL : public nsIWritableVariant
    1.90 +{
    1.91 +public:
    1.92 +    NS_DECL_ISUPPORTS
    1.93 +    NS_DECL_NSIVARIANT
    1.94 +    NS_DECL_NSIWRITABLEVARIANT
    1.95 +
    1.96 +    nsVariant();
    1.97 +
    1.98 +    static nsresult Initialize(nsDiscriminatedUnion* data);
    1.99 +    static nsresult Cleanup(nsDiscriminatedUnion* data);
   1.100 +
   1.101 +    static nsresult ConvertToInt8(const nsDiscriminatedUnion& data, uint8_t *_retval);
   1.102 +    static nsresult ConvertToInt16(const nsDiscriminatedUnion& data, int16_t *_retval);
   1.103 +    static nsresult ConvertToInt32(const nsDiscriminatedUnion& data, int32_t *_retval);
   1.104 +    static nsresult ConvertToInt64(const nsDiscriminatedUnion& data, int64_t *_retval);
   1.105 +    static nsresult ConvertToUint8(const nsDiscriminatedUnion& data, uint8_t *_retval);
   1.106 +    static nsresult ConvertToUint16(const nsDiscriminatedUnion& data, uint16_t *_retval);
   1.107 +    static nsresult ConvertToUint32(const nsDiscriminatedUnion& data, uint32_t *_retval);
   1.108 +    static nsresult ConvertToUint64(const nsDiscriminatedUnion& data, uint64_t *_retval);
   1.109 +    static nsresult ConvertToFloat(const nsDiscriminatedUnion& data, float *_retval);
   1.110 +    static nsresult ConvertToDouble(const nsDiscriminatedUnion& data, double *_retval);
   1.111 +    static nsresult ConvertToBool(const nsDiscriminatedUnion& data, bool *_retval);
   1.112 +    static nsresult ConvertToChar(const nsDiscriminatedUnion& data, char *_retval);
   1.113 +    static nsresult ConvertToWChar(const nsDiscriminatedUnion& data, char16_t *_retval);
   1.114 +    static nsresult ConvertToID(const nsDiscriminatedUnion& data, nsID * _retval);
   1.115 +    static nsresult ConvertToAString(const nsDiscriminatedUnion& data, nsAString & _retval);
   1.116 +    static nsresult ConvertToAUTF8String(const nsDiscriminatedUnion& data, nsAUTF8String & _retval);
   1.117 +    static nsresult ConvertToACString(const nsDiscriminatedUnion& data, nsACString & _retval);
   1.118 +    static nsresult ConvertToString(const nsDiscriminatedUnion& data, char **_retval);
   1.119 +    static nsresult ConvertToWString(const nsDiscriminatedUnion& data, char16_t **_retval);
   1.120 +    static nsresult ConvertToISupports(const nsDiscriminatedUnion& data, nsISupports **_retval);
   1.121 +    static nsresult ConvertToInterface(const nsDiscriminatedUnion& data, nsIID * *iid, void * *iface);
   1.122 +    static nsresult ConvertToArray(const nsDiscriminatedUnion& data, uint16_t *type, nsIID* iid, uint32_t *count, void * *ptr);
   1.123 +    static nsresult ConvertToStringWithSize(const nsDiscriminatedUnion& data, uint32_t *size, char **str);
   1.124 +    static nsresult ConvertToWStringWithSize(const nsDiscriminatedUnion& data, uint32_t *size, char16_t **str);
   1.125 +
   1.126 +    static nsresult SetFromVariant(nsDiscriminatedUnion* data, nsIVariant* aValue);
   1.127 +
   1.128 +    static nsresult SetFromInt8(nsDiscriminatedUnion* data, uint8_t aValue);
   1.129 +    static nsresult SetFromInt16(nsDiscriminatedUnion* data, int16_t aValue);
   1.130 +    static nsresult SetFromInt32(nsDiscriminatedUnion* data, int32_t aValue);
   1.131 +    static nsresult SetFromInt64(nsDiscriminatedUnion* data, int64_t aValue);
   1.132 +    static nsresult SetFromUint8(nsDiscriminatedUnion* data, uint8_t aValue);
   1.133 +    static nsresult SetFromUint16(nsDiscriminatedUnion* data, uint16_t aValue);
   1.134 +    static nsresult SetFromUint32(nsDiscriminatedUnion* data, uint32_t aValue);
   1.135 +    static nsresult SetFromUint64(nsDiscriminatedUnion* data, uint64_t aValue);
   1.136 +    static nsresult SetFromFloat(nsDiscriminatedUnion* data, float aValue);
   1.137 +    static nsresult SetFromDouble(nsDiscriminatedUnion* data, double aValue);
   1.138 +    static nsresult SetFromBool(nsDiscriminatedUnion* data, bool aValue);
   1.139 +    static nsresult SetFromChar(nsDiscriminatedUnion* data, char aValue);
   1.140 +    static nsresult SetFromWChar(nsDiscriminatedUnion* data, char16_t aValue);
   1.141 +    static nsresult SetFromID(nsDiscriminatedUnion* data, const nsID & aValue);
   1.142 +    static nsresult SetFromAString(nsDiscriminatedUnion* data, const nsAString & aValue);
   1.143 +    static nsresult SetFromAUTF8String(nsDiscriminatedUnion* data, const nsAUTF8String & aValue);
   1.144 +    static nsresult SetFromACString(nsDiscriminatedUnion* data, const nsACString & aValue);
   1.145 +    static nsresult SetFromString(nsDiscriminatedUnion* data, const char *aValue);
   1.146 +    static nsresult SetFromWString(nsDiscriminatedUnion* data, const char16_t *aValue);
   1.147 +    static nsresult SetFromISupports(nsDiscriminatedUnion* data, nsISupports *aValue);
   1.148 +    static nsresult SetFromInterface(nsDiscriminatedUnion* data, const nsIID& iid, nsISupports *aValue);
   1.149 +    static nsresult SetFromArray(nsDiscriminatedUnion* data, uint16_t type, const nsIID* iid, uint32_t count, void * aValue);
   1.150 +    static nsresult SetFromStringWithSize(nsDiscriminatedUnion* data, uint32_t size, const char *aValue);
   1.151 +    static nsresult SetFromWStringWithSize(nsDiscriminatedUnion* data, uint32_t size, const char16_t *aValue);
   1.152 +
   1.153 +    static nsresult SetToVoid(nsDiscriminatedUnion* data);
   1.154 +    static nsresult SetToEmpty(nsDiscriminatedUnion* data);
   1.155 +    static nsresult SetToEmptyArray(nsDiscriminatedUnion* data);
   1.156 +
   1.157 +    static void Traverse(const nsDiscriminatedUnion& data,
   1.158 +                         nsCycleCollectionTraversalCallback &cb);
   1.159 +
   1.160 +private:
   1.161 +    ~nsVariant();
   1.162 +
   1.163 +protected:
   1.164 +    nsDiscriminatedUnion mData;
   1.165 +    bool                 mWritable;
   1.166 +};
   1.167 +
   1.168 +/**
   1.169 + * Users of nsIVariant should be using the contractID and not this CID.
   1.170 + *  - see NS_VARIANT_CONTRACTID in nsIVariant.idl.
   1.171 + */
   1.172 +
   1.173 +#define NS_VARIANT_CID \
   1.174 +{ /* 0D6EA1D0-879C-11d5-90EF-0010A4E73D9A */ \
   1.175 +    0xd6ea1d0,                               \
   1.176 +    0x879c,                                  \
   1.177 +    0x11d5,                                  \
   1.178 +    {0x90, 0xef, 0x0, 0x10, 0xa4, 0xe7, 0x3d, 0x9a}}
   1.179 +
   1.180 +#endif // nsVariant_h

mercurial