Showing the changes to libraries/script-engine/src/ArrayBufferViewClass.cpp (1 of 14 files). Show all
Unified · Split
| @@ -11,7 +11,8 @@ · 10 unmodified lines | ||
| 11 | 11 | |
| 12 | 12 | #include "ArrayBufferViewClass.h" |
| 13 | 13 | |
| 14 | −Q_DECLARE_METATYPE(QByteArray*) | |
| 14 | +int qScriptClassPointerMetaTypeId = qRegisterMetaType<QScriptClass*>(); | |
| 15 | +int qByteArrayMetaTypeId = qRegisterMetaType<QByteArray>(); | |
| 15 | 16 | |
| 16 | 17 | ArrayBufferViewClass::ArrayBufferViewClass(ScriptEngine* scriptEngine) : |
| 17 | 18 | QObject(scriptEngine), |
| @@ -21,6 +22,7 @@ _scriptEngine(scriptEngine) { · 3 unmodified lines | ||
| 21 | 22 | _bufferName = engine()->toStringHandle(BUFFER_PROPERTY_NAME.toLatin1()); |
| 22 | 23 | _byteOffsetName = engine()->toStringHandle(BYTE_OFFSET_PROPERTY_NAME.toLatin1()); |
| 23 | 24 | _byteLengthName = engine()->toStringHandle(BYTE_LENGTH_PROPERTY_NAME.toLatin1()); |
| 25 | + registerMetaTypes(scriptEngine); | |
| 24 | 26 | } |
| 25 | 27 | |
| 26 | 28 | QScriptClass::QueryFlags ArrayBufferViewClass::queryProperty(const QScriptValue& object, |
| @@ -50,3 +52,34 @@ QScriptValue::PropertyFlags ArrayBufferViewClass::propertyFlags(const QScriptVal · 23 unmodified lines | ||
| 50 | 52 | const QScriptString& name, uint id) { |
| 51 | 53 | return QScriptValue::Undeletable; |
| 52 | 54 | } |
| 55 | + | |
| 56 | +namespace { | |
| 57 | + void byteArrayFromScriptValue(const QScriptValue& object, QByteArray& byteArray) { | |
| 58 | + if (object.isValid()) { | |
| 59 | + if (object.isObject()) { | |
| 60 | + if (object.isArray()) { | |
| 61 | + auto Uint8Array = object.engine()->globalObject().property("Uint8Array"); | |
| 62 | + auto typedArray = Uint8Array.construct(QScriptValueList{object}); | |
| 63 | + byteArray = qvariant_cast<QByteArray>(typedArray.property("buffer").toVariant()); | |
| 64 | + } else { | |
| 65 | + byteArray = qvariant_cast<QByteArray>(object.data().toVariant()); | |
| 66 | + } | |
| 67 | + } else { | |
| 68 | + byteArray = object.toString().toUtf8(); | |
| 69 | + } | |
| 70 | + } | |
| 71 | + } | |
| 72 | + | |
| 73 | + QScriptValue byteArrayToScriptValue(QScriptEngine *engine, const QByteArray& byteArray) { | |
| 74 | + QScriptValue data = engine->newVariant(QVariant::fromValue(byteArray)); | |
| 75 | + QScriptValue constructor = engine->globalObject().property("ArrayBuffer"); | |
| 76 | + Q_ASSERT(constructor.isValid()); | |
| 77 | + auto array = qscriptvalue_cast<QScriptClass*>(constructor.data()); | |
| 78 | + Q_ASSERT(array); | |
| 79 | + return engine->newObject(array, data); | |
| 80 | + } | |
| 81 | +} | |
| 82 | + | |
| 83 | +void ArrayBufferViewClass::registerMetaTypes(QScriptEngine* scriptEngine) { | |
| 84 | + qScriptRegisterMetaType(scriptEngine, byteArrayToScriptValue, byteArrayFromScriptValue); | |
| 85 | +} | |