Patcher.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #include "Patcher.h"
  2. #include <Datei.h>
  3. #include <Text.h>
  4. #include <InitDatei.h>
  5. #include <Text.h>
  6. #include <GSLDateiV.h>
  7. typedef UpdaterV *( *GetUpdater )( KSGClient::PatchServerClient * );
  8. typedef GSL::GSLDateiV *( *GetGSLDatei )( );
  9. // Inhalt der Patcher Klasse aus Patcher.h
  10. // Konstruktor
  11. Patcher::Patcher( FBalken *fortschritt, TextFeld *status, Knopf *play, bool *close, KSGClient::PatchServerClient *client )
  12. : Thread()
  13. {
  14. if( !client )
  15. {
  16. updater = 0;
  17. MessageBox( 0, "Es steht kein Patch Client zur Verfügung.", "Fehler", MB_ICONERROR );
  18. }
  19. else
  20. {
  21. // Dll Laden
  22. updateDll = LoadLibrary( "data/bin/update.dll" );
  23. if( !updateDll )
  24. {
  25. updater = 0;
  26. MessageBox( 0, "Die DLL Datei 'data/bin/update.dll' wurde nicht gefunden.", "Fehler", MB_ICONERROR );
  27. }
  28. else
  29. {
  30. GetUpdater getUpdater = (GetUpdater)GetProcAddress( updateDll, "getUpdater" );
  31. if( !getUpdater )
  32. {
  33. updater = 0;
  34. MessageBox( 0, "Der Einstiegspunkt 'getUpdater' konnte in der DLL Datei 'data/bin/update.dll' nicht gefunden.", "Fehler", MB_ICONERROR );
  35. }
  36. else
  37. updater = getUpdater( client );
  38. }
  39. if( !updater )
  40. client->release();
  41. }
  42. // Initialisierung
  43. this->fortschritt = fortschritt;
  44. this->status = status;
  45. this->play = play;
  46. this->close = close;
  47. ret = 0;
  48. ref = 1;
  49. }
  50. // Destruktor
  51. Patcher::~Patcher()
  52. {
  53. if( run )
  54. {
  55. *close = 1;
  56. warteAufPatch( 5000 );
  57. }
  58. if( run )
  59. ende();
  60. fortschritt->release();
  61. status->release();
  62. play->release();
  63. if( updater )
  64. updater->release();
  65. FreeLibrary( updateDll );
  66. }
  67. // nicht constant
  68. void Patcher::startPatch()
  69. {
  70. start();
  71. }
  72. void Patcher::thread()
  73. {
  74. if( !updater )
  75. {
  76. status->lockZeichnung();
  77. status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
  78. status->unlockZeichnung();
  79. run = 0;
  80. return;
  81. }
  82. status->lockZeichnung();
  83. status->setText( "Suche nach Updates . . ." );
  84. status->unlockZeichnung();
  85. Text dgPfad;
  86. int gruppe = updater->getNextDateiGruppe( &dgPfad ); // Nächste Dateigruppe die geupdatet werden muss
  87. while( gruppe )
  88. {
  89. if( gruppe == -1 )
  90. { // error
  91. status->lockZeichnung();
  92. status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
  93. status->unlockZeichnung();
  94. MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
  95. run = 0;
  96. return;
  97. }
  98. bool clientGruppe = !dgPfad.getLength();
  99. if( !clientGruppe )
  100. { // Das Spiel kann bereits gestartet werden
  101. play->addStyle( Knopf::Style::Sichtbar );
  102. ret = 2;
  103. }
  104. status->lockZeichnung();
  105. status->setText( "Update für '" );
  106. if( !clientGruppe )
  107. status->zText()->append( dgPfad.getText() );
  108. else
  109. status->zText()->append( "Client" );
  110. status->zText()->append( "'. . ." );
  111. status->unlockZeichnung();
  112. UpdateParams params;
  113. params.abbruch = close;
  114. params.dateiGruppe = gruppe;
  115. params.zFortschritt = fortschritt;
  116. params.zStatus = 0;
  117. int res = updater->update( &params );
  118. if( res == 3 )
  119. { // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
  120. status->lockZeichnung();
  121. status->setText( "Klicke auf Play, um die verbleibenen Änderungen zu übernehmen." );
  122. status->unlockZeichnung();
  123. play->addStyle( Knopf::Style::Sichtbar );
  124. ret = 1;
  125. run = 0;
  126. return;
  127. }
  128. if( res == 2 )
  129. break;
  130. if( res == 1 )
  131. MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
  132. status->lockZeichnung();
  133. status->setText( "Suche nach Updates . . ." );
  134. status->unlockZeichnung();
  135. gruppe = updater->getNextDateiGruppe( &dgPfad );
  136. }
  137. status->lockZeichnung();
  138. status->setText( "Alle ausgewählten Dateien sind aktuell." );
  139. status->unlockZeichnung();
  140. play->addStyle( Knopf::Style::Sichtbar );
  141. ret = 2;
  142. HMODULE sDll = LoadLibrary( "data/bin/GSL.dll" );
  143. if( sDll )
  144. {
  145. GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( sDll, "getGSLDatei" );
  146. if( getGSLDatei )
  147. {
  148. GSL::GSLDateiV *sDatei = getGSLDatei();
  149. sDatei->setDatei( "data/sounds/popup.gsl" );
  150. sDatei->leseDaten();
  151. GSL::GSLSoundV *sound = sDatei->getSound( "info.wav" );
  152. sDatei->release();
  153. sound->setVolume( 0xFFFF, 0xFFFF );
  154. sound->playSound();
  155. sound->warteAufSound( 3000 );
  156. sound->stopSound();
  157. sound->release();
  158. }
  159. FreeLibrary( sDll );
  160. }
  161. run = 0;
  162. }
  163. // constant
  164. bool Patcher::läuftPatch() const
  165. {
  166. return run;
  167. }
  168. int Patcher::getReturn() const
  169. {
  170. return ret;
  171. }
  172. void Patcher::warteAufPatch( int zeit )
  173. {
  174. warteAufThread( zeit );
  175. }
  176. int Patcher::getDownload() const
  177. {
  178. return updater ? updater->getDownload() : 0;
  179. }
  180. // Reference Counting
  181. Patcher *Patcher::getThis()
  182. {
  183. ref++;
  184. return this;
  185. }
  186. Patcher *Patcher::release()
  187. {
  188. ref--;
  189. if( !ref )
  190. delete this;
  191. return 0;
  192. }