Exemplo n.º 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;
}
Exemplo n.º 2
0
void Parser::parseFiles(QNetworkReply *reply, QMap<QNetworkReply*, Structureelement*> *replies, QString downloadDirectoryPath)
{
    // Holen die aktuelle Veranstaltung aus der Map
    Structureelement* aktuellerOrdner = replies->value(reply);

    // Auslesen der Antwort und Speichern in dem XmlReader
    QString replyText = reply->readAll();
    QXmlStreamReader Reader;
    Reader.addData(replyText);


    // Vorbereitung der Daten für die Elemente
    QString currentXmlTag;
    QUrl    url;
    QString name;
    QString time;
    qint32  size = 0;

    // Prüfen auf das Ende
    while(!Reader.atEnd())
    {
        // Lese nächstes Element
        Reader.readNext();

        // 1. Fall: Öffnendes Element <Element>
        if(Reader.isStartElement())
        {
            // Speichern des Namens
            currentXmlTag = Reader.name().toString();
        }

        // 2. Fall: Schließendes Element mit Namen Response </Response>
        else if (Reader.isEndElement() && Reader.name() == "response")
        {
            // Hinzufügen des Slashs bei der Url von Ordnern
            if(!size)
                url.setUrl(url.toString() % "/");

            // Wechsel in den übergeordneten Ordner des aktuellen Elements
            QString bla = url.toString();
            while(!url.toString().contains((aktuellerOrdner->data(urlRole).toUrl().toString()), Qt::CaseSensitive))//(in = RegExp.indexIn(url.toString())) == -1)
            {
                aktuellerOrdner->sortChildren(0, Qt::AscendingOrder);
                aktuellerOrdner = (Structureelement*)aktuellerOrdner->parent();
                if (aktuellerOrdner == 0)
                    qDebug() << replyText;
            }

            // Ignorieren aller Adressen, die "/Forms" enthalten
            if (!url.toString().contains("/Forms", Qt::CaseSensitive))
            {
                // Prüfe auf Elementart
                // 1. Fall: Datei (size > 0)
                if (size)
                {
                    // Erstellen einer neuen Datei
                    Structureelement* newFile = new Structureelement(name, url, time, size);

                    // Hinzufügen des endungsabhängigen Icons
                    // PDF
                    if (name.contains(QRegExp(".pdf$", Qt::CaseInsensitive)))
                        newFile->setData(QIcon(":/Icons/Icons/filetype_pdf.png"), Qt::DecorationRole);

                    // ZIP
                    else if (name.contains(QRegExp(".zip$", Qt::CaseInsensitive)))
                        newFile->setData(QIcon(":/Icons/Icons/filetype_zip.png"), Qt::DecorationRole);

                    // RAR
                    else if (name.contains(QRegExp(".rar$", Qt::CaseInsensitive)))
                        newFile->setData(QIcon(":/Icons/Icons/filetype_rar.png"), Qt::DecorationRole);

                    // Sonstige
                    else
                        newFile->setData(QIcon(":/Icons/Icons/file.png"), Qt::DecorationRole);


                    QString path;
                    path.append(Utils::getStrukturelementPfad(aktuellerOrdner, downloadDirectoryPath) %"/");
                    path.append(name);
                    path.remove(0,8);

                    if(QFile::exists(path))
                    {
                        newFile->setData(SYNCHRONISED, synchronisedRole);
                    }
                    else
                    {
                        newFile->setData(NOT_SYNCHRONISED, synchronisedRole);
                    }

                    QList<QStandardItem*> row;
                    row.append(newFile);
                    row.append(new QStandardItem(QString::number(size/1024.0/1024.0, 'f', 2) % " MB"));
                    row.append(new QStandardItem(QDateTime::fromString(time, Qt::ISODate).toString("yyyy-MM-dd hh:mm")));

                    // Hinzufügen zum aktuellen Ordner
                    aktuellerOrdner->appendRow(row);
                }
                // 2. Fall: Ordner/Veranstaltung
                // Ausschließen der Ordnernamen "documents" und "structured"
                else if (name != "documents" && name != "structured" && !url.toString().contains("exerciseCourse"))
                {
                    // Erstellen eines neuen Ordners
                    Structureelement* newDirectory = new Structureelement(name, url, directoryItem);

                    // Setzen des Zeichens
                    newDirectory->setData(QIcon(":/Icons/Icons/25_folder.png"), Qt::DecorationRole);

                    // Hinzufügen zum aktuellen Ordner
                    aktuellerOrdner->appendRow(newDirectory);

                    // NeuerOrdner wird zum aktuellen Ordner
                    aktuellerOrdner = newDirectory;
                }
            }

            // Löschen aller eingelesener Daten
            url.clear();
            name.clear();
            size = 0;
            time.clear();
        }

        // Einlesen der Elementeigenschaften
        else if (Reader.isCharacters() && !Reader.isWhitespace())
        {
            // URL
            if(currentXmlTag == "href" && url.isEmpty())
                url.setUrl(QString::fromUtf8(Reader.text().toString().toUtf8()));

            // Name
            else if (currentXmlTag == "displayname")
                name = QString::fromUtf8(Reader.text().toString().toUtf8());

            // Größe
            else if (currentXmlTag == "getcontentlength")
                size = Reader.text().toString().toInt();

            // Modifizierungsdatum
            else if (currentXmlTag == "getlastmodified")
                time = QString::fromUtf8(Reader.text().toString().toLatin1());
        }
    }

    // Leere Ordner wieder rausschmeißen.
    Structureelement* rootCourse = replies->value(reply);
    for (int i = 0; i < rootCourse->rowCount(); i++)
    {
        Structureelement *item = (Structureelement *)rootCourse->child(i);
        if (item->type() == directoryItem && item->rowCount() == 0)
        {
            rootCourse->removeRow(i);
        }
    }
    // Sortieren aller Dateien
    replies->value(reply)->sortChildren(0, Qt::AscendingOrder);
}
Exemplo n.º 3
0
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();
    }