123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- #include "Patcher.h"
- #include <Datei.h>
- #include <Text.h>
- #include <InitDatei.h>
- #include <Text.h>
- #include <GSLDateiV.h>
- extern InitDatei *userOptions;
- typedef UpdaterV *( *GetUpdater )( KSGClient::PatchServerClient * );
- typedef GSL::GSLDateiV *( *GetGSLDatei )( );
- // Inhalt der Patcher Klasse aus Patcher.h
- // Konstruktor
- Patcher::Patcher( FBalken *fortschritt, TextFeld *status, Knopf *play, bool *close, KSGClient::PatchServerClient *client )
- : Thread()
- {
- if( !client )
- {
- updater = 0;
- MessageBox( 0, "Es steht kein Patch Client zur Verfügung.", "Fehler", MB_ICONERROR );
- }
- else
- {
- // Dll Laden
- updateDll = LoadLibrary( "data/bin/update.dll" );
- if( !updateDll )
- {
- updater = 0;
- MessageBox( 0, "Die DLL Datei 'data/bin/update.dll' wurde nicht gefunden.", "Fehler", MB_ICONERROR );
- }
- else
- {
- GetUpdater getUpdater = (GetUpdater)GetProcAddress( updateDll, "getUpdater" );
- if( !getUpdater )
- {
- updater = 0;
- MessageBox( 0, "Der Einstiegspunkt 'getUpdater' konnte in der DLL Datei 'data/bin/update.dll' nicht gefunden.", "Fehler", MB_ICONERROR );
- }
- else
- updater = getUpdater( client );
- }
- if( !updater )
- client->release();
- }
- // Initialisierung
- this->fortschritt = fortschritt;
- this->status = status;
- this->play = play;
- this->close = close;
- ret = 0;
- }
- // Destruktor
- Patcher::~Patcher()
- {
- fortschritt->release();
- status->release();
- play->release();
- if( updater )
- updater->release();
- FreeLibrary( updateDll );
- }
- // nicht constant
- void Patcher::startPatch()
- {
- start();
- }
- void Patcher::thread()
- {
- if( !updater )
- {
- status->lockZeichnung();
- status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
- status->unlockZeichnung();
- run = 0;
- return;
- }
- status->lockZeichnung();
- status->setText( "Suche nach Updates . . ." );
- status->unlockZeichnung();
- Text dgPfad;
- int gruppe = updater->getNextDateiGruppe( &dgPfad ); // Nächste Dateigruppe die geupdatet werden muss
- while( gruppe )
- {
- if( gruppe == -1 )
- { // error
- status->lockZeichnung();
- status->setText( "Es ist ein schwerer Fehler aufgetreten!" );
- status->unlockZeichnung();
- MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
- run = 0;
- return;
- }
- bool clientGruppe = !dgPfad.getLength();
- if( !clientGruppe )
- { // Das Spiel kann bereits gestartet werden
- play->addStyle( Knopf::Style::Sichtbar );
- ret = 2;
- }
- status->lockZeichnung();
- status->setText( "Update für '" );
- if( !clientGruppe )
- status->zText()->append( dgPfad.getText() );
- else
- status->zText()->append( "Client" );
- status->zText()->append( "'. . ." );
- status->unlockZeichnung();
- UpdateParams params;
- params.abbruch = close;
- params.dateiGruppe = gruppe;
- params.zFortschritt = fortschritt;
- params.zStatus = 0;
- int res = updater->update( ¶ms );
- if( res == 3 )
- { // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
- status->lockZeichnung();
- status->setText( "Klicke auf Play, um die verbleibenen Änderungen zu übernehmen." );
- status->unlockZeichnung();
- play->addStyle( Knopf::Style::Sichtbar );
- ret = 1;
- run = 0;
- return;
- }
- if( res == 2 )
- break;
- if( res == 1 )
- MessageBox( 0, updater->getError(), "Fehler", MB_ICONERROR );
- status->lockZeichnung();
- status->setText( "Suche nach Updates . . ." );
- status->unlockZeichnung();
- gruppe = updater->getNextDateiGruppe( &dgPfad );
- }
- status->lockZeichnung();
- status->setText( "Alle ausgewählten Dateien sind aktuell." );
- status->unlockZeichnung();
- play->addStyle( Knopf::Style::Sichtbar );
- ret = 2;
- HMODULE sDll = LoadLibrary( "data/bin/GSL.dll" );
- if( sDll )
- {
- GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( sDll, "getGSLDatei" );
- if( getGSLDatei )
- {
- GSL::GSLDateiV *sDatei = getGSLDatei();
- sDatei->setDatei( "data/sounds/popup.gsl" );
- sDatei->leseDaten();
- GSL::GSLSoundV *sound = sDatei->getSound( "info.wav" );
- sDatei->release();
- int vol = userOptions->wertExistiert( "GUISound" ) ? *userOptions->zWert( "GUISound" ) : 100;
- sound->setVolume( (int)( ( vol / 100.0 ) * 0xFFFF ), (int)( ( vol / 100.0 ) * 0xFFFF ) );
- sound->playSound();
- sound->warteAufSound( 3000 );
- sound->stopSound();
- sound->release();
- }
- FreeLibrary( sDll );
- }
- run = 0;
- }
- // constant
- bool Patcher::läuftPatch() const
- {
- return run;
- }
- int Patcher::getReturn() const
- {
- return ret;
- }
- void Patcher::warteAufPatch( int zeit )
- {
- warteAufThread( zeit );
- }
- int Patcher::getDownload() const
- {
- return updater ? updater->getDownload() : 0;
- }
- // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
- Thread *Patcher::release()
- {
- if( ref == 2 && run )
- {
- *close = 1;
- warteAufPatch( 5000 );
- if( run )
- ende();
- }
- return Thread::release();
- }
|