void QSPixmapClass::save( QSEnv *env ) { if ( env->numArgs() < 1 || env->numArgs() > 2 ) { env->throwError( QString::fromLatin1( "Pixmap.save() called with %1 arguments. 1 or 2 argument expected." ). arg( env->numArgs() ) ); return; } QSObject t = env->thisValue(); QSPixmapClass *pac = (QSPixmapClass*)t.objectType(); QPixmap *pix = pac->pixmap( &t ); if ( !env->arg( 0 ).isString() ) { env->throwError( QString::fromLatin1( "Pixmap.save() called with an argument of type %1. " "Type String is expeced" ). arg( env->arg( 0 ).typeName() ) ); return; } QString format = QFileInfo( env->arg( 0 ).toString() ).completeSuffix().toUpper(); QList<QByteArray> l = QImageWriter::supportedImageFormats(); if ( l.indexOf( format.toLatin1() ) == -1 ) format = QString::fromLatin1("PNG"); if ( env->numArgs() == 2 ) { if ( !env->arg( 1 ).isString() ) { env->throwError( QString::fromLatin1( "Pixmap.save() called with an argument of type %1. " "as second argument. Type String is expeced" ). arg( env->arg( 1 ).typeName() ) ); return; } format = env->arg( 1 ).toString(); } pix->save( env->arg( 0 ).toString(), format.toLatin1().constData() ); }
/*! Returns the current execution context of the interpreter. This is either a QObject pointer or 0. */ QObject *QSInterpreter::currentContext() const { QSObject o = d->interpreter->env()->currentScope(); if (o.isA(d->interpreter->wrapperClass())) return d->interpreter->wrapperClass()->shared(&o)->objects[0]; return 0; }
QSObject QSAEditor::vTypeToQSType( const QString &type ) const { QSObject qstype = env()->globalObject().get( type.mid( 1 ) ); if( qstype.objectType() && qstype.objectType()->valueType() == TypeClass ) { return qstype; } QVariant::Type t = QVariant::nameToType( type.toLatin1().constData() ); switch ( t ) { case QVariant::Time: case QVariant::DateTime: return env()->globalObject().get( QString::fromLatin1("Date") ); case QVariant::StringList: case QVariant::List: case QVariant::Map: return env()->globalObject().get( QString::fromLatin1("Array") ); case QVariant::ByteArray: return env()->globalObject().get( QString::fromLatin1("String") ); case QVariant::Int: case QVariant::UInt: case QVariant::Double: return env()->globalObject().get( QString::fromLatin1("Number") ); case QVariant::Bool: return env()->globalObject().get( QString::fromLatin1("Boolean") ); default: break; } return env()->createUndefined(); }
void qsa_slot_callback(QObject *_this, int callId, int paramCount, const QMetaType::Type *types, const QByteArray *typeNames, void *argumentList[]) { // printf("qsa_slot_callback, id=%d\n", callId); QuickInterpreter *ip = static_cast<QuickInterpreter *>(_this); QSAConnection connection = ip->scriptSlot(callId); Q_ASSERT(connection.sender); Q_ASSERT(connection.signal.length()); Q_ASSERT(connection.function_ref.isValid()); QSEnv *env = ip->env(); QSList arguments; for (int i=1; i<paramCount; ++i) { QSATypeInfo info; info.name = typeNames[i]; info.id = types[i]; QSObject val = convert_qt2qsa(env, argumentList[i], info, _this); Q_ASSERT(val.isValid()); arguments.append(val); } QSObject func_base = QSFuncRefClass::refBase(connection.function_ref); QString func_name = QSFuncRefClass::refMember(connection.function_ref).name(); ip->call(func_base, func_name, arguments); }
/*! Adds the Qt Script function \a qtscriptFunction (fully qualified) as a transient signal handler for the C++ signal \a signal of the object \a sender. Example: \code interpreter->addTransientSignalHandler( myButton, SIGNAL( clicked() ), "classA.obj.calculate" ); \endcode \sa removeTransientSignalHandler() */ void QSInterpreter::addTransientSignalHandler(QObject *sender, const char *signal, const char *qtscriptFunction) { QuickInterpreter *ip = interpreter(); QString func = QString::fromLatin1(qtscriptFunction); func.left(func.find('(')); QSObject senderObj = ip->wrap(sender); QSObject obj = ip->object(func); if (!obj.isFunction()) { qDebug("QSInterpreter::addTransientSignalHandler(): '%s' not a function", qtscriptFunction); return; } QSObject base = QSFuncRefClass::refBase(obj); QSMember member = QSFuncRefClass::refMember(obj); QSWrapperShared *sh = ip->wrapperClass()->shared(&senderObj); if (!sh->setEventHandler(ip, QString::fromLatin1(signal + 1), 0, member.name(), base)) { #if defined( QT_CHECK_STATE ) qWarning("QSInterpreter::addTransientSignalHandler(), " "failed to add signal handler: '%s' to '%s'", signal + 1, qtscriptFunction); #endif } }
QSObject QSAEditor::queryQSObject( const QMetaObject *meta, const QString &property, bool /*includeSuperClass*/ ) const { int propertyIndex = -1; const QMetaObject *m = meta; propertyIndex = m->indexOfProperty(property.toLatin1().constData()); if (propertyIndex >= 0) { QMetaProperty mp = m->property(propertyIndex); QSObject o = vTypeToQSType( QString::fromLatin1(mp.typeName()) ); if ( !o.isNull() && !o.isUndefined() ) return o; } m = meta; for (int i=0; i<m->methodCount(); ++i) { QMetaMethod mm = m->method(i); if (mm.methodType() == QMetaMethod::Slot) { QString n = QLatin1String(mm.methodSignature()); n = n.left(n.indexOf('(')); if ( property != n ) continue; return vTypeToQSType(mm.typeName()); } } return env()->createUndefined(); }
void QSPixmapClass::resize( QSEnv *env ) { if ( env->numArgs() < 1 || env->numArgs() > 2 ) { env->throwError( QString::fromLatin1( "Pixmap.resize() called with %1 arguments. 1 or 2 arguments expected." ). arg( env->numArgs() ) ); return; } QSObject t = env->thisValue(); QSPixmapClass *pac = (QSPixmapClass*)t.objectType(); QPixmap *pix = pac->pixmap( &t ); if ( env->numArgs() == 1 ) { QSObject a0 = env->arg( 0 ); if ( !a0.isA( "Size" ) ) { env->throwError( QString::fromLatin1( "Pixmap.resize() called with an argument of type %1. " "Type Size is expeced" ). arg( a0.typeName() ) ); return; } pix->resize( *( (QSSizeClass*)a0.objectType() )->size( &a0 ) ); } else { if ( !env->arg( 0 ).isA( "Number" ) || !env->arg( 1 ).isA( "Number" ) ) { env->throwError( QString::fromLatin1( "Pixmap.resize() called with arguments of type %1 and %2. " "Type Number and Number is expeced" ). arg( env->arg( 0 ).typeName() ).arg( env->arg( 1 ).typeName() ) ); return; } pix->resize( env->arg( 0 ).toInteger(), env->arg( 1 ).toInteger() ); } return; }
QSObject QSRectClass::normalize(QSEnv *env) { QSObject t = env->thisValue(); QSRectClass *cl = (QSRectClass *)t.objectType(); QRect *r = cl->rect(&t); return cl->construct(r->normalize()); }
void QSRegExpClass::write(QSObject *objPtr, const QSMember &mem, const QSObject &val ) const { if (mem.type() != QSMember::Custom) { QSWritableClass::write(objPtr, mem, val); return; } Q_ASSERT(objPtr->objectType() == objPtr->objectType()->env()->regexpClass()); switch (mem.index()) { case Source: ((QSRegExpShared*)objPtr->shVal())->source = val.toString(); break; case Global: ((QSRegExpShared*)objPtr->shVal())->global = val.toBoolean(); break; case IgnoreCase: { bool ic = val.toBoolean(); ((QSRegExpShared*)objPtr->shVal())->ignoreCase = ic; ((QSRegExpShared*)objPtr->shVal())->reg.setCaseSensitive(!ic); } break; default: QSWritableClass::write(objPtr, mem, val); } }
void QSPixmapClass::save( QSEnv *env ) { if ( env->numArgs() < 1 || env->numArgs() > 2 ) { env->throwError( QString::fromLatin1( "Pixmap.save() called with %1 arguments. 1 or 2 argument expected." ). arg( env->numArgs() ) ); return; } QSObject t = env->thisValue(); QSPixmapClass *pac = (QSPixmapClass*)t.objectType(); QPixmap *pix = pac->pixmap( &t ); if ( !env->arg( 0 ).isString() ) { env->throwError( QString::fromLatin1( "Pixmap.save() called with an argument of type %1. " "Type String is expeced" ). arg( env->arg( 0 ).typeName() ) ); return; } QString format = QFileInfo( env->arg( 0 ).toString() ).extension().upper(); QStrList l = QImageIO::outputFormats(); if ( l.find( format.latin1() ) == -1 ) format = QString::fromLatin1("PNG"); if ( env->numArgs() == 2 ) { if ( !env->arg( 1 ).isString() ) { env->throwError( QString::fromLatin1( "Pixmap.save() called with an argument of type %1. " "as second argument. Type String is expeced" ). arg( env->arg( 1 ).typeName() ) ); return; } format = env->arg( 1 ).toString(); } pix->save( env->arg( 0 ).toString(), format.latin1() ); }
QSEqualsResult QSFuncRefClass::isEqual( const QSObject &a, const QSObject &b ) const { if( a.objectType() == b.objectType() ) return ( QSEqualsResult ) ( refBase( a ).equals( refBase( b ) ) && refMember( a ) == refMember( b ) ); return EqualsNotEqual; }
QSMember QSFuncRefClass::refMember( const QSObject &ref ) { if( ref.isFunction() ) { return ( (QSReferenceData*) ref.shVal() )->member; } qWarning( "QSFuncRefClass::refMember() - not a reference" ); return QSMember(); }
ScopeChain QSFuncRefClass::refScope( const QSObject &ref ) { if( ref.isFunction() ) { return ( (QSReferenceData*) ref.shVal() )->context; } qWarning( "QSFuncRefClass::refScope() - not a reference" ); return ScopeChain(); }
QSObject QSFuncRefClass::refBase( const QSObject &ref ) { if( ref.isFunction() ) { return ( (QSReferenceData*) ref.shVal() )->base; } qWarning( "QSFuncRefClass::refBase() - not a reference" ); return ref.env()->createUndefined(); }
bool Debugger::setVar(const QString &ident, const QSObject &value) { if (!eng || ident == QString::fromLatin1("this")) return false; int dot = ident.find('.'); QString sub = dot > 0 ? ident.mid(0, dot) : ident; QSObject base; // resolve base if (sub == QString::fromLatin1("||Global||")) { base = env()->globalObject(); } else if (sub == QString::fromLatin1("||Activation||")) { base = env()->currentScope(); } else if (sub == QString::fromLatin1("this")) { base = env()->thisValue(); } else { // return false; ScopeChain::const_iterator it = env()->scope().begin(); for (it = env()->scope().begin(); it != env()->scope().end(); ++it) { if ((*it).hasProperty(sub)) { base = *it; break; } } if (it == env()->scope().end()) return false; #if 0 // ### const QSList *chain = Context::current()->pScopeChain(); QSListIterator scope = chain->begin(); while (scope != chain->end()) { if (scope->hasProperty(sub)) { base = *scope; break; } scope++; } if (scope == chain->end()) return false; #endif } // look up each part of a.b.c. while (dot > 0) { int olddot = dot; dot = ident.find('.', olddot + 1); if (dot < 0) { sub = ident.mid(olddot + 1); break; } sub = ident.mid(olddot + 1, dot - olddot - 1); if (!base.hasProperty(sub)) return false; base = base.get(sub); } base.put(sub, value); return true; }
QSObject QSPixmapClass::isNull( QSEnv *env ) { QSObject t = env->thisValue(); QSPixmapClass *pac = (QSPixmapClass*)t.objectType(); QSObject result; QPixmap *pix = pac->pixmap( &t ); return env->createBoolean( pix->isNull() ); }
QSObject QSAEditor::queryQSObject( const QVector<QObject *> &objects, const QString &property ) const { for ( int i = 0; i < objects.count(); i++ ) { const QMetaObject *mo = objects[i]->metaObject(); QSObject qso = queryQSObject( mo, property, i == 0 ); if ( !qso.isNull() && !qso.isUndefined() ) return qso; } return env()->createUndefined(); }
QSObject QSRegExpClass::toStringScript( QSEnv *env ) { QSObject that = env->thisValue(); Q_ASSERT(that.objectType() == env->regexpClass()); QString pattern = QString::fromLatin1("/") + source(&that) + QString::fromLatin1("/"); if (isIgnoreCase(&that)) pattern += 'i'; if (isGlobal(&that)) pattern += 'g'; return env->createString(pattern); }
QStringList QuickInterpreter::classesOf(QSObject &obj) const { const QSClass *cls = classOf(obj); QStringList lst; for (int i = 0; i < cls->numStaticVariables(); ++i) { QSObject o = cls->staticMember(i); if (o.isA(env()->typeClass()) && QSTypeClass::classValue(&o)->asClass()) lst << QSTypeClass::classValue(&o)->identifier(); } return lst; }
void QSEnv::printScopeChain(const ScopeChain *chain) { QStringList lst; ScopeChain::const_iterator it = chain->begin(); while (it != chain->end()) { QSObject obj = *it; QString tmp = !obj.isValid() ? QString::fromLatin1("#") : obj.objectType()->identifier(); lst.append(tmp); it++; } printf("Current scope is:: %s\n", lst.join(QString::fromLatin1(", ")).latin1()); }
bool QSEngineImp::call( QSObject *scope, const QString &func, const QSList &args ) { init(); QSObject t; if ( !scope || !scope->isValid() ) { t = env()->globalObject(); scope = &t; } QSObject v = scope->getQualified(func); Q_ASSERT(v.isValid()); if ( !v.isDefined() ) { if (func != QString::fromLatin1("main")) { errType = ReferenceError; errMsgs.append( QString::fromLatin1("Unknown function: ") + func ); errLines.append( 0 ); } return false; } if ( !v.isFunction() ) { errType = TypeError; errMsgs.append( func + QString::fromLatin1(" is not a function. Call failed.") ); errLines.append( 0 ); return false; } QSObject res = v.invoke( QSMember(), args ); if ( env()->isExceptionMode() ) { QSObject err = env()->exception(); errType = 99; /* TODO */ errLines.append(QSErrorClass::errorLine(&err)); errMsgs.append(QSErrorClass::errorName(&err) + QString::fromLatin1(". ") + QSErrorClass::errorMessage(&err)); #ifdef QSDEBUGGER if (dbg) dbg->setSourceId(QSErrorClass::errorSourceId(&err)); #endif env()->clearException(); return false; } else { errType = 0; errLines.clear(); errMsgs.clear(); // return value retVal = res; return true; } }
QSClass *QSCheckData::typeInfo( const QString &name ) const { QSMember member; QSScopeResolutionList::const_iterator it = scopeStack.begin(); QSObject tmp; tmp.setVal( (int) 0 ); int offset; while( it!=scopeStack.end() ) { offset = 0; tmp.setType( (*it).cl ); const QSClass *cl; if( (*it).cl->name() == QString::fromLatin1("QObject") ) { cl = env()->thisValue().resolveMember( name, &member, tmp.objectType(), &offset ); } else { cl = tmp.resolveMember( name, &member, tmp.objectType(), &offset ); tmp.invalidate(); } if( cl ) { /* Avoid calls to deref for QSWrapperClass, when tmp is destroyed */ tmp.invalidate(); QSObject o( cl->fetchValue( 0, member ) ); if ( o.objectType() == env()->typeClass() ) return QSTypeClass::classValue(&o); else return 0; } it++; } return 0; }
void QSList::remove( const QSObject &obj ) { if ( !obj.isValid() ) return; #if 0 // ### ListNode *n = hook->next; while ( n != hook ) { if ( n->member.imp() == obj.imp() ) { erase( n ); return; } n = n->next; } #endif }
static QSObject qsConnect( QSEnv *env ) { QS_CONNECT_INIT( connect ); // find receiver and slot QObject *receiver = 0; int member_index = -1; const char *slotName = sl.ascii(); if ( recIfaces ) { for ( int i = (int)recIfaces->count()-1; i >= 0; --i ) { receiver = recIfaces->at( i ); member_index = receiver->metaObject()->findSlot( slotName, TRUE ); if ( member_index >= 0 && signal_index >= 0 ) { // regular signal/slot connection QObject::connectInternal( sender, signal_index, receiver, QSLOT_CODE, member_index ); return env->createUndefined(); } } } if ( signal_index == -1 ) { QString msg = QString::fromLatin1("Can't find signal named ") + sig; return env->throwError( SyntaxError, msg ); } QuickInterpreter *ip = QuickInterpreter::fromEnv( env ); if ( recIfaces ) { sendObj->setEventHandler( ip, sig, recIfaces->at( 0 ), sl.left( sl.find( '(' ) ) ); } else { QSObject base; QString name; if ( arg2.isFunction() ) { base = QSFuncRefClass::refBase( arg2 ); name = QSFuncRefClass::refMember( arg2 ).name(); } else { base = arg2; if ( base.isPrimitive() ) return env->throwError( QString::fromLatin1("Invalid receiver object") ); name = env->arg( 3 ).toString(); if ( name.endsWith( QString::fromLatin1("()") ) ) name.truncate( name.length() - 2 ); } sendObj->setEventHandler( ip, sig, 0, name, base ); } return env->createUndefined(); }
void QuickInterpreter::timerEvent(QTimerEvent *e) { int id = e->timerId(); QSObject function = m_timers[id]; Q_ASSERT(function.isValid()); Q_ASSERT(function.isFunction()); QSList arguments; arguments.append(env()->createNumber(id)); QSObject func_base = QSFuncRefClass::refBase(function); QString func_name = QSFuncRefClass::refMember(function).name(); call(func_base, func_name, arguments); }
void QSRectClass::write(QSObject *o, const QSMember &mem, const QSObject &val) const { if (mem.type() == QSMember::Custom) { int i = val.toInteger(); switch (mem.idx) { case 0: case 1: rect(o)->setX(i); break; case 2: case 3: rect(o)->setY(i); break; case 4: rect(o)->setWidth(i); break; case 5: rect(o)->setHeight(i); break; case 6: rect(o)->setRight(i); break; case 7: rect(o)->setBottom(i); break; case 8: break; default: qFatal("QSRectClass::write: unhandled case"); } } else { QSClass::write(o, mem, val); } }
/*! Returns all the classes declared in the context \a context. \sa functions(), variables() */ QStringList QSInterpreter::classes(QObject *context) const { if (!context) { #if defined( QT_RANGE_CHECK ) qWarning("QSInterpreter::classesOf: context is null"); #endif return QStringList(); } startInterpreter(); QSObject obj = d->interpreter->wrap(context); QStringList lst; if (!obj.isUndefined()) lst = d->interpreter->classesOf(obj); stopInterpreter(); return lst; }
void QSPixmapClass::resize( QSEnv *env ) { if ( env->numArgs() < 1 || env->numArgs() > 2 ) { env->throwError( QString::fromLatin1( "Pixmap.resize() called with %1 arguments. 1 or 2 arguments expected." ). arg( env->numArgs() ) ); return; } QSObject t = env->thisValue(); QSPixmapClass *pac = (QSPixmapClass*)t.objectType(); QPixmap *pix = pac->pixmap( &t ); int w=-1; int h=-1; if ( env->numArgs() == 1 ) { QSObject a0 = env->arg( 0 ); if ( !a0.isA( "Size" ) ) { env->throwError( QString::fromLatin1( "Pixmap.resize() called with an argument of type %1. " "Type Size is expected" ). arg( a0.typeName() ) ); return; } QSize size = *((QSSizeClass*)a0.objectType())->size(&a0); w = size.width(); h = size.height(); } else { if ( !env->arg( 0 ).isA( "Number" ) || !env->arg( 1 ).isA( "Number" ) ) { env->throwError( QString::fromLatin1( "Pixmap.resize() called with arguments of type %1 and %2. " "Type Number and Number is expected" ). arg( env->arg( 0 ).typeName() ).arg( env->arg( 1 ).typeName() ) ); return; } w = env->arg( 0 ).toInteger(); h = env->arg( 1 ).toInteger(); } if (w >= 0 && h >= 0) { QPixmap tmppm(w, h); tmppm.fill(Qt::black); QPainter p(&tmppm); p.drawPixmap(0, 0, *pix); *pix = tmppm; } return; }
/*! Returns all script functions which have been defined in the context \a context. If \a flags includes \c FunctionSignatures, then each function name returned will be of the following form: \code functionName( typeOfArg1, typeOfArg2, ... ) \endcode Otherwise just the names will be returned (which is the default). \sa classes(), variables() */ QStringList QSInterpreter::functions(QObject *context, FunctionFlags flags) const { if (!context) { #if defined( QT_RANGE_CHECK ) qWarning("QSInterpreter::functions: context is null"); #endif return QStringList(); } startInterpreter(); QStringList lst; QSObject obj = d->interpreter->wrap(context); if (!obj.isUndefined()) lst = d->interpreter->functionsOf(obj, flags & FunctionSignatures); stopInterpreter(); return lst; }
QSObject QSAEditor::queryQSObject( QSObject &ctx, const QString &property ) const { QString s = property; QSObject ctxValue = ctx.get( s ); if ( ctxValue.isA( env()->typeClass() ) ) { return ctxValue; } if ( s.indexOf( '[' ) != -1 ) return QSArray( env() ); else if ( s == QString::fromLatin1("false") || s == QString::fromLatin1("true") ) return env()->createBoolean( false ); else if ( s[0] == '\'' || s[0] == '\"' ) return env()->createString( QString::fromLatin1("") ); return ctxValue; }