HistorieServer.cpp 19 KB

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