Qt 4.4: bytearrayclass.cpp Example File (script/customclass/bytearrayclass.cpp)

|  | Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |

# bytearrayclass.cpp Example File
script/customclass/bytearrayclass.cpp

     /****************************************************************************
     **
     ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
     **
     ** This file is part of the example classes of the Qt Toolkit.
     **
     ** This file may be used under the terms of the GNU General Public
     ** License versions 2.0 or 3.0 as published by the Free Software
     ** Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3
     ** included in the packaging of this file.  Alternatively you may (at
     ** your option) use any later version of the GNU General Public
     ** License if such license has been publicly approved by Trolltech ASA
     ** (or its successors, if any) and the KDE Free Qt Foundation. In
     ** addition, as a special exception, Trolltech gives you certain
     ** additional rights. These rights are described in the Trolltech GPL
     ** Exception version 1.2, which can be found at
     ** http://www.trolltech.com/products/qt/gplexception/ and in the file
     ** GPL_EXCEPTION.txt in this package.
     **
     ** Please review the following information to ensure GNU General
     ** Public Licensing requirements will be met:
     ** http://trolltech.com/products/qt/licenses/licensing/opensource/. If
     ** you are unsure which license is appropriate for your use, please
     ** review the following information:
     ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
     ** or contact the sales department at sales@trolltech.com.
     **
     ** In addition, as a special exception, Trolltech, as the sole
     ** copyright holder for Qt Designer, grants users of the Qt/Eclipse
     ** Integration plug-in the right for the Qt/Eclipse Integration to
     ** link to functionality provided by Qt Designer and its related
     ** libraries.
     **
     ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
     ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
     ** A PARTICULAR PURPOSE. Trolltech reserves all rights not expressly
     ** granted herein.
     **
     ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
     ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
     **
     ****************************************************************************/

     #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;
     };

     static qint32 toArrayIndex(const QString &str)
     {
         QByteArray bytes = str.toUtf8();
         char *eptr;
         quint32 pos = strtoul(bytes.constData(), &eptr, 10);
         if ((eptr == bytes.constData() + bytes.size())
             && (QByteArray::number(pos) == bytes)) {
             return pos;
         }
         return -1;
     }

     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);
         ctor.setData(qScriptValueFromValue(engine, this));
     }

     ByteArrayClass::~ByteArrayClass()
     {
     }

     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 {
             qint32 pos = toArrayIndex(name);
             if (pos == -1)
                 return 0;
             *id = pos;
             if ((flags & HandlesReadAccess) && (pos >= ba->size()))
                 flags &= ~HandlesReadAccess;
             return flags;
         }
     }

     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 QScriptValue(engine(), ba->length());
         } else {
             qint32 pos = id;
             if ((pos < 0) || (pos >= ba->size()))
                 return QScriptValue();
             return QScriptValue(engine(), uint(ba->at(pos)) & 255);
         }
         return QScriptValue();
     }

     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) {
             ba->resize(value.toInt32());
         } else {
             qint32 pos = id;
             if (pos < 0)
                 return;
             if (ba->size() <= pos)
                 ba->resize(pos + 1);
             (*ba)[pos] = char(value.toInt32());
         }
     }

     QScriptValue::PropertyFlags ByteArrayClass::propertyFlags(
         const QScriptValue &/*object*/, const QScriptString &name, uint /*id*/)
     {
         if (name == length) {
             return QScriptValue::Undeletable
                 | QScriptValue::SkipInEnumeration;
         }
         return QScriptValue::Undeletable;
     }

     QScriptClassPropertyIterator *ByteArrayClass::newIterator(const QScriptValue &object)
     {
         return new ByteArrayClassPropertyIterator(object);
     }

     QString ByteArrayClass::name() const
     {
         return QLatin1String("ByteArray");
     }

     QScriptValue ByteArrayClass::prototype() const
     {
         return proto;
     }

     QScriptValue ByteArrayClass::constructor()
     {
         return ctor;
     }

     QScriptValue ByteArrayClass::newInstance(int size)
     {
         return newInstance(QByteArray(size, /*ch=*/0));
     }

     QScriptValue ByteArrayClass::newInstance(const QByteArray &ba)
     {
         QScriptValue data = engine()->newVariant(qVariantFromValue(ba));
         return engine()->newObject(this, data);
     }

     QScriptValue ByteArrayClass::construct(QScriptContext *ctx, QScriptEngine *)
     {
         ByteArrayClass *cls = qscriptvalue_cast<ByteArrayClass*>(ctx->callee().data());
         if (!cls)
             return QScriptValue();
         int size = ctx->argument(0).toInt32();
         return cls->newInstance(size);
     }

     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(qVariantFromValue(ba));
         return cls->newInstance(ba);
     }

     void ByteArrayClass::fromScriptValue(const QScriptValue &obj, QByteArray &ba)
     {
         ba = qscriptvalue_cast<QByteArray>(obj.data());
     }

     ByteArrayClassPropertyIterator::ByteArrayClassPropertyIterator(const QScriptValue &object)
         : QScriptClassPropertyIterator(object)
     {
         toFront();
     }

     ByteArrayClassPropertyIterator::~ByteArrayClassPropertyIterator()
     {
     }

     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 QScriptString();
     }

     uint ByteArrayClassPropertyIterator::id() const
     {
         return m_last;
     }