Showing the changes to libraries/script-engine/src/ArrayBufferClass.cpp (1 of 4 files). Show all
Unified · Split
| @@ -18,14 +18,19 @@ · 17 unmodified lines | |||
| 18 | 18 | ||
| 19 | #include "ArrayBufferClass.h" | 19 | #include "ArrayBufferClass.h" |
| 20 | 20 | ||
| 21 | |||
| 21 | static const QString CLASS_NAME = "ArrayBuffer"; | 22 | static const QString CLASS_NAME = "ArrayBuffer"; |
| 22 | 23 | ||
| 24 | // FIXME: Q_DECLARE_METATYPE is global and really belongs in a shared header file, not per .cpp like this | ||
| 25 | // (see DataViewClass.cpp, etc. which would also have to be updated to resolve) | ||
| 26 | Q_DECLARE_METATYPE(QScriptClass*) | ||
| 23 | Q_DECLARE_METATYPE(QByteArray*) | 27 | Q_DECLARE_METATYPE(QByteArray*) |
| 28 | int qScriptClassPointerMetaTypeId = qRegisterMetaType<QScriptClass*>(); | ||
| 29 | int qByteArrayPointerMetaTypeId = qRegisterMetaType<QByteArray*>(); | ||
| 24 | 30 | ||
| 25 | ArrayBufferClass::ArrayBufferClass(ScriptEngine* scriptEngine) : | 31 | ArrayBufferClass::ArrayBufferClass(ScriptEngine* scriptEngine) : |
| 26 | QObject(scriptEngine), | 32 | QObject(scriptEngine), |
| 27 | QScriptClass(scriptEngine), | 33 | QScriptClass(scriptEngine) { |
| 28 | _scriptEngine(scriptEngine) { | ||
| 29 | qScriptRegisterMetaType<QByteArray>(engine(), toScriptValue, fromScriptValue); | 34 | qScriptRegisterMetaType<QByteArray>(engine(), toScriptValue, fromScriptValue); |
| 30 | QScriptValue global = engine()->globalObject(); | 35 | QScriptValue global = engine()->globalObject(); |
| 31 | 36 | ||
| @@ -144,12 +149,30 @@ QScriptValue ArrayBufferClass::toScriptValue(QScriptEngine* engine, const QByteA · 112 unmodified lines | |||
| 144 | QScriptValue ctor = engine->globalObject().property(CLASS_NAME); | 149 | QScriptValue ctor = engine->globalObject().property(CLASS_NAME); |
| 145 | ArrayBufferClass* cls = qscriptvalue_cast<ArrayBufferClass*>(ctor.data()); | 150 | ArrayBufferClass* cls = qscriptvalue_cast<ArrayBufferClass*>(ctor.data()); |
| 146 | if (!cls) { | 151 | if (!cls) { |
| 147 | return engine->newVariant(QVariant::fromValue(ba)); | 152 | if (engine->currentContext()) { |
| 153 | engine->currentContext()->throwError("arrayBufferClass::toScriptValue -- could not get " + CLASS_NAME + " class constructor"); | ||
| 154 | } | ||
| 155 | return QScriptValue::NullValue; | ||
| 148 | } | 156 | } |
| 149 | return cls->newInstance(ba); | 157 | return cls->newInstance(ba); |
| 150 | } | 158 | } |
| 151 | 159 | ||
| 152 | void ArrayBufferClass::fromScriptValue(const QScriptValue& obj, QByteArray& ba) { | 160 | void ArrayBufferClass::fromScriptValue(const QScriptValue& object, QByteArray& byteArray) { |
| 153 | ba = qvariant_cast<QByteArray>(obj.data().toVariant()); | 161 | if (object.isString()) { |
| 162 | // UTF-8 encoded String | ||
| 163 | byteArray = object.toString().toUtf8(); | ||
| 164 | } else if (object.isArray()) { | ||
| 165 | // Array of uint8s eg: [ 128, 3, 25, 234 ] | ||
| 166 | auto Uint8Array = object.engine()->globalObject().property("Uint8Array"); | ||
| 167 | auto typedArray = Uint8Array.construct(QScriptValueList{object}); | ||
| 168 | if (QByteArray* buffer = qscriptvalue_cast<QByteArray*>(typedArray.property("buffer"))) { | ||
| 169 | byteArray = *buffer; | ||
| 170 | } | ||
| 171 | } else if (object.isObject()) { | ||
| 172 | // ArrayBuffer instance (or any JS class that supports coercion into QByteArray*) | ||
| 173 | if (QByteArray* buffer = qscriptvalue_cast<QByteArray*>(object.data())) { | ||
| 174 | byteArray = *buffer; | ||
| 175 | } | ||
| 176 | } | ||
| 154 | } | 177 | } |
| 155 | 178 | ||