#include "KartenLeser.h" #include #include "AccountHistorieDaten.h" #include // Inhalt der KartenLeser Klasse aus KartenLeser.h // Konstruktor KartenLeser::KartenLeser( int karteId, InformationServer *is ) { pfad = new Text( "" ); *pfad += karteId; while( DateiExistiert( pfad->getText() ) ) pfad->anhängen( "_" ); ref = 1; Text ip; int port; is->zDB()->getKartenServerPortIp( 0, karteId, &port, &ip ); Klient *klient = new Klient(); unsigned char schlüssel[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 }; klient->setSendeSchlüssel( (char*)schlüssel, 20 ); klient->setEmpfangSchlüssel( (char*)schlüssel, 20 ); if( !klient->verbinde( (unsigned short)port, ip ) ) { klient = klient->release(); return; } klient->sendeVerschlüsselt( "\x7", 1 ); char ret = 0; klient->getNachrichtVerschlüsselt( &ret, 1 ); if( ret == 1 ) { klient->sendeVerschlüsselt( (char*)&karteId, 4 ); klient->getNachrichtVerschlüsselt( &ret, 1 ); if( ret == 1 ) { int anz = 0; klient->getNachrichtVerschlüsselt( (char*)&anz, 4 ); for( int i = 0; i < anz; i++ ) { char län = 0; klient->getNachrichtVerschlüsselt( &län, 1 ); if( !län ) continue; char *pfa = new char[ län + 1 ]; pfa[ län ] = 0; klient->getNachrichtVerschlüsselt( pfa, län ); __int64 größe = 0; klient->getNachrichtVerschlüsselt( (char*)&größe, 8 ); char *buffer = new char[ 2048 ]; Text pf = pfad->getText(); pf += "/"; pf += pfa; delete[] pfa; Datei d; d.setDatei( pf ); d.erstellen(); d.öffnen( Datei::Style::schreiben ); while( größe ) { int l = größe >= 2048 ? 2048 : (int)größe; klient->getNachricht( buffer, l ); d.schreibe( buffer, l ); größe -= l; } d.schließen(); delete[] buffer; } } } if( ret == 3 ) { char byte = 0; klient->getNachrichtVerschlüsselt( &byte, 1 ); char *f = new char[ byte + 1 ]; f[ byte ] = 0; klient->getNachrichtVerschlüsselt( f, byte ); delete[] f; } klient->sendeVerschlüsselt( "\3", 1 ); klient->getNachrichtVerschlüsselt( &ret, 1 ); klient->trenne(); klient->release(); } // Destruktor KartenLeser::~KartenLeser() { DateiLöschen( pfad ); } // nicht constant bool KartenLeser::ladeSpielerTeamStruktur( SpielerTeamStruktur *sts ) { if( !pfad->getLänge() ) return 0; Text *pf = new Text( pfad->getText() ); pf->anhängen( "/sts.ltgd" ); Datei *datei = new Datei(); datei->setDatei( pf ); if( !datei->existiert() || datei->istOrdner() ) { datei->release(); return 0; } datei->öffnen( 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 län = 0; datei->lese( &län, 1 ); char *txt = new char[ län + 1 ]; txt[ län ] = 0; datei->lese( txt, län ); Text *name = new Text( txt ); delete[] txt; sts->teamName->set( name, i ); } if( sts->teamGröße ) sts->teamGröße->release(); sts->teamGröße = new Array< int >(); for( int i = 0; i < sts->teamAnzahl; i++ ) { int größe = 0; datei->lese( (char*)&größe, 4 ); sts->teamGröße->set( größe, i ); } datei->schließen(); datei->release(); return 1; } // constant 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; }