Forráskód Böngészése

Einiege Fehler behoben

Kolja Strohm 6 éve
szülő
commit
4b42f2f061

+ 2 - 0
KSGClient/Global/Variablen.cpp

@@ -3,6 +3,7 @@
 #include <Punkt.h>
 #include <DateiSystem.h>
 #include "../Netzwerk/KSGServer.h"
+#include "../Leser/KartenLeser.h"
 
 void initVariables( Schrift *zSchrift, Bildschirm *zBildschirm )
 {
@@ -110,6 +111,7 @@ void releaseVariables()
         cmProcessor = cmProcessor->release();
     if( smProcessor )
         smProcessor = smProcessor->release();
+    KartenLeser::cleanUp();
 	if( bilder )
 	{
 		bilder->release();

+ 2 - 1
KSGClient/KSGClient.vcxproj

@@ -125,7 +125,8 @@ copy "..\..\Minigames\Snake\x64\Debug\Snake.dll" "data\Minigames\Snake\bin\game.
 copy "..\..\Minigames\Tetris\x64\Debug\Tetris.dll" "data\Minigames\Tetris\bin\game.dll"
 copy "..\..\..\Spiele\Klient\Asteroids\x64\Debug\Asteroids.dll" "data\spiele\Asteroids\bin\Asteroids.dll"
 copy "..\..\..\Spiele\Klient\Linie\x64\Debug\Linie.dll" "data\spiele\Linie\bin\Linie.dll"
-copy "..\x64\Debug\KSGClient.exe" "..\..\Fertig\Debug\x64\data\client\bin\game client.exe"</Command>
+copy "..\x64\Debug\KSGClient.exe" "..\..\Fertig\Debug\x64\data\client\bin\game client.exe"
+copy "..\..\KSGNetwork\x64\Debug\KSGNetwork.dll" "data\bin\KSGNetwork.dll"</Command>
     </CustomBuildStep>
     <CustomBuildStep>
       <Outputs>kopieren...;%(Outputs)</Outputs>

+ 58 - 16
KSGClient/Leser/KartenLeser.cpp

@@ -6,11 +6,36 @@
 #include <Bild.h>
 #include <Punkt.h>
 
+KartenLeser KartenLeser::instance;
+
+KartenLeser *KartenLeser::getInstance()
+{
+    return instance.getThis();
+}
+
+void KartenLeser::cleanUp()
+{
+    instance = KartenLeser();
+}
+
+KartenLeser &KartenLeser::operator=( const KartenLeser &l )
+{
+    if( kartenClient )
+        kartenClient->release();
+    letzterFehler->release();
+    letzterFehler = new Text( l.letzterFehler->getText() );
+    kartenClient = 0;
+    karteId = 0;
+    ref = 1;
+    return *this;
+}
+
 // Inhalt der KartenLeser Klasse aus KartenLeser.h
 // Konstruktor
 KartenLeser::KartenLeser()
 {
     letzterFehler = new Text( "" );
+    kartenClient = 0;
     karteId = 0;
     ref = 1;
 }
@@ -18,22 +43,39 @@ KartenLeser::KartenLeser()
 // Destruktor
 KartenLeser::~KartenLeser()
 {
+    if( kartenClient )
+        kartenClient->release();
     letzterFehler->release();
 }
 
 // nicht constant
 void KartenLeser::setKarteId( int karteId )
 {
+    cs.lock();
     this->karteId = karteId;
+    if( kartenClient )
+        kartenClient->release();
+    kartenClient = infoClient->createKartenServerClient( karteId );
+    cs.unlock();
+}
+
+void KartenLeser::lock()
+{
+    cs.lock();
+}
+
+void KartenLeser::unlock()
+{
+    cs.unlock();
 }
 
 // constant
-Bild *KartenLeser::getKartenTitelBild( Schrift *zSchrift ) const
+Bild *KartenLeser::getKartenTitelBild( Schrift *zSchrift )
 {
     bool ok = 1;
     int port = 0;
     Text ip;
-    KSGClient::KartenServerClient *kartenClient = infoClient->createKartenServerClient( karteId );
+    cs.lock();
     if( !kartenClient->verbinde() )
     {
         letzterFehler->setText( kartenClient->getLetzterFehler() );
@@ -44,8 +86,8 @@ Bild *KartenLeser::getKartenTitelBild( Schrift *zSchrift ) const
         letzterFehler->setText( kartenClient->getLetzterFehler() );
         ok = 0;
     }
-    kartenClient->trenne( 1 );
-    kartenClient->release();
+    kartenClient->trenne( 0 );
+    cs.unlock();
     Bild *ret = 0;
     if( ok )
     {
@@ -72,11 +114,11 @@ Bild *KartenLeser::getKartenTitelBild( Schrift *zSchrift ) const
     return ret;
 }
 
-Bild *KartenLeser::getKartenVorschauBild() const
+Bild *KartenLeser::getKartenVorschauBild()
 {
     int port = 0;
     Text ip;
-    KSGClient::KartenServerClient *kartenClient = infoClient->createKartenServerClient( karteId );
+    cs.lock();
     if( !kartenClient->verbinde() )
     {
         letzterFehler->setText( kartenClient->getLetzterFehler() );
@@ -87,8 +129,8 @@ Bild *KartenLeser::getKartenVorschauBild() const
         letzterFehler->setText( kartenClient->getLetzterFehler() );
         return 0;
     }
-    kartenClient->trenne( 1 );
-    kartenClient->release();
+    kartenClient->trenne( 0 );
+    cs.unlock();
     Text *pfad = getKartePfad();
     pfad->append( "minimap.ltdb" );
     Bild *ret = 0;
@@ -102,11 +144,11 @@ Bild *KartenLeser::getKartenVorschauBild() const
     return ret;
 }
 
-Bild *KartenLeser::getLadeBild() const
+Bild *KartenLeser::getLadeBild()
 {
     int port = 0;
     Text ip;
-    KSGClient::KartenServerClient *kartenClient = infoClient->createKartenServerClient( karteId );
+    cs.lock();
     if( !kartenClient->verbinde() )
     {
         letzterFehler->setText( kartenClient->getLetzterFehler() );
@@ -117,8 +159,8 @@ Bild *KartenLeser::getLadeBild() const
         letzterFehler->setText( kartenClient->getLetzterFehler() );
         return 0;
     }
-    kartenClient->trenne( 1 );
-    kartenClient->release();
+    kartenClient->trenne( 0 );
+    cs.unlock();
     Text *pfad = getKartePfad();
     pfad->append( "ladebild.ltdb" );
     Bild *ret = 0;
@@ -132,11 +174,11 @@ Bild *KartenLeser::getLadeBild() const
     return ret;
 }
 
-bool KartenLeser::getKartenBeschreibung() const
+bool KartenLeser::getKartenBeschreibung()
 {
     int port = 0;
     Text ip;
-    KSGClient::KartenServerClient *kartenClient = infoClient->createKartenServerClient( karteId );
+    cs.lock();
     if( !kartenClient->verbinde() )
     {
         letzterFehler->setText( kartenClient->getLetzterFehler() );
@@ -147,8 +189,8 @@ bool KartenLeser::getKartenBeschreibung() const
         letzterFehler->setText( kartenClient->getLetzterFehler() );
         return 0;
     }
-    kartenClient->trenne( 1 );
-    kartenClient->release();
+    kartenClient->trenne( 0 );
+    cs.unlock();
     return 1;
 }
 

+ 18 - 7
KSGClient/Leser/KartenLeser.h

@@ -4,28 +4,39 @@
 #include <Klient.h>
 #include <Bild.h>
 #include <Schrift.h>
+#include <KSGNetwork.h>
 
 using namespace Framework;
 
 class KartenLeser
 {
 private:
-	Text *letzterFehler;
+    Text *letzterFehler;
+    KSGClient::KartenServerClient *kartenClient;
 	int karteId;
+    Critical cs;
 	int ref;
 
+    static KartenLeser instance;
+    // Konstruktor
+    KartenLeser();
+
+    KartenLeser &operator=( const KartenLeser &l );
 public:
-	// Konstruktor
-	KartenLeser();
+    static KartenLeser *getInstance();
+    static void cleanUp();
+
 	// Destruktor
 	~KartenLeser();
 	// nicht constant
 	void setKarteId( int karteId );
+    void lock();
+    void unlock();
 	// constant
-	Bild *getKartenTitelBild( Schrift *zSchrift ) const;
-	Bild *getKartenVorschauBild() const;
-	Bild *getLadeBild() const;
-	bool getKartenBeschreibung() const;
+	Bild *getKartenTitelBild( Schrift *zSchrift );
+	Bild *getKartenVorschauBild();
+	Bild *getLadeBild();
+	bool getKartenBeschreibung();
 	int getSpielId() const;
 	int getKarteId() const;
 	Text *getSpielName() const;

+ 29 - 10
KSGClient/NachLogin/Account/Historie/AccountHistorie.cpp

@@ -59,12 +59,14 @@ bool AHSpielStatistik::ladeDaten( int spielId, int karteId )
 {
 	if( dllHandle )
 		reset();
-	KartenLeser *reader = new KartenLeser();
+	KartenLeser *reader = KartenLeser::getInstance();
+    reader->lock();
 	reader->setKarteId( karteId );
 	Text *pfad = reader->getSpielPfad();
 	if( !pfad )
 	{
 		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
+        reader->unlock();
 		reader->release();
 		return 0;
 	}
@@ -73,12 +75,14 @@ bool AHSpielStatistik::ladeDaten( int spielId, int karteId )
 	if( !spielArtName )
 	{
 		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
+        reader->unlock();
 		reader->release();
 		pfad->release();
 		return 0;
 	}
 	pfad->append( spielArtName->getText() );
 	pfad->append( ".dll" );
+    reader->unlock();
 	reader->release();
 	dllName->setText( "Spiele/" );
 	dllName->append( spielArtName->getText() );
@@ -132,14 +136,25 @@ void AHSpielStatistik::thread()
 {
 	laden->setSichtbar( 1 );
     KSGClient::HistorieServerClient *historieClient = infoClient->createHistorieServerClient( spielId );
-	if( !historieClient->downloadSpielHistorie() )
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( historieClient->getLetzterFehler() ), new Text( "Ok" ) );
-    historieClient->release();
-    statistik->ladeDaten( spielId );
-	laden->setSichtbar( 0 );
-	if( sichtbar )
-		statistik->setSichtbar( 1 );
-	run = 0;
+    if( !historieClient )
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( infoClient->getLetzterFehler() ), new Text( "Ok" ) );
+    else
+    {
+        if( !historieClient->downloadSpielHistorie() )
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( historieClient->getLetzterFehler() ), new Text( "Ok" ) );
+        else
+        {
+            statistik->ladeDaten( spielId );
+            if( sichtbar )
+                statistik->setSichtbar( 1 );
+            laden->setSichtbar( 0 );
+            historieClient->release();
+            return;
+        }
+        historieClient->release();
+    }
+    laden->setSichtbar( 0 );
+    setSichtbar( 0 );
 }
 
 void AHSpielStatistik::setPosition( int x, int y )
@@ -300,12 +315,14 @@ bool AHSpielVideo::ladeDaten( int spielId, int karteId )
 {
 	if( dllHandle )
 		reset();
-	KartenLeser *reader = new KartenLeser();
+	KartenLeser *reader = KartenLeser::getInstance();
+    reader->lock();
 	reader->setKarteId( karteId );
 	Text *pfad = reader->getSpielPfad();
 	if( !pfad )
 	{
 		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
+        reader->unlock();
 		reader->release();
 		return 0;
 	}
@@ -314,12 +331,14 @@ bool AHSpielVideo::ladeDaten( int spielId, int karteId )
 	if( !spielArtName )
 	{
 		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
+        reader->unlock();
 		reader->release();
 		pfad->release();
 		return 0;
 	}
 	pfad->append( spielArtName->getText() );
 	pfad->append( ".dll" );
+    reader->unlock();
 	reader->release();
 	dllName->setText( "Spiele/" );
 	dllName->append( spielArtName->getText() );

+ 3 - 1
KSGClient/NachLogin/ImSpiel/ImSpiel.cpp

@@ -110,7 +110,8 @@ void ImSpiel::endLaden()
 
 void ImSpiel::thread()
 {
-	KartenLeser *reader = new KartenLeser();
+	KartenLeser *reader = KartenLeser::getInstance();
+    reader->lock();
 	reader->setKarteId( karteId );
 	Text *pfad = reader->getSpielPfad();
 	pfad->append( "bin/" );
@@ -118,6 +119,7 @@ void ImSpiel::thread()
 	pfad->append( ".dll" );
 	dllName->setText( "Spiele/" );
 	dllName->append( reader->getSpielName() );
+    reader->unlock();
 	reader->release();
 	dllName->append( ".dll" );
 	mainDll = dllDateien->ladeDLL( *dllName, *pfad );

+ 3 - 1
KSGClient/NachLogin/ImSpiel/Laden/SpielLaden.cpp

@@ -448,9 +448,11 @@ void SpielLaden::setSichtbar( bool sichtbar )
 
 void SpielLaden::thread()
 {
-	KartenLeser *reader = new KartenLeser();
+	KartenLeser *reader = KartenLeser::getInstance();
+    reader->lock();
 	reader->setKarteId( karteId );
 	hintergrundBild = reader->getLadeBild();
+    reader->unlock();
 	reader->release();
 	if( hintergrundBild )
 		geladen = 1;

+ 6 - 1
KSGClient/NachLogin/Spiele/Gruppe/Gruppe.cpp

@@ -2108,13 +2108,15 @@ void GruppeKarte::thread()
 		run = 0;
 		return;
 	}
-	KartenLeser *karte = new KartenLeser();
+	KartenLeser *karte = KartenLeser::getInstance();
+    karte->lock();
 	karte->setKarteId( karteId );
 	hintergrund = karte->getKartenVorschauBild();
 	if( exit )
 	{
 		if( hintergrund )
 			hintergrund = hintergrund->release();
+        karte->unlock();
 		karte->release();
 		run = 0;
 		return;
@@ -2130,6 +2132,7 @@ void GruppeKarte::thread()
 		fehler = initTextFeld( gr.x / 2 - ( br + 10 ) / 2, gr.y / 2 - ( hö + 4 ) / 2, br + 10, hö + 4,
 							   schrift, TextFeld::Style::Text | TextFeld::Style::Center, f->getText() );
 		f->release();
+        karte->unlock();
 		karte->release();
 		run = 0;
 		return;
@@ -2161,10 +2164,12 @@ void GruppeKarte::thread()
 		fehler = initTextFeld( gr.x / 2 - ( br + 10 ) / 2, gr.y / 2 - ( hö + 4 ) / 2, br + 10, hö + 4,
 							   schrift, TextFeld::Style::Text | TextFeld::Style::Center, f->getText() );
 		f->release();
+        karte->unlock();
 		karte->release();
 		run = 0;
 		return;
 	}
+    karte->unlock();
 	karte->release();
 	geladen = 1;
 	run = 0;

+ 27 - 6
KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.cpp

@@ -49,13 +49,17 @@ void KarteDaten::Loader::thread()
     }
     else
     {
-        KartenLeser *mapReader = new KartenLeser();
+        KartenLeser *mapReader = KartenLeser::getInstance();
+        mapReader->lock();
         mapReader->setKarteId( kd->karteId );
-        if( !kd->hintergrund )
-            kd->hintergrund = mapReader->getKartenTitelBild( kd->schrift );
-        if( !kd->geladen )
-            kd->geladen = 1;
-        kd->rend = 1;
+        if( aktion == 1 )
+        {
+            if( !kd->hintergrund )
+                kd->hintergrund = mapReader->getKartenTitelBild( kd->schrift );
+            if( !kd->geladen )
+                kd->geladen = 1;
+            kd->rend = 1;
+        }
         if( aktion == 2 )
         {
             if( !mapReader->getKartenBeschreibung() )
@@ -97,9 +101,26 @@ void KarteDaten::Loader::thread()
                                                               new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
             }
             if( kd->beschreibung )
+            {
                 kd->geladen = 2;
+                if( kd->ausgewählt )
+                {
+                    kd->animation |= 0x4;
+                    kd->beschreibung->neuLaden();
+                    KSGSGetVariable getKSGSVar = (KSGSGetVariable)GetProcAddress( kd->ksgs, KSGS_VARIABLE_FUNKTION );
+                    RCArray< KSGSVariable > *params = new RCArray< KSGSVariable >();
+                    KSGSVariableDef p1;
+                    p1.typId = KSGS_BOOL;
+                    p1.wert = (int)kd->erlaubt;
+                    params->add( getKSGSVar( kd->beschreibung, &p1 ) );
+                    KSGSVariable *var = kd->beschreibung->startFunktion( kd->beschreibung->getFunktionId( "_set_Erlaubt" ), params );
+                    if( var )
+                        var->release();
+                }
+            }
             kd->rend = 1;
         }
+        mapReader->unlock();
         mapReader->release();
     }
     if( !kd->erlaubt )

+ 74 - 65
KSGClient/Netzwerk/Patcher.cpp

@@ -2,102 +2,111 @@
 #include <Text.h>
 #include "../Global/Variablen.h"
 
-typedef UpdaterV *( *GetUpdater )( );
+typedef UpdaterV *( *GetUpdater )( KSGClient::PatchServerClient* );
 
 // Inhalt der Patcher Klasse aus Patcher.h
 // Konstruktor
 Patcher::Patcher()
 {
-	updater = 0;
-	updateDll = 0;
-	läuft = 0;
-	ref = 1;
+    updater = 0;
+    updateDll = 0;
+    läuft = 0;
+    ref = 1;
 }
 
 // Destruktor
 Patcher::~Patcher()
 {
-	if( updater )
-		updater->release();
-	if( updateDll )
-		FreeLibrary( updateDll );
+    if( updater )
+        updater->release();
+    if( updateDll )
+        FreeLibrary( updateDll );
 }
 
 // nicht constant
 bool Patcher::update( int dateiGruppe, bool *abbruch, FBalken *fortschritt, TextFeld *status, Text *zError )
 {
-	if( läuft )
-	{
-		zError->setText( "Es kann nur ein Update zur Zeit herruntergeladen werden." );
-		fortschritt->release();
-		status->release();
-		return 0;
-	}
-	läuft = 1;
-	if( !updater )
-	{
-		if( !updateDll )
-		    updateDll = dllDateien->ladeDLL("update.dll","data/bin/update.dll" );
-		if( !updateDll )
-		{
-			updater = 0;
-			zError->setText( "Die DLL Datei 'data/bin/update.dll' wurde nicht gefunden." );
-		}
-		else
-		{
-			GetUpdater getUpdater = (GetUpdater)GetProcAddress( updateDll, "getUpdater" );
-			if( !getUpdater )
-			{
-				updater = 0;
-				zError->setText( "Der Einstiegspunkt 'getUpdater' konnte in der DLL Datei 'data/bin/update.dll' nicht gefunden." );
-			}
-			else
-				updater = getUpdater();
-		}
-	}
-	if( !updater )
-	{
-		fortschritt->release();
-		status->release();
-		läuft = 0;
-		return 0;
-	}
-	UpdateParams p;
-	p.abbruch = abbruch;
-	p.dateiGruppe = dateiGruppe;
-	p.zFortschritt = fortschritt;
-	p.zStatus = status;
-	int ret = updater->update( &p );
-	fortschritt->release();
-	status->release();
-	if( ret == 1 )
-		zError->setText( updater->getError() );
-	läuft = 0;
-	return ret != 1;
+    if( läuft )
+    {
+        zError->setText( "Es kann nur ein Update zur Zeit herruntergeladen werden." );
+        fortschritt->release();
+        status->release();
+        return 0;
+    }
+    läuft = 1;
+    if( !updater )
+    {
+        if( !updateDll )
+            updateDll = dllDateien->ladeDLL( "update.dll", "data/bin/update.dll" );
+        if( !updateDll )
+        {
+            updater = 0;
+            zError->setText( "Die DLL Datei 'data/bin/update.dll' wurde nicht gefunden." );
+        }
+        else
+        {
+            GetUpdater getUpdater = (GetUpdater)GetProcAddress( updateDll, "getUpdater" );
+            if( !getUpdater )
+            {
+                updater = 0;
+                zError->setText( "Der Einstiegspunkt 'getUpdater' konnte in der DLL Datei 'data/bin/update.dll' nicht gefunden." );
+            }
+            else
+            {
+                KSGClient::PatchServerClient *patchClient = mainClient->createPatchServerClient();
+                if( !patchClient )
+                {
+                    updater = 0;
+                    zError->setText( mainClient->getLetzterFehler() );
+                }
+                else
+                    updater = getUpdater( patchClient );
+            }
+        }
+    }
+    if( !updater )
+    {
+        fortschritt->release();
+        status->release();
+        läuft = 0;
+        return 0;
+    }
+    UpdateParams p;
+    p.abbruch = abbruch;
+    p.dateiGruppe = dateiGruppe;
+    p.zFortschritt = fortschritt;
+    p.zStatus = status;
+    int ret = updater->update( &p );
+    fortschritt->release();
+    status->release();
+    if( ret == 1 )
+        zError->setText( updater->getError() );
+    läuft = 0;
+    return ret != 1;
 }
 
 // constant
 bool Patcher::läuftPatch() const
 {
-	return läuft;
+    return läuft;
 }
 
 int Patcher::getDownload() const
 {
-	return updater ? updater->getDownload() : 0;
+    return updater ? updater->getDownload() : 0;
 }
 
 // Reference Counting
 Patcher *Patcher::getThis()
 {
-	ref++;
-	return this;
+    ref++;
+    return this;
 }
 
 Patcher *Patcher::release()
 {
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
 }

+ 1 - 1
KSGClient/VorLogin/Login/Login.cpp

@@ -29,7 +29,7 @@ Login::Login( Schrift *zSchrift, Fenster *vorLoginFenster )
 	weiter->setMausEreignisParameter( this );
 	weiter->setMausEreignis( loginWeiterME );
 	fenster->addMember( weiter );
-	nachricht = initTextFeld( 5, 5, 238, 50, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
+	nachricht = initTextFeld( 5, 5, 238, 90, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
 	fenster->addMember( nachricht );
 	geheimnis = initTextFeld( 20, 55, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimnis" );
 	geheimnis->removeStyle( TextFeld::Style::Sichtbar );