5c5599b31dc0e7f92e23cc7948984d6e9ac245c7
[profile/ivi/qtdeclarative.git] / src / declarative / qml / qdeclarativevmemetaobject_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: http://www.qt-project.org/
6 **
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 **
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 **
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
29 **
30 ** Other Usage
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QDECLARATIVEVMEMETAOBJECT_P_H
43 #define QDECLARATIVEVMEMETAOBJECT_P_H
44
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is not part of the Qt API.  It exists purely as an
50 // implementation detail.  This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55
56 #include "qdeclarative.h"
57
58 #include <QtCore/QMetaObject>
59 #include <QtCore/QBitArray>
60 #include <QtCore/QPair>
61 #include <QtGui/QColor>
62 #include <QtCore/QDate>
63 #include <QtCore/qlist.h>
64 #include <QtCore/qdebug.h>
65
66 #include <private/qobject_p.h>
67
68 #include "qdeclarativeguard_p.h"
69 #include "qdeclarativecompiler_p.h"
70 #include "qdeclarativecontext_p.h"
71
72 #include <private/qv8engine_p.h>
73
74 #include <private/qv8_p.h>
75
76 QT_BEGIN_NAMESPACE
77
78 #define QML_ALIAS_FLAG_PTR 0x00000001
79
80 struct QDeclarativeVMEMetaData
81 {
82     short varPropertyCount;
83     short propertyCount;
84     short aliasCount;
85     short signalCount;
86     short methodCount;
87     short dummyForAlignment; // Add padding to ensure that the following
88                              // AliasData/PropertyData/MethodData is int aligned.
89
90     struct AliasData {
91         int contextIdx;
92         int propertyIdx;
93         int flags;
94
95         bool isObjectAlias() const {
96             return propertyIdx == -1;
97         }
98         bool isPropertyAlias() const {
99             return !isObjectAlias() && !(propertyIdx & 0xFF000000);
100         }
101         bool isValueTypeAlias() const {
102             return !isObjectAlias() && (propertyIdx & 0xFF000000);
103         }
104         int propertyIndex() const {
105             return propertyIdx & 0x0000FFFF;
106         }
107         int valueTypeIndex() const {
108             return (propertyIdx & 0x00FF0000) >> 16;
109         }
110         int valueType() const {
111             return ((unsigned int)propertyIdx) >> 24;
112         }
113     };
114     
115     struct PropertyData {
116         int propertyType;
117     };
118
119     struct MethodData {
120         int parameterCount;
121         int bodyOffset;
122         int bodyLength;
123         int lineNumber;
124     };
125
126     PropertyData *propertyData() const {
127         return (PropertyData *)(((const char *)this) + sizeof(QDeclarativeVMEMetaData));
128     }
129
130     AliasData *aliasData() const {
131         return (AliasData *)(propertyData() + propertyCount);
132     }
133
134     MethodData *methodData() const {
135         return (MethodData *)(aliasData() + aliasCount);
136     }
137 };
138
139 class QV8QObjectWrapper;
140 class QDeclarativeVMEVariant;
141 class QDeclarativeRefCount;
142 class QDeclarativeVMEMetaObjectEndpoint;
143 class Q_AUTOTEST_EXPORT QDeclarativeVMEMetaObject : public QAbstractDynamicMetaObject,
144                                                     public QV8GCCallback::Node
145 {
146 public:
147     QDeclarativeVMEMetaObject(QObject *obj, const QMetaObject *other, const QDeclarativeVMEMetaData *data,
148                      QDeclarativeCompiledData *compiledData);
149     ~QDeclarativeVMEMetaObject();
150
151     bool aliasTarget(int index, QObject **target, int *coreIndex, int *valueTypeIndex) const;
152     void registerInterceptor(int index, int valueIndex, QDeclarativePropertyValueInterceptor *interceptor);
153     v8::Handle<v8::Function> vmeMethod(int index);
154     int vmeMethodLineNumber(int index);
155     void setVmeMethod(int index, v8::Persistent<v8::Function>);
156     v8::Handle<v8::Value> vmeProperty(int index);
157     void setVMEProperty(int index, v8::Handle<v8::Value> v);
158
159     void connectAliasSignal(int index);
160
161 protected:
162     virtual int metaCall(QMetaObject::Call _c, int _id, void **_a);
163
164 private:
165     friend class QDeclarativeVMEMetaObjectEndpoint;
166
167     QObject *object;
168     QDeclarativeCompiledData *compiledData;
169     QDeclarativeGuardedContextData ctxt;
170
171     const QDeclarativeVMEMetaData *metaData;
172     int propOffset;
173     int methodOffset;
174
175     QDeclarativeVMEVariant *data;
176     QDeclarativeVMEMetaObjectEndpoint *aliasEndpoints;
177
178     v8::Persistent<v8::Array> varProperties;
179     int firstVarPropertyIndex;
180     bool varPropertiesInitialized;
181     static void VarPropertiesWeakReferenceCallback(v8::Persistent<v8::Value> object, void* parameter);
182     static void GcPrologueCallback(QV8GCCallback::Node *node);
183     inline void allocateVarPropertiesArray();
184     inline void ensureVarPropertiesAllocated();
185
186     void connectAlias(int aliasId);
187     QBitArray aConnected;
188     QBitArray aInterceptors;
189     QHash<int, QPair<int, QDeclarativePropertyValueInterceptor*> > interceptors;
190
191     v8::Persistent<v8::Function> *v8methods;
192     v8::Handle<v8::Function> method(int);
193
194     v8::Handle<v8::Value> readVarProperty(int);
195     void writeVarProperty(int, v8::Handle<v8::Value>);
196     QVariant readPropertyAsVariant(int);
197     void writeProperty(int, const QVariant &);
198
199     QAbstractDynamicMetaObject *parent;
200
201     void listChanged(int);
202     class List : public QList<QObject*>
203     {
204     public:
205         List(int lpi) : notifyIndex(lpi) {}
206         int notifyIndex;
207     };
208     QList<List> listProperties;
209
210     static void list_append(QDeclarativeListProperty<QObject> *, QObject *);
211     static int list_count(QDeclarativeListProperty<QObject> *);
212     static QObject *list_at(QDeclarativeListProperty<QObject> *, int);
213     static void list_clear(QDeclarativeListProperty<QObject> *);
214
215     friend class QV8GCCallback;
216     friend class QV8QObjectWrapper;
217 };
218
219 QT_END_NAMESPACE
220
221 #endif // QDECLARATIVEVMEMETAOBJECT_P_H