123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- #include "KartenLeser.h"
- #include <Datei.h>
- #ifdef WIN32
- #include "..\..\SpielServer.h"
- #include "..\..\..\Datenbank\Datenbank.h"
- #else
- #include "SpielServer.h"
- #include "Datenbank.h"
- #endif
- // Inhalt der KartenLeser Klasse aus KartenLeser.h
- // Konstruktor
- KartenLeser::KartenLeser( int sNum, int karteId, SpielServer *ss )
- {
- this->ss = ss;
- pfad = new Text( "" );
- ref = 1;
- this->sNum = sNum;
- setKarteId( karteId );
- }
- // Destruktor
- KartenLeser::~KartenLeser()
- {
- ss->release();
- pfad->release();
- }
- // nicht constant
- bool KartenLeser::setKarteId( int id )
- {
- bool retVal = 1;
- Text pf = ss->zInit()->zWert( "TempMapPfad" )->getText();
- pf += "/";
- pf += sNum;
- if( !DateiExistiert( pf ) )
- { // Karte Herunterladen
- Text ip;
- int port;
- ss->zDB()->getKartenServer( id, &port, &ip );
- Klient *klient = new Klient();
- unsigned char key[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
- klient->setSendeKey( (char*)key, 20 );
- klient->setEmpfangKey( (char*)key, 20 );
- if( !klient->verbinde( (unsigned short)port, ip ) )
- {
- klient = klient->release();
- return 0;
- }
- klient->sendeEncrypted( "\x7", 1 );
- char ret = 0;
- klient->getNachrichtEncrypted( &ret, 1 );
- if( ret == 1 )
- {
- klient->sendeEncrypted( (char*)&id, 4 );
- klient->getNachrichtEncrypted( &ret, 1 );
- if( ret == 2 )
- { // update
- retVal = 0;
- }
- else if( ret == 1 )
- {
- int anz = 0;
- klient->getNachrichtEncrypted( (char*)&anz, 4 );
- for( int i = 0; i < anz; i++ )
- {
- char len = 0;
- klient->getNachrichtEncrypted( &len, 1 );
- if( !len )
- continue;
- char *pfa = new char[ len + 1 ];
- pfa[ (int)len ] = 0;
- klient->getNachrichtEncrypted( pfa, len );
- __int64 size = 0;
- klient->getNachrichtEncrypted( (char*)&size, 8 );
- char *buffer = new char[ 2048 ];
- Text pfad = pf.getText();
- pfad += "/";
- pfad += pfa;
- delete[] pfa;
- Datei d;
- d.setDatei( pfad );
- d.erstellen();
- d.open( Datei::Style::schreiben );
- while( size )
- {
- int l = size >= 2048 ? 2048 : (int)size;
- klient->getNachricht( buffer, l );
- d.schreibe( buffer, l );
- size -= l;
- }
- d.close();
- delete[] buffer;
- }
- }
- }
- if( ret == 3 )
- {
- retVal = 0;
- char byte = 0;
- klient->getNachrichtEncrypted( &byte, 1 );
- char *f = new char[ byte + 1 ];
- f[ (int)byte ] = 0;
- klient->getNachrichtEncrypted( f, byte );
- delete[] f;
- }
- klient->sendeEncrypted( "\3", 1 );
- klient->getNachrichtEncrypted( &ret, 1 );
- klient->trenne();
- klient->release();
- }
- karteId = id;
- pfad->setText( (char*)pf );
- return retVal;
- }
- bool KartenLeser::ladeSpielerTeamStruktur( SpielerTeamStruktur *sts )
- {
- if( !pfad->getLength() )
- return 0;
- Text *pf = new Text( pfad->getText() );
- pf->append( "/sts.ltgd" );
- Datei *datei = new Datei();
- datei->setDatei( pf );
- if( !datei->existiert() || datei->istOrdner() )
- {
- datei->release();
- return 0;
- }
- datei->open( Datei::Style::lesen );
- datei->lese( (char*)&sts->spielerAnzahl, 4 );
- datei->lese( (char*)&sts->teamAnzahl, 4 );
- if( sts->spielerFarbe )
- sts->spielerFarbe->release();
- sts->spielerFarbe = new Array< int >();
- for( int i = 0; i < sts->spielerAnzahl; i++ )
- {
- int farbe = 0;
- datei->lese( (char*)&farbe, 4 );
- sts->spielerFarbe->set( farbe, i );
- }
- if( sts->teamFarbe )
- sts->teamFarbe->release();
- sts->teamFarbe = new Array< int >();
- for( int i = 0; i < sts->teamAnzahl; i++ )
- {
- int farbe = 0;
- datei->lese( (char*)&farbe, 4 );
- sts->teamFarbe->set( farbe, i );
- }
- if( sts->teamName )
- sts->teamName->release();
- sts->teamName = new RCArray< Text >();
- for( int i = 0; i < sts->teamAnzahl; i++ )
- {
- char len = 0;
- datei->lese( &len, 1 );
- char *txt = new char[ len + 1 ];
- txt[ (int)len ] = 0;
- datei->lese( txt, len );
- Text *name = new Text( txt );
- delete[] txt;
- sts->teamName->set( name, i );
- }
- if( sts->teamSize )
- sts->teamSize->release();
- sts->teamSize = new Array< int >();
- for( int i = 0; i < sts->teamAnzahl; i++ )
- {
- int size = 0;
- datei->lese( (char*)&size, 4 );
- sts->teamSize->set( size, i );
- }
- datei->close();
- datei->release();
- return 1;
- }
- // constant
- int KartenLeser::getKarteId() const
- {
- return karteId;
- }
- Text *KartenLeser::getPfad() const
- {
- return pfad ? pfad->getThis() : 0;
- }
- Text *KartenLeser::zPfad() const
- {
- return pfad;
- }
- // Reference Counting
- KartenLeser *KartenLeser::getThis()
- {
- ref++;
- return this;
- }
- KartenLeser *KartenLeser::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
|