#include "../KSGKlient.h"
#include "../KSGServer.h"
#include <Datei.h>
#include "../../Global/Variablen.h"
#include <GSLDateiV.h>
#include "../Keys.h"

typedef GSL::GSLDateiV *( *GetGSLDatei )( );

class DownloadSound : public GSL::GSLSoundV
{
private:
    bool istM;
    int sample;
    __int64 l�n;
    Klient *k;
    FBalken *f;
    int ref;

public:
    // Konstruktor
    DownloadSound( Klient *zK, FBalken *zF )
    {
        k = zK;
        f = zF;
        ref = 1;
    }
    // nicht constant
    // GSL
    void playSound() override
    {}
    void setPause( bool p ) override
    {}
    void stopSound() override
    {}
    void warteAufSound( int zeit ) override
    {}
    // Lautst�rke: 0 - 0xFFFF
    void setVolume( unsigned int links, unsigned int rechts ) override
    {}
    // zum Speichern
    void open() override
    {
        char m = 0;
        k->getNachrichtEncrypted( &m, 1 );
        istM = ( m == 1 );
        sample = 0;
        k->getNachrichtEncrypted( (char*)&sample, 4 );
        l�n = 0;
        k->getNachrichtEncrypted( (char*)&l�n, 8 );
        f->setAktionAnzahl( l�n );
    }
    int getDaten( char *buffer, int l�n ) override
    {
        int l = l�n < this->l�n ? l�n : ( int )this->l�n;
        if( !l )
            return -1;
        k->getNachricht( buffer, l );
        this->l�n -= l;
        f->aktionPlus( l );
        return l;
    }
    void close() override
    {}
    bool istMono() const override
    {
        return istM;
    }
    int getSampleRate() const override
    {
        return sample;
    }
    __int64 getDatLength() const override
    {
        return l�n;
    }
    // Reference Counting
    GSL::GSLSoundV *getThis() override
    {
        ref++;
        return this;
    }
    GSL::GSLSoundV *release() override
    {
        ref--;
        if( !ref )
            delete this;
        return 0;
    }
};

// Inhalt der EditorKlient Klasse aus KSGKlient.h
// Konstruktor
EditorKlient::EditorKlient()
{
    verbunden = 0;
    klient = 0;
    fehler = new Text( "" );
    klientId = getKlientId();
    ref = 1;
}

// Destruktor
EditorKlient::~EditorKlient()
{
    cs.lock();
    if( verbunden )
        trenne();
    fehler = fehler->release();
    cs.unlock();
}

// nicht constant
bool EditorKlient::verbinde( unsigned short port, char *ip ) // verbindet ich mit dem Editor Server
{
    if( klient && verbunden && klient->getServerPort() == port && Text( ip ).istGleich( klient->getServerIp() ) )
        return 1;
    if( klient || verbunden )
        trenne();
    klient = new Klient();
    int keyLen = 0;
    char *key = 0;
    Keys::getServerKey( &key, keyLen, Keys::EDITOR, Keys::SENDEN );
    klient->setSendeKey( key, keyLen );
    delete[] key;
    Keys::getServerKey( &key, keyLen, Keys::EDITOR, Keys::EMPFANGEN );
    klient->setEmpfangKey( key, keyLen );
    delete[] key;
    if( !klient->verbinde( (unsigned short)port, ip ) )
    {
        klient = klient->release();
        fehler->setText( "Fehler beim verbinden mit dem Editor Server." );
        return 0;
    }
    klient->sendeEncrypted( "\1", 1 );
    klient->sendeEncrypted( (char*)&klientId, 4 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 3 )
    {
        char l�n = 0;
        klient->getNachrichtEncrypted( &l�n, 1 );
        char *nachricht = new char[ l�n + 1 ];
        nachricht[ l�n ] = 0;
        klient->getNachrichtEncrypted( nachricht, l�n );
        fehler->setText( nachricht );
        delete[]nachricht;
        trenne();
        return 0;
    }
    if( ret == 1 )
    {
        char *sl = 0;
        char slL�n = getSchl�ssel( &sl );
        klient->setSendeKey( sl, slL�n );
        klient->setEmpfangKey( sl, slL�n );
        delete[] sl;
        verbunden = 1;
    }
    return 1;
}

bool EditorKlient::karteErstellen( Text *zName, int spielArt ) // Erstellt eine neue Karte
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\xA", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        char l = (char)zName->getLength();
        klient->sendeEncrypted( &l, 1 );
        klient->sendeEncrypted( zName->getText(), l );
        klient->sendeEncrypted( (char*)&spielArt, 4 );
        klient->getNachrichtEncrypted( &ret, 1 );
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::ladeKarte( int id ) // l�dt eine bestimmte Karte
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x6", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( (char*)&id, 4 );
        klient->getNachrichtEncrypted( &ret, 1 );
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 1;
}

int EditorKlient::getAbbildListe( RCArray< Text > *name, RCArray< Zeit > *datum )
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x5", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            int anz = 0;
            klient->getNachrichtEncrypted( (char*)&anz, 4 );
            for( int i = 0; i < anz; i++ )
            {
                char l = 0;
                klient->getNachrichtEncrypted( &l, 1 );
                char *n = new char[ l + 1 ];
                n[ l ] = 0;
                klient->getNachrichtEncrypted( n, l );
                name->set( new Text( n ), i );
                delete[] n;
                Zeit *dat = new Zeit();
                int d = 0;
                klient->getNachrichtEncrypted( (char*)&d, 4 );
                dat->setJahr( d );
                klient->getNachrichtEncrypted( (char*)&d, 4 );
                dat->setMonat( d );
                klient->getNachrichtEncrypted( (char*)&d, 4 );
                dat->setTag( d );
                klient->getNachrichtEncrypted( (char*)&d, 4 );
                dat->setStunde( d );
                klient->getNachrichtEncrypted( (char*)&d, 4 );
                dat->setMinute( d );
                klient->getNachrichtEncrypted( (char*)&d, 4 );
                dat->setSekunde( d );
                datum->set( dat, i );
            }
            cs.unlock();
            return anz;
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::abbildErstellen( char *name )
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x1", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            char l = (char)textLength( name );
            klient->sendeEncrypted( &l, 1 );
            if( l )
                klient->sendeEncrypted( name, l );
            klient->getNachrichtEncrypted( &ret, 1 );
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 1;
}

bool EditorKlient::abbildL�schen( char *name )
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x2", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            char l = (char)textLength( name );
            klient->sendeEncrypted( &l, 1 );
            if( l )
                klient->sendeEncrypted( name, l );
            klient->getNachrichtEncrypted( &ret, 1 );
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 1;
}

bool EditorKlient::abbildHerstellen( char *name )
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x3", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            char l = (char)textLength( name );
            klient->sendeEncrypted( &l, 1 );
            if( l )
                klient->sendeEncrypted( name, l );
            klient->getNachrichtEncrypted( &ret, 1 );
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 1;
}

bool EditorKlient::ver�ffentlichen()
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x4", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
            klient->getNachrichtEncrypted( &ret, 1 );
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::shopSeiteVer�ffentlichen() // Ver�ffentlicht die Shop Seite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x6", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
            klient->getNachrichtEncrypted( &ret, 1 );
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::ladeShopSeiteVorschau() // L�ht die Vorschau der Shop Seite herrunter
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x8", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            int anz = 0;
            klient->getNachrichtEncrypted( (char*)&anz, 4 );
            Text pf = "data/tmp/ke/ssv";
            for( int i = 0; i < anz; i++ )
            {
                char l = 0;
                klient->getNachrichtEncrypted( &l, 1 );
                char *pfad = new char[ l + 1 ];
                pfad[ l ] = 0;
                klient->getNachrichtEncrypted( pfad, l );
                Text p = pf.getText();
                p += pfad;
                delete[] pfad;
                Datei d;
                d.setDatei( p );
                d.erstellen();
                d.open( Datei::Style::schreiben );
                __int64 gr��e = 0;
                klient->getNachrichtEncrypted( (char*)&gr��e, 8 );
                char *buffer = new char[ 2048 ];
                while( gr��e > 0 )
                {
                    int l = gr��e > 2048 ? 2048 : (int)gr��e;
                    klient->getNachricht( buffer, l );
                    d.schreibe( buffer, l );
                    gr��e -= l;
                }
                delete[] buffer;
                d.close();
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::ssDateiErstellen( char *name, int typ ) // Erstellt eine neue Shop Seiten Datei (typ:0=Ordner,1=Bild,2=Text)
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x1", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char t = typ;
                klient->sendeEncrypted( &t, 1 );
                char l = (char)textLength( name );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( name, l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::ssOrdner�ffnen( char *name ) // �ffnet einen Ordner der Shop Seite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x2", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)textLength( name );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( name, l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

Bild *EditorKlient::ssBildLaden( char *datei, char *bild ) // L�ht das ein Bild der Shop Seite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x3", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)textLength( datei );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( datei, l );
                l = (char)textLength( bild );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( bild, l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    Bild *ret = new Bild();
                    int br = 0;
                    int h� = 0;
                    klient->getNachrichtEncrypted( (char*)&br, 4 );
                    klient->getNachrichtEncrypted( (char*)&h�, 4 );
                    ret->neuBild( br, h�, 0 );
                    char *buffer = (char*)ret->getBuffer();
                    __int64 l�n = br * h� * 4;
                    for( int i = 0, l = l�n > 2048 ? 2048 : (int)l�n; l�n > 0; l = l�n > 2048 ? 2048 : (int)l�n )
                    {
                        klient->getNachricht( &( buffer[ i ] ), l );
                        i += l;
                        l�n -= l;
                    }
                    cs.unlock();
                    return ret;
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::ssDateiL�schen( char *name ) // L�scht eine Datei der Shop Seite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x4", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)textLength( name );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( name, l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

Text *EditorKlient::ssTextLaden( char *datei ) // L�d eine KSGS Datei der Shop Seite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\xA", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)textLength( datei );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( datei, l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    int l�n = 0;
                    klient->getNachrichtEncrypted( (char*)&l�n, 4 );
                    char *txt = new char[ l�n + 1 ];
                    txt[ l�n ] = 0;
                    for( int i = 0, l = l�n > 2048 ? 2048 : l�n; l�n > 0; i += l, l�n -= l, l = l�n > 2048 ? 2048 : l�n )
                        klient->getNachricht( &( txt[ i ] ), l );
                    klient->getNachrichtEncrypted( &ret, 1 );
                    if( ret == 1 )
                    {
                        Text *t = new Text( txt );
                        delete[] txt;
                        cs.unlock();
                        return t;
                    }
                    delete[] txt;
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::ssTextSpeichern( char *datei, Text *zText ) // Spechert eine KSGS Datei der Shop Seite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x5", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)textLength( datei );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( datei, l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    int l�n = zText->getLength();
                    klient->sendeEncrypted( (char*)&l�n, 4 );
                    for( int i = 0, l = l�n > 2048 ? 2048 : l�n; l�n > 0; i += l, l�n -= l, l = l�n > 2048 ? 2048 : l�n )
                        klient->sende( &( zText->getText()[ i ] ), l );
                    klient->getNachrichtEncrypted( &ret, 1 );
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::ssBildL�schen( char *datei, char *bild ) // L�scht ein Bild der Shop Seite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x6", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)textLength( datei );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( datei, l );
                l = (char)textLength( bild );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( bild, l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::ssBildSpeichern( char *datei, char *name, Bild *zBild ) // Speichert ein Bild einer ShopSeite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x7", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)textLength( datei );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( datei, l );
                l = (char)textLength( name );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( name, l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    int br = zBild->getBreite();
                    int h� = zBild->getHeight();
                    klient->sendeEncrypted( (char*)&br, 4 );
                    klient->sendeEncrypted( (char*)&h�, 4 );
                    __int64 l�n = br * h� * 4;
                    char *buffer = (char*)zBild->getBuffer();
                    for( int i = 0, l = l�n > 2048 ? 2048 : (int)l�n; l�n > 0; i += l, l�n -= l, l = l�n > 2048 ? 2048 : (int)l�n )
                        klient->sende( &( buffer[ i ] ), l );
                    klient->getNachrichtEncrypted( &ret, 1 );
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

int EditorKlient::ssGetDateiListe( RCArray< Text > *zList ) // L�d die Datei Liste der Shop Seite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x8", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                int anz = 0;
                klient->getNachrichtEncrypted( (char*)&anz, 4 );
                for( int i = 0; i < anz; i++ )
                {
                    char l = 0;
                    klient->getNachrichtEncrypted( &l, 1 );
                    char *n = new char[ l + 1 ];
                    n[ l ] = 0;
                    klient->getNachrichtEncrypted( n, l );
                    zList->add( new Text( n ) );
                    delete[] n;
                }
                cs.unlock();
                return anz;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return -1;
    }
    cs.unlock();
    return 0;
}

int EditorKlient::ssGetBildListe( char *name, RCArray< Text > *zList ) // L�d die Bild Liste einer Bild Datei der Shop Seite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x7", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x9", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)textLength( name );
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( name, l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    int anz = 0;
                    klient->getNachrichtEncrypted( (char*)&anz, 4 );
                    for( int i = 0; i < anz; i++ )
                    {
                        l = 0;
                        klient->getNachrichtEncrypted( &l, 1 );
                        char *n = new char[ l + 1 ];
                        n[ l ] = 0;
                        klient->getNachrichtEncrypted( n, l );
                        zList->add( new Text( n ) );
                        delete[] n;
                    }
                    cs.unlock();
                    return anz;
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return -1;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::getShopDaten( int &es, int &tp, int &vp ) // L�ht die Shop Daten
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x9", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->getNachrichtEncrypted( (char*)&es, 4 );
            klient->getNachrichtEncrypted( (char*)&tp, 4 );
            klient->getNachrichtEncrypted( (char*)&vp, 4 );
            cs.unlock();
            return 1;
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::setShopDaten( int es, int tp, int vp ) // Setzt die Shop Daten
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xA", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( (char*)&es, 4 );
            klient->sendeEncrypted( (char*)&tp, 4 );
            klient->sendeEncrypted( (char*)&vp, 4 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                cs.unlock();
                return 1;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

Text *EditorKlient::beschreibungLaden() // l�ht die Kartenbeschreibung
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xB", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x1", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                int l�n = 0;
                klient->getNachrichtEncrypted( (char*)&l�n, 4 );
                char *txt = new char[ l�n + 1 ];
                txt[ l�n ] = 0;
                for( int i = 0, l = l�n > 2048 ? 2048 : l�n; l�n > 0; i += l, l�n -= l, l = l�n > 2048 ? 2048 : l�n )
                    klient->getNachricht( &( txt[ i ] ), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    Text *t = new Text( txt );
                    delete[] txt;
                    cs.unlock();
                    return t;
                }
                delete[] txt;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

Bild *EditorKlient::titelbildLaden() // l�ht das Titelbild
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xB", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x2", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                Bild *ret = new Bild();
                int br = 0;
                int h� = 0;
                klient->getNachrichtEncrypted( (char*)&br, 4 );
                klient->getNachrichtEncrypted( (char*)&h�, 4 );
                ret->neuBild( br, h�, 0 );
                char *buffer = (char*)ret->getBuffer();
                __int64 l�n = br * h� * 4;
                for( int i = 0, l = l�n > 2048 ? 2048 : (int)l�n; l�n > 0; l = l�n > 2048 ? 2048 : (int)l�n )
                {
                    klient->getNachricht( &( buffer[ i ] ), l );
                    i += l;
                    l�n -= l;
                }
                cs.unlock();
                return ret;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

Bild *EditorKlient::minimapLaden() // l�ht das Minimapbild
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xB", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x3", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                Bild *ret = new Bild();
                int br = 0;
                int h� = 0;
                klient->getNachrichtEncrypted( (char*)&br, 4 );
                klient->getNachrichtEncrypted( (char*)&h�, 4 );
                ret->neuBild( br, h�, 0 );
                char *buffer = (char*)ret->getBuffer();
                __int64 l�n = br * h� * 4;
                for( int i = 0, l = l�n > 2048 ? 2048 : (int)l�n; l�n > 0; l = l�n > 2048 ? 2048 : (int)l�n )
                {
                    klient->getNachricht( &( buffer[ i ] ), l );
                    i += l;
                    l�n -= l;
                }
                cs.unlock();
                return ret;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

Bild *EditorKlient::ladebildLaden() // l�ht das Ladebild
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xB", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x4", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                Bild *ret = new Bild();
                int br = 0;
                int h� = 0;
                klient->getNachrichtEncrypted( (char*)&br, 4 );
                klient->getNachrichtEncrypted( (char*)&h�, 4 );
                ret->neuBild( br, h�, 0 );
                char *buffer = (char*)ret->getBuffer();
                __int64 l�n = br * h� * 4;
                for( int i = 0, l = l�n > 2048 ? 2048 : (int)l�n; l�n > 0; l = l�n > 2048 ? 2048 : (int)l�n )
                {
                    klient->getNachricht( &( buffer[ i ] ), l );
                    i += l;
                    l�n -= l;
                }
                cs.unlock();
                return ret;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::beschreibungSpeichern( Text *zText ) // speichert die Kartenbeschreibung
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xB", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x5", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                int l�n = zText->getLength();
                klient->sendeEncrypted( (char*)&l�n, 4 );
                for( int i = 0, l = l�n > 2048 ? 2048 : l�n; l�n > 0; i += l, l�n -= l, l = l�n > 2048 ? 2048 : l�n )
                    klient->sende( &( zText->getText()[ i ] ), l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::titelbildSpeichern( Bild *zBild ) // speichert das Titelbild
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xB", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x6", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                int br = zBild->getBreite();
                int h� = zBild->getHeight();
                klient->sendeEncrypted( (char*)&br, 4 );
                klient->sendeEncrypted( (char*)&h�, 4 );
                __int64 l�n = br * h� * 4;
                char *buffer = (char*)zBild->getBuffer();
                for( int i = 0, l = l�n > 2048 ? 2048 : (int)l�n; l�n > 0; i += l, l�n -= l, l = l�n > 2048 ? 2048 : (int)l�n )
                    klient->sende( &( buffer[ i ] ), l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::minimapSpeichern( Bild *zBild ) // speichert das Minimapbild
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xB", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x7", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                int br = zBild->getBreite();
                int h� = zBild->getHeight();
                klient->sendeEncrypted( (char*)&br, 4 );
                klient->sendeEncrypted( (char*)&h�, 4 );
                __int64 l�n = br * h� * 4;
                char *buffer = (char*)zBild->getBuffer();
                for( int i = 0, l = l�n > 2048 ? 2048 : (int)l�n; l�n > 0; i += l, l�n -= l, l = l�n > 2048 ? 2048 : (int)l�n )
                    klient->sende( &( buffer[ i ] ), l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::ladebildSpeichern( Bild *zBild ) // speichert das Ladebild
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xB", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x8", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                int br = zBild->getBreite();
                int h� = zBild->getHeight();
                klient->sendeEncrypted( (char*)&br, 4 );
                klient->sendeEncrypted( (char*)&h�, 4 );
                __int64 l�n = br * h� * 4;
                char *buffer = (char*)zBild->getBuffer();
                for( int i = 0, l = l�n > 2048 ? 2048 : (int)l�n; l�n > 0; i += l, l�n -= l, l = l�n > 2048 ? 2048 : (int)l�n )
                    klient->sende( &( buffer[ i ] ), l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::ladeTeamDaten( SpielerTeamStruktur *sts ) // l�ht die Team Daten
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xC", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x1", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                klient->getNachrichtEncrypted( (char*)&sts->spielerAnzahl, 4 );
                klient->getNachrichtEncrypted( (char*)&sts->teamAnzahl, 4 );
                for( int i = 0; i < sts->spielerAnzahl; i++ )
                {
                    int f = 0;
                    klient->getNachrichtEncrypted( (char*)&f, 4 );
                    sts->spielerFarbe->set( f, i );
                }
                for( int i = 0; i < sts->teamAnzahl; i++ )
                {
                    int f = 0;
                    klient->getNachrichtEncrypted( (char*)&f, 4 );
                    sts->teamFarbe->set( f, i );
                }
                for( int i = 0; i < sts->teamAnzahl; i++ )
                {
                    char l = 0;
                    klient->getNachrichtEncrypted( &l, 1 );
                    char *n = new char[ l + 1 ];
                    n[ l ] = 0;
                    klient->getNachrichtEncrypted( n, l );
                    sts->teamName->set( new Text( n ), i );
                    delete[] n;
                }
                for( int i = 0; i < sts->teamAnzahl; i++ )
                {
                    int g = 0;
                    klient->getNachrichtEncrypted( (char*)&g, 4 );
                    sts->teamGr��e->set( g, i );
                }
                cs.unlock();
                return 1;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::speicherTeamDaten( SpielerTeamStruktur *sts ) // speichert die Team Daten
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xC", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x2", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                klient->sendeEncrypted( (char*)&sts->spielerAnzahl, 4 );
                klient->sendeEncrypted( (char*)&sts->teamAnzahl, 4 );
                for( int i = 0; i < sts->spielerAnzahl; i++ )
                {
                    int f = sts->spielerFarbe->get( i );
                    klient->sendeEncrypted( (char*)&f, 4 );
                }
                for( int i = 0; i < sts->teamAnzahl; i++ )
                {
                    int f = sts->teamFarbe->get( i );
                    klient->sendeEncrypted( (char*)&f, 4 );
                }
                for( int i = 0; i < sts->teamAnzahl; i++ )
                {
                    char l = (char)sts->teamName->z( i )->getLength();
                    klient->sendeEncrypted( &l, 1 );
                    klient->sendeEncrypted( sts->teamName->z( i )->getText(), l );
                }
                for( int i = 0; i < sts->teamAnzahl; i++ )
                {
                    int g = sts->teamGr��e->get( i );
                    klient->sendeEncrypted( (char*)&g, 4 );
                }
                cs.unlock();
                return 1;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::deNeueDatei( char typ, Text *zName ) // DateienEditor: Erstellt neue Datei (typ: 0=ordner 1=bild 2=modell2d 3=sound
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x1", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                klient->sendeEncrypted( &typ, 1 );
                char l = (char)zName->getLength();
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( zName->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::deOrdner�ffnen( Text *zName ) // DateienEditor: �ffnet Ordner
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x2", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l�n = (char)zName->getLength();
                klient->sendeEncrypted( &l�n, 1 );
                if( l�n )
                    klient->sendeEncrypted( zName->getText(), l�n );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

Bild *EditorKlient::deBildLaden( Text *zDatei, Text *zBild, FBalken *zF ) // DateienEditor: Bild laden
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    Bild *retB = 0;
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x3", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l�n = (char)zDatei->getLength();
                klient->sendeEncrypted( &l�n, 1 );
                if( l�n )
                    klient->sendeEncrypted( zDatei->getText(), l�n );
                l�n = (char)zBild->getLength();
                klient->sendeEncrypted( &l�n, 1 );
                if( l�n )
                    klient->sendeEncrypted( zBild->getText(), l�n );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    int br = 0;
                    int h� = 0;
                    klient->getNachrichtEncrypted( (char*)&br, 4 );
                    klient->getNachrichtEncrypted( (char*)&h�, 4 );
                    retB = new Bild();
                    retB->neuBild( br, h�, 0 );
                    char *buffer = (char*)retB->getBuffer();
                    __int64 l�n = br * h� * 4;
                    zF->setAktionAnzahl( l�n );
                    for( int i = 0, l = l�n > 2048 ? 2048 : (int)l�n; l�n > 0; l = l�n > 2048 ? 2048 : (int)l�n )
                    {
                        klient->getNachricht( &( buffer[ i ] ), l );
                        i += l;
                        l�n -= l;
                        zF->aktionPlus( l );
                    }
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    if( !ret && retB )
        retB = retB->release();
    return retB;
}

bool EditorKlient::deDateiL�schen( Text *zName ) // DateienEditor: L�scht Datei
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x4", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l�n = (char)zName->getLength();
                klient->sendeEncrypted( &l�n, 1 );
                if( l�n )
                    klient->sendeEncrypted( zName->getText(), l�n );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::deBildL�schen( Text *zDatei, Text *zBild ) // DateienEditor: L�scht Bild aus Datei
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x5", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( zDatei->getText(), l );
                l = (char)zBild->getLength();
                klient->sendeEncrypted( &l, 1 );
                if( l )
                    klient->sendeEncrypted( zBild->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::deBildSpeichern( Text *zDatei, Text *zName, Bild *zBild, FBalken *zF ) // DateienEditor: Speichert Bild
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x6", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l�n = (char)zDatei->getLength();
                klient->sendeEncrypted( &l�n, 1 );
                if( l�n )
                    klient->sendeEncrypted( zDatei->getText(), l�n );
                l�n = (char)zName->getLength();
                klient->sendeEncrypted( &l�n, 1 );
                if( l�n )
                    klient->sendeEncrypted( zName->getText(), l�n );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    int br = zBild->getBreite();
                    int h� = zBild->getHeight();
                    klient->sendeEncrypted( (char*)&br, 4 );
                    klient->sendeEncrypted( (char*)&h�, 4 );
                    char *buffer = (char*)zBild->getBuffer();
                    __int64 gr = br * h� * 4;
                    zF->setAktionAnzahl( gr );
                    for( int i = 0, l = gr > 2048 ? 2048 : (int)gr; gr > 0; i += l, gr -= l, l = gr > 2048 ? 2048 : (int)gr )
                    {
                        klient->sende( &( buffer[ i ] ), l );
                        zF->aktionPlus( l );
                    }
                    klient->getNachrichtEncrypted( &ret, 1 );
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

int EditorKlient::deGetDateiListe( RCArray< Text > *zNamen ) // DateienEditor: Datei Liste herunterladen
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x7", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                int anz = 0;
                klient->getNachrichtEncrypted( (char*)&anz, 4 );
                for( int i = 0; i < anz; i++ )
                {
                    char l = 0;
                    klient->getNachrichtEncrypted( &l, 1 );
                    char *n = new char[ l + 1 ];
                    n[ l ] = 0;
                    if( l )
                        klient->getNachrichtEncrypted( n, l );
                    zNamen->add( new Text( n ) );
                    delete[] n;
                }
                cs.unlock();
                return anz;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return -1;
    }
    cs.unlock();
    return ret == 1;
}

int EditorKlient::deGetBildListe( Text *zDatei, RCArray< Text > *zNamen ) // DateienEditor: Liste mit in der Datei gespeicherten Bildern
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x8", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                klient->sendeEncrypted( zDatei->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    int anz = 0;
                    klient->getNachrichtEncrypted( (char*)&anz, 4 );
                    for( int i = 0; i < anz; i++ )
                    {
                        klient->getNachrichtEncrypted( &l, 1 );
                        char *n = new char[ l + 1 ];
                        n[ l ] = 0;
                        if( l )
                            klient->getNachrichtEncrypted( n, l );
                        zNamen->add( new Text( n ) );
                        delete[] n;
                    }
                    cs.unlock();
                    return anz;
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

int EditorKlient::deGetModelListe( Text *zDatei, RCArray< Text > *zNamen ) // DateienEditor Liste mit in der Datei gespeicherten Modellen
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x9", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                klient->sendeEncrypted( zDatei->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    int anz = 0;
                    klient->getNachrichtEncrypted( (char*)&anz, 4 );
                    for( int i = 0; i < anz; i++ )
                    {
                        klient->getNachrichtEncrypted( &l, 1 );
                        char *n = new char[ l + 1 ];
                        n[ l ] = 0;
                        if( l )
                            klient->getNachrichtEncrypted( n, l );
                        zNamen->add( new Text( n ) );
                        delete[] n;
                    }
                    cs.unlock();
                    return anz;
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

int EditorKlient::deGetSoundListe( Text *zDatei, RCArray< Text > *zNamen ) // DateienEditor: Liste mit in der Datei gespeicherten T�nen
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\xA", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                klient->sendeEncrypted( zDatei->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    int anz = 0;
                    klient->getNachrichtEncrypted( (char*)&anz, 4 );
                    for( int i = 0; i < anz; i++ )
                    {
                        klient->getNachrichtEncrypted( &l, 1 );
                        char *n = new char[ l + 1 ];
                        n[ l ] = 0;
                        if( l )
                            klient->getNachrichtEncrypted( n, l );
                        zNamen->add( new Text( n ) );
                        delete[] n;
                    }
                    cs.unlock();
                    return anz;
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::deModelL�schen( Text *zDatei, Text *zModel ) // DateienEditor: L�scht Modell
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\xB", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                klient->sendeEncrypted( zDatei->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    l = (char)zModel->getLength();
                    klient->sendeEncrypted( &l, 1 );
                    klient->sendeEncrypted( zModel->getText(), l );
                    klient->getNachrichtEncrypted( &ret, 1 );
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::deSoundL�schen( Text *zDatei, Text *zSound ) // DateienEditor: L�scht Ton
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\xC", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                klient->sendeEncrypted( zDatei->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    l = (char)zSound->getLength();
                    klient->sendeEncrypted( &l, 1 );
                    klient->sendeEncrypted( zSound->getText(), l );
                    klient->getNachrichtEncrypted( &ret, 1 );
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

Model2DData *EditorKlient::deModelLaden( Text *zDatei, Text *zModel, FBalken *zF ) // DateienEditor: l�d ein Model herunter
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\xD", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                klient->sendeEncrypted( zDatei->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    l = (char)zModel->getLength();
                    klient->sendeEncrypted( &l, 1 );
                    klient->sendeEncrypted( zModel->getText(), l );
                    klient->getNachrichtEncrypted( &ret, 1 );
                    if( ret == 1 )
                    {
                        int anz = 0;
                        klient->getNachrichtEncrypted( (char*)&anz, 4 );
                        zF->setAktionAnzahl( anz );
                        Array< Polygon2D > *pol = new Array< Polygon2D >();
                        for( int i = 0; i < anz; i++ )
                        {
                            Polygon2D p;
                            p.schwerpunkt = new Vertex( 0, 0 );
                            p.vertex = new Array< Vertex >();
                            p.tKordinaten = new Array< Vertex >();
                            klient->getNachrichtEncrypted( (char*)&p.transparent, 1 );
                            char nL�n = 0;
                            klient->getNachrichtEncrypted( &nL�n, 1 );
                            char *txt = new char[ nL�n + 1 ];
                            if( nL�n )
                                klient->getNachrichtEncrypted( txt, nL�n );
                            txt[ nL�n ] = 0;
                            p.name = new Text( txt );
                            delete[] txt;
                            int anz2 = 0;
                            klient->getNachrichtEncrypted( (char*)&anz2, 4 );
                            for( int j = 0; j < anz2; j++ )
                            {
                                Vertex v;
                                klient->getNachrichtEncrypted( (char*)&v.x, 4 );
                                klient->getNachrichtEncrypted( (char*)&v.y, 4 );
                                *p.schwerpunkt += v * (float)( 1.0 / anz2 );
                                Vertex t;
                                klient->getNachrichtEncrypted( (char*)&t.x, 4 );
                                klient->getNachrichtEncrypted( (char*)&t.y, 4 );
                                p.vertex->add( v );
                                p.tKordinaten->add( t );
                            }
                            pol->add( p );
                            zF->aktionPlus();
                        }
                        Model2DData *data = new Model2DData();
                        data->erstelleModell( pol );
                        cs.unlock();
                        return data;
                    }
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

GSL::GSLSoundV *EditorKlient::deSoundLaden( Text *zDatei, Text *zSound, FBalken *zF ) // DateienEditor: l�d Sound herunter
{
    HMODULE gslDll = dllDateien->ladeDLL( "GSL.dll", "data/bin/GSL.dll" );
    if( !gslDll )
    {
        fehler->setText( "Die DLL Datei 'data/bin/GSL.dll' wurde nicht gefunden." );
        return 0;
    }
    GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( gslDll, "getGSLDatei" );
    if( !getGSLDatei )
    {
        fehler->setText( "Der Einstiegspunkt 'getGSLDatei' wurde in der Datei 'data/bin/GSL.dll' nicht gefunden." );
        return 0;
    }
    DateiRemove( "data/tmp/editor/dateien/sounds/tmp.gsl" );
    DateiPfadErstellen( "data/tmp/editor/dateien/sounds/tmp.gsl" );
    GSL::GSLDateiV *gslDatei = getGSLDatei();
    gslDatei->setDatei( "data/tmp/editor/dateien/sounds/tmp.gsl" );
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        gslDatei->release();
        dllDateien->releaseDLL( "GSL.dll" );
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\xE", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                klient->sendeEncrypted( zDatei->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    l = (char)zSound->getLength();
                    klient->sendeEncrypted( &l, 1 );
                    klient->sendeEncrypted( zSound->getText(), l );
                    klient->getNachrichtEncrypted( &ret, 1 );
                    if( ret == 1 )
                    {
                        DownloadSound dws( klient, zF );
                        gslDatei->speicherSound( &dws, zSound->getText() );
                        GSL::GSLSoundV *s = gslDatei->getSound( zSound->getText() );
                        gslDatei->release();
                        dllDateien->releaseDLL( "GSL.dll" );
                        cs.unlock();
                        return s;
                    }
                }
            }
        }
    }
    gslDatei->release();
    dllDateien->releaseDLL( "GSL.dll" );
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::deModelSpeichern( Text *zDatei, Text *zModel, Model2DData *zData, FBalken *zF ) // DateienEditor: Speichert Modell
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\xF", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                klient->sendeEncrypted( zDatei->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    l = (char)zModel->getLength();
                    klient->sendeEncrypted( &l, 1 );
                    klient->sendeEncrypted( zModel->getText(), l );
                    klient->getNachrichtEncrypted( &ret, 1 );
                    if( ret == 1 )
                    {
                        int anz = zData->polygons ? zData->polygons->getEintragAnzahl() : 0;
                        zF->setAktionAnzahl( anz );
                        klient->sendeEncrypted( (char*)&anz, 4 );
                        for( int i = 0; i < anz; i++ )
                        {
                            Polygon2D pol = zData->polygons->get( i );
                            klient->sendeEncrypted( (char*)&pol.transparent, 1 );
                            char nL�n = pol.name->getLength();
                            klient->sendeEncrypted( &nL�n, 1 );
                            if( nL�n )
                                klient->sendeEncrypted( pol.name->getText(), nL�n );
                            int anz2 = pol.vertex->getEintragAnzahl();
                            klient->sendeEncrypted( (char*)&anz2, 4 );
                            for( int j = 0; j < anz2; j++ )
                            {
                                Vertex v = pol.vertex->get( j );
                                Vertex p;
                                if( pol.tKordinaten )
                                    p = pol.tKordinaten->hat( j ) ? pol.tKordinaten->get( j ) : Vertex( 0, 0 );
                                klient->sendeEncrypted( (char*)&v.x, 4 );
                                klient->sendeEncrypted( (char*)&v.y, 4 );
                                klient->sendeEncrypted( (char*)&p.x, 4 );
                                klient->sendeEncrypted( (char*)&p.y, 4 );
                            }
                            zF->aktionPlus();
                        }
                        klient->getNachrichtEncrypted( &ret, 1 );
                    }
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::deSoundSpeichern( Text *zDatei, Text *zSound, GSL::GSLSoundV *zData, FBalken *zF ) // DateienEditor: Speichert Sound
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xD", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            klient->sendeEncrypted( "\x10", 1 );
            klient->getNachrichtEncrypted( &ret, 1 );
            if( ret == 1 )
            {
                char l = (char)zDatei->getLength();
                klient->sendeEncrypted( &l, 1 );
                klient->sendeEncrypted( zDatei->getText(), l );
                klient->getNachrichtEncrypted( &ret, 1 );
                if( ret == 1 )
                {
                    l = (char)zSound->getLength();
                    klient->sendeEncrypted( &l, 1 );
                    klient->sendeEncrypted( zSound->getText(), l );
                    klient->getNachrichtEncrypted( &ret, 1 );
                    if( ret == 1 )
                    {
                        char channels = zData->istMono() ? 1 : 2;
                        klient->sendeEncrypted( &channels, 1 );
                        int sample = zData->getSampleRate();
                        klient->sendeEncrypted( (char*)&sample, 4 );
                        __int64 sl�n = zData->getDatLength();
                        klient->sendeEncrypted( (char*)&sl�n, 8 );
                        zF->setAktionAnzahl( sl�n );
                        zData->open();
                        char *buffer = new char[ 2048 ];
                        while( sl�n > 0 )
                        {
                            int l = sl�n > 2048 ? 2048 : (int)sl�n;
                            zData->getDaten( buffer, l );
                            klient->sende( buffer, l );
                            sl�n -= l;
                            zF->aktionPlus( l );
                        }
                        delete[] buffer;
                        zData->close();
                    }
                }
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

int EditorKlient::getVerkaufStatistik( Array< int > *verkauft, Array< int > *einkommen, Array< int > *gespielt ) // Gibt eine Verkaufsstatistik der letzten 30 Tage zur�ck
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\x10", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
        if( ret == 1 )
        {
            int kaufAnz = 0;
            klient->getNachrichtEncrypted( (char*)&kaufAnz, 4 );
            char anz = 0;
            klient->getNachrichtEncrypted( &anz, 1 );
            for( int i = 0; i < anz; i++ )
            {
                int kupfer = 0;
                int kauf = 0;
                int games = 0;
                klient->getNachrichtEncrypted( (char*)&kupfer, 4 );
                klient->getNachrichtEncrypted( (char*)&kauf, 4 );
                klient->getNachrichtEncrypted( (char*)&games, 4 );
                einkommen->add( kupfer );
                verkauft->add( kauf );
                gespielt->add( games );
            }
            cs.unlock();
            return kaufAnz;
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return 0;
}

bool EditorKlient::initEditor() // Initialisiert den Editor auf Serverseite
{
    cs.lock();
    if( !verbunden )
    {
        cs.unlock();
        return 0;
    }
    klient->sendeEncrypted( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtEncrypted( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeEncrypted( "\xE", 1 );
        klient->getNachrichtEncrypted( &ret, 1 );
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtEncrypted( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtEncrypted( f, byte );
        fehler->setText( f );
        delete[] f;
        cs.unlock();
        return 0;
    }
    cs.unlock();
    return ret == 1;
}

bool EditorKlient::keepAlive() // Erh�lt die Verbindung aufrecht
{
    if( !cs.tryLock() )
        return 1;
    if( !verbunden || !klient )
    {
        cs.unlock();
        return 0;
    }
    char res = 0;
    klient->sendeEncrypted( "\x5", 1 );
    klient->getNachrichtEncrypted( &res, 1 );
    cs.unlock();
    if( res != 1 )
    {
        trenne();
        fehler->setText( "Verbindung unterbrochen: 'Keep Alive' nicht erfolgreich." );
    }
    return res == 1;
}

bool EditorKlient::trenne() // trennt sich von dem Editor Server
{
    cs.lock();
    if( !klient || !verbunden )
    {
        if( klient )
            klient = klient->release();
        cs.unlock();
        return 1;
    }
    char serverReturn;
    klient->sendeEncrypted( "\4", 1 );
    klient->getNachrichtEncrypted( &serverReturn, 1 );
    if( serverReturn == 3 )
    {
        char l�n = 0;
        klient->getNachrichtEncrypted( &l�n, 1 );
        char *nachricht = new char[ l�n + 1 ];
        nachricht[ l�n ] = 0;
        klient->getNachrichtEncrypted( nachricht, l�n );
        delete[]nachricht;
    }
    klient->sendeEncrypted( "\3", 1 );
    klient->getNachrichtEncrypted( &serverReturn, 1 );
    klient->trenne();
    klient = klient->release();
    verbunden = 0;
    cs.unlock();
    return 1;
}

void EditorKlient::lock()
{
    cs.lock();
}

void EditorKlient::unlock()
{
    cs.unlock();
}

Klient *EditorKlient::zKlient() // gibt den Klient zur�ck
{
    if( cs.isLocked() && cs.zOwner() && cs.zOwner()->getThreadHandle() == GetCurrentThread() )
        return klient;
    return 0;
}

// constant
bool EditorKlient::istVerbunden() const // pr�ft, ob mit Editor Server verbunden
{
    return verbunden;
}

char *EditorKlient::getLetzterFehler() const // gibt den Letzten Fehlertext zu�ck
{
    return fehler->getText();
}

// Reference Counting
EditorKlientV *EditorKlient::getThis()
{
    ref++;
    return this;
}

EditorKlientV *EditorKlient::release()
{
    ref--;
    if( !ref )
        delete this;
    return 0;
}