Updated plugin binding API to reflect latest revision from
[WebKit-https.git] / JavaScriptCore / bindings / c / c_utility.cpp
1 /*
2  * Copyright (C) 2004 Apple Computer, 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 COMPUTER, 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 COMPUTER, 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 #include <c_instance.h> 
26 #include <c_utility.h> 
27 #include <internal.h>
28 #include <runtime.h>
29 #include <runtime_object.h>
30 #include <runtime_root.h>
31 #include <value.h>
32 #include <NP_jsobject.h>
33
34 using namespace KJS;
35 using namespace KJS::Bindings;
36
37 // Requires free() of returned UTF16Chars.
38 void convertNPStringToUTF16 (const NPString *string, NPUTF16 **UTF16Chars, unsigned int *UTF16Length)
39 {
40     convertUTF8ToUTF16 (string->UTF8Characters, string->UTF8Length, UTF16Chars, UTF16Length);
41 }
42
43 // Requires free() of returned UTF16Chars.
44 void convertUTF8ToUTF16 (const NPUTF8 *UTF8Chars, int UTF8Length, NPUTF16 **UTF16Chars, unsigned int *UTF16Length)
45 {
46     assert (UTF8Chars);
47     
48     if (UTF8Length == -1)
49         UTF8Length = strlen(UTF8Chars);
50         
51     CFStringRef stringRef = CFStringCreateWithBytes (NULL, (const UInt8*)UTF8Chars, (CFIndex)UTF8Length, kCFStringEncodingUTF8, false);
52
53     *UTF16Length = (unsigned int)CFStringGetLength (stringRef);
54     *UTF16Chars = (NPUTF16 *)malloc (sizeof(NPUTF16) * (*UTF16Length));
55
56     // Convert the string to UTF16.
57     CFRange range = { 0, *UTF16Length };
58     CFStringGetCharacters (stringRef, range, (UniChar *)*UTF16Chars);
59     CFRelease (stringRef);
60 }
61
62 // Variant value must be released with NPReleaseVariantValue()
63 void coerceValueToNPVariantStringType (KJS::ExecState *exec, const KJS::Value &value, NPVariant *result)
64 {
65     UString ustring = value.toString(exec);
66     CString cstring = ustring.UTF8String();
67     NPString string = { (const NPUTF8 *)cstring.c_str(), cstring.size() };
68     NPN_InitializeVariantWithStringCopy (result, &string);
69 }
70
71 // Variant value must be released with NPReleaseVariantValue()
72 void convertValueToNPVariant (KJS::ExecState *exec, const KJS::Value &value, NPVariant *result)
73 {
74     Type type = value.type();
75     
76     if (type == StringType) {
77         UString ustring = value.toString(exec);
78         CString cstring = ustring.UTF8String();
79         NPString string = { (const NPUTF8 *)cstring.c_str(), cstring.size() };
80         NPN_InitializeVariantWithStringCopy (result, &string );
81     }
82     else if (type == NumberType) {
83         NPN_InitializeVariantWithDouble (result, value.toNumber(exec));
84     }
85     else if (type == BooleanType) {
86         NPN_InitializeVariantWithBool (result, value.toBoolean(exec));
87     }
88     else if (type == UnspecifiedType) {
89         NPN_InitializeVariantAsUndefined(result);
90     }
91     else if (type == NullType) {
92         NPN_InitializeVariantAsNull(result);
93     }
94     else if (type == ObjectType) {
95         KJS::ObjectImp *objectImp = static_cast<KJS::ObjectImp*>(value.imp());
96         if (strcmp(objectImp->classInfo()->className, "RuntimeObject") == 0) {
97             KJS::RuntimeObjectImp *imp = static_cast<KJS::RuntimeObjectImp *>(value.imp());
98             CInstance *instance = static_cast<CInstance*>(imp->getInternalInstance());
99             NPN_InitializeVariantWithObject (result, instance->getObject());
100         }
101     }
102     else
103         NPN_InitializeVariantAsUndefined(result);
104 }
105
106 Value convertNPVariantToValue (KJS::ExecState *exec, const NPVariant *variant)
107 {
108     NPVariantType type = variant->type;
109
110     if (type == NPVariantBoolType) {
111         NPBool aBool;
112         if (NPN_VariantToBool (variant, &aBool))
113             return KJS::Boolean (aBool);
114         return KJS::Boolean (false);
115     }
116     else if (type == NPVariantNullType) {
117         return Null();
118     }
119     else if (type == NPVariantUndefinedType) {
120         return Undefined();
121     }
122     else if (type == NPVariantInt32Type) {
123         int32_t anInt;
124         if (NPN_VariantToInt32 (variant, &anInt))
125             return Number (anInt);
126         return Number (0);
127     }
128     else if (type == NPVariantDoubleType) {
129         double aDouble;
130         if (NPN_VariantToDouble (variant, &aDouble))
131             return Number (aDouble);
132         return Number (0);
133     }
134     else if (type == NPVariantStringType) {
135         NPUTF16 *stringValue;
136         unsigned int UTF16Length;
137         convertNPStringToUTF16 (&variant->value.stringValue, &stringValue, &UTF16Length);    // requires free() of returned memory.
138         String resultString(UString((const UChar *)stringValue,UTF16Length));
139         free (stringValue);
140         return resultString;
141     }
142     else if (type == NPVariantObjectType) {
143         NPObject *obj = variant->value.objectValue;
144         
145         if (NPN_IsKindOfClass (obj, NPArrayClass)) {
146             // FIXME:  Need to implement
147         }
148      
149         else if (NPN_IsKindOfClass (obj, NPScriptObjectClass)) {
150             // Get ObjectImp from NP_JavaScriptObject.
151             JavaScriptObject *o = (JavaScriptObject *)obj;
152             return Object(const_cast<ObjectImp*>(o->imp));
153         }
154         else {
155             //  Wrap NPObject in a CInstance.
156             return Instance::createRuntimeObject(Instance::CLanguage, (void *)obj);
157         }
158     }
159     
160     return Undefined();
161 }
162