History

Added first draft of DataView scriptable objects

Atlante45 committed 12 years ago

Commit 2e480761 parent 13fe8b54 files · +394 −0Browse files

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

Unified · Split

libraries/script-engine/src/DataViewClass.cpp+81−0
@@ -0,0 +1,81 @@
1+//
2+// DataViewClass.cpp
3+//
4+//
5+// Created by Clement on 7/8/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+#include "DataViewPrototype.h"
13+
14+#include "DataViewClass.h"
15+
16+Q_DECLARE_METATYPE(QByteArray*)
17+
18+static const QString DATA_VIEW_NAME = "DataView";
19+
20+DataViewClass::DataViewClass(QScriptEngine* engine) : ArrayBufferViewClass(engine) {
21+ QScriptValue global = engine->globalObject();
22+
23+ // Save string handles for quick lookup
24+ _name = engine->toStringHandle(DATA_VIEW_NAME.toLatin1());
25+
26+ // build prototype
27+ _proto = engine->newQObject(new DataViewPrototype(this),
28+ QScriptEngine::QtOwnership,
29+ QScriptEngine::SkipMethodsInEnumeration |
30+ QScriptEngine::ExcludeSuperClassMethods |
31+ QScriptEngine::ExcludeSuperClassProperties);
32+
33+ _proto.setPrototype(global.property("Object").property("prototype"));
34+
35+ _ctor = engine->newFunction(construct, _proto);
36+ _ctor.setData(engine->toScriptValue(this));
37+
38+ engine->globalObject().setProperty(name(), _ctor);
39+}
40+
41+QScriptValue DataViewClass::newInstance(QScriptValue buffer, quint32 byteOffset, quint32 byteLentgh) {
42+ QScriptValue data = engine()->newObject();
43+ data.setProperty(_bufferName, buffer);
44+ data.setProperty(_byteOffsetName, byteOffset);
45+ data.setProperty(_byteLengthName, byteLentgh);
46+
47+ return engine()->newObject(this, data);
48+}
49+
50+QScriptValue DataViewClass::construct(QScriptContext *context, QScriptEngine *engine) {
51+ DataViewClass* cls = qscriptvalue_cast<DataViewClass*>(context->callee().data());
52+ if (!cls || context->argumentCount() < 1) {
53+ return QScriptValue();
54+ }
55+
56+ QScriptValue bufferArg = context->argument(0);
57+ QScriptValue byteOffsetArg = (context->argumentCount() >= 2) ? context->argument(1) : QScriptValue(-1);
58+ QScriptValue byteLengthArg = (context->argumentCount() >= 3) ? context->argument(2) : QScriptValue(-1);
59+
60+ QByteArray* arrayBuffer = (bufferArg.isValid()) ? qscriptvalue_cast<QByteArray*>(bufferArg.data()) :NULL;
61+ if (!arrayBuffer) {
62+ return QScriptValue();
63+ }
64+
65+ QScriptValue newObject = cls->newInstance(bufferArg, byteOffsetArg.toInt32(), byteLengthArg.toInt32());
66+
67+ if (context->isCalledAsConstructor()) {
68+ context->setThisObject(newObject);
69+ return engine->undefinedValue();
70+ }
71+
72+ return newObject;
73+}
74+
75+QString DataViewClass::name() const {
76+ return _name.toString();
77+}
78+
79+QScriptValue DataViewClass::prototype() const {
80+ return _proto;
81+}