Patcher.cpp 4.2 KB

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