Updater.cpp 5.4 KB

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