SpielServerKlient.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "SpielServerKlient.h"
  2. #include <Datei.h>
  3. // Inhalt der SpielServerKlient Klasse aus SpielServerKlient.h
  4. // Konstruktor
  5. SpielServerKlient::SpielServerKlient()
  6. {
  7. k = new Klient();
  8. unsigned char key[ 20 ] = { 148, 52, 231, 50, 20, 138, 243, 178, 149, 24, 69, 60, 68, 116, 10, 161, 178, 148, 32, 212 };
  9. k->setSendeKey( (char*)key, 20 );
  10. k->setEmpfangKey( (char*)key, 20 );
  11. fehler = new Text();
  12. verbunden = 0;
  13. ref = 1;
  14. }
  15. // Destruktor
  16. SpielServerKlient::~SpielServerKlient()
  17. {
  18. if( verbunden )
  19. trenne();
  20. k->release();
  21. fehler->release();
  22. }
  23. // privat
  24. bool SpielServerKlient::verbinde( short port, char *ip )
  25. {
  26. if( verbunden )
  27. trenne();
  28. if( k->verbinde( port, ip ) )
  29. {
  30. verbunden = 1;
  31. return 1;
  32. }
  33. return 0;
  34. }
  35. bool SpielServerKlient::trenne()
  36. {
  37. k->sendeEncrypted( "\3", 1 );
  38. char ret = 0;
  39. k->getNachrichtEncrypted( &ret, 1 );
  40. k->trenne();
  41. verbunden = 0;
  42. return 1;
  43. }
  44. // nicht constant
  45. bool SpielServerKlient::downloadSpielHistorie( short port, char *ip, int spiel, char *gpf )
  46. {
  47. if( !verbinde( port, ip ) )
  48. {
  49. fehler->setText( "Fehler beim verbinden mit Spiel Server." );
  50. return 0;
  51. }
  52. k->sendeEncrypted( "\xB", 1 );
  53. char ret = 0;
  54. k->getNachrichtEncrypted( &ret, 1 );
  55. if( ret == 1 )
  56. {
  57. k->sendeEncrypted( (char*)&spiel, 4 );
  58. k->getNachrichtEncrypted( &ret, 1 );
  59. if( ret == 1 )
  60. {
  61. Text *pfad = new Text( gpf );
  62. pfad->ersetzen( '\\', '/' );
  63. if( pfad->getText()[ pfad->getLength() - 1 ] != '/' )
  64. pfad->append( "/" );
  65. pfad->append( spiel );
  66. pfad->append( "/" );
  67. k->getNachrichtEncrypted( &ret, 1 );
  68. while( ret )
  69. {
  70. char *pf = new char[ ret + 1 ];
  71. pf[ (int)ret ] = 0;
  72. k->getNachrichtEncrypted( pf, ret );
  73. __int64 gr = 0;
  74. k->getNachrichtEncrypted( (char*)&gr, 8 );
  75. Datei *d = new Datei();
  76. d->setDatei( Text( pfad->getText() ) += pf );
  77. d->erstellen();
  78. d->open( Datei::Style::schreiben );
  79. char *bytes = new char[ 2048 ];
  80. while( gr )
  81. {
  82. short len = gr > 2048 ? 2048 : (short)gr;
  83. k->getNachricht( bytes, len );
  84. d->schreibe( bytes, len );
  85. gr -= len;
  86. }
  87. delete[] bytes;
  88. d->close();
  89. d->release();
  90. delete[] pf;
  91. k->getNachrichtEncrypted( &ret, 1 );
  92. }
  93. pfad->release();
  94. }
  95. }
  96. if( ret == 3 )
  97. {
  98. *fehler = "Fehler, Spielserver rückgabe: ";
  99. k->getNachrichtEncrypted( &ret, 1 );
  100. char *err = new char[ ret + 1 ];
  101. err[ (int)ret ] = 0;
  102. k->getNachrichtEncrypted( err, ret );
  103. *fehler += err;
  104. delete[] err;
  105. return 0;
  106. }
  107. return 1;
  108. }
  109. // constant
  110. Text *SpielServerKlient::getLetzterFehler() const
  111. {
  112. return fehler->getThis();
  113. }
  114. Text *SpielServerKlient::zLetzterFehler() const
  115. {
  116. return fehler;
  117. }
  118. // Reference Counting
  119. SpielServerKlient *SpielServerKlient::getThis()
  120. {
  121. ref++;
  122. return this;
  123. }
  124. SpielServerKlient *SpielServerKlient::release()
  125. {
  126. ref--;
  127. if( !ref )
  128. delete this;
  129. return 0;
  130. }