1 #include <QtScript/QScriptClassPropertyIterator>
2 #include <QtScript/QScriptContext>
3 #include <QtScript/QScriptEngine>
4 #include "bytearrayclass.h"
5 #include "bytearrayprototype.h"
9 Q_DECLARE_METATYPE(QByteArray*)
10 Q_DECLARE_METATYPE(ByteArrayClass*)
12 class ByteArrayClassPropertyIterator : public QScriptClassPropertyIterator
15 ByteArrayClassPropertyIterator(
const QScriptValue &
object);
16 ~ByteArrayClassPropertyIterator();
21 bool hasPrevious()
const;
27 QScriptString name()
const;
36 ByteArrayClass::ByteArrayClass(QScriptEngine *engine)
37 : QObject(engine), QScriptClass(engine)
39 qScriptRegisterMetaType<QByteArray>(engine, toScriptValue, fromScriptValue);
41 length = engine->toStringHandle(QLatin1String(
"length"));
44 QScriptEngine::QtOwnership,
46 QScriptEngine::ExcludeSuperClassMethods |
47 QScriptEngine::ExcludeSuperClassProperties);
48 QScriptValue global = engine->globalObject();
49 proto.setPrototype(global.property(
"Object").property(
"prototype"));
51 ctor = engine->newFunction(construct, proto);
52 ctor.setData(engine->toScriptValue(
this));
56 ByteArrayClass::~ByteArrayClass()
61 QScriptClass::QueryFlags ByteArrayClass::queryProperty(
const QScriptValue &
object,
62 const QScriptString &name,
63 QueryFlags flags, uint *
id)
65 QByteArray *ba = qscriptvalue_cast<QByteArray*>(
object.data());
72 qint32 pos = name.toArrayIndex(&isArrayIndex);
76 if ((flags & HandlesReadAccess) && (pos >= ba->size()))
77 flags &= ~HandlesReadAccess;
84 QScriptValue ByteArrayClass::property(
const QScriptValue &
object,
85 const QScriptString &name, uint
id)
87 QByteArray *ba = qscriptvalue_cast<QByteArray*>(
object.data());
89 return QScriptValue();
94 if ((pos < 0) || (pos >= ba->size()))
95 return QScriptValue();
96 return uint(ba->at(pos)) & 255;
98 return QScriptValue();
103 void ByteArrayClass::setProperty(QScriptValue &
object,
104 const QScriptString &name,
105 uint
id,
const QScriptValue &value)
107 QByteArray *ba = qscriptvalue_cast<QByteArray*>(
object.data());
110 if (name == length) {
111 resize(*ba, value.toInt32());
116 if (ba->size() <= pos)
117 resize(*ba, pos + 1);
118 (*ba)[pos] = char(value.toInt32());
124 QScriptValue::PropertyFlags ByteArrayClass::propertyFlags(
125 const QScriptValue &,
const QScriptString &name, uint )
127 if (name == length) {
128 return QScriptValue::Undeletable
129 | QScriptValue::SkipInEnumeration;
131 return QScriptValue::Undeletable;
136 QScriptClassPropertyIterator *ByteArrayClass::newIterator(
const QScriptValue &
object)
138 return new ByteArrayClassPropertyIterator(
object);
142 QString ByteArrayClass::name()
const
144 return QLatin1String(
"ByteArray");
147 QScriptValue ByteArrayClass::prototype()
const
152 QScriptValue ByteArrayClass::constructor()
158 QScriptValue ByteArrayClass::newInstance(
int size)
160 engine()->reportAdditionalMemoryCost(size);
161 return newInstance(QByteArray(size, 0));
166 QScriptValue ByteArrayClass::newInstance(
const QByteArray &ba)
168 QScriptValue data = engine()->newVariant(QVariant::fromValue(ba));
169 return engine()->newObject(
this, data);
174 QScriptValue ByteArrayClass::construct(QScriptContext *ctx, QScriptEngine *)
176 ByteArrayClass *cls = qscriptvalue_cast<ByteArrayClass*>(ctx->callee().data());
178 return QScriptValue();
179 QScriptValue arg = ctx->argument(0);
180 if (arg.instanceOf(ctx->callee()))
181 return cls->newInstance(qscriptvalue_cast<QByteArray>(arg));
182 else if (arg.isArray()) {
183 quint32 len = arg.property(
"length").toUInt32();
184 QByteArray ba((
int)len,
char(0));
185 for (quint32 i = 0; i < len; ++i) {
186 uint v = arg.property(i).toUInt32() & 255;
189 return cls->newInstance(ba);
191 else if (arg.isString()) {
192 QString s = arg.toString();
193 QByteArray ba = s.toLatin1();
194 return cls->newInstance(ba);
196 else if (arg.isNumber()) {
197 int size = arg.toInt32();
198 return cls->newInstance(size);
200 return QScriptValue();
204 QScriptValue ByteArrayClass::toScriptValue(QScriptEngine *eng,
const QByteArray &ba)
206 QScriptValue ctor = eng->globalObject().property(
"ByteArray");
207 ByteArrayClass *cls = qscriptvalue_cast<ByteArrayClass*>(ctor.data());
209 return eng->newVariant(QVariant::fromValue(ba));
210 return cls->newInstance(ba);
213 void ByteArrayClass::fromScriptValue(
const QScriptValue &obj, QByteArray &ba)
215 ba = qvariant_cast<QByteArray>(obj.data().toVariant());
219 void ByteArrayClass::resize(QByteArray &ba,
int newSize)
221 int oldSize = ba.size();
223 if (newSize > oldSize)
224 engine()->reportAdditionalMemoryCost(newSize - oldSize);
230 ByteArrayClassPropertyIterator::ByteArrayClassPropertyIterator(
const QScriptValue &
object)
231 : QScriptClassPropertyIterator(object)
236 ByteArrayClassPropertyIterator::~ByteArrayClassPropertyIterator()
241 bool ByteArrayClassPropertyIterator::hasNext()
const
243 QByteArray *ba = qscriptvalue_cast<QByteArray*>(object().data());
244 return m_index < ba->size();
247 void ByteArrayClassPropertyIterator::next()
253 bool ByteArrayClassPropertyIterator::hasPrevious()
const
255 return (m_index > 0);
258 void ByteArrayClassPropertyIterator::previous()
264 void ByteArrayClassPropertyIterator::toFront()
270 void ByteArrayClassPropertyIterator::toBack()
272 QByteArray *ba = qscriptvalue_cast<QByteArray*>(object().data());
273 m_index = ba->size();
277 QScriptString ByteArrayClassPropertyIterator::name()
const
279 return object().engine()->toStringHandle(QString::number(m_last));
282 uint ByteArrayClassPropertyIterator::id()
const
The prototype for the ByteArray class.