ShopServer.cpp 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183
  1. #include "ShopServer.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. // Inhalt der ShopServer Klasse aus ShopServer.h
  6. // Konstruktor
  7. ShopServer::ShopServer(InitDatei* zIni)
  8. : Thread()
  9. {
  10. Network::Start(100);
  11. std::cout << "ShS: Verbindung mit Datenbank wird hergestellt...\n";
  12. db = new ShSDatenbank(zIni);
  13. klients = new RCArray< ShSKlient >();
  14. empfangen = 0;
  15. gesendet = 0;
  16. fehler = new Text();
  17. ini = dynamic_cast<InitDatei*>(zIni->getThis());
  18. id = (int)*zIni->zWert("ServerId");
  19. server = new Server();
  20. aServer = new SSLServer();
  21. aServer->setPrivateKeyPassword(zIni->zWert("SSLPasswort")->getText());
  22. aServer->setCertificateFile(zIni->zWert("SSLCert")->getText());
  23. aServer->setPrivateKeyFile(zIni->zWert("SSLKey")->getText());
  24. std::cout << "ShS: Starten des Admin Servers...\n";
  25. if (!aServer->verbinde((unsigned short)TextZuInt(ini->zWert("AdminServerPort")->getText(), 10), 10))
  26. {
  27. std::cout << "ShS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  28. exit(1);
  29. }
  30. db->setServerStatus(id, 2);
  31. end = 0;
  32. nichtPausiert = 0;
  33. InitializeCriticalSection(&cs);
  34. if (zIni->zWert("Aktiv")->istGleich("TRUE"))
  35. {
  36. serverStarten();
  37. serverFortsetzen();
  38. }
  39. updater = new Updater(dynamic_cast<ShopServer*>(getThis()));
  40. }
  41. // Destruktor
  42. ShopServer::~ShopServer()
  43. {
  44. updater->release();
  45. fehler->release();
  46. server->trenne();
  47. server->release();
  48. aServer->trenne();
  49. aServer->release();
  50. if (klients)
  51. klients->release();
  52. ini->release();
  53. db->release();
  54. DeleteCriticalSection(&cs);
  55. }
  56. // nicht constant
  57. void ShopServer::runn()
  58. {
  59. while (!end && aServer->isConnected())
  60. {
  61. SSLSKlient* klient;
  62. klient = aServer->getKlient();
  63. if (end && klient)
  64. {
  65. klient->trenne();
  66. klient = (SSLSKlient*)klient->release();
  67. Sleep(1000);
  68. return;
  69. }
  70. if (!klient)
  71. continue;
  72. ShSAKlient* clHandle = new ShSAKlient(klient, dynamic_cast<ShopServer*>(getThis()));
  73. clHandle->start();
  74. }
  75. }
  76. void ShopServer::thread()
  77. {
  78. while (server->isConnected())
  79. {
  80. SKlient* klient;
  81. klient = server->getKlient();
  82. if (!klient)
  83. continue;
  84. Framework::getThreadRegister()->cleanUpClosedThreads();
  85. ShSKlient* clHandle = new ShSKlient(klient, dynamic_cast<ShopServer*>(getThis()));
  86. EnterCriticalSection(&cs);
  87. klients->add(clHandle);
  88. LeaveCriticalSection(&cs);
  89. clHandle->start();
  90. }
  91. }
  92. void ShopServer::close()
  93. {
  94. db->setServerStatus(id, 1);
  95. server->trenne();
  96. #ifdef WIN32
  97. warteAufThread(1000);
  98. #endif
  99. EnterCriticalSection(&cs);
  100. for (int i = 0; i < klients->getEintragAnzahl(); i++)
  101. klients->z(i)->absturz();
  102. klients = (RCArray<ShSKlient>*) klients->release();
  103. LeaveCriticalSection(&cs);
  104. ende();
  105. run = 0;
  106. end = 1;
  107. Klient* klient = new Klient();
  108. klient->verbinde(aServer->getPort(), "127.0.0.1");
  109. Sleep(500);
  110. aServer->trenne();
  111. klient->release();
  112. }
  113. bool ShopServer::serverStarten()
  114. {
  115. if (nichtPausiert)
  116. {
  117. fehler->setText("Der Server konnte nicht gestartet werden: Der Server läuft bereits.");
  118. return 0;
  119. }
  120. if (server)
  121. server->release();
  122. server = new Server();
  123. if (server->verbinde((unsigned short)TextZuInt(ini->zWert("ServerPort")->getText(), 10), 10))
  124. {
  125. nichtPausiert = 1;
  126. start();
  127. return 1;
  128. }
  129. else
  130. {
  131. serverBeenden();
  132. fehler->setText("Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung.");
  133. return 0;
  134. }
  135. }
  136. bool ShopServer::serverPause()
  137. {
  138. if (!nichtPausiert)
  139. {
  140. fehler->setText("Der Server konnte nicht pausiert werden: Der Server läuft nicht.");
  141. return 0;
  142. }
  143. if (!db->setServerStatus(id, 2))
  144. {
  145. fehler->setText("Der Server konnte nicht pausiert werden: ");
  146. fehler->append(db->getLetzterFehler());
  147. return 0;
  148. }
  149. return 1;
  150. }
  151. bool ShopServer::serverFortsetzen()
  152. {
  153. if (!nichtPausiert)
  154. {
  155. fehler->setText("Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht.");
  156. return 0;
  157. }
  158. if (!db->setServerStatus(id, 3))
  159. {
  160. fehler->setText("Der Server konnte nicht fortgesetzt werden: ");
  161. fehler->append(db->getLetzterFehler());
  162. return 0;
  163. }
  164. return 1;
  165. }
  166. bool ShopServer::serverBeenden()
  167. {
  168. if (!nichtPausiert)
  169. {
  170. fehler->setText("Der Server konnte nicht beendet werden: Der Server läuft nicht.");
  171. return 0;
  172. }
  173. if (db->serverIstNichtPausiert(id))
  174. {
  175. fehler->setText("Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden.");
  176. return 0;
  177. }
  178. nichtPausiert = 0;
  179. ende();
  180. if (server)
  181. server->trenne();
  182. return 1;
  183. }
  184. bool ShopServer::setMaxKarten(int mk)
  185. {
  186. if (!db->setMaxKarten(id, mk))
  187. {
  188. fehler->setText("Die maximale Anzahl der Karten konnte nicht gesetzt werden:\n");
  189. fehler->append(db->getLetzterFehler());
  190. return 0;
  191. }
  192. ini->setWert("MaxKarten", Text() += mk);
  193. return 1;
  194. }
  195. bool ShopServer::absturzKlient(int klientId)
  196. {
  197. bool gefunden = 0;
  198. EnterCriticalSection(&cs);
  199. for (int i = 0; i < klients->getEintragAnzahl(); i++)
  200. {
  201. if (klients->z(i)->getKlientNummer() == klientId)
  202. {
  203. klients->z(i)->absturz();
  204. klients->remove(i);
  205. gefunden = 1;
  206. break;
  207. }
  208. }
  209. LeaveCriticalSection(&cs);
  210. return gefunden;
  211. }
  212. bool ShopServer::removeKlient(ShSKlient* zKlient)
  213. {
  214. bool gefunden = 0;
  215. EnterCriticalSection(&cs);
  216. for (int i = 0; i < klients->getEintragAnzahl(); i++)
  217. {
  218. if (klients->z(i) == zKlient)
  219. {
  220. klients->remove(i);
  221. gefunden = 1;
  222. break;
  223. }
  224. }
  225. LeaveCriticalSection(&cs);
  226. return gefunden;
  227. }
  228. void ShopServer::addGesendet(int bytes)
  229. {
  230. gesendet += bytes;
  231. }
  232. void ShopServer::addEmpfangen(int bytes)
  233. {
  234. empfangen += bytes;
  235. }
  236. // constant
  237. bool ShopServer::istAn() const
  238. {
  239. return db->serverIstNichtPausiert(id);
  240. }
  241. Server* ShopServer::zServer() const
  242. {
  243. return server;
  244. }
  245. ShSDatenbank* ShopServer::zDB() const
  246. {
  247. return db;
  248. }
  249. bool ShopServer::hatClients() const
  250. {
  251. return klients->hat(0);
  252. }
  253. InitDatei* ShopServer::zInit() const
  254. {
  255. return ini;
  256. }
  257. int ShopServer::getId() const
  258. {
  259. return id;
  260. }
  261. const char* ShopServer::getLetzterFehler() const
  262. {
  263. return fehler->getText();
  264. }
  265. // Inhalt der ShSAKlient Klasse aus ShopServer.h
  266. // Konstruktor
  267. ShSAKlient::ShSAKlient(SSLSKlient* klient, ShopServer* shs)
  268. : Thread()
  269. {
  270. this->klient = klient;
  271. name = new Text("");
  272. passwort = new Text("");
  273. adminId = 0;
  274. this->shs = shs;
  275. }
  276. // Destruktor
  277. ShSAKlient::~ShSAKlient()
  278. {
  279. klient->trenne();
  280. klient->release();
  281. shs->release();
  282. name->release();
  283. passwort->release();
  284. }
  285. // nicht constant
  286. void ShSAKlient::thread()
  287. {
  288. while (1)
  289. {
  290. char c = 0;
  291. if (!klient->getNachricht(&c, 1))
  292. break;
  293. else
  294. {
  295. bool br = 0;
  296. switch (c)
  297. {
  298. case 1: // Login
  299. if (1)
  300. {
  301. klient->sende("\1", 1);
  302. unsigned char nLen = 0;
  303. klient->getNachricht((char*)&nLen, 1);
  304. char* n = new char[nLen + 1];
  305. n[(int)nLen] = 0;
  306. if (nLen)
  307. klient->getNachricht(n, nLen);
  308. unsigned char pLen = 0;
  309. klient->getNachricht((char*)&pLen, 1);
  310. char* p = new char[pLen + 1];
  311. p[(int)pLen] = 0;
  312. if (pLen)
  313. klient->getNachricht(p, pLen);
  314. int adminId = shs->zDB()->istAdministrator(n, p);
  315. if (adminId)
  316. {
  317. klient->sende("\1", 1);
  318. name->setText(n);
  319. passwort->setText(p);
  320. this->adminId = adminId;
  321. }
  322. else
  323. errorZuKlient("Falsche Kombination aus Name und Passwort.");
  324. delete[] n;
  325. delete[] p;
  326. }
  327. break;
  328. case 2: // Logout
  329. adminId = 0;
  330. name->setText("");
  331. passwort->setText("");
  332. klient->sende("\1", 1);
  333. break;
  334. case 3: // Trennen
  335. br = 1;
  336. klient->sende("\1", 1);
  337. break;
  338. case 4: // Server starten
  339. if (!adminId)
  340. errorZuKlient("Du musst dich einloggen.");
  341. else
  342. {
  343. if (shs->zDB()->adminHatRecht(adminId, Admin_Recht::ShSStarten))
  344. {
  345. if (!shs->serverStarten())
  346. {
  347. Text* err = new Text();
  348. err->append(shs->getLetzterFehler());
  349. errorZuKlient(err->getText());
  350. err->release();
  351. }
  352. else
  353. klient->sende("\1", 1);
  354. }
  355. else
  356. errorZuKlient("Du bist nicht berechtigt den Server zu starten.");
  357. }
  358. break;
  359. case 5: // Server beenden
  360. if (!adminId)
  361. errorZuKlient("Du musst dich einloggen.");
  362. else
  363. {
  364. if (shs->zDB()->adminHatRecht(adminId, Admin_Recht::ShSBeenden))
  365. {
  366. if (shs->serverBeenden())
  367. klient->sende("\1", 1);
  368. else
  369. {
  370. Text* err = new Text();
  371. err->append(shs->getLetzterFehler());
  372. errorZuKlient(err->getText());
  373. err->release();
  374. }
  375. }
  376. else
  377. errorZuKlient("Du bist nicht berechtigt den Server zu beenden.");
  378. }
  379. break;
  380. case 6: // Programm Schließen
  381. if (!adminId)
  382. errorZuKlient("Du musst dich einloggen.");
  383. else
  384. {
  385. bool ok = 0;
  386. if (shs->isRunning())
  387. {
  388. if (shs->zDB()->adminHatRecht(adminId, Admin_Recht::ShSBeenden))
  389. {
  390. if (shs->serverBeenden())
  391. ok = 1;
  392. else
  393. {
  394. Text* err = new Text();
  395. err->append(shs->getLetzterFehler());
  396. errorZuKlient(err->getText());
  397. err->release();
  398. }
  399. }
  400. else
  401. errorZuKlient("Du bist nicht berechtigt den Server zu beenden.");
  402. }
  403. else
  404. ok = 1;
  405. if (ok && shs->hatClients())
  406. {
  407. errorZuKlient("Es sind noch Klients Online. Bitte versuche es später erneut.");
  408. break;
  409. }
  410. if (ok)
  411. {
  412. klient->sende("\1", 1);
  413. std::cout << "ShS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  414. shs->close();
  415. br = 1;
  416. }
  417. }
  418. break;
  419. case 7: // Programm abstürzen
  420. if (!adminId)
  421. errorZuKlient("Du musst dich einloggen.");
  422. else
  423. {
  424. bool ok = 0;
  425. if (shs->isRunning())
  426. {
  427. if (shs->zDB()->adminHatRecht(adminId, Admin_Recht::ShSBeenden))
  428. {
  429. shs->serverBeenden();
  430. ok = 1;
  431. }
  432. else
  433. errorZuKlient("Du bist nicht berechtigt den Server zu beenden.");
  434. }
  435. else
  436. ok = 1;
  437. if (ok)
  438. {
  439. klient->sende("\1", 1);
  440. std::cout << "ShS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  441. shs->close();
  442. br = 1;
  443. }
  444. }
  445. break;
  446. case 8: // Status Frage
  447. if (1)
  448. {
  449. char status = 0;
  450. if (shs->isRunning())
  451. {
  452. status = 1;
  453. if (shs->istAn())
  454. status = 2;
  455. }
  456. klient->sende("\1", 1);
  457. klient->sende(&status, 1);
  458. }
  459. break;
  460. case 9: // Server pausieren
  461. if (!adminId)
  462. errorZuKlient("Du musst dich einloggen.");
  463. else
  464. {
  465. klient->sende("\1", 1);
  466. char pause = 0;
  467. klient->getNachricht(&pause, 1);
  468. if (shs->zDB()->adminHatRecht(adminId, Admin_Recht::ShSPausieren))
  469. {
  470. bool ok = 0;
  471. if (pause)
  472. ok = shs->serverPause();
  473. else
  474. ok = shs->serverFortsetzen();
  475. if (ok)
  476. klient->sende("\1", 1);
  477. else
  478. {
  479. Text* err = new Text();
  480. err->append(shs->getLetzterFehler());
  481. errorZuKlient(err->getText());
  482. err->release();
  483. }
  484. }
  485. else
  486. {
  487. if (pause)
  488. errorZuKlient("Du bist nicht berechtigt den Server zu pausieren.");
  489. else
  490. errorZuKlient("Du bist nicht berechtigt den Server fortzusetzen.");
  491. }
  492. }
  493. break;
  494. case 0xA: // maximale Anzahl der Karten setzen
  495. if (!adminId)
  496. errorZuKlient("Du musst dich einloggen.");
  497. else
  498. {
  499. klient->sende("\1", 1);
  500. int maxK = 0;
  501. klient->getNachricht((char*)&maxK, 4);
  502. if (shs->zDB()->adminHatRecht(adminId, Admin_Recht::ShSMKChange))
  503. {
  504. if (shs->setMaxKarten(maxK))
  505. klient->sende("\1", 1);
  506. else
  507. {
  508. Text* err = new Text();
  509. err->append(shs->getLetzterFehler());
  510. errorZuKlient(err->getText());
  511. err->release();
  512. }
  513. }
  514. else
  515. errorZuKlient("Du bist nicht berechtigt die maximale Anzahl der Karten zu verändern.");
  516. }
  517. break;
  518. case 0xC: // klient absturtz
  519. if (1)
  520. {
  521. klient->sende("\1", 1);
  522. int klientId = 0;
  523. klient->getNachricht((char*)&klientId, 4);
  524. if (klientId && shs->absturzKlient(klientId))
  525. klient->sende("\1", 1);
  526. else
  527. klient->sende("\0", 1);
  528. }
  529. break;
  530. default:
  531. errorZuKlient("Unbekannte Nachricht!");
  532. break;
  533. }
  534. if (br)
  535. break;
  536. shs->addEmpfangen(klient->getDownloadBytes(1));
  537. shs->addGesendet(klient->getUploadBytes(1));
  538. }
  539. }
  540. shs->addEmpfangen(klient->getDownloadBytes(1));
  541. shs->addGesendet(klient->getUploadBytes(1));
  542. delete this;
  543. }
  544. void ShSAKlient::errorZuKlient(const char* nachricht) const // sendet eine Fehlernachricht zum Klient
  545. {
  546. klient->sende("\3", 1);
  547. char len = (char)textLength(nachricht);
  548. klient->sende(&len, 1);
  549. klient->sende(nachricht, len);
  550. }
  551. // Inhalt der ShSKlient aus ShopServer.h
  552. // Konstruktor
  553. ShSKlient::ShSKlient(SKlient* klient, ShopServer* shs)
  554. : Thread()
  555. {
  556. this->klient = klient;
  557. unsigned char key[20] = { 218, 226, 231, 216, 68, 63, 132, 155, 49, 235, 239, 0, 19, 23, 116, 244, 235, 21, 189, 53 };
  558. klient->setSendeKey((char*)key, 20);
  559. klient->setEmpfangKey((char*)key, 20);
  560. klientNummer = 0;
  561. this->shs = shs;
  562. }
  563. // Destruktor
  564. ShSKlient::~ShSKlient()
  565. {
  566. klient->release();
  567. shs->release();
  568. }
  569. // nicht constant
  570. void ShSKlient::absturz()
  571. {
  572. ende();
  573. klient->trenne();
  574. shs->zDB()->unregisterKlient(klientNummer, shs->getId());
  575. }
  576. void ShSKlient::thread()
  577. {
  578. while (1)
  579. {
  580. char c = 0;
  581. if (!klient->getNachrichtEncrypted(&c, 1))
  582. break;
  583. else
  584. {
  585. bool br = 0;
  586. switch (c)
  587. {
  588. case 1: // Klient identifikation
  589. klient->getNachrichtEncrypted((char*)&klientNummer, 4);
  590. if (!shs->zDB()->proveKlient(klientNummer, shs->getId()))
  591. {
  592. klientNummer = 0;
  593. errorZuKlient("Du bist nicht für diesen Server eingetragen");
  594. }
  595. else
  596. {
  597. Text* key = shs->zDB()->getKlientKey(klientNummer);
  598. if (!key)
  599. errorZuKlient("Es konnte kein Key ermittelt werden.");
  600. else
  601. {
  602. klient->sendeEncrypted("\1", 1);
  603. klient->setEmpfangKey(*key, key->getLength());
  604. klient->setSendeKey(*key, key->getLength());
  605. key->release();
  606. }
  607. }
  608. break;
  609. case 2: // Main / Erhaltung Server message
  610. if (1)
  611. {
  612. char befehl = 0;
  613. klient->getNachrichtEncrypted(&befehl, 1);
  614. switch (befehl)
  615. {
  616. case 2: // klient absturtz
  617. if (1)
  618. {
  619. int klientId = 0;
  620. klient->getNachrichtEncrypted((char*)&klientId, 4);
  621. if (klientId && shs->absturzKlient(klientId))
  622. klient->sendeEncrypted("\1", 1);
  623. else
  624. klient->sendeEncrypted("\0", 1);
  625. }
  626. break;
  627. default:
  628. errorZuKlient("Befehl nicht bekannt!");
  629. break;
  630. }
  631. }
  632. break;
  633. case 3: // Verbindungsende
  634. br = 1;
  635. klient->sendeEncrypted("\1", 1);
  636. break;
  637. case 4: // unregister Klient
  638. if (!klientNummer)
  639. {
  640. errorZuKlient("Du bist nicht Identifiziert.");
  641. break;
  642. }
  643. shs->zDB()->unregisterKlient(klientNummer, shs->getId());
  644. klient->sendeEncrypted("\1", 1);
  645. break;
  646. case 5: // nach Spielen suchen
  647. if (klientNummer)
  648. {
  649. klient->sendeEncrypted("\1", 1);
  650. unsigned char len = 0;
  651. klient->getNachrichtEncrypted((char*)&len, 1);
  652. char* suche = new char[len + 1];
  653. suche[(int)len] = 0;
  654. if (len)
  655. klient->getNachrichtEncrypted(suche, len);
  656. Array< int >* list = new Array< int >();
  657. if (shs->zDB()->getSpielArtListe(klientNummer, suche, list))
  658. {
  659. klient->sendeEncrypted("\1", 1);
  660. int anz = list->getEintragAnzahl();
  661. klient->sendeEncrypted((char*)&anz, 4);
  662. if (anz)
  663. {
  664. for (int i = 0; i < anz; i++)
  665. {
  666. int w = list->get(i);
  667. klient->sendeEncrypted((char*)&w, 4);
  668. }
  669. }
  670. }
  671. else
  672. errorZuKlient("Bei der Suche ist ein Fehler aufgetreten.");
  673. list->release();
  674. delete[] suche;
  675. }
  676. else
  677. errorZuKlient("Du bist nicht Identifiziert.");
  678. break;
  679. case 6: // frage nach Spiel Titelbild
  680. if (klientNummer)
  681. {
  682. klient->sendeEncrypted("\1", 1);
  683. int spielId = 0;
  684. klient->getNachrichtEncrypted((char*)&spielId, 4);
  685. if (!shs->zDB()->proveSpiel(shs->getId(), spielId))
  686. {
  687. Text ip = "";
  688. int port = 0;
  689. if (!shs->zDB()->getSpielShopServerPortIp(spielId, klientNummer, &port, &ip))
  690. errorZuKlient("Dieses Spiel ist momentan nicht erreichbar. Bitte versuche es später erneut.");
  691. else
  692. {
  693. klient->sendeEncrypted("\2", 1);
  694. klient->sendeEncrypted((char*)&port, 4);
  695. char len = (char)ip.getLength();
  696. klient->sendeEncrypted(&len, 1);
  697. klient->sendeEncrypted(ip.getText(), len);
  698. br = 1;
  699. break;
  700. }
  701. }
  702. Text* pfad = new Text(shs->zInit()->zWert("ShopSeitenPfad")->getText());
  703. pfad->append("/spiele/");
  704. pfad->append(spielId);
  705. pfad->append("/titelbg.ltdb");
  706. if (!DateiExistiert(pfad->getText()))
  707. {
  708. errorZuKlient("Das Spiel ist nicht vorhanden.");
  709. pfad->release();
  710. break;
  711. }
  712. klient->sendeEncrypted("\1", 1);
  713. Datei* dat = new Datei();
  714. dat->setDatei(pfad);
  715. dat->open(Datei::Style::lesen);
  716. __int64 gr = dat->getSize();
  717. klient->sendeEncrypted((char*)&gr, 8);
  718. char* bytes = new char[2048];
  719. while (gr > 0)
  720. {
  721. int len = gr > 2048 ? 2048 : (int)gr;
  722. dat->lese(bytes, len);
  723. klient->sende(bytes, len);
  724. gr -= len;
  725. }
  726. dat->close();
  727. dat->release();
  728. delete[] bytes;
  729. }
  730. else
  731. errorZuKlient("Du bist nicht Identifiziert.");
  732. break;
  733. case 7: // frage nach Spiel Seite
  734. if (klientNummer)
  735. {
  736. klient->sendeEncrypted("\1", 1);
  737. int spielId = 0;
  738. klient->getNachrichtEncrypted((char*)&spielId, 4);
  739. if (!shs->zDB()->proveSpiel(shs->getId(), spielId))
  740. {
  741. Text ip = "";
  742. int port = 0;
  743. if (!shs->zDB()->getSpielShopServerPortIp(spielId, klientNummer, &port, &ip))
  744. errorZuKlient("Dieses Spiel ist momentan nicht erreichbar. Bitte versuche es später erneut.");
  745. else
  746. {
  747. klient->sendeEncrypted("\2", 1);
  748. klient->sendeEncrypted((char*)&port, 4);
  749. char len = (char)ip.getLength();
  750. klient->sendeEncrypted(&len, 1);
  751. klient->sendeEncrypted(ip.getText(), len);
  752. br = 1;
  753. break;
  754. }
  755. }
  756. Text* pfad = new Text(shs->zInit()->zWert("ShopSeitenPfad")->getText());
  757. pfad->append("/spiele/");
  758. pfad->append(spielId);
  759. pfad->append("/seite");
  760. if (!DateiExistiert(pfad->getText()))
  761. {
  762. errorZuKlient("Das Spiel ist nicht vorhanden.");
  763. pfad->release();
  764. break;
  765. }
  766. klient->sendeEncrypted("\1", 1);
  767. Datei* dat = new Datei();
  768. dat->setDatei(pfad);
  769. RCArray< Text >* list = dat->getDateiListe();
  770. int dAnz = list->getEintragAnzahl();
  771. for (int i = 0; i < dAnz; i++)
  772. {
  773. if (DateiIstVerzeichnis(list->get(i)) || list->z(i)->istGleich(".") || list->z(i)->istGleich(".."))
  774. {
  775. list->remove(i);
  776. dAnz--;
  777. i--;
  778. }
  779. }
  780. klient->sendeEncrypted((char*)&dAnz, 4);
  781. for (int i = 0; i < dAnz; i++)
  782. {
  783. Text* pf = new Text(dat->zPfad()->getText());
  784. pf->append("/");
  785. pf->append(list->z(i)->getText());
  786. Datei* d = new Datei();
  787. d->setDatei(pf);
  788. d->open(Datei::Style::lesen);
  789. char nl = (char)list->z(i)->getLength();
  790. klient->sendeEncrypted(&nl, 1);
  791. klient->sendeEncrypted(list->z(i)->getText(), nl);
  792. __int64 gr = d->getSize();
  793. klient->sendeEncrypted((char*)&gr, 8);
  794. char* bytes = new char[2048];
  795. while (gr > 0)
  796. {
  797. int len = gr > 2048 ? 2048 : (int)gr;
  798. d->lese(bytes, len);
  799. klient->sende(bytes, len);
  800. gr -= len;
  801. }
  802. delete[] bytes;
  803. d->close();
  804. d->release();
  805. }
  806. list->release();
  807. dat->release();
  808. }
  809. else
  810. errorZuKlient("Du bist nicht Identifiziert.");
  811. break;
  812. case 8: // frage nach Spiel Besitz Status
  813. if (klientNummer)
  814. {
  815. klient->sendeEncrypted("\1", 1);
  816. int spielId = 0;
  817. klient->getNachrichtEncrypted((char*)&spielId, 4);
  818. int status = shs->zDB()->getSpielBesitzStatus(klientNummer, spielId);
  819. klient->sendeEncrypted((char*)&status, 4);
  820. }
  821. else
  822. errorZuKlient("Du bist nicht Identifiziert.");
  823. break;
  824. case 9: // frage nach Spiel Testversion Status
  825. if (klientNummer)
  826. {
  827. klient->sendeEncrypted("\1", 1);
  828. int spielId = 0;
  829. klient->getNachrichtEncrypted((char*)&spielId, 4);
  830. int status = shs->zDB()->getSpielTestversionStatus(klientNummer, spielId);
  831. klient->sendeEncrypted((char*)&status, 4);
  832. }
  833. else
  834. errorZuKlient("Du bist nicht Identifiziert.");
  835. break;
  836. case 0xA: // frage, ob Spiel erwerbbar ist
  837. if (klientNummer)
  838. {
  839. klient->sendeEncrypted("\1", 1);
  840. int spielId = 0;
  841. klient->getNachrichtEncrypted((char*)&spielId, 4);
  842. int status = shs->zDB()->getSpielErwerbbarStatus(klientNummer, spielId);
  843. klient->sendeEncrypted((char*)&status, 4);
  844. }
  845. else
  846. errorZuKlient("Du bist nicht Identifiziert.");
  847. break;
  848. case 0xB: // frage nach Spiel Preis
  849. if (klientNummer)
  850. {
  851. klient->sendeEncrypted("\1", 1);
  852. int spielId = 0;
  853. klient->getNachrichtEncrypted((char*)&spielId, 4);
  854. char testVersion = 0;
  855. klient->getNachrichtEncrypted(&testVersion, 1);
  856. int status = shs->zDB()->getSpielPreis(spielId, testVersion == 1);
  857. klient->sendeEncrypted((char*)&status, 4);
  858. }
  859. else
  860. errorZuKlient("Du bist nicht Identifiziert.");
  861. break;
  862. case 0xC: // Spiel kaufen
  863. if (klientNummer)
  864. {
  865. klient->sendeEncrypted("\1", 1);
  866. int spielId = 0;
  867. klient->getNachrichtEncrypted((char*)&spielId, 4);
  868. char testVersion = 0;
  869. klient->getNachrichtEncrypted(&testVersion, 1);
  870. bool ok = shs->zDB()->spielKaufen(klientNummer, spielId, testVersion == 1);
  871. if (ok)
  872. klient->sendeEncrypted("\1", 1);
  873. else
  874. errorZuKlient("Das Spiel konnte nicht erworben werden.");
  875. }
  876. else
  877. errorZuKlient("Du bist nicht Identifiziert.");
  878. break;
  879. case 0xD: // nach Karten suchen
  880. if (klientNummer)
  881. {
  882. klient->sendeEncrypted("\1", 1);
  883. int spielId = 0;
  884. klient->getNachrichtEncrypted((char*)&spielId, 4);
  885. unsigned char len = 0;
  886. klient->getNachrichtEncrypted((char*)&len, 1);
  887. char* suche = new char[len + 1];
  888. suche[(int)len] = 0;
  889. if (len)
  890. klient->getNachrichtEncrypted(suche, len);
  891. Array< int >* list = new Array< int >();
  892. if (shs->zDB()->getKarteListe(klientNummer, spielId, suche, list))
  893. {
  894. klient->sendeEncrypted("\1", 1);
  895. int anz = list->getEintragAnzahl();
  896. klient->sendeEncrypted((char*)&anz, 4);
  897. if (anz)
  898. {
  899. for (int i = 0; i < anz; i++)
  900. {
  901. int w = list->get(i);
  902. klient->sendeEncrypted((char*)&w, 4);
  903. }
  904. }
  905. }
  906. else
  907. errorZuKlient("Bei der Suche ist ein Fehler aufgetreten.");
  908. list->release();
  909. delete[] suche;
  910. }
  911. else
  912. errorZuKlient("Du bist nicht Identifiziert.");
  913. break;
  914. case 0xE: // frage nach Karte Titelbild
  915. if (klientNummer)
  916. {
  917. klient->sendeEncrypted("\1", 1);
  918. int karteId = 0;
  919. klient->getNachrichtEncrypted((char*)&karteId, 4);
  920. if (!shs->zDB()->proveKarte(shs->getId(), karteId))
  921. {
  922. Text ip = "";
  923. int port = 0;
  924. if (!shs->zDB()->getKarteShopServerPortIp(karteId, klientNummer, &port, &ip))
  925. errorZuKlient("Diese Karte ist momentan nicht erreichbar. Bitte versuche es später erneut.");
  926. else
  927. {
  928. klient->sendeEncrypted("\2", 1);
  929. klient->sendeEncrypted((char*)&port, 4);
  930. char len = (char)ip.getLength();
  931. klient->sendeEncrypted(&len, 1);
  932. klient->sendeEncrypted(ip.getText(), len);
  933. br = 1;
  934. break;
  935. }
  936. }
  937. Text* pfad = new Text(shs->zInit()->zWert("ShopSeitenPfad")->getText());
  938. pfad->append("/karten/");
  939. pfad->append(karteId);
  940. pfad->append("/titelbg.ltdb");
  941. if (!DateiExistiert(pfad->getText()))
  942. {
  943. errorZuKlient("Das Spiel ist nicht vorhanden.");
  944. pfad->release();
  945. break;
  946. }
  947. klient->sendeEncrypted("\1", 1);
  948. Datei* dat = new Datei();
  949. dat->setDatei(pfad);
  950. dat->open(Datei::Style::lesen);
  951. __int64 gr = dat->getSize();
  952. klient->sendeEncrypted((char*)&gr, 8);
  953. char* bytes = new char[2048];
  954. while (gr > 0)
  955. {
  956. int len = gr > 2048 ? 2048 : (int)gr;
  957. dat->lese(bytes, len);
  958. klient->sende(bytes, len);
  959. gr -= len;
  960. }
  961. dat->close();
  962. dat->release();
  963. delete[] bytes;
  964. }
  965. else
  966. errorZuKlient("Du bist nicht Identifiziert.");
  967. break;
  968. case 0xF: // frage nach Karte Seite
  969. if (klientNummer)
  970. {
  971. klient->sendeEncrypted("\1", 1);
  972. int karteId = 0;
  973. klient->getNachrichtEncrypted((char*)&karteId, 4);
  974. if (!shs->zDB()->proveKarte(shs->getId(), karteId))
  975. {
  976. Text ip = "";
  977. int port = 0;
  978. if (!shs->zDB()->getKarteShopServerPortIp(karteId, klientNummer, &port, &ip))
  979. errorZuKlient("Diese Karte ist momentan nicht erreichbar. Bitte versuche es später erneut.");
  980. else
  981. {
  982. klient->sendeEncrypted("\2", 1);
  983. klient->sendeEncrypted((char*)&port, 4);
  984. char len = (char)ip.getLength();
  985. klient->sendeEncrypted(&len, 1);
  986. klient->sendeEncrypted(ip.getText(), len);
  987. br = 1;
  988. break;
  989. }
  990. }
  991. Text* pfad = new Text(shs->zInit()->zWert("ShopSeitenPfad")->getText());
  992. pfad->append("/karten/");
  993. pfad->append(karteId);
  994. pfad->append("/seite");
  995. if (!DateiExistiert(pfad->getText()))
  996. {
  997. errorZuKlient("Das Spiel ist nicht vorhanden.");
  998. pfad->release();
  999. break;
  1000. }
  1001. klient->sendeEncrypted("\1", 1);
  1002. Datei* dat = new Datei();
  1003. dat->setDatei(pfad);
  1004. RCArray< Text >* list = dat->getDateiListe();
  1005. int dAnz = list->getEintragAnzahl();
  1006. for (int i = 0; i < dAnz; i++)
  1007. {
  1008. if (DateiIstVerzeichnis(list->get(i)) || list->z(i)->istGleich(".") || list->z(i)->istGleich(".."))
  1009. {
  1010. list->remove(i);
  1011. dAnz--;
  1012. i--;
  1013. }
  1014. }
  1015. klient->sendeEncrypted((char*)&dAnz, 4);
  1016. for (int i = 0; i < dAnz; i++)
  1017. {
  1018. Text* pf = new Text(dat->zPfad()->getText());
  1019. pf->append("/");
  1020. pf->append(list->z(i)->getText());
  1021. Datei* d = new Datei();
  1022. d->setDatei(pf);
  1023. d->open(Datei::Style::lesen);
  1024. char nl = (char)list->z(i)->getLength();
  1025. klient->sendeEncrypted(&nl, 1);
  1026. klient->sendeEncrypted(list->z(i)->getText(), nl);
  1027. __int64 gr = d->getSize();
  1028. klient->sendeEncrypted((char*)&gr, 8);
  1029. char* bytes = new char[2048];
  1030. while (gr > 0)
  1031. {
  1032. int len = gr > 2048 ? 2048 : (int)gr;
  1033. d->lese(bytes, len);
  1034. klient->sende(bytes, len);
  1035. gr -= len;
  1036. }
  1037. delete[] bytes;
  1038. d->close();
  1039. d->release();
  1040. }
  1041. list->release();
  1042. dat->release();
  1043. }
  1044. else
  1045. errorZuKlient("Du bist nicht Identifiziert.");
  1046. break;
  1047. case 0x10: // frage nach Karte Besitz Status
  1048. if (klientNummer)
  1049. {
  1050. klient->sendeEncrypted("\1", 1);
  1051. int karteId = 0;
  1052. klient->getNachrichtEncrypted((char*)&karteId, 4);
  1053. int status = shs->zDB()->getKarteBesitzStatus(klientNummer, karteId);
  1054. klient->sendeEncrypted((char*)&status, 4);
  1055. }
  1056. else
  1057. errorZuKlient("Du bist nicht Identifiziert.");
  1058. break;
  1059. case 0x11: // frage nach Karte Testversion Status
  1060. if (klientNummer)
  1061. {
  1062. klient->sendeEncrypted("\1", 1);
  1063. int karteId = 0;
  1064. klient->getNachrichtEncrypted((char*)&karteId, 4);
  1065. int status = shs->zDB()->getKarteTestversionStatus(klientNummer, karteId);
  1066. klient->sendeEncrypted((char*)&status, 4);
  1067. }
  1068. else
  1069. errorZuKlient("Du bist nicht Identifiziert.");
  1070. break;
  1071. case 0x12: // frage, ob Karte erwerbbar ist
  1072. if (klientNummer)
  1073. {
  1074. klient->sendeEncrypted("\1", 1);
  1075. int karteId = 0;
  1076. klient->getNachrichtEncrypted((char*)&karteId, 4);
  1077. int status = shs->zDB()->getKarteErwerbbarStatus(klientNummer, karteId);
  1078. klient->sendeEncrypted((char*)&status, 4);
  1079. }
  1080. else
  1081. errorZuKlient("Du bist nicht Identifiziert.");
  1082. break;
  1083. case 0x13: // frage nach Karte Preis
  1084. if (klientNummer)
  1085. {
  1086. klient->sendeEncrypted("\1", 1);
  1087. int karteId = 0;
  1088. klient->getNachrichtEncrypted((char*)&karteId, 4);
  1089. char testVersion = 0;
  1090. klient->getNachrichtEncrypted(&testVersion, 1);
  1091. int status = shs->zDB()->getKartePreis(karteId, testVersion == 1);
  1092. klient->sendeEncrypted((char*)&status, 4);
  1093. }
  1094. else
  1095. errorZuKlient("Du bist nicht Identifiziert.");
  1096. break;
  1097. case 0x14: // Karte kaufen
  1098. if (klientNummer)
  1099. {
  1100. klient->sendeEncrypted("\1", 1);
  1101. int karteId = 0;
  1102. klient->getNachrichtEncrypted((char*)&karteId, 4);
  1103. char testVersion = 0;
  1104. klient->getNachrichtEncrypted(&testVersion, 1);
  1105. bool ok = shs->zDB()->karteKaufen(klientNummer, karteId, testVersion == 1);
  1106. if (ok)
  1107. klient->sendeEncrypted("\1", 1);
  1108. else
  1109. errorZuKlient("Die Karte konnte nicht erworben werden.");
  1110. }
  1111. else
  1112. errorZuKlient("Du bist nicht Identifiziert.");
  1113. break;
  1114. case 0x15: // ping
  1115. if (1)
  1116. {
  1117. if (!klientNummer)
  1118. {
  1119. errorZuKlient("Du bist nicht Identifiziert.");
  1120. break;
  1121. }
  1122. klient->sendeEncrypted("\1", 1);
  1123. }
  1124. break;
  1125. default:
  1126. errorZuKlient("Unbekannte Nachricht!");
  1127. break;
  1128. }
  1129. if (br)
  1130. break;
  1131. shs->addEmpfangen(klient->getDownloadBytes(1));
  1132. shs->addGesendet(klient->getUploadBytes(1));
  1133. }
  1134. }
  1135. shs->addEmpfangen(klient->getDownloadBytes(1));
  1136. shs->addGesendet(klient->getUploadBytes(1));
  1137. shs->removeKlient(this); // delete this
  1138. }
  1139. // constant
  1140. void ShSKlient::errorZuKlient(const char* nachricht) const // sendet eine Fehlernachricht zum Klient
  1141. {
  1142. klient->sendeEncrypted("\3", 1);
  1143. char len = (char)textLength(nachricht);
  1144. klient->sendeEncrypted(&len, 1);
  1145. klient->sendeEncrypted(nachricht, len);
  1146. }
  1147. int ShSKlient::getKlientNummer() const // gibt die KlientId zurück
  1148. {
  1149. return klientNummer;
  1150. }