/**************************************************************************** ** ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL-ONLY$ ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSCRIPTDECLARATIVECLASSOBJECT_P_H #define QSCRIPTDECLARATIVECLASSOBJECT_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qscriptdeclarativeclass_p.h" #include "qscriptv8objectwrapper_p.h" #include "qscriptcontext_p.h" #include QT_BEGIN_NAMESPACE class QScriptDeclarativeClassPrivate { public: QScriptDeclarativeClassPrivate() : engine(0), q_ptr(0), context(0), supportsCall(false) {} QScriptEngine *engine; QScriptDeclarativeClass *q_ptr; QScriptContext *context; //FIXME: avoid global statics static QSet identifiers; bool supportsCall:1; static QScriptDeclarativeClassPrivate *get(QScriptDeclarativeClass *c) { return c->d_ptr.data(); } }; struct QScriptDeclarativeClassObject : QScriptV8ObjectWrapper { QScopedPointer obj; QScriptDeclarativeClass* scriptClass; v8::Handle property(v8::Local property) { QScriptDeclarativeClassPrivate* scriptDeclarativeClassP = QScriptDeclarativeClassPrivate::get(scriptClass); QScopedValueRollback saveContext(scriptDeclarativeClassP->context); scriptDeclarativeClassP->context = engine->currentContext(); QScriptDeclarativeClass::PersistentIdentifier identifier = scriptClass->createPersistentIdentifier(QScriptConverter::toString(property)); QScriptClass::QueryFlags fl = scriptClass->queryProperty(obj.data(), identifier.identifier, QScriptClass::HandlesReadAccess); if (fl & QScriptClass::HandlesReadAccess) { QScriptValue result = scriptClass->property(obj.data(), identifier.identifier).toScriptValue(QScriptEnginePrivate::get(engine)); return QScriptValuePrivate::get(result)->asV8Value(engine); } return v8::Handle(); } v8::Handle setProperty(v8::Local property, v8::Local value) { QScriptDeclarativeClassPrivate* scriptDeclarativeClassP = QScriptDeclarativeClassPrivate::get(scriptClass); QScopedValueRollback saveContext(scriptDeclarativeClassP->context); scriptDeclarativeClassP->context = engine->currentContext(); QScriptDeclarativeClass::PersistentIdentifier identifier = scriptClass->createPersistentIdentifier(QScriptConverter::toString(property)); QScriptClass::QueryFlags fl = scriptClass->queryProperty(obj.data(), identifier.identifier, QScriptClass::HandlesWriteAccess); if (fl & QScriptClass::HandlesWriteAccess) { scriptClass->setProperty(obj.data(), identifier.identifier, QScriptValuePrivate::get(new QScriptValuePrivate(engine, value))); return value; } return v8::Handle(); } v8::Handle property(uint32_t index) { return property(v8::Integer::New(index)->ToString()); } v8::Handle setProperty(uint32_t index, v8::Local value) { return setProperty(v8::Integer::New(index)->ToString(), value); } v8::Handle call() { QScriptValue result = scriptClass->call(obj.data(), engine->currentContext()).toScriptValue(QScriptEnginePrivate::get(engine)); return QScriptValuePrivate::get(result)->asV8Value(engine); } static v8::Handle createFunctionTemplate(QScriptEnginePrivate *engine) { using namespace QScriptV8ObjectWrapperHelper; v8::HandleScope handleScope; v8::Handle funcTempl = v8::FunctionTemplate::New(); v8::Handle instTempl = funcTempl->InstanceTemplate(); instTempl->SetInternalFieldCount(1); instTempl->SetCallAsFunctionHandler(callAsFunction); instTempl->SetNamedPropertyHandler(namedPropertyGetter, namedPropertySetter); instTempl->SetIndexedPropertyHandler(indexedPropertyGetter, indexedPropertySetter); return handleScope.Close(funcTempl); } static v8::Handle newInstance(QScriptEnginePrivate *engine, QScriptDeclarativeClass *scriptClass, QScriptDeclarativeClass::Object *object) { v8::HandleScope handleScope; QScriptDeclarativeClassObject *data = new QScriptDeclarativeClassObject; data->engine = engine; data->obj.reset(object); data->scriptClass = scriptClass; return handleScope.Close(createInstance(data)); } static inline QScriptDeclarativeClass *declarativeClass(const QScriptValuePrivate *v) { QScriptDeclarativeClassObject *o = safeGet(v); if (o) return o->scriptClass; return 0; } static inline QScriptDeclarativeClass::Object *object(const QScriptValuePrivate *v) { QScriptDeclarativeClassObject *o = safeGet(v); if (o) return o->obj.data(); return 0; } }; QT_END_NAMESPACE #endif