2 * Copyright (C) 2006 Trolltech ASA
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.
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.
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
20 #ifndef BINDINGS_QT_RUNTIME_H_
21 #define BINDINGS_QT_RUNTIME_H_
24 #include "runtime_method.h"
27 #include <qbytearray.h>
28 #include <qmetaobject.h>
37 class QtField : public Field {
46 QtField(const QMetaProperty &p)
47 : m_type(MetaProperty), m_property(p)
50 QtField(const QByteArray &b)
51 : m_type(DynamicProperty), m_dynamicProperty(b)
54 QtField(QObject *child)
55 : m_type(ChildObject), m_childObject(child)
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;}
64 QByteArray m_dynamicProperty;
65 QMetaProperty m_property;
66 QPointer<QObject> m_childObject;
70 class QtMethod : public Method
73 QtMethod(const QMetaObject *mo, int i, const QByteArray &ident, int numParameters)
77 m_nParams(numParameters)
80 virtual const char* name() const { return m_identifier.constData(); }
81 virtual int numParameters() const { return m_nParams; }
84 friend class QtInstance;
85 const QMetaObject *m_metaObject;
87 QByteArray m_identifier;
92 template <typename T> class QtArray : public Array
95 QtArray(QList<T> list, QMetaType::Type type, PassRefPtr<RootObject>);
98 RootObject* rootObject() const;
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;}
105 mutable QList<T> m_list; // setValueAt is const!
106 unsigned int m_length;
107 QMetaType::Type m_type;
110 // Based on RuntimeMethod
112 // Extra data classes (to avoid the CELL_SIZE limit on JS objects)
114 class QtRuntimeMethodData {
116 virtual ~QtRuntimeMethodData();
117 RefPtr<QtInstance> m_instance;
120 class QtRuntimeConnectionMethod;
121 class QtRuntimeMetaMethodData : public QtRuntimeMethodData {
123 ~QtRuntimeMetaMethodData();
124 QByteArray m_signature;
127 QtRuntimeConnectionMethod *m_connect;
128 QtRuntimeConnectionMethod *m_disconnect;
131 class QtRuntimeConnectionMethodData : public QtRuntimeMethodData {
133 ~QtRuntimeConnectionMethodData();
134 QByteArray m_signature;
139 // Common base class (doesn't really do anything interesting)
140 class QtRuntimeMethod : public InternalFunctionImp
143 virtual ~QtRuntimeMethod();
145 virtual CodeType codeType() const;
146 virtual Completion execute(ExecState *exec);
149 QtRuntimeMethodData *d_func() const {return d_ptr;}
150 QtRuntimeMethod(QtRuntimeMethodData *dd, ExecState *exec, const Identifier &n, PassRefPtr<QtInstance> inst);
151 QtRuntimeMethodData *d_ptr;
154 class QtRuntimeMetaMethod : public QtRuntimeMethod
157 QtRuntimeMetaMethod(ExecState *exec, const Identifier &n, PassRefPtr<QtInstance> inst, int index, const QByteArray& signature, bool allowPrivate);
159 virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
160 virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List &args);
165 QtRuntimeMetaMethodData* d_func() const {return reinterpret_cast<QtRuntimeMetaMethodData*>(d_ptr);}
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&);
173 class QtConnectionObject;
174 class QtRuntimeConnectionMethod : public QtRuntimeMethod
177 QtRuntimeConnectionMethod(ExecState *exec, const Identifier &n, bool isConnect, PassRefPtr<QtInstance> inst, int index, const QByteArray& signature );
179 virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
180 virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List &args);
183 QtRuntimeConnectionMethodData* d_func() const {return reinterpret_cast<QtRuntimeConnectionMethodData*>(d_ptr);}
186 static JSValue *lengthGetter(ExecState *, JSObject *, const Identifier&, const PropertySlot&);
187 static QMultiMap<QObject *, QtConnectionObject *> connections;
188 friend class QtConnectionObject;
191 class QtConnectionObject: public QObject
194 QtConnectionObject(PassRefPtr<QtInstance> instance, int signalIndex, JSObject* thisObject, JSObject* funcObject);
195 ~QtConnectionObject();
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);
202 bool match(QObject *sender, int signalIndex, JSObject* thisObject, JSObject *funcObject);
205 void execute(void **argv);
208 RefPtr<QtInstance> m_instance;
210 QObject* m_originalObject; // only used as a key, not dereferenced
211 ProtectedPtr<JSObject> m_thisObject;
212 ProtectedPtr<JSObject> m_funcObject;
215 QVariant convertValueToQVariant(ExecState* exec, JSValue* value, QMetaType::Type hint, int *distance);
217 } // namespace Bindings