#include "KartenLeser.h" #include #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) : ReferenceCounter() { this->ss = ss; pfad = new Text(""); 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*)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++) { unsigned char len = 0; klient->getNachrichtEncrypted((char*)&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; unsigned char byte = 0; klient->getNachrichtEncrypted((char*)&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(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->add(farbe); } 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->add(farbe); } if (sts->teamName) sts->teamName->release(); sts->teamName = new RCArray< Text >(); for (int i = 0; i < sts->teamAnzahl; i++) { unsigned char len = 0; datei->lese((char*)&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->add(name); } 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->add(size); } datei->close(); datei->release(); return 1; } // constant int KartenLeser::getKarteId() const { return karteId; } Text* KartenLeser::getPfad() const { return pfad ? dynamic_cast(pfad->getThis()) : 0; } Text* KartenLeser::zPfad() const { return pfad; }