Updater.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "KartenServer.h"
  2. #include <Klient.h>
  3. #include <iostream>
  4. // Inhalt der Updater Klasse aus Updater.h
  5. // Konstruktor
  6. Updater::Updater(KartenServer* kServ)
  7. : Thread()
  8. {
  9. ks = kServ;
  10. beenden = 0;
  11. start();
  12. }
  13. // Destruktor
  14. Updater::~Updater()
  15. {
  16. beenden = 1;
  17. warteAufThread(5000);
  18. if (isRunning())
  19. ende();
  20. ks->release();
  21. }
  22. // nicht constant
  23. void Updater::thread()
  24. {
  25. while (!beenden)
  26. {
  27. for (int i = 0; i < 60; i++)
  28. {
  29. if (beenden)
  30. break;
  31. Sleep(1000);
  32. }
  33. if (beenden)
  34. break;
  35. int kId = ks->zDB()->getUpdateKarte(ks->getId());
  36. if (kId)
  37. {
  38. Text updatePf = ks->zIni()->zWert("KartenPfad")->getText();
  39. updatePf += "/update";
  40. DateiRemove(updatePf);
  41. ks->karteUpdateStart(kId);
  42. int port = 0;
  43. Text ip = "";
  44. if (!ks->zDB()->getEditorServerPortIp(kId, &port, &ip))
  45. {
  46. ks->karteUpdateEnde();
  47. continue;
  48. }
  49. Klient* k = new Klient();
  50. unsigned char key[20] = { 55, 124, 19, 204, 23, 5, 59, 75, 247, 138, 119, 111, 57, 250, 206, 187, 165, 6, 247, 151 };
  51. k->setEmpfangKey((char*)key, 20);
  52. k->setSendeKey((char*)key, 20);
  53. char ret = 0;
  54. if (!k->verbinde((unsigned short)port, ip))
  55. {
  56. ks->karteUpdateEnde();
  57. k = (Klient*)k->release();
  58. std::cout << "KS: Updater: Fehler beim Updaten von Karte " << kId << ".\n Verbindung zum Editorserver konnte nicht hergestellt werden.\n";
  59. continue;
  60. }
  61. k->sendeEncrypted("\x9", 1);
  62. k->getNachrichtEncrypted(&ret, 1);
  63. if (ret == 1)
  64. {
  65. k->sendeEncrypted((char*)&kId, 4);
  66. k->getNachrichtEncrypted(&ret, 1);
  67. if (ret == 1)
  68. {
  69. int anz = 0;
  70. k->getNachrichtEncrypted((char*)&anz, 4);
  71. for (int i = 0; i < anz && !beenden; i++)
  72. {
  73. unsigned char len = 0;
  74. k->getNachrichtEncrypted((char*)&len, 1);
  75. if (!len)
  76. continue;
  77. char* pfa = new char[len + 1];
  78. pfa[(int)len] = 0;
  79. k->getNachrichtEncrypted(pfa, len);
  80. __int64 size = 0;
  81. k->getNachrichtEncrypted((char*)&size, 8);
  82. char* buffer = new char[2048];
  83. Text pfad = updatePf;
  84. pfad += pfa;
  85. delete[] pfa;
  86. Datei d;
  87. d.setDatei(pfad);
  88. d.erstellen();
  89. d.open(Datei::Style::schreiben);
  90. while (size)
  91. {
  92. int l = size >= 2048 ? 2048 : (int)size;
  93. k->getNachricht(buffer, l);
  94. d.schreibe(buffer, l);
  95. size -= l;
  96. }
  97. d.close();
  98. delete[] buffer;
  99. }
  100. if (beenden)
  101. {
  102. ks->karteUpdateEnde();
  103. k->sendeEncrypted("\3", 1);
  104. k->getNachrichtEncrypted(&ret, 1);
  105. k->trenne();
  106. k->release();
  107. break;
  108. }
  109. Text neuPfad = ks->zIni()->zWert("KartenPfad")->getText();
  110. neuPfad += "/";
  111. neuPfad += kId;
  112. DateiRemove(neuPfad);
  113. DateiUmbenennen(updatePf, neuPfad);
  114. Text stsPf = neuPfad.getText();
  115. stsPf += "/server/sts.ltgd";
  116. Datei sts;
  117. sts.setDatei(stsPf);
  118. sts.open(Datei::Style::lesen);
  119. int sAnz = 0;
  120. sts.lese((char*)&sAnz, 4);
  121. sts.close();
  122. ks->zDB()->setKarteSpielerAnzahl(kId, sAnz);
  123. }
  124. }
  125. if (ret == 3)
  126. {
  127. ks->karteUpdateEnde();
  128. unsigned char byte = 0;
  129. k->getNachrichtEncrypted((char*)&byte, 1);
  130. char* f = new char[byte + 1];
  131. f[(int)byte] = 0;
  132. k->getNachrichtEncrypted(f, byte);
  133. std::cout << "KS: Updater: Fehler beim Update von Karte " << kId << ".\n Meldung: " << f << "\n";
  134. delete[] f;
  135. k->sendeEncrypted("\3", 1);
  136. k->getNachrichtEncrypted(&ret, 1);
  137. k->trenne();
  138. k->release();
  139. continue;
  140. }
  141. k->sendeEncrypted("\3", 1);
  142. k->getNachrichtEncrypted(&ret, 1);
  143. k->trenne();
  144. k->release();
  145. ks->zDB()->endUpdateKarte(kId);
  146. ks->karteUpdateEnde();
  147. }
  148. }
  149. run = 0;
  150. }