qscriptengine.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:13k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtScript module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QSCRIPTENGINE_H
  38. #define QSCRIPTENGINE_H
  39. #include <QtCore/qmetatype.h>
  40. #ifndef QT_NO_SCRIPT
  41. #include <QtCore/qvariant.h>
  42. #ifndef QT_NO_QOBJECT
  43. #include <QtCore/qobject.h>
  44. #else
  45. #include <QtCore/qobjectdefs.h>
  46. #endif
  47. #include <QtScript/qscriptvalue.h>
  48. #include <QtScript/qscriptcontext.h>
  49. #include <QtScript/qscriptstring.h>
  50. QT_BEGIN_HEADER
  51. QT_BEGIN_NAMESPACE
  52. QT_MODULE(Script)
  53. class QDateTime;
  54. class QScriptClass;
  55. class QScriptEngineAgent;
  56. class QScriptEnginePrivate;
  57. #ifndef QT_NO_QOBJECT
  58. template <class T>
  59. inline QScriptValue qscriptQMetaObjectConstructor(QScriptContext *, QScriptEngine *, T *)
  60. {
  61.     return 0;
  62. }
  63. #endif // QT_NO_QOBJECT
  64. #ifndef QT_NO_REGEXP
  65. class QRegExp;
  66. #endif
  67. #ifndef QT_NO_MEMBER_TEMPLATES
  68. template <typename T>
  69. inline QScriptValue qScriptValueFromValue(QScriptEngine *, const T &);
  70. template <typename T>
  71. inline T qScriptValueToValue(const QScriptValue &);
  72. #endif
  73. class Q_SCRIPT_EXPORT QScriptEngine
  74. #ifndef QT_NO_QOBJECT
  75.     : public QObject
  76. #endif
  77. {
  78. #ifndef QT_NO_QOBJECT
  79.     Q_OBJECT
  80. #endif
  81. public:
  82.     enum ValueOwnership {
  83.         QtOwnership,
  84.         ScriptOwnership,
  85.         AutoOwnership
  86.     };
  87.     enum QObjectWrapOption {
  88.         ExcludeChildObjects = 0x0001,
  89.         ExcludeSuperClassMethods = 0x0002,
  90.         ExcludeSuperClassProperties = 0x0004,
  91.         SkipMethodsInEnumeration = 0x0008,
  92.         AutoCreateDynamicProperties = 0x0100,
  93.         PreferExistingWrapperObject = 0x0200
  94.     };
  95.     Q_DECLARE_FLAGS(QObjectWrapOptions, QObjectWrapOption)
  96.     QScriptEngine();
  97. #ifndef QT_NO_QOBJECT
  98.     explicit QScriptEngine(QObject *parent);
  99. #endif
  100.     virtual ~QScriptEngine();
  101.     QScriptValue globalObject() const;
  102.     QScriptContext *currentContext() const;
  103.     QScriptContext *pushContext();
  104.     void popContext();
  105.     bool canEvaluate(const QString &program) const;
  106.     QScriptValue evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1);
  107.     bool isEvaluating() const;
  108.     void abortEvaluation(const QScriptValue &result = QScriptValue());
  109.     bool hasUncaughtException() const;
  110.     QScriptValue uncaughtException() const;
  111.     int uncaughtExceptionLineNumber() const;
  112.     QStringList uncaughtExceptionBacktrace() const;
  113.     void clearExceptions();
  114.     QScriptValue nullValue();
  115.     QScriptValue undefinedValue();
  116.     typedef QScriptValue (*FunctionSignature)(QScriptContext *, QScriptEngine *);
  117.     typedef QScriptValue (*FunctionWithArgSignature)(QScriptContext *, QScriptEngine *, void *);
  118.     QScriptValue newFunction(FunctionSignature signature, int length = 0);
  119.     QScriptValue newFunction(FunctionSignature signature, const QScriptValue &prototype, int length = 0);
  120.     QScriptValue newFunction(FunctionWithArgSignature signature, void *arg);
  121.     QScriptValue newVariant(const QVariant &value);
  122.     QScriptValue newVariant(const QScriptValue &object, const QVariant &value);
  123. #ifndef QT_NO_REGEXP
  124.     QScriptValue newRegExp(const QRegExp &regexp);
  125. #endif
  126.     QScriptValue newObject();
  127.     QScriptValue newObject(QScriptClass *scriptClass, const QScriptValue &data = QScriptValue());
  128.     QScriptValue newArray(uint length = 0);
  129.     QScriptValue newRegExp(const QString &pattern, const QString &flags);
  130.     QScriptValue newDate(qsreal value);
  131.     QScriptValue newDate(const QDateTime &value);
  132.     QScriptValue newActivationObject();
  133. #ifndef QT_NO_QOBJECT
  134.     QScriptValue newQObject(QObject *object, ValueOwnership ownership = QtOwnership,
  135.                             const QObjectWrapOptions &options = 0);
  136.     QScriptValue newQObject(const QScriptValue &scriptObject, QObject *qtObject,
  137.                             ValueOwnership ownership = QtOwnership,
  138.                             const QObjectWrapOptions &options = 0);
  139.     QScriptValue newQMetaObject(const QMetaObject *metaObject, const QScriptValue &ctor = QScriptValue());
  140. #  ifndef QT_NO_MEMBER_TEMPLATES
  141.     template <class T> QScriptValue scriptValueFromQMetaObject();
  142. #  endif // QT_NO_MEMBER_TEMPLATES
  143. #endif // QT_NO_QOBJECT
  144.     QScriptValue defaultPrototype(int metaTypeId) const;
  145.     void setDefaultPrototype(int metaTypeId, const QScriptValue &prototype);
  146.     typedef QScriptValue (*MarshalFunction)(QScriptEngine *, const void *);
  147.     typedef void (*DemarshalFunction)(const QScriptValue &, void *);
  148. #ifndef QT_NO_MEMBER_TEMPLATES
  149.     template <typename T>
  150.     inline QScriptValue toScriptValue(const T &value)
  151.     {
  152.         return qScriptValueFromValue(this, value);
  153.     }
  154.     template <typename T>
  155.     inline T fromScriptValue(const QScriptValue &value)
  156.     {
  157.         return qScriptValueToValue<T>(value);
  158.     }
  159. #endif // QT_NO_MEMBER_TEMPLATES
  160.     QScriptValue importExtension(const QString &extension);
  161.     QStringList availableExtensions() const;
  162.     QStringList importedExtensions() const;
  163.     void collectGarbage();
  164.     void setProcessEventsInterval(int interval);
  165.     int processEventsInterval() const;
  166.     void setAgent(QScriptEngineAgent *agent);
  167.     QScriptEngineAgent *agent() const;
  168.     QScriptString toStringHandle(const QString &str);
  169.     QScriptValue objectById(qint64 id) const;
  170. #ifndef QT_NO_QOBJECT
  171. Q_SIGNALS:
  172.     void signalHandlerException(const QScriptValue &exception);
  173. #endif
  174. private:
  175.     QScriptValue create(int type, const void *ptr);
  176.     bool convert(const QScriptValue &value, int type, void *ptr);
  177.     void registerCustomType(int type, MarshalFunction mf, DemarshalFunction df,
  178.                             const QScriptValue &prototype);
  179.     friend inline void qScriptRegisterMetaType_helper(QScriptEngine *,
  180.         int, MarshalFunction, DemarshalFunction, const QScriptValue &);
  181.     friend inline QScriptValue qScriptValueFromValue_helper(QScriptEngine *, int, const void *);
  182.     friend inline bool qscriptvalue_cast_helper(const QScriptValue &, int, void *);
  183. protected:
  184. #ifdef QT_NO_QOBJECT
  185.     QScriptEnginePrivate *d_ptr;
  186.     QScriptEngine(QScriptEnginePrivate &dd);
  187. #else
  188.     QScriptEngine(QScriptEnginePrivate &dd, QObject *parent = 0);
  189. #endif
  190. private:
  191.     Q_DECLARE_PRIVATE(QScriptEngine)
  192.     Q_DISABLE_COPY(QScriptEngine)
  193. #ifndef QT_NO_QOBJECT
  194.     Q_PRIVATE_SLOT(d_func(), void _q_objectDestroyed(QObject *))
  195. #endif
  196. };
  197. #ifndef QT_NO_QOBJECT
  198. template <class T>
  199. inline QScriptValue qScriptValueFromQMetaObject(
  200.     QScriptEngine *engine
  201. #ifndef qdoc
  202.     , T * /* dummy */ = 0
  203. #endif
  204.     )
  205. {
  206.     typedef QScriptValue(*ConstructPtr)(QScriptContext *, QScriptEngine *, T *);
  207.     ConstructPtr cptr = qscriptQMetaObjectConstructor<T>;
  208.     return engine->newQMetaObject(&T::staticMetaObject,
  209.                                   engine->newFunction(reinterpret_cast<QScriptEngine::FunctionWithArgSignature>(cptr), 0));
  210. }
  211. #define Q_SCRIPT_DECLARE_QMETAOBJECT(T, _Arg1) 
  212. template<> inline QScriptValue qscriptQMetaObjectConstructor<T>(QScriptContext *ctx, QScriptEngine *eng, T *) 
  213.     _Arg1 arg1 = qscriptvalue_cast<_Arg1> (ctx->argument(0)); 
  214.     T* t = new T(arg1); 
  215.     if (ctx->isCalledAsConstructor()) 
  216.         return eng->newQObject(ctx->thisObject(), t, QScriptEngine::AutoOwnership); 
  217.     QScriptValue o = eng->newQObject(t, QScriptEngine::AutoOwnership); 
  218.     o.setPrototype(ctx->callee().property(QString::fromLatin1("prototype"))); 
  219.     return o; 
  220. }
  221. #  ifndef QT_NO_MEMBER_TEMPLATES
  222.     template <class T> QScriptValue QScriptEngine::scriptValueFromQMetaObject()
  223.     {
  224.         return qScriptValueFromQMetaObject<T>(this);
  225.     }
  226. #  endif // QT_NO_MEMBER_TEMPLATES
  227. #endif // QT_NO_QOBJECT
  228. inline QScriptValue qScriptValueFromValue_helper(QScriptEngine *engine, int type, const void *ptr)
  229. {
  230.     if (!engine)
  231.         return QScriptValue();
  232.     return engine->create(type, ptr);
  233. }
  234. template <typename T>
  235. inline QScriptValue qScriptValueFromValue(QScriptEngine *engine, const T &t)
  236. {
  237.     return qScriptValueFromValue_helper(engine, qMetaTypeId<T>(), &t);
  238. }
  239. template <>
  240. inline QScriptValue qScriptValueFromValue<QVariant>(QScriptEngine *engine, const QVariant &v)
  241. {
  242.     QScriptValue result = qScriptValueFromValue_helper(engine, v.userType(), v.data());
  243.     if (!result.isValid())
  244.         result = engine->newVariant(v);
  245.     return result;
  246. }
  247. inline bool qscriptvalue_cast_helper(const QScriptValue &value, int type, void *ptr)
  248. {
  249.     if (QScriptEngine *eng = value.engine())
  250.         return eng->convert(value, type, ptr);
  251.     return false;
  252. }
  253. template<typename T>
  254. T qscriptvalue_cast(const QScriptValue &value
  255. #ifndef Q_QDOC
  256. , T * = 0
  257. #endif
  258.     )
  259. {
  260.     T t;
  261.     const int id = qMetaTypeId<T>();
  262.     if (qscriptvalue_cast_helper(value, id, &t))
  263.         return t;
  264.     else if (value.isVariant())
  265.         return qvariant_cast<T>(value.toVariant());
  266.     return T();
  267. }
  268. template <typename T>
  269. inline T qScriptValueToValue(const QScriptValue &value)
  270. {
  271.     return qscriptvalue_cast<T>(value);
  272. }
  273. inline void qScriptRegisterMetaType_helper(QScriptEngine *eng, int type,
  274.                                            QScriptEngine::MarshalFunction mf,
  275.                                            QScriptEngine::DemarshalFunction df,
  276.                                            const QScriptValue &prototype)
  277. {
  278.     eng->registerCustomType(type, mf, df, prototype);
  279. }
  280. template<typename T>
  281. int qScriptRegisterMetaType(
  282.     QScriptEngine *eng,
  283.     QScriptValue (*toScriptValue)(QScriptEngine *, const T &t),
  284.     void (*fromScriptValue)(const QScriptValue &, T &t),
  285.     const QScriptValue &prototype = QScriptValue()
  286. #ifndef qdoc
  287.     , T * /* dummy */ = 0
  288. #endif
  289. )
  290. {
  291.     const int id = qRegisterMetaType<T>(); // make sure it's registered
  292.     qScriptRegisterMetaType_helper(
  293.         eng, id, reinterpret_cast<QScriptEngine::MarshalFunction>(toScriptValue),
  294.         reinterpret_cast<QScriptEngine::DemarshalFunction>(fromScriptValue),
  295.         prototype);
  296.     return id;
  297. }
  298. template <class Container>
  299. QScriptValue qScriptValueFromSequence(QScriptEngine *eng, const Container &cont)
  300. {
  301.     QScriptValue a = eng->newArray();
  302.     typename Container::const_iterator begin = cont.begin();
  303.     typename Container::const_iterator end = cont.end();
  304.     typename Container::const_iterator it;
  305.     quint32 i;
  306.     for (it = begin, i = 0; it != end; ++it, ++i)
  307.         a.setProperty(i, qScriptValueFromValue(eng, *it));
  308.     return a;
  309. }
  310. template <class Container>
  311. void qScriptValueToSequence(const QScriptValue &value, Container &cont)
  312. {
  313.     quint32 len = value.property(QLatin1String("length")).toUInt32();
  314.     for (quint32 i = 0; i < len; ++i) {
  315.         QScriptValue item = value.property(i);
  316. #if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET
  317.         cont.push_back(qscriptvalue_cast<Container::value_type>(item));
  318. #else
  319.         cont.push_back(qscriptvalue_cast<typename Container::value_type>(item));
  320. #endif
  321.     }
  322. }
  323. template<typename T>
  324. int qScriptRegisterSequenceMetaType(
  325.     QScriptEngine *engine,
  326.     const QScriptValue &prototype = QScriptValue()
  327. #ifndef qdoc
  328.     , T * /* dummy */ = 0
  329. #endif
  330. )
  331. {
  332.     return qScriptRegisterMetaType<T>(engine, qScriptValueFromSequence,
  333.                                       qScriptValueToSequence, prototype);
  334. }
  335. #ifndef QT_NO_QOBJECT
  336. Q_SCRIPT_EXPORT bool qScriptConnect(QObject *sender, const char *signal,
  337.                                     const QScriptValue &receiver,
  338.                                     const QScriptValue &function);
  339. Q_SCRIPT_EXPORT bool qScriptDisconnect(QObject *sender, const char *signal,
  340.                                        const QScriptValue &receiver,
  341.                                        const QScriptValue &function);
  342. #endif // QT_NO_QOBJECT
  343. Q_DECLARE_OPERATORS_FOR_FLAGS(QScriptEngine::QObjectWrapOptions)
  344. QT_END_NAMESPACE
  345. QT_END_HEADER
  346. #endif // QT_NO_SCRIPT
  347. #endif // QSCRIPTENGINE_H