forked from RobertKrajewski/Sync-my-L2P
-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.cpp
219 lines (178 loc) · 8.32 KB
/
parser.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#include "parser.h"
#include <QDebug>
extern QString MainURL;
Parser::Parser(QObject *parent) :
QObject(parent)
{
}
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 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().toLatin1()));
// Name
else if (currentXmlTag == "displayname")
name = QString::fromUtf8(Reader.text().toString().toLatin1());
// 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);
}