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(); }