Updater.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "ShopServer.h"
  2. #include <Klient.h>
  3. #include <iostream>
  4. // Inhalt der Updater Klasse aus Updater.h
  5. // Konstruktor
  6. Updater::Updater( ShopServer *shServ )
  7. : Thread()
  8. {
  9. shs = shServ;
  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. shs->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 = shs->zDB()->getUpdateKarte( shs->getId() );
  37. if( kId )
  38. {
  39. Text updatePf = shs->zInit()->zWert( "ShopSeitenPfad" )->getText();
  40. updatePf += "/update";
  41. DateiRemove( updatePf );
  42. int port = 0;
  43. Text ip = "";
  44. if( !shs->zDB()->getEditorServerPortIp( kId, &port, &ip ) )
  45. continue;
  46. Klient *k = new Klient();
  47. unsigned char key[ 20 ] = { 55, 124, 19, 204, 23, 5, 59, 75, 247, 138, 119, 111, 57, 250, 206, 187, 165, 6, 247, 151 };
  48. k->setEmpfangKey( (char*)key, 20 );
  49. k->setSendeKey( (char*)key, 20 );
  50. char ret = 0;
  51. if( !k->verbinde( (unsigned short)port, ip ) )
  52. {
  53. k = k->release();
  54. std::cout << "ShS: Updater: Fehler beim Updaten von Karte " << kId << ".\n Verbindung zum Editorserver konnte nicht hergestellt werden.\n";
  55. continue;
  56. }
  57. k->sendeEncrypted( "\x8", 1 );
  58. k->getNachrichtEncrypted( &ret, 1 );
  59. if( ret == 1 )
  60. {
  61. k->sendeEncrypted( (char*)&kId, 4 );
  62. k->getNachrichtEncrypted( &ret, 1 );
  63. if( ret == 1 )
  64. {
  65. int anz = 0;
  66. k->getNachrichtEncrypted( (char*)&anz, 4 );
  67. for( int i = 0; i < anz && !beenden; i++ )
  68. {
  69. char len = 0;
  70. k->getNachrichtEncrypted( &len, 1 );
  71. if( !len )
  72. continue;
  73. char *pfa = new char[ len + 1 ];
  74. pfa[ (int)len ] = 0;
  75. k->getNachrichtEncrypted( pfa, len );
  76. __int64 size = 0;
  77. k->getNachrichtEncrypted( (char*)&size, 8 );
  78. char *buffer = new char[ 2048 ];
  79. Text pfad = updatePf;
  80. pfad += pfa;
  81. delete[] pfa;
  82. Datei d;
  83. d.setDatei( pfad );
  84. d.erstellen();
  85. d.open( Datei::Style::schreiben );
  86. while( size )
  87. {
  88. int l = size >= 2048 ? 2048 : (int)size;
  89. k->getNachricht( buffer, l );
  90. d.schreibe( buffer, l );
  91. size -= l;
  92. }
  93. d.close();
  94. delete[] buffer;
  95. }
  96. if( beenden )
  97. {
  98. k->sendeEncrypted( "\3", 1 );
  99. k->getNachrichtEncrypted( &ret, 1 );
  100. k->trenne();
  101. k->release();
  102. break;
  103. }
  104. Text neuPfad = shs->zInit()->zWert( "ShopSeitenPfad" )->getText();
  105. neuPfad += "/karten/";
  106. neuPfad += kId;
  107. DateiRemove( neuPfad );
  108. DateiUmbenennen( updatePf, neuPfad );
  109. }
  110. }
  111. if( ret == 3 )
  112. {
  113. char byte = 0;
  114. k->getNachrichtEncrypted( &byte, 1 );
  115. char *f = new char[ byte + 1 ];
  116. f[ (int)byte ] = 0;
  117. k->getNachrichtEncrypted( f, byte );
  118. std::cout << "ShS: Updater: Fehler beim Update von Karte " << kId << ".\n Meldung: " << f << "\n";
  119. delete[] f;
  120. k->sendeEncrypted( "\3", 1 );
  121. k->getNachrichtEncrypted( &ret, 1 );
  122. k->trenne();
  123. k->release();
  124. continue;
  125. }
  126. k->sendeEncrypted( "\3", 1 );
  127. k->getNachrichtEncrypted( &ret, 1 );
  128. k->trenne();
  129. k->release();
  130. shs->zDB()->endUpdateKarte( kId );
  131. }
  132. }
  133. run = 0;
  134. }
  135. // Reference Counting
  136. Updater *Updater::getThis()
  137. {
  138. ref++;
  139. return this;
  140. }
  141. Updater *Updater::release()
  142. {
  143. ref--;
  144. if( !ref )
  145. delete this;
  146. return 0;
  147. }