KartenLeser.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include "KartenLeser.h"
  2. #include <Datei.h>
  3. #include "AccountHistorieDaten.h"
  4. #include <Klient.h>
  5. // Inhalt der KartenLeser Klasse aus KartenLeser.h
  6. // Konstruktor
  7. KartenLeser::KartenLeser( int karteId, InformationServer *is )
  8. {
  9. pfad = new Text( "" );
  10. *pfad += karteId;
  11. while( DateiExistiert( pfad->getText() ) )
  12. pfad->anhängen( "_" );
  13. ref = 1;
  14. Text ip;
  15. int port;
  16. is->zDB()->getKartenServerPortIp( 0, karteId, &port, &ip );
  17. Klient *klient = new Klient();
  18. unsigned char schlüssel[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
  19. klient->setSendeSchlüssel( (char*)schlüssel, 20 );
  20. klient->setEmpfangSchlüssel( (char*)schlüssel, 20 );
  21. if( !klient->verbinde( (unsigned short)port, ip ) )
  22. {
  23. klient = klient->release();
  24. return;
  25. }
  26. klient->sendeVerschlüsselt( "\x7", 1 );
  27. char ret = 0;
  28. klient->getNachrichtVerschlüsselt( &ret, 1 );
  29. if( ret == 1 )
  30. {
  31. klient->sendeVerschlüsselt( (char*)&karteId, 4 );
  32. klient->getNachrichtVerschlüsselt( &ret, 1 );
  33. if( ret == 1 )
  34. {
  35. int anz = 0;
  36. klient->getNachrichtVerschlüsselt( (char*)&anz, 4 );
  37. for( int i = 0; i < anz; i++ )
  38. {
  39. char län = 0;
  40. klient->getNachrichtVerschlüsselt( &län, 1 );
  41. if( !län )
  42. continue;
  43. char *pfa = new char[ län + 1 ];
  44. pfa[ län ] = 0;
  45. klient->getNachrichtVerschlüsselt( pfa, län );
  46. __int64 größe = 0;
  47. klient->getNachrichtVerschlüsselt( (char*)&größe, 8 );
  48. char *buffer = new char[ 2048 ];
  49. Text pf = pfad->getText();
  50. pf += "/";
  51. pf += pfa;
  52. delete[] pfa;
  53. Datei d;
  54. d.setDatei( pf );
  55. d.erstellen();
  56. d.öffnen( Datei::Style::schreiben );
  57. while( größe )
  58. {
  59. int l = größe >= 2048 ? 2048 : (int)größe;
  60. klient->getNachricht( buffer, l );
  61. d.schreibe( buffer, l );
  62. größe -= l;
  63. }
  64. d.schließen();
  65. delete[] buffer;
  66. }
  67. }
  68. }
  69. if( ret == 3 )
  70. {
  71. char byte = 0;
  72. klient->getNachrichtVerschlüsselt( &byte, 1 );
  73. char *f = new char[ byte + 1 ];
  74. f[ byte ] = 0;
  75. klient->getNachrichtVerschlüsselt( f, byte );
  76. delete[] f;
  77. }
  78. klient->sendeVerschlüsselt( "\3", 1 );
  79. klient->getNachrichtVerschlüsselt( &ret, 1 );
  80. klient->trenne();
  81. klient->release();
  82. }
  83. // Destruktor
  84. KartenLeser::~KartenLeser()
  85. {
  86. DateiLöschen( pfad );
  87. }
  88. // nicht constant
  89. bool KartenLeser::ladeSpielerTeamStruktur( SpielerTeamStruktur *sts )
  90. {
  91. if( !pfad->getLänge() )
  92. return 0;
  93. Text *pf = new Text( pfad->getText() );
  94. pf->anhängen( "/sts.ltgd" );
  95. Datei *datei = new Datei();
  96. datei->setDatei( pf );
  97. if( !datei->existiert() || datei->istOrdner() )
  98. {
  99. datei->release();
  100. return 0;
  101. }
  102. datei->öffnen( Datei::Style::lesen );
  103. datei->lese( (char*)&sts->spielerAnzahl, 4 );
  104. datei->lese( (char*)&sts->teamAnzahl, 4 );
  105. if( sts->spielerFarbe )
  106. sts->spielerFarbe->release();
  107. sts->spielerFarbe = new Array< int >();
  108. for( int i = 0; i < sts->spielerAnzahl; i++ )
  109. {
  110. int farbe = 0;
  111. datei->lese( (char*)&farbe, 4 );
  112. sts->spielerFarbe->set( farbe, i );
  113. }
  114. if( sts->teamFarbe )
  115. sts->teamFarbe->release();
  116. sts->teamFarbe = new Array< int >();
  117. for( int i = 0; i < sts->teamAnzahl; i++ )
  118. {
  119. int farbe = 0;
  120. datei->lese( (char*)&farbe, 4 );
  121. sts->teamFarbe->set( farbe, i );
  122. }
  123. if( sts->teamName )
  124. sts->teamName->release();
  125. sts->teamName = new RCArray< Text >();
  126. for( int i = 0; i < sts->teamAnzahl; i++ )
  127. {
  128. char län = 0;
  129. datei->lese( &län, 1 );
  130. char *txt = new char[ län + 1 ];
  131. txt[ län ] = 0;
  132. datei->lese( txt, län );
  133. Text *name = new Text( txt );
  134. delete[] txt;
  135. sts->teamName->set( name, i );
  136. }
  137. if( sts->teamGröße )
  138. sts->teamGröße->release();
  139. sts->teamGröße = new Array< int >();
  140. for( int i = 0; i < sts->teamAnzahl; i++ )
  141. {
  142. int größe = 0;
  143. datei->lese( (char*)&größe, 4 );
  144. sts->teamGröße->set( größe, i );
  145. }
  146. datei->schließen();
  147. datei->release();
  148. return 1;
  149. }
  150. // constant
  151. Text *KartenLeser::getPfad() const
  152. {
  153. return pfad ? pfad->getThis() : 0;
  154. }
  155. Text *KartenLeser::zPfad() const
  156. {
  157. return pfad;
  158. }
  159. // Reference Counting
  160. KartenLeser *KartenLeser::getThis()
  161. {
  162. ref++;
  163. return this;
  164. }
  165. KartenLeser *KartenLeser::release()
  166. {
  167. ref--;
  168. if( !ref )
  169. delete this;
  170. return 0;
  171. }