History

CR feedback and code cleanup

humbletim committed 8 years ago

Commit 3a735c11 parent 395cc6614 files · +652 −365Browse files

Showing the changes to libraries/script-engine/src/ArrayBufferViewClass.cpp (1 of 14 files). Show all

Unified · Split

libraries/script-engine/src/ArrayBufferViewClass.cpp+34−1
@@ -11,7 +11,8 @@ · 10 unmodified lines
1111
1212 #include "ArrayBufferViewClass.h"
1313
14−Q_DECLARE_METATYPE(QByteArray*)
14+int qScriptClassPointerMetaTypeId = qRegisterMetaType<QScriptClass*>();
15+int qByteArrayMetaTypeId = qRegisterMetaType<QByteArray>();
1516
1617 ArrayBufferViewClass::ArrayBufferViewClass(ScriptEngine* scriptEngine) :
1718 QObject(scriptEngine),
@@ -21,6 +22,7 @@ _scriptEngine(scriptEngine) { · 3 unmodified lines
2122 _bufferName = engine()->toStringHandle(BUFFER_PROPERTY_NAME.toLatin1());
2223 _byteOffsetName = engine()->toStringHandle(BYTE_OFFSET_PROPERTY_NAME.toLatin1());
2324 _byteLengthName = engine()->toStringHandle(BYTE_LENGTH_PROPERTY_NAME.toLatin1());
25+ registerMetaTypes(scriptEngine);
2426 }
2527
2628 QScriptClass::QueryFlags ArrayBufferViewClass::queryProperty(const QScriptValue& object,
@@ -50,3 +52,34 @@ QScriptValue::PropertyFlags ArrayBufferViewClass::propertyFlags(const QScriptVal · 23 unmodified lines
5052 const QScriptString& name, uint id) {
5153 return QScriptValue::Undeletable;
5254 }
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+}