Browse Source

Headless Anwendung für smp (in der konsole)

Kolja Strohm 5 years ago
parent
commit
158bee9abc

BIN
Fertig/x32/smp.exe


BIN
Fertig/x64/smp.exe


BIN
Fertig/x64/smph.exe


+ 55 - 0
SMP Headless/SMP Headless.cpp

@@ -0,0 +1,55 @@
+// SMP Headless.cpp : Diese Anwendung committet alle änderungen und lädt sie zu allen verfügbaren patch servern hoch
+//
+
+#include <Globals.h>
+#include <iostream>
+#include <string>
+#include "../SMP/Programm/Version/Version.h"
+#include "../SMP/Programm/Server/Patch/PatchServer.h"
+
+int main()
+{
+    Framework::initFramework();
+    std::cout << "  _  __ _____  _____    _____ __  __ _____  \n"
+        " | |/ // ____|/ ____|  / ____|  \\/  |  __ \\ \n"
+        " | ' /| (___ | |  __  | (___ | \\  / | |__) |\n"
+        " | <   \\___ \\| | |_ |  \\___ \\| |\\/| |  ___/\n"
+        " | . \\ ____) | |__| |  ____) | |  | | |\n"
+        " |_|\\_\\_____ /\\_____| |_____/|_|  |_|_| \n\n";
+    InitDatei *iD = new InitDatei( "data/start/optionen.ini" );
+    iD->laden();
+    std::string login;
+    std::string password;
+    AdminAccount *account = 0;
+    MSKlient *msk = new MSKlient( iD->zWert( "MainServerIP" )->getText(), TextZuInt( iD->zWert( "MainServerPort" )->getText(), 10 ) );
+    while( true )
+    {
+        std::cout << "login: ";
+        std::getline( std::cin, login );
+        std::cout << "password: ";
+        HANDLE hStdin = GetStdHandle( STD_INPUT_HANDLE );
+        DWORD mode = 0;
+        GetConsoleMode( hStdin, &mode );
+        SetConsoleMode( hStdin, mode & ( ~ENABLE_ECHO_INPUT ) );
+        std::getline( std::cin, password );
+        GetConsoleMode( hStdin, &mode );
+        SetConsoleMode( hStdin, mode | ENABLE_ECHO_INPUT );
+        if( msk->login( login.c_str(), password.c_str() ) )
+            account = new AdminAccount( login.c_str(), password.c_str() );
+        if( account )
+            break;
+        std::cout << "\nFehler\n";
+    }
+    std::cout << "\nVersionskontrolle\n";
+    Version *v = new Version( 0, msk->getThis(), 0, account->getThis(), 0 );
+    v->commitAll();
+    v->release();
+    PatchServer *s = new PatchServer( 0, iD->getThis(), msk->getThis(), 0, account->getThis(), 0 );
+    s->setSichtbar( 1 );
+    s->updateAll();
+    s->release();
+    account->release();
+    msk->release();
+    iD->release();
+    Framework::releaseFramework();
+}

+ 198 - 0
SMP Headless/SMP Headless.vcxproj

@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>16.0</VCProjectVersion>
+    <ProjectGuid>{097A9588-990D-4E7B-8F3D-1C25E4FC2913}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>SMPHeadless</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>..\..\..\Allgemein\Framework;..\..\..\Allgemein\Network\Network;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\Allgemein\Framework\x64\Debug;..\..\..\Allgemein\Network\x64\Debug;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>..\..\..\Allgemein\Framework;..\..\..\Allgemein\Network\Network;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\Allgemein\Framework\x64\Release;..\..\..\Allgemein\Network\x64\Release;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>framework.lib;network.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuildStep>
+      <Command>copy "..\..\..\Allgemein\Framework\x64\Debug\Framework.dll" ..\Fertig\x64\Framework.dll
+copy "..\..\..\Allgemein\Network\x64\Debug\Network.dll"  ..\Fertig\x64\Network.dll</Command>
+    </CustomBuildStep>
+    <CustomBuildStep>
+      <Outputs>kopieren...;%(Outputs)</Outputs>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>framework.lib;network.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuildStep>
+      <Command>copy "..\x64\Release\smp headless.exe" "..\Fertig\x64\smph.exe"
+copy "..\..\..\Allgemein\Framework\x64\Release\Framework.dll" ..\Fertig\x64\Framework.dll
+copy "..\..\..\Allgemein\Network\x64\Release\Network.dll"  ..\Fertig\x64\Network.dll</Command>
+      <Outputs>kopieren...;%(Outputs)</Outputs>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="..\SMP\Netzwerk\LTSKlient.cpp" />
+    <ClCompile Include="..\SMP\Netzwerk\Main\MSKlient.cpp" />
+    <ClCompile Include="..\SMP\Netzwerk\Patch\PSKlient.cpp" />
+    <ClCompile Include="..\SMP\Programm\Basic\Abschnitt.cpp" />
+    <ClCompile Include="..\SMP\Programm\Login\Login.cpp" />
+    <ClCompile Include="..\SMP\Programm\Programm.cpp" />
+    <ClCompile Include="..\SMP\Programm\Server\Patch\PatchServer.cpp" />
+    <ClCompile Include="..\SMP\Programm\Version\Version.cpp" />
+    <ClCompile Include="..\SMP\Ressourcen\Ressourcen.cpp" />
+    <ClCompile Include="SMP Headless.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\SMP\Netzwerk\LTSKlient.h" />
+    <ClInclude Include="..\SMP\Netzwerk\Main\MSKlient.h" />
+    <ClInclude Include="..\SMP\Netzwerk\Patch\PSKlient.h" />
+    <ClInclude Include="..\SMP\Programm\Basic\Abschnitt.h" />
+    <ClInclude Include="..\SMP\Programm\Login\Login.h" />
+    <ClInclude Include="..\SMP\Programm\Programm.h" />
+    <ClInclude Include="..\SMP\Programm\Server\Patch\PatchServer.h" />
+    <ClInclude Include="..\SMP\Programm\Version\Version.h" />
+    <ClInclude Include="..\SMP\Ressourcen\Ressourcen.h" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 78 - 0
SMP Headless/SMP Headless.vcxproj.filters

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Quelldateien">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Headerdateien">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+    <Filter Include="Ressourcendateien">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="SMP Headless.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="..\SMP\Programm\Version\Version.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="..\SMP\Programm\Server\Patch\PatchServer.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="..\SMP\Netzwerk\Patch\PSKlient.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="..\SMP\Netzwerk\LTSKlient.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="..\SMP\Programm\Basic\Abschnitt.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="..\SMP\Netzwerk\Main\MSKlient.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="..\SMP\Programm\Login\Login.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="..\SMP\Programm\Programm.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="..\SMP\Ressourcen\Ressourcen.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\SMP\Programm\Version\Version.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="..\SMP\Programm\Server\Patch\PatchServer.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="..\SMP\Programm\Basic\Abschnitt.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="..\SMP\Netzwerk\LTSKlient.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="..\SMP\Netzwerk\Patch\PSKlient.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="..\SMP\Netzwerk\Main\MSKlient.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="..\SMP\Programm\Login\Login.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="..\SMP\Programm\Programm.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="..\SMP\Ressourcen\Ressourcen.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>

+ 15 - 2
SMP.sln

@@ -1,10 +1,12 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.22823.1
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.28621.142
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SMP", "SMP\SMP.vcxproj", "{F008ED76-C8D3-4D0E-9032-ACB9FF9FB701}"
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SMP Headless", "SMP Headless\SMP Headless.vcxproj", "{097A9588-990D-4E7B-8F3D-1C25E4FC2913}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Win32 = Debug|Win32
@@ -21,8 +23,19 @@ Global
 		{F008ED76-C8D3-4D0E-9032-ACB9FF9FB701}.Release|Win32.Build.0 = Release|Win32
 		{F008ED76-C8D3-4D0E-9032-ACB9FF9FB701}.Release|x64.ActiveCfg = Release|x64
 		{F008ED76-C8D3-4D0E-9032-ACB9FF9FB701}.Release|x64.Build.0 = Release|x64
+		{097A9588-990D-4E7B-8F3D-1C25E4FC2913}.Debug|Win32.ActiveCfg = Debug|Win32
+		{097A9588-990D-4E7B-8F3D-1C25E4FC2913}.Debug|Win32.Build.0 = Debug|Win32
+		{097A9588-990D-4E7B-8F3D-1C25E4FC2913}.Debug|x64.ActiveCfg = Debug|x64
+		{097A9588-990D-4E7B-8F3D-1C25E4FC2913}.Debug|x64.Build.0 = Debug|x64
+		{097A9588-990D-4E7B-8F3D-1C25E4FC2913}.Release|Win32.ActiveCfg = Release|Win32
+		{097A9588-990D-4E7B-8F3D-1C25E4FC2913}.Release|Win32.Build.0 = Release|Win32
+		{097A9588-990D-4E7B-8F3D-1C25E4FC2913}.Release|x64.ActiveCfg = Release|x64
+		{097A9588-990D-4E7B-8F3D-1C25E4FC2913}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {F512B09F-A507-467F-B045-71239D4CCF28}
+	EndGlobalSection
 EndGlobal

+ 153 - 85
SMP/Programm/Server/Patch/PatchServer.cpp

@@ -68,7 +68,7 @@ void PSUpdate::thread()
             zPSA->setUpdateFertig( 1, gruppeId[ g ] );
         return;
     }
-    Array< FileGroupInfo* > fileGroupList;
+    Array< FileGroupInfo * > fileGroupList;
     psc->getFileGroupInfoList( &fileGroupList );
     RCArray< ReferenceCounting< std::pair< int, Text > > > systemT;
     psc->getSystemInfoList( &systemT );
@@ -80,7 +80,7 @@ void PSUpdate::thread()
         {
             if( gruppeId[ g ] == fileGroupList.get( i )->id )
             {
-                initPfad->append( (char*)fileGroupList.get( i )->name );
+                initPfad->append( (char *)fileGroupList.get( i )->name );
                 break;
             }
         }
@@ -98,7 +98,7 @@ void PSUpdate::thread()
                 cont = 1;
                 break;
             }
-            Text *pfad = new Text( systemInit->zWert( (char*)systemT.z( i )->second )->getText() );
+            Text *pfad = new Text( systemInit->zWert( (char *)systemT.z( i )->second )->getText() );
             pfad->append( "/" );
             RCArray< ReferenceCounting< FileInfo > > dateiT;
             psc->getFileInfoList( systemT.z( i )->first, gruppeId[ g ], &dateiT );
@@ -209,10 +209,10 @@ void PSUpdate::thread()
                     psc->zKlient()->getNachricht( &ret, 1 );
                     if( ret == 1 )
                     {
-                        psc->zKlient()->sende( (char*)&system, 4 );
-                        psc->zKlient()->sende( (char*)&version, 4 );
+                        psc->zKlient()->sende( (char *)& system, 4 );
+                        psc->zKlient()->sende( (char *)& version, 4 );
                         short län = dateiA->z( i )->z( j )->getLength();
-                        psc->zKlient()->sende( (char*)&län, 2 );
+                        psc->zKlient()->sende( (char *)& län, 2 );
                         psc->zKlient()->sende( dateiA->z( i )->z( j )->getText(), län );
                         psc->zKlient()->getNachricht( &ret, 1 );
                         if( ret == 1 )
@@ -231,7 +231,7 @@ void PSUpdate::thread()
                                 }
                                 if( län < 0 )
                                     break;
-                                psc->zKlient()->sende( (char*)&län, 2 );
+                                psc->zKlient()->sende( (char *)& län, 2 );
                                 char *buff = new char[ län ];
                                 d->lese( buff, län );
                                 psc->zKlient()->sende( buff, län );
@@ -315,7 +315,7 @@ Thread *PSUpdate::release()
 
 // Inhalt der PSDetails Klasse aus PatchServer.h
 // Konstruktor
-PSDetails::PSDetails( PatchServer *zPSA, MSKlient *mk )
+PSDetails::PSDetails( PatchServer * zPSA, MSKlient * mk )
     : Thread()
 {
     this->zPSA = zPSA;
@@ -343,7 +343,7 @@ void PSDetails::thread()
     {
         Text *err = new Text( "Fehler: Server Rückgabe: " );
         err->append( mk->getLetzterFehler() );
-        zPSA->setServerDetails( id, "", "", 0, 0, 0, 0, -2, err );
+        zPSA->setServerDetails( id, ( char * )"", ( char * )"", 0, 0, 0, 0, -2, err );
     }
     else
     {
@@ -376,7 +376,7 @@ Thread *PSDetails::release()
 
 // Inhalt der PSSuche Klasse aus PatchServer.h
 // Konstruktor
-PSSuche::PSSuche( PatchServer *zPSA, MSKlient *mk )
+PSSuche::PSSuche( PatchServer * zPSA, MSKlient * mk )
     : Thread()
 {
     this->zPSA = zPSA;
@@ -392,7 +392,7 @@ PSSuche::~PSSuche()
 // nicht constant
 void PSSuche::thread()
 {
-    Array< ServerData* > list;
+    Array< ServerData * > list;
     if( mk->getPatchServerListe( &list ) )
     {
         int anz = list.getEintragAnzahl();
@@ -451,7 +451,7 @@ Thread *PSSuche::release()
 }
 
 
-TextFeld *getTabellenEintrag( const char *txt, Schrift *s, int farbe )
+TextFeld *getTabellenEintrag( const char *txt, Schrift * s, int farbe )
 {
     TextFeld *tmp = new TextFeld();
     tmp->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
@@ -464,7 +464,7 @@ TextFeld *getTabellenEintrag( const char *txt, Schrift *s, int farbe )
 
 // Inhalt der PatchServer Klasse aus PatchServer.h
 // Konstruktor
-PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild *rb, AdminAccount *acc, Bildschirm *b )
+PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceBild * rb, AdminAccount * acc, Bildschirm * b )
     : Abschnitt( b )
 {
     fenster = 0;
@@ -479,7 +479,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     f->setRFarbe( 0xFFFFFFFF );
     f->setRBreite( 1 );
     f->setTitel( "Patch Server" );
-    f->setTSchriftZ( s->getThis() );
+    f->setTSchriftZ( s ? s->getThis() : 0 );
     f->setTSFarbe( 0xFFFFFFFF );
     f->setTSSize( 12 );
     f->setTAfFarbe( 0x1000FF00 );
@@ -530,19 +530,19 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     tabelle->setSpaltenBreite( 6, 20 );
     tabelle->addZeile( "Überschrifft" );
     tabelle->setZeilenHeight( 0, 20 );
-    tabelle->setZeichnungZ( 0, 0, getTabellenEintrag( "Id", s->getThis(), 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 1, 0, getTabellenEintrag( "Name", s->getThis(), 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 2, 0, getTabellenEintrag( "Ip", s->getThis(), 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 3, 0, getTabellenEintrag( "Port", s->getThis(), 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 4, 0, getTabellenEintrag( "APort", s->getThis(), 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 5, 0, getTabellenEintrag( "Status", s->getThis(), 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 0, 0, getTabellenEintrag( "Id", s ? s->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 1, 0, getTabellenEintrag( "Name", s ? s->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 2, 0, getTabellenEintrag( "Ip", s ? s->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 3, 0, getTabellenEintrag( "Port", s ? s->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 4, 0, getTabellenEintrag( "APort", s ? s->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 5, 0, getTabellenEintrag( "Status", s ? s->getThis() : 0, 0xFFFFFFFF ) );
     tabelle->setZeichnungZ( 6, 0, 0 );
     liste->addMember( tabelle->getThis() );
 
     aktualisieren = new Knopf();
     aktualisieren->setText( "" );
     aktualisieren->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-    aktualisieren->setHintergrundBildZ( rb->get( "neuladen.png" ) );
+    aktualisieren->setHintergrundBildZ( rb ? rb->get( "neuladen.png" ) : 0 );
     aktualisieren->setPosition( 236, 230 );
     aktualisieren->setSize( 20, 20 );
     aktualisieren->setMausEreignisParameter( this );
@@ -552,7 +552,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     weiter = new Knopf();
     weiter->setText( "" );
     weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-    weiter->setHintergrundBildZ( rb->get( "weiter.png" ) );
+    weiter->setHintergrundBildZ( rb ? rb->get( "weiter.png" ) : 0 );
     weiter->setPosition( 261, 230 );
     weiter->setSize( 20, 20 );
     weiter->setMausEreignisParameter( this );
@@ -562,7 +562,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     zurück = new Knopf();
     zurück->setText( "" );
     zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-    zurück->setHintergrundBildZ( rb->get( "zurück.png" ) );
+    zurück->setHintergrundBildZ( rb ? rb->get( "zurück.png" ) : 0 );
     zurück->setPosition( 211, 230 );
     zurück->setSize( 20, 20 );
     zurück->setMausEreignisParameter( this );
@@ -571,7 +571,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     serverId = new TextFeld();
     serverId->setStyle( TextFeld::Style::Sichtbar );
-    serverId->setSchriftZ( s->getThis() );
+    serverId->setSchriftZ( s ? s->getThis() : 0 );
     serverId->setSchriftFarbe( 0xFFFFFFFF );
     serverId->setSchriftSize( 12 );
     serverId->setText( "ID: " );
@@ -581,7 +581,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     serverName = new TextFeld();
     serverName->setStyle( TextFeld::Style::Sichtbar );
-    serverName->setSchriftZ( s->getThis() );
+    serverName->setSchriftZ( s ? s->getThis() : 0 );
     serverName->setSchriftFarbe( 0xFFFFFFFF );
     serverName->setSchriftSize( 12 );
     serverName->setText( "Name: " );
@@ -591,7 +591,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     serverIp = new TextFeld();
     serverIp->setStyle( TextFeld::Style::Sichtbar );
-    serverIp->setSchriftZ( s->getThis() );
+    serverIp->setSchriftZ( s ? s->getThis() : 0 );
     serverIp->setSchriftFarbe( 0xFFFFFFFF );
     serverIp->setSchriftSize( 12 );
     serverIp->setText( "IP: " );
@@ -601,7 +601,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     serverPort = new TextFeld();
     serverPort->setStyle( TextFeld::Style::Sichtbar );
-    serverPort->setSchriftZ( s->getThis() );
+    serverPort->setSchriftZ( s ? s->getThis() : 0 );
     serverPort->setSchriftFarbe( 0xFFFFFFFF );
     serverPort->setSchriftSize( 12 );
     serverPort->setText( "Port: " );
@@ -611,7 +611,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     serverAPort = new TextFeld();
     serverAPort->setStyle( TextFeld::Style::Sichtbar );
-    serverAPort->setSchriftZ( s->getThis() );
+    serverAPort->setSchriftZ( s ? s->getThis() : 0 );
     serverAPort->setSchriftFarbe( 0xFFFFFFFF );
     serverAPort->setSchriftSize( 12 );
     serverAPort->setText( "Admin Port: " );
@@ -621,7 +621,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     serverClients = new TextFeld();
     serverClients->setStyle( TextFeld::Style::Sichtbar );
-    serverClients->setSchriftZ( s->getThis() );
+    serverClients->setSchriftZ( s ? s->getThis() : 0 );
     serverClients->setSchriftFarbe( 0xFFFFFFFF );
     serverClients->setSchriftSize( 12 );
     serverClients->setText( "Clients: " );
@@ -631,7 +631,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     serverMaxClients = new TextFeld();
     serverMaxClients->setStyle( TextFeld::Style::Sichtbar );
-    serverMaxClients->setSchriftZ( s->getThis() );
+    serverMaxClients->setSchriftZ( s ? s->getThis() : 0 );
     serverMaxClients->setSchriftFarbe( 0xFFFFFFFF );
     serverMaxClients->setSchriftSize( 12 );
     serverMaxClients->setText( "Max Clients: " );
@@ -641,7 +641,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     maxClients = new TextFeld();
     maxClients->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-    maxClients->setSchriftZ( s->getThis() );
+    maxClients->setSchriftZ( s ? s->getThis() : 0 );
     maxClients->setSchriftFarbe( 0xFFFFFFFF );
     maxClients->setSchriftSize( 12 );
     maxClients->setRahmenBreite( 1 );
@@ -658,7 +658,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     serverStatus = new TextFeld();
     serverStatus->setStyle( TextFeld::Style::Sichtbar );
-    serverStatus->setSchriftZ( s->getThis() );
+    serverStatus->setSchriftZ( s ? s->getThis() : 0 );
     serverStatus->setSchriftFarbe( 0xFFFFFFFF );
     serverStatus->setSchriftSize( 12 );
     serverStatus->setText( "Status: " );
@@ -668,7 +668,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
 
     serverFehler = new TextFeld();
     serverFehler->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Mehrzeilig );
-    serverFehler->setSchriftZ( s->getThis() );
+    serverFehler->setSchriftZ( s ? s->getThis() : 0 );
     serverFehler->setSchriftFarbe( 0xFFFFFFFF );
     serverFehler->setSchriftSize( 12 );
     serverFehler->setText( "" );
@@ -679,7 +679,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     update = new Knopf();
     update->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     update->setText( "Update" );
-    update->setSchriftZ( s->getThis() );
+    update->setSchriftZ( s ? s->getThis() : 0 );
     update->setMausEreignisParameter( this );
     update->setMausEreignis( patchServerUpdateMausEreignis );
     update->setSize( 80, 20 );
@@ -689,7 +689,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     pausieren = new Knopf();
     pausieren->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     pausieren->setText( "Pausieren" );
-    pausieren->setSchriftZ( s->getThis() );
+    pausieren->setSchriftZ( s ? s->getThis() : 0 );
     pausieren->setMausEreignisParameter( this );
     pausieren->setMausEreignis( patchServerPausierenMausEreignis );
     pausieren->setSize( 80, 20 );
@@ -699,7 +699,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     stoppen = new Knopf();
     stoppen->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     stoppen->setText( "Stoppen" );
-    stoppen->setSchriftZ( s->getThis() );
+    stoppen->setSchriftZ( s ? s->getThis() : 0 );
     stoppen->setMausEreignisParameter( this );
     stoppen->setMausEreignis( patchServerStoppenMausEreignis );
     stoppen->setSize( 80, 20 );
@@ -709,7 +709,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     beenden = new Knopf();
     beenden->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     beenden->setText( "Beenden" );
-    beenden->setSchriftZ( s->getThis() );
+    beenden->setSchriftZ( s ? s->getThis() : 0 );
     beenden->setMausEreignisParameter( this );
     beenden->setMausEreignis( patchServerBeendenMausEreignis );
     beenden->setSize( 80, 20 );
@@ -719,7 +719,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     terminieren = new Knopf();
     terminieren->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     terminieren->setText( "Terminieren" );
-    terminieren->setSchriftZ( s->getThis() );
+    terminieren->setSchriftZ( s ? s->getThis() : 0 );
     terminieren->setMausEreignisParameter( this );
     terminieren->setMausEreignis( patchServerTerminierenMausEreignis );
     terminieren->setSize( 80, 20 );
@@ -729,7 +729,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     setMaxClients = new Knopf();
     setMaxClients->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     setMaxClients->setText( "set Max Clients" );
-    setMaxClients->setSchriftZ( s->getThis() );
+    setMaxClients->setSchriftZ( s ? s->getThis() : 0 );
     setMaxClients->setMausEreignisParameter( this );
     setMaxClients->setMausEreignis( patchServerSetMaxClientsMausEreignis );
     setMaxClients->setSize( 110, 20 );
@@ -753,17 +753,17 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     updateT->setSpaltenBreite( 3, 0 );
     updateT->addZeile( "Titel" );
     updateT->setZeilenHeight( 0, 20 );
-    TextFeld *uTN = new TextFeld();
+    TextFeld * uTN = new TextFeld();
     uTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-    uTN->setSchriftZ( s->getThis() );
+    uTN->setSchriftZ( s ? s->getThis() : 0 );
     uTN->setSchriftFarbe( 0xFFFFFFFF );
     uTN->setSchriftSize( 12 );
     uTN->setRahmenFarbe( 0xFFFFFFFF );
     uTN->setText( "Name" );
     updateT->setZeichnungZ( 0, 0, uTN );
-    TextFeld *uTS = new TextFeld();
+    TextFeld * uTS = new TextFeld();
     uTS->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-    uTS->setSchriftZ( s->getThis() );
+    uTS->setSchriftZ( s ? s->getThis() : 0 );
     uTS->setSchriftFarbe( 0xFFFFFFFF );
     uTS->setSchriftSize( 12 );
     uTS->setRahmenFarbe( 0xFFFFFFFF );
@@ -776,7 +776,7 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     updateStarten = new Knopf();
     updateStarten->setStyle( Knopf::Style::Normal );
     updateStarten->setText( "Start" );
-    updateStarten->setSchriftZ( s->getThis() );
+    updateStarten->setSchriftZ( s ? s->getThis() : 0 );
     updateStarten->setMausEreignisParameter( this );
     updateStarten->setMausEreignis( patchServerUpdateStartenMausEreignis );
     updateStarten->setSize( 80, 20 );
@@ -788,7 +788,8 @@ PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild
     suchen = new PSSuche( this, msk->getThis() );
     getDetails = new PSDetails( this, msk->getThis() );
     updateTh = new PSUpdate( this, account->getThis() );
-    rb->release();
+    if( rb )
+        rb->release();
     ref = 1;
 }
 
@@ -838,11 +839,12 @@ PatchServer::~PatchServer()
     getDetails->release();
     updateTh->release();
     tabelle->release();
-    schrift->release();
+    if( schrift )
+        schrift->release();
 }
 
 // nicht constant
-void PatchServer::setFenster( Fenster *f )
+void PatchServer::setFenster( Fenster * f )
 {
     if( fenster )
         fenster->release();
@@ -864,9 +866,10 @@ void PatchServer::setSichtbar( bool s )
             tabelle->removeStyle( ObjTabelle::Style::Erlaubt );
             suchen->start();
         }
-        fenster->addMember( f->getThis() );
+        if( fenster )
+            fenster->addMember( f->getThis() );
     }
-    else
+    else if( fenster )
         fenster->removeMember( f );
 }
 
@@ -877,17 +880,17 @@ void PatchServer::addServer( int id, char *name, char *ip, int port, int adminPo
     tabelle->addZeile( txt->getText() );
     int y = tabelle->getZeilenNummer( txt->getText() );
     tabelle->setZeilenHeight( y, 20 );
-    tabelle->setZeichnungZ( 0, y, getTabellenEintrag( txt->getText(), schrift->getThis(), 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 1, y, getTabellenEintrag( name, schrift->getThis(), 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 2, y, getTabellenEintrag( ip, schrift->getThis(), 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 0, y, getTabellenEintrag( txt->getText(), schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 1, y, getTabellenEintrag( name, schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 2, y, getTabellenEintrag( ip, schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
     txt->setText( "" );
     txt->append( port );
-    tabelle->setZeichnungZ( 3, y, getTabellenEintrag( txt->getText(), schrift->getThis(), 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 3, y, getTabellenEintrag( txt->getText(), schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
     txt->setText( "" );
     txt->append( adminPort );
-    tabelle->setZeichnungZ( 4, y, getTabellenEintrag( txt->getText(), schrift->getThis(), 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 4, y, getTabellenEintrag( txt->getText(), schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
     txt->release();
-    tabelle->setZeichnungZ( 5, y, getTabellenEintrag( status, schrift->getThis(), getColorFromStatus( status ) ) );
+    tabelle->setZeichnungZ( 5, y, getTabellenEintrag( status, schrift ? schrift->getThis() : 0, getColorFromStatus( status ) ) );
     KontrollKnopf *knopf = new KontrollKnopf();
     knopf->setStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer );
     knopf->loadData( "data/bilder/icons.ltdb" );
@@ -896,7 +899,7 @@ void PatchServer::addServer( int id, char *name, char *ip, int port, int adminPo
     tabelle->setZeichnungZ( 6, y, knopf );
 }
 
-void PatchServer::setServerDetails( int id, char *name, char *ip, int port, int adminPort, int clients, int maxClients, int status, Text *error )
+void PatchServer::setServerDetails( int id, char *name, char *ip, int port, int adminPort, int clients, int maxClients, int status, Text * error )
 {
     if( !psc )
     {
@@ -1012,7 +1015,7 @@ void PatchServer::setUpdateProzent( int prozent, int gruppe )
                 fb->setFBgFarbe( 0xFF00FF00 );
                 fb->setHintergrundFarbe( 0xFFFFFFFF );
                 fb->setSFarbe( 0xFF000000 );
-                fb->setSchriftZ( schrift->getThis() );
+                fb->setSchriftZ( schrift ? schrift->getThis() : 0 );
                 fb->setSSize( 12 );
                 fb->setRahmenBreite( 1 );
                 fb->setRahmenFarbe( 0xFF55FF55 );
@@ -1023,8 +1026,8 @@ void PatchServer::setUpdateProzent( int prozent, int gruppe )
                 updateT->setZeichnungZ( 3, i, obj->getThis() );
                 updateT->unlockZeichnung();
             }
-            ( (FBalken*)updateT->zZeichnung( 1, i ) )->reset();
-            ( (FBalken*)updateT->zZeichnung( 1, i ) )->aktionPlus( prozent );
+            ( (FBalken *)updateT->zZeichnung( 1, i ) )->reset();
+            ( (FBalken *)updateT->zZeichnung( 1, i ) )->aktionPlus( prozent );
             return;
         }
     }
@@ -1040,9 +1043,11 @@ void PatchServer::setUpdateFertig( bool error, int gruppe )
         updateT->addStyle( ObjTabelle::Style::Erlaubt );
         MausEreignis me;
         me.id = ME_RLinks;
-        b->lock();
+        if( b )
+            b->lock();
         aktualisierenMausEreignis( 0, me );
-        b->unlock();
+        if( b )
+            b->unlock();
     }
     else
     { // einzelner Schritt abgeschlossen
@@ -1053,7 +1058,7 @@ void PatchServer::setUpdateFertig( bool error, int gruppe )
                 updateT->lockZeichnung();
                 TextFeld *uTS = new TextFeld();
                 uTS->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-                uTS->setSchriftZ( schrift->getThis() );
+                uTS->setSchriftZ( schrift ? schrift->getThis() : 0 );
                 uTS->setSchriftSize( 12 );
                 uTS->setRahmenFarbe( 0xFFFFFFFF );
                 if( error )
@@ -1109,13 +1114,13 @@ bool PatchServer::aktualisierenMausEreignis( void *o, MausEreignis me )
             int id = -1;
             for( int i = 1; i < tabelle->getZeilenAnzahl(); i++ )
             {
-                if( ( (KontrollKnopf*)tabelle->zZeichnung( 6, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
+                if( ( (KontrollKnopf *)tabelle->zZeichnung( 6, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
                 {
                     id = TextZuInt( tabelle->zZeilenName( i )->getText(), 10 );
                     break;
                 }
             }
-            Array< FileGroupInfo* > list;
+            Array< FileGroupInfo * > list;
             if( psc->getFileGroupInfoList( &list ) )
             {
                 for( int i = 1; i < updateT->getZeilenAnzahl(); )
@@ -1127,16 +1132,16 @@ bool PatchServer::aktualisierenMausEreignis( void *o, MausEreignis me )
                     updateT->addZeile( new Text( info->id ) );
                     TextFeld *uTN = new TextFeld();
                     uTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-                    uTN->setSchriftZ( schrift->getThis() );
+                    uTN->setSchriftZ( schrift ? schrift->getThis() : 0 );
                     uTN->setSchriftFarbe( 0xFFFFFFFF );
                     uTN->setSchriftSize( 12 );
                     uTN->setRahmenFarbe( 0xFFFFFFFF );
                     uTN->setText( info->name );
                     updateT->setZeichnungZ( 0, i + 1, uTN );
-                    TextFeld *uTS = new TextFeld();
+                    TextFeld * uTS = new TextFeld();
                     uTS->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
                     uTS->setRahmenFarbe( 0xFFFFFFFF );
-                    uTS->setSchriftZ( schrift->getThis() );
+                    uTS->setSchriftZ( schrift ? schrift->getThis() : 0 );
                     uTS->setSchriftSize( 12 );
                     if( info->status.istGleich( "Fehlt" ) )
                         uTS->setSchriftFarbe( 0xFFFF0000 );
@@ -1177,7 +1182,7 @@ bool PatchServer::auswahlKnopfMausEreignis( void *o, MausEreignis me )
         if( liste->hatStyle( Fenster::Style::Sichtbar ) )
         {
             for( int i = 1; i < tabelle->getZeilenAnzahl(); i++ )
-                ( (KontrollKnopf*)tabelle->zZeichnung( 6, i ) )->removeStyle( KontrollKnopf::Style::Selected );
+                ( (KontrollKnopf *)tabelle->zZeichnung( 6, i ) )->removeStyle( KontrollKnopf::Style::Selected );
             weiter->addStyle( Knopf::Style::Erlaubt );
         }
     }
@@ -1202,7 +1207,7 @@ bool PatchServer::weiterMausEreignis( void *o, MausEreignis me )
         int id = -1;
         for( int i = 1; i < tabelle->getZeilenAnzahl(); i++ )
         {
-            if( ( (KontrollKnopf*)tabelle->zZeichnung( 6, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
+            if( ( (KontrollKnopf *)tabelle->zZeichnung( 6, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
             {
                 id = TextZuInt( tabelle->zZeilenName( i )->getText(), 10 );
                 break;
@@ -1234,7 +1239,7 @@ bool PatchServer::zur
             if( psc )
             {
                 psc->trenne();
-                psc = (PSKlient*)psc->release();
+                psc = (PSKlient *)psc->release();
             }
         }
         else if( updateF->hatStyle( Fenster::Style::Sichtbar ) )
@@ -1425,7 +1430,7 @@ bool PatchServer::updateStartenMausEreignis( void *o, MausEreignis me )
         int id = -1;
         for( int i = 1; i < tabelle->getZeilenAnzahl(); i++ )
         {
-            if( ( (KontrollKnopf*)tabelle->zZeichnung( 6, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
+            if( ( (KontrollKnopf *)tabelle->zZeichnung( 6, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
             {
                 id = TextZuInt( tabelle->zZeilenName( i )->getText(), 10 );
                 break;
@@ -1437,7 +1442,7 @@ bool PatchServer::updateStartenMausEreignis( void *o, MausEreignis me )
             Array< int > *gruppen = new Array< int >();
             for( int i = 1; i < updateT->getZeilenAnzahl(); i++ )
             {
-                if( updateT->zZeichnung( 2, i ) && ( (KontrollKnopf*)updateT->zZeichnung( 2, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
+                if( updateT->zZeichnung( 2, i ) && ( (KontrollKnopf *)updateT->zZeichnung( 2, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
                 {
                     int gId = TextZuInt( updateT->zZeilenName( i )->getText(), 10 );
                     gruppen->set( gId, anzahl );
@@ -1473,10 +1478,73 @@ bool PatchServer::maxClientsTastaturEreignis( void *o, TastaturEreignis te )
     return ret;
 }
 
+void PatchServer::updateAll()
+{
+    std::cout << "Searching for Patch Servers ...\n";
+    while( suchen->isRunning() )
+    {
+        Sleep( 100 );
+    }
+    MausEreignis me;
+    me.id = ME_RLinks;
+    me.verarbeitet = 0;
+    for( int i = 1; i < tabelle->getZeilenAnzahl(); i++ )
+    {
+        if( ( (TextFeld *)tabelle->zZeichnung( 5, i ) )->zText()->istGleich( "Veraltet" ) )
+        {
+            std::cout << "Request details from server " << ( (TextFeld *)tabelle->zZeichnung( 0, i ) )->zText()->getText() << " ...\n";
+            Zeichnung *z = tabelle->zZeichnung( 6, i );
+            me.mx = z->getX();
+            me.my = z->getY();
+            me.verarbeitet = 0;
+            z->doMausEreignis( me );
+            me.verarbeitet = 0;
+            weiterMausEreignis( weiter, me );
+            while( getDetails->isRunning() )
+            {
+                Sleep( 100 );
+            }
+            updateMausEreignis( update, me );
+            for( int j = 1; j < updateT->getZeilenAnzahl(); j++ )
+            {
+                if( ( (TextFeld *)updateT->zZeichnung( 1, j ) )->zText()->istGleich( "Veraltet" ) )
+                {
+                    std::cout << "Update group " << ( (TextFeld *)updateT->zZeichnung( 0, j ) )->zText()->getText() << " ... ";
+                    Zeichnung *z = updateT->zZeichnung( 2, j );
+                    me.mx = z->getX();
+                    me.my = z->getY();
+                    me.verarbeitet = 0;
+                    z->doMausEreignis( me );
+                    me.verarbeitet = 0;
+                    updateStartenMausEreignis( updateStarten, me );
+                    while( updateTh->isRunning() )
+                    {
+                        Sleep( 100 );
+                    }
+                    std::cout << ( (TextFeld *)updateT->zZeichnung( 0, j ) )->zText()->getText() << "\n";
+                    j = 0;
+                }
+            }
+            zurückMausEreignis( zurück, me );
+            while( getDetails->isRunning() )
+            {
+                Sleep( 100 );
+            }
+            zurückMausEreignis( zurück, me );
+            while( suchen->isRunning() )
+            {
+                Sleep( 100 );
+            }
+            i = 0;
+        }
+    }
+    std::cout << "Everything is up to date!\n";
+}
+
 // constant
 
 // Reference Counting
-Abschnitt *PatchServer::getThis()
+Abschnitt * PatchServer::getThis()
 {
     ref++;
     return this;
@@ -1496,82 +1564,82 @@ bool patchServerAktualisierenMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->aktualisierenMausEreignis( o, me );
+    return ( (PatchServer *)p )->aktualisierenMausEreignis( o, me );
 }
 
 bool patchServerAuswahlKnopfMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->auswahlKnopfMausEreignis( o, me );
+    return ( (PatchServer *)p )->auswahlKnopfMausEreignis( o, me );
 }
 
 bool patchServerWeiterMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->weiterMausEreignis( o, me );
+    return ( (PatchServer *)p )->weiterMausEreignis( o, me );
 }
 
 bool patchServerZurückMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->zurückMausEreignis( o, me );
+    return ( (PatchServer *)p )->zurückMausEreignis( o, me );
 }
 
 bool patchServerUpdateMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->updateMausEreignis( o, me );
+    return ( (PatchServer *)p )->updateMausEreignis( o, me );
 }
 
 bool patchServerPausierenMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->pausierenMausEreignis( o, me );
+    return ( (PatchServer *)p )->pausierenMausEreignis( o, me );
 }
 
 bool patchServerStoppenMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->stoppenMausEreignis( o, me );
+    return ( (PatchServer *)p )->stoppenMausEreignis( o, me );
 }
 
 bool patchServerBeendenMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->beendenMausEreignis( o, me );
+    return ( (PatchServer *)p )->beendenMausEreignis( o, me );
 }
 
 bool patchServerTerminierenMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->terminierenMausEreignis( o, me );
+    return ( (PatchServer *)p )->terminierenMausEreignis( o, me );
 }
 
 bool patchServerSetMaxClientsMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->setMaxClientsMausEreignis( o, me );
+    return ( (PatchServer *)p )->setMaxClientsMausEreignis( o, me );
 }
 
 bool patchServerUpdateStartenMausEreignis( void *p, void *o, MausEreignis me )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->updateStartenMausEreignis( o, me );
+    return ( (PatchServer *)p )->updateStartenMausEreignis( o, me );
 }
 
 bool patchServerMaxClientsTastaturEreignis( void *p, void *o, TastaturEreignis te )
 {
     if( !p )
         return 0;
-    return ( (PatchServer*)p )->maxClientsTastaturEreignis( o, te );
+    return ( (PatchServer *)p )->maxClientsTastaturEreignis( o, te );
 }

+ 1 - 0
SMP/Programm/Server/Patch/PatchServer.h

@@ -139,6 +139,7 @@ public:
     bool setMaxClientsMausEreignis( void *o, MausEreignis me );
     bool updateStartenMausEreignis( void *o, MausEreignis me );
     bool maxClientsTastaturEreignis( void *o, TastaturEreignis te );
+    void updateAll();
     // constant
 
     // Reference Counting

+ 84 - 33
SMP/Programm/Version/Version.cpp

@@ -1,6 +1,7 @@
 #include "Version.h"
 #include <Datei.h>
 #include <Zeit.h>
+#include <iostream>
 
 // Inhalt der Version Klasse aus Version.h
 // Konstruktor
@@ -38,7 +39,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	f->setRFarbe( 0xFFFFFFFF );
 	f->setRBreite( 1 );
 	f->setTitel( "Version" );
-	f->setTSchriftZ( s->getThis() );
+	f->setTSchriftZ( s ? s->getThis() : 0 );
 	f->setTSFarbe( 0xFFFFFFFF );
 	f->setTSSize( 12 );
 	f->setTAfFarbe( 0x1000FF00 );
@@ -73,7 +74,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	gruppeT->setZeilenHeight( 0, 20 );
 	TextFeld *gTN = new TextFeld();
 	gTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	gTN->setSchriftZ( s->getThis() );
+	gTN->setSchriftZ( s ? s->getThis() : 0 );
 	gTN->setSchriftFarbe( 0xFFFFFFFF );
 	gTN->setSchriftSize( 12 );
 	gTN->setRahmenFarbe( 0xFFFFFFFF );
@@ -81,7 +82,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	gruppeT->setZeichnungZ( 0, 0, gTN );
 	TextFeld *gTP = new TextFeld();
 	gTP->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	gTP->setSchriftZ( s->getThis() );
+	gTP->setSchriftZ( s ? s->getThis() : 0 );
 	gTP->setSchriftFarbe( 0xFFFFFFFF );
 	gTP->setSchriftSize( 12 );
 	gTP->setRahmenFarbe( 0xFFFFFFFF );
@@ -89,7 +90,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	gruppeT->setZeichnungZ( 1, 0, gTP );
 	TextFeld *gTV = new TextFeld();
 	gTV->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	gTV->setSchriftZ( s->getThis() );
+	gTV->setSchriftZ( s ? s->getThis() : 0 );
 	gTV->setSchriftFarbe( 0xFFFFFFFF );
 	gTV->setSchriftSize( 12 );
 	gTV->setRahmenFarbe( 0xFFFFFFFF );
@@ -101,7 +102,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 
 	neuGruppeName = new TextFeld();
 	neuGruppeName->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-	neuGruppeName->setSchriftZ( s->getThis() );
+	neuGruppeName->setSchriftZ( s ? s->getThis() : 0 );
 	neuGruppeName->setSchriftFarbe( 0xFFFFFFFF );
 	neuGruppeName->setSchriftSize( 12 );
 	neuGruppeName->setRahmenBreite( 1 );
@@ -117,7 +118,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 
 	neuGruppePfad = new TextFeld();
 	neuGruppePfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-	neuGruppePfad->setSchriftZ( s->getThis() );
+	neuGruppePfad->setSchriftZ( s ? s->getThis() : 0 );
 	neuGruppePfad->setSchriftFarbe( 0xFFFFFFFF );
 	neuGruppePfad->setSchriftSize( 12 );
 	neuGruppePfad->setRahmenBreite( 1 );
@@ -134,7 +135,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	neuGruppeK = new Knopf();
 	neuGruppeK->setText( "" );
 	neuGruppeK->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	neuGruppeK->setHintergrundBildZ( rb->get( "neu.png" ) );
+	neuGruppeK->setHintergrundBildZ( rb ? rb->get( "neu.png" ) : 0 );
 	neuGruppeK->setPosition( 625, 610 );
 	neuGruppeK->setSize( 20, 20 );
 	neuGruppeK->setMausEreignisParameter( this );
@@ -165,7 +166,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	systemT->setZeilenHeight( 0, 20 );
 	TextFeld *sTN = new TextFeld();
 	sTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	sTN->setSchriftZ( s->getThis() );
+	sTN->setSchriftZ( s ? s->getThis() : 0 );
 	sTN->setSchriftFarbe( 0xFFFFFFFF );
 	sTN->setSchriftSize( 12 );
 	sTN->setRahmenFarbe( 0xFFFFFFFF );
@@ -173,7 +174,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	systemT->setZeichnungZ( 0, 0, sTN );
 	TextFeld *sTP = new TextFeld();
 	sTP->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	sTP->setSchriftZ( s->getThis() );
+	sTP->setSchriftZ( s ? s->getThis() : 0 );
 	sTP->setSchriftFarbe( 0xFFFFFFFF );
 	sTP->setSchriftSize( 12 );
 	sTP->setRahmenFarbe( 0xFFFFFFFF );
@@ -185,7 +186,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 
 	neuSystemName = new TextFeld();
 	neuSystemName->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-	neuSystemName->setSchriftZ( s->getThis() );
+	neuSystemName->setSchriftZ( s ? s->getThis() : 0 );
 	neuSystemName->setSchriftFarbe( 0xFFFFFFFF );
 	neuSystemName->setSchriftSize( 12 );
 	neuSystemName->setRahmenBreite( 1 );
@@ -202,7 +203,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	neuSystemK = new Knopf();
 	neuSystemK->setText( "" );
 	neuSystemK->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	neuSystemK->setHintergrundBildZ( rb->get( "neu.png" ) );
+	neuSystemK->setHintergrundBildZ( rb ? rb->get( "neu.png" ) : 0 );
 	neuSystemK->setPosition( 580, 610 );
 	neuSystemK->setSize( 20, 20 );
 	neuSystemK->setMausEreignisParameter( this );
@@ -231,7 +232,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	dateiT->setZeilenHeight( 0, 20 );
 	TextFeld *dTP = new TextFeld();
 	dTP->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	dTP->setSchriftZ( s->getThis() );
+	dTP->setSchriftZ( s ? s->getThis() : 0 );
 	dTP->setSchriftFarbe( 0xFFFFFFFF );
 	dTP->setSchriftSize( 12 );
 	dTP->setRahmenFarbe( 0xFFFFFFFF );
@@ -239,7 +240,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	dateiT->setZeichnungZ( 0, 0, dTP );
 	TextFeld *dTV = new TextFeld();
 	dTV->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	dTV->setSchriftZ( s->getThis() );
+	dTV->setSchriftZ( s ? s->getThis() : 0 );
 	dTV->setSchriftFarbe( 0xFFFFFFFF );
 	dTV->setSchriftSize( 12 );
 	dTV->setRahmenFarbe( 0xFFFFFFFF );
@@ -247,7 +248,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	dateiT->setZeichnungZ( 1, 0, dTV );
 	TextFeld *dTS = new TextFeld();
 	dTS->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	dTS->setSchriftZ( s->getThis() );
+	dTS->setSchriftZ( s ? s->getThis() : 0 );
 	dTS->setSchriftFarbe( 0xFFFFFFFF );
 	dTS->setSchriftSize( 12 );
 	dTS->setRahmenFarbe( 0xFFFFFFFF );
@@ -258,7 +259,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	commit = new Knopf();
 	commit->setStyle( Knopf::Style::Normal );
 	commit->setText( "Veröffentlichen" );
-	commit->setSchriftZ( s->getThis() );
+	commit->setSchriftZ( s ? s->getThis() : 0 );
 	commit->setMausEreignisParameter( this );
 	commit->setMausEreignis( versionCommitMausEreignis );
 	commit->setSize( 100, 20 );
@@ -273,7 +274,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 
 	fehlerText = new TextFeld();
 	fehlerText->setStyle( TextFeld::Style::Text );
-	fehlerText->setSchriftZ( s->getThis() );
+	fehlerText->setSchriftZ( s ? s->getThis() : 0 );
 	fehlerText->setSchriftFarbe( 0xFFFFFFFF );
 	fehlerText->setSchriftSize( 12 );
 	fehlerText->setText( "" );
@@ -283,7 +284,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	zurück = new Knopf();
 	zurück->setText( "" );
 	zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	zurück->setHintergrundBildZ( rb->get( "zurück.png" ) );
+	zurück->setHintergrundBildZ( rb ? rb->get( "zurück.png" ) : 0 );
 	zurück->setPosition( 295, 650 );
 	zurück->setSize( 20, 20 );
 	zurück->setMausEreignisParameter( this );
@@ -293,7 +294,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	aktualisieren = new Knopf();
 	aktualisieren->setText( "" );
 	aktualisieren->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	aktualisieren->setHintergrundBildZ( rb->get( "neuladen.png" ) );
+	aktualisieren->setHintergrundBildZ( rb ? rb->get( "neuladen.png" ) : 0 );
 	aktualisieren->setPosition( 325, 650 );
 	aktualisieren->setSize( 20, 20 );
 	aktualisieren->setMausEreignisParameter( this );
@@ -303,7 +304,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	speichern = new Knopf();
 	speichern->setText( "" );
 	speichern->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	speichern->setHintergrundBildZ( rb->get( "speichern.png" ) );
+	speichern->setHintergrundBildZ( rb ? rb->get( "speichern.png" ) : 0 );
 	speichern->setPosition( 355, 650 );
 	speichern->setSize( 20, 20 );
 	speichern->setMausEreignisParameter( this );
@@ -313,7 +314,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	weiter = new Knopf();
 	weiter->setText( "" );
 	weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	weiter->setHintergrundBildZ( rb->get( "weiter.png" ) );
+	weiter->setHintergrundBildZ( rb ? rb->get( "weiter.png" ) : 0 );
 	weiter->setPosition( 385, 650 );
 	weiter->setSize( 20, 20 );
 	weiter->setMausEreignisParameter( this );
@@ -323,7 +324,8 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
 	sName = new Text( "" );
 	system = 0;
 
-	rb->release();
+    if( rb )
+        rb->release();
 	ref = 1;
 }
 
@@ -359,7 +361,8 @@ Version::~Version()
 	fehlerF->release();
 	fehlerText->release();
 	zurück->release();
-	schrift->release();
+    if( schrift )
+        schrift->release();
 	sName->release();
 }
 
@@ -406,7 +409,7 @@ void Version::sucheDateien( const char *pfad, RCArray< ReferenceCounting< FileIn
 		dateiT->addZeile( "0" );
 		TextFeld *pfad = new TextFeld();
 		pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-		pfad->setSchriftZ( schrift->getThis() );
+		pfad->setSchriftZ( schrift ? schrift->getThis() : 0 );
 		pfad->setSchriftFarbe( 0xFFFFFFFF );
 		pfad->setSchriftSize( 12 );
 		pfad->setRahmenFarbe( 0xFFFFFFFF );
@@ -414,7 +417,7 @@ void Version::sucheDateien( const char *pfad, RCArray< ReferenceCounting< FileIn
 		dateiT->setZeichnungZ( 0, dateiT->getZeilenAnzahl() - 1, pfad );
 		TextFeld *version = new TextFeld();
 		version->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-		version->setSchriftZ( schrift->getThis() );
+		version->setSchriftZ( schrift ? schrift->getThis() : 0 );
 		version->setSchriftFarbe( 0xFFFFFFFF );
 		version->setSchriftSize( 12 );
 		version->setRahmenFarbe( 0xFFFFFFFF );
@@ -422,7 +425,7 @@ void Version::sucheDateien( const char *pfad, RCArray< ReferenceCounting< FileIn
 		dateiT->setZeichnungZ( 1, dateiT->getZeilenAnzahl() - 1, version );
 		TextFeld *status = new TextFeld();
 		status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-		status->setSchriftZ( schrift->getThis() );
+		status->setSchriftZ( schrift ? schrift->getThis() : 0 );
 		status->setSchriftFarbe( 0xFFFFFFFF );
 		status->setSchriftSize( 12 );
 		status->setRahmenFarbe( 0xFFFFFFFF );
@@ -756,7 +759,7 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
 				gruppeT->addZeile( i + 1, zeile );
 				TextFeld *name = new TextFeld();
 				name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				name->setSchriftZ( schrift->getThis() );
+				name->setSchriftZ( schrift ? schrift->getThis() : 0 );
 				name->setSchriftFarbe( 0xFFFFFFFF );
 				name->setSchriftSize( 12 );
 				name->setRahmenFarbe( 0xFFFFFFFF );
@@ -764,7 +767,7 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
 				gruppeT->setZeichnungZ( 0, i + 1, name );
 				TextFeld *pfad = new TextFeld();
 				pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				pfad->setSchriftZ( schrift->getThis() );
+				pfad->setSchriftZ( schrift ? schrift->getThis() : 0 );
 				pfad->setSchriftFarbe( 0xFFFFFFFF );
 				pfad->setSchriftSize( 12 );
 				pfad->setRahmenFarbe( 0xFFFFFFFF );
@@ -772,7 +775,7 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
 				gruppeT->setZeichnungZ( 1, i + 1, pfad );
 				TextFeld *version = new TextFeld();
 				version->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				version->setSchriftZ( schrift->getThis() );
+				version->setSchriftZ( schrift ? schrift->getThis() : 0 );
 				version->setSchriftFarbe( 0xFFFFFFFF );
 				version->setSchriftSize( 12 );
 				version->setRahmenFarbe( 0xFFFFFFFF );
@@ -812,7 +815,7 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
 				systemT->addZeile( i + 1, zeile );
 				TextFeld *name = new TextFeld();
 				name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				name->setSchriftZ( schrift->getThis() );
+				name->setSchriftZ( schrift ? schrift->getThis() : 0 );
 				name->setSchriftFarbe( 0xFFFFFFFF );
 				name->setSchriftSize( 12 );
 				name->setRahmenFarbe( 0xFFFFFFFF );
@@ -820,7 +823,7 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
 				systemT->setZeichnungZ( 0, i + 1, name );
 				TextFeld *pfad = new TextFeld();
 				pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				pfad->setSchriftZ( schrift->getThis() );
+				pfad->setSchriftZ( schrift ? schrift->getThis() : 0 );
 				pfad->setText( "" );
 				if( systemInit->wertExistiert( system->second ) )
 					pfad->setText( systemInit->zWert( (char*)system->second )->getText() );
@@ -861,7 +864,7 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
 				dateiT->addZeile( i + 1, zeile );
 				TextFeld *pfad = new TextFeld();
 				pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				pfad->setSchriftZ( schrift->getThis() );
+				pfad->setSchriftZ( schrift ? schrift->getThis() : 0 );
 				pfad->setSchriftFarbe( 0xFFFFFFFF );
 				pfad->setSchriftSize( 12 );
 				pfad->setRahmenFarbe( 0xFFFFFFFF );
@@ -869,7 +872,7 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
 				dateiT->setZeichnungZ( 0, i + 1, pfad );
 				TextFeld *version = new TextFeld();
 				version->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-				version->setSchriftZ( schrift->getThis() );
+				version->setSchriftZ( schrift ? schrift->getThis() : 0 );
 				version->setSchriftFarbe( 0xFFFFFFFF );
 				version->setSchriftSize( 12 );
 				version->setRahmenFarbe( 0xFFFFFFFF );
@@ -877,7 +880,7 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
 				dateiT->setZeichnungZ( 1, i + 1, version );
 				TextFeld *status = new TextFeld();
 				status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-				status->setSchriftZ( schrift->getThis() );
+				status->setSchriftZ( schrift ? schrift->getThis() : 0 );
 				status->setSchriftSize( 12 );
 				status->setRahmenFarbe( 0xFFFFFFFF );
 				status->setText( "Aktuell" );
@@ -960,6 +963,54 @@ bool Version::zur
 	return 1;
 }
 
+void Version::commitAll()
+{
+    MausEreignis me;
+    me.id = ME_RLinks;
+    me.verarbeitet = 0;
+    aktualisierenMausEreignis( aktualisieren, me );
+    for( int i = 1; i < gruppeT->getZeilenAnzahl(); i++ )
+    {
+        std::cout << "Gruppe: " << ( (TextFeld *)gruppeT->zZeichnung( 0, i ) )->zText()->getText() << ": \n";
+        Zeichnung *z = gruppeT->zZeichnung( 3, i ); // auswahl knopf
+        me.mx = z->getX();
+        me.my = z->getY();
+        me.rmx = me.mx;
+        me.rmy = me.my;
+        me.verarbeitet = 0;
+        z->doMausEreignis( me );
+        me.verarbeitet = 0;
+        weiterMausEreignis( weiter, me );
+        aktualisierenMausEreignis( aktualisieren, me );
+        for( int j = 1; j < systemT->getZeilenAnzahl(); j++ )
+        {
+            std::cout << ( (TextFeld *)systemT->zZeichnung( 0, j ) )->zText()->getText() << ": ";
+            Zeichnung *z = systemT->zZeichnung( 2, j ); // auswahl knopf
+            me.mx = z->getX();
+            me.my = z->getY();
+            me.rmx = me.mx;
+            me.rmy = me.my;
+            me.verarbeitet = 0;
+            z->doMausEreignis( me );
+            me.verarbeitet = 0;
+            weiterMausEreignis( weiter, me );
+            aktualisierenMausEreignis( aktualisieren, me );
+            bool needCommit = 0;
+            for( int k = 1; k < dateiT->getZeilenAnzahl(); k++ )
+                needCommit |= !( (TextFeld *)dateiT->zZeichnung( 2, k ) )->zText()->istGleich( "Aktuell" );
+            if( needCommit )
+            {
+                commitMausEreignis( commit, me );
+                std::cout << "Commit successfull\n";
+            }
+            else
+                std::cout << "Unchanged\n";
+            zurückMausEreignis( zurück, me );
+        }
+        zurückMausEreignis( zurück, me );
+    }
+}
+
 // constant
 InitDatei *Version::getSystemInit() const
 {

+ 1 - 0
SMP/Programm/Version/Version.h

@@ -61,6 +61,7 @@ public:
 	bool commitMausEreignis( void *o, MausEreignis me );
 	bool aktualisierenMausEreignis( void *o, MausEreignis me );
 	bool zurückMausEreignis( void *o, MausEreignis me );
+    void commitAll();
 	// constant
 	InitDatei *getSystemInit() const;
 	// Reference Counting