anetwork.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include "aconfig.h"
  2. #include "filesystem.h"
  3. #include "anetwork.h"
  4. #include "downloadmanager.h"
  5. #include "mainwindow.h"
  6. #include <QApplication>
  7. #include <QtNetwork/QNetworkAccessManager>
  8. #include <QUrl>
  9. #include <QUrlQuery>
  10. #include <QNetworkRequest>
  11. #include <QNetworkReply>
  12. #include <QObject>
  13. #include <QEventLoop>
  14. #include <QDir>
  15. #include <QMap>
  16. #include <QString>
  17. #include <string>
  18. ANetwork::ANetwork() {}
  19. void ANetwork::getPatches() {
  20. QUrlQuery query;
  21. QStringList names;
  22. QString version;
  23. qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем проверку актуальности патчей.");
  24. names << "sound" << "text" << "image" << "video" << "screen" << "texture" << "font";
  25. QUrl url(AConfig::getInstance()->getValue("Network", "releases"));
  26. QString datafolder = QApplication::applicationDirPath() + "/data";
  27. QDir dir(datafolder);
  28. if(!dir.exists())
  29. QDir().mkdir(datafolder);
  30. foreach(QString s, names) {
  31. if(AConfig::getInstance()->getValue("Editor", s + "s") == "true"){
  32. if(s == "screen")
  33. s = "loadscreen"; // поправка для заставок
  34. QStringList paths = dir.entryList(QStringList(s + "*"));
  35. if(!paths.empty()) {
  36. version = QString::number(getVersion(paths.first()));
  37. QString hash = FileSystem::fileHash(datafolder + "/" + paths.first(), QCryptographicHash::Md5);
  38. if(hash != AConfig::getInstance()->getValue("Hashes", s + "s")){
  39. qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Эталон хэша отсутствует (удаляю файл): ", paths.first().toStdString().c_str());
  40. QFile base(datafolder + "/" + paths.first());
  41. base.remove();
  42. version="100";
  43. }
  44. QString dateline = AConfig::getInstance()->getValue("Datetime", s + "s");
  45. if(dateline != "-1"){
  46. qDebug("%s:%i: %s", __FILE__, __LINE__, "Проставляем даты патчей.");
  47. emit updatePatchDates(s, dateline.split(" ")[0]);
  48. }
  49. } else {
  50. qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Патч отсутствует: ", s.toStdString().c_str());
  51. version = "100";
  52. }
  53. query.addQueryItem(s, version);
  54. }
  55. }
  56. url.setQuery(query.query());
  57. qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Запрашиваем информацию о патчах: ", url.fileName().toStdString().c_str());
  58. QString content = this->query(url);
  59. if(content == "error"){
  60. qInfo("%s:%i: %s", __FILE__, __LINE__, "Отсутствует связь с сервером. Прервано.");
  61. return;
  62. }
  63. qDebug() << content;
  64. if(content == "") {
  65. qInfo("%s:%i: %s", __FILE__, __LINE__, "Все версии патчей соответствуют актуальным.");
  66. return;
  67. }
  68. qInfo("%s:%i: %s", __FILE__, __LINE__, "Составляем список загрузок.");
  69. QStringList downloads = content.split( "|" );
  70. foreach (QString item, downloads) {
  71. QStringList values = item.split( ":::" );
  72. QStringList pathline = values[0].split( "_" );
  73. pathline = pathline[0].split( "/" );
  74. QUrl url = AConfig::getInstance()->getValue("Network", "server") + values[0];
  75. AConfig::getInstance()->setValue("Hashes", pathline[3], values[1]);
  76. AConfig::getInstance()->setValue("Datetime", pathline[3], values[2]);
  77. // Удаляем устаревшие патчи
  78. QStringList old = dir.entryList(QStringList(pathline[3] + "*"));
  79. if(old.count() > 0){
  80. foreach(QString filename, old){
  81. QFile::remove(QApplication::applicationDirPath() + "/data/" + filename);
  82. }
  83. }
  84. // Добавляем новый файл в список закачек
  85. DownloadManager::getInstance()->append(url);
  86. }
  87. qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем загрузку патчей.");
  88. DownloadManager::getInstance()->startNextDownload();
  89. }
  90. QString ANetwork::query(QUrl url) {
  91. QNetworkAccessManager* manager = new QNetworkAccessManager(MainWindow::getInstance());
  92. QNetworkRequest request(url);
  93. QNetworkReply* reply = manager->get(request);
  94. QEventLoop loop;
  95. QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
  96. loop.exec();
  97. QString content = reply->readAll();
  98. if (reply->error() != QNetworkReply::NoError){
  99. content = "error";
  100. // пишем в лог
  101. qDebug() << reply->errorString();
  102. }
  103. reply->deleteLater();
  104. return content;
  105. }
  106. QByteArray ANetwork::query_binary(QUrl url) {
  107. QNetworkAccessManager* manager = new QNetworkAccessManager(MainWindow::getInstance());
  108. QNetworkRequest request(url);
  109. QNetworkReply* reply = manager->get(request);
  110. QEventLoop loop;
  111. QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
  112. loop.exec();
  113. QByteArray bytes = reply->readAll();
  114. return bytes;
  115. }
  116. void ANetwork::getCoupon() {
  117. qInfo("%s:%i: %s", __FILE__, __LINE__, "Получаем купон.");
  118. QString content = this->query(AConfig::getInstance()->getValue("Network", "coupon") + ".txt");
  119. if (content == "error")
  120. return;
  121. AConfig::getInstance()->setValue("Values", "coupon", content);
  122. qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Ответ сервера: ",content.toStdString().c_str());
  123. emit getCouponFinished(content);
  124. }
  125. void ANetwork::getFootMessage() {
  126. qInfo("%s:%i: %s", __FILE__, __LINE__, "Получаем данные для футера");
  127. QString content = this->query(AConfig::getInstance()->getValue("Network", "foot") + ".txt");
  128. qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Ответ сервера: ", content.toStdString().c_str());
  129. if (content == "error" || content == "")
  130. return;
  131. emit getFootMessageFinished(content);
  132. }
  133. void ANetwork::getServers() {
  134. QString content = this->query(AConfig::getInstance()->getValue("Network", "servers") + ".txt");
  135. if (content == "error") {
  136. emit getServersFinished("error");
  137. return;
  138. }
  139. qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Ответ сервера: ", content.toStdString().c_str());
  140. qInfo("%s:%i: %s", __FILE__, __LINE__, "Данные получены. Производим установку значений.");
  141. AConfig::getInstance()->setValue("Values", "servers", content);
  142. emit getServersFinished(content);
  143. }
  144. void ANetwork::getMicroPatch(int timestamp){
  145. qInfo("%s:%i: %s", __FILE__, __LINE__, "Загрузка последних обновлений");
  146. qInfo("%s:%i: %s", __FILE__, __LINE__, "Уточняем наличие обновлений");
  147. QString microfolder = QApplication::applicationDirPath() + "/data/micro/";
  148. QDir dir(microfolder);
  149. if(!dir.exists())
  150. QDir().mkdir(microfolder);
  151. QString baseurl = AConfig::getInstance()->getValue("Network", "update");
  152. QString url = baseurl + "/" + QString::number(timestamp);
  153. qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Стартуем загрузку ", url.toStdString().c_str());
  154. QNetworkAccessManager m_NetworkMngr;
  155. QNetworkReply *reply= m_NetworkMngr.get(QNetworkRequest(url));
  156. QEventLoop loop;
  157. QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
  158. loop.exec();
  159. QUrl aUrl(url);
  160. QFileInfo fileInfo=aUrl.path();
  161. QString filename = microfolder + fileInfo.fileName() + ".db";
  162. QFile file(filename);
  163. file.open(QIODevice::WriteOnly);
  164. file.write(reply->readAll());
  165. delete reply;
  166. qInfo("%s:%i: %s", __FILE__, __LINE__, "Загрузка микропатча завершена.");
  167. emit getMicroPatchFinished(filename);
  168. }
  169. int ANetwork::getVersion(QString string) {
  170. std::string str(string.toLatin1().data());
  171. int version = 0;
  172. for (unsigned int i = str.find("_v") + 2; i < str.find("_v") + 7; i += 2) {
  173. version = version * 10 + (str[i] - '0');
  174. }
  175. return version;
  176. }