25 #include <QtWidgets/QApplication> 27 #include <QQmlContext> 33 #include <QPluginLoader> 34 #include <QQmlExtensionPlugin> 35 #include <QJsonObject> 38 #include <QJsonDocument> 40 #include <QProcessEnvironment> 45 bool validateXMLDoc(
const QString& schemaUrl,
const QString& docUrl);
52 void dumpJsonValue(
const QString& key, QJsonValue& jsonValue);
55 QString
getEnv(
const char* name);
56 void addPath(
const QString& prefix,
const QString& path, QStringList& pathList);
57 void addImportPath(
const QString& prefix,
const QString& path, QQmlEngine* engine);
65 int main(
int argc,
char *argv[])
67 qDebug(
"starting...");
83 QApplication* app =
new QApplication(argc, argv);
85 qDebug(
"library paths: ");
98 QQmlEngine* engine = viewer.engine();
102 QString zAppDirPath ;
104 QString installPrefix(
getEnv(
"SNAP"));
105 if(installPrefix.isEmpty())
107 installPrefix = QCoreApplication::applicationDirPath();
108 installPrefix +=
"/../";
109 installPrefix = QDir::cleanPath(installPrefix);
110 zAppDirPath = installPrefix +
"/apps";
116 installPrefix +=
"/opt/zbl";
117 zAppDirPath = installPrefix +
"/apps";
119 qDebug(
"Install prefix: %s", installPrefix.toUtf8().constData());
120 qDebug(
"Zuble app directory: %s", zAppDirPath.toUtf8().constData());
122 QStringList libPaths;
125 libPaths = QCoreApplication::libraryPaths();
128 addPath(installPrefix,
"/lib", libPaths);
131 QCoreApplication::setLibraryPaths(libPaths);
132 engine->setPluginPathList(libPaths);
134 engine->addImportPath(
"qrc:/");
138 qDebug(
"Dumping library paths...");
139 libPaths = QCoreApplication::libraryPaths();
142 qDebug(
"Dumping plugin paths...");
143 libPaths = engine->pluginPathList();
150 QString zblmainPath(
"qrc:/org/zuble/qml/frames/zblmain.qml");
151 QString title(
"I Am Zuble");
152 bool zblHostedApp =
true;
158 QString zAppMainQmlFilePath;
164 sourceUrl.setUrl(zblmainPath);
165 zAppDirPath +=
"/zbl/";
170 const char* arg1 = argv[1];
176 sourceUrl.setUrl(zblmainPath);
177 zAppDirPath +=
"/zbl/";
188 QFileInfo appDirInfo(zAppDirPath);
190 if(!appDirInfo.exists())
194 qCritical(
"ERROR: Zuble application directory doesn't exist: %s",
195 zAppDirPath.toUtf8().constData());
199 qFatal(
"Zuble aborting...!");
202 else if(!appDirInfo.isDir())
206 qCritical(
"ERROR: Specified Zuble application is not a directory type file: %s",
207 zAppDirPath.toUtf8().constData());
211 qFatal(
"Zuble aborting...!");
216 zAppMainQmlFilePath = zAppDirPath;
217 zAppMainQmlFilePath +=
"main.qml";
219 if(QFile::exists(zAppMainQmlFilePath))
223 sourceUrl.setUrl(zAppMainQmlFilePath);
224 zblHostedApp =
false;
230 sourceUrl.setUrl(zblmainPath);
237 engine->addImportPath(zAppDirPath);
245 QString zAppConfigFilePath(zAppDirPath);
246 zAppConfigFilePath +=
"zblconfig.xml";
249 "qrc:///schema/zblconfig.xsd",
253 qDebug(
"Invalid zblconfig.xml file!");
259 QCoreApplication::setOrganizationName(
"zuble");
260 QCoreApplication::setOrganizationDomain(
"zuble.org");
261 QCoreApplication::setApplicationName(zAppName);
265 qApp->setProperty(
"org_zuble_appName",
268 qApp->setProperty(
"org_zuble_appRootPath",
269 QVariant(zAppDirPath));
271 if(zAppMainQmlFilePath.isEmpty())
272 qApp->setProperty(
"org_zuble_appMainQmlPath",
273 QVariant(zblmainPath));
275 qApp->setProperty(
"org_zuble_appMainQmlPath",
276 QVariant(zAppMainQmlFilePath));
281 qApp->setProperty(
"org_zuble_host_name",
284 qApp->setProperty(
"org_zuble_host_versionMajor",
287 qApp->setProperty(
"org_zuble_host_versionMinor",
290 qApp->setProperty(
"org_zuble_host_versionPatch",
293 qApp->setProperty(
"org_zuble_host_versionBuild",
296 QVariant appRootPath(qApp->property(
"org_zuble_appRootPath"));
298 qDebug(
"Root path property on QApplication = %s",
299 appRootPath.toString().toUtf8().constData());
301 qDebug(
"Dumping import paths...");
303 QStringList importPathList = engine->importPathList();
309 QString zAppConfigFilePath(zAppDirPath);
310 zAppConfigFilePath +=
"zblconfig.xml";
316 qDebug(
"Dumping resource space...");
320 qDebug(
"End dumping resource space...");
323 viewer.setTitle(title);
324 viewer.setSource(sourceUrl);
327 retvalue = qApp->exec();
333 qDebug(
"Zuble QML exception caught...!");
357 qDebug(
"Loading Zuble core plugin resources...");
361 static const QString corePluginName =
"libzblcore";
363 QPluginLoader loader;
365 loader.setFileName(corePluginName);
369 qWarning() <<
"Zuble failed to load core plugin: " << loader.errorString();
379 qWarning() <<
"Zuble core ERROR, core plugin doesn't implement ZResourceEdifyIF";
388 qWarning() <<
"Zuble FAILED to locate and register core binary " 394 qDebug(
"Loading application resources...");
401 qWarning() <<
"Zuble FAILED to locate and register application's " 402 "binary resource files.";
407 qDebug(
"Done loading application resources.");
409 qDebug(
"Mapping application settings bundles.");
415 qWarning() <<
"Zuble FAILED to map applicaiton settings bundles.";
418 qDebug(
"Done mapping application settings bundles.");
427 QJsonDocument doc(jsonObject);
429 QByteArray ba = doc.toJson();
431 qDebug(
"%s", ba.constData());
440 QJsonArray emptyArray;
442 switch(jsonValue.type())
445 case QJsonValue::Null:
446 stringValue =
"null";
448 case QJsonValue::Bool:
449 if(jsonValue.toBool())
450 stringValue =
"true";
452 stringValue =
"false";
454 case QJsonValue::Double:
455 stringValue = QString::number(jsonValue.toDouble());
457 case QJsonValue::String:
458 stringValue = jsonValue.toString();
460 case QJsonValue::Array:
463 case QJsonValue::Object:
466 case QJsonValue::Undefined:
467 stringValue =
"undefined";
471 qDebug(
"METADATA %s=%s",
472 key.toUtf8().constData(),
473 stringValue.toUtf8().constData());
483 QJsonArray::const_iterator it(jsonArray.constBegin());
485 while(it != jsonArray.constEnd())
487 QJsonValue jVal = *it;
499 qCritical(
"ERROR: Zuble application should be a subdirectory named \"%s\" " 500 "within the zuble apps directory, containing " 501 "either a main.qml or zblconfig.xml file.", appName);
506 QUrl schemaURL(schemaUrl);
510 bool status = schema.load(schemaURL);
518 const int len = list.length();
520 for(
int i=0; i < len; i++)
522 qDebug(
"path: %s", list.at(i).toUtf8().constData() );
531 QStringList list = dir.entryList(QStringList());
533 int count = list.count();
535 for(
int i=0; i<count; i++)
537 qDebug(
"resource: %s", list.at(i).toUtf8().data());
545 value = getenv(name);
548 qDebug(
"env %s=%s", name, value);
550 qDebug(
"env %s=", name);
558 value = getenv(name);
561 return QString(value);
566 void addPath(
const QString& prefix,
const QString& path, QStringList& pathList)
568 QString tempPath(
"%1%2");
569 tempPath = tempPath.arg(prefix).arg(path);
571 qDebug(
"Adding path: %s", tempPath.toUtf8().constData());
573 pathList.append(tempPath);
576 void addImportPath(
const QString& prefix,
const QString& path, QQmlEngine* engine)
578 QString tempPath(
"%1%2");
579 tempPath = tempPath.arg(prefix).arg(path);
581 qDebug(
"Adding import path: %s", tempPath.toUtf8().constData());
583 engine->addImportPath(tempPath);
QString getEnv(const char *name)
void dumpJsonValue(const QString &key, QJsonValue &jsonValue)
bool validateXMLDoc(const QString &schemaUrl, const QString &docUrl)
void addImportPath(const QString &prefix, const QString &path, QQmlEngine *engine)
void dumpResourceSpace(QString path)
void dumpEnv(const char *name)
static QString versionBuild
virtual bool mapPluginResources(const char *fileName, bool qmlRegister)=0
void addPath(const QString &prefix, const QString &path, QStringList &pathList)
void dumpJsonArray(QJsonArray jsonArray)
void dumpJsonObject(QJsonObject jsonObject)
void showAppStructureMessage(const char *appName)
bool loadZubleConfiguration(const QString &configFilePath)
void dumpPathList(const QStringList &list)
virtual bool mapConfigResources(const char *configFilePath)=0
int main(int argc, char *argv[])
virtual bool mapConfigSettings(const char *fileName)=0
This interface allows Qt applications to access Zuble's platform-independent binary resource manageme...