1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033 |
- #include "ShopClient.h"
- #include <Klient.h>
- #include "Keys.h"
- #include <Datei.h>
- #include <Globals.h>
- using namespace KSGClient;
- // Inhalt der ShopClient Klasse
- // Konstruktor
- ShopClient::ShopClient(int klientId, unsigned short port, const char* ip, const char* key, unsigned char keyLen)
- : ReferenceCounter()
- {
- this->ip = ip;
- this->port = port;
- cId = klientId;
- k = 0;
- this->key = new char[keyLen];
- memcpy(this->key, key, keyLen);
- this->keyLen = keyLen;
- }
- // Destruktor
- ShopClient::~ShopClient()
- {
- trenne(1);
- delete[] key;
- }
- // verbindet sich mit dem zugewiesenen Shop Server
- // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
- bool ShopClient::verbinde()
- {
- cs.lock();
- if (k)
- {
- cs.unlock();
- return 1;
- }
- k = new Network::Klient();
- int l = 0;
- char* key;
- Keys::getServerKey(&key, l, Keys::SHOP, Keys::SENDEN);
- k->setSendeKey(key, l);
- delete[] key;
- Keys::getServerKey(&key, l, Keys::SHOP, Keys::EMPFANGEN);
- k->setEmpfangKey(key, l);
- delete[] key;
- if (k->verbinde(port, ip))
- {
- if (k->sendeEncrypted("\1", 1))
- {
- k->sendeEncrypted((char*)&cId, 4);
- char serverReturn = 0;
- k->getNachrichtEncrypted(&serverReturn, 1);
- if (serverReturn == 3)
- {
- char byte = 0;
- k->getNachrichtEncrypted(&byte, 1);
- char* f = new char[byte + 1];
- f[byte] = 0;
- k->getNachrichtEncrypted(f, byte);
- err = "error while identifying client Shop Server returned: ";
- err += f;
- delete[]f;
- trenne(0);
- cs.unlock();
- return 0;
- }
- k->setSendeKey(this->key, this->keyLen);
- k->setEmpfangKey(this->key, this->keyLen);
- }
- else
- {
- err = "network error while sending to Shop Server";
- k = (Network::Klient*)k->release();
- cs.unlock();
- return 0;
- }
- }
- else
- {
- err = "network error while connecting to Shop Server";
- k = (Network::Klient*)k->release();
- cs.unlock();
- return 0;
- }
- cs.unlock();
- return 1;
- }
- // Gibt eine Liste mit Spiel Ids zurück, mit Spielen, die einen Bestimten Text im Namen haben
- // suche: Der Text, der im Namen der Spiele vorkommen soll
- // Gibt bei misserfolg 0 zurück
- Framework::Array< int >* ShopClient::suchSpiele(const char* suche)
- {
- char län = (char)textLength(suche);
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\5", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted(&län, 1);
- if (län)
- k->sendeEncrypted(suche, län);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- int anz = 0;
- k->getNachrichtEncrypted((char*)&anz, 4);
- Array< int >* ret = new Array< int >();
- for (int i = 0; i < anz; i++)
- {
- int w = 0;
- k->getNachrichtEncrypted((char*)&w, 4);
- ret->add(w);
- }
- cs.unlock();
- return ret;
- }
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&län, 1);
- char* fehler = new char[län + 1];
- fehler[län] = 0;
- if (län)
- k->getNachrichtEncrypted(fehler, län);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // läd Titelbild des Spieles herunter und speichert es unter data/tmp/shop/kazfen/spiele/{id}/titelbg.ltdb
- // id: Die Id des Spiels
- // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
- bool ShopClient::ladeSpielTitel(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\6", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- Text* pf = new Text("data/tmp/shop/kaufen/spiele/");
- pf->append(id);
- pf->append("/titelbg.ltdb");
- Datei* dat = new Datei();
- dat->setDatei(pf);
- dat->erstellen();
- dat->open(Datei::Style::schreiben);
- __int64 gr = 0;
- k->getNachrichtEncrypted((char*)&gr, 8);
- char bytes[2048];
- while (gr > 0)
- {
- int län = gr > 2048 ? 2048 : (int)gr;
- k->getNachricht(bytes, län);
- dat->schreibe(bytes, län);
- gr -= län;
- }
- dat->close();
- dat->release();
- }
- if (ret == 2)
- { // Verweis auf anderen ShopServer
- char län = 0;
- k->getNachrichtEncrypted((char*)&port, 4);
- k->getNachrichtEncrypted(&län, 1);
- char* ip = new char[län + 1];
- k->getNachrichtEncrypted(ip, län);
- ip[län] = 0;
- this->ip = ip;
- delete[] ip;
- k->trenne();
- k = (Network::Klient*)k->release();
- if (!verbinde())
- {
- err = "Fehler beim Verbinden mit zuständigen Shop Server.";
- cs.unlock();
- return 0;
- }
- cs.unlock();
- return ladeSpielTitel(id);
- }
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- cs.unlock();
- return 1;
- }
- // läd Shop Seite des Spieles herunter und speichert es unter data/tmp/shop/kazfen/spiele/{id}/seite.ksgs
- // id: Die Id des Spiels
- // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
- bool ShopClient::ladeSpielSeite(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\7", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- Text* pf = new Text("data/tmp/shop/kaufen/spiele/");
- pf->append(id);
- pf->append("/");
- int anz = 0;
- k->getNachrichtEncrypted((char*)&anz, 4);
- for (int i = 0; i < anz; i++)
- {
- char län = 0;
- k->getNachrichtEncrypted(&län, 1);
- char* name = new char[län + 1];
- name[län] = 0;
- k->getNachrichtEncrypted(name, län);
- Text* pfad = new Text(pf->getText());
- pfad->append(name);
- delete[] name;
- Datei* d = new Datei();
- d->setDatei(pfad);
- d->erstellen();
- d->open(Datei::Style::schreiben);
- __int64 gr = 0;
- k->getNachrichtEncrypted((char*)&gr, 8);
- char bytes[2048];
- while (gr > 0)
- {
- int län = gr > 2048 ? 2048 : (int)gr;
- k->getNachricht(bytes, län);
- d->schreibe(bytes, län);
- gr -= län;
- }
- d->close();
- d->release();
- }
- pf->release();
- }
- if (ret == 2)
- { // Verweis auf anderen ShopServer
- char län = 0;
- k->getNachrichtEncrypted((char*)&port, 4);
- k->getNachrichtEncrypted(&län, 1);
- char* ip = new char[län + 1];
- k->getNachrichtEncrypted(ip, län);
- ip[län] = 0;
- this->ip = ip;
- delete[] ip;
- k->trenne();
- k = (Network::Klient*)k->release();
- if (!verbinde())
- {
- err = "Fehler beim Verbinden mit zuständigen Shop Server.";
- cs.unlock();
- return 0;
- }
- cs.unlock();
- return ladeSpielSeite(id);
- }
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- cs.unlock();
- return 1;
- }
- // Gibt den Besitz Status eines Spiels zurück (0 = nicht im Besitz, 1 = Testversion, 2 = gekauft)
- // id: Die Id des Spiels
- int ShopClient::getSpielBesitzStatus(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\x8", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- int ret = 0;
- k->getNachrichtEncrypted((char*)&ret, 4);
- cs.unlock();
- return ret;
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // gibt die Anzahl der verbleibenden Spiele der Testversion zurück
- // id: Die Id des Spiels
- int ShopClient::getSpielTestversion(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\x9", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- int ret = 0;
- k->getNachrichtEncrypted((char*)&ret, 4);
- cs.unlock();
- return ret;
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // Gibt den Erwerbbarkeits Status eines Spiels zurück (0 = nichts, 1 = nur Testversion, 2 = nur Vollversion, 3 = beides)
- // id: Die Id des Spiels
- int ShopClient::istSpielErwerbbar(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\xA", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- int ret = 0;
- k->getNachrichtEncrypted((char*)&ret, 4);
- cs.unlock();
- return ret;
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // Gibt den Preis eines Spiels in Kupfer zurück
- // id: Die Id des Spiels
- // testVersion: 1:=Es wird der Preis der Testversion zurückgegeben, 0:=Es wird der Preis der Vollversion zurückgegeben
- int ShopClient::getSpielPreis(int id, bool testVersion)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\xB", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- k->sendeEncrypted((char*)&testVersion, 1);
- int ret = 0;
- k->getNachrichtEncrypted((char*)&ret, 4);
- cs.unlock();
- return ret;
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // Kauft ein Spiel
- // id: Die Id des Spiels
- // testVersion: 1:=Es wird die Testversion erworben, 0:=Es wird die Vollversion erworben
- bool ShopClient::spielErwerben(int spielId, bool testVersion)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\xC", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&spielId, 4);
- k->sendeEncrypted((char*)&testVersion, 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- cs.unlock();
- return 1;
- }
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // sucht nach Karten mit zu einem bestimmten Spiel
- // suche: Ein Text, der im Namen der Karte vorkommen soll
- // spielId: Die Id des Spiels
- // Gibt eine Liste Mit den Ids der gefundenen Karten zurück
- Framework::Array< int >* ShopClient::suchKarten(const char* suche, int spielId)
- {
- char län = (char)textLength(suche);
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\xD", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&spielId, 4);
- k->sendeEncrypted(&län, 1);
- if (län)
- k->sendeEncrypted(suche, län);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- int anz = 0;
- k->getNachrichtEncrypted((char*)&anz, 4);
- Array< int >* ret = new Array< int >();
- for (int i = 0; i < anz; i++)
- {
- int w = 0;
- k->getNachrichtEncrypted((char*)&w, 4);
- ret->add(w);
- }
- cs.unlock();
- return ret;
- }
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&län, 1);
- char* fehler = new char[län + 1];
- fehler[län] = 0;
- if (län)
- k->getNachrichtEncrypted(fehler, län);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // lädt das Titelbild der Karte herunter und speichert es unter data/tmp/shop/kaufen/karten/{id}/titelbg.ltdb
- // id: Die Id der Karte
- // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
- bool ShopClient::ladeKarteTitel(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\xE", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- Text* pf = new Text("data/tmp/shop/kaufen/karten/");
- pf->append(id);
- pf->append("/titelbg.ltdb");
- Datei* dat = new Datei();
- dat->setDatei(pf);
- dat->erstellen();
- dat->open(Datei::Style::schreiben);
- __int64 gr = 0;
- k->getNachrichtEncrypted((char*)&gr, 8);
- char bytes[2048];
- while (gr > 0)
- {
- int län = gr > 2048 ? 2048 : (int)gr;
- k->getNachricht(bytes, län);
- dat->schreibe(bytes, län);
- gr -= län;
- }
- dat->close();
- dat->release();
- }
- if (ret == 2)
- { // Verweis auf anderen ShopServer
- char län = 0;
- k->getNachrichtEncrypted((char*)&port, 4);
- k->getNachrichtEncrypted(&län, 1);
- char* ip = new char[län + 1];
- k->getNachrichtEncrypted(ip, län);
- ip[län] = 0;
- this->ip = ip;
- delete[] ip;
- k->trenne();
- k = (Network::Klient*)k->release();
- if (!verbinde())
- {
- err = "Fehler beim Verbinden mit zuständigen Shop Server.";
- cs.unlock();
- return 0;
- }
- cs.unlock();
- return ladeKarteTitel(id);
- }
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- cs.unlock();
- return 1;
- }
- // lädt die Shop Seite der Karte herunter und speichert es unter data/tmp/shop/kaufen/karten/{id}/seite.ksgs
- // id: Die Id der Karte
- // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
- bool ShopClient::ladeKarteSeite(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\xF", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- Text* pf = new Text("data/tmp/shop/kaufen/karten/");
- pf->append(id);
- pf->append("/");
- int anz = 0;
- k->getNachrichtEncrypted((char*)&anz, 4);
- for (int i = 0; i < anz; i++)
- {
- char län = 0;
- k->getNachrichtEncrypted(&län, 1);
- char* name = new char[län + 1];
- name[län] = 0;
- k->getNachrichtEncrypted(name, län);
- Text* pfad = new Text(pf->getText());
- pfad->append(name);
- delete[] name;
- Datei* d = new Datei();
- d->setDatei(pfad);
- d->erstellen();
- d->open(Datei::Style::schreiben);
- __int64 gr = 0;
- k->getNachrichtEncrypted((char*)&gr, 8);
- char bytes[2048];
- while (gr > 0)
- {
- int län = gr > 2048 ? 2048 : (int)gr;
- k->getNachricht(bytes, län);
- d->schreibe(bytes, län);
- gr -= län;
- }
- d->close();
- d->release();
- }
- pf->release();
- }
- if (ret == 2)
- { // Verweis auf anderen ShopServer
- char län = 0;
- k->getNachrichtEncrypted((char*)&port, 4);
- k->getNachrichtEncrypted(&län, 1);
- char* ip = new char[län + 1];
- k->getNachrichtEncrypted(ip, län);
- ip[län] = 0;
- this->ip = ip;
- delete[] ip;
- k->trenne();
- k = (Network::Klient*)k->release();
- if (!verbinde())
- {
- err = "Fehler beim Verbinden mit zuständigen Shop Server.";
- cs.unlock();
- return 0;
- }
- cs.unlock();
- return ladeKarteSeite(id);
- }
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- cs.unlock();
- return 1;
- }
- // Gibt den Besitz Status einer Karte zurück (0 = nicht im Besitz, 1 = Testversion, 2 = gekauft)
- // id: Die Id der Karte
- int ShopClient::getKarteBesitzStatus(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\x10", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- int ret = 0;
- k->getNachrichtEncrypted((char*)&ret, 4);
- cs.unlock();
- return ret;
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // gibt die Anzahl der verbleibenden Spiele der Testversion zurück
- // id: Die Id der Karte
- int ShopClient::getKarteTestversion(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\x11", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- int ret = 0;
- k->getNachrichtEncrypted((char*)&ret, 4);
- cs.unlock();
- return ret;
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // Gibt den Erwerbbarkeits Status einer Karte zurück (0 = nichts, 1 = nur Testversion, 2 = nur Vollversion, 3 = beides)
- // id: Die Id der Karte
- int ShopClient::istKarteErwerbbar(int id)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\x12", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- int ret = 0;
- k->getNachrichtEncrypted((char*)&ret, 4);
- cs.unlock();
- return ret;
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // Gibt den Preis einer Karte in Kupfer zurück
- // id: Die Id der Karte
- // testVersion: 1:=Es wird der Preis der Testversion zurückgegeben, 0:=Es wird der Preis der Vollversion zurückgegeben
- int ShopClient::getKartePreis(int id, bool testVersion)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\x13", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&id, 4);
- k->sendeEncrypted((char*)&testVersion, 1);
- int ret = 0;
- k->getNachrichtEncrypted((char*)&ret, 4);
- cs.unlock();
- return ret;
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // Kauft eine Karte
- // id: Die Id der Karte
- // testVersion: 1:=Es wird die Testversion erworben, 0:=Es wird die Vollversion erworben
- bool ShopClient::karteErwerben(int karteId, bool testVersion)
- {
- char ret = 0;
- cs.lock();
- if (!k)
- {
- err = "Der Client ist nicht verbunden.";
- cs.unlock();
- return 0;
- }
- k->sendeEncrypted("\x14", 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- k->sendeEncrypted((char*)&karteId, 4);
- k->sendeEncrypted((char*)&testVersion, 1);
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 1)
- {
- cs.unlock();
- return 1;
- }
- }
- if (ret == 3)
- {
- k->getNachrichtEncrypted(&ret, 1);
- char* fehler = new char[ret + 1];
- fehler[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(fehler, ret);
- err = fehler;
- delete[] fehler;
- cs.unlock();
- return 0;
- }
- err = "Unbekannter Fehler";
- cs.unlock();
- return 0;
- }
- // Erhält die Verbindung aufrecht
- // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
- // Sollte während einer bestehenden Verbindung etwa einmal alle 60 Sekunden aufgerufen werden, da sonst der Router die Verbindung automatisch trennt
- bool ShopClient::keepAlive()
- {
- if (!k)
- return 0;
- char res = 0;
- if (!cs.tryLock())
- return 1;
- Framework::logLine((char*)"Verbindungstest zum Shop Server...");
- bool ok = k->sendeEncrypted("\x15", 1);
- ok &= k->getNachrichtEncrypted(&res, 1);
- cs.unlock();
- if (res != 1 || !ok)
- {
- Framework::logLine((char*)"Verbindungsabbruch.");
- trenne(0);
- }
- else
- Framework::logLine((char*)"Verbindung besteht.");
- return res == 1;
- }
- // Trennt die Verbindung zum Server
- // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
- // Sollte erst nach einem erfolgreichen Aufruf von verbinde aufgerufen werden
- bool ShopClient::trenne(bool abmelden)
- {
- cs.lock();
- verbinde();
- if (!k)
- {
- cs.unlock();
- return 1;
- }
- if (abmelden)
- {
- k->sendeEncrypted("\4", 1);
- char ret = 0;
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 3)
- { // error
- k->getNachrichtEncrypted(&ret, 1);
- char* msg = new char[ret + 1];
- msg[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(msg, ret);
- err = "error while unregister Client Login Server returned: ";
- err += msg;
- delete[] msg;
- }
- }
- k->sendeEncrypted("\3", 1);
- char ret = 0;
- k->getNachrichtEncrypted(&ret, 1);
- if (ret == 3)
- { // error
- k->getNachrichtEncrypted(&ret, 1);
- char* msg = new char[ret + 1];
- msg[ret] = 0;
- if (ret)
- k->getNachrichtEncrypted(msg, ret);
- err = "error while trenne Login Server returned: ";
- err += msg;
- delete[] msg;
- }
- k->trenne();
- k = (Network::Klient*)k->release();
- cs.unlock();
- return 1;
- }
- // Gibt 1 zurück, falls der Client verbunden ist, 0 sonst
- bool ShopClient::istVerbunden() const
- {
- return k != 0;
- }
- // gibt den Letzten Fehlertext zuück
- // sollte erst aufgerufen werden, nachdem eine andere aufgerufene Methode fehlgeschlagen ist
- const char* ShopClient::getLetzterFehler() const
- {
- return err;
- }
|