454f7a31484215e37f17e7fa320494f64859a64e
[WebKit-https.git] / JavaScriptCore / bindings / jni / jni_runtime.h
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 #ifndef _JNI_RUNTIME_H_
26 #define _JNI_RUNTIME_H_
27
28 #include <CoreFoundation/CoreFoundation.h>
29
30 #include <jni_utility.h>
31 #include <jni_instance.h>
32 #include <runtime.h>
33 #include <ustring.h>
34
35 namespace KJS
36 {
37 class Value;
38
39 namespace Bindings
40 {
41
42 class JavaString
43 {
44 public:
45     JavaString () {};
46     
47     void _commonInit (JNIEnv *e, jstring s)
48     {
49         int _size = e->GetStringLength (s);
50         const jchar *uc = getUCharactersFromJStringInEnv (e, s);
51         _ustring = UString((UChar *)uc,_size);
52         releaseUCharactersForJStringInEnv (e, s, uc);
53     }
54     
55     JavaString (JNIEnv *e, jstring s) {
56         _commonInit (e, s);
57     }
58     
59     JavaString (jstring s) {
60         _commonInit (getJNIEnv(), s);
61     }
62     
63     const char *UTF8String() const { 
64         if (_utf8String.c_str() == 0)
65             _utf8String = _ustring.UTF8String();
66         return _utf8String.c_str();
67     }
68     const jchar *uchars() const { return (const jchar *)_ustring.data(); }
69     int length() const { return _ustring.size(); }
70     KJS::UString ustring() const { return _ustring; }
71     
72 private:
73     UString _ustring;
74     mutable CString _utf8String;
75 };
76
77 class JavaParameter : public Parameter
78 {
79 public:
80     JavaParameter () : _JNIType(invalid_type) {};
81     
82     JavaParameter (JNIEnv *env, jstring type);
83         
84     ~JavaParameter() {
85     };
86
87     JavaParameter(const JavaParameter &other) : Parameter() {
88         _type = other._type;
89         _JNIType = other._JNIType;
90     };
91
92     JavaParameter &operator=(const JavaParameter &other)
93     {
94         if (this == &other)
95             return *this;
96                     
97         _type = other._type;
98         _JNIType = other._JNIType;
99
100         return *this;
101     }
102     
103     virtual RuntimeType type() const { return _type.UTF8String(); }
104
105     JNIType getJNIType() const { return _JNIType; }
106     
107 private:
108     JavaString _type;
109     JNIType _JNIType;
110 };
111
112
113 class JavaConstructor : public Constructor
114 {
115 public:
116     JavaConstructor() : _parameters (0), _numParameters(0) {};
117     
118     JavaConstructor (JNIEnv *e, jobject aConstructor);
119     
120     ~JavaConstructor() {
121         delete [] _parameters;
122     };
123
124     void _commonCopy(const JavaConstructor &other) {
125         _numParameters = other._numParameters;
126         _parameters = new JavaParameter[_numParameters];
127         long i;
128         for (i = 0; i < _numParameters; i++) {
129             _parameters[i] = other._parameters[i];
130         }
131     }
132     
133     JavaConstructor(const JavaConstructor &other) : Constructor() {
134         _commonCopy (other);
135     };
136
137     JavaConstructor &operator=(const JavaConstructor &other)
138     {
139         if (this == &other)
140             return *this;
141             
142         delete [] _parameters;
143         
144         _commonCopy (other);
145
146         return *this;
147     }
148
149     virtual Parameter *parameterAt(long i) const { return &_parameters[i]; };
150     virtual long numParameters() const { return _numParameters; };
151     
152 private:
153     JavaParameter *_parameters;
154     long _numParameters;
155 };
156
157
158 class JavaField : public Field
159 {
160 public:
161     JavaField() : _field(0) {};
162     JavaField (JNIEnv *env, jobject aField);
163     ~JavaField() {
164         delete _field;
165     };
166
167     JavaField(const JavaField &other) : 
168         Field(), _name(other._name), _type(other._type), _field(other._field) {};
169
170     JavaField &operator=(const JavaField &other)
171     {
172         if (this == &other)
173             return *this;
174             
175         delete _field;
176         
177         _name = other._name;
178         _type = other._type;
179         _field = other._field;
180
181         return *this;
182     }
183     
184     virtual KJS::Value valueFromInstance(KJS::ExecState *exec, const Instance *instance) const;
185     virtual void setValueToInstance(KJS::ExecState *exec, const Instance *instance, const KJS::Value &aValue) const;
186     
187     virtual const char *name() const { return _name.UTF8String(); }
188     virtual RuntimeType type() const { return _type.UTF8String(); }
189
190     JNIType getJNIType() const { return _JNIType; }
191     
192 private:
193     JavaString _name;
194     JavaString _type;
195     JNIType _JNIType;
196     JavaInstance *_field;
197 };
198
199
200 class JavaMethod : public Method
201 {
202 public:
203     JavaMethod() : Method(), _signature(0), _methodID(0) {};
204     
205     JavaMethod (JNIEnv *env, jobject aMethod);
206     
207     void _commonDelete() {
208         delete _signature;
209         delete [] _parameters;
210     };
211     
212     ~JavaMethod () {
213         _commonDelete();
214     };
215
216     void _commonCopy(const JavaMethod &other) {
217         _name = other._name;
218         _returnType = other._returnType;
219
220         _numParameters = other._numParameters;
221         _parameters = new JavaParameter[_numParameters];
222         long i;
223         for (i = 0; i < _numParameters; i++) {
224             _parameters[i] = other._parameters[i];
225         }
226         _signature = other._signature;
227     };
228     
229     JavaMethod(const JavaMethod &other) : Method() {
230         _commonCopy(other);
231     };
232
233     JavaMethod &operator=(const JavaMethod &other)
234     {
235         if (this == &other)
236             return *this;
237             
238         _commonDelete();
239         _commonCopy(other);
240
241         return *this;
242     };
243
244     virtual const char *name() const { return _name.UTF8String(); };
245     RuntimeType returnType() const { return _returnType.UTF8String(); };
246     virtual Parameter *parameterAt(long i) const { return &_parameters[i]; };
247     virtual long numParameters() const { return _numParameters; };
248     
249     const char *signature() const;
250     JNIType JNIReturnType() const;
251
252     jmethodID methodID (jobject obj) const;
253         
254 private:
255     JavaParameter *_parameters;
256     long _numParameters;
257     JavaString _name;
258     mutable KJS::UString *_signature;
259     JavaString _returnType;
260     JNIType _JNIReturnType;
261     mutable jmethodID _methodID;
262 };
263
264 class JavaArray : public Array
265 {
266 public:
267     JavaArray (jobject a, const char *type);
268
269     JavaArray (const JavaArray &other);
270
271     JavaArray &operator=(const JavaArray &other){
272         if (this == &other)
273             return *this;
274         
275         free ((void *)_type);
276         _type = strdup(other._type);
277
278         JObjectWrapper *_oldArray = _array;
279         _array = other._array;
280         _array->ref();
281         _oldArray->deref();
282         
283         return *this;
284     };
285
286     virtual void setValueAt(KJS::ExecState *exec, unsigned int index, const KJS::Value &aValue) const;
287     virtual KJS::Value valueAt(KJS::ExecState *exec, unsigned int index) const;
288     virtual unsigned int getLength() const;
289     
290     virtual ~JavaArray();
291
292     jobject javaArray() const { return _array->_instance; }
293
294     static KJS::Value convertJObjectToArray (KJS::ExecState *exec, jobject anObject, const char *type);
295
296 private:
297     JObjectWrapper *_array;
298     unsigned int _length;
299     const char *_type;
300 };
301
302 } // namespace Bindings
303
304 } // namespace KJS
305
306 #endif