ShopClient.cpp 22 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  1. #include "ShopClient.h"
  2. #include <Klient.h>
  3. #include "Keys.h"
  4. #include <Datei.h>
  5. #include <Globals.h>
  6. using namespace KSGClient;
  7. // Inhalt der ShopClient Klasse
  8. // Konstruktor
  9. ShopClient::ShopClient(int klientId, unsigned short port, const char* ip, const char* key, unsigned char keyLen)
  10. : ReferenceCounter()
  11. {
  12. this->ip = ip;
  13. this->port = port;
  14. cId = klientId;
  15. k = 0;
  16. this->key = new char[keyLen];
  17. memcpy(this->key, key, keyLen);
  18. this->keyLen = keyLen;
  19. }
  20. // Destruktor
  21. ShopClient::~ShopClient()
  22. {
  23. trenne(1);
  24. delete[] key;
  25. }
  26. // verbindet sich mit dem zugewiesenen Shop Server
  27. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  28. bool ShopClient::verbinde()
  29. {
  30. cs.lock();
  31. if (k)
  32. {
  33. cs.unlock();
  34. return 1;
  35. }
  36. k = new Network::Klient();
  37. int l = 0;
  38. char* key;
  39. Keys::getServerKey(&key, l, Keys::SHOP, Keys::SENDEN);
  40. k->setSendeKey(key, l);
  41. delete[] key;
  42. Keys::getServerKey(&key, l, Keys::SHOP, Keys::EMPFANGEN);
  43. k->setEmpfangKey(key, l);
  44. delete[] key;
  45. if (k->verbinde(port, ip))
  46. {
  47. if (k->sendeEncrypted("\1", 1))
  48. {
  49. k->sendeEncrypted((char*)&cId, 4);
  50. char serverReturn = 0;
  51. k->getNachrichtEncrypted(&serverReturn, 1);
  52. if (serverReturn == 3)
  53. {
  54. char byte = 0;
  55. k->getNachrichtEncrypted(&byte, 1);
  56. char* f = new char[byte + 1];
  57. f[byte] = 0;
  58. k->getNachrichtEncrypted(f, byte);
  59. err = "error while identifying client Shop Server returned: ";
  60. err += f;
  61. delete[]f;
  62. trenne(0);
  63. cs.unlock();
  64. return 0;
  65. }
  66. k->setSendeKey(this->key, this->keyLen);
  67. k->setEmpfangKey(this->key, this->keyLen);
  68. }
  69. else
  70. {
  71. err = "network error while sending to Shop Server";
  72. k = (Network::Klient*)k->release();
  73. cs.unlock();
  74. return 0;
  75. }
  76. }
  77. else
  78. {
  79. err = "network error while connecting to Shop Server";
  80. k = (Network::Klient*)k->release();
  81. cs.unlock();
  82. return 0;
  83. }
  84. cs.unlock();
  85. return 1;
  86. }
  87. // Gibt eine Liste mit Spiel Ids zurück, mit Spielen, die einen Bestimten Text im Namen haben
  88. // suche: Der Text, der im Namen der Spiele vorkommen soll
  89. // Gibt bei misserfolg 0 zurück
  90. Framework::Array< int >* ShopClient::suchSpiele(const char* suche)
  91. {
  92. char län = (char)textLength(suche);
  93. char ret = 0;
  94. cs.lock();
  95. if (!k)
  96. {
  97. err = "Der Client ist nicht verbunden.";
  98. cs.unlock();
  99. return 0;
  100. }
  101. k->sendeEncrypted("\5", 1);
  102. k->getNachrichtEncrypted(&ret, 1);
  103. if (ret == 1)
  104. {
  105. k->sendeEncrypted(&län, 1);
  106. if (län)
  107. k->sendeEncrypted(suche, län);
  108. k->getNachrichtEncrypted(&ret, 1);
  109. if (ret == 1)
  110. {
  111. int anz = 0;
  112. k->getNachrichtEncrypted((char*)&anz, 4);
  113. Array< int >* ret = new Array< int >();
  114. for (int i = 0; i < anz; i++)
  115. {
  116. int w = 0;
  117. k->getNachrichtEncrypted((char*)&w, 4);
  118. ret->add(w);
  119. }
  120. cs.unlock();
  121. return ret;
  122. }
  123. }
  124. if (ret == 3)
  125. {
  126. k->getNachrichtEncrypted(&län, 1);
  127. char* fehler = new char[län + 1];
  128. fehler[län] = 0;
  129. if (län)
  130. k->getNachrichtEncrypted(fehler, län);
  131. err = fehler;
  132. delete[] fehler;
  133. cs.unlock();
  134. return 0;
  135. }
  136. err = "Unbekannter Fehler";
  137. cs.unlock();
  138. return 0;
  139. }
  140. // läd Titelbild des Spieles herunter und speichert es unter data/tmp/shop/kazfen/spiele/{id}/titelbg.ltdb
  141. // id: Die Id des Spiels
  142. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  143. bool ShopClient::ladeSpielTitel(int id)
  144. {
  145. char ret = 0;
  146. cs.lock();
  147. if (!k)
  148. {
  149. err = "Der Client ist nicht verbunden.";
  150. cs.unlock();
  151. return 0;
  152. }
  153. k->sendeEncrypted("\6", 1);
  154. k->getNachrichtEncrypted(&ret, 1);
  155. if (ret == 1)
  156. {
  157. k->sendeEncrypted((char*)&id, 4);
  158. k->getNachrichtEncrypted(&ret, 1);
  159. if (ret == 1)
  160. {
  161. Text* pf = new Text("data/tmp/shop/kaufen/spiele/");
  162. pf->append(id);
  163. pf->append("/titelbg.ltdb");
  164. Datei* dat = new Datei();
  165. dat->setDatei(pf);
  166. dat->erstellen();
  167. dat->open(Datei::Style::schreiben);
  168. __int64 gr = 0;
  169. k->getNachrichtEncrypted((char*)&gr, 8);
  170. char bytes[2048];
  171. while (gr > 0)
  172. {
  173. int län = gr > 2048 ? 2048 : (int)gr;
  174. k->getNachricht(bytes, län);
  175. dat->schreibe(bytes, län);
  176. gr -= län;
  177. }
  178. dat->close();
  179. dat->release();
  180. }
  181. if (ret == 2)
  182. { // Verweis auf anderen ShopServer
  183. char län = 0;
  184. k->getNachrichtEncrypted((char*)&port, 4);
  185. k->getNachrichtEncrypted(&län, 1);
  186. char* ip = new char[län + 1];
  187. k->getNachrichtEncrypted(ip, län);
  188. ip[län] = 0;
  189. this->ip = ip;
  190. delete[] ip;
  191. k->trenne();
  192. k = (Network::Klient*)k->release();
  193. if (!verbinde())
  194. {
  195. err = "Fehler beim Verbinden mit zuständigen Shop Server.";
  196. cs.unlock();
  197. return 0;
  198. }
  199. cs.unlock();
  200. return ladeSpielTitel(id);
  201. }
  202. }
  203. if (ret == 3)
  204. {
  205. k->getNachrichtEncrypted(&ret, 1);
  206. char* fehler = new char[ret + 1];
  207. fehler[ret] = 0;
  208. if (ret)
  209. k->getNachrichtEncrypted(fehler, ret);
  210. err = fehler;
  211. delete[] fehler;
  212. cs.unlock();
  213. return 0;
  214. }
  215. cs.unlock();
  216. return 1;
  217. }
  218. // läd Shop Seite des Spieles herunter und speichert es unter data/tmp/shop/kazfen/spiele/{id}/seite.ksgs
  219. // id: Die Id des Spiels
  220. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  221. bool ShopClient::ladeSpielSeite(int id)
  222. {
  223. char ret = 0;
  224. cs.lock();
  225. if (!k)
  226. {
  227. err = "Der Client ist nicht verbunden.";
  228. cs.unlock();
  229. return 0;
  230. }
  231. k->sendeEncrypted("\7", 1);
  232. k->getNachrichtEncrypted(&ret, 1);
  233. if (ret == 1)
  234. {
  235. k->sendeEncrypted((char*)&id, 4);
  236. k->getNachrichtEncrypted(&ret, 1);
  237. if (ret == 1)
  238. {
  239. Text* pf = new Text("data/tmp/shop/kaufen/spiele/");
  240. pf->append(id);
  241. pf->append("/");
  242. int anz = 0;
  243. k->getNachrichtEncrypted((char*)&anz, 4);
  244. for (int i = 0; i < anz; i++)
  245. {
  246. char län = 0;
  247. k->getNachrichtEncrypted(&län, 1);
  248. char* name = new char[län + 1];
  249. name[län] = 0;
  250. k->getNachrichtEncrypted(name, län);
  251. Text* pfad = new Text(pf->getText());
  252. pfad->append(name);
  253. delete[] name;
  254. Datei* d = new Datei();
  255. d->setDatei(pfad);
  256. d->erstellen();
  257. d->open(Datei::Style::schreiben);
  258. __int64 gr = 0;
  259. k->getNachrichtEncrypted((char*)&gr, 8);
  260. char bytes[2048];
  261. while (gr > 0)
  262. {
  263. int län = gr > 2048 ? 2048 : (int)gr;
  264. k->getNachricht(bytes, län);
  265. d->schreibe(bytes, län);
  266. gr -= län;
  267. }
  268. d->close();
  269. d->release();
  270. }
  271. pf->release();
  272. }
  273. if (ret == 2)
  274. { // Verweis auf anderen ShopServer
  275. char län = 0;
  276. k->getNachrichtEncrypted((char*)&port, 4);
  277. k->getNachrichtEncrypted(&län, 1);
  278. char* ip = new char[län + 1];
  279. k->getNachrichtEncrypted(ip, län);
  280. ip[län] = 0;
  281. this->ip = ip;
  282. delete[] ip;
  283. k->trenne();
  284. k = (Network::Klient*)k->release();
  285. if (!verbinde())
  286. {
  287. err = "Fehler beim Verbinden mit zuständigen Shop Server.";
  288. cs.unlock();
  289. return 0;
  290. }
  291. cs.unlock();
  292. return ladeSpielSeite(id);
  293. }
  294. }
  295. if (ret == 3)
  296. {
  297. k->getNachrichtEncrypted(&ret, 1);
  298. char* fehler = new char[ret + 1];
  299. fehler[ret] = 0;
  300. if (ret)
  301. k->getNachrichtEncrypted(fehler, ret);
  302. err = fehler;
  303. delete[] fehler;
  304. cs.unlock();
  305. return 0;
  306. }
  307. cs.unlock();
  308. return 1;
  309. }
  310. // Gibt den Besitz Status eines Spiels zurück (0 = nicht im Besitz, 1 = Testversion, 2 = gekauft)
  311. // id: Die Id des Spiels
  312. int ShopClient::getSpielBesitzStatus(int id)
  313. {
  314. char ret = 0;
  315. cs.lock();
  316. if (!k)
  317. {
  318. err = "Der Client ist nicht verbunden.";
  319. cs.unlock();
  320. return 0;
  321. }
  322. k->sendeEncrypted("\x8", 1);
  323. k->getNachrichtEncrypted(&ret, 1);
  324. if (ret == 1)
  325. {
  326. k->sendeEncrypted((char*)&id, 4);
  327. int ret = 0;
  328. k->getNachrichtEncrypted((char*)&ret, 4);
  329. cs.unlock();
  330. return ret;
  331. }
  332. if (ret == 3)
  333. {
  334. k->getNachrichtEncrypted(&ret, 1);
  335. char* fehler = new char[ret + 1];
  336. fehler[ret] = 0;
  337. if (ret)
  338. k->getNachrichtEncrypted(fehler, ret);
  339. err = fehler;
  340. delete[] fehler;
  341. cs.unlock();
  342. return 0;
  343. }
  344. err = "Unbekannter Fehler";
  345. cs.unlock();
  346. return 0;
  347. }
  348. // gibt die Anzahl der verbleibenden Spiele der Testversion zurück
  349. // id: Die Id des Spiels
  350. int ShopClient::getSpielTestversion(int id)
  351. {
  352. char ret = 0;
  353. cs.lock();
  354. if (!k)
  355. {
  356. err = "Der Client ist nicht verbunden.";
  357. cs.unlock();
  358. return 0;
  359. }
  360. k->sendeEncrypted("\x9", 1);
  361. k->getNachrichtEncrypted(&ret, 1);
  362. if (ret == 1)
  363. {
  364. k->sendeEncrypted((char*)&id, 4);
  365. int ret = 0;
  366. k->getNachrichtEncrypted((char*)&ret, 4);
  367. cs.unlock();
  368. return ret;
  369. }
  370. if (ret == 3)
  371. {
  372. k->getNachrichtEncrypted(&ret, 1);
  373. char* fehler = new char[ret + 1];
  374. fehler[ret] = 0;
  375. if (ret)
  376. k->getNachrichtEncrypted(fehler, ret);
  377. err = fehler;
  378. delete[] fehler;
  379. cs.unlock();
  380. return 0;
  381. }
  382. err = "Unbekannter Fehler";
  383. cs.unlock();
  384. return 0;
  385. }
  386. // Gibt den Erwerbbarkeits Status eines Spiels zurück (0 = nichts, 1 = nur Testversion, 2 = nur Vollversion, 3 = beides)
  387. // id: Die Id des Spiels
  388. int ShopClient::istSpielErwerbbar(int id)
  389. {
  390. char ret = 0;
  391. cs.lock();
  392. if (!k)
  393. {
  394. err = "Der Client ist nicht verbunden.";
  395. cs.unlock();
  396. return 0;
  397. }
  398. k->sendeEncrypted("\xA", 1);
  399. k->getNachrichtEncrypted(&ret, 1);
  400. if (ret == 1)
  401. {
  402. k->sendeEncrypted((char*)&id, 4);
  403. int ret = 0;
  404. k->getNachrichtEncrypted((char*)&ret, 4);
  405. cs.unlock();
  406. return ret;
  407. }
  408. if (ret == 3)
  409. {
  410. k->getNachrichtEncrypted(&ret, 1);
  411. char* fehler = new char[ret + 1];
  412. fehler[ret] = 0;
  413. if (ret)
  414. k->getNachrichtEncrypted(fehler, ret);
  415. err = fehler;
  416. delete[] fehler;
  417. cs.unlock();
  418. return 0;
  419. }
  420. err = "Unbekannter Fehler";
  421. cs.unlock();
  422. return 0;
  423. }
  424. // Gibt den Preis eines Spiels in Kupfer zurück
  425. // id: Die Id des Spiels
  426. // testVersion: 1:=Es wird der Preis der Testversion zurückgegeben, 0:=Es wird der Preis der Vollversion zurückgegeben
  427. int ShopClient::getSpielPreis(int id, bool testVersion)
  428. {
  429. char ret = 0;
  430. cs.lock();
  431. if (!k)
  432. {
  433. err = "Der Client ist nicht verbunden.";
  434. cs.unlock();
  435. return 0;
  436. }
  437. k->sendeEncrypted("\xB", 1);
  438. k->getNachrichtEncrypted(&ret, 1);
  439. if (ret == 1)
  440. {
  441. k->sendeEncrypted((char*)&id, 4);
  442. k->sendeEncrypted((char*)&testVersion, 1);
  443. int ret = 0;
  444. k->getNachrichtEncrypted((char*)&ret, 4);
  445. cs.unlock();
  446. return ret;
  447. }
  448. if (ret == 3)
  449. {
  450. k->getNachrichtEncrypted(&ret, 1);
  451. char* fehler = new char[ret + 1];
  452. fehler[ret] = 0;
  453. if (ret)
  454. k->getNachrichtEncrypted(fehler, ret);
  455. err = fehler;
  456. delete[] fehler;
  457. cs.unlock();
  458. return 0;
  459. }
  460. err = "Unbekannter Fehler";
  461. cs.unlock();
  462. return 0;
  463. }
  464. // Kauft ein Spiel
  465. // id: Die Id des Spiels
  466. // testVersion: 1:=Es wird die Testversion erworben, 0:=Es wird die Vollversion erworben
  467. bool ShopClient::spielErwerben(int spielId, bool testVersion)
  468. {
  469. char ret = 0;
  470. cs.lock();
  471. if (!k)
  472. {
  473. err = "Der Client ist nicht verbunden.";
  474. cs.unlock();
  475. return 0;
  476. }
  477. k->sendeEncrypted("\xC", 1);
  478. k->getNachrichtEncrypted(&ret, 1);
  479. if (ret == 1)
  480. {
  481. k->sendeEncrypted((char*)&spielId, 4);
  482. k->sendeEncrypted((char*)&testVersion, 1);
  483. k->getNachrichtEncrypted(&ret, 1);
  484. if (ret == 1)
  485. {
  486. cs.unlock();
  487. return 1;
  488. }
  489. }
  490. if (ret == 3)
  491. {
  492. k->getNachrichtEncrypted(&ret, 1);
  493. char* fehler = new char[ret + 1];
  494. fehler[ret] = 0;
  495. if (ret)
  496. k->getNachrichtEncrypted(fehler, ret);
  497. err = fehler;
  498. delete[] fehler;
  499. cs.unlock();
  500. return 0;
  501. }
  502. err = "Unbekannter Fehler";
  503. cs.unlock();
  504. return 0;
  505. }
  506. // sucht nach Karten mit zu einem bestimmten Spiel
  507. // suche: Ein Text, der im Namen der Karte vorkommen soll
  508. // spielId: Die Id des Spiels
  509. // Gibt eine Liste Mit den Ids der gefundenen Karten zurück
  510. Framework::Array< int >* ShopClient::suchKarten(const char* suche, int spielId)
  511. {
  512. char län = (char)textLength(suche);
  513. char ret = 0;
  514. cs.lock();
  515. if (!k)
  516. {
  517. err = "Der Client ist nicht verbunden.";
  518. cs.unlock();
  519. return 0;
  520. }
  521. k->sendeEncrypted("\xD", 1);
  522. k->getNachrichtEncrypted(&ret, 1);
  523. if (ret == 1)
  524. {
  525. k->sendeEncrypted((char*)&spielId, 4);
  526. k->sendeEncrypted(&län, 1);
  527. if (län)
  528. k->sendeEncrypted(suche, län);
  529. k->getNachrichtEncrypted(&ret, 1);
  530. if (ret == 1)
  531. {
  532. int anz = 0;
  533. k->getNachrichtEncrypted((char*)&anz, 4);
  534. Array< int >* ret = new Array< int >();
  535. for (int i = 0; i < anz; i++)
  536. {
  537. int w = 0;
  538. k->getNachrichtEncrypted((char*)&w, 4);
  539. ret->add(w);
  540. }
  541. cs.unlock();
  542. return ret;
  543. }
  544. }
  545. if (ret == 3)
  546. {
  547. k->getNachrichtEncrypted(&län, 1);
  548. char* fehler = new char[län + 1];
  549. fehler[län] = 0;
  550. if (län)
  551. k->getNachrichtEncrypted(fehler, län);
  552. err = fehler;
  553. delete[] fehler;
  554. cs.unlock();
  555. return 0;
  556. }
  557. err = "Unbekannter Fehler";
  558. cs.unlock();
  559. return 0;
  560. }
  561. // lädt das Titelbild der Karte herunter und speichert es unter data/tmp/shop/kaufen/karten/{id}/titelbg.ltdb
  562. // id: Die Id der Karte
  563. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  564. bool ShopClient::ladeKarteTitel(int id)
  565. {
  566. char ret = 0;
  567. cs.lock();
  568. if (!k)
  569. {
  570. err = "Der Client ist nicht verbunden.";
  571. cs.unlock();
  572. return 0;
  573. }
  574. k->sendeEncrypted("\xE", 1);
  575. k->getNachrichtEncrypted(&ret, 1);
  576. if (ret == 1)
  577. {
  578. k->sendeEncrypted((char*)&id, 4);
  579. k->getNachrichtEncrypted(&ret, 1);
  580. if (ret == 1)
  581. {
  582. Text* pf = new Text("data/tmp/shop/kaufen/karten/");
  583. pf->append(id);
  584. pf->append("/titelbg.ltdb");
  585. Datei* dat = new Datei();
  586. dat->setDatei(pf);
  587. dat->erstellen();
  588. dat->open(Datei::Style::schreiben);
  589. __int64 gr = 0;
  590. k->getNachrichtEncrypted((char*)&gr, 8);
  591. char bytes[2048];
  592. while (gr > 0)
  593. {
  594. int län = gr > 2048 ? 2048 : (int)gr;
  595. k->getNachricht(bytes, län);
  596. dat->schreibe(bytes, län);
  597. gr -= län;
  598. }
  599. dat->close();
  600. dat->release();
  601. }
  602. if (ret == 2)
  603. { // Verweis auf anderen ShopServer
  604. char län = 0;
  605. k->getNachrichtEncrypted((char*)&port, 4);
  606. k->getNachrichtEncrypted(&län, 1);
  607. char* ip = new char[län + 1];
  608. k->getNachrichtEncrypted(ip, län);
  609. ip[län] = 0;
  610. this->ip = ip;
  611. delete[] ip;
  612. k->trenne();
  613. k = (Network::Klient*)k->release();
  614. if (!verbinde())
  615. {
  616. err = "Fehler beim Verbinden mit zuständigen Shop Server.";
  617. cs.unlock();
  618. return 0;
  619. }
  620. cs.unlock();
  621. return ladeKarteTitel(id);
  622. }
  623. }
  624. if (ret == 3)
  625. {
  626. k->getNachrichtEncrypted(&ret, 1);
  627. char* fehler = new char[ret + 1];
  628. fehler[ret] = 0;
  629. if (ret)
  630. k->getNachrichtEncrypted(fehler, ret);
  631. err = fehler;
  632. delete[] fehler;
  633. cs.unlock();
  634. return 0;
  635. }
  636. cs.unlock();
  637. return 1;
  638. }
  639. // lädt die Shop Seite der Karte herunter und speichert es unter data/tmp/shop/kaufen/karten/{id}/seite.ksgs
  640. // id: Die Id der Karte
  641. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  642. bool ShopClient::ladeKarteSeite(int id)
  643. {
  644. char ret = 0;
  645. cs.lock();
  646. if (!k)
  647. {
  648. err = "Der Client ist nicht verbunden.";
  649. cs.unlock();
  650. return 0;
  651. }
  652. k->sendeEncrypted("\xF", 1);
  653. k->getNachrichtEncrypted(&ret, 1);
  654. if (ret == 1)
  655. {
  656. k->sendeEncrypted((char*)&id, 4);
  657. k->getNachrichtEncrypted(&ret, 1);
  658. if (ret == 1)
  659. {
  660. Text* pf = new Text("data/tmp/shop/kaufen/karten/");
  661. pf->append(id);
  662. pf->append("/");
  663. int anz = 0;
  664. k->getNachrichtEncrypted((char*)&anz, 4);
  665. for (int i = 0; i < anz; i++)
  666. {
  667. char län = 0;
  668. k->getNachrichtEncrypted(&län, 1);
  669. char* name = new char[län + 1];
  670. name[län] = 0;
  671. k->getNachrichtEncrypted(name, län);
  672. Text* pfad = new Text(pf->getText());
  673. pfad->append(name);
  674. delete[] name;
  675. Datei* d = new Datei();
  676. d->setDatei(pfad);
  677. d->erstellen();
  678. d->open(Datei::Style::schreiben);
  679. __int64 gr = 0;
  680. k->getNachrichtEncrypted((char*)&gr, 8);
  681. char bytes[2048];
  682. while (gr > 0)
  683. {
  684. int län = gr > 2048 ? 2048 : (int)gr;
  685. k->getNachricht(bytes, län);
  686. d->schreibe(bytes, län);
  687. gr -= län;
  688. }
  689. d->close();
  690. d->release();
  691. }
  692. pf->release();
  693. }
  694. if (ret == 2)
  695. { // Verweis auf anderen ShopServer
  696. char län = 0;
  697. k->getNachrichtEncrypted((char*)&port, 4);
  698. k->getNachrichtEncrypted(&län, 1);
  699. char* ip = new char[län + 1];
  700. k->getNachrichtEncrypted(ip, län);
  701. ip[län] = 0;
  702. this->ip = ip;
  703. delete[] ip;
  704. k->trenne();
  705. k = (Network::Klient*)k->release();
  706. if (!verbinde())
  707. {
  708. err = "Fehler beim Verbinden mit zuständigen Shop Server.";
  709. cs.unlock();
  710. return 0;
  711. }
  712. cs.unlock();
  713. return ladeKarteSeite(id);
  714. }
  715. }
  716. if (ret == 3)
  717. {
  718. k->getNachrichtEncrypted(&ret, 1);
  719. char* fehler = new char[ret + 1];
  720. fehler[ret] = 0;
  721. if (ret)
  722. k->getNachrichtEncrypted(fehler, ret);
  723. err = fehler;
  724. delete[] fehler;
  725. cs.unlock();
  726. return 0;
  727. }
  728. cs.unlock();
  729. return 1;
  730. }
  731. // Gibt den Besitz Status einer Karte zurück (0 = nicht im Besitz, 1 = Testversion, 2 = gekauft)
  732. // id: Die Id der Karte
  733. int ShopClient::getKarteBesitzStatus(int id)
  734. {
  735. char ret = 0;
  736. cs.lock();
  737. if (!k)
  738. {
  739. err = "Der Client ist nicht verbunden.";
  740. cs.unlock();
  741. return 0;
  742. }
  743. k->sendeEncrypted("\x10", 1);
  744. k->getNachrichtEncrypted(&ret, 1);
  745. if (ret == 1)
  746. {
  747. k->sendeEncrypted((char*)&id, 4);
  748. int ret = 0;
  749. k->getNachrichtEncrypted((char*)&ret, 4);
  750. cs.unlock();
  751. return ret;
  752. }
  753. if (ret == 3)
  754. {
  755. k->getNachrichtEncrypted(&ret, 1);
  756. char* fehler = new char[ret + 1];
  757. fehler[ret] = 0;
  758. if (ret)
  759. k->getNachrichtEncrypted(fehler, ret);
  760. err = fehler;
  761. delete[] fehler;
  762. cs.unlock();
  763. return 0;
  764. }
  765. err = "Unbekannter Fehler";
  766. cs.unlock();
  767. return 0;
  768. }
  769. // gibt die Anzahl der verbleibenden Spiele der Testversion zurück
  770. // id: Die Id der Karte
  771. int ShopClient::getKarteTestversion(int id)
  772. {
  773. char ret = 0;
  774. cs.lock();
  775. if (!k)
  776. {
  777. err = "Der Client ist nicht verbunden.";
  778. cs.unlock();
  779. return 0;
  780. }
  781. k->sendeEncrypted("\x11", 1);
  782. k->getNachrichtEncrypted(&ret, 1);
  783. if (ret == 1)
  784. {
  785. k->sendeEncrypted((char*)&id, 4);
  786. int ret = 0;
  787. k->getNachrichtEncrypted((char*)&ret, 4);
  788. cs.unlock();
  789. return ret;
  790. }
  791. if (ret == 3)
  792. {
  793. k->getNachrichtEncrypted(&ret, 1);
  794. char* fehler = new char[ret + 1];
  795. fehler[ret] = 0;
  796. if (ret)
  797. k->getNachrichtEncrypted(fehler, ret);
  798. err = fehler;
  799. delete[] fehler;
  800. cs.unlock();
  801. return 0;
  802. }
  803. err = "Unbekannter Fehler";
  804. cs.unlock();
  805. return 0;
  806. }
  807. // Gibt den Erwerbbarkeits Status einer Karte zurück (0 = nichts, 1 = nur Testversion, 2 = nur Vollversion, 3 = beides)
  808. // id: Die Id der Karte
  809. int ShopClient::istKarteErwerbbar(int id)
  810. {
  811. char ret = 0;
  812. cs.lock();
  813. if (!k)
  814. {
  815. err = "Der Client ist nicht verbunden.";
  816. cs.unlock();
  817. return 0;
  818. }
  819. k->sendeEncrypted("\x12", 1);
  820. k->getNachrichtEncrypted(&ret, 1);
  821. if (ret == 1)
  822. {
  823. k->sendeEncrypted((char*)&id, 4);
  824. int ret = 0;
  825. k->getNachrichtEncrypted((char*)&ret, 4);
  826. cs.unlock();
  827. return ret;
  828. }
  829. if (ret == 3)
  830. {
  831. k->getNachrichtEncrypted(&ret, 1);
  832. char* fehler = new char[ret + 1];
  833. fehler[ret] = 0;
  834. if (ret)
  835. k->getNachrichtEncrypted(fehler, ret);
  836. err = fehler;
  837. delete[] fehler;
  838. cs.unlock();
  839. return 0;
  840. }
  841. err = "Unbekannter Fehler";
  842. cs.unlock();
  843. return 0;
  844. }
  845. // Gibt den Preis einer Karte in Kupfer zurück
  846. // id: Die Id der Karte
  847. // testVersion: 1:=Es wird der Preis der Testversion zurückgegeben, 0:=Es wird der Preis der Vollversion zurückgegeben
  848. int ShopClient::getKartePreis(int id, bool testVersion)
  849. {
  850. char ret = 0;
  851. cs.lock();
  852. if (!k)
  853. {
  854. err = "Der Client ist nicht verbunden.";
  855. cs.unlock();
  856. return 0;
  857. }
  858. k->sendeEncrypted("\x13", 1);
  859. k->getNachrichtEncrypted(&ret, 1);
  860. if (ret == 1)
  861. {
  862. k->sendeEncrypted((char*)&id, 4);
  863. k->sendeEncrypted((char*)&testVersion, 1);
  864. int ret = 0;
  865. k->getNachrichtEncrypted((char*)&ret, 4);
  866. cs.unlock();
  867. return ret;
  868. }
  869. if (ret == 3)
  870. {
  871. k->getNachrichtEncrypted(&ret, 1);
  872. char* fehler = new char[ret + 1];
  873. fehler[ret] = 0;
  874. if (ret)
  875. k->getNachrichtEncrypted(fehler, ret);
  876. err = fehler;
  877. delete[] fehler;
  878. cs.unlock();
  879. return 0;
  880. }
  881. err = "Unbekannter Fehler";
  882. cs.unlock();
  883. return 0;
  884. }
  885. // Kauft eine Karte
  886. // id: Die Id der Karte
  887. // testVersion: 1:=Es wird die Testversion erworben, 0:=Es wird die Vollversion erworben
  888. bool ShopClient::karteErwerben(int karteId, bool testVersion)
  889. {
  890. char ret = 0;
  891. cs.lock();
  892. if (!k)
  893. {
  894. err = "Der Client ist nicht verbunden.";
  895. cs.unlock();
  896. return 0;
  897. }
  898. k->sendeEncrypted("\x14", 1);
  899. k->getNachrichtEncrypted(&ret, 1);
  900. if (ret == 1)
  901. {
  902. k->sendeEncrypted((char*)&karteId, 4);
  903. k->sendeEncrypted((char*)&testVersion, 1);
  904. k->getNachrichtEncrypted(&ret, 1);
  905. if (ret == 1)
  906. {
  907. cs.unlock();
  908. return 1;
  909. }
  910. }
  911. if (ret == 3)
  912. {
  913. k->getNachrichtEncrypted(&ret, 1);
  914. char* fehler = new char[ret + 1];
  915. fehler[ret] = 0;
  916. if (ret)
  917. k->getNachrichtEncrypted(fehler, ret);
  918. err = fehler;
  919. delete[] fehler;
  920. cs.unlock();
  921. return 0;
  922. }
  923. err = "Unbekannter Fehler";
  924. cs.unlock();
  925. return 0;
  926. }
  927. // Erhält die Verbindung aufrecht
  928. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  929. // Sollte während einer bestehenden Verbindung etwa einmal alle 60 Sekunden aufgerufen werden, da sonst der Router die Verbindung automatisch trennt
  930. bool ShopClient::keepAlive()
  931. {
  932. if (!k)
  933. return 0;
  934. char res = 0;
  935. if (!cs.tryLock())
  936. return 1;
  937. Framework::logLine((char*)"Verbindungstest zum Shop Server...");
  938. bool ok = k->sendeEncrypted("\x15", 1);
  939. ok &= k->getNachrichtEncrypted(&res, 1);
  940. cs.unlock();
  941. if (res != 1 || !ok)
  942. {
  943. Framework::logLine((char*)"Verbindungsabbruch.");
  944. trenne(0);
  945. }
  946. else
  947. Framework::logLine((char*)"Verbindung besteht.");
  948. return res == 1;
  949. }
  950. // Trennt die Verbindung zum Server
  951. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  952. // Sollte erst nach einem erfolgreichen Aufruf von verbinde aufgerufen werden
  953. bool ShopClient::trenne(bool abmelden)
  954. {
  955. cs.lock();
  956. verbinde();
  957. if (!k)
  958. {
  959. cs.unlock();
  960. return 1;
  961. }
  962. if (abmelden)
  963. {
  964. k->sendeEncrypted("\4", 1);
  965. char ret = 0;
  966. k->getNachrichtEncrypted(&ret, 1);
  967. if (ret == 3)
  968. { // error
  969. k->getNachrichtEncrypted(&ret, 1);
  970. char* msg = new char[ret + 1];
  971. msg[ret] = 0;
  972. if (ret)
  973. k->getNachrichtEncrypted(msg, ret);
  974. err = "error while unregister Client Login Server returned: ";
  975. err += msg;
  976. delete[] msg;
  977. }
  978. }
  979. k->sendeEncrypted("\3", 1);
  980. char ret = 0;
  981. k->getNachrichtEncrypted(&ret, 1);
  982. if (ret == 3)
  983. { // error
  984. k->getNachrichtEncrypted(&ret, 1);
  985. char* msg = new char[ret + 1];
  986. msg[ret] = 0;
  987. if (ret)
  988. k->getNachrichtEncrypted(msg, ret);
  989. err = "error while trenne Login Server returned: ";
  990. err += msg;
  991. delete[] msg;
  992. }
  993. k->trenne();
  994. k = (Network::Klient*)k->release();
  995. cs.unlock();
  996. return 1;
  997. }
  998. // Gibt 1 zurück, falls der Client verbunden ist, 0 sonst
  999. bool ShopClient::istVerbunden() const
  1000. {
  1001. return k != 0;
  1002. }
  1003. // gibt den Letzten Fehlertext zuück
  1004. // sollte erst aufgerufen werden, nachdem eine andere aufgerufene Methode fehlgeschlagen ist
  1005. const char* ShopClient::getLetzterFehler() const
  1006. {
  1007. return err;
  1008. }