History

Functional ArrayBuffer class following Qt standard

Atlante45 committed 12 years ago

Commit f9b739a1 parent c2462056 files · +143 −127Browse files

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

Unified · Split

libraries/script-engine/src/ArrayBufferClass.cpp+119−0
@@ -0,0 +1,119 @@
1//
2// ArrayBufferClass.cpp
3//
4//
5// Created by Clement on 7/3/14.
6// Copyright 2014 High Fidelity, Inc.
7//
8// Distributed under the Apache License, Version 2.0.
9// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10//
11
12
13#include "ArrayBufferPrototype.h"
14
15#include "ArrayBufferClass.h"
16
17static const QString CLASS_NAME = "ArrayBuffer";
18static const QString BYTE_LENGTH_PROPERTY_NAME = "byteLength";
19
20Q_DECLARE_METATYPE(QByteArray*)
21
22ArrayBufferClass::ArrayBufferClass(QScriptEngine* engine) : QObject(engine), QScriptClass(engine) {
23 qScriptRegisterMetaType<QByteArray>(engine, toScriptValue, fromScriptValue);
24 QScriptValue global = engine->globalObject();
25
26 // Save string handles for quick lookup
27 _name = engine->toStringHandle(CLASS_NAME.toLatin1());
28 _byteLength = engine->toStringHandle(BYTE_LENGTH_PROPERTY_NAME.toLatin1());
29
30 // build prototype
31 _proto = engine->newQObject(new ArrayBufferPrototype(this),
32 QScriptEngine::QtOwnership,
33 QScriptEngine::SkipMethodsInEnumeration |
34 QScriptEngine::ExcludeSuperClassMethods |
35 QScriptEngine::ExcludeSuperClassProperties);
36
37 _proto.setPrototype(global.property("Object").property("prototype"));
38
39 _ctor = engine->newFunction(construct, _proto);
40 _ctor.setData(engine->toScriptValue(this));
41
42 engine->globalObject().setProperty(name(), _ctor);
43}
44
45QScriptValue ArrayBufferClass::newInstance(unsigned long size) {
46 engine()->reportAdditionalMemoryCost(size);
47 QScriptValue data = engine()->newVariant(QVariant::fromValue(QByteArray(size, 0)));
48 return engine()->newObject(this, data);
49}
50
51QScriptValue ArrayBufferClass::newInstance(const QByteArray& ba) {
52 QScriptValue data = engine()->newVariant(QVariant::fromValue(ba));
53 return engine()->newObject(this, data);
54}
55
56QScriptValue ArrayBufferClass::construct(QScriptContext* context, QScriptEngine* engine) {
57 ArrayBufferClass* cls = qscriptvalue_cast<ArrayBufferClass*>(context->callee().data());
58 if (!cls) {
59 return QScriptValue();
60 }
61
62 QScriptValue arg = context->argument(0);
63 unsigned long size = arg.toInt32();
64 QScriptValue newObject = cls->newInstance(size);
65
66 if (context->isCalledAsConstructor()) {
67 context->setThisObject(newObject);
68 return engine->undefinedValue();
69 }
70
71 return newObject;
72}
73
74QScriptClass::QueryFlags ArrayBufferClass::queryProperty(const QScriptValue& object,
75 const QScriptString& name,
76 QueryFlags flags, uint* id) {
77 QByteArray* ba = qscriptvalue_cast<QByteArray*>(object.data());
78 if (ba && name == _byteLength) {
79 // if the property queried is byteLength, only handle read access
80 return flags &= HandlesReadAccess;
81 }
82 return 0; // No access
83}
84
85QScriptValue ArrayBufferClass::property(const QScriptValue &object,
86 const QScriptString &name, uint id) {
87 QByteArray* ba = qscriptvalue_cast<QByteArray*>(object.data());
88 if (ba && name == _byteLength) {
89 return ba->length();
90 }
91 return QScriptValue();
92}
93
94QScriptValue::PropertyFlags ArrayBufferClass::propertyFlags(const QScriptValue& object,
95 const QScriptString& name, uint id) {
96 return QScriptValue::Undeletable;
97}
98
99QString ArrayBufferClass::name() const {
100 return _name.toString();
101}
102
103QScriptValue ArrayBufferClass::prototype() const {
104 return _proto;
105}
106
107QScriptValue ArrayBufferClass::toScriptValue(QScriptEngine* engine, const QByteArray& ba) {
108 QScriptValue ctor = engine->globalObject().property(CLASS_NAME);
109 ArrayBufferClass* cls = qscriptvalue_cast<ArrayBufferClass*>(ctor.data());
110 if (!cls) {
111 return engine->newVariant(QVariant::fromValue(ba));
112 }
113 return cls->newInstance(ba);
114}
115
116void ArrayBufferClass::fromScriptValue(const QScriptValue& obj, QByteArray& ba) {
117 ba = qvariant_cast<QByteArray>(obj.data().toVariant());
118}
119