Browse Source

framework changes

Kolja Strohm 1 year ago
parent
commit
c63f579afc
4 changed files with 652 additions and 652 deletions
  1. 2 2
      Update/Einstieg.cpp
  2. 4 4
      Update/Update.vcxproj
  3. 634 634
      Update/Updater.cpp
  4. 12 12
      Update/Updater.h

+ 2 - 2
Update/Einstieg.cpp

@@ -2,8 +2,8 @@
 
 extern "C"
 {
-	__declspec( dllexport ) UpdaterV *getUpdater( KSGClient::PatchServerClient *psc )
+	__declspec(dllexport) UpdaterV* getUpdater(KSGClient::PatchServerClient* psc)
 	{
-		return new Updater( psc );
+		return new Updater(psc);
 	}
 }

+ 4 - 4
Update/Update.vcxproj

@@ -28,26 +28,26 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>

+ 634 - 634
Update/Updater.cpp

@@ -6,659 +6,659 @@
 
 // Inhalt der Updater Klasse aus Updater.h
 // Konstruktor
-Updater::Updater( KSGClient::PatchServerClient *psc )
-    : ReferenceCounter()
+Updater::Updater(KSGClient::PatchServerClient* psc)
+	: ReferenceCounter()
 {
-    client = psc;
-    fehler = new Text();
+	client = psc;
+	fehler = new Text();
 }
 
 // Destruktor
 Updater::~Updater()
 {
-    if( client->istVerbunden() )
-        client->trenne( 1 );
-    client->release();
-    fehler->release();
+	if (client->istVerbunden())
+		client->trenne(1);
+	client->release();
+	fehler->release();
 }
 
 // nicht constant
-int Updater::getNextDateiGruppe( Text *zDgPfad )
+int Updater::getNextDateiGruppe(Text* zDgPfad)
 {
-    if( !client->istVerbunden() && !client->verbinde() )
-    {
-        fehler->setText( client->getLetzterFehler() );
-        return -1;
-    }
-    KSGTDatei *sDgTb = client->getDateiGruppenListe();
-    if( !sDgTb )
-    {
-        fehler->setText( client->getLetzterFehler() );
-        client->trenne( 0 );
-        return -1;
-    }
-    client->trenne( 0 );
-    KSGTDatei *lDgTb = new KSGTDatei( "data/dg.ksgt" ); // Tabellen Spalten: Id, Pfad, Version, Priorität
-    lDgTb->laden();
-    InitDatei *ur = new InitDatei();
-    for( int i = 0; i < sDgTb->getZeilenAnzahl(); i++ )
-    {
-        int id = TextZuInt( sDgTb->zFeld( i, 0 )->getText(), 10 );
-        int vs = TextZuInt( sDgTb->zFeld( i, 2 )->getText(), 10 );
-        bool gefunden = 0;
-        for( int j = 0; j < lDgTb->getZeilenAnzahl(); j++ )
-        {
-            if( id == TextZuInt( lDgTb->zFeld( j, 0 )->getText(), 10 ) )
-            {
-                if( vs != TextZuInt( lDgTb->zFeld( j, 2 )->getText(), 10 ) )
-                {
-                    if( !sDgTb->zFeld( i, 1 )->getLength() )
-                        ur->addWert( sDgTb->zFeld( i, 0 )->getText(), "SOFORT" );
-                    else if( !lDgTb->zFeld( j, 3 )->istGleich( "NICHT" ) )
-                        ur->addWert( sDgTb->zFeld( i, 0 )->getText(), lDgTb->zFeld( j, 3 )->getText() );
-                }
-                gefunden = 1;
-                break;
-            }
-        }
-        if( gefunden )
-            continue;
-        if( !sDgTb->zFeld( i, 1 )->getLength() )
-            ur->addWert( sDgTb->zFeld( i, 0 )->getText(), "SOFORT" );
-        else if( DateiExistiert( sDgTb->getFeld( i, 1 ) ) )
-            ur->addWert( sDgTb->zFeld( i, 0 )->getText(), "SPÄTER" );
-    }
-    lDgTb->release();
-    if( !ur->getWertAnzahl() )
-    {
-        ur->release();
-        sDgTb->release();
-        return 0;
-    }
-    int gruppe = 0;
-    for( int i = 0; i < ur->getWertAnzahl(); i++ )
-    {
-        if( ur->zWert( i )->istGleich( "SOFORT" ) )
-        {
-            gruppe = TextZuInt( ur->zName( i )->getText(), 10 );
-            break;
-        }
-    }
-    if( !gruppe )
-    {
-        unsigned int klein = 0xFFFFFFFF;
-        for( int i = 0; i < ur->getWertAnzahl(); i++ )
-        {
-            if( !ur->zWert( i )->istGleich( "SPÄTER" ) )
-            {
-                unsigned int num = TextZuInt( ur->zWert( i )->getText(), 10 );
-                if( num < klein )
-                {
-                    klein = num;
-                    gruppe = TextZuInt( ur->zName( i )->getText(), 10 );
-                }
-            }
-        }
-        if( !gruppe )
-        {
-            for( int i = 0; i < ur->getWertAnzahl(); i++ )
-            {
-                if( ur->zWert( i )->istGleich( "SPÄTER" ) )
-                {
-                    gruppe = TextZuInt( ur->zName( i )->getText(), 10 );
-                    break;
-                }
-            }
-        }
-    }
-    ur->release();
-    if( zDgPfad )
-    { // Pfad der Dateigruppe ermitteln
-        for( int i = 0; i < sDgTb->getZeilenAnzahl(); i++ )
-        {
-            if( gruppe == TextZuInt( sDgTb->zFeld( i, 0 )->getText(), 10 ) )
-            {
-                zDgPfad->setText( sDgTb->zFeld( i, 1 )->getText() );
-                break;
-            }
-        }
-    }
-    sDgTb->release();
-    return gruppe;
+	if (!client->istVerbunden() && !client->verbinde())
+	{
+		fehler->setText(client->getLetzterFehler());
+		return -1;
+	}
+	KSGTDatei* sDgTb = client->getDateiGruppenListe();
+	if (!sDgTb)
+	{
+		fehler->setText(client->getLetzterFehler());
+		client->trenne(0);
+		return -1;
+	}
+	client->trenne(0);
+	KSGTDatei* lDgTb = new KSGTDatei("data/dg.ksgt"); // Tabellen Spalten: Id, Pfad, Version, Priorität
+	lDgTb->laden();
+	InitDatei* ur = new InitDatei();
+	for (int i = 0; i < sDgTb->getZeilenAnzahl(); i++)
+	{
+		int id = TextZuInt(sDgTb->zFeld(i, 0)->getText(), 10);
+		int vs = TextZuInt(sDgTb->zFeld(i, 2)->getText(), 10);
+		bool gefunden = 0;
+		for (int j = 0; j < lDgTb->getZeilenAnzahl(); j++)
+		{
+			if (id == TextZuInt(lDgTb->zFeld(j, 0)->getText(), 10))
+			{
+				if (vs != TextZuInt(lDgTb->zFeld(j, 2)->getText(), 10))
+				{
+					if (!sDgTb->zFeld(i, 1)->getLength())
+						ur->addWert(sDgTb->zFeld(i, 0)->getText(), "SOFORT");
+					else if (!lDgTb->zFeld(j, 3)->istGleich("NICHT"))
+						ur->addWert(sDgTb->zFeld(i, 0)->getText(), lDgTb->zFeld(j, 3)->getText());
+				}
+				gefunden = 1;
+				break;
+			}
+		}
+		if (gefunden)
+			continue;
+		if (!sDgTb->zFeld(i, 1)->getLength())
+			ur->addWert(sDgTb->zFeld(i, 0)->getText(), "SOFORT");
+		else if (DateiExistiert(sDgTb->getFeld(i, 1)))
+			ur->addWert(sDgTb->zFeld(i, 0)->getText(), "SPÄTER");
+	}
+	lDgTb->release();
+	if (!ur->getWertAnzahl())
+	{
+		ur->release();
+		sDgTb->release();
+		return 0;
+	}
+	int gruppe = 0;
+	for (int i = 0; i < ur->getWertAnzahl(); i++)
+	{
+		if (ur->zWert(i)->istGleich("SOFORT"))
+		{
+			gruppe = TextZuInt(ur->zName(i)->getText(), 10);
+			break;
+		}
+	}
+	if (!gruppe)
+	{
+		unsigned int klein = 0xFFFFFFFF;
+		for (int i = 0; i < ur->getWertAnzahl(); i++)
+		{
+			if (!ur->zWert(i)->istGleich("SPÄTER"))
+			{
+				unsigned int num = TextZuInt(ur->zWert(i)->getText(), 10);
+				if (num < klein)
+				{
+					klein = num;
+					gruppe = TextZuInt(ur->zName(i)->getText(), 10);
+				}
+			}
+		}
+		if (!gruppe)
+		{
+			for (int i = 0; i < ur->getWertAnzahl(); i++)
+			{
+				if (ur->zWert(i)->istGleich("SPÄTER"))
+				{
+					gruppe = TextZuInt(ur->zName(i)->getText(), 10);
+					break;
+				}
+			}
+		}
+	}
+	ur->release();
+	if (zDgPfad)
+	{ // Pfad der Dateigruppe ermitteln
+		for (int i = 0; i < sDgTb->getZeilenAnzahl(); i++)
+		{
+			if (gruppe == TextZuInt(sDgTb->zFeld(i, 0)->getText(), 10))
+			{
+				zDgPfad->setText(sDgTb->zFeld(i, 1)->getText());
+				break;
+			}
+		}
+	}
+	sDgTb->release();
+	return gruppe;
 }
 
-int Updater::update( UpdateParams *zParams )
+int Updater::update(UpdateParams* zParams)
 {
-    if( zParams->zStatus )
-    {
-        zParams->zStatus->lockZeichnung();
-        zParams->zStatus->setText( "Verbinden . . ." );
-        zParams->zStatus->unlockZeichnung();
-    }
-    if( !client->istVerbunden() && !client->verbinde() )
-    {
-        fehler->setText( client->getLetzterFehler() );
-        return 1;
-    }
-    bool clientGruppe = 0;
-    KSGTDatei *dgL = client->getDateiGruppenListe();
-    if( !dgL )
-    {
-        fehler->setText( client->getLetzterFehler() );
-        client->trenne( 0 );
-        return 1;
-    }
-    Text *pfad = new Text( "" );
-    for( int i = 0; i < dgL->getZeilenAnzahl(); i++ )
-    { // Pfad der Dateigruppe ermitteln
-        if( zParams->dateiGruppe == TextZuInt( dgL->zFeld( i, 0 )->getText(), 10 ) )
-        {
-            pfad->setText( dgL->zFeld( i, 1 )->getText() );
-            if( !pfad->getLength() )
-                clientGruppe = 1;
-            break;
-        }
-    }
-    if( !clientGruppe )
-        pfad->append( "/" );
-    Text *dlPf = new Text( pfad->getText() );
-    dlPf->append( "data/update/datei_versionen.ini" );
-    InitDatei *dateiListe = new InitDatei( dlPf );
-    dateiListe->laden();
-    Text *dsPf = new Text( pfad->getText() );
-    dsPf->append( "data/update/datei_status.ini" );
-    InitDatei *dateiStatus = new InitDatei( dsPf );
-    dateiStatus->laden();
-    Text *llPf = new Text( pfad->getText() );
-    llPf->append( "data/update/datei_remove.patch" );
-    Datei *removeListe = new Datei();
-    removeListe->setDatei( llPf );
-    if( !removeListe->existiert() )
-        removeListe->erstellen();
-    removeListe->open( Datei::Style::schreiben );
-    KSGTDatei *dl = client->getDateiListe( zParams->dateiGruppe ); // Liste mit Dateien aus der Gruppe
-    if( !dl )
-    { // error
-        dgL->release();
-        pfad->release();
-        dateiListe->release();
-        dateiStatus->release();
-        removeListe->release();
-        fehler->setText( client->getLetzterFehler() );
-        client->trenne( 0 );
-        return 1;
-    }
-    for( int i = 0; i < dl->getZeilenAnzahl(); i++ )
-    {
-        if( dl->zFeld( i, 0 )->istGleich( "1" ) )
-        { // existierende Datei
-            if( !dateiListe->wertExistiert( dl->zFeld( i, 1 )->getText() ) )
-            {
-                dateiListe->addWert( dl->zFeld( i, 1 )->getText(), dl->zFeld( i, 2 )->getText() );
-                dateiStatus->addWert( dl->zFeld( i, 1 )->getText(), "Ausstehend" );
-            }
-            else
-            {
-                if( !dateiListe->zWert( dl->zFeld( i, 1 )->getText() )->istGleich( dl->zFeld( i, 2 )->getText() ) )
-                {
-                    dateiListe->setWert( dl->zFeld( i, 1 )->getText(), dl->zFeld( i, 2 )->getText() );
-                    dateiStatus->setWert( dl->zFeld( i, 1 )->getText(), "Ausstehend" );
-                }
-            }
-        }
-        else
-        { // gelöschte Datei
-            removeListe->schreibe( dl->zFeld( i, 1 )->getText(), dl->zFeld( i, 1 )->getLength() );
-            removeListe->schreibe( "\n", 1 );
-            dateiListe->removeWert( dl->zFeld( i, 1 )->getText() );
-            dateiStatus->removeWert( dl->zFeld( i, 1 )->getText() );
-        }
-    }
-    removeListe->close();
-    removeListe->release();
-    dateiListe->speichern();
-    dateiStatus->speichern();
-    dl->release();
-    Text *ldPf = new Text( pfad->getText() );
-    ldPf->append( "data/versionen.ini" );
-    InitDatei *lokaleDateien = new InitDatei( ldPf );
-    if( !lokaleDateien->laden() )
-        DateiPfadErstellen( lokaleDateien->zPfad()->getText() );
-    __int64 maxAktionen = 0;
-    for( int i = 0; i < dateiListe->getWertAnzahl(); i++ )
-    {
-        bool geändert = 0;
-        if( !lokaleDateien->wertExistiert( dateiListe->zName( i )->getText() ) )
-        {
-            geändert = 1;
-            if( dateiStatus->zWert( dateiListe->zName( i )->getText() ) &&
-                dateiStatus->zWert( dateiListe->zName( i )->getText() )->istGleich( "Fertig" ) )
-                geändert = 0;
-        }
-        else
-        {
-            if( !lokaleDateien->zWert( dateiListe->zName( i )->getText() )->istGleich( dateiListe->zWert( i )->getText() ) )
-                geändert = 1;
-            else
-                dateiStatus->setWert( dateiListe->zName( i )->getText(), "Fertig" );
-        }
-        if( geändert && !dateiStatus->zWert( dateiListe->zName( i )->getText() )->istGleich( "Fertig" ) )
-        {
-            maxAktionen += client->getDateiGröße( zParams->dateiGruppe, dateiListe->zName( i )->getText() );
-            if( dateiStatus->zWert( dateiListe->zName( i )->getText() )->istGleich( "InBearbeitung" ) )
-            {
-                Text *jPf = new Text( pfad->getText() );
-                jPf->append( "data/update/jetzt_position.patch" );
-                Datei *jetzt = new Datei();
-                jetzt->setDatei( jPf );
-                if( jetzt->open( Datei::Style::lesen ) )
-                {
-                    __int64 pos = 0;
-                    jetzt->lese( (char *)&pos, 8 );
-                    maxAktionen -= pos;
-                    jetzt->close();
-                }
-                jetzt->release();
-            }
-        }
-    }
-    dateiStatus->speichern();
-    if( zParams->zFortschritt )
-    {
-        zParams->zFortschritt->reset();
-        zParams->zFortschritt->setAktionAnzahl( maxAktionen );
-    }
-    for( int i = 0; i < dateiStatus->getWertAnzahl(); i++ )
-    {
-        if( dateiStatus->zWert( i )->istGleich( "InBearbeitung" ) )
-        {
-            Text *jPf = new Text( pfad->getText() );
-            jPf->append( "data/update/jetzt_position.patch" );
-            Datei *jetzt = new Datei();
-            jetzt->setDatei( jPf );
-            __int64 pos = 0;
-            if( jetzt->open( Datei::Style::lesen ) )
-            {
-                jetzt->lese( (char *)&pos, 8 );
-                jetzt->close();
-            }
-            jetzt->release();
-            Text *zielPf = new Text( pfad->getText() );
-            zielPf->append( "data/update/download/" );
-            zielPf->append( dateiStatus->zName( i )->getText() );
-            InitDatei *poIni = new InitDatei( "data/patch/po.ini" );
-            poIni->laden();
-            int maxbps = 0;
-            if( poIni->wertExistiert( "ülps" ) && poIni->zWert( "ülps" )->getLength() && poIni->wertExistiert( "üle" ) )
-            {
-                if( poIni->zWert( "üle" )->istGleich( "kb/s" ) )
-                    maxbps = (int)TextZuInt( poIni->zWert( "ülps" )->getText(), 10 ) * 1024;
-                if( poIni->zWert( "üle" )->istGleich( "mb/s" ) )
-                    maxbps = (int)TextZuInt( poIni->zWert( "ülps" )->getText(), 10 ) * 1024 * 1024;
-            }
-            poIni->release();
-            if( zParams->zStatus )
-            {
-                zParams->zStatus->lockZeichnung();
-                zParams->zStatus->setText( dateiStatus->zName( i )->getText() );
-                zParams->zStatus->unlockZeichnung();
-            }
-            if( client->downloadDatei( zParams->dateiGruppe, &pos, dateiStatus->zName( i )->getText(), zielPf->getText(), zParams->zFortschritt, zParams->abbruch, maxbps ) )
-            {
-                if( ( *zParams->abbruch ) )
-                { // übertragung unterbrochen
-                    jPf = new Text( pfad->getText() );
-                    jPf->append( "data/update/jetzt_position.patch" );
-                    jetzt = new Datei();
-                    jetzt->setDatei( jPf );
-                    if( jetzt->open( Datei::Style::schreiben ) )
-                    {
-                        jetzt->schreibe( (char *)&pos, 8 );
-                        jetzt->close();
-                    }
-                    jetzt->release();
-                    dgL->release();
-                    pfad->release();
-                    dateiListe->release();
-                    dateiStatus->release();
-                    zielPf->release();
-                    lokaleDateien->release();
-                    fehler->setText( "" );
-                    client->trenne( 0 );
-                    return 2;
-                }
-                else
-                {
-                    dateiStatus->setWert( i, "Fertig" );
-                    dateiStatus->speichern();
-                }
-            }
-            else
-            { // error
-                dgL->release();
-                pfad->release();
-                dateiListe->release();
-                dateiStatus->release();
-                zielPf->release();
-                lokaleDateien->release();
-                fehler->setText( client->getLetzterFehler() );
-                client->trenne( 0 );
-                return 1;
-            }
-            zielPf->release();
-            break;
-        }
-    }
-    for( int i = 0; i < dateiStatus->getWertAnzahl(); i++ )
-    {
-        if( dateiStatus->zWert( i )->istGleich( "Ausstehend" ) )
-        {
-            dateiStatus->setWert( i, "InBearbeitung" );
-            Text *jPf = new Text( pfad->getText() );
-            jPf->append( "data/update/jetzt_position.patch" );
-            Datei *jetzt = new Datei();
-            jetzt->setDatei( jPf );
-            __int64 pos = 0;
-            jetzt->open( Datei::Style::schreiben );
-            jetzt->schreibe( (char *)&pos, 8 );
-            jetzt->close();
-            jetzt->release();
-            dateiStatus->speichern();
-            Text *zielPf = new Text( pfad->getText() );
-            zielPf->append( "data/update/download/" );
-            zielPf->append( dateiStatus->zName( i )->getText() );
-            InitDatei *poIni = new InitDatei( "data/patch/po.ini" );
-            poIni->laden();
-            int maxbps = 0;
-            if( poIni->wertExistiert( "ülps" ) && poIni->zWert( "ülps" )->getLength() && poIni->wertExistiert( "üle" ) )
-            {
-                if( poIni->zWert( "üle" )->istGleich( "kb/s" ) )
-                    maxbps = (int)TextZuInt( poIni->zWert( "ülps" )->getText(), 10 ) * 1024;
-                if( poIni->zWert( "üle" )->istGleich( "mb/s" ) )
-                    maxbps = (int)TextZuInt( poIni->zWert( "ülps" )->getText(), 10 ) * 1024 * 1024;
-            }
-            poIni->release();
-            if( zParams->zStatus )
-            {
-                zParams->zStatus->lockZeichnung();
-                zParams->zStatus->setText( dateiStatus->zName( i )->getText() );
-                zParams->zStatus->unlockZeichnung();
-            }
-            if( client->downloadDatei( zParams->dateiGruppe, &pos, dateiStatus->zName( i )->getText(), zielPf->getText(), zParams->zFortschritt, zParams->abbruch, maxbps ) )
-            {
-                if( ( *zParams->abbruch ) )
-                { // übertragung unterbrochen
-                    jPf = new Text( pfad->getText() );
-                    jPf->append( "data/update/jetzt_position.patch" );
-                    jetzt = new Datei();
-                    jetzt->setDatei( jPf );
-                    if( jetzt->open( Datei::Style::schreiben ) )
-                    {
-                        jetzt->schreibe( (char *)&pos, 8 );
-                        jetzt->close();
-                    }
-                    jetzt->release();
-                    dgL->release();
-                    pfad->release();
-                    dateiListe->release();
-                    dateiStatus->release();
-                    zielPf->release();
-                    lokaleDateien->release();
-                    fehler->setText( "" );
-                    client->trenne( 0 );
-                    return 2;
-                }
-                else
-                {
-                    dateiStatus->setWert( i, "Fertig" );
-                    dateiStatus->speichern();
-                }
-            }
-            else
-            { // error
-                dgL->release();
-                pfad->release();
-                dateiListe->release();
-                dateiStatus->release();
-                zielPf->release();
-                lokaleDateien->release();
-                fehler->setText( client->getLetzterFehler() );
-                client->trenne( 0 );
-                return 1;
-            }
-            zielPf->release();
-        }
-    }
-    if( zParams->zStatus )
-    {
-        zParams->zStatus->lockZeichnung();
-        zParams->zStatus->setText( "Übernehme Änderungen..." );
-        zParams->zStatus->unlockZeichnung();
-    }
-    removeListe = new Datei();
-    llPf = new Text( pfad->getText() );
-    llPf->append( "data/update/datei_remove.patch" );
-    removeListe->setDatei( llPf );
-    removeListe->open( Datei::Style::lesen );
-    Text *zeile = removeListe->leseZeile();
-    while( zeile )
-    {
-        zeile->remove( "\r\n" );
-        zeile->remove( "\n" );
-        if( !zeile->getLength() )
-            break;
-        Text pf = pfad->getText();
-        pf += zeile->getText();
-        lokaleDateien->removeWert( zeile->getText() );
-        DateiRemove( pf );
-        zeile->release();
-        zeile = removeListe->leseZeile();
-    }
-    lokaleDateien->speichern();
-    removeListe->close();
-    removeListe->remove();
-    removeListe->release();
-    if( clientGruppe )
-    { // Es wird der Patcher selbst geupdatet
-        Text *uPf = new Text( pfad->getText() );
-        uPf->append( "data/update/unable/list.patch" );
-        Datei *unable = new Datei();
-        unable->setDatei( uPf );
-        unable->erstellen();
-        unable->open( Datei::Style::schreiben );
-        bool fertig = 1;
-        for( int i = 0; i < dateiStatus->getWertAnzahl(); i++ )
-        {
-            Text *altPfad = new Text( pfad->getText() );
-            altPfad->append( "data/update/download/" );
-            altPfad->append( dateiStatus->zName( i )->getText() );
-            Text *neuPfad = new Text( pfad->getText() );
-            neuPfad->append( dateiStatus->zName( i )->getText() );
-            if( DateiExistiert( altPfad->getText() ) )
-            {
-                bool b = 0;
-                if( !DateiExistiert( neuPfad->getText() ) )
-                    DateiPfadErstellen( neuPfad->getText() );
-                if( DateiExistiert( neuPfad->getText() ) )
-                {
-                    if( DateiRemove( neuPfad->getText() ) )
-                    {
-                        if( !DateiUmbenennen( altPfad->getText(), neuPfad->getText() ) )
-                            b = 1;
-                    }
-                    else
-                        b = 1;
-                }
-                else
-                {
-                    if( !DateiUmbenennen( altPfad->getText(), neuPfad->getText() ) )
-                        b = 1;
-                }
-                if( b )
-                {
-                    unable->schreibe( "\2", 1 );
-                    unable->schreibe( neuPfad->getText(), neuPfad->getLength() );
-                    unable->schreibe( "=>", 2 );
-                    unable->schreibe( altPfad->getText(), altPfad->getLength() );
-                    unable->schreibe( "\n", 1 );
-                    fertig = 0;
-                }
-            }
-            altPfad->release();
-            neuPfad->release();
-            if( !lokaleDateien->wertExistiert( dateiStatus->zName( i )->getText() ) )
-                lokaleDateien->addWert( dateiStatus->zName( i )->getText(), dateiListe->zWert( dateiStatus->zName( i )->getText() )->getText() );
-            else
-                lokaleDateien->setWert( dateiStatus->zName( i )->getText(), dateiListe->zWert( dateiStatus->zName( i )->getText() )->getText() );
-        }
-        unable->close();
-        if( fertig )
-            unable->remove();
-        unable->release();
-    }
-    else
-    { // Es werden Spiele und Karten geupdatet
-        for( int i = 0; i < dateiStatus->getWertAnzahl(); i++ )
-        {
-            Text *altPfad = new Text( pfad->getText() );
-            altPfad->append( "data/update/download/" );
-            altPfad->append( dateiStatus->zName( i )->getText() );
-            Text *neuPfad = new Text( pfad->getText() );
-            neuPfad->append( dateiStatus->zName( i )->getText() );
-            if( DateiExistiert( altPfad->getText() ) )
-            {
-                bool b = 0;
-                if( !DateiExistiert( neuPfad->getText() ) )
-                    DateiPfadErstellen( neuPfad->getText() );
-                if( DateiExistiert( neuPfad->getText() ) )
-                {
-                    if( DateiRemove( neuPfad->getText() ) )
-                    {
-                        if( !DateiUmbenennen( altPfad->getText(), neuPfad->getText() ) )
-                            b = 1;
-                    }
-                    else
-                        b = 1;
-                }
-                else
-                {
-                    if( !DateiUmbenennen( altPfad->getText(), neuPfad->getText() ) )
-                        b = 1;
-                }
-                if( b )
-                { // error
-                    dgL->release();
-                    pfad->release();
-                    lokaleDateien->speichern();
-                    lokaleDateien->release();
-                    dateiListe->release();
-                    dateiStatus->release();
-                    fehler->setText( client->getLetzterFehler() );
-                    client->trenne( 0 );
-                    return 1;
-                }
-            }
-            altPfad->release();
-            neuPfad->release();
-            if( !lokaleDateien->wertExistiert( dateiStatus->zName( i )->getText() ) )
-                lokaleDateien->addWert( dateiStatus->zName( i )->getText(), dateiListe->zWert( dateiStatus->zName( i )->getText() )->getText() );
-            else
-                lokaleDateien->setWert( dateiStatus->zName( i )->getText(), dateiListe->zWert( dateiStatus->zName( i )->getText() )->getText() );
-        }
-    }
-    lokaleDateien->speichern();
-    lokaleDateien->release();
-    dateiListe->release();
-    dateiStatus->release();
-    Text *jpPf = new Text( pfad->getText() );
-    jpPf->append( "data/update/jetzt_position.patch" );
-    DateiRemove( jpPf );
-    Text *dvPf = new Text( pfad->getText() );
-    dvPf->append( "data/update/datei_versionen.ini" );
-    DateiRemove( dvPf );
-    dsPf = new Text( pfad->getText() );
-    dsPf->append( "data/update/datei_status.ini" );
-    DateiRemove( dsPf );
-    if( clientGruppe )
-    {
-        Text *ulPf = new Text( pfad->getText() );
-        ulPf->append( "data/update/unable/list.patch" );
-        if( DateiExistiert( ulPf ) )
-        { // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
-            dgL->release();
-            pfad->release();
-            fehler->setText( "" );
-            client->trenne( 0 );
-            return 3;
-        }
-    }
-    pfad->release();
-    KSGTDatei *lDgL = new KSGTDatei( "data/dg.ksgt" );
-    lDgL->laden();
-    bool gefunden = 0;
-    for( int i = 0; i < lDgL->getZeilenAnzahl(); i++ )
-    {
-        if( zParams->dateiGruppe == TextZuInt( lDgL->zFeld( i, 0 )->getText(), 10 ) )
-        {
-            for( int j = 0; j < dgL->getZeilenAnzahl(); j++ )
-            {
-                if( zParams->dateiGruppe == TextZuInt( dgL->zFeld( j, 0 )->getText(), 10 ) )
-                {
-                    lDgL->setFeld( i, 2, dgL->zFeld( j, 2 )->getText() );
-                    break;
-                }
-            }
-            gefunden = 1;
-            break;
-        }
-    }
-    if( !gefunden )
-    {
-        unsigned int rfPos = 0;
-        for( int i = 0; i < lDgL->getZeilenAnzahl(); i++ )
-        {
-            if( rfPos <= TextZuInt( lDgL->zFeld( i, 3 )->getText(), 10 ) )
-                rfPos = TextZuInt( lDgL->zFeld( i, 3 )->getText(), 10 ) + 1;
-        }
-        rfPos++;
-        for( int i = 0; i < dgL->getZeilenAnzahl(); i++ )
-        {
-            if( zParams->dateiGruppe == TextZuInt( dgL->zFeld( i, 0 )->getText(), 10 ) )
-            {
-                RCArray< Text > *zeile = new RCArray< Text >();
-                zeile->set( new Text( dgL->zFeld( i, 0 )->getText() ), 0 );
-                zeile->set( new Text( dgL->zFeld( i, 1 )->getText() ), 1 );
-                zeile->set( new Text( dgL->zFeld( i, 2 )->getText() ), 2 );
-                Text *rfPosT = new Text();
-                rfPosT->append( rfPos );
-                zeile->set( rfPosT, 3 );
-                lDgL->addZeile( 4, zeile );
-                zeile->release();
-                break;
-            }
-        }
-    }
-    dgL->release();
-    lDgL->speichern();
-    lDgL->release();
-    if( ( *zParams->abbruch ) )
-    {
-        fehler->setText( "" );
-        client->trenne( 0 );
-        return 2;
-    }
-    client->trenne( 0 );
-    fehler->setText( "" );
-    return 0;
+	if (zParams->zStatus)
+	{
+		zParams->zStatus->lockZeichnung();
+		zParams->zStatus->setText("Verbinden . . .");
+		zParams->zStatus->unlockZeichnung();
+	}
+	if (!client->istVerbunden() && !client->verbinde())
+	{
+		fehler->setText(client->getLetzterFehler());
+		return 1;
+	}
+	bool clientGruppe = 0;
+	KSGTDatei* dgL = client->getDateiGruppenListe();
+	if (!dgL)
+	{
+		fehler->setText(client->getLetzterFehler());
+		client->trenne(0);
+		return 1;
+	}
+	Text* pfad = new Text("");
+	for (int i = 0; i < dgL->getZeilenAnzahl(); i++)
+	{ // Pfad der Dateigruppe ermitteln
+		if (zParams->dateiGruppe == TextZuInt(dgL->zFeld(i, 0)->getText(), 10))
+		{
+			pfad->setText(dgL->zFeld(i, 1)->getText());
+			if (!pfad->getLength())
+				clientGruppe = 1;
+			break;
+		}
+	}
+	if (!clientGruppe)
+		pfad->append("/");
+	Text* dlPf = new Text(pfad->getText());
+	dlPf->append("data/update/datei_versionen.ini");
+	InitDatei* dateiListe = new InitDatei(dlPf);
+	dateiListe->laden();
+	Text* dsPf = new Text(pfad->getText());
+	dsPf->append("data/update/datei_status.ini");
+	InitDatei* dateiStatus = new InitDatei(dsPf);
+	dateiStatus->laden();
+	Text* llPf = new Text(pfad->getText());
+	llPf->append("data/update/datei_remove.patch");
+	Datei* removeListe = new Datei();
+	removeListe->setDatei(llPf);
+	if (!removeListe->existiert())
+		removeListe->erstellen();
+	removeListe->open(Datei::Style::schreiben);
+	KSGTDatei* dl = client->getDateiListe(zParams->dateiGruppe); // Liste mit Dateien aus der Gruppe
+	if (!dl)
+	{ // error
+		dgL->release();
+		pfad->release();
+		dateiListe->release();
+		dateiStatus->release();
+		removeListe->release();
+		fehler->setText(client->getLetzterFehler());
+		client->trenne(0);
+		return 1;
+	}
+	for (int i = 0; i < dl->getZeilenAnzahl(); i++)
+	{
+		if (dl->zFeld(i, 0)->istGleich("1"))
+		{ // existierende Datei
+			if (!dateiListe->wertExistiert(dl->zFeld(i, 1)->getText()))
+			{
+				dateiListe->addWert(dl->zFeld(i, 1)->getText(), dl->zFeld(i, 2)->getText());
+				dateiStatus->addWert(dl->zFeld(i, 1)->getText(), "Ausstehend");
+			}
+			else
+			{
+				if (!dateiListe->zWert(dl->zFeld(i, 1)->getText())->istGleich(dl->zFeld(i, 2)->getText()))
+				{
+					dateiListe->setWert(dl->zFeld(i, 1)->getText(), dl->zFeld(i, 2)->getText());
+					dateiStatus->setWert(dl->zFeld(i, 1)->getText(), "Ausstehend");
+				}
+			}
+		}
+		else
+		{ // gelöschte Datei
+			removeListe->schreibe(dl->zFeld(i, 1)->getText(), dl->zFeld(i, 1)->getLength());
+			removeListe->schreibe("\n", 1);
+			dateiListe->removeWert(dl->zFeld(i, 1)->getText());
+			dateiStatus->removeWert(dl->zFeld(i, 1)->getText());
+		}
+	}
+	removeListe->close();
+	removeListe->release();
+	dateiListe->speichern();
+	dateiStatus->speichern();
+	dl->release();
+	Text* ldPf = new Text(pfad->getText());
+	ldPf->append("data/versionen.ini");
+	InitDatei* lokaleDateien = new InitDatei(ldPf);
+	if (!lokaleDateien->laden())
+		DateiPfadErstellen(lokaleDateien->zPfad()->getText());
+	__int64 maxAktionen = 0;
+	for (int i = 0; i < dateiListe->getWertAnzahl(); i++)
+	{
+		bool geändert = 0;
+		if (!lokaleDateien->wertExistiert(dateiListe->zName(i)->getText()))
+		{
+			geändert = 1;
+			if (dateiStatus->zWert(dateiListe->zName(i)->getText()) &&
+				dateiStatus->zWert(dateiListe->zName(i)->getText())->istGleich("Fertig"))
+				geändert = 0;
+		}
+		else
+		{
+			if (!lokaleDateien->zWert(dateiListe->zName(i)->getText())->istGleich(dateiListe->zWert(i)->getText()))
+				geändert = 1;
+			else
+				dateiStatus->setWert(dateiListe->zName(i)->getText(), "Fertig");
+		}
+		if (geändert && !dateiStatus->zWert(dateiListe->zName(i)->getText())->istGleich("Fertig"))
+		{
+			maxAktionen += client->getDateiGröße(zParams->dateiGruppe, dateiListe->zName(i)->getText());
+			if (dateiStatus->zWert(dateiListe->zName(i)->getText())->istGleich("InBearbeitung"))
+			{
+				Text* jPf = new Text(pfad->getText());
+				jPf->append("data/update/jetzt_position.patch");
+				Datei* jetzt = new Datei();
+				jetzt->setDatei(jPf);
+				if (jetzt->open(Datei::Style::lesen))
+				{
+					__int64 pos = 0;
+					jetzt->lese((char*)&pos, 8);
+					maxAktionen -= pos;
+					jetzt->close();
+				}
+				jetzt->release();
+			}
+		}
+	}
+	dateiStatus->speichern();
+	if (zParams->zFortschritt)
+	{
+		zParams->zFortschritt->reset();
+		zParams->zFortschritt->setAktionAnzahl(maxAktionen);
+	}
+	for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
+	{
+		if (dateiStatus->zWert(i)->istGleich("InBearbeitung"))
+		{
+			Text* jPf = new Text(pfad->getText());
+			jPf->append("data/update/jetzt_position.patch");
+			Datei* jetzt = new Datei();
+			jetzt->setDatei(jPf);
+			__int64 pos = 0;
+			if (jetzt->open(Datei::Style::lesen))
+			{
+				jetzt->lese((char*)&pos, 8);
+				jetzt->close();
+			}
+			jetzt->release();
+			Text* zielPf = new Text(pfad->getText());
+			zielPf->append("data/update/download/");
+			zielPf->append(dateiStatus->zName(i)->getText());
+			InitDatei* poIni = new InitDatei("data/patch/po.ini");
+			poIni->laden();
+			int maxbps = 0;
+			if (poIni->wertExistiert("ülps") && poIni->zWert("ülps")->getLength() && poIni->wertExistiert("üle"))
+			{
+				if (poIni->zWert("üle")->istGleich("kb/s"))
+					maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024;
+				if (poIni->zWert("üle")->istGleich("mb/s"))
+					maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024 * 1024;
+			}
+			poIni->release();
+			if (zParams->zStatus)
+			{
+				zParams->zStatus->lockZeichnung();
+				zParams->zStatus->setText(dateiStatus->zName(i)->getText());
+				zParams->zStatus->unlockZeichnung();
+			}
+			if (client->downloadDatei(zParams->dateiGruppe, &pos, dateiStatus->zName(i)->getText(), zielPf->getText(), zParams->zFortschritt, zParams->abbruch, maxbps))
+			{
+				if ((*zParams->abbruch))
+				{ // übertragung unterbrochen
+					jPf = new Text(pfad->getText());
+					jPf->append("data/update/jetzt_position.patch");
+					jetzt = new Datei();
+					jetzt->setDatei(jPf);
+					if (jetzt->open(Datei::Style::schreiben))
+					{
+						jetzt->schreibe((char*)&pos, 8);
+						jetzt->close();
+					}
+					jetzt->release();
+					dgL->release();
+					pfad->release();
+					dateiListe->release();
+					dateiStatus->release();
+					zielPf->release();
+					lokaleDateien->release();
+					fehler->setText("");
+					client->trenne(0);
+					return 2;
+				}
+				else
+				{
+					dateiStatus->setWert(i, "Fertig");
+					dateiStatus->speichern();
+				}
+			}
+			else
+			{ // error
+				dgL->release();
+				pfad->release();
+				dateiListe->release();
+				dateiStatus->release();
+				zielPf->release();
+				lokaleDateien->release();
+				fehler->setText(client->getLetzterFehler());
+				client->trenne(0);
+				return 1;
+			}
+			zielPf->release();
+			break;
+		}
+	}
+	for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
+	{
+		if (dateiStatus->zWert(i)->istGleich("Ausstehend"))
+		{
+			dateiStatus->setWert(i, "InBearbeitung");
+			Text* jPf = new Text(pfad->getText());
+			jPf->append("data/update/jetzt_position.patch");
+			Datei* jetzt = new Datei();
+			jetzt->setDatei(jPf);
+			__int64 pos = 0;
+			jetzt->open(Datei::Style::schreiben);
+			jetzt->schreibe((char*)&pos, 8);
+			jetzt->close();
+			jetzt->release();
+			dateiStatus->speichern();
+			Text* zielPf = new Text(pfad->getText());
+			zielPf->append("data/update/download/");
+			zielPf->append(dateiStatus->zName(i)->getText());
+			InitDatei* poIni = new InitDatei("data/patch/po.ini");
+			poIni->laden();
+			int maxbps = 0;
+			if (poIni->wertExistiert("ülps") && poIni->zWert("ülps")->getLength() && poIni->wertExistiert("üle"))
+			{
+				if (poIni->zWert("üle")->istGleich("kb/s"))
+					maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024;
+				if (poIni->zWert("üle")->istGleich("mb/s"))
+					maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024 * 1024;
+			}
+			poIni->release();
+			if (zParams->zStatus)
+			{
+				zParams->zStatus->lockZeichnung();
+				zParams->zStatus->setText(dateiStatus->zName(i)->getText());
+				zParams->zStatus->unlockZeichnung();
+			}
+			if (client->downloadDatei(zParams->dateiGruppe, &pos, dateiStatus->zName(i)->getText(), zielPf->getText(), zParams->zFortschritt, zParams->abbruch, maxbps))
+			{
+				if ((*zParams->abbruch))
+				{ // übertragung unterbrochen
+					jPf = new Text(pfad->getText());
+					jPf->append("data/update/jetzt_position.patch");
+					jetzt = new Datei();
+					jetzt->setDatei(jPf);
+					if (jetzt->open(Datei::Style::schreiben))
+					{
+						jetzt->schreibe((char*)&pos, 8);
+						jetzt->close();
+					}
+					jetzt->release();
+					dgL->release();
+					pfad->release();
+					dateiListe->release();
+					dateiStatus->release();
+					zielPf->release();
+					lokaleDateien->release();
+					fehler->setText("");
+					client->trenne(0);
+					return 2;
+				}
+				else
+				{
+					dateiStatus->setWert(i, "Fertig");
+					dateiStatus->speichern();
+				}
+			}
+			else
+			{ // error
+				dgL->release();
+				pfad->release();
+				dateiListe->release();
+				dateiStatus->release();
+				zielPf->release();
+				lokaleDateien->release();
+				fehler->setText(client->getLetzterFehler());
+				client->trenne(0);
+				return 1;
+			}
+			zielPf->release();
+		}
+	}
+	if (zParams->zStatus)
+	{
+		zParams->zStatus->lockZeichnung();
+		zParams->zStatus->setText("Übernehme Änderungen...");
+		zParams->zStatus->unlockZeichnung();
+	}
+	removeListe = new Datei();
+	llPf = new Text(pfad->getText());
+	llPf->append("data/update/datei_remove.patch");
+	removeListe->setDatei(llPf);
+	removeListe->open(Datei::Style::lesen);
+	Text* zeile = removeListe->leseZeile();
+	while (zeile)
+	{
+		zeile->remove("\r\n");
+		zeile->remove("\n");
+		if (!zeile->getLength())
+			break;
+		Text pf = pfad->getText();
+		pf += zeile->getText();
+		lokaleDateien->removeWert(zeile->getText());
+		DateiRemove(pf);
+		zeile->release();
+		zeile = removeListe->leseZeile();
+	}
+	lokaleDateien->speichern();
+	removeListe->close();
+	removeListe->remove();
+	removeListe->release();
+	if (clientGruppe)
+	{ // Es wird der Patcher selbst geupdatet
+		Text* uPf = new Text(pfad->getText());
+		uPf->append("data/update/unable/list.patch");
+		Datei* unable = new Datei();
+		unable->setDatei(uPf);
+		unable->erstellen();
+		unable->open(Datei::Style::schreiben);
+		bool fertig = 1;
+		for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
+		{
+			Text* altPfad = new Text(pfad->getText());
+			altPfad->append("data/update/download/");
+			altPfad->append(dateiStatus->zName(i)->getText());
+			Text* neuPfad = new Text(pfad->getText());
+			neuPfad->append(dateiStatus->zName(i)->getText());
+			if (DateiExistiert(altPfad->getText()))
+			{
+				bool b = 0;
+				if (!DateiExistiert(neuPfad->getText()))
+					DateiPfadErstellen(neuPfad->getText());
+				if (DateiExistiert(neuPfad->getText()))
+				{
+					if (DateiRemove(neuPfad->getText()))
+					{
+						if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
+							b = 1;
+					}
+					else
+						b = 1;
+				}
+				else
+				{
+					if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
+						b = 1;
+				}
+				if (b)
+				{
+					unable->schreibe("\2", 1);
+					unable->schreibe(neuPfad->getText(), neuPfad->getLength());
+					unable->schreibe("=>", 2);
+					unable->schreibe(altPfad->getText(), altPfad->getLength());
+					unable->schreibe("\n", 1);
+					fertig = 0;
+				}
+			}
+			altPfad->release();
+			neuPfad->release();
+			if (!lokaleDateien->wertExistiert(dateiStatus->zName(i)->getText()))
+				lokaleDateien->addWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
+			else
+				lokaleDateien->setWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
+		}
+		unable->close();
+		if (fertig)
+			unable->remove();
+		unable->release();
+	}
+	else
+	{ // Es werden Spiele und Karten geupdatet
+		for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
+		{
+			Text* altPfad = new Text(pfad->getText());
+			altPfad->append("data/update/download/");
+			altPfad->append(dateiStatus->zName(i)->getText());
+			Text* neuPfad = new Text(pfad->getText());
+			neuPfad->append(dateiStatus->zName(i)->getText());
+			if (DateiExistiert(altPfad->getText()))
+			{
+				bool b = 0;
+				if (!DateiExistiert(neuPfad->getText()))
+					DateiPfadErstellen(neuPfad->getText());
+				if (DateiExistiert(neuPfad->getText()))
+				{
+					if (DateiRemove(neuPfad->getText()))
+					{
+						if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
+							b = 1;
+					}
+					else
+						b = 1;
+				}
+				else
+				{
+					if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
+						b = 1;
+				}
+				if (b)
+				{ // error
+					dgL->release();
+					pfad->release();
+					lokaleDateien->speichern();
+					lokaleDateien->release();
+					dateiListe->release();
+					dateiStatus->release();
+					fehler->setText(client->getLetzterFehler());
+					client->trenne(0);
+					return 1;
+				}
+			}
+			altPfad->release();
+			neuPfad->release();
+			if (!lokaleDateien->wertExistiert(dateiStatus->zName(i)->getText()))
+				lokaleDateien->addWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
+			else
+				lokaleDateien->setWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
+		}
+	}
+	lokaleDateien->speichern();
+	lokaleDateien->release();
+	dateiListe->release();
+	dateiStatus->release();
+	Text* jpPf = new Text(pfad->getText());
+	jpPf->append("data/update/jetzt_position.patch");
+	DateiRemove(jpPf);
+	Text* dvPf = new Text(pfad->getText());
+	dvPf->append("data/update/datei_versionen.ini");
+	DateiRemove(dvPf);
+	dsPf = new Text(pfad->getText());
+	dsPf->append("data/update/datei_status.ini");
+	DateiRemove(dsPf);
+	if (clientGruppe)
+	{
+		Text* ulPf = new Text(pfad->getText());
+		ulPf->append("data/update/unable/list.patch");
+		if (DateiExistiert(ulPf))
+		{ // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
+			dgL->release();
+			pfad->release();
+			fehler->setText("");
+			client->trenne(0);
+			return 3;
+		}
+	}
+	pfad->release();
+	KSGTDatei* lDgL = new KSGTDatei("data/dg.ksgt");
+	lDgL->laden();
+	bool gefunden = 0;
+	for (int i = 0; i < lDgL->getZeilenAnzahl(); i++)
+	{
+		if (zParams->dateiGruppe == TextZuInt(lDgL->zFeld(i, 0)->getText(), 10))
+		{
+			for (int j = 0; j < dgL->getZeilenAnzahl(); j++)
+			{
+				if (zParams->dateiGruppe == TextZuInt(dgL->zFeld(j, 0)->getText(), 10))
+				{
+					lDgL->setFeld(i, 2, dgL->zFeld(j, 2)->getText());
+					break;
+				}
+			}
+			gefunden = 1;
+			break;
+		}
+	}
+	if (!gefunden)
+	{
+		unsigned int rfPos = 0;
+		for (int i = 0; i < lDgL->getZeilenAnzahl(); i++)
+		{
+			if (rfPos <= TextZuInt(lDgL->zFeld(i, 3)->getText(), 10))
+				rfPos = TextZuInt(lDgL->zFeld(i, 3)->getText(), 10) + 1;
+		}
+		rfPos++;
+		for (int i = 0; i < dgL->getZeilenAnzahl(); i++)
+		{
+			if (zParams->dateiGruppe == TextZuInt(dgL->zFeld(i, 0)->getText(), 10))
+			{
+				RCArray< Text >* zeile = new RCArray< Text >();
+				zeile->set(new Text(dgL->zFeld(i, 0)->getText()), 0);
+				zeile->set(new Text(dgL->zFeld(i, 1)->getText()), 1);
+				zeile->set(new Text(dgL->zFeld(i, 2)->getText()), 2);
+				Text* rfPosT = new Text();
+				rfPosT->append(rfPos);
+				zeile->set(rfPosT, 3);
+				lDgL->addZeile(4, zeile);
+				zeile->release();
+				break;
+			}
+		}
+	}
+	dgL->release();
+	lDgL->speichern();
+	lDgL->release();
+	if ((*zParams->abbruch))
+	{
+		fehler->setText("");
+		client->trenne(0);
+		return 2;
+	}
+	client->trenne(0);
+	fehler->setText("");
+	return 0;
 }
 
 // constant
-char *Updater::getError() const
+const char* Updater::getError() const
 {
-    return fehler->getText();
+	return fehler->getText();
 }
 
 int Updater::getDownload() const
 {
-    return client->getDownload();
+	return client->getDownload();
 }

+ 12 - 12
Update/Updater.h

@@ -9,20 +9,20 @@ using namespace Framework;
 class Updater : public UpdaterV
 {
 private:
-    KSGClient::PatchServerClient *client;
-    Text *fehler;
+	KSGClient::PatchServerClient* client;
+	Text* fehler;
 
 public:
-    // Konstruktor
-    Updater( KSGClient::PatchServerClient *psc );
-    // Destruktor
-    ~Updater();
-    // nicht constant
-    virtual int getNextDateiGruppe( Text *zDgPfad );
-    virtual int update( UpdateParams *zParams );
-    // constant
-    virtual char *getError() const;
-    virtual int getDownload() const;
+	// Konstruktor
+	Updater(KSGClient::PatchServerClient* psc);
+	// Destruktor
+	~Updater();
+	// nicht constant
+	virtual int getNextDateiGruppe(Text* zDgPfad);
+	virtual int update(UpdateParams* zParams);
+	// constant
+	virtual const char* getError() const;
+	virtual int getDownload() const;
 };
 
 #endif