bool GlobalConfig::parse(QIODevice *ioDev) { bool inSite = false; bool inPackage = false; Site *site = 0; Package *pkg = 0; Mirror *mirror; int lineNr = 0; while (!ioDev->atEnd()) { QByteArray line = ioDev->readLine().replace('\x0a', ""); // support unix format file lineNr++; if (line.startsWith(';')) continue; else if (line.size() < 2) { if (inPackage) { if (Settings::hasDebug("GlobalConfig")) qDebug() << __FUNCTION__ << *pkg; inPackage=false; } else if (inSite) { if (Settings::hasDebug("GlobalConfig")) qDebug() << __FUNCTION__ << *site; inSite=false; } continue; } else { QStringList cmd = QString::fromUtf8(line).split(' '); const QList<QByteArray> cmdBA = line.split(' '); QString keyword; if (cmd[0].startsWith('@')) keyword = cmd[0].mid(1).toLatin1(); else continue; QString col2; if (cmd.size() == 3) col2 = cmd[2]; if (keyword == "format") ; else if (keyword == "minversion") m_minimalInstallerVersion = cmdBA[1]; else if (keyword == "newversion") { // deprecated } else if (keyword == "timestamp") { const QStringList patterns = QStringList() << "yyyyMMddHHmm" << "yyyyMMddHHmmss"; Q_FOREACH(const QString &pattern, patterns) { if (cmd[1].size() == pattern.size()) { m_timestamp = QDateTime::fromString(cmd[1],pattern); break; } } qDebug() << m_timestamp; } else if (keyword == "mirror") { mirror = new Mirror; mirror->url = cmd[1]; mirror->location = cmd[2]; m_mirrors.append(mirror); } else if (keyword == "news") { QString date = cmd[1]; QString package = cmd[2]; cmd.removeFirst(); cmd.removeFirst(); cmd.removeFirst(); m_news[date+"-"+package] = cmd.join(" "); } else if (keyword == "categorynotes") { QString category = cmd[1]; cmd.removeFirst(); cmd.removeFirst(); m_categoryNotes[category] = cmd.join(" "); } else if (keyword == "categorypackages") { QString category = cmd[1]; cmd.removeFirst(); cmd.removeFirst(); m_categoryPackages[category] << cmd; } else if (keyword == "metapackage") { QString metapackage = cmd[1]; cmd.removeFirst(); cmd.removeFirst(); m_metaPackages[metapackage] << cmd; } else if (keyword == "endusercategories") { cmd.removeFirst(); m_endUserCategories << cmd; } else if (!inSite && keyword == "hashtype") { if (!m_hashType.setType(cmd[1])) qCritical() << "line" << lineNr << "illegal hash type defined" << cmd[1]; } else if(inPackage) { if(keyword == "version") pkg->setVersion(cmd[1]); else if(keyword.startsWith("url-")) { FileTypes::Type type; if(keyword == "url-bin") type = FileTypes::BIN; else if(keyword == "url-lib") type = FileTypes::LIB; else if(keyword == "url-doc") type = FileTypes::DOC; else if(keyword == "url-src") type = FileTypes::SRC; else if(keyword == "url-dbg") type = FileTypes::DBG; else continue; QUrl url(cmd[1]); QString fn = col2; if (url.scheme().isEmpty()) url = QUrl(m_baseURL + cmd[1]); if (!pkg->hasType(type)) { Package::PackageItem item(type); if (item.setUrlAndFileName(url,fn)) pkg->add(item); } else pkg->item(type).setUrlAndFileName(url,fn); } else if(keyword.startsWith("filename-")) { FileTypes::Type type; if(keyword == "filename-bin") type = FileTypes::BIN; else if(keyword == "filename-lib") type = FileTypes::LIB; else if(keyword == "filename-doc") type = FileTypes::DOC; else if(keyword == "filename-src") type = FileTypes::SRC; else if(keyword == "filename-dbg") type = FileTypes::DBG; else continue; if (!pkg->hasType(type)) { Package::PackageItem item(type); item.setFileName(cmd[1]); pkg->add(item); } else pkg->item(type).setFileName(cmd[1]); } else if(keyword.startsWith("nomd5")) { pkg->hashType().setType(Hash::None); } else if(keyword.startsWith("hashtype")) { if (!pkg->hashType().setType(cmd[1])) qCritical() << "line" << lineNr << "illegal hash type defined" << cmd[1]; } else if(keyword.startsWith("hash-")) { // detect case when no type is set if (pkg->hashType().type() == Hash::None) { qCritical() << "line" << lineNr << "there is no hash type specified before"; continue; } FileTypes::Type type; if(keyword == "hash-bin") type = FileTypes::BIN; else if(keyword == "hash-lib") type = FileTypes::LIB; else if(keyword == "hash-doc") type = FileTypes::DOC; else if(keyword == "hash-src") type = FileTypes::SRC; else if(keyword == "hash-dbg") type = FileTypes::DBG; else continue; if (!pkg->hasType(type)) { Package::PackageItem item(type); item.setCheckSum(cmd[1]); pkg->add(item); } else pkg->item(type).setCheckSum(cmd[1]); } else if(keyword.startsWith("md5-")) { pkg->hashType().setType(Hash::MD5); FileTypes::Type type; if(keyword == "md5-bin") type = FileTypes::BIN; else if(keyword == "md5-lib") type = FileTypes::LIB; else if(keyword == "md5-doc") type = FileTypes::DOC; else if(keyword == "md5-src") type = FileTypes::SRC; else if(keyword == "md5-dbg") type = FileTypes::DBG; else continue; if (!pkg->hasType(type)) { Package::PackageItem item(type); item.setCheckSum(cmd[1]); pkg->add(item); } else pkg->item(type).setCheckSum(cmd[1]); } else if(keyword == "require") { cmd.removeFirst(); pkg->addDeps(cmd); } else if(keyword == "notes") { cmd.removeFirst(); pkg->setNotes(cmd.join(" ")); } else if(keyword == "details") { cmd.removeFirst(); QString notes = cmd.join(" ").replace("\\n","\n"); pkg->setLongNotes(notes); } else if(keyword == "homeurl") { cmd.removeFirst(); pkg->setHomeURL(cmd.join(" ")); } else if(keyword == "category") { cmd.removeFirst(); pkg->addCategories(cmd); } else if(keyword == "relocate") pkg->addPathRelocation(cmd[1],col2); else if(keyword == "control") { cmd.removeFirst(); InstallerControlType control; if (control.parse(cmd.join(" "))) { InstallerControlTypeList *l; if (pkg->userData(0)) l = (InstallerControlTypeList *)pkg->userData(0); else { l = new InstallerControlTypeList; pkg->setUserData(0,(void*)l); } l->append(control); } else qCritical() << "line" << lineNr << "invalid InstallerControlType definition" << cmd; } } else if (inSite) { if(keyword == "siteurl" || keyword == "url") { QUrl url(cmd[1]); if (url.scheme().isEmpty()) { QString u = m_baseURL; if( cmd[1] != QLatin1String(".") ) u += cmd[1]; url = QUrl(u); } site->setURL(url); } else if(keyword == "url-list") { QUrl url(cmd[1]); if (url.scheme().isEmpty()) { QString u = m_baseURL; if( cmd[1] != QLatin1String(".") ) u += cmd[1]; url = QUrl(u); } site->setListURL(url); } else if(keyword == "sitetype" || keyword == "type") { if (!site->setType(cmd[1])) qCritical() << "unknown site type" << cmd[1]; } else if(keyword == "mirrorurl") { QUrl url(cmd.join(" ")); site->addMirror(url); } else if(keyword == "deps" || keyword == "require") { QString pkg = cmd[1]; cmd.removeFirst(); cmd.removeFirst(); site->addDependencies(pkg, cmd); } else if(keyword == "exclude") { cmd.removeFirst(); site->addExcludes(cmd); } else if(keyword == "copy") { cmd.removeFirst(); site->addCopy(cmd.join(" ")); } else if(keyword == "notes") { cmd.removeFirst(); site->setNotes(cmd.join(" ")); } else if(keyword == "pkghomeurl") { QString pkg = cmd[1]; QString url = cmd[2]; if (pkg.contains("-*")) { pkg.replace("-*","-%1"); foreach(const QString type, supportedCompilers.values()) site->setPackageHomeUrl(pkg.arg(type),url); pkg.replace("-%1",""); site->setPackageHomeUrl(pkg,url); } } else if(keyword == "pkgnotes")