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