Exemplo n.º 1
0
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")