SpielServerKlient.cpp 2.5 KB

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