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
16Q_DECLARE_METATYPE(QByteArray*)
17
18static const QString DATA_VIEW_NAME = "DataView";
19
20DataViewClass::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
41QScriptValue 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
50QScriptValue 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
75QString DataViewClass::name() const {
76 return _name.toString();
77}
78
79QScriptValue DataViewClass::prototype() const {
80 return _proto;
81}