Updated plugin binding API to reflect latest revision from
[WebKit-https.git] / JavaScriptCore / bindings / c / c_class.cpp
1 /*
2  * Copyright (C) 2003 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_class.h>
26
27 using namespace KJS::Bindings;
28
29 bool NPN_IsValidIdentifier (const NPUTF8 *name);
30
31 void CClass::_commonDelete() {
32     CFRelease (_fields);
33     CFRelease (_methods);
34 }
35     
36
37 void CClass::_commonCopy(const CClass &other) {
38     _isa = other._isa;
39     _methods = CFDictionaryCreateCopy (NULL, other._methods);
40     _fields = CFDictionaryCreateCopy (NULL, other._fields);
41 }
42     
43
44 void CClass::_commonInit (NPClass *aClass)
45 {
46     _isa = aClass;
47     _methods = CFDictionaryCreateMutable(NULL, 16, &kCFTypeDictionaryKeyCallBacks, NULL);
48     _fields = CFDictionaryCreateMutable(NULL, 16, &kCFTypeDictionaryKeyCallBacks, NULL);
49 }
50
51
52 static CFMutableDictionaryRef classesByIsA = 0;
53
54 static void _createClassesByIsAIfNecessary()
55 {
56     if (classesByIsA == 0)
57         classesByIsA = CFDictionaryCreateMutable (NULL, 0, NULL, NULL);
58 }
59
60 CClass *CClass::classForIsA (NPClass *isa)
61 {
62     _createClassesByIsAIfNecessary();
63     
64     CClass *aClass = (CClass *)CFDictionaryGetValue(classesByIsA, isa);
65     if (aClass == NULL) {
66         aClass = new CClass (isa);
67         CFDictionaryAddValue (classesByIsA, isa, aClass);
68     }
69     
70     return aClass;
71 }
72
73
74 CClass::CClass (NPClass *isa)
75 {
76     _commonInit (isa);
77 }
78
79 const char *CClass::name() const
80 {
81     return "";
82 }
83
84 MethodList CClass::methodsNamed(const char *_name) const
85 {
86     MethodList methodList;
87
88     CFStringRef methodName = CFStringCreateWithCString(NULL, _name, kCFStringEncodingASCII);
89     Method *method = (Method *)CFDictionaryGetValue (_methods, methodName);
90     if (method) {
91         CFRelease (methodName);
92         methodList.addMethod(method);
93         return methodList;
94     }
95     
96     if (NPN_IsValidIdentifier (_name)) {
97         NPIdentifier ident = NPN_GetIdentifier (_name);
98         if (_isa->hasMethod && _isa->hasMethod (_isa, ident)){
99             Method *aMethod = new CMethod (ident);
100             CFDictionaryAddValue ((CFMutableDictionaryRef)_methods, methodName, aMethod);
101             methodList.addMethod (aMethod);
102         }
103     }
104
105     CFRelease (methodName);
106     
107     return methodList;
108 }
109
110
111 Field *CClass::fieldNamed(const char *name) const
112 {
113     CFStringRef fieldName = CFStringCreateWithCString(NULL, name, kCFStringEncodingASCII);
114     Field *aField = (Field *)CFDictionaryGetValue (_fields, fieldName);
115     if (aField) {
116         CFRelease (fieldName);
117         return aField;
118     }
119
120     if (NPN_IsValidIdentifier (name)) {
121         NPIdentifier ident = NPN_GetIdentifier (name);
122         if (_isa->hasProperty && _isa->hasProperty (_isa, ident)){
123             aField = new CField (ident);
124             CFDictionaryAddValue ((CFMutableDictionaryRef)_fields, fieldName, aField);
125         }
126     }
127     
128     CFRelease (fieldName);
129
130     return aField;
131 };