/* ========================================================================== */ QVariant LispPlugin::read_from(QVariantList& tokenz) { if (tokenz.isEmpty()) throw runtime_error("unexpected EOF while reading"); QByteArray token = tokenz.takeFirst().toByteArray(); if (token == "(") { //auto L = QVariant(QVariant::List); QVariantList L; while (tokenz[0] != ")") L.append(read_from(tokenz)); tokenz.takeFirst(); // pop off ) return L; } else if (token == ")") { throw std::runtime_error("enexcepted )"); } else { bool successCast; auto i = token.toInt(&successCast); if (successCast) return i; auto d = token.toDouble(&successCast); if (successCast) return d; return QString(token); } }
void TestConversions::testDMSToRad() { QVariantList data; data << 0 << 0 << 0 << 0.; data << 30 << 0 << 0 << M_PI/6; data << 45 << 0 << 0 << M_PI/4; data << 60 << 0 << 0 << M_PI/3; data << 90 << 0 << 0 << M_PI/2; data << 120 << 0 << 0 << 2*M_PI/3; data << 180 << 0 << 0 << M_PI; data << 270 << 0 << 0 << 3*M_PI/2; data << 360 << 0 << 0 << 2*M_PI; data << 0 << 30 << 0 << M_PI/360; data << 0 << 45 << 0 << M_PI/240; data << 30 << 30 << 0 << 61*M_PI/360; data << 0 << 0 << 1 << M_PI/648000; data << 90 << 58 << 30 << 1213*M_PI/2400; data << 10 << 59 << 59 << 39599*M_PI/648000; while (data.count() >= 4) { int deg, min, sec; double rad; deg = data.takeFirst().toInt(); min = data.takeFirst().toInt(); sec = data.takeFirst().toInt(); rad = data.takeFirst().toDouble(); QVERIFY2(std::abs(StelUtils::dmsToRad(deg, min, sec)-rad)<=ERROR_LIMIT, qPrintable(QString("%1d%2m%3s=%4").arg(deg).arg(min).arg(sec).arg(rad))); } }
void TestConversions::testHMSToRad() { QVariantList data; data << 0 << 0 << 0 << 0.; data << 1 << 0 << 0 << M_PI/12; data << 6 << 0 << 0 << M_PI/2; data << 12 << 0 << 0 << M_PI; data << 15 << 0 << 0 << 5*M_PI/4; data << 0 << 15 << 0 << M_PI/720; data << 0 << 0 << 15 << M_PI/43200; data << 2 << 15 << 45 << 269*M_PI/1600; data << 20 << 0 << 0 << 5*M_PI/3; data << 24 << 0 << 0 << 2*M_PI; data << 0 << 59 << 0 << 59*M_PI/10800; data << 0 << 0 << 59 << 59*M_PI/648000; data << 0 << 59 << 59 << 3599*M_PI/648000; data << 3 << 59 << 59 << 165599*M_PI/648000; while (data.count() >= 4) { int h, m, s; double rad; h = data.takeFirst().toInt(); m = data.takeFirst().toInt(); s = data.takeFirst().toInt(); rad = data.takeFirst().toDouble(); QVERIFY2(std::abs(StelUtils::hmsToRad(h, m, s)-rad)<=ERROR_LIMIT, qPrintable(QString("%1h%2m%3s=%4").arg(h).arg(m).arg(s).arg(rad))); } }
bool ChangeLog::checkChanges(const QString &previousVersion, const QString ¤tVersion) { QVersionNumber previous = QVersionNumber::fromString(previousVersion); QVersionNumber current = QVersionNumber::fromString(currentVersion); if (current <= previous) { qCInfo(CHANGELOG_CATEGORY) << "Current version isn't newer, than previous" << previousVersion << currentVersion; return false; } QFileSelector fileSelector; fileSelector.setExtraSelectors(QStringList() << QLocale::system().uiLanguages().constFirst().split('-').constFirst()); const QString path = fileSelector.select(":/changelogs/changelog.json"); QFile file(path); if (!file.open(QIODevice::ReadOnly)) { qCCritical(CHANGELOG_CATEGORY) << "Fail to open changelog file" << path << file.errorString(); return false; } QByteArray data = file.readAll(); QJsonParseError parseError; QJsonDocument document = QJsonDocument::fromJson(data, &parseError); if (parseError.error != QJsonParseError::NoError) { qCritical(CHANGELOG_CATEGORY) << "Fail to parse changelog data JSON:" << data << "error at offset" << parseError.offset << parseError.errorString() << parseError.error; return false; } QVariantList content = document.array().toVariantList(); while (!content.isEmpty()) { if (QVersionNumber::fromString(content.constFirst().toMap().value("version").toString()) > current) { content.takeFirst(); } else { break; } } QVariantList result; while (!content.isEmpty()) { if (QVersionNumber::fromString(content.constFirst().toMap().value("version").toString()) > previous) { result.append(content.takeFirst()); } else { break; } } if (result.isEmpty()) { qCWarning(CHANGELOG_CATEGORY) << "Empty changelog" << previousVersion << currentVersion; return false; } emit changesAvailable(result); return true; }
void QJnextMainLoop::set(QObject *object, QVariantList& args, QByteArray* retval) { QByteArray property = args.takeFirst().toByteArray(); const QMetaObject * meta = object->metaObject(); int propertyIndex = meta->indexOfProperty(property); if (propertyIndex < 0) { retval->append("No such property " + property); return; } QMetaProperty metaprop = meta->property(propertyIndex); if (!metaprop.isWritable()) { retval->append("Property " + property + " is not writable"); return; } QVariant vValue = args.takeFirst(); /* handle enum inputs as text */ if (metaprop.isEnumType()) { int id; const QMetaEnum &enumerator = metaprop.enumerator(); QByteArray keys; for (int i = 0; i < enumerator.keyCount(); ++i) keys += enumerator.key(i) + QByteArray(" "); #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tEnumerator" << enumerator.isFlag() << enumerator.scope() << enumerator.name() << keys; #endif if (enumerator.isFlag()) id = enumerator.keyToValue(vValue.toByteArray().constData()); else id = enumerator.keysToValue(vValue.toByteArray().constData()); if (id != -1) vValue = QVariant(id); } #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tSET" << meta->className() << property << vValue << vValue.canConvert(metaprop.type()); #endif if (!vValue.convert(metaprop.type())) { retval->append( "Unable to convert \"" + vValue.toByteArray() + "\" to " + metaprop.typeName()); return; } if (!metaprop.write(object, vValue)) retval->append( QByteArray("Unable to set property ") + meta->className() + "." + property + " to " + vValue.toByteArray()); else *retval = QByteArray(); }
void TestDeltaT::testDeltaTByMorrisonStephenson1982WideDates() { // test data from Mathematical Astronomical Morsels, p. 8. [ISBN 0-943396-51-4] QVariantList data; data << 0 << 177; data << 100 << 158; data << 200 << 140; data << 300 << 123; data << 400 << 107; data << 500 << 93; data << 600 << 79; data << 700 << 66; data << 800 << 55; data << 900 << 45; data << 1000 << 35; data << 1100 << 27; data << 1200 << 20; data << 1300 << 14; data << 1400 << 9; data << 1500 << 5; data << 1600 << 2; data << 1700 << 0; data << 1800 << 0; data << 1980 << 1; data << 2075 << 4; data << 2200 << 8; data << 2300 << 13; data << 2400 << 19; data << 2500 << 26; data << 2600 << 34; data << 2700 << 43; data << 2800 << 53; data << 2900 << 64; data << 3000 << 76; while(data.count() >= 2) { // 30 seconds accuracy int year = data.takeFirst().toInt(); int yout, mout, dout; double JD; double expectedResult = data.takeFirst().toDouble(); StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0); double result = StelUtils::getDeltaTByMorrisonStephenson1982(JD)/60.0; StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout); QVERIFY2(qRound(result) <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5") .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout)) .arg(year) .arg(result) .arg(expectedResult) .toUtf8()); } }
void TestConversions::testRadToDMS() { QVariantList data; data << 0. << 0 << 0 << 0.; data << M_PI/6 << 30 << 0 << 0.; data << M_PI/4 << 45 << 0 << 0.; data << M_PI/3 << 60 << 0 << 0.; data << M_PI/2 << 90 << 0 << 0.; data << 2*M_PI/3 << 120 << 0 << 0.; data << M_PI << 180 << 0 << 0.; data << 3*M_PI/2 << 270 << 0 << 0.; data << M_PI/360 << 0 << 30 << 0.; data << M_PI/240 << 0 << 45 << 0.; data << 61*M_PI/360 << 30 << 30 << 0.; data << M_PI/648000 << 0 << 0 << 1.; data << 1213*M_PI/2400 << 90 << 58 << 30.; data << 39599*M_PI/648000 << 10 << 59 << 59.; data << -M_PI/36 << -5 << 0 << 0.; data << -7*M_PI/8 << -157 << 30 << 0.; data << -2*M_PI/5 << -72 << 0 << 0.; data << -M_PI << -180 << 0 << 0.; data << -10*M_PI/648 << -2 << 46 << 40.0; while (data.count()>=4) { double rad, sec, seco, angle1, angle2; int deg, min; unsigned int dego, mino; bool sign; QString s; rad = data.takeFirst().toDouble(); deg = data.takeFirst().toInt(); min = data.takeFirst().toInt(); sec = data.takeFirst().toDouble(); if (deg>=0) angle1 = sec+min*60+deg*3600; else angle1 = -1*(sec+min*60+std::abs(deg)*3600); StelUtils::radToDms(rad, sign, dego, mino, seco); angle2 = seco+mino*60+dego*3600; if (!sign) { angle2 = -1*angle2; s = "-"; } else s = "+"; QVERIFY2(std::abs(angle1-angle2)<=ERROR_LIMIT, qPrintable(QString("%1rad=%2%3d%4m%5s").arg(rad).arg(s).arg(dego).arg(mino).arg(seco))); } }
void QJnextMainLoop::connect(QObject *object, uint id, QVariantList& args, QByteArray *retval) { QByteArray methodName = args.takeFirst().toByteArray(); QByteArray sid = args.takeFirst().toByteArray(); int argCount = -1; const QMetaObject* meta = object->metaObject(); QMetaMethod method; for (int i = 0; i < meta->methodCount(); ++i) { method = meta->method(i); if (QByteArray(method.signature()).startsWith(methodName + "(")) { QList<QByteArray> types = method.parameterTypes(); if (types.size() > argCount) { // TODO : always pick enum types argCount = method.parameterTypes().size(); break; } } } if (argCount == -1) { *retval = "No signal named " + methodName + " found"; return; } #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tSIGNAL.connect" << methodName << id << sid; #endif QJnextUserData * jnextData = dynamic_cast<QJnextUserData*>(object->userData( QJnextMainLoop::userDataId)); if (jnextData == NULL) { *retval = "Unable to retrieve jnextData from object " + QByteArray::number(id); return; } SignalHandler *& handler = jnextData->signalHandlers[sid]; if (handler != NULL) { #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tCONNECTED (chained)"; #endif return; } handler = new SignalHandler(this, object, id, "com.blackberry.qt" + sid, meta, method); if (!handler->isValid()) { *retval = "QMetaObject::connect returned false. Unable to connect"; return; } #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tCONNECTED"; #endif }
void QJnextMainLoop::listNamespace(QVariantList& args, QByteArray* retval) { QByteArray param = args.takeFirst().toByteArray(); QByteArray ns(param); QByteArray ver = QtBridge::takeLastParam(ns, "@"); if (ver.size() == 0) ver = "1.0"; QDeclarativeComponent component(declarativeEngine, this); component.setData( "import " + ns + " " + ver + "; import QtQuick 1.0; QtObject {}", QUrl()); if (component.isError() || !component.isReady()) { qWarning() << "COMPONENT ERROR" << component.errorString(); } QList<QDeclarativeType*> types = QDeclarativeMetaType::qmlTypes(); QSet<QString> typeNames; foreach(QDeclarativeType* type, types) { #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\t" << type->qmlTypeName() << type->majorVersion() << type->minorVersion(); #endif if (ns == type->module() && type->isCreatable()) { QString qmlType = QString::fromLatin1(type->qmlTypeName()); typeNames << qmlType.split("/").takeLast(); } }
/* ========================================================================== */ QVariant LispPlugin::exec(QVariant procName, QVariant _exps) { QVariant result; assert(isa(_exps, "StringList")); QVariantList exps = _exps.toList(); if ("*" == procName) { auto a = exps[0].toDouble(); auto b = exps[1].toDouble(); return a * b; } else if ("+" == procName) { auto a = exps[0].toDouble(); auto b = exps[1].toDouble(); return a + b; } else if ("-" == procName) { auto a = exps[0].toDouble(); auto b = exps[1].toDouble(); return a - b; } else if ("<=" == procName) { auto a = exps[0].toDouble(); auto b = exps[1].toDouble(); return a <= b; } else { if (exps.size() == 1) _exps = exps.takeFirst(); return CallExternal(procName.toByteArray(), _exps); } throw runtime_error( QString("Unable to resolve symbol: %1 in this context") .arg(procName.toString()).toStdString()); }
void QJnextMainLoop::get(QObject *object, QVariantList& args, QByteArray* retval) { QByteArray property = args.takeFirst().toByteArray(); const QMetaObject * meta = object->metaObject(); int propertyIndex = meta->indexOfProperty(property); if (propertyIndex < 0) { retval->append("No such property " + property); return; } QMetaProperty metaprop = meta->property(propertyIndex); if (!metaprop.isReadable()) { retval->append("Property " + property + " is not readable"); return; } QVariant value = metaprop.read(object); if (value.isNull()) { qWarning() << "[QJnextMainLoop]\tNULL value ignored" << object->property(property); } #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tVALUE" << value << object->property(property) << metaprop.isEnumType(); #endif if (metaprop.isEnumType()) { bool ok; int enumValue = value.toInt(&ok); if (!ok) { int status = -1; void *argv[] = { 0, &value, &status }; QMetaObject::metacall(const_cast<QObject*>(object), QMetaObject::ReadProperty, propertyIndex + meta->propertyOffset(), argv); const int * enumRaw = static_cast<const int *>(argv[0]); if (status == -1 && enumRaw != 0) { const QMetaEnum & iEnum = metaprop.enumerator(); if (iEnum.isFlag()) value = iEnum.valueToKeys(*enumRaw); else value = iEnum.valueToKey(*enumRaw); } else { // someone is evil and didn't register enumerations properly qDebug() << "[QJnextMainLoop]\t" << "!!!!!!!" << argv[0] << value; } } else if (metaprop.enumerator().isFlag()) { *retval = metaprop.enumerator().valueToKeys(enumValue); return; } else { *retval = metaprop.enumerator().valueToKey(enumValue); return; } } *retval = value.toByteArray(); }
void Decision::setWriteIns(QVariantList newWriteIns) { if (newWriteIns == writeIns()) return; auto writeInList = m_decision.initWriteIns(newWriteIns.size()); for (::UnsignedContest::Contestant::Builder writeInBuilder : writeInList) { auto writeIn = newWriteIns.takeFirst().toMap(); writeInBuilder.setName(writeIn["name"].toString().toStdString()); writeInBuilder.setDescription(writeIn["description"].toString().toStdString()); } emit writeInsChanged(); }
void TestConversions::testRadToHMS() { QVariantList data; data << 0. << 0 << 0 << 0.; data << M_PI/36 << 0 << 19 << 59.9; data << 7*M_PI/8 << 10 << 30 << 0.; data << 2*M_PI/5 << 4 << 48 << 0.; while (data.count()>=4) { double rad, s, so, t1, t2; int h, m; unsigned int ho, mo; rad = data.takeFirst().toDouble(); h = data.takeFirst().toInt(); m = data.takeFirst().toInt(); s = data.takeFirst().toDouble(); t1 = s+m*60+h*3600; StelUtils::radToHms(rad, ho, mo, so); t2 = so+mo*60+ho*3600; QVERIFY2(std::abs(t1-t2)<=0.1, qPrintable(QString("%1rad=%2h%3m%4s").arg(rad).arg(ho).arg(mo).arg(so))); } }
bool ApplicationsMenuApplet::init(QWidget* parent) { if(m_settings.type() == QVariant::List) { QVariantList list = m_settings.value<QVariantList>(); while(!list.isEmpty()) { const char** names = reinterpret_cast<const char**>(list.takeFirst().value<void*>()); QMenu* menu = m_menu->addMenu(g_menu_names.value(names[0])); menu->setIcon(QIcon::fromTheme(names[1]).pixmap(menu->height(),menu->height())); m_menus.insert(g_menu_names.value(names[0]), menu); } QStringList categories; for(QList<DesktopEntryObject*>::iterator pos = m_entries.begin(); pos != m_entries.end(); ++pos) { if(m_menus.contains((*pos)->Category())) m_menus[(*pos)->Category()]->addAction((*pos)->Action()); else m_menus["Other"]->addAction((*pos)->Action()); /* categories = (*pos)->Categories(); for(QStringList::iterator pos2 = categories.begin(); pos2 != categories.end(); ++pos2) if(m_menus.contains(*pos2)) m_menus[*pos2]->addAction((*pos)->Action()); */ } } m_menu->addSeparator(); m_menu->addAction(QIcon::fromTheme("application-exit"), "Quit", qApp, SLOT(quit())); /* connect(DesktopApplications::instance(), SIGNAL(applicationUpdated(const DesktopApplication&)), this, SLOT(onApplicationUpdated(const DesktopApplication&))); connect(DesktopApplications::instance(), SIGNAL(applicationRemoved(const QString&)), this, SLOT(onApplicationRemoved(const QString&))); QList<DesktopApplication> apps = DesktopApplications::instance()->applications(); foreach(const DesktopApplication& app, apps) onApplicationUpdated(app); */ return true; }
QSqlQuery DatabaseConnection::PQuery(QString queryStr, QVariantList args) { if(!m_db.isOpen()) throw std::runtime_error("Database : Tentative de requete sur une connexion non ouverte : " + queryStr.toStdString() + " : " + m_db.lastError().text().toLatin1().constData()); QSqlQuery query(m_db); query.prepare(queryStr); while (!args.isEmpty()) query.addBindValue(args.takeFirst()); if(!query.exec()) throw std::runtime_error("Database : Erreur lors de l'execution de \"" + queryStr.toStdString() + "\" : " + query.lastError().text().toLatin1().data()); return query; }
void QJnextMainLoop::call(QObject *object, QVariantList& args, QByteArray* retval) { QByteArray methodName = args.takeFirst().toByteArray(); QList<QMetaMethod> methods = matchMetamethod(object, methodName, args, retval); if (methods.size() == 0) return; for (int i = 0; i < methods.size(); ++i) { if (doCall(object, &(methods[i]), args, retval) != -1) return; } *retval = "No method with matching parameters for " + methodName + " "; foreach (QVariant var, args) retval->append(var.toByteArray() + " "); retval->remove(retval->size() - 1, 1); }
void OpenCachingComModel::parseFile( const QByteArray& file ) { QScriptEngine engine; // Qt requires parentheses around json code QScriptValue data = engine.evaluate( '(' + QString::fromUtf8( file ) + ')' ); QVariantList caches = data.toVariant().toList(); // qDebug()<<"parsing "<<caches.size()<<" items"; QList<AbstractDataPluginItem*> items; while (!caches.isEmpty()) { QVariantMap map = caches.takeFirst().toMap(); if ( !findItem( map["oxcode"].toString() ) ) { items << new OpenCachingComItem( map, this ); } } addItemsToList(items); }
void SoundCloud::checkUrlIsValid() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(this->sender()); if (!reply) { emit urlChecked(false); return; } QUrl redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (!redirect.isEmpty()) { this->checkUrl(redirect); } else { QString response(reply->readAll()); QVariantMap result = Json::parse(response).toMap(); if (!result.isEmpty()) { QVariantList tracks = result.value("tracks").toList(); if (!tracks.isEmpty()) { while (!tracks.isEmpty()) { QVariantMap track = tracks.takeFirst().toMap(); QUrl url(track.value("permalink_url").toString()); QString title = track.value("title").toString().trimmed(); emit urlChecked((url.isValid()) && (!title.isEmpty()), url, this->serviceName(), title + ".mp3", tracks.isEmpty()); } } else { QUrl url(result.value("permalink_url").toString()); QString title = result.value("title").toString().trimmed(); emit urlChecked((url.isValid()) && (!title.isEmpty()), url, this->serviceName(), title + ".mp3"); } } else { emit urlChecked(false); } } reply->deleteLater(); }
void QJnextMainLoop::createObjectFromDocument(QVariantList& args, QByteArray* result) { QByteArray uri = args.takeFirst().toByteArray(); Q_UNUSED(result); QDeclarativeComponent * component = new QDeclarativeComponent( declarativeEngine, uri); if (component->isLoading()) { *result = "Unimplemented: Network components"; qWarning() << *result; return; // TODO: support loading qml documents from the network /*QObject::connect(component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), this, SLOT(continueLoadingComponent()));*/ } continueLoadingComponent(component, result); }
void StateOp::fromVariant(QVariant v) { QVariantList list = v.toList(); if (list.length() > 1){ m_action = list.takeFirst().toString(); /* assume well formatted from here because im lazy */ if (m_action == "AddFile" || m_action == "ModifyFile"){ m_filePath = list.takeFirst().toString(); m_size = list.takeFirst().toLongLong(); m_modifiedAt = QDateTime::fromString(list.takeFirst().toString(), Qt::ISODate); m_fingerPrint = list.takeFirst().toString(); }else if(m_action == "RemoveFile"){ m_filePath = list.takeFirst().toString(); }else if(m_action == "RenameFile"){ m_filePath = list.takeFirst().toString(); m_newFilePath = list.takeFirst().toString(); }else{ qDebug() << "unrecognised state op action in StateOp::fromList"; } }else{ qWarning() << "invalid qvariant list for stateop"; } }
void QJnextMainLoop::disconnect(QObject *object, uint id, QVariantList& args, QByteArray *retval) { QByteArray sid = args.takeFirst().toByteArray(); if (sid.size() == 0) { *retval = QByteArray("You must specify a signal id"); return; } QJnextUserData * jnextData = dynamic_cast<QJnextUserData*>(object->userData( QJnextMainLoop::userDataId)); if (jnextData == NULL) { *retval = "Unable to retrieve jnextData from object " + id; return; } SignalHandler *& handler = jnextData->signalHandlers[sid]; if (handler == NULL) { qWarning() << "No known connection to " + sid; *retval = "No know connection to " + sid; return; } signalHandlers.remove(sid); handler->unref(); }
QWidget *UnseenEpisodeWidget::_makeWidget() { if (_serie["unseen"].toList().isEmpty()) { _currentId = -1; return 0; // TODO DO IT RIGHT !!! } QVariantList unseenEpisodes = _serie["unseen"].toList(); QVariantMap episode = unseenEpisodes.takeFirst().toMap(); _serie["unseen"] = unseenEpisodes; QString episodeTitle = episode["title"].toString(); QString episodeCode = episode["code"].toString(); _currentId = episode["id"].toDouble(); QWidget *widget = new QWidget(this); QHBoxLayout *layout = new QHBoxLayout; layout->setContentsMargins(5, 5, 5, 5); QLabel *episodeLabel = new QLabel(widget); episodeLabel->setWordWrap(true); episodeLabel->setText(_serie["title"].toString() + " - " + episodeCode + " - " + episodeTitle); layout->addWidget(episodeLabel); MarkAsButton *button = new MarkAsButton(_currentId, widget); connect(button, SIGNAL(episodeSeenClicked(uint)), _api, SLOT(postEpisodesWatched(uint))); layout->addWidget(button); layout->setStretch(0, 1); widget->setLayout(layout); widget->setEnabled(false); return widget; }
void TestDeltaT::testDeltaTByEspenakMeeus() { // test data from http://eclipse.gsfc.nasa.gov/SEcat5/deltat.html#tab1 QVariantList data; data << -500 << 17190 << 430; data << -400 << 15530 << 390; data << -300 << 14080 << 360; data << -200 << 12790 << 330; data << -100 << 11640 << 290; data << 0 << 10580 << 260; data << 100 << 9600 << 240; data << 200 << 8640 << 210; data << 300 << 7680 << 180; data << 400 << 6700 << 160; data << 500 << 5710 << 140; data << 600 << 4740 << 120; data << 700 << 3810 << 100; data << 800 << 2960 << 80; data << 900 << 2200 << 70; data << 1000 << 1570 << 55; data << 1100 << 1090 << 40; data << 1200 << 740 << 30; data << 1300 << 490 << 20; data << 1400 << 320 << 20; data << 1500 << 200 << 20; data << 1600 << 120 << 20; data << 1700 << 9 << 5; data << 1750 << 13 << 2; data << 1800 << 14 << 1; data << 1850 << 7 << 1; data << 1900 << -3 << 1; data << 1950 << 29 << 0.1; data << 1955 << 31.1 << 0.1; data << 1960 << 33.2 << 0.1; data << 1965 << 35.7 << 0.1; data << 1970 << 40.2 << 0.1; data << 1975 << 45.5 << 0.1; data << 1980 << 50.5 << 0.1; data << 1985 << 54.3 << 0.1; data << 1990 << 56.9 << 0.1; data << 1995 << 60.8 << 0.1; data << 2000 << 63.8 << 0.1; data << 2005 << 64.7 << 0.1; while(data.count() >= 3) { int year = data.takeFirst().toInt(); int yout, mout, dout; double JD; double expectedResult = data.takeFirst().toDouble(); double acceptableError = data.takeFirst().toDouble(); StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0); double result = StelUtils::getDeltaTByEspenakMeeus(JD); double actualError = qAbs(qAbs(expectedResult) - qAbs(result)); StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout); QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7") .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout)) .arg(year) .arg(result) .arg(expectedResult) .arg(actualError) .arg(acceptableError) .toUtf8()); } }
/* ========================================================================== */ QVariant LispPlugin::eval(QVariant x, Env& env = global_env) { QVariant result(QVariant::List); Env localEnv = Env::Env(&env); QVariant firstToken; if (x.canConvert(QVariant::List)) { if (x.toList().size() != 0) firstToken = x.toList()[0]; else return QVariantList(); } if (isa(x, QVariant::String)) { QString symbolName = x.toString(); auto someEnv = env.findvar(symbolName); if (someEnv == NULL) throw runtime_error( QString("Unable to resolve symbol: %1 in this context") .arg(symbolName).toStdString()); result = someEnv->value(symbolName); } else if (isa(x, QVariant::UserType)) { if (isa(x, "Lambda")) { Lambda l = x.value<Lambda>(); result = l.exec(x.toList(), localEnv); } else { return x; } } else if (!isa(x, QVariant::List)) { result = x; } else if ("quote" == firstToken) { // (quote exp) QVariant exp(QVariant::String); load(x, exp); result = exp; } else if ("if" == firstToken) { // (if test conseq alt) QVariant test, conseq, alt; load(x, test, conseq, alt); test = eval(test, localEnv); auto bTest = test.toBool(); result = eval(bTest ? conseq : alt, localEnv); } else if ("define" == firstToken) { // (define var exp) QVariant var, exp; load(x, var, exp); env[var.toString()] = eval(exp, localEnv); } else if ("set!" == firstToken) { // (set! var exp) QVariant var, exp; load(x, var, exp); auto symbolName = var.toString(); auto someEnv = env.findvar(symbolName); if (someEnv == NULL) env[symbolName] = eval(exp, localEnv); else (*someEnv)[symbolName] = eval(exp, localEnv); } else if ("begin" == firstToken) { // (begin exp ...) auto list = x.toList(); QListIterator<QVariant> it(list); it.next(); while (it.hasNext()) result = eval(it.next(), localEnv); } else if ("lambda" == firstToken) { auto args = x.toList(); result = QVariant::fromValue(Lambda(this, args[1], args[2])); } else { // (proc exp) QVariantList exps = x.toList(); auto proc = exps.takeFirst(); auto fname = proc.toString(); for(int i = 0; i != exps.size(); ++i) { exps[i] = eval(exps[i], localEnv); } auto lambdaEnv = env.findvar(fname); if (lambdaEnv == NULL) result = exec(proc, exps); else { auto lambdaVar = (*lambdaEnv)[fname]; if (!isa(lambdaVar, QVariant::UserType)) throw runtime_error( QString("Unable to resolve function: %1 in this context") .arg(fname).toStdString()); auto lambda = lambdaVar.value<Lambda>(); result = lambda.exec(exps, localEnv); } } return result; }
void QJnextMainLoop::createObject(QVariantList& args, QByteArray* result) { uint id = idBase++; // this will OWN the backing char array QByteArray param = args.takeFirst().toByteArray(); QByteArray ns(param); QByteArray ver = QtBridge::takeLastParam(ns, "@"); if (ver.size() == 0) ver = "1.0"; QByteArray cls = QtBridge::takeLastParam(ns, "."); QString qmlcls = QString(ns) + "/" + cls; QObject *& object = objects[id]; if (object != NULL) { *result = "Error object already exists for id" + QByteArray::number(id); qWarning() << *result; return; } #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tQDeclarative" << "import " + ns + " " + ver + "; " + cls + " {}"; #endif QDeclarativeComponent component(declarativeEngine, this); component.setData( "import " + ns + " " + ver + "; import QtQuick 1.0; QtObject {}", QUrl()); if (component.isError() || !component.isReady()) { qWarning() << "COMPONENT ERROR" << component.errorString(); } int majorVersion = -1, minorVersion = -1; QDeclarativeType * dtype = NULL; QString scls = cls; QList<QDeclarativeType*> types = QDeclarativeMetaType::qmlTypes(); foreach(QDeclarativeType* type, types) { if (ns == type->module()) { QString qmlType = QString::fromLatin1(type->qmlTypeName()); if (qmlcls.compare(qmlType, Qt::CaseInsensitive) == 0) { if (type->majorVersion() > majorVersion && type->minorVersion() > minorVersion) { majorVersion = type->majorVersion(); minorVersion = type->minorVersion(); dtype = type; } } } } if (dtype == NULL && ns == "bb" && cls == "Application") { object = bb::Application::instance(); object->setUserData(userDataId, new QJnextUserData(id)); goto end_createObject; } if (dtype == NULL) { *result = "No such Type " + cls + " in namespace " + ns; qWarning() << *result; return; } else if (!dtype->isCreatable()) { *result = "Class " + ns + "." + cls + " is not creatable: " + dtype->noCreationReason().toLatin1(); qWarning() << *result; return; } #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\t" << dtype->typeId() << dtype->typeName() << QString("%1.%2").arg(QString::number(dtype->majorVersion())).arg( QString::number(dtype->minorVersion())); #endif object = dtype->create(); if (!object) { qWarning() << "COMPONENT.CREATE ERROR"; *result = "Error creating component"; return; } object->setUserData(userDataId, new QJnextUserData(id)); object->setParent(this); end_createObject: *result = QByteArray::number(id); #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tCreated object" << id; #endif }
void TestDeltaT::testDeltaTByChaprontMeeus() { // test data from Astronomical Algorithms, 2ed., p. 79. QVariantList data; data << 1620 << 121.0; data << 1630 << 82.0; data << 1640 << 60.0; data << 1650 << 46.0; data << 1660 << 35.0; data << 1670 << 24.0; data << 1680 << 14.0; data << 1690 << 8.0; data << 1700 << 7.0; data << 1710 << 9.0; data << 1720 << 10.0; data << 1730 << 10.0; data << 1740 << 11.0; data << 1750 << 12.0; data << 1760 << 14.0; data << 1770 << 15.0; data << 1780 << 16.0; data << 1790 << 16.0; data << 1800 << 13.1; data << 1810 << 12.0; data << 1820 << 11.6; data << 1830 << 7.1; data << 1840 << 5.4; data << 1850 << 6.8; data << 1860 << 7.7; data << 1870 << 1.4; data << 1880 << -5.5; data << 1890 << -6.0; data << 1900 << -2.8; data << 1910 << 10.4; data << 1920 << 21.1; data << 1930 << 24.4; data << 1940 << 24.3; data << 1950 << 29.1; data << 1960 << 33.1; data << 1970 << 40.2; data << 1980 << 50.5; data << 1984 << 53.8; // * data << 1988 << 55.8; // * data << 1990 << 56.9; data << 1992 << 58.3; // * data << 1996 << 61.6; // * data << 1998 << 63.0; // test data marked as * taken Mathematical Astronomical Morsels III, p. 8. [ISBN 0-943396-81-6] // accuracy 0.9 seconds for years range 1800-1997 while(data.count() >= 2) { int year = data.takeFirst().toInt(); int yout, mout, dout; double JD; double expectedResult = data.takeFirst().toDouble(); double acceptableError = 0.9; // 0.9 seconds StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0); double result = StelUtils::getDeltaTByChaprontMeeus(JD); double actualError = qAbs(qAbs(expectedResult) - qAbs(result)); StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout); QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7") .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout)) .arg(year) .arg(result) .arg(expectedResult) .arg(actualError) .arg(acceptableError) .toUtf8()); } }
void QJnextMainLoop::introspect(QObject *object, QVariantList& args, QByteArray* retval) { const QMetaObject * meta = object->metaObject(); QVariantMap data; QVariantList properties; for (int i = 0; i < meta->propertyCount(); ++i) { QVariantMap propData; QMetaProperty prop = meta->property(i); propData["name"] = prop.name(); propData["type"] = prop.typeName(); if (!prop.isReadable()) { if (!prop.isWritable()) continue; propData["writeOnly"] = true; } if (!prop.isWritable()) propData["readOnly"] = true; if (prop.hasNotifySignal()) propData["notifySignal"] = getMethodName(prop.notifySignal()); if (prop.isEnumType()) propData["enumeration"] = true; properties.append(QVariant::fromValue(propData)); } data["properties"] = properties; QVariantList methods; QVariantList sigs; for (int i = 0; i < meta->methodCount(); ++i) { QVariantMap methodData; QMetaMethod method = meta->method(i); QByteArray name = getMethodName(method); if (method.access() == QMetaMethod::Private || name.startsWith("_") || name == "deleteLater" || name == "destroyed" || name == "creationCompleted") continue; else if (method.access() == QMetaMethod::Protected && method.methodType() != QMetaMethod::Signal) continue; methodData["name"] = name; QByteArray rType(method.typeName()); if (!rType.isEmpty()) methodData["type"] = rType; QList<QByteArray> pTypes = method.parameterTypes(); QList<QByteArray> pNames = method.parameterNames(); QVariantList params; for (int i = 0; i < pTypes.count(); ++i) { QVariantMap tp; tp["type"] = pTypes.at(i); tp["name"] = pNames.value(i); params.append(tp); } if (params.size() > 0) methodData["parameters"] = params; switch (method.methodType()) { case QMetaMethod::Method: //qDebug() << "=== METHOD ===" << methodData << method.signature(); methods.append(QVariant::fromValue(methodData)); break; case QMetaMethod::Signal: sigs.append(QVariant::fromValue(methodData)); break; case QMetaMethod::Constructor: methodData["constructor"] = true; methods.append(QVariant::fromValue(methodData)); break; case QMetaMethod::Slot: methods.append(QVariant::fromValue(methodData)); break; } } if (methods.size() > 0) data["methods"] = methods; if (sigs.size() > 0) data["signals"] = sigs; data["id"] = args.takeFirst(); bridge->json()->saveToBuffer(QVariant::fromValue(data), retval); #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\t[INTROSPECT]" << retval; #endif }