Groom  1.1
BTS SNIR LaSalle Avignon 2021
Calendrier.cpp
Aller à la documentation de ce fichier.
1 #include "Calendrier.h"
2 #include <QDebug>
3 
13 Calendrier::Calendrier(QObject *parent) : QObject(parent), hostURL(""), nom(""), contenuCalendrier(nullptr), networkReply(nullptr), requeteTimeoutMS(2000)
14 {
15  qDebug() << __FUNCTION__;
16  synchronisationTimer.setSingleShot(true);
17  synchronisationTimer.setInterval(1000);
18  requeteTimeoutTimer.setSingleShot(true);
19 
20  connect(&synchronisationTimer, SIGNAL(timeout()), this, SLOT(recharger()));
21 }
22 
24 {
25  synchronisationTimer.stop();
26  qDebug() << __FUNCTION__;
27 }
28 
29 bool Calendrier::setHostURL(const QString hostURL)
30 {
31  QUrl url(hostURL);
32  return setHostURL(url);
33 }
34 
35 bool Calendrier::setHostURL(const QUrl hostURL)
36 {
37  bool ret = false;
38 
39  if (hostURL.isValid() != false)
40  {
41  this->hostURL = hostURL;
42  ret = true;
43  }
44 
45  return ret;
46 }
47 
48 QString Calendrier::getHostURL(void) const
49 {
50  return this->hostURL.toString();
51 }
52 
53 QString Calendrier::getNom(void) const
54 {
55  return this->nom;
56 }
57 
58 void Calendrier::setNom(QString nom)
59 {
60  this->nom = nom;
61 }
62 
64 {
65  return this->requeteTimeoutMS;
66 }
67 
68 void Calendrier::setRequeteTimeoutMS(const int requeteTimeoutMS)
69 {
70  if (requeteTimeoutMS > 0)
71  {
72  this->requeteTimeoutMS = requeteTimeoutMS;
73  }
74 }
75 
76 QList<Evenement> Calendrier::getEvenements(QDate date) const
77 {
78  qDebug() << __FUNCTION__ << date;
79  QList<Evenement> listeEvenements;
80  bool ok;
81  foreach(Evenement evt, evenements)
82  {
83  QString dtstart = evt.getAttribut("dtstart");
84  QDateTime dtStart = Evenement::convertirHorodatage(dtstart, ok);
85  QString dtend = evt.getAttribut("dtend");
86  QDateTime dtEnd = Evenement::convertirHorodatage(dtend, ok);
87  if (dtStart.isValid() && dtEnd.isValid())
88  {
89  if(date >= dtStart.date() && date <= dtEnd.date())
90  {
91  listeEvenements.append(evt);
92  }
93  }
94  }
95  qDebug() << __FUNCTION__ << date << "nb evenements : " << listeEvenements.size();
96 
97  return listeEvenements;
98 }
99 
101 {
102  qDebug() << __FUNCTION__ << nom << hostURL << "local ?" << hostURL.isLocalFile();
103  emit effacement();
104  if(hostURL.isLocalFile())
105  {
106  QString filename = hostURL.toString().remove("file:///");
107  qDebug() << __FUNCTION__ << nom << hostURL << "relative ?" << QUrl(filename).isRelative();
108  if (QUrl(filename).isRelative())
109  {
110  filename = filename.prepend("/");
111  }
112  filename = QUrl(filename).toString(QUrl::NormalizePathSegments);
113  qDebug() << __FUNCTION__ << nom << filename;
114 
115  QFile file(filename);
116 
117  if (file.exists())
118  {
119  if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
120  {
121  qDebug() << __FUNCTION__ << nom << filename << file.errorString();
122  emit erreur("Erreur : impossible de lire le fichier !");
123  return;
124  }
125  }
126  else
127  {
128  qDebug() << __FUNCTION__ << nom << filename << "Erreur : fichier introuvable !";
129  emit erreur("Erreur : fichier introuvable !");
130  return;
131  }
132 
134  {
135  delete contenuCalendrier;
136  }
137  contenuCalendrier = new QTextStream(&file);
138 
139  evenements.clear();
140  bool trouve = false;
141 
142  do
143  {
144  QString line = contenuCalendrier->readLine();
145  //qDebug() << __FUNCTION__ << nom << line;
146  if(!line.isNull())
147  {
148  if (line.startsWith("X-WR-CALNAME"))
149  {
150  qDebug() << __FUNCTION__ << nom << line;
151  QString nomCalendrier = line.trimmed();
152  nomCalendrier.remove(";LANGUAGE=fr", Qt::CaseInsensitive);
153  nomCalendrier.remove("X-WR-CALNAME:", Qt::CaseInsensitive);
154  qDebug() << __FUNCTION__ << nom << nomCalendrier;
155  this->setNom(nomCalendrier);
156  emit message("Calendrier : " + nomCalendrier);
157  trouve = true;
158  }
159  }
160  }
161  while (!contenuCalendrier->atEnd() && !trouve);
162  contenuCalendrier->seek(0);
163 
165  }
166  else
167  {
168  telecharger();
169  }
170 }
171 
173 {
174  qDebug() << __FUNCTION__ << nom;
175 
176  if (networkReply != nullptr)
177  {
178  networkReply->abort();
179  networkReply->disconnect();
180  }
181 
182  QNetworkRequest requete;
183  requete.setUrl(hostURL);
184  requete.setRawHeader("User-Agent", "CalendarClient_ICS");
185  requete.setRawHeader("Depth", "0");
186  requete.setRawHeader("Prefer", "return-minimal");
187  requete.setRawHeader("Content-Type", "text/xml; charset=utf-8");
188  requete.setRawHeader("Content-Length", "0");
189 
190  QSslConfiguration configuration = requete.sslConfiguration();
191  configuration.setPeerVerifyMode(QSslSocket::VerifyNone);
192  requete.setSslConfiguration(configuration);
193 
194  networkReply = networkManager.get(requete);
195 
196  if (networkReply != nullptr)
197  {
198  connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleHTTPError()));
199  connect(networkReply, SIGNAL(finished()), this, SLOT(traiterRequete()));
200 
202  }
203  else
204  {
205  qDebug() << __FUNCTION__ << nom << "Erreur : réponse invalide !";
206  emit erreur("Erreur : réponse invalide !");
207  }
208 }
209 
211 {
212  this->charger();
213 }
214 
216 {
217  requeteTimeoutTimer.stop();
218 
220  {
221  qDebug() << __FUNCTION__ << nom << "Erreur !";
222  }
223 
224  qDebug() << __FUNCTION__ << nom << "Requête terminée";
225 
226  if (networkReply != nullptr)
227  {
228  QBuffer buffer(this);
229  buffer.setData(networkReply->readAll());
230 
231  buffer.open(QIODevice::ReadOnly);
232  bool trouve = false;
233  do
234  {
235  QString ligne = buffer.readLine();
236  if (!ligne.isNull())
237  {
238  if (ligne.startsWith("X-WR-CALNAME"))
239  {
240  qDebug() << __FUNCTION__ << nom << ligne;
241  QString nomCalendrier = ligne.trimmed();
242  nomCalendrier.remove(";LANGUAGE=fr", Qt::CaseInsensitive);
243  nomCalendrier.remove("X-WR-CALNAME:", Qt::CaseInsensitive);
244  qDebug() << __FUNCTION__ << nom << nomCalendrier;
245  this->setNom(nomCalendrier);
246  emit message("Calendrier : " + nomCalendrier);
247  trouve = true;
248  }
249  }
250  }
251  while (!buffer.atEnd() && !trouve);
252  buffer.seek(0);
253  buffer.close();
254 
255  if (contenuCalendrier)
256  {
257  delete contenuCalendrier;
258  }
259  contenuCalendrier = new QTextStream(buffer.data());
260 
261  evenements.clear();
262 
264 
265  synchronisationTimer.start();
266  }
267  else
268  {
269  qDebug() << __FUNCTION__ << nom << "Erreur : réponse invalide !";
270  emit erreur("Erreur : réponse invalide !");
271  }
272 }
273 
275 {
276  QString ligne = contenuCalendrier->readLine();
277 
278  while(ligne.isNull() == false)
279  {
280  if(ligne.contains("BEGIN:VEVENT") != false)
281  {
283  }
284  ligne = contenuCalendrier->readLine();
285  }
286  emit message(QString::fromUtf8("Nb évènement(s) : ") + QString::number(evenements.size()));
287  qDebug() << __FUNCTION__ << nom << "nb evenements : " << evenements.size();
288 }
289 
291 {
292  Evenement evenement(this);
293  QString ligne;
294  QDateTime utcTime;
295  bool ok;
296 
297  qDebug() << __FUNCTION__ << nom;
298  evenement.setAttribut("utilisateur du calendrier", nom);
299 
300  while (!(ligne = contenuCalendrier->readLine()).contains(QByteArray("END:VEVENT")))
301  {
302  ligne.remove(";LANGUAGE=fr", Qt::CaseInsensitive);
303  const int delimiteur = ligne.indexOf(QLatin1Char(':'));
304  const QString key = ligne.mid(0, delimiteur);
305  QString value = (ligne.mid(delimiteur + 1, -1).replace("\\n", "\n")); //.toLatin1();
306  QString testEncodingString = asciiToUtf8(value);
307  if (testEncodingString.contains("�") == false)
308  {
309  value = testEncodingString;
310  }
311 
312  if (key.startsWith(QLatin1String("DTSTART")))
313  {
314  utcTime = Evenement::convertirHorodatage(value, ok);
315  if (utcTime.isValid())
316  evenement.setAttribut("dtstart", value);
317  }
318  else if (key.startsWith(QLatin1String("DTEND")))
319  {
320  utcTime = Evenement::convertirHorodatage(value, ok);
321  if (utcTime.isValid())
322  evenement.setAttribut("dtend", value);
323  }
324  /*else if (key == QLatin1String("RRULE"))
325  {
326  //event.setRRULE(value);
327  }
328  else if (key == QLatin1String("EXDATE"))
329  {
330  //event.setExdates(value);
331  }*/
332  else if (key == QLatin1String("SUMMARY"))
333  {
334  evenement.setAttribut("summary", value);
335  }
336  else if (key == QLatin1String("LOCATION"))
337  {
338  evenement.setAttribut("location", value);
339  }
340  else if (key == QLatin1String("UID"))
341  {
342  evenement.setAttribut("uid", value);
343  }
344  else if (key == QLatin1String("CATEGORIES"))
345  {
346  evenement.setAttribut("categories", value);
347  }
348  else if (key == QLatin1String("DESCRIPTION"))
349  {
350  evenement.setAttribut("description", value);
351  }
352  }
353 
354  evenements.append(evenement);
355  emit nouvelEvenement(QString::fromUtf8("Évènement : ") + evenement.toString());
356  //qDebug() << __FUNCTION__ << nom << evenement;
357 }
358 
360 {
362  //emit syncStateChanged(etatCalendrier);
363  requeteTimeoutTimer.stop();
364  if (networkReply != nullptr)
365  {
366  qDebug() << __FUNCTION__ << nom << "Erreur : requête HTTP !" << networkReply->errorString();
367  emit erreur(networkReply->errorString());
368  }
369  else
370  {
371  qDebug() << __FUNCTION__ << nom << "Erreur : réponse invalide !";
372  emit erreur("Erreur : réponse invalide !");
373  }
374 }
375 
376 QString Calendrier::encoderBase64(QString string)
377 {
378  QByteArray ba;
379  ba.append(string);
380  return ba.toBase64();
381 }
382 
383 QString Calendrier::asciiToUtf8(QString str)
384 {
385  return QString::fromUtf8(str.toLocal8Bit().data());
386 }
Calendrier::getEvenements
QList< Evenement > getEvenements(QDate date) const
Definition: Calendrier.cpp:76
Calendrier::asciiToUtf8
QString asciiToUtf8(QString str)
Definition: Calendrier.cpp:383
Calendrier::nom
QString nom
Definition: Calendrier.h:43
Calendrier::nouvelEvenement
void nouvelEvenement(QString evt, QString couleur="blue")
Calendrier::contenuCalendrier
QTextStream * contenuCalendrier
Definition: Calendrier.h:45
Calendrier::getRequeteTimeoutMS
int getRequeteTimeoutMS(void) const
Definition: Calendrier.cpp:63
Calendrier::etatCalendrier
EtatCalendrier etatCalendrier
Definition: Calendrier.h:50
E_STATE_ERROR
@ E_STATE_ERROR
Definition: Calendrier.h:30
Calendrier::message
void message(QString message, QString couleur="green")
Calendrier::setNom
void setNom(QString nom)
Definition: Calendrier.cpp:58
Evenement::getAttribut
QString getAttribut(QString nomAttribut) const
Definition: Evenement.cpp:65
Calendrier::traiterRequete
void traiterRequete()
Definition: Calendrier.cpp:215
Calendrier::getNom
QString getNom(void) const
Definition: Calendrier.cpp:53
Calendrier::synchronisationTimer
QTimer synchronisationTimer
Definition: Calendrier.h:44
Calendrier::charger
void charger()
Definition: Calendrier.cpp:100
Calendrier::hostURL
QUrl hostURL
Definition: Calendrier.h:42
Calendrier::requeteTimeoutMS
int requeteTimeoutMS
Definition: Calendrier.h:49
Evenement
Déclaration de la classe Evenement.
Definition: Evenement.h:36
Evenement::toString
QString toString() const
Definition: Evenement.cpp:75
Evenement::setAttribut
void setAttribut(QString nomAttribut, QString valeur)
Definition: Evenement.cpp:70
Calendrier::handleHTTPError
void handleHTTPError()
Definition: Calendrier.cpp:359
Calendrier::traiterEvenement
void traiterEvenement()
Definition: Calendrier.cpp:290
Calendrier::networkManager
QNetworkAccessManager networkManager
Definition: Calendrier.h:46
Calendrier::setRequeteTimeoutMS
void setRequeteTimeoutMS(const int requestTimeoutMS)
Definition: Calendrier.cpp:68
Calendrier::recharger
void recharger()
Definition: Calendrier.cpp:210
Calendrier::encoderBase64
QString encoderBase64(QString string)
Definition: Calendrier.cpp:376
Evenement::convertirHorodatage
static QDateTime convertirHorodatage(QString horodatage, bool &ok)
Definition: Evenement.cpp:87
Calendrier::telecharger
void telecharger()
Definition: Calendrier.cpp:172
Calendrier::networkReply
QNetworkReply * networkReply
Definition: Calendrier.h:47
Calendrier::evenements
QList< Evenement > evenements
Definition: Calendrier.h:51
Calendrier.h
Déclaration de la classe Calendrier.
Calendrier::~Calendrier
~Calendrier()
Definition: Calendrier.cpp:23
Calendrier::traiterCalendrier
void traiterCalendrier()
Definition: Calendrier.cpp:274
Calendrier::Calendrier
Calendrier(QObject *parent=nullptr)
Definition: Calendrier.cpp:13
QObject
Calendrier::setHostURL
bool setHostURL(const QString hostURL)
Definition: Calendrier.cpp:29
Calendrier::requeteTimeoutTimer
QTimer requeteTimeoutTimer
Definition: Calendrier.h:48
Calendrier::erreur
void erreur(QString erreur, QString couleur="red")
Calendrier::effacement
void effacement()
Calendrier::getHostURL
QString getHostURL(void) const
Definition: Calendrier.cpp:48