HistorieServer.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. #include "HistorieServer.h"
  2. #include <iostream>
  3. #include "SpielServerKlient.h"
  4. #include <Globals.h>
  5. // Inhalt der HistorieServer Klasse aus HistorieServer.h
  6. // Konstruktor
  7. HistorieServer::HistorieServer( InitDatei *zIni )
  8. : Thread()
  9. {
  10. Network::Start( 100 );
  11. std::cout << "HS: Verbindung mit Datenbank wird hergestellt...\n";
  12. db = new HSDatenbank( zIni );
  13. klientAnzahl = 0;
  14. klients = new RCArray< HSKlient >();
  15. empfangen = 0;
  16. gesendet = 0;
  17. fehler = new Text();
  18. ini = zIni->getThis();
  19. if( !db->serverAnmelden( zIni ) )
  20. {
  21. std::cout << "HS: Der Server konnte nicht in die Datenbank eingetragen werden:\n";
  22. Text *txt = db->getLetzterFehler();
  23. std::cout << txt->getText() << "\nDas Programm wird beendet.";
  24. txt->release();
  25. exit( 1 );
  26. }
  27. id = *zIni->zWert( "ServerId" );
  28. server = new Server();
  29. aServer = new Server();
  30. std::cout << "HS: Starten des Admin Servers...\n";
  31. if( !aServer->verbinde( (unsigned short)db->getAdminPort( id ), 10 ) )
  32. {
  33. std::cout << "HS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  34. exit( 1 );
  35. }
  36. db->setServerStatus( id, 2 );
  37. end = 0;
  38. nichtPausiert = 0;
  39. InitializeCriticalSection( &cs );
  40. ref = 1;
  41. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  42. {
  43. serverStarten();
  44. serverFortsetzen();
  45. }
  46. }
  47. // Destruktor
  48. HistorieServer::~HistorieServer()
  49. {
  50. fehler->release();
  51. server->trenne();
  52. server->release();
  53. aServer->trenne();
  54. aServer->release();
  55. if( klients )
  56. klients->release();
  57. ini->release();
  58. db->release();
  59. DeleteCriticalSection( &cs );
  60. }
  61. // nicht constant
  62. void HistorieServer::runn()
  63. {
  64. while( !end )
  65. {
  66. SKlient *klient;
  67. klient = aServer->getKlient();
  68. if( end && klient )
  69. {
  70. klient->trenne();
  71. klient = klient->release();
  72. Sleep( 1000 );
  73. return;
  74. }
  75. if( !klient )
  76. return;
  77. HSAKlient *clHandle = new HSAKlient( klient, getThis() );
  78. clHandle->start();
  79. }
  80. }
  81. void HistorieServer::thread()
  82. {
  83. while( 1 )
  84. {
  85. SKlient *klient;
  86. klient = server->getKlient();
  87. if( !klient )
  88. break;
  89. Framework::getThreadRegister()->cleanUpClosedThreads();
  90. HSKlient *clHandle = new HSKlient( klient, getThis() );
  91. EnterCriticalSection( &cs );
  92. klients->set( clHandle, klientAnzahl );
  93. klientAnzahl++;
  94. LeaveCriticalSection( &cs );
  95. clHandle->start();
  96. }
  97. }
  98. void HistorieServer::close()
  99. {
  100. db->setServerStatus( id, 1 );
  101. server->trenne();
  102. EnterCriticalSection( &cs );
  103. for( int i = 0; i < klientAnzahl; i++ )
  104. klients->z( i )->absturz();
  105. klients = klients->release();
  106. klientAnzahl = 0;
  107. LeaveCriticalSection( &cs );
  108. ende();
  109. run = 0;
  110. end = 1;
  111. Klient *klient = new Klient();
  112. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  113. Sleep( 500 );
  114. aServer->trenne();
  115. klient->release();
  116. }
  117. bool HistorieServer::serverStarten()
  118. {
  119. if( nichtPausiert )
  120. {
  121. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  122. return 0;
  123. }
  124. if( server )
  125. server->release();
  126. server = new Server();
  127. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  128. {
  129. nichtPausiert = 1;
  130. start();
  131. return 1;
  132. }
  133. else
  134. {
  135. serverBeenden();
  136. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  137. return 0;
  138. }
  139. }
  140. bool HistorieServer::serverPause()
  141. {
  142. if( !nichtPausiert )
  143. {
  144. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  145. return 0;
  146. }
  147. if( !db->setServerStatus( id, 2 ) )
  148. {
  149. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  150. fehler->append( db->getLetzterFehler() );
  151. return 0;
  152. }
  153. return 1;
  154. }
  155. bool HistorieServer::serverFortsetzen()
  156. {
  157. if( !nichtPausiert )
  158. {
  159. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  160. return 0;
  161. }
  162. if( !db->setServerStatus( id, 3 ) )
  163. {
  164. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  165. fehler->append( db->getLetzterFehler() );
  166. return 0;
  167. }
  168. return 1;
  169. }
  170. bool HistorieServer::serverBeenden()
  171. {
  172. if( !nichtPausiert )
  173. {
  174. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  175. return 0;
  176. }
  177. if( db->serverIstNichtPausiert( id ) )
  178. {
  179. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  180. return 0;
  181. }
  182. nichtPausiert = 0;
  183. ende();
  184. if( server )
  185. server->trenne();
  186. return 1;
  187. }
  188. bool HistorieServer::setMaxKlients( int mc )
  189. {
  190. if( !db->setMaxClients( id, mc ) )
  191. {
  192. fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
  193. fehler->append( db->getLetzterFehler() );
  194. return 0;
  195. }
  196. ini->setWert( "MaxClients", Text() += mc );
  197. return 1;
  198. }
  199. bool HistorieServer::setMaxSpiele( int ms )
  200. {
  201. if( !db->setMaxSpiele( id, ms ) )
  202. {
  203. fehler->setText( "Die maximale Anzahl der Spiele konnte nicht gesetzt werden:\n" );
  204. fehler->append( db->getLetzterFehler() );
  205. return 0;
  206. }
  207. ini->setWert( "MaxSpiele", Text() += ms );
  208. return 1;
  209. }
  210. bool HistorieServer::absturzKlient( int klientId )
  211. {
  212. bool gefunden = 0;
  213. EnterCriticalSection( &cs );
  214. for( int i = 0; i < klientAnzahl; i++ )
  215. {
  216. if( klients->z( i ) && klients->z( i )->getKlientNummer() == klientId )
  217. {
  218. klients->z( i )->absturz();
  219. klients->remove( i );
  220. klientAnzahl--;
  221. gefunden = 1;
  222. break;
  223. }
  224. }
  225. LeaveCriticalSection( &cs );
  226. return gefunden;
  227. }
  228. bool HistorieServer::removeKlient( HSKlient *zKlient )
  229. {
  230. bool gefunden = 0;
  231. EnterCriticalSection( &cs );
  232. for( int i = 0; i < klientAnzahl; i++ )
  233. {
  234. if( klients->z( i ) == zKlient )
  235. {
  236. klients->remove( i );
  237. klientAnzahl--;
  238. gefunden = 1;
  239. break;
  240. }
  241. }
  242. LeaveCriticalSection( &cs );
  243. return gefunden;
  244. }
  245. void HistorieServer::addGesendet( int bytes )
  246. {
  247. gesendet += bytes;
  248. }
  249. void HistorieServer::addEmpfangen( int bytes )
  250. {
  251. empfangen += bytes;
  252. }
  253. // constant
  254. bool HistorieServer::istAn() const
  255. {
  256. return db->serverIstNichtPausiert( id );
  257. }
  258. Server *HistorieServer::zServer() const
  259. {
  260. return server;
  261. }
  262. HSDatenbank *HistorieServer::zDB() const
  263. {
  264. return db;
  265. }
  266. bool HistorieServer::hatClients() const
  267. {
  268. return klientAnzahl > 0;
  269. }
  270. int HistorieServer::getId() const
  271. {
  272. return id;
  273. }
  274. char *HistorieServer::getLetzterFehler() const
  275. {
  276. return fehler->getText();
  277. }
  278. InitDatei *HistorieServer::zIni() const
  279. {
  280. return ini;
  281. }
  282. // Reference Counting
  283. HistorieServer *HistorieServer::getThis()
  284. {
  285. ref++;
  286. return this;
  287. }
  288. HistorieServer *HistorieServer::release()
  289. {
  290. ref--;
  291. if( !ref )
  292. delete this;
  293. return 0;
  294. }
  295. // Inhalt der HSAKlient Klasse aus HistorieServer.h
  296. // Konstruktor
  297. HSAKlient::HSAKlient( SKlient *klient, HistorieServer *hs )
  298. : Thread()
  299. {
  300. this->klient = klient;
  301. unsigned char key[ 20 ] = { 230, 14, 195, 114, 204, 79, 136, 125, 73, 119, 191, 155, 162, 80, 9, 63, 210, 55, 39, 203 };
  302. klient->setSendeKey( (char*)key, 20 );
  303. klient->setEmpfangKey( (char*)key, 20 );
  304. name = new Text( "" );
  305. passwort = new Text( "" );
  306. adminId = 0;
  307. version = 0;
  308. this->hs = hs;
  309. }
  310. // Destruktor
  311. HSAKlient::~HSAKlient()
  312. {
  313. klient->trenne();
  314. klient->release();
  315. hs->release();
  316. name->release();
  317. passwort->release();
  318. }
  319. // nicht constant
  320. void HSAKlient::thread()
  321. {
  322. while( 1 )
  323. {
  324. char c = 0;
  325. if( !klient->getNachrichtEncrypted( &c, 1 ) )
  326. break;
  327. else
  328. {
  329. bool br = 0;
  330. switch( c )
  331. {
  332. case 1: // Login
  333. if( 1 )
  334. {
  335. klient->sendeEncrypted( "\1", 1 );
  336. char nLen = 0;
  337. klient->getNachrichtEncrypted( &nLen, 1 );
  338. char *n = new char[ nLen + 1 ];
  339. n[ (int)nLen ] = 0;
  340. if( nLen )
  341. klient->getNachrichtEncrypted( n, nLen );
  342. char pLen = 0;
  343. klient->getNachrichtEncrypted( &pLen, 1 );
  344. char *p = new char[ pLen + 1 ];
  345. p[ (int)pLen ] = 0;
  346. if( pLen )
  347. klient->getNachrichtEncrypted( p, pLen );
  348. int adminId = hs->zDB()->istAdministrator( n, p );
  349. if( adminId )
  350. {
  351. klient->sendeEncrypted( "\1", 1 );
  352. name->setText( n );
  353. passwort->setText( p );
  354. this->adminId = adminId;
  355. }
  356. else
  357. errorZuKlient( "Falsche Kombination aus Name und Passwort." );
  358. delete[] n;
  359. delete[] p;
  360. }
  361. break;
  362. case 2: // Logout
  363. adminId = 0;
  364. name->setText( "" );
  365. passwort->setText( "" );
  366. klient->sendeEncrypted( "\1", 1 );
  367. break;
  368. case 3: // Trennen
  369. br = 1;
  370. klient->sendeEncrypted( "\1", 1 );
  371. break;
  372. case 4: // Server starten
  373. if( !adminId )
  374. errorZuKlient( "Du musst dich einloggen." );
  375. else
  376. {
  377. if( hs->zDB()->adminHatRecht( adminId, Admin_Recht::HSStarten ) )
  378. {
  379. if( !hs->serverStarten() )
  380. {
  381. Text *err = new Text();
  382. err->append( hs->getLetzterFehler() );
  383. errorZuKlient( err->getText() );
  384. err->release();
  385. }
  386. else
  387. klient->sendeEncrypted( "\1", 1 );
  388. }
  389. else
  390. errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
  391. }
  392. break;
  393. case 5: // Server beenden
  394. if( !adminId )
  395. errorZuKlient( "Du musst dich einloggen." );
  396. else
  397. {
  398. if( hs->zDB()->adminHatRecht( adminId, Admin_Recht::HSBeenden ) )
  399. {
  400. if( hs->serverBeenden() )
  401. klient->sendeEncrypted( "\1", 1 );
  402. else
  403. {
  404. Text *err = new Text();
  405. err->append( hs->getLetzterFehler() );
  406. errorZuKlient( err->getText() );
  407. err->release();
  408. }
  409. }
  410. else
  411. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  412. }
  413. break;
  414. case 6: // Programm Schließen
  415. if( !adminId )
  416. errorZuKlient( "Du musst dich einloggen." );
  417. else
  418. {
  419. bool ok = 0;
  420. if( hs->isRunning() )
  421. {
  422. if( hs->zDB()->adminHatRecht( adminId, Admin_Recht::HSBeenden ) )
  423. {
  424. if( hs->serverBeenden() )
  425. ok = 1;
  426. else
  427. {
  428. Text *err = new Text();
  429. err->append( hs->getLetzterFehler() );
  430. errorZuKlient( err->getText() );
  431. err->release();
  432. }
  433. }
  434. else
  435. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  436. }
  437. else
  438. ok = 1;
  439. if( ok && hs->hatClients() )
  440. {
  441. errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
  442. break;
  443. }
  444. if( ok )
  445. {
  446. klient->sendeEncrypted( "\1", 1 );
  447. std::cout << "HS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  448. hs->close();
  449. br = 1;
  450. }
  451. }
  452. break;
  453. case 7: // Progtamm abstürzen
  454. if( !adminId )
  455. errorZuKlient( "Du musst dich einloggen." );
  456. else
  457. {
  458. bool ok = 0;
  459. if( hs->isRunning() )
  460. {
  461. if( hs->zDB()->adminHatRecht( adminId, Admin_Recht::HSBeenden ) )
  462. {
  463. hs->serverBeenden();
  464. ok = 1;
  465. }
  466. else
  467. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  468. }
  469. else
  470. ok = 1;
  471. if( ok )
  472. {
  473. klient->sendeEncrypted( "\1", 1 );
  474. std::cout << "HS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  475. hs->close();
  476. br = 1;
  477. }
  478. }
  479. break;
  480. case 8: // Status Frage
  481. if( 1 )
  482. {
  483. char status = 0;
  484. if( hs->isRunning() )
  485. {
  486. status = 1;
  487. if( hs->istAn() )
  488. status = 2;
  489. }
  490. klient->sendeEncrypted( "\1", 1 );
  491. klient->sendeEncrypted( &status, 1 );
  492. }
  493. break;
  494. case 9: // Server pausieren
  495. if( !adminId )
  496. errorZuKlient( "Du musst dich einloggen." );
  497. else
  498. {
  499. klient->sendeEncrypted( "\1", 1 );
  500. char pause = 0;
  501. klient->getNachrichtEncrypted( &pause, 1 );
  502. if( hs->zDB()->adminHatRecht( adminId, Admin_Recht::HSPausieren ) )
  503. {
  504. bool ok = 0;
  505. if( pause )
  506. ok = hs->serverPause();
  507. else
  508. ok = hs->serverFortsetzen();
  509. if( ok )
  510. klient->sendeEncrypted( "\1", 1 );
  511. else
  512. {
  513. Text *err = new Text();
  514. err->append( hs->getLetzterFehler() );
  515. errorZuKlient( err->getText() );
  516. err->release();
  517. }
  518. }
  519. else
  520. {
  521. if( pause )
  522. errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
  523. else
  524. errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
  525. }
  526. }
  527. break;
  528. case 0xA: // maximale Anzahl der Clients setzen
  529. if( !adminId )
  530. errorZuKlient( "Du musst dich einloggen." );
  531. else
  532. {
  533. klient->sendeEncrypted( "\1", 1 );
  534. int maxC = 0;
  535. klient->getNachrichtEncrypted( (char*)&maxC, 4 );
  536. if( hs->zDB()->adminHatRecht( adminId, Admin_Recht::HSMCChange ) )
  537. {
  538. if( hs->setMaxKlients( maxC ) )
  539. klient->sendeEncrypted( "\1", 1 );
  540. else
  541. {
  542. Text *err = new Text();
  543. err->append( hs->getLetzterFehler() );
  544. errorZuKlient( err->getText() );
  545. err->release();
  546. }
  547. }
  548. else
  549. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern." );
  550. }
  551. break;
  552. case 0xB: // maximale Anzahl der Spiele setzen
  553. if( !adminId )
  554. errorZuKlient( "Du musst dich einloggen." );
  555. else
  556. {
  557. klient->sendeEncrypted( "\1", 1 );
  558. int maxS = 0;
  559. klient->getNachrichtEncrypted( (char*)&maxS, 4 );
  560. if( hs->zDB()->adminHatRecht( adminId, Admin_Recht::HSMSChange ) )
  561. {
  562. if( hs->setMaxSpiele( maxS ) )
  563. klient->sendeEncrypted( "\1", 1 );
  564. else
  565. {
  566. Text *err = new Text();
  567. err->append( hs->getLetzterFehler() );
  568. errorZuKlient( err->getText() );
  569. err->release();
  570. }
  571. }
  572. else
  573. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Spiele zu verändern." );
  574. }
  575. break;
  576. case 0xC: // klient absturtz
  577. if( 1 )
  578. {
  579. klient->sendeEncrypted( "\1", 1 );
  580. int klientId = 0;
  581. klient->getNachrichtEncrypted( (char*)&klientId, 4 );
  582. if( klientId && hs->absturzKlient( klientId ) )
  583. klient->sendeEncrypted( "\1", 1 );
  584. else
  585. klient->sendeEncrypted( "\0", 1 );
  586. }
  587. break;
  588. default:
  589. errorZuKlient( "Unbekannte Nachricht!" );
  590. break;
  591. }
  592. if( br )
  593. break;
  594. hs->addEmpfangen( klient->getDownloadBytes( 1 ) );
  595. hs->addGesendet( klient->getUploadBytes( 1 ) );
  596. }
  597. }
  598. hs->addEmpfangen( klient->getDownloadBytes( 1 ) );
  599. hs->addGesendet( klient->getUploadBytes( 1 ) );
  600. delete this;
  601. }
  602. void HSAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  603. {
  604. klient->sendeEncrypted( "\3", 1 );
  605. char len = (char)textLength( nachricht );
  606. klient->sendeEncrypted( &len, 1 );
  607. klient->sendeEncrypted( nachricht, len );
  608. }
  609. // Inhalt der HSKlient aus HistorieServer.h
  610. // Konstruktor
  611. HSKlient::HSKlient( SKlient *klient, HistorieServer *hs )
  612. : Thread()
  613. {
  614. this->klient = klient;
  615. unsigned char key[ 20 ] = { 207, 30, 72, 46, 30, 50, 56, 213, 82, 107, 14, 201, 149, 58, 110, 138, 228, 241, 52, 54 };
  616. klient->setSendeKey( (char*)key, 20 );
  617. klient->setEmpfangKey( (char*)key, 20 );
  618. klientNummer = 0;
  619. this->hs = hs;
  620. ref = 1;
  621. }
  622. // Destruktor
  623. HSKlient::~HSKlient()
  624. {
  625. klient->release();
  626. hs->release();
  627. }
  628. // privat
  629. void HSKlient::sendeVerzeichnis( char *pfad, int gpl )
  630. {
  631. if( DateiIstVerzeichnis( pfad ) )
  632. {
  633. Datei *d = new Datei();
  634. d->setDatei( pfad );
  635. int dAnz = d->getUnterdateiAnzahl();
  636. RCArray< Text > *dList = d->getDateiListe();
  637. for( int i = 0; i < dAnz; i++ )
  638. {
  639. Text *pf = new Text( pfad );
  640. pf->append( "/" );
  641. pf->append( dList->z( i )->getText() );
  642. sendeVerzeichnis( *pf, gpl );
  643. pf->release();
  644. }
  645. dList->release();
  646. d->release();
  647. }
  648. else
  649. {
  650. Datei *d = new Datei();
  651. d->setDatei( pfad );
  652. if( !d->open( Datei::Style::lesen ) )
  653. {
  654. d->release();
  655. return;
  656. }
  657. char len = (char)( textLength( pfad ) - gpl );
  658. if( len <= 0 )
  659. {
  660. d->release();
  661. return;
  662. }
  663. klient->sendeEncrypted( &len, 1 );
  664. klient->sendeEncrypted( pfad + gpl, len );
  665. __int64 gr = d->getSize();
  666. klient->sendeEncrypted( (char*)&gr, 8 );
  667. char *bytes = new char[ 2048 ];
  668. while( gr > 0 )
  669. {
  670. int bLen = gr > 2048 ? 2048 : (int)gr;
  671. d->lese( bytes, bLen );
  672. klient->sende( bytes, bLen );
  673. gr -= bLen;
  674. }
  675. delete[] bytes;
  676. d->close();
  677. d->release();
  678. }
  679. }
  680. // nicht constant
  681. void HSKlient::absturz()
  682. {
  683. ende();
  684. klient->trenne();
  685. hs->zDB()->unregisterKlient( klientNummer, hs->getId() );
  686. }
  687. void HSKlient::thread()
  688. {
  689. while( 1 )
  690. {
  691. char c = 0;
  692. if( !klient->getNachrichtEncrypted( &c, 1 ) )
  693. break;
  694. else
  695. {
  696. bool br = 0;
  697. switch( c )
  698. {
  699. case 1: // Klient identifikation
  700. klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
  701. if( !hs->zDB()->proveKlient( klientNummer, hs->getId() ) )
  702. {
  703. klientNummer = 0;
  704. errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
  705. }
  706. else
  707. {
  708. Text *key = hs->zDB()->getKlientKey( klientNummer );
  709. if( !key )
  710. errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
  711. else
  712. {
  713. klient->sendeEncrypted( "\1", 1 );
  714. klient->setEmpfangKey( *key, key->getLength() );
  715. klient->setSendeKey( *key, key->getLength() );
  716. key->release();
  717. }
  718. }
  719. break;
  720. case 2: // Main / Erhaltung Server message
  721. if( 1 )
  722. {
  723. char befehl = 0;
  724. klient->getNachrichtEncrypted( &befehl, 1 );
  725. switch( befehl )
  726. {
  727. case 2: // klient absturtz
  728. if( 1 )
  729. {
  730. int klientId = 0;
  731. klient->getNachrichtEncrypted( (char*)&klientId, 4 );
  732. if( klientId && hs->absturzKlient( klientId ) )
  733. klient->sendeEncrypted( "\1", 1 );
  734. else
  735. klient->sendeEncrypted( "\0", 1 );
  736. }
  737. break;
  738. default:
  739. errorZuKlient( "Befehl nicht bekannt!" );
  740. break;
  741. }
  742. }
  743. break;
  744. case 3: // Verbindungsende
  745. br = 1;
  746. klient->sendeEncrypted( "\1", 1 );
  747. break;
  748. case 4: // unregister Klient
  749. if( !klientNummer )
  750. {
  751. errorZuKlient( "Du bist nicht Identifiziert." );
  752. break;
  753. }
  754. hs->zDB()->unregisterKlient( klientNummer, hs->getId() );
  755. klient->sendeEncrypted( "\1", 1 );
  756. break;
  757. case 5: // Neue Spiel Historie hinzufügen
  758. if( klientNummer )
  759. {
  760. errorZuKlient( "Zugriff verweigert." );
  761. break;
  762. }
  763. else
  764. {
  765. klient->sendeEncrypted( "\1", 1 );
  766. int spielServerId = 0;
  767. int spielId = 0;
  768. klient->getNachrichtEncrypted( (char*)&spielServerId, 4 );
  769. klient->getNachrichtEncrypted( (char*)&spielId, 4 );
  770. if( !hs->zDB()->istSpielHistorieFrei( spielId ) )
  771. {
  772. errorZuKlient( "Die Spiel-Historie dieses Spiels ist bereits eingeordnet." );
  773. break;
  774. }
  775. short port;
  776. Text *ip = new Text();
  777. if( !hs->zDB()->getSpielServerPortIp( spielServerId, &port, ip ) )
  778. {
  779. ip->release();
  780. errorZuKlient( "Ungültige Server Id." );
  781. break;
  782. }
  783. SpielServerKlient *k = new SpielServerKlient();
  784. if( !hs->zIni()->wertExistiert( "SpielHistoriePfad" ) )
  785. hs->zIni()->addWert( "SpielHistoriePfad", "../spiel_historie" );
  786. if( !k->downloadSpielHistorie( port, *ip, spielId, hs->zIni()->zWert( "SpielHistoriePfad" )->getText() ) )
  787. {
  788. Text err( "Fehler beim download: " );
  789. errorZuKlient( err += k->zLetzterFehler()->getText() );
  790. k->release();
  791. ip->release();
  792. break;
  793. }
  794. k->release();
  795. ip->release();
  796. klient->sendeEncrypted( "\1", 1 );
  797. hs->zDB()->addSpielHistorie( hs->getId(), spielId );
  798. }
  799. case 6: // Frage nach Spiel Historie
  800. if( klientNummer )
  801. {
  802. klient->sendeEncrypted( "\1", 1 );
  803. int spielId = 0;
  804. klient->getNachrichtEncrypted( (char*)&spielId, 4 );
  805. if( !hs->zIni()->wertExistiert( "SpielHistoriePfad" ) )
  806. hs->zIni()->addWert( "SpielHistoriePfad", "../spiel_historie" );
  807. Text *pf = new Text( hs->zIni()->zWert( "SpielHistoriePfad" )->getText() );
  808. if( pf->getText()[ pf->getLength() - 1 ] != '/' )
  809. pf->append( "/" );
  810. pf->append( spielId );
  811. if( !DateiIstVerzeichnis( *pf ) )
  812. {
  813. errorZuKlient( "Es existieren keine Daten zu diesem Spiel." );
  814. break;
  815. }
  816. klient->sendeEncrypted( "\1", 1 );
  817. sendeVerzeichnis( *pf, pf->getLength() );
  818. pf->release();
  819. klient->sendeEncrypted( "\0", 1 );
  820. }
  821. else
  822. errorZuKlient( "Du bist nicht Identifiziert." );
  823. break;
  824. default:
  825. errorZuKlient( "Unbekannte Nachricht!" );
  826. break;
  827. }
  828. if( br )
  829. break;
  830. hs->addEmpfangen( klient->getDownloadBytes( 1 ) );
  831. hs->addGesendet( klient->getUploadBytes( 1 ) );
  832. }
  833. }
  834. hs->addEmpfangen( klient->getDownloadBytes( 1 ) );
  835. hs->addGesendet( klient->getUploadBytes( 1 ) );
  836. hs->removeKlient( this ); // delete this
  837. }
  838. // constant
  839. void HSKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  840. {
  841. klient->sendeEncrypted( "\3", 1 );
  842. char len = (char)textLength( nachricht );
  843. klient->sendeEncrypted( &len, 1 );
  844. klient->sendeEncrypted( nachricht, len );
  845. }
  846. int HSKlient::getKlientNummer() const // gibt die KlientId zurück
  847. {
  848. return klientNummer;
  849. }
  850. // Reference Counting
  851. HSKlient *HSKlient::getThis()
  852. {
  853. ref++;
  854. return this;
  855. }
  856. HSKlient *HSKlient::release()
  857. {
  858. ref--;
  859. if( !ref )
  860. delete this;
  861. return 0;
  862. }