1 /****************************************************************************
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 ** This file is part of the QtScript module of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
10 ** This file contains pre-release code and may not be distributed.
11 ** You may use this file in accordance with the terms and conditions
12 ** contained in the either Technology Preview License Agreement or the
13 ** Beta Release License Agreement.
15 ** GNU Lesser General Public License Usage
16 ** Alternatively, this file may be used under the terms of the GNU Lesser
17 ** General Public License version 2.1 as published by the Free Software
18 ** Foundation and appearing in the file LICENSE.LGPL included in the
19 ** packaging of this file. Please review the following information to
20 ** ensure the GNU Lesser General Public License version 2.1 requirements
21 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 ** In addition, as a special exception, Nokia gives you certain
24 ** additional rights. These rights are described in the Nokia Qt LGPL
25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
28 ** GNU General Public License Usage
29 ** Alternatively, this file may be used under the terms of the GNU
30 ** General Public License version 3.0 as published by the Free Software
31 ** Foundation and appearing in the file LICENSE.GPL included in the
32 ** packaging of this file. Please review the following information to
33 ** ensure the GNU General Public License version 3.0 requirements will be
34 ** met: http://www.gnu.org/copyleft/gpl.html.
36 ** If you are unsure which license is appropriate for your use, please
37 ** contact the sales department at http://www.qtsoftware.com/contact.
40 ****************************************************************************/
42 #ifndef QSCRIPTENGINE_H
43 #define QSCRIPTENGINE_H
45 #include <QtCore/qmetatype.h>
49 #include <QtCore/qvariant.h>
52 #include <QtCore/qobject.h>
54 #include <QtCore/qobjectdefs.h>
57 #include <QtScript/qscriptvalue.h>
58 #include <QtScript/qscriptcontext.h>
59 #include <QtScript/qscriptstring.h>
69 class QScriptEngineAgent
;
70 class QScriptEnginePrivate
;
75 inline QScriptValue
qscriptQMetaObjectConstructor(QScriptContext
*, QScriptEngine
*, T
*)
77 return QScriptValue();
80 #endif // QT_NO_QOBJECT
86 #ifndef QT_NO_MEMBER_TEMPLATES
88 inline QScriptValue
qScriptValueFromValue(QScriptEngine
*, const T
&);
91 inline T
qScriptValueToValue(const QScriptValue
&);
94 class QScriptSyntaxCheckResultPrivate
;
95 class Q_SCRIPT_EXPORT QScriptSyntaxCheckResult
104 QScriptSyntaxCheckResult(const QScriptSyntaxCheckResult
&other
);
105 ~QScriptSyntaxCheckResult();
108 int errorLineNumber() const;
109 int errorColumnNumber() const;
110 QString
errorMessage() const;
112 QScriptSyntaxCheckResult
&operator=(const QScriptSyntaxCheckResult
&other
);
115 QScriptSyntaxCheckResult();
116 QScriptSyntaxCheckResult(QScriptSyntaxCheckResultPrivate
*d
);
117 QScriptSyntaxCheckResultPrivate
*d_ptr
;
119 Q_DECLARE_PRIVATE(QScriptSyntaxCheckResult
)
120 friend class QScriptEnginePrivate
;
123 class Q_SCRIPT_EXPORT QScriptEngine
124 #ifndef QT_NO_QOBJECT
128 #ifndef QT_NO_QOBJECT
132 enum ValueOwnership
{
138 enum QObjectWrapOption
{
139 ExcludeChildObjects
= 0x0001,
140 ExcludeSuperClassMethods
= 0x0002,
141 ExcludeSuperClassProperties
= 0x0004,
142 ExcludeSuperClassContents
= 0x0006,
143 SkipMethodsInEnumeration
= 0x0008,
144 ExcludeDeleteLater
= 0x0010,
146 AutoCreateDynamicProperties
= 0x0100,
147 PreferExistingWrapperObject
= 0x0200
149 Q_DECLARE_FLAGS(QObjectWrapOptions
, QObjectWrapOption
)
152 #ifndef QT_NO_QOBJECT
153 explicit QScriptEngine(QObject
*parent
);
155 virtual ~QScriptEngine();
157 QScriptValue
globalObject() const;
158 void setGlobalObject(const QScriptValue
&object
);
160 QScriptContext
*currentContext() const;
161 QScriptContext
*pushContext();
164 bool canEvaluate(const QString
&program
) const;
165 static QScriptSyntaxCheckResult
checkSyntax(const QString
&program
);
167 QScriptValue
evaluate(const QString
&program
, const QString
&fileName
= QString(), int lineNumber
= 1);
169 bool isEvaluating() const;
170 void abortEvaluation(const QScriptValue
&result
= QScriptValue());
172 bool hasUncaughtException() const;
173 QScriptValue
uncaughtException() const;
174 int uncaughtExceptionLineNumber() const;
175 QStringList
uncaughtExceptionBacktrace() const;
176 void clearExceptions();
178 QScriptValue
nullValue();
179 QScriptValue
undefinedValue();
181 typedef QScriptValue (*FunctionSignature
)(QScriptContext
*, QScriptEngine
*);
182 typedef QScriptValue (*FunctionWithArgSignature
)(QScriptContext
*, QScriptEngine
*, void *);
184 QScriptValue
newFunction(FunctionSignature signature
, int length
= 0);
185 QScriptValue
newFunction(FunctionSignature signature
, const QScriptValue
&prototype
, int length
= 0);
187 QScriptValue
newFunction(FunctionWithArgSignature signature
, void *arg
);
189 QScriptValue
newVariant(const QVariant
&value
);
190 QScriptValue
newVariant(const QScriptValue
&object
, const QVariant
&value
);
193 QScriptValue
newRegExp(const QRegExp
®exp
);
196 QScriptValue
newObject();
197 QScriptValue
newObject(QScriptClass
*scriptClass
, const QScriptValue
&data
= QScriptValue());
198 QScriptValue
newArray(uint length
= 0);
199 QScriptValue
newRegExp(const QString
&pattern
, const QString
&flags
);
200 QScriptValue
newDate(qsreal value
);
201 QScriptValue
newDate(const QDateTime
&value
);
202 QScriptValue
newActivationObject();
204 #ifndef QT_NO_QOBJECT
205 QScriptValue
newQObject(QObject
*object
, ValueOwnership ownership
= QtOwnership
,
206 const QObjectWrapOptions
&options
= 0);
207 QScriptValue
newQObject(const QScriptValue
&scriptObject
, QObject
*qtObject
,
208 ValueOwnership ownership
= QtOwnership
,
209 const QObjectWrapOptions
&options
= 0);
211 QScriptValue
newQMetaObject(const QMetaObject
*metaObject
, const QScriptValue
&ctor
= QScriptValue());
213 # ifndef QT_NO_MEMBER_TEMPLATES
214 template <class T
> QScriptValue
scriptValueFromQMetaObject();
215 # endif // QT_NO_MEMBER_TEMPLATES
217 #endif // QT_NO_QOBJECT
221 QScriptValue
defaultPrototype(int metaTypeId
) const;
222 void setDefaultPrototype(int metaTypeId
, const QScriptValue
&prototype
);
225 typedef QScriptValue (*MarshalFunction
)(QScriptEngine
*, const void *);
226 typedef void (*DemarshalFunction
)(const QScriptValue
&, void *);
230 #ifndef QT_NO_MEMBER_TEMPLATES
231 template <typename T
>
232 inline QScriptValue
toScriptValue(const T
&value
)
234 return qScriptValueFromValue(this, value
);
236 template <typename T
>
237 inline T
fromScriptValue(const QScriptValue
&value
)
239 return qScriptValueToValue
<T
>(value
);
241 #endif // QT_NO_MEMBER_TEMPLATES
243 void installTranslatorFunctions(const QScriptValue
&object
= QScriptValue());
245 QScriptValue
importExtension(const QString
&extension
);
246 QStringList
availableExtensions() const;
247 QStringList
importedExtensions() const;
249 void collectGarbage();
251 void setProcessEventsInterval(int interval
);
252 int processEventsInterval() const;
254 void setAgent(QScriptEngineAgent
*agent
);
255 QScriptEngineAgent
*agent() const;
257 QScriptString
toStringHandle(const QString
&str
);
258 QScriptValue
toObject(const QScriptValue
&value
);
260 QScriptValue
objectById(qint64 id
) const;
262 #ifndef QT_NO_QOBJECT
264 void signalHandlerException(const QScriptValue
&exception
);
268 QScriptValue
create(int type
, const void *ptr
);
270 bool convert(const QScriptValue
&value
, int type
, void *ptr
);
271 static bool convertV2(const QScriptValue
&value
, int type
, void *ptr
);
273 void registerCustomType(int type
, MarshalFunction mf
, DemarshalFunction df
,
274 const QScriptValue
&prototype
);
276 friend inline void qScriptRegisterMetaType_helper(QScriptEngine
*,
277 int, MarshalFunction
, DemarshalFunction
, const QScriptValue
&);
279 friend inline QScriptValue
qScriptValueFromValue_helper(QScriptEngine
*, int, const void *);
281 friend inline bool qscriptvalue_cast_helper(const QScriptValue
&, int, void *);
285 QScriptEnginePrivate
*d_ptr
;
287 QScriptEngine(QScriptEnginePrivate
&dd
);
289 QScriptEngine(QScriptEnginePrivate
&dd
, QObject
*parent
= 0);
293 Q_DECLARE_PRIVATE(QScriptEngine
)
294 Q_DISABLE_COPY(QScriptEngine
)
295 #ifndef QT_NO_QOBJECT
296 Q_PRIVATE_SLOT(d_func(), void _q_objectDestroyed(QObject
*))
300 #ifndef QT_NO_QOBJECT
302 inline QScriptValue
qScriptValueFromQMetaObject(
303 QScriptEngine
*engine
305 , T
* /* dummy */ = 0
309 typedef QScriptValue(*ConstructPtr
)(QScriptContext
*, QScriptEngine
*, T
*);
310 ConstructPtr cptr
= qscriptQMetaObjectConstructor
<T
>;
311 return engine
->newQMetaObject(&T::staticMetaObject
,
312 engine
->newFunction(reinterpret_cast<QScriptEngine::FunctionWithArgSignature
>(cptr
), 0));
315 #define Q_SCRIPT_DECLARE_QMETAOBJECT(T, _Arg1) \
316 template<> inline QScriptValue qscriptQMetaObjectConstructor<T>(QScriptContext *ctx, QScriptEngine *eng, T *) \
318 _Arg1 arg1 = qscriptvalue_cast<_Arg1> (ctx->argument(0)); \
319 T* t = new T(arg1); \
320 if (ctx->isCalledAsConstructor()) \
321 return eng->newQObject(ctx->thisObject(), t, QScriptEngine::AutoOwnership); \
322 QScriptValue o = eng->newQObject(t, QScriptEngine::AutoOwnership); \
323 o.setPrototype(ctx->callee().property(QString::fromLatin1("prototype"))); \
327 # ifndef QT_NO_MEMBER_TEMPLATES
328 template <class T
> QScriptValue
QScriptEngine::scriptValueFromQMetaObject()
330 return qScriptValueFromQMetaObject
<T
>(this);
332 # endif // QT_NO_MEMBER_TEMPLATES
334 #endif // QT_NO_QOBJECT
336 inline QScriptValue
qScriptValueFromValue_helper(QScriptEngine
*engine
, int type
, const void *ptr
)
339 return QScriptValue();
341 return engine
->create(type
, ptr
);
344 template <typename T
>
345 inline QScriptValue
qScriptValueFromValue(QScriptEngine
*engine
, const T
&t
)
347 return qScriptValueFromValue_helper(engine
, qMetaTypeId
<T
>(), &t
);
351 inline QScriptValue qScriptValueFromValue
<QVariant
>(QScriptEngine
*engine
, const QVariant
&v
)
353 QScriptValue result
= qScriptValueFromValue_helper(engine
, v
.userType(), v
.data());
354 if (!result
.isValid())
355 result
= engine
->newVariant(v
);
359 inline bool qscriptvalue_cast_helper(const QScriptValue
&value
, int type
, void *ptr
)
361 return QScriptEngine::convertV2(value
, type
, ptr
);
365 T
qscriptvalue_cast(const QScriptValue
&value
366 #if !defined qdoc && defined Q_CC_MSVC && _MSC_VER < 1300
372 const int id
= qMetaTypeId
<T
>();
374 if (qscriptvalue_cast_helper(value
, id
, &t
))
376 else if (value
.isVariant())
377 return qvariant_cast
<T
>(value
.toVariant());
382 #if !defined Q_CC_MSVC || _MSC_VER >= 1300
384 inline QVariant qscriptvalue_cast
<QVariant
>(const QScriptValue
&value
)
386 return value
.toVariant();
390 template <typename T
>
391 inline T
qScriptValueToValue(const QScriptValue
&value
)
393 return qscriptvalue_cast
<T
>(value
);
396 inline void qScriptRegisterMetaType_helper(QScriptEngine
*eng
, int type
,
397 QScriptEngine::MarshalFunction mf
,
398 QScriptEngine::DemarshalFunction df
,
399 const QScriptValue
&prototype
)
401 eng
->registerCustomType(type
, mf
, df
, prototype
);
405 int qScriptRegisterMetaType(
407 QScriptValue (*toScriptValue
)(QScriptEngine
*, const T
&t
),
408 void (*fromScriptValue
)(const QScriptValue
&, T
&t
),
409 const QScriptValue
&prototype
= QScriptValue()
411 , T
* /* dummy */ = 0
415 const int id
= qRegisterMetaType
<T
>(); // make sure it's registered
417 qScriptRegisterMetaType_helper(
418 eng
, id
, reinterpret_cast<QScriptEngine::MarshalFunction
>(toScriptValue
),
419 reinterpret_cast<QScriptEngine::DemarshalFunction
>(fromScriptValue
),
425 template <class Container
>
426 QScriptValue
qScriptValueFromSequence(QScriptEngine
*eng
, const Container
&cont
)
428 QScriptValue a
= eng
->newArray();
429 typename
Container::const_iterator begin
= cont
.begin();
430 typename
Container::const_iterator end
= cont
.end();
431 typename
Container::const_iterator it
;
433 for (it
= begin
, i
= 0; it
!= end
; ++it
, ++i
)
434 a
.setProperty(i
, qScriptValueFromValue(eng
, *it
));
438 template <class Container
>
439 void qScriptValueToSequence(const QScriptValue
&value
, Container
&cont
)
441 quint32 len
= value
.property(QLatin1String("length")).toUInt32();
442 for (quint32 i
= 0; i
< len
; ++i
) {
443 QScriptValue item
= value
.property(i
);
444 #if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET
445 cont
.push_back(qscriptvalue_cast
<Container::value_type
>(item
));
447 cont
.push_back(qscriptvalue_cast
<typename
Container::value_type
>(item
));
453 int qScriptRegisterSequenceMetaType(
454 QScriptEngine
*engine
,
455 const QScriptValue
&prototype
= QScriptValue()
457 , T
* /* dummy */ = 0
461 return qScriptRegisterMetaType
<T
>(engine
, qScriptValueFromSequence
,
462 qScriptValueToSequence
, prototype
);
465 #ifndef QT_NO_QOBJECT
466 Q_SCRIPT_EXPORT
bool qScriptConnect(QObject
*sender
, const char *signal
,
467 const QScriptValue
&receiver
,
468 const QScriptValue
&function
);
469 Q_SCRIPT_EXPORT
bool qScriptDisconnect(QObject
*sender
, const char *signal
,
470 const QScriptValue
&receiver
,
471 const QScriptValue
&function
);
472 #endif // QT_NO_QOBJECT
474 Q_DECLARE_OPERATORS_FOR_FLAGS(QScriptEngine::QObjectWrapOptions
)
480 #endif // QT_NO_SCRIPT
481 #endif // QSCRIPTENGINE_H