Michael Goddard <michael.goddard@trolltech.com>
[WebKit-https.git] / WebCore / bridge / qt / qt_runtime.h
1 /*
2  * Copyright (C) 2006 Trolltech ASA
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Lesser General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public
15  *  License along with this library; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  *
18  */
19
20 #ifndef BINDINGS_QT_RUNTIME_H_
21 #define BINDINGS_QT_RUNTIME_H_
22
23 #include "runtime.h"
24 #include "runtime_method.h"
25 #include "protect.h"
26
27 #include <qbytearray.h>
28 #include <qmetaobject.h>
29 #include <qpointer.h>
30 #include <qvariant.h>
31
32 namespace KJS {
33 namespace Bindings {
34
35 class QtInstance;
36
37 class QtField : public Field {
38 public:
39
40     typedef enum {
41         MetaProperty,
42         DynamicProperty,
43         ChildObject
44     } QtFieldType;
45
46     QtField(const QMetaProperty &p)
47         : m_type(MetaProperty), m_property(p)
48         {}
49
50     QtField(const QByteArray &b)
51         : m_type(DynamicProperty), m_dynamicProperty(b)
52         {}
53
54     QtField(QObject *child)
55         : m_type(ChildObject), m_childObject(child)
56         {}
57
58     virtual JSValue* valueFromInstance(ExecState*, const Instance*) const;
59     virtual void setValueToInstance(ExecState*, const Instance*, JSValue*) const;
60     virtual const char* name() const;
61     QtFieldType fieldType() const {return m_type;}
62 private:
63     QtFieldType m_type;
64     QByteArray m_dynamicProperty;
65     QMetaProperty m_property;
66     QPointer<QObject> m_childObject;
67 };
68
69
70 class QtMethod : public Method
71 {
72 public:
73     QtMethod(const QMetaObject *mo, int i, const QByteArray &ident, int numParameters)
74         : m_metaObject(mo),
75           m_index(i),
76           m_identifier(ident),
77           m_nParams(numParameters)
78         { }
79
80     virtual const char* name() const { return m_identifier.constData(); }
81     virtual int numParameters() const { return m_nParams; }
82
83 private:
84     friend class QtInstance;
85     const QMetaObject *m_metaObject;
86     int m_index;
87     QByteArray m_identifier;
88     int m_nParams;
89 };
90
91
92 template <typename T> class QtArray : public Array
93 {
94 public:
95     QtArray(QList<T> list, QMetaType::Type type, PassRefPtr<RootObject>);
96     virtual ~QtArray();
97
98     RootObject* rootObject() const;
99
100     virtual void setValueAt(ExecState *exec, unsigned int index, JSValue *aValue) const;
101     virtual JSValue *valueAt(ExecState *exec, unsigned int index) const;
102     virtual unsigned int getLength() const {return m_length;}
103
104 private:
105     mutable QList<T> m_list; // setValueAt is const!
106     unsigned int m_length;
107     QMetaType::Type m_type;
108 };
109
110 // Based on RuntimeMethod
111
112 // Extra data classes (to avoid the CELL_SIZE limit on JS objects)
113
114 class QtRuntimeMethodData {
115     public:
116         virtual ~QtRuntimeMethodData();
117         RefPtr<QtInstance> m_instance;
118 };
119
120 class QtRuntimeConnectionMethod;
121 class QtRuntimeMetaMethodData : public QtRuntimeMethodData {
122     public:
123         ~QtRuntimeMetaMethodData();
124         QByteArray m_signature;
125         bool m_allowPrivate;
126         int m_index;
127         QtRuntimeConnectionMethod *m_connect;
128         QtRuntimeConnectionMethod *m_disconnect;
129 };
130
131 class QtRuntimeConnectionMethodData : public QtRuntimeMethodData {
132     public:
133         ~QtRuntimeConnectionMethodData();
134         QByteArray m_signature;
135         int m_index;
136         bool m_isConnect;
137 };
138
139 // Common base class (doesn't really do anything interesting)
140 class QtRuntimeMethod : public InternalFunctionImp
141 {
142 public:
143     virtual ~QtRuntimeMethod();
144
145     virtual CodeType codeType() const;
146     virtual Completion execute(ExecState *exec);
147
148 protected:
149     QtRuntimeMethodData *d_func() const {return d_ptr;}
150     QtRuntimeMethod(QtRuntimeMethodData *dd, ExecState *exec, const Identifier &n, PassRefPtr<QtInstance> inst);
151     QtRuntimeMethodData *d_ptr;
152 };
153
154 class QtRuntimeMetaMethod : public QtRuntimeMethod
155 {
156 public:
157     QtRuntimeMetaMethod(ExecState *exec, const Identifier &n, PassRefPtr<QtInstance> inst, int index, const QByteArray& signature, bool allowPrivate);
158
159     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
160     virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List &args);
161
162     virtual void mark();
163
164 protected:
165     QtRuntimeMetaMethodData* d_func() const {return reinterpret_cast<QtRuntimeMetaMethodData*>(d_ptr);}
166
167 private:
168     static JSValue *lengthGetter(ExecState *, JSObject *, const Identifier&, const PropertySlot&);
169     static JSValue *connectGetter(ExecState *, JSObject *, const Identifier&, const PropertySlot&);
170     static JSValue *disconnectGetter(ExecState *, JSObject *, const Identifier&, const PropertySlot&);
171 };
172
173 class QtConnectionObject;
174 class QtRuntimeConnectionMethod : public QtRuntimeMethod
175 {
176 public:
177     QtRuntimeConnectionMethod(ExecState *exec, const Identifier &n, bool isConnect, PassRefPtr<QtInstance> inst, int index, const QByteArray& signature );
178
179     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
180     virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List &args);
181
182 protected:
183     QtRuntimeConnectionMethodData* d_func() const {return reinterpret_cast<QtRuntimeConnectionMethodData*>(d_ptr);}
184
185 private:
186     static JSValue *lengthGetter(ExecState *, JSObject *, const Identifier&, const PropertySlot&);
187     static QMultiMap<QObject *, QtConnectionObject *> connections;
188     friend class QtConnectionObject;
189 };
190
191 class QtConnectionObject: public QObject
192 {
193 public:
194     QtConnectionObject(PassRefPtr<QtInstance> instance, int signalIndex, JSObject* thisObject, JSObject* funcObject);
195     ~QtConnectionObject();
196
197     static const QMetaObject staticMetaObject;
198     virtual const QMetaObject *metaObject() const;
199     virtual void *qt_metacast(const char *);
200     virtual int qt_metacall(QMetaObject::Call, int, void **argv);
201
202     bool match(QObject *sender, int signalIndex, JSObject* thisObject, JSObject *funcObject);
203
204     // actual slot:
205     void execute(void **argv);
206
207 private:
208     RefPtr<QtInstance> m_instance;
209     int m_signalIndex;
210     QObject* m_originalObject; // only used as a key, not dereferenced
211     ProtectedPtr<JSObject> m_thisObject;
212     ProtectedPtr<JSObject> m_funcObject;
213 };
214
215 QVariant convertValueToQVariant(ExecState* exec, JSValue* value, QMetaType::Type hint, int *distance);
216
217 } // namespace Bindings
218 } // namespace KJS
219
220 #endif