History

add Script.include()

ZappoMan committed 12 years ago

Commit a613da81 parent db055233 files · +75 −4Browse files

Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 3 files). Show all

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+54−1
@@ -113,11 +113,12 @@ void ScriptEngine::cleanupMenuItems() { · 112 unmodified lines
113113 }
114114 }
115115
116−bool ScriptEngine::setScriptContents(const QString& scriptContents) {
116+bool ScriptEngine::setScriptContents(const QString& scriptContents, const QString& fileNameString) {
117117 if (_isRunning) {
118118 return false;
119119 }
120120 _scriptContents = scriptContents;
121+ _fileNameString = fileNameString;
121122 return true;
122123 }
123124
@@ -436,3 +437,55 @@ void ScriptEngine::stopTimer(QTimer *timer) { · 312 unmodified lines
436437 delete timer;
437438 }
438439 }
440+
441+QUrl ScriptEngine::resolveInclude(const QString& include) const {
442+ // first lets check to see if it's already a full URL
443+ QUrl url(include);
444+ if (!url.scheme().isEmpty()) {
445+ return url;
446+ }
447+
448+ // we apparently weren't a fully qualified url, so, let's assume we're relative
449+ // to the original URL of our script
450+ QUrl parentURL(_fileNameString);
451+
452+ // if the parent URL's scheme is empty, then this is probably a local file...
453+ if (parentURL.scheme().isEmpty()) {
454+ parentURL = QUrl::fromLocalFile(_fileNameString);
455+ }
456+
457+ // at this point we should have a legitimate fully qualified URL for our parent
458+ url = parentURL.resolved(url);
459+ return url;
460+}
461+
462+void ScriptEngine::include(const QString& includeFile) {
463+ QUrl url = resolveInclude(includeFile);
464+ QString includeContents;
465+
466+ if (url.scheme() == "file") {
467+ QString fileName = url.toLocalFile();
468+ QFile scriptFile(fileName);
469+ if (scriptFile.open(QFile::ReadOnly | QFile::Text)) {
470+ qDebug() << "Loading file:" << fileName;
471+ QTextStream in(&scriptFile);
472+ includeContents = in.readAll();
473+ } else {
474+ qDebug() << "ERROR Loading file:" << fileName;
475+ }
476+ } else {
477+ QNetworkAccessManager* networkManager = new QNetworkAccessManager(this);
478+ QNetworkReply* reply = networkManager->get(QNetworkRequest(url));
479+ qDebug() << "Downloading included script at" << includeFile;
480+ QEventLoop loop;
481+ QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
482+ loop.exec();
483+ includeContents = reply->readAll();
484+ }
485+
486+ QScriptValue result = _engine.evaluate(includeContents);
487+ if (_engine.hasUncaughtException()) {
488+ int line = _engine.uncaughtExceptionLineNumber();
489+ qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString();
490+ }
491+}