WebKit/win/COMVariantSetter.h
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2007, 2008 Apple Inc. All Rights Reserved.
       
     3  *
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  * 1. Redistributions of source code must retain the above copyright
       
     8  *    notice, this list of conditions and the following disclaimer.
       
     9  * 2. Redistributions in binary form must reproduce the above copyright
       
    10  *    notice, this list of conditions and the following disclaimer in the
       
    11  *    documentation and/or other materials provided with the distribution.
       
    12  *
       
    13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
       
    14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
       
    17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
       
    21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
       
    24  */
       
    25 
       
    26 #ifndef COMVariantSetter_h
       
    27 #define COMVariantSetter_h
       
    28 
       
    29 #include <WebCore/BString.h>
       
    30 #include <WebCore/COMPtr.h>
       
    31 #include <wtf/Assertions.h>
       
    32 
       
    33 namespace WebCore {
       
    34     class String;
       
    35 }
       
    36 
       
    37 template<typename T> struct COMVariantSetter {};
       
    38 
       
    39 template<typename T> struct COMVariantSetterBase
       
    40 {
       
    41     static inline VARENUM variantType(const T&)
       
    42     {
       
    43         return COMVariantSetter<T>::VariantType;
       
    44     }
       
    45 };
       
    46 
       
    47 template<> struct COMVariantSetter<WebCore::String> : COMVariantSetterBase<WebCore::String>
       
    48 {
       
    49     static const VARENUM VariantType = VT_BSTR;
       
    50 
       
    51     static void setVariant(VARIANT* variant, const WebCore::String& value)
       
    52     {
       
    53         ASSERT(V_VT(variant) == VT_EMPTY);
       
    54 
       
    55         V_VT(variant) = VariantType;
       
    56         V_BSTR(variant) = WebCore::BString(value).release();
       
    57     }
       
    58 };
       
    59 
       
    60 template<> struct COMVariantSetter<bool> : COMVariantSetterBase<bool>
       
    61 {
       
    62     static const VARENUM VariantType = VT_BOOL;
       
    63 
       
    64     static void setVariant(VARIANT* variant, bool value)
       
    65     {
       
    66         ASSERT(V_VT(variant) == VT_EMPTY);
       
    67 
       
    68         V_VT(variant) = VariantType;
       
    69         V_BOOL(variant) = value;
       
    70     }
       
    71 };
       
    72 
       
    73 template<> struct COMVariantSetter<unsigned long long> : COMVariantSetterBase<unsigned long long>
       
    74 {
       
    75     static const VARENUM VariantType = VT_UI8;
       
    76 
       
    77     static void setVariant(VARIANT* variant, unsigned long long value)
       
    78     {
       
    79         ASSERT(V_VT(variant) == VT_EMPTY);
       
    80 
       
    81         V_VT(variant) = VariantType;
       
    82         V_UI8(variant) = value;
       
    83     }
       
    84 };
       
    85 
       
    86 template<> struct COMVariantSetter<int> : COMVariantSetterBase<int>
       
    87 {
       
    88     static const VARENUM VariantType = VT_I4;
       
    89 
       
    90     static void setVariant(VARIANT* variant, int value)
       
    91     {
       
    92         ASSERT(V_VT(variant) == VT_EMPTY);
       
    93 
       
    94         V_VT(variant) = VariantType;
       
    95         V_I4(variant) = value;
       
    96     }
       
    97 };
       
    98 
       
    99 template<> struct COMVariantSetter<float> : COMVariantSetterBase<float>
       
   100 {
       
   101     static const VARENUM VariantType = VT_R4;
       
   102 
       
   103     static void setVariant(VARIANT* variant, float value)
       
   104     {
       
   105         ASSERT(V_VT(variant) == VT_EMPTY);
       
   106 
       
   107         V_VT(variant) = VariantType;
       
   108         V_R4(variant) = value;
       
   109     }
       
   110 };
       
   111 
       
   112 template<typename T> struct COMVariantSetter<COMPtr<T> > : COMVariantSetterBase<COMPtr<T> >
       
   113 {
       
   114     static const VARENUM VariantType = VT_UNKNOWN;
       
   115 
       
   116     static void setVariant(VARIANT* variant, const COMPtr<T>& value)
       
   117     {
       
   118         ASSERT(V_VT(variant) == VT_EMPTY);
       
   119 
       
   120         V_VT(variant) = VariantType;
       
   121         V_UNKNOWN(variant) = value.get();
       
   122         value->AddRef();
       
   123     }
       
   124 };
       
   125 
       
   126 template<typename COMType, typename UnderlyingType>
       
   127 struct COMIUnknownVariantSetter : COMVariantSetterBase<UnderlyingType>
       
   128 {
       
   129     static const VARENUM VariantType = VT_UNKNOWN;
       
   130 
       
   131     static void setVariant(VARIANT* variant, const UnderlyingType& value)
       
   132     {
       
   133         ASSERT(V_VT(variant) == VT_EMPTY);
       
   134 
       
   135         V_VT(variant) = VariantType;
       
   136         V_UNKNOWN(variant) = COMType::createInstance(value);
       
   137     }
       
   138 };
       
   139 
       
   140 class COMVariant {
       
   141 public:
       
   142     COMVariant()
       
   143     {
       
   144         ::VariantInit(&m_variant);
       
   145     }
       
   146 
       
   147     template<typename UnderlyingType>
       
   148     COMVariant(UnderlyingType value)
       
   149     {
       
   150         ::VariantInit(&m_variant);
       
   151         COMVariantSetter<UnderlyingType>::setVariant(&m_variant, value);
       
   152     }
       
   153 
       
   154     ~COMVariant()
       
   155     {
       
   156         ::VariantClear(&m_variant);
       
   157     }
       
   158 
       
   159     COMVariant(const COMVariant& other)
       
   160     {
       
   161         ::VariantInit(&m_variant);
       
   162         other.copyTo(&m_variant);
       
   163     }
       
   164 
       
   165     COMVariant& operator=(const COMVariant& other)
       
   166     {
       
   167         other.copyTo(&m_variant);
       
   168         return *this;
       
   169     }
       
   170 
       
   171     void copyTo(VARIANT* dest) const
       
   172     {
       
   173         ::VariantCopy(dest, const_cast<VARIANT*>(&m_variant));
       
   174     }
       
   175 
       
   176     VARENUM variantType() const { return static_cast<VARENUM>(V_VT(&m_variant)); }
       
   177 
       
   178 private:
       
   179     VARIANT m_variant;
       
   180 };
       
   181 
       
   182 template<> struct COMVariantSetter<COMVariant>
       
   183 {
       
   184     static inline VARENUM variantType(const COMVariant& value)
       
   185     {
       
   186         return value.variantType();
       
   187     }
       
   188 
       
   189     static void setVariant(VARIANT* variant, const COMVariant& value)
       
   190     {
       
   191         ASSERT(V_VT(variant) == VT_EMPTY);
       
   192 
       
   193         value.copyTo(variant);
       
   194     }
       
   195 };
       
   196 
       
   197 #endif // COMVariantSetter