Exemple #1
0
void Parser::parseCourses(QNetworkReply *reply, QStandardItemModel *itemModel)
{
    // Auslesen der kompletten Antwort
    QString replyText = reply->readAll();

    // Erstellen eines RegExps für das Herausfiltern der Veranstaltungen
    QString regPattern = "<td class=\"ms-vb2\"><a href=\"(/(ws|ss)(\\d{2})/\\d{2}(?:ws|ss)-\\d{5})(?:/information/default.aspx)*\">(.*)</a></td><td";
    QRegExp* regExp = new QRegExp(regPattern, Qt::CaseSensitive);
    regExp->setMinimal(true);

    // Erstellen eines RegExps  für unzulässige Buchstaben im Veranstaltungsnamen
    QString escapePattern = "(:|<|>|/|\\\\|\\||\\*|\\^|\\?|\\\")";
    QRegExp* escapeRegExp = new QRegExp(escapePattern, Qt::CaseSensitive);

    // Speichern der Suchpositionen in der Antwort
    int altePosition = 0;
    int neuePosition = 0;

    // neue Veranstaltung sowie Daten
    Structureelement* neueVeranstaltung;
    QString urlRaum;
    QString veranstaltungName;

    // Durchsuchen der gesamten Antwort nach Veranstaltungen
    while((neuePosition=regExp->indexIn(replyText, altePosition)) != -1)
    {
        // Anpassen der Encodierung wegen der Umlaute
        urlRaum = QString::fromUtf8(regExp->cap(1).toLatin1());
        veranstaltungName = QString::fromUtf8(regExp->cap(4).toLatin1());
        veranstaltungName = veranstaltungName.replace(*escapeRegExp, "").trimmed();
        // if semester suffix. funktioniert nur 2000-2099 AD
        veranstaltungName += " - " + regExp->cap(2).toLatin1().toUpper() + "20" + regExp->cap(3);

        // Erstellen der neuen Veranstaltung
        neueVeranstaltung = new Structureelement(veranstaltungName, QUrl(MainURL % urlRaum), courseItem);// % "/materials/documents/"));
        //neueVeranstaltung = new Strukturelement(veranstaltungName, QUrl(StammURL % urlRaum % "/materials/structured/"));
        neueVeranstaltung->setIcon(QIcon(":/Icons/directory"));

        // Hinzufügen der Veranstaltung zur Liste
        itemModel->appendRow(neueVeranstaltung);

        // Weitersetzen der Suchposition hinter den letzten Fund
        altePosition = neuePosition + regExp->matchedLength();
    }



    // Löschen der RegExps aus dem Speicher
    delete regExp;
    delete escapeRegExp;
}
void MyMainWindow::veranstaltungenAbgerufen(QNetworkReply* reply)
{
    // Prüfen auf Fehler beim Abruf
    if(!reply->error()){
        // Auslesen der kompletten Antwort
        QString replyText = reply->readAll();

        // Erstellen eines RegExps für das Herausfiltern der Veranstaltungen
        QString regPattern = "<td class=\"ms-vb2\"><a href=\"(/(?:ws|ss)\\d{2}/\\d{2}(?:ws|ss)-\\d{5})(?:/information/default.aspx)*\">(.*)</a></td><td";
        QRegExp* regExp = new QRegExp(regPattern, Qt::CaseSensitive);
        regExp->setMinimal(true);

        // Erstellen eines RegExps  für unzulässige Buchstaben im Veranstaltungsnamen
        QString escapePattern = "(:|<|>|/|\\\\|\\||\\*|\\^|\\?|\\\")";
        QRegExp* escapeRegExp = new QRegExp(escapePattern, Qt::CaseSensitive);

        // Speichern der Suchpositionen in der Antwort
        int altePosition = 0;
        int neuePosition = 0;

        // neue Veranstaltung sowie Daten
        Structureelement* neueVeranstaltung;
        QString urlRaum;
        QString veranstaltungName;

        // Durchsuchen der gesamten Antwort nach Veranstaltungen
        while((neuePosition=regExp->indexIn(replyText, altePosition)) != -1){            
            urlRaum = regExp->cap(1);
            veranstaltungName = regExp->cap(2);
            veranstaltungName = veranstaltungName.replace(*escapeRegExp, "").trimmed();


            // Erstellen der neuen Veranstaltung
            neueVeranstaltung = new Structureelement(veranstaltungName, QUrl(MainURL % urlRaum), courseItem);// % "/materials/documents/"));
            //neueVeranstaltung = new Strukturelement(veranstaltungName, QUrl(StammURL % urlRaum % "/materials/structured/"));
            neueVeranstaltung->setIcon(QIcon(":/Icons/directory"));

            // Hinzufügen der Veranstaltung zur Liste
            itemModel.appendRow(neueVeranstaltung);

            // Weitersetzen der Suchposition hinter den letzten Fund
            altePosition = neuePosition + regExp->matchedLength();
        }



        // Löschen der RegExps aus dem Speicher
        delete regExp;
        delete escapeRegExp;
    }
    else{
        // Falls ein Fehler aufgetreten sein sollte, Ausgabe dessen
        QMessageBox messageBox;
        messageBox.setText("Beim Abruf der Veranstaltungen ist ein Fehler aufgetreten");
        messageBox.setInformativeText(reply->errorString());
        messageBox.setStandardButtons(QMessageBox::Ok);
        messageBox.exec();
        autoSynchronize = false;
    }

    // Löschen der Antwort aus der Queue
    replies.remove(reply);

    // Löschen der Antwort aus dem Speicher
    reply->deleteLater();

    // Prüfen, ob noch Antworten ausstehen und ggf. Reaktiveren der Benutzeroberfläche
    if (replies.isEmpty())
    {
        // Veranstaltungen alphabetisch sortieren
        itemModel.sort(0);

        QObject::disconnect(manager, SIGNAL(finished(QNetworkReply*)),
                            this, SLOT(veranstaltungenAbgerufen(QNetworkReply*)));

        // Aufruf der Funktion zur Aktualisierung der Dateien
        dateienAktualisieren();
    }