HistorieK.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include "../KSGKlient.h"
  2. #include "../KSGServer.h"
  3. #include "../../Global/Variablen.h"
  4. #include <Datei.h>
  5. #include "../Keys.h"
  6. #include <Globals.h>
  7. // Inhalt der HistorieKlient Klasse KSGKlient.h
  8. // Konstruktor
  9. HistorieKlient::HistorieKlient()
  10. {
  11. klient = 0;
  12. fehler = new Text( "" );
  13. klientId = getKlientId();
  14. ref = 1;
  15. }
  16. // Destruktor
  17. HistorieKlient::~HistorieKlient()
  18. {
  19. cs.lock();
  20. trenne();
  21. fehler = fehler->release();
  22. cs.unlock();
  23. }
  24. // privat
  25. bool HistorieKlient::verbinde( char *ip, int port ) // verbindet ich mit dem Historie Server
  26. {
  27. if( klient && klient->getServerPort() == port && Text( ip ).istGleich( klient->getServerIp() ) )
  28. return 1;
  29. if( klient )
  30. trenne();
  31. klient = new Klient();
  32. Framework::logLine( ( ( Text( "Zugeteilter Historie Server:" ) += ip ) += ":" ) += port );
  33. Framework::logLine( "Verbinung mit Historie Server wird hergestellt..." );
  34. int keyLen = 0;
  35. char *key = 0;
  36. Keys::getServerKey( &key, keyLen, Keys::HISTORIE, Keys::SENDEN );
  37. klient->setSendeKey( key, keyLen );
  38. delete[] key;
  39. Keys::getServerKey( &key, keyLen, Keys::HISTORIE, Keys::EMPFANGEN );
  40. klient->setEmpfangKey( key, keyLen );
  41. delete[] key;
  42. if( !klient->verbinde( (unsigned short)port, ip ) )
  43. {
  44. Framework::logLine( "ERROR: Server nicht erreichbar." );
  45. klient = klient->release();
  46. fehler->setText( "Fehler beim verbinden mit dem Historie Server." );
  47. return 0;
  48. }
  49. klient->sendeEncrypted( "\1", 1 );
  50. klient->sendeEncrypted( (char*)&klientId, 4 );
  51. char ret = 0;
  52. klient->getNachrichtEncrypted( &ret, 1 );
  53. if( ret == 3 )
  54. {
  55. char län = 0;
  56. klient->getNachrichtEncrypted( &län, 1 );
  57. char *nachricht = new char[ län + 1 ];
  58. nachricht[ län ] = 0;
  59. klient->getNachrichtEncrypted( nachricht, län );
  60. fehler->setText( nachricht );
  61. Framework::logLine( Text( "ERROR: " ) += nachricht );
  62. delete[]nachricht;
  63. trenne();
  64. return 0;
  65. }
  66. if( ret == 1 )
  67. {
  68. char *sl = 0;
  69. char slLän = getSchlüssel( &sl );
  70. klient->setSendeKey( sl, slLän );
  71. klient->setEmpfangKey( sl, slLän );
  72. delete[] sl;
  73. }
  74. Framework::logLine( "Erfolgreich mit Historie Server verbunden." );
  75. return 1;
  76. }
  77. bool HistorieKlient::trenne() // trennt sich von dem Historie Server
  78. {
  79. if( !klient )
  80. return 1;
  81. Framework::logLine( "Verbindung zum Historie Server wird getrennt..." );
  82. char serverReturn;
  83. klient->sendeEncrypted( "\4", 1 );
  84. klient->getNachrichtEncrypted( &serverReturn, 1 );
  85. if( serverReturn == 3 )
  86. {
  87. char län = 0;
  88. klient->getNachrichtEncrypted( &län, 1 );
  89. char *nachricht = new char[ län + 1 ];
  90. nachricht[ län ] = 0;
  91. klient->getNachrichtEncrypted( nachricht, län );
  92. delete[]nachricht;
  93. }
  94. klient->sendeEncrypted( "\3", 1 );
  95. klient->getNachrichtEncrypted( &serverReturn, 1 );
  96. klient->trenne();
  97. klient = klient->release();
  98. return 1;
  99. }
  100. // nicht constant
  101. bool HistorieKlient::downloadSpielHistorie( int spielId ) // läd Spiel Historie herunter
  102. {
  103. if( DateiIstVerzeichnis( Text( "data/tmp/historie/" ) += spielId ) )
  104. return 1;
  105. cs.lock();
  106. int port = 0;
  107. Text *ip = new Text();
  108. if( !infoKlient->getHistorieServer( spielId, &port, ip ) )
  109. {
  110. cs.unlock();
  111. ip->release();
  112. fehler->setText( infoKlient->getLetzterFehler() );
  113. return 0;
  114. }
  115. if( !verbinde( *ip, port ) )
  116. {
  117. cs.unlock();
  118. ip->release();
  119. return 0;
  120. }
  121. ip->release();
  122. klient->sendeEncrypted( "\6", 1 );
  123. char ret = 0;
  124. klient->getNachrichtEncrypted( &ret, 1 );
  125. if( ret == 1 )
  126. {
  127. klient->sendeEncrypted( (char*)&spielId, 4 );
  128. klient->getNachrichtEncrypted( &ret, 1 );
  129. if( ret == 1 )
  130. {
  131. char län = 0;
  132. klient->getNachrichtEncrypted( &län, 1 );
  133. while( län )
  134. {
  135. char *pf = new char[ län + 1 ];
  136. pf[ län ] = 0;
  137. klient->getNachrichtEncrypted( pf, län );
  138. __int64 gr = 0;
  139. klient->getNachrichtEncrypted( (char*)&gr, 8 );
  140. Text *pfad = new Text( "data/tmp/historie/" );
  141. pfad->append( spielId );
  142. pfad->append( pf );
  143. delete[] pf;
  144. Datei *d = new Datei();
  145. d->setDatei( pfad );
  146. d->erstellen();
  147. d->open( Datei::Style::schreiben );
  148. char *bytes = new char[ 2048 ];
  149. while( gr )
  150. {
  151. int dLän = gr > 2048 ? 2048 : (int)gr;
  152. klient->getNachricht( bytes, dLän );
  153. d->schreibe( bytes, dLän );
  154. gr -= dLän;
  155. }
  156. delete[] bytes;
  157. d->close();
  158. d->release();
  159. klient->getNachrichtEncrypted( &län, 1 );
  160. }
  161. trenne();
  162. cs.unlock();
  163. return 1;
  164. }
  165. }
  166. if( ret == 3 )
  167. {
  168. char län = 0;
  169. klient->getNachrichtEncrypted( &län, 1 );
  170. char *nachricht = new char[ län + 1 ];
  171. nachricht[ län ] = 0;
  172. klient->getNachrichtEncrypted( nachricht, län );
  173. fehler->setText( nachricht );
  174. delete[]nachricht;
  175. }
  176. trenne();
  177. cs.unlock();
  178. return 0;
  179. }
  180. // constant
  181. bool HistorieKlient::istVerbunden() const // prüft, ob mit Historie Server verbunden
  182. {
  183. return klient != 0;
  184. }
  185. char *HistorieKlient::getLetzterFehler() const // gibt den Letzten Fehlertext zuück
  186. {
  187. return *fehler;
  188. }
  189. // Reference Counting
  190. HistorieKlient *HistorieKlient::getThis()
  191. {
  192. ref++;
  193. return this;
  194. }
  195. HistorieKlient *HistorieKlient::release()
  196. {
  197. ref--;
  198. if( !ref )
  199. delete this;
  200. return 0;
  201. }