Home | History | Annotate | Download | only in win
      1 /*
      2  * Copyright (C) 2009 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. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     23  */
     24 
     25 #include "config.h"
     26 #include "WebKitDLL.h"
     27 #include "WebSerializedJSValue.h"
     28 
     29 #include <WebCore/SerializedScriptValue.h>
     30 
     31 using namespace WebCore;
     32 
     33 WebSerializedJSValue::WebSerializedJSValue()
     34     : m_refCount(0)
     35 {
     36     ++gClassCount;
     37     gClassNameCount.add("WebSerializedJSValue");
     38 }
     39 
     40 WebSerializedJSValue::~WebSerializedJSValue()
     41 {
     42     --gClassCount;
     43     gClassNameCount.remove("WebSerializedJSValue");
     44 }
     45 
     46 COMPtr<WebSerializedJSValue> WebSerializedJSValue::createInstance()
     47 {
     48     return new WebSerializedJSValue();
     49 }
     50 
     51 ULONG WebSerializedJSValue::AddRef()
     52 {
     53     return ++m_refCount;
     54 }
     55 
     56 ULONG WebSerializedJSValue::Release()
     57 {
     58     ULONG newRefCount = --m_refCount;
     59     if (!newRefCount)
     60         delete this;
     61     return newRefCount;
     62 }
     63 
     64 HRESULT WebSerializedJSValue::QueryInterface(REFIID riid, void** ppvObject)
     65 {
     66     if (!ppvObject)
     67         return E_POINTER;
     68     *ppvObject = 0;
     69 
     70     if (IsEqualIID(riid, __uuidof(WebSerializedJSValue)))
     71         *ppvObject = this;
     72     else if (IsEqualGUID(riid, IID_IUnknown))
     73         *ppvObject = static_cast<IWebSerializedJSValue*>(this);
     74     else if (IsEqualIID(riid, __uuidof(IWebSerializedJSValue)))
     75         *ppvObject = static_cast<IWebSerializedJSValue*>(this);
     76     else if (IsEqualIID(riid, __uuidof(IWebSerializedJSValuePrivate)))
     77         *ppvObject = static_cast<IWebSerializedJSValuePrivate*>(this);
     78     else
     79         return E_NOINTERFACE;
     80 
     81     AddRef();
     82     return S_OK;
     83 }
     84 
     85 HRESULT WebSerializedJSValue::serialize(JSContextRef sourceContext, JSValueRef value, JSValueRef* exception)
     86 {
     87     ASSERT_ARG(value, value);
     88     ASSERT_ARG(sourceContext, sourceContext);
     89 
     90     if (!value || !sourceContext)
     91         return E_POINTER;
     92 
     93     m_value = SerializedScriptValue::create(sourceContext, value, exception);
     94 
     95     return S_OK;
     96 }
     97 
     98 HRESULT WebSerializedJSValue::deserialize(JSContextRef destinationContext, JSValueRef* outValue)
     99 {
    100     if (!outValue)
    101         return E_POINTER;
    102 
    103     if (!m_value)
    104         *outValue = 0;
    105     else
    106         *outValue = m_value->deserialize(destinationContext, 0);
    107 
    108     return S_OK;
    109 }
    110 
    111 HRESULT WebSerializedJSValue::setInternalRepresentation(void* internalRepresentation)
    112 {
    113     if (!internalRepresentation || m_value)
    114         return E_POINTER;
    115 
    116     m_value = reinterpret_cast<SerializedScriptValue*>(internalRepresentation);
    117 
    118     return S_OK;
    119 }
    120 
    121 HRESULT WebSerializedJSValue::getInternalRepresentation(void** internalRepresentation)
    122 {
    123     if (!m_value)
    124         return E_POINTER;
    125 
    126     *internalRepresentation = m_value.get();
    127     return S_OK;
    128 }
    129 
    130