KartenLeser.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "KartenLeser.h"
  2. #include <Datei.h>
  3. #ifdef WIN32
  4. #include "..\..\SpielServer.h"
  5. #include "..\..\..\Datenbank\Datenbank.h"
  6. #else
  7. #include "SpielServer.h"
  8. #include "Datenbank.h"
  9. #endif
  10. // Inhalt der KartenLeser Klasse aus KartenLeser.h
  11. // Konstruktor
  12. KartenLeser::KartenLeser(int sNum, int karteId, SpielServer* ss)
  13. : ReferenceCounter()
  14. {
  15. this->ss = ss;
  16. pfad = new Text("");
  17. this->sNum = sNum;
  18. setKarteId(karteId);
  19. }
  20. // Destruktor
  21. KartenLeser::~KartenLeser()
  22. {
  23. ss->release();
  24. pfad->release();
  25. }
  26. // nicht constant
  27. bool KartenLeser::setKarteId(int id)
  28. {
  29. bool retVal = 1;
  30. Text pf = ss->zInit()->zWert("TempMapPfad")->getText();
  31. pf += "/";
  32. pf += sNum;
  33. if (!DateiExistiert(pf))
  34. { // Karte Herunterladen
  35. Text ip;
  36. int port;
  37. ss->zDB()->getKartenServer(id, &port, &ip);
  38. Klient* klient = new Klient();
  39. unsigned char key[20] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
  40. klient->setSendeKey((char*)key, 20);
  41. klient->setEmpfangKey((char*)key, 20);
  42. if (!klient->verbinde((unsigned short)port, ip))
  43. {
  44. klient = (Klient*)klient->release();
  45. return 0;
  46. }
  47. klient->sendeEncrypted("\x7", 1);
  48. char ret = 0;
  49. klient->getNachrichtEncrypted(&ret, 1);
  50. if (ret == 1)
  51. {
  52. klient->sendeEncrypted((char*)&id, 4);
  53. klient->getNachrichtEncrypted(&ret, 1);
  54. if (ret == 2)
  55. { // update
  56. retVal = 0;
  57. }
  58. else if (ret == 1)
  59. {
  60. int anz = 0;
  61. klient->getNachrichtEncrypted((char*)&anz, 4);
  62. for (int i = 0; i < anz; i++)
  63. {
  64. unsigned char len = 0;
  65. klient->getNachrichtEncrypted((char*)&len, 1);
  66. if (!len)
  67. continue;
  68. char* pfa = new char[len + 1];
  69. pfa[(int)len] = 0;
  70. klient->getNachrichtEncrypted(pfa, len);
  71. __int64 size = 0;
  72. klient->getNachrichtEncrypted((char*)&size, 8);
  73. char* buffer = new char[2048];
  74. Text pfad = pf.getText();
  75. pfad += "/";
  76. pfad += pfa;
  77. delete[] pfa;
  78. Datei d;
  79. d.setDatei(pfad);
  80. d.erstellen();
  81. d.open(Datei::Style::schreiben);
  82. while (size)
  83. {
  84. int l = size >= 2048 ? 2048 : (int)size;
  85. klient->getNachricht(buffer, l);
  86. d.schreibe(buffer, l);
  87. size -= l;
  88. }
  89. d.close();
  90. delete[] buffer;
  91. }
  92. }
  93. }
  94. if (ret == 3)
  95. {
  96. retVal = 0;
  97. unsigned char byte = 0;
  98. klient->getNachrichtEncrypted((char*)&byte, 1);
  99. char* f = new char[byte + 1];
  100. f[(int)byte] = 0;
  101. klient->getNachrichtEncrypted(f, byte);
  102. delete[] f;
  103. }
  104. klient->sendeEncrypted("\3", 1);
  105. klient->getNachrichtEncrypted(&ret, 1);
  106. klient->trenne();
  107. klient->release();
  108. }
  109. karteId = id;
  110. pfad->setText(pf);
  111. return retVal;
  112. }
  113. bool KartenLeser::ladeSpielerTeamStruktur(SpielerTeamStruktur* sts)
  114. {
  115. if (!pfad->getLength())
  116. return 0;
  117. Text* pf = new Text(pfad->getText());
  118. pf->append("/sts.ltgd");
  119. Datei* datei = new Datei();
  120. datei->setDatei(pf);
  121. if (!datei->existiert() || datei->istOrdner())
  122. {
  123. datei->release();
  124. return 0;
  125. }
  126. datei->open(Datei::Style::lesen);
  127. datei->lese((char*)&sts->spielerAnzahl, 4);
  128. datei->lese((char*)&sts->teamAnzahl, 4);
  129. if (sts->spielerFarbe)
  130. sts->spielerFarbe->release();
  131. sts->spielerFarbe = new Array< int >();
  132. for (int i = 0; i < sts->spielerAnzahl; i++)
  133. {
  134. int farbe = 0;
  135. datei->lese((char*)&farbe, 4);
  136. sts->spielerFarbe->add(farbe);
  137. }
  138. if (sts->teamFarbe)
  139. sts->teamFarbe->release();
  140. sts->teamFarbe = new Array< int >();
  141. for (int i = 0; i < sts->teamAnzahl; i++)
  142. {
  143. int farbe = 0;
  144. datei->lese((char*)&farbe, 4);
  145. sts->teamFarbe->add(farbe);
  146. }
  147. if (sts->teamName)
  148. sts->teamName->release();
  149. sts->teamName = new RCArray< Text >();
  150. for (int i = 0; i < sts->teamAnzahl; i++)
  151. {
  152. unsigned char len = 0;
  153. datei->lese((char*)&len, 1);
  154. char* txt = new char[len + 1];
  155. txt[(int)len] = 0;
  156. datei->lese(txt, len);
  157. Text* name = new Text(txt);
  158. delete[] txt;
  159. sts->teamName->add(name);
  160. }
  161. if (sts->teamSize)
  162. sts->teamSize->release();
  163. sts->teamSize = new Array< int >();
  164. for (int i = 0; i < sts->teamAnzahl; i++)
  165. {
  166. int size = 0;
  167. datei->lese((char*)&size, 4);
  168. sts->teamSize->add(size);
  169. }
  170. datei->close();
  171. datei->release();
  172. return 1;
  173. }
  174. // constant
  175. int KartenLeser::getKarteId() const
  176. {
  177. return karteId;
  178. }
  179. Text* KartenLeser::getPfad() const
  180. {
  181. return pfad ? dynamic_cast<Text*>(pfad->getThis()) : 0;
  182. }
  183. Text* KartenLeser::zPfad() const
  184. {
  185. return pfad;
  186. }