summaryrefslogtreecommitdiff
path: root/examples/script/customclass
diff options
context:
space:
mode:
Diffstat (limited to 'examples/script/customclass')
-rw-r--r--examples/script/customclass/bytearrayclass.cpp308
-rw-r--r--examples/script/customclass/bytearrayclass.h91
-rw-r--r--examples/script/customclass/bytearrayclass.pri6
-rw-r--r--examples/script/customclass/bytearrayprototype.cpp135
-rw-r--r--examples/script/customclass/bytearrayprototype.h79
-rw-r--r--examples/script/customclass/customclass.pro15
-rw-r--r--examples/script/customclass/main.cpp75
7 files changed, 709 insertions, 0 deletions
diff --git a/examples/script/customclass/bytearrayclass.cpp b/examples/script/customclass/bytearrayclass.cpp
new file mode 100644
index 0000000..f325398
--- /dev/null
+++ b/examples/script/customclass/bytearrayclass.cpp
@@ -0,0 +1,308 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtScript/QScriptClassPropertyIterator>
+#include <QtScript/QScriptEngine>
+#include "bytearrayclass.h"
+#include "bytearrayprototype.h"
+
+#include <stdlib.h>
+
+Q_DECLARE_METATYPE(QByteArray*)
+Q_DECLARE_METATYPE(ByteArrayClass*)
+
+class ByteArrayClassPropertyIterator : public QScriptClassPropertyIterator
+{
+public:
+ ByteArrayClassPropertyIterator(const QScriptValue &object);
+ ~ByteArrayClassPropertyIterator();
+
+ bool hasNext() const;
+ void next();
+
+ bool hasPrevious() const;
+ void previous();
+
+ void toFront();
+ void toBack();
+
+ QScriptString name() const;
+ uint id() const;
+
+private:
+ int m_index;
+ int m_last;
+};
+
+//! [0]
+ByteArrayClass::ByteArrayClass(QScriptEngine *engine)
+ : QObject(engine), QScriptClass(engine)
+{
+ qScriptRegisterMetaType<QByteArray>(engine, toScriptValue, fromScriptValue);
+
+ length = engine->toStringHandle(QLatin1String("length"));
+
+ proto = engine->newQObject(new ByteArrayPrototype(this),
+ QScriptEngine::QtOwnership,
+ QScriptEngine::SkipMethodsInEnumeration
+ | QScriptEngine::ExcludeSuperClassMethods
+ | QScriptEngine::ExcludeSuperClassProperties);
+ QScriptValue global = engine->globalObject();
+ proto.setPrototype(global.property("Object").property("prototype"));
+
+ ctor = engine->newFunction(construct, proto);
+ ctor.setData(engine->toScriptValue(this));
+}
+//! [0]
+
+ByteArrayClass::~ByteArrayClass()
+{
+}
+
+//! [3]
+QScriptClass::QueryFlags ByteArrayClass::queryProperty(const QScriptValue &object,
+ const QScriptString &name,
+ QueryFlags flags, uint *id)
+{
+ QByteArray *ba = qscriptvalue_cast<QByteArray*>(object.data());
+ if (!ba)
+ return 0;
+ if (name == length) {
+ return flags;
+ } else {
+ bool isArrayIndex;
+ qint32 pos = name.toArrayIndex(&isArrayIndex);
+ if (!isArrayIndex)
+ return 0;
+ *id = pos;
+ if ((flags & HandlesReadAccess) && (pos >= ba->size()))
+ flags &= ~HandlesReadAccess;
+ return flags;
+ }
+}
+//! [3]
+
+//! [4]
+QScriptValue ByteArrayClass::property(const QScriptValue &object,
+ const QScriptString &name, uint id)
+{
+ QByteArray *ba = qscriptvalue_cast<QByteArray*>(object.data());
+ if (!ba)
+ return QScriptValue();
+ if (name == length) {
+ return ba->length();
+ } else {
+ qint32 pos = id;
+ if ((pos < 0) || (pos >= ba->size()))
+ return QScriptValue();
+ return uint(ba->at(pos)) & 255;
+ }
+ return QScriptValue();
+}
+//! [4]
+
+//! [5]
+void ByteArrayClass::setProperty(QScriptValue &object,
+ const QScriptString &name,
+ uint id, const QScriptValue &value)
+{
+ QByteArray *ba = qscriptvalue_cast<QByteArray*>(object.data());
+ if (!ba)
+ return;
+ if (name == length) {
+ resize(*ba, value.toInt32());
+ } else {
+ qint32 pos = id;
+ if (pos < 0)
+ return;
+ if (ba->size() <= pos)
+ resize(*ba, pos + 1);
+ (*ba)[pos] = char(value.toInt32());
+ }
+}
+//! [5]
+
+//! [6]
+QScriptValue::PropertyFlags ByteArrayClass::propertyFlags(
+ const QScriptValue &/*object*/, const QScriptString &name, uint /*id*/)
+{
+ if (name == length) {
+ return QScriptValue::Undeletable
+ | QScriptValue::SkipInEnumeration;
+ }
+ return QScriptValue::Undeletable;
+}
+//! [6]
+
+//! [7]
+QScriptClassPropertyIterator *ByteArrayClass::newIterator(const QScriptValue &object)
+{
+ return new ByteArrayClassPropertyIterator(object);
+}
+//! [7]
+
+QString ByteArrayClass::name() const
+{
+ return QLatin1String("ByteArray");
+}
+
+QScriptValue ByteArrayClass::prototype() const
+{
+ return proto;
+}
+
+QScriptValue ByteArrayClass::constructor()
+{
+ return ctor;
+}
+
+//! [10]
+QScriptValue ByteArrayClass::newInstance(int size)
+{
+ engine()->reportAdditionalMemoryCost(size);
+ return newInstance(QByteArray(size, /*ch=*/0));
+}
+//! [10]
+
+//! [1]
+QScriptValue ByteArrayClass::newInstance(const QByteArray &ba)
+{
+ QScriptValue data = engine()->newVariant(QVariant::fromValue(ba));
+ return engine()->newObject(this, data);
+}
+//! [1]
+
+//! [2]
+QScriptValue ByteArrayClass::construct(QScriptContext *ctx, QScriptEngine *)
+{
+ ByteArrayClass *cls = qscriptvalue_cast<ByteArrayClass*>(ctx->callee().data());
+ if (!cls)
+ return QScriptValue();
+ QScriptValue arg = ctx->argument(0);
+ if (arg.instanceOf(ctx->callee()))
+ return cls->newInstance(qscriptvalue_cast<QByteArray>(arg));
+ int size = arg.toInt32();
+ return cls->newInstance(size);
+}
+//! [2]
+
+QScriptValue ByteArrayClass::toScriptValue(QScriptEngine *eng, const QByteArray &ba)
+{
+ QScriptValue ctor = eng->globalObject().property("ByteArray");
+ ByteArrayClass *cls = qscriptvalue_cast<ByteArrayClass*>(ctor.data());
+ if (!cls)
+ return eng->newVariant(QVariant::fromValue(ba));
+ return cls->newInstance(ba);
+}
+
+void ByteArrayClass::fromScriptValue(const QScriptValue &obj, QByteArray &ba)
+{
+ ba = qvariant_cast<QByteArray>(obj.data().toVariant());
+}
+
+//! [9]
+void ByteArrayClass::resize(QByteArray &ba, int newSize)
+{
+ int oldSize = ba.size();
+ ba.resize(newSize);
+ if (newSize > oldSize)
+ engine()->reportAdditionalMemoryCost(newSize - oldSize);
+}
+//! [9]
+
+
+
+ByteArrayClassPropertyIterator::ByteArrayClassPropertyIterator(const QScriptValue &object)
+ : QScriptClassPropertyIterator(object)
+{
+ toFront();
+}
+
+ByteArrayClassPropertyIterator::~ByteArrayClassPropertyIterator()
+{
+}
+
+//! [8]
+bool ByteArrayClassPropertyIterator::hasNext() const
+{
+ QByteArray *ba = qscriptvalue_cast<QByteArray*>(object().data());
+ return m_index < ba->size();
+}
+
+void ByteArrayClassPropertyIterator::next()
+{
+ m_last = m_index;
+ ++m_index;
+}
+
+bool ByteArrayClassPropertyIterator::hasPrevious() const
+{
+ return (m_index > 0);
+}
+
+void ByteArrayClassPropertyIterator::previous()
+{
+ --m_index;
+ m_last = m_index;
+}
+
+void ByteArrayClassPropertyIterator::toFront()
+{
+ m_index = 0;
+ m_last = -1;
+}
+
+void ByteArrayClassPropertyIterator::toBack()
+{
+ QByteArray *ba = qscriptvalue_cast<QByteArray*>(object().data());
+ m_index = ba->size();
+ m_last = -1;
+}
+
+QScriptString ByteArrayClassPropertyIterator::name() const
+{
+ return object().engine()->toStringHandle(QString::number(m_last));
+}
+
+uint ByteArrayClassPropertyIterator::id() const
+{
+ return m_last;
+}
+//! [8]
diff --git a/examples/script/customclass/bytearrayclass.h b/examples/script/customclass/bytearrayclass.h
new file mode 100644
index 0000000..1614b06
--- /dev/null
+++ b/examples/script/customclass/bytearrayclass.h
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef BYTEARRAYCLASS_H
+#define BYTEARRAYCLASS_H
+
+#include <QtCore/QObject>
+#include <QtScript/QScriptClass>
+#include <QtScript/QScriptString>
+
+class ByteArrayClass : public QObject, public QScriptClass
+{
+public:
+ ByteArrayClass(QScriptEngine *engine);
+ ~ByteArrayClass();
+
+ QScriptValue constructor();
+
+ QScriptValue newInstance(int size = 0);
+ QScriptValue newInstance(const QByteArray &ba);
+
+ QueryFlags queryProperty(const QScriptValue &object,
+ const QScriptString &name,
+ QueryFlags flags, uint *id);
+
+ QScriptValue property(const QScriptValue &object,
+ const QScriptString &name, uint id);
+
+ void setProperty(QScriptValue &object, const QScriptString &name,
+ uint id, const QScriptValue &value);
+
+ QScriptValue::PropertyFlags propertyFlags(
+ const QScriptValue &object, const QScriptString &name, uint id);
+
+ QScriptClassPropertyIterator *newIterator(const QScriptValue &object);
+
+ QString name() const;
+
+ QScriptValue prototype() const;
+
+private:
+ static QScriptValue construct(QScriptContext *ctx, QScriptEngine *eng);
+
+ static QScriptValue toScriptValue(QScriptEngine *eng, const QByteArray &ba);
+ static void fromScriptValue(const QScriptValue &obj, QByteArray &ba);
+
+ void resize(QByteArray &ba, int newSize);
+
+ QScriptString length;
+ QScriptValue proto;
+ QScriptValue ctor;
+};
+
+#endif
diff --git a/examples/script/customclass/bytearrayclass.pri b/examples/script/customclass/bytearrayclass.pri
new file mode 100644
index 0000000..05fdeb4
--- /dev/null
+++ b/examples/script/customclass/bytearrayclass.pri
@@ -0,0 +1,6 @@
+SOURCES += $$PWD/bytearrayclass.cpp \
+ $$PWD/bytearrayprototype.cpp
+HEADERS += $$PWD/bytearrayclass.h \
+ $$PWD/bytearrayprototype.h
+
+INCLUDEPATH += $$PWD
diff --git a/examples/script/customclass/bytearrayprototype.cpp b/examples/script/customclass/bytearrayprototype.cpp
new file mode 100644
index 0000000..c506883
--- /dev/null
+++ b/examples/script/customclass/bytearrayprototype.cpp
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "bytearrayprototype.h"
+#include <QtScript/QScriptEngine>
+
+Q_DECLARE_METATYPE(QByteArray*)
+
+ByteArrayPrototype::ByteArrayPrototype(QObject *parent)
+ : QObject(parent)
+{
+}
+
+ByteArrayPrototype::~ByteArrayPrototype()
+{
+}
+
+//! [0]
+QByteArray *ByteArrayPrototype::thisByteArray() const
+{
+ return qscriptvalue_cast<QByteArray*>(thisObject().data());
+}
+//! [0]
+
+void ByteArrayPrototype::chop(int n)
+{
+ thisByteArray()->chop(n);
+}
+
+bool ByteArrayPrototype::equals(const QByteArray &other)
+{
+ return *thisByteArray() == other;
+}
+
+QByteArray ByteArrayPrototype::left(int len) const
+{
+ return thisByteArray()->left(len);
+}
+
+//! [1]
+QByteArray ByteArrayPrototype::mid(int pos, int len) const
+{
+ return thisByteArray()->mid(pos, len);
+}
+
+QScriptValue ByteArrayPrototype::remove(int pos, int len)
+{
+ thisByteArray()->remove(pos, len);
+ return thisObject();
+}
+//! [1]
+
+QByteArray ByteArrayPrototype::right(int len) const
+{
+ return thisByteArray()->right(len);
+}
+
+QByteArray ByteArrayPrototype::simplified() const
+{
+ return thisByteArray()->simplified();
+}
+
+QByteArray ByteArrayPrototype::toBase64() const
+{
+ return thisByteArray()->toBase64();
+}
+
+QByteArray ByteArrayPrototype::toLower() const
+{
+ return thisByteArray()->toLower();
+}
+
+QByteArray ByteArrayPrototype::toUpper() const
+{
+ return thisByteArray()->toUpper();
+}
+
+QByteArray ByteArrayPrototype::trimmed() const
+{
+ return thisByteArray()->trimmed();
+}
+
+void ByteArrayPrototype::truncate(int pos)
+{
+ thisByteArray()->truncate(pos);
+}
+
+QString ByteArrayPrototype::toLatin1String() const
+{
+ return QString::fromLatin1(*thisByteArray());
+}
+
+//! [2]
+QScriptValue ByteArrayPrototype::valueOf() const
+{
+ return thisObject().data();
+}
+//! [2]
diff --git a/examples/script/customclass/bytearrayprototype.h b/examples/script/customclass/bytearrayprototype.h
new file mode 100644
index 0000000..2fc4ea7
--- /dev/null
+++ b/examples/script/customclass/bytearrayprototype.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef BYTEARRAYPROTOTYPE_H
+#define BYTEARRAYPROTOTYPE_H
+
+#include <QtCore/QByteArray>
+#include <QtCore/QObject>
+#include <QtScript/QScriptable>
+#include <QtScript/QScriptValue>
+
+//! [0]
+class ByteArrayPrototype : public QObject, public QScriptable
+{
+Q_OBJECT
+public:
+ ByteArrayPrototype(QObject *parent = 0);
+ ~ByteArrayPrototype();
+
+public slots:
+ void chop(int n);
+ bool equals(const QByteArray &other);
+ QByteArray left(int len) const;
+ QByteArray mid(int pos, int len = -1) const;
+ QScriptValue remove(int pos, int len);
+ QByteArray right(int len) const;
+ QByteArray simplified() const;
+ QByteArray toBase64() const;
+ QByteArray toLower() const;
+ QByteArray toUpper() const;
+ QByteArray trimmed() const;
+ void truncate(int pos);
+ QString toLatin1String() const;
+ QScriptValue valueOf() const;
+
+private:
+ QByteArray *thisByteArray() const;
+};
+//! [0]
+
+
+#endif
diff --git a/examples/script/customclass/customclass.pro b/examples/script/customclass/customclass.pro
new file mode 100644
index 0000000..0c8e0b4
--- /dev/null
+++ b/examples/script/customclass/customclass.pro
@@ -0,0 +1,15 @@
+QT = core script
+win32: CONFIG += console
+mac:CONFIG -= app_bundle
+
+SOURCES += main.cpp
+
+include(bytearrayclass.pri)
+
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/qtscript/script/customclass
+sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro *.pri
+sources.path = $$[QT_INSTALL_EXAMPLES]/qtscript/script/customclass
+INSTALLS += target sources
+
+symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
diff --git a/examples/script/customclass/main.cpp b/examples/script/customclass/main.cpp
new file mode 100644
index 0000000..054c71c
--- /dev/null
+++ b/examples/script/customclass/main.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QCoreApplication>
+#include <QtDebug>
+#include <QtScript>
+#include "bytearrayclass.h"
+
+int main(int argc, char **argv)
+{
+ QCoreApplication app(argc, argv);
+
+ QScriptEngine eng;
+
+ ByteArrayClass *baClass = new ByteArrayClass(&eng);
+ eng.globalObject().setProperty("ByteArray", baClass->constructor());
+
+ qDebug() << "ba = new ByteArray(4):" << eng.evaluate("ba = new ByteArray(4)").toString();
+ qDebug() << "ba instanceof ByteArray:" << eng.evaluate("ba instanceof ByteArray").toBool();
+ qDebug() << "ba.length:" << eng.evaluate("ba.length").toNumber();
+ qDebug() << "ba[1] = 123; ba[1]:" << eng.evaluate("ba[1] = 123; ba[1]").toNumber();
+ qDebug() << "ba[7] = 224; ba.length:" << eng.evaluate("ba[7] = 224; ba.length").toNumber();
+ qDebug() << "for-in loop:" << eng.evaluate("result = '';\n"
+ "for (var p in ba) {\n"
+ " if (result.length > 0)\n"
+ " result += ', ';\n"
+ " result += '(' + p + ',' + ba[p] + ')';\n"
+ "} result").toString();
+ qDebug() << "ba.toBase64():" << eng.evaluate("b64 = ba.toBase64()").toString();
+ qDebug() << "ba.toBase64().toLatin1String():" << eng.evaluate("b64.toLatin1String()").toString();
+ qDebug() << "ba.valueOf():" << eng.evaluate("ba.valueOf()").toString();
+ qDebug() << "ba.chop(2); ba.length:" << eng.evaluate("ba.chop(2); ba.length").toNumber();
+ qDebug() << "ba2 = new ByteArray(ba):" << eng.evaluate("ba2 = new ByteArray(ba)").toString();
+ qDebug() << "ba2.equals(ba):" << eng.evaluate("ba2.equals(ba)").toBool();
+ qDebug() << "ba2.equals(new ByteArray()):" << eng.evaluate("ba2.equals(new ByteArray())").toBool();
+
+ return 0;
+}