15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CppVariant.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "TestCommon.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <limits>
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using namespace blink;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace WebTestRunner {
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CppVariant::CppVariant()
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_Null;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Note that Set() performs a deep copy, which is necessary to safely
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// call FreeData() on the value in the destructor.
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CppVariant::CppVariant(const CppVariant& original)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_Null;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set(original);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// See comment for copy constructor, above.
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CppVariant& CppVariant::operator=(const CppVariant& original)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (&original != this)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        set(original);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *this;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CppVariant::~CppVariant()
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::freeData()
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebBindings::releaseVariantValue(this);
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CppVariant::isEqual(const CppVariant& other) const
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (type != other.type)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (type) {
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Bool:
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (value.boolValue == other.value.boolValue);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Int32:
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (value.intValue == other.value.intValue);
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Double:
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (value.doubleValue == other.value.doubleValue);
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_String: {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const NPString *this_value = &value.stringValue;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const NPString *other_value = &other.value.stringValue;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        uint32_t len = this_value->UTF8Length;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return len == other_value->UTF8Length
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            && !strncmp(this_value->UTF8Characters,
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        other_value->UTF8Characters, len);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Null:
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Void:
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Object: {
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPObject* thisValue = value.objectValue;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPObject* otherValue = other.value.objectValue;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return thisValue->_class == otherValue->_class
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            && thisValue->referenceCount == otherValue->referenceCount;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::copyToNPVariant(NPVariant* result) const
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result->type = type;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (type) {
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Bool:
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result->value.boolValue = value.boolValue;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Int32:
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result->value.intValue = value.intValue;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Double:
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result->value.doubleValue = value.doubleValue;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_String:
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebBindings::initializeVariantWithStringCopy(result, &value.stringValue);
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Null:
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Void:
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Nothing to set.
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Object:
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result->type = NPVariantType_Object;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result->value.objectValue = WebBindings::retainObject(value.objectValue);
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(const NPVariant& newValue)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (newValue.type) {
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Bool:
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        set(newValue.value.boolValue);
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Int32:
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        set(newValue.value.intValue);
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Double:
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        set(newValue.value.doubleValue);
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_String:
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        set(newValue.value.stringValue);
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Null:
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Void:
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        type = newValue.type;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NPVariantType_Object:
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        set(newValue.value.objectValue);
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::setNull()
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_Null;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(bool newValue)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_Bool;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    value.boolValue = newValue;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(int32_t newValue)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_Int32;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    value.intValue = newValue;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(double newValue)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_Double;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    value.doubleValue = newValue;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The newValue must be a null-terminated string.
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(const char* newValue)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_String;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPString newString = {newValue,
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          static_cast<uint32_t>(strlen(newValue))};
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebBindings::initializeVariantWithStringCopy(this, &newString);
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(const string& newValue)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_String;
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPString newString = {newValue.data(),
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          static_cast<uint32_t>(newValue.size())};
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebBindings::initializeVariantWithStringCopy(this, &newString);
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(const NPString& newValue)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_String;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebBindings::initializeVariantWithStringCopy(this, &newValue);
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CppVariant::set(NPObject* newValue)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeData();
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = NPVariantType_Object;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    value.objectValue = WebBindings::retainObject(newValue);
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)string CppVariant::toString() const
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT(isString());
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return string(value.stringValue.UTF8Characters,
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  value.stringValue.UTF8Length);
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int32_t CppVariant::toInt32() const
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isInt32())
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value.intValue;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isDouble())
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return static_cast<int32_t>(value.doubleValue);
2311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT_NOT_REACHED();
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double CppVariant::toDouble() const
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isInt32())
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return static_cast<double>(value.intValue);
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isDouble())
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value.doubleValue;
2411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT_NOT_REACHED();
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CppVariant::toBoolean() const
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT(isBool());
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value.boolValue;
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)vector<string> CppVariant::toStringVector() const
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT(isObject());
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    vector<string> stringVector;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* npValue = value.objectValue;
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier lengthId = WebBindings::getStringIdentifier("length");
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!WebBindings::hasProperty(0, npValue, lengthId))
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return stringVector;
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant lengthValue;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!WebBindings::getProperty(0, npValue, lengthId, &lengthValue))
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return stringVector;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int length = 0;
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The length is a double in some cases.
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (NPVARIANT_IS_DOUBLE(lengthValue))
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length = static_cast<int>(NPVARIANT_TO_DOUBLE(lengthValue));
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (NPVARIANT_IS_INT32(lengthValue))
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length = NPVARIANT_TO_INT32(lengthValue);
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebBindings::releaseVariantValue(&lengthValue);
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For sanity, only allow 100 items.
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    length = min(100, length);
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int i = 0; i < length; ++i) {
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Get each of the items.
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        char indexInChar[20]; // Enough size to store 32-bit integer
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        snprintf(indexInChar, 20, "%d", i);
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        string index(indexInChar);
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPIdentifier indexId = WebBindings::getStringIdentifier(index.c_str());
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!WebBindings::hasProperty(0, npValue, indexId))
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPVariant indexValue;
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!WebBindings::getProperty(0, npValue, indexId, &indexValue))
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (NPVARIANT_IS_STRING(indexValue)) {
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string item(NPVARIANT_TO_STRING(indexValue).UTF8Characters,
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        NPVARIANT_TO_STRING(indexValue).UTF8Length);
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            stringVector.push_back(item);
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebBindings::releaseVariantValue(&indexValue);
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return stringVector;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
297e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochbool CppVariant::invoke(const string& method, const CppVariant* arguments,
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        uint32_t argumentCount, CppVariant& result) const
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT(isObject());
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier methodName = WebBindings::getStringIdentifier(method.c_str());
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* npObject = value.objectValue;
303e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!WebBindings::hasMethod(0, npObject, methodName))
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant r;
306e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bool status = WebBindings::invoke(0, npObject, methodName, arguments, argumentCount, &r);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.set(r);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return status;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
311e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochbool CppVariant::invokeDefault(const CppVariant* arguments, uint32_t argumentCount,
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                               CppVariant& result) const
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT(isObject());
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* npObject = value.objectValue;
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant r;
317e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bool status = WebBindings::invokeDefault(0, npObject, arguments, argumentCount, &r);
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.set(r);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return status;
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
323