KartenLeser.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. {
  14. this->ss = ss;
  15. pfad = new Text( "" );
  16. ref = 1;
  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->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. char len = 0;
  65. klient->getNachrichtEncrypted( &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. char byte = 0;
  98. klient->getNachrichtEncrypted( &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( (char*)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->set( farbe, i );
  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->set( farbe, i );
  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. char len = 0;
  153. datei->lese( &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->set( name, i );
  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->set( size, i );
  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 ? pfad->getThis() : 0;
  182. }
  183. Text *KartenLeser::zPfad() const
  184. {
  185. return pfad;
  186. }
  187. // Reference Counting
  188. KartenLeser *KartenLeser::getThis()
  189. {
  190. ref++;
  191. return this;
  192. }
  193. KartenLeser *KartenLeser::release()
  194. {
  195. ref--;
  196. if( !ref )
  197. delete this;
  198. return 0;
  199. }