SpielServer.cpp 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755
  1. #include "SpielServer.h"
  2. #include <iostream>
  3. #include <Zeit.h>
  4. #include <Klient.h>
  5. #include <Globals.h>
  6. #ifdef WIN32
  7. #include "..\Datenbank\Datenbank.h"
  8. #else
  9. #include "Datenbank.h"
  10. #endif
  11. // Inhalt der SpielServer Klasse aus SpielServer.h
  12. // Konstruktor
  13. SpielServer::SpielServer( InitDatei* zIni )
  14. : Thread()
  15. {
  16. Network::Start( 100 );
  17. std::cout << "SS: Verbindung mit Datenbank wird hergestellt...\n";
  18. db = new SSDatenbank( zIni );
  19. empfangen = 0;
  20. gesendet = 0;
  21. fehler = new Text();
  22. ini = dynamic_cast<InitDatei*>(zIni->getThis());
  23. id = *zIni->zWert( "ServerId" );
  24. server = new Server();
  25. aServer = new SSLServer();
  26. aServer->setPrivateKeyPassword( zIni->zWert( "SSLPasswort" )->getText() );
  27. aServer->setCertificateFile( zIni->zWert( "SSLCert" )->getText() );
  28. aServer->setPrivateKeyFile( zIni->zWert( "SSLKey" )->getText() );
  29. std::cout << "SS: Starten des Admin Servers...\n";
  30. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  31. {
  32. std::cout << "SS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  33. exit( 1 );
  34. }
  35. db->setServerStatus( id, 2 );
  36. end = 0;
  37. nichtPausiert = 0;
  38. InitializeCriticalSection( &cs );
  39. startSpielThread = new SpielFinden( this );
  40. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  41. {
  42. serverStarten();
  43. serverFortsetzen();
  44. }
  45. erstellt = new RCArray< SpielErstellt >();
  46. spiele = new RCArray< Spiel >();
  47. klients = new RCArray< SSKlient >();
  48. spielHistorieId = new Array< int >();
  49. historieS = new HistorieSender( this );
  50. historieS->start();
  51. }
  52. // Destruktor
  53. SpielServer::~SpielServer()
  54. {
  55. historieS->setEnde();
  56. historieS->warteAufThread( 20000 );
  57. historieS->ende();
  58. historieS->release();
  59. fehler->release();
  60. server->trenne();
  61. server->release();
  62. aServer->trenne();
  63. aServer->release();
  64. ini->release();
  65. db->release();
  66. DeleteCriticalSection( &cs );
  67. startSpielThread->release();
  68. erstellt->release();
  69. spiele->release();
  70. if( klients )
  71. klients->release();
  72. spielHistorieId->release();
  73. }
  74. // nicht constant
  75. void SpielServer::lock()
  76. {
  77. EnterCriticalSection( &cs );
  78. }
  79. void SpielServer::unlock()
  80. {
  81. LeaveCriticalSection( &cs );
  82. }
  83. void SpielServer::runn()
  84. {
  85. while( !end && aServer->isConnected() )
  86. {
  87. SSLSKlient* klient;
  88. klient = aServer->getKlient();
  89. if( end && klient )
  90. {
  91. klient->trenne();
  92. klient = (SSLSKlient*)klient->release();
  93. Sleep( 1000 );
  94. return;
  95. }
  96. if( !klient )
  97. continue;
  98. SSAKlient* slHandle = new SSAKlient( klient, dynamic_cast<SpielServer*>(getThis()) );
  99. slHandle->start();
  100. }
  101. }
  102. void SpielServer::thread()
  103. {
  104. while( server->isConnected() )
  105. {
  106. SKlient* klient;
  107. klient = server->getKlient();
  108. if( !klient )
  109. continue;
  110. Framework::getThreadRegister()->cleanUpClosedThreads();
  111. SSKlient* slHandle = new SSKlient( klient, dynamic_cast<SpielServer*>(getThis()) );
  112. slHandle->start();
  113. }
  114. }
  115. void SpielServer::close()
  116. {
  117. db->setServerStatus( id, 1 );
  118. server->trenne();
  119. #ifdef WIN32
  120. warteAufThread( 1000 );
  121. #endif
  122. lock();
  123. for( int i = 0; i < klients->getEintragAnzahl(); i++ )
  124. klients->z( i )->absturz();
  125. if( klients )
  126. klients = (RCArray<SSKlient>*) klients->release();
  127. unlock();
  128. ende();
  129. run = 0;
  130. end = 1;
  131. Klient* klient = new Klient();
  132. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  133. Sleep( 500 );
  134. aServer->trenne();
  135. klient->release();
  136. }
  137. bool SpielServer::serverStarten()
  138. {
  139. if( nichtPausiert )
  140. {
  141. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  142. return 0;
  143. }
  144. if( server )
  145. server->release();
  146. server = new Server();
  147. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  148. {
  149. nichtPausiert = 1;
  150. start();
  151. startSpielThread->setSpielServerId( id );
  152. startSpielThread->start();
  153. return 1;
  154. }
  155. else
  156. {
  157. serverBeenden();
  158. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  159. return 0;
  160. }
  161. }
  162. bool SpielServer::serverPause()
  163. {
  164. if( !nichtPausiert )
  165. {
  166. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  167. return 0;
  168. }
  169. if( !db->setServerStatus( id, 2 ) )
  170. {
  171. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  172. fehler->append( db->getLetzterFehler() );
  173. return 0;
  174. }
  175. return 1;
  176. }
  177. bool SpielServer::serverFortsetzen()
  178. {
  179. if( !nichtPausiert )
  180. {
  181. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  182. return 0;
  183. }
  184. if( !db->setServerStatus( id, 3 ) )
  185. {
  186. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  187. fehler->append( db->getLetzterFehler() );
  188. return 0;
  189. }
  190. return 1;
  191. }
  192. bool SpielServer::serverBeenden()
  193. {
  194. if( !nichtPausiert )
  195. {
  196. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  197. return 0;
  198. }
  199. if( db->serverIstNichtPausiert( id ) )
  200. {
  201. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  202. return 0;
  203. }
  204. startSpielThread->setEnde();
  205. startSpielThread->warteAufThread( 2000 );
  206. startSpielThread->ende();
  207. nichtPausiert = 0;
  208. ende();
  209. if( server )
  210. server->trenne();
  211. return 1;
  212. }
  213. bool SpielServer::setMaxSpiele( int ms )
  214. {
  215. if( !db->setMaxSpiele( id, ms ) )
  216. {
  217. fehler->setText( "Die maximale Anzahl der Spiele konnte nicht gesetzt werden:\n" );
  218. fehler->append( db->getLetzterFehler() );
  219. return 0;
  220. }
  221. ini->setWert( "MaxSpiele", Text() += ms );
  222. return 1;
  223. }
  224. void SpielServer::addSpielErstellt( SpielErstellt* erstellt )
  225. {
  226. lock();
  227. this->erstellt->add( erstellt );
  228. unlock();
  229. }
  230. void SpielServer::SpielErstelltAbbruch( int spielErstelltId )
  231. {
  232. lock();
  233. for( int i = 0; i < erstellt->getEintragAnzahl(); i++ )
  234. {
  235. if( erstellt->z( i )->getId() == spielErstelltId )
  236. {
  237. erstellt->z( i )->abbruch();
  238. break;
  239. }
  240. }
  241. unlock();
  242. }
  243. void SpielServer::removeSpielErstellt( int id )
  244. {
  245. lock();
  246. bool gefunden = 0;
  247. for( int i = 0; i < erstellt->getEintragAnzahl(); i++ )
  248. {
  249. if( erstellt->z( i )->getId() == id )
  250. {
  251. SpielErstellt* zse = erstellt->get( i );
  252. erstellt->remove( i );
  253. unlock();
  254. zse->release();
  255. gefunden = 1;
  256. break;
  257. }
  258. }
  259. if( !gefunden )
  260. unlock();
  261. }
  262. bool SpielServer::registerKlient( SSKlient* klient )
  263. {
  264. lock();
  265. bool gefunden = 0;
  266. for( int i = 0; i < klients->getEintragAnzahl(); i++ )
  267. {
  268. SSKlient* tmp = klients->z( i );
  269. if( tmp )
  270. {
  271. if( tmp->getAccountId() == klient->getAccountId() )
  272. {
  273. klient->getThis();
  274. tmp->setSenden( klient );
  275. klient->release();
  276. gefunden = 1;
  277. unlock();
  278. return 1;
  279. }
  280. }
  281. }
  282. if( !gefunden )
  283. klients->add( klient );
  284. unlock();
  285. return 0;
  286. }
  287. bool SpielServer::absturzKlient( int klientId )
  288. {
  289. lock();
  290. SSKlient* zKlient = 0;
  291. for( int i = 0; i < klients->getEintragAnzahl(); i++ )
  292. {
  293. if( klients->z( i )->getKlientNummer() == klientId )
  294. {
  295. zKlient = klients->z( i );
  296. break;
  297. }
  298. }
  299. if( !zKlient )
  300. {
  301. unlock();
  302. return 0;
  303. }
  304. int id = 0;
  305. int ak = db->getAktionForKlient( this->id, zKlient->getAccountId(), &id );
  306. switch( ak )
  307. {
  308. case 0: // Information Über Verwendung des Klient ist verlorengegangen (überall abmelden)
  309. for( int i = 0; i < erstellt->getEintragAnzahl(); i++ )
  310. {
  311. SpielErstellt* tmp = erstellt->z( i );
  312. if( tmp )
  313. tmp->klientGetrennt( zKlient );
  314. }
  315. for( int i = 0; i < spiele->getEintragAnzahl(); i++ )
  316. {
  317. Spiel* tmp = spiele->z( i );
  318. if( tmp )
  319. tmp->klientGetrennt( zKlient );
  320. }
  321. break;
  322. case 1: // Spiel Erstellt
  323. for( int i = 0; i < erstellt->getEintragAnzahl(); i++ )
  324. {
  325. SpielErstellt* tmp = erstellt->z( i );
  326. if( tmp )
  327. {
  328. if( tmp->getId() == id )
  329. {
  330. tmp->klientGetrennt( zKlient );
  331. break;
  332. }
  333. }
  334. }
  335. break;
  336. case 2: // Spielt
  337. for( int i = 0; i < spiele->getEintragAnzahl(); i++ )
  338. {
  339. Spiel* tmp = spiele->z( i );
  340. if( tmp && tmp->getId() == id )
  341. {
  342. tmp->klientGetrennt( zKlient );
  343. break;
  344. }
  345. }
  346. break;
  347. }
  348. bool gefunden = 0;
  349. for( int i = 0; i < klients->getEintragAnzahl(); i++ )
  350. {
  351. if( klients->z( i ) == zKlient )
  352. {
  353. zKlient->absturz();
  354. zKlient->getThis();
  355. klients->remove( i );
  356. unlock();
  357. zKlient->release();
  358. gefunden = 1;
  359. break;
  360. }
  361. }
  362. if( !gefunden )
  363. unlock();
  364. return 1;
  365. }
  366. bool SpielServer::verteileKlient( SSKlient* klient )
  367. {
  368. lock();
  369. int id = 0;
  370. int ak = db->getAktionForKlient( this->id, klient->getAccountId(), &id );
  371. switch( ak )
  372. {
  373. case 0: // Keine Verwendung für den Klient
  374. unlock();
  375. return 0;
  376. break;
  377. case 1: // Spiel Erstellt
  378. for( int i = 0; i < erstellt->getEintragAnzahl(); i++ )
  379. {
  380. SpielErstellt* tmp = erstellt->z( i );
  381. if( tmp )
  382. {
  383. if( tmp->getId() == id )
  384. {
  385. tmp->klientVerbunden( dynamic_cast<SSKlient*>(klient->getThis()) );
  386. unlock();
  387. return 1;
  388. }
  389. }
  390. }
  391. break;
  392. case 2: // Spielt
  393. for( int i = 0; i < spiele->getEintragAnzahl(); i++ )
  394. {
  395. Spiel* tmp = spiele->z( i );
  396. if( tmp )
  397. {
  398. if( tmp->getId() == id )
  399. {
  400. tmp->klientVerbunden( dynamic_cast<SSKlient*>(klient->getThis()) );
  401. unlock();
  402. return 1;
  403. }
  404. }
  405. }
  406. break;
  407. }
  408. unlock();
  409. return 0;
  410. }
  411. void SpielServer::unregisterKlient( SSKlient* zKlient )
  412. {
  413. lock();
  414. int id = 0;
  415. int ak = db->getAktionForKlient( this->id, zKlient->getAccountId(), &id );
  416. switch( ak )
  417. {
  418. case 0: // Information Über Verwendung des Klient ist verlorengegangen (überall abmelden)
  419. for( int i = 0; i < erstellt->getEintragAnzahl(); i++ )
  420. {
  421. SpielErstellt* tmp = erstellt->z( i );
  422. if( tmp )
  423. tmp->klientGetrennt( zKlient );
  424. }
  425. for( int i = 0; i < spiele->getEintragAnzahl(); i++ )
  426. {
  427. Spiel* tmp = spiele->z( i );
  428. if( tmp )
  429. tmp->klientGetrennt( zKlient );
  430. }
  431. break;
  432. case 1: // Spiel Erstellt
  433. for( int i = 0; i < erstellt->getEintragAnzahl(); i++ )
  434. {
  435. SpielErstellt* tmp = erstellt->z( i );
  436. if( tmp )
  437. {
  438. if( tmp->getId() == id )
  439. {
  440. tmp->klientGetrennt( zKlient );
  441. break;
  442. }
  443. }
  444. }
  445. break;
  446. case 2: // Spielt
  447. for( int i = 0; i < spiele->getEintragAnzahl(); i++ )
  448. {
  449. Spiel* tmp = spiele->z( i );
  450. if( tmp && tmp->getId() == id )
  451. {
  452. tmp->klientGetrennt( zKlient );
  453. break;
  454. }
  455. }
  456. break;
  457. }
  458. bool gefunden = 0;
  459. for( int i = 0; i < klients->getEintragAnzahl(); i++ )
  460. {
  461. if( klients->z( i ) == zKlient )
  462. {
  463. zKlient->getThis();
  464. klients->remove( i );
  465. unlock();
  466. zKlient->release();
  467. gefunden = 1;
  468. break;
  469. }
  470. }
  471. if( !gefunden )
  472. {
  473. unlock();
  474. zKlient->release();
  475. }
  476. }
  477. void SpielServer::klientsMM( SSKlient* k )
  478. {
  479. lock();
  480. for( int i = 0; i < klients->getEintragAnzahl(); i++ )
  481. {
  482. if( klients->z( i ) == k )
  483. {
  484. klients->z( i )->getThis();
  485. klients->z( i )->getThis();
  486. klients->remove( i );
  487. }
  488. }
  489. unlock();
  490. }
  491. void SpielServer::addSpiel( Spiel* spiel )
  492. {
  493. lock();
  494. spiele->add( spiel );
  495. unlock();
  496. }
  497. void SpielServer::removeSpiel( int spielId )
  498. {
  499. lock();
  500. bool gefunden = 0;
  501. for( int i = 0; i < spiele->getEintragAnzahl(); i++ )
  502. {
  503. if( spiele->z( i ) && spiele->z( i )->getId() == spielId )
  504. {
  505. Spiel* zs = spiele->get( i );
  506. spiele->remove( i );
  507. unlock();
  508. zs->release();
  509. gefunden = 1;
  510. break;
  511. }
  512. }
  513. if( !gefunden )
  514. unlock();
  515. }
  516. void SpielServer::addGesendet( int bytes )
  517. {
  518. gesendet += bytes;
  519. }
  520. void SpielServer::addEmpfangen( int bytes )
  521. {
  522. empfangen += bytes;
  523. }
  524. void SpielServer::addSpielHistorieId( int id )
  525. {
  526. lock();
  527. spielHistorieId->add( id );
  528. unlock();
  529. }
  530. bool SpielServer::hatSpielHistorieId( int id )
  531. {
  532. bool ret = 0;
  533. lock();
  534. int anz = spielHistorieId->getEintragAnzahl();
  535. for( int i = 0; i < anz; i++ )
  536. {
  537. if( spielHistorieId->hat( i ) && spielHistorieId->get( i ) == id )
  538. {
  539. ret = 1;
  540. break;
  541. }
  542. }
  543. unlock();
  544. return ret;
  545. }
  546. void SpielServer::removeSpielHistorieId( int id )
  547. {
  548. lock();
  549. int anz = spielHistorieId->getEintragAnzahl();
  550. for( int i = 0; i < anz; i++ )
  551. {
  552. if( spielHistorieId->hat( i ) && spielHistorieId->get( i ) == id )
  553. {
  554. spielHistorieId->remove( i );
  555. break;
  556. }
  557. }
  558. unlock();
  559. }
  560. // constant
  561. bool SpielServer::istAn() const
  562. {
  563. return db->serverIstNichtPausiert( id );
  564. }
  565. Server* SpielServer::zServer() const
  566. {
  567. return server;
  568. }
  569. SSDatenbank* SpielServer::zDB() const
  570. {
  571. return db;
  572. }
  573. InitDatei* SpielServer::zInit() const
  574. {
  575. return ini;
  576. }
  577. bool SpielServer::hatClients() const
  578. {
  579. return klients->hat( 0 );
  580. }
  581. int SpielServer::getId() const
  582. {
  583. return id;
  584. }
  585. char* SpielServer::getLetzterFehler() const
  586. {
  587. return fehler->getText();
  588. }
  589. char* SpielServer::getIp() const
  590. {
  591. return ini->zWert( "ServerIp" )->getText();
  592. }
  593. int SpielServer::getPort() const
  594. {
  595. if( !ini->wertExistiert( "ServerPort" ) )
  596. return 0;
  597. return TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 );
  598. }
  599. // Inhalt der SSAKlient Klasse aus SpielServer.h
  600. // Konstruktor
  601. SSAKlient::SSAKlient( SSLSKlient* klient, SpielServer* ss )
  602. : Thread()
  603. {
  604. this->klient = klient;
  605. name = new Text( "" );
  606. passwort = new Text( "" );
  607. adminId = 0;
  608. version = 0;
  609. this->ss = ss;
  610. }
  611. // Destruktor
  612. SSAKlient::~SSAKlient()
  613. {
  614. klient->trenne();
  615. klient->release();
  616. ss->release();
  617. name->release();
  618. passwort->release();
  619. }
  620. // nicht constant
  621. void SSAKlient::thread()
  622. {
  623. while( 1 )
  624. {
  625. char c = 0;
  626. if( !klient->getNachricht( &c, 1 ) )
  627. break;
  628. else
  629. {
  630. bool br = 0;
  631. switch( c )
  632. {
  633. case 1: // Login
  634. if( 1 )
  635. {
  636. klient->sende( "\1", 1 );
  637. unsigned char nLen = 0;
  638. klient->getNachricht( (char*)&nLen, 1 );
  639. char* n = new char[ nLen + 1 ];
  640. n[ (int)nLen ] = 0;
  641. if( nLen )
  642. klient->getNachricht( n, nLen );
  643. unsigned char pLen = 0;
  644. klient->getNachricht( (char*)&pLen, 1 );
  645. char* p = new char[ pLen + 1 ];
  646. p[ (int)pLen ] = 0;
  647. if( pLen )
  648. klient->getNachricht( p, pLen );
  649. int adminId = ss->zDB()->istAdministrator( n, p );
  650. if( adminId )
  651. {
  652. klient->sende( "\1", 1 );
  653. name->setText( n );
  654. passwort->setText( p );
  655. this->adminId = adminId;
  656. }
  657. else
  658. errorZuKlient( "Falsche Kombination aus Name und Passwort." );
  659. delete[] n;
  660. delete[] p;
  661. }
  662. break;
  663. case 2: // Logout
  664. adminId = 0;
  665. name->setText( "" );
  666. passwort->setText( "" );
  667. klient->sende( "\1", 1 );
  668. break;
  669. case 3: // Trennen
  670. br = 1;
  671. klient->sende( "\1", 1 );
  672. break;
  673. case 4: // Server starten
  674. if( !adminId )
  675. errorZuKlient( "Du musst dich einloggen." );
  676. else
  677. {
  678. if( ss->zDB()->adminHatRecht( adminId, Admin_Recht::SSStarten ) )
  679. {
  680. if( !ss->serverStarten() )
  681. {
  682. Text* err = new Text();
  683. err->append( ss->getLetzterFehler() );
  684. errorZuKlient( err->getText() );
  685. err->release();
  686. }
  687. else
  688. klient->sende( "\1", 1 );
  689. }
  690. else
  691. errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
  692. }
  693. break;
  694. case 5: // Server beenden
  695. if( !adminId )
  696. errorZuKlient( "Du musst dich einloggen." );
  697. else
  698. {
  699. if( ss->zDB()->adminHatRecht( adminId, Admin_Recht::SSBeenden ) )
  700. {
  701. if( ss->serverBeenden() )
  702. klient->sende( "\1", 1 );
  703. else
  704. {
  705. Text* err = new Text();
  706. err->append( ss->getLetzterFehler() );
  707. errorZuKlient( err->getText() );
  708. err->release();
  709. }
  710. }
  711. else
  712. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  713. }
  714. break;
  715. case 6: // Programm Schließen
  716. if( !adminId )
  717. errorZuKlient( "Du musst dich einloggen." );
  718. else
  719. {
  720. bool ok = 0;
  721. if( ss->isRunning() )
  722. {
  723. if( ss->zDB()->adminHatRecht( adminId, Admin_Recht::SSBeenden ) )
  724. {
  725. if( ss->serverBeenden() )
  726. ok = 1;
  727. else
  728. {
  729. Text* err = new Text();
  730. err->append( ss->getLetzterFehler() );
  731. errorZuKlient( err->getText() );
  732. err->release();
  733. }
  734. }
  735. else
  736. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  737. }
  738. else
  739. ok = 1;
  740. if( ok && ss->hatClients() )
  741. {
  742. errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
  743. break;
  744. }
  745. if( ok )
  746. {
  747. klient->sende( "\1", 1 );
  748. std::cout << "SS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  749. ss->close();
  750. br = 1;
  751. }
  752. }
  753. break;
  754. case 7: // Progtamm abstürzen
  755. if( !adminId )
  756. errorZuKlient( "Du musst dich einloggen." );
  757. else
  758. {
  759. bool ok = 0;
  760. if( ss->isRunning() )
  761. {
  762. if( ss->zDB()->adminHatRecht( adminId, Admin_Recht::SSBeenden ) )
  763. {
  764. ss->serverBeenden();
  765. ok = 1;
  766. }
  767. else
  768. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  769. }
  770. else
  771. ok = 1;
  772. if( ok )
  773. {
  774. klient->sende( "\1", 1 );
  775. std::cout << "sS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  776. ss->close();
  777. br = 1;
  778. }
  779. }
  780. break;
  781. case 8: // Status Frage
  782. if( 1 )
  783. {
  784. char status = 0;
  785. if( ss->isRunning() )
  786. {
  787. status = 1;
  788. if( ss->istAn() )
  789. status = 2;
  790. }
  791. klient->sende( "\1", 1 );
  792. klient->sende( &status, 1 );
  793. }
  794. break;
  795. case 9: // Server pausieren
  796. if( !adminId )
  797. errorZuKlient( "Du musst dich einloggen." );
  798. else
  799. {
  800. klient->sende( "\1", 1 );
  801. char pause = 0;
  802. klient->getNachricht( &pause, 1 );
  803. if( ss->zDB()->adminHatRecht( adminId, Admin_Recht::SSPausieren ) )
  804. {
  805. bool ok = 0;
  806. if( pause )
  807. ok = ss->serverPause();
  808. else
  809. ok = ss->serverFortsetzen();
  810. if( ok )
  811. klient->sende( "\1", 1 );
  812. else
  813. {
  814. Text* err = new Text();
  815. err->append( ss->getLetzterFehler() );
  816. errorZuKlient( err->getText() );
  817. err->release();
  818. }
  819. }
  820. else
  821. {
  822. if( pause )
  823. errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
  824. else
  825. errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
  826. }
  827. }
  828. break;
  829. case 0xA: // maximale Anzahl der Spiele setzen
  830. if( !adminId )
  831. errorZuKlient( "Du musst dich einloggen." );
  832. else
  833. {
  834. klient->sende( "\1", 1 );
  835. int maxS = 0;
  836. klient->getNachricht( (char*)&maxS, 4 );
  837. if( ss->zDB()->adminHatRecht( adminId, Admin_Recht::SSMSChange ) )
  838. {
  839. if( ss->setMaxSpiele( maxS ) )
  840. klient->sende( "\1", 1 );
  841. else
  842. {
  843. Text* err = new Text();
  844. err->append( ss->getLetzterFehler() );
  845. errorZuKlient( err->getText() );
  846. err->release();
  847. }
  848. }
  849. else
  850. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern." );
  851. }
  852. break;
  853. case 0xB: // Spiel Historie downloaden
  854. if( adminId )
  855. errorZuKlient( "Zugriff verweigert." );
  856. else
  857. {
  858. klient->sende( "\1", 1 );
  859. int spielId = 0;
  860. klient->getNachricht( (char*)&spielId, 4 );
  861. if( !ss->hatSpielHistorieId( spielId ) )
  862. {
  863. errorZuKlient( "Zugriff auf Spiel-Historie verweigert." );
  864. break;
  865. }
  866. Text* pfad = new Text( "../spiel log/" );
  867. *pfad += spielId;
  868. *pfad += "/fertig";
  869. if( !DateiExistiert( *pfad ) )
  870. {
  871. pfad->release();
  872. errorZuKlient( "Die Spiel-Historie wurde nicht gefunden." );
  873. break;
  874. }
  875. klient->sende( "\1", 1 );
  876. pfad->remove( "/fertig" );
  877. sendeVerzeichnisAnKlient( *pfad, pfad->getLength() + 1 );
  878. pfad->release();
  879. klient->sende( "\0", 1 );
  880. }
  881. break;
  882. case 0xC: // klient absturtz
  883. if( 1 )
  884. {
  885. klient->sende( "\1", 1 );
  886. int klientId = 0;
  887. klient->getNachricht( (char*)&klientId, 4 );
  888. if( klientId && ss->absturzKlient( klientId ) )
  889. klient->sende( "\1", 1 );
  890. else
  891. klient->sende( "\0", 1 );
  892. }
  893. break;
  894. default:
  895. errorZuKlient( "Unbekannte Nachricht!" );
  896. break;
  897. }
  898. if( br )
  899. break;
  900. ss->addEmpfangen( klient->getDownloadBytes( 1 ) );
  901. ss->addGesendet( klient->getUploadBytes( 1 ) );
  902. }
  903. }
  904. ss->addEmpfangen( klient->getDownloadBytes( 1 ) );
  905. ss->addGesendet( klient->getUploadBytes( 1 ) );
  906. delete this;
  907. }
  908. void SSAKlient::sendeVerzeichnisAnKlient( char* pfad, int gpl )
  909. {
  910. Datei* d = new Datei();
  911. d->setDatei( pfad );
  912. if( d->istOrdner() )
  913. {
  914. int dAnz = d->getUnterdateiAnzahl();
  915. RCArray< Text >* list = d->getDateiListe();
  916. for( int i = 0; i < dAnz; i++ )
  917. {
  918. if( list->z( i ) )
  919. {
  920. Text* pf = new Text( pfad );
  921. pf->append( "/" );
  922. pf->append( list->z( i )->getText() );
  923. sendeVerzeichnisAnKlient( *pf, gpl );
  924. pf->release();
  925. }
  926. }
  927. list->release();
  928. }
  929. else if( d->existiert() )
  930. {
  931. __int64 gr = d->getSize();
  932. if( gr && d->zPfad()->getLength() - gpl > 0 && d->open( Datei::Style::lesen ) )
  933. {
  934. char pfLen = (char)(d->zPfad()->getLength() - gpl);
  935. klient->sende( &pfLen, 1 );
  936. klient->sende( d->zPfad()->getText() + gpl, pfLen );
  937. klient->sende( (char*)&gr, 8 );
  938. char* bytes = new char[ 2048 ];
  939. while( gr )
  940. {
  941. short len = gr > 2048 ? 2048 : (short)gr;
  942. d->lese( bytes, len );
  943. klient->sende( bytes, len );
  944. gr -= len;
  945. }
  946. delete[] bytes;
  947. d->close();
  948. }
  949. }
  950. d->release();
  951. }
  952. void SSAKlient::errorZuKlient( const char* nachricht ) const // sendet eine Fehlernachricht zum Klient
  953. {
  954. klient->sende( "\3", 1 );
  955. char len = (char)textLength( nachricht );
  956. klient->sende( &len, 1 );
  957. klient->sende( nachricht, len );
  958. }
  959. // Inhalt der SSKlient Klasse aus SpielServer.h
  960. // Konstruktor
  961. SSKlient::SSKlient( SKlient* klient, SpielServer* ss )
  962. : SSKlientV()
  963. {
  964. empfangen = klient;
  965. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  966. klient->setSendeKey( (char*)key, 20 );
  967. klient->setEmpfangKey( (char*)key, 20 );
  968. senden = 0;
  969. this->ss = ss;
  970. accountId = 0;
  971. klientNummer = 0;
  972. termThread = 1;
  973. verbunden = 0;
  974. zErstellt = 0;
  975. zSpiel = 0;
  976. InitializeCriticalSection( &cs );
  977. }
  978. // Destruktor
  979. SSKlient::~SSKlient()
  980. {
  981. lock();
  982. unlock();
  983. if( verbunden )
  984. trenne();
  985. if( termThread )
  986. {
  987. if( verbunden )
  988. warteAufThread( 1000 );
  989. if( verbunden )
  990. {
  991. if( empfangen )
  992. empfangen->trenne();
  993. if( senden )
  994. senden->trenne();
  995. }
  996. if( empfangen )
  997. empfangen->release();
  998. if( senden )
  999. senden->release();
  1000. DeleteCriticalSection( &cs );
  1001. ss->klientsMM( this );
  1002. ss->release();
  1003. ende(); // Eventuelles Ende des Aktuellen Threades
  1004. }
  1005. else
  1006. {
  1007. if( verbunden )
  1008. {
  1009. if( empfangen )
  1010. empfangen->trenne();
  1011. if( senden )
  1012. senden->trenne();
  1013. }
  1014. if( empfangen )
  1015. empfangen->release();
  1016. if( senden )
  1017. senden->release();
  1018. DeleteCriticalSection( &cs );
  1019. ss->klientsMM( this );
  1020. ss->release();
  1021. }
  1022. }
  1023. // nicht constant
  1024. void SSKlient::lock()
  1025. {
  1026. EnterCriticalSection( &cs );
  1027. }
  1028. void SSKlient::unlock()
  1029. {
  1030. LeaveCriticalSection( &cs );
  1031. }
  1032. void SSKlient::absturz()
  1033. {
  1034. ende();
  1035. if( senden )
  1036. senden->trenne();
  1037. empfangen->trenne();
  1038. }
  1039. void SSKlient::setSpielErstellt( SpielErstellt* zErstellt )
  1040. {
  1041. this->zErstellt = zErstellt;
  1042. }
  1043. void SSKlient::setSpiel( Spiel* zSpiel )
  1044. {
  1045. this->zSpiel = zSpiel;
  1046. }
  1047. void SSKlient::nichtTrennen()
  1048. {
  1049. verbunden = 0;
  1050. }
  1051. void SSKlient::spielGefunden( int karteId )
  1052. {
  1053. if( !senden )
  1054. return;
  1055. lock();
  1056. senden->sendeEncrypted( "\xB", 1 );
  1057. senden->sendeEncrypted( (char*)&karteId, 4 );
  1058. unlock();
  1059. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1060. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1061. }
  1062. void SSKlient::zeitVerbleibend( char sekunden )
  1063. {
  1064. if( !senden )
  1065. return;
  1066. lock();
  1067. senden->sendeEncrypted( "\1", 1 );
  1068. senden->sendeEncrypted( &sekunden, 1 );
  1069. unlock();
  1070. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1071. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1072. }
  1073. void SSKlient::erstellungAbgebrochen( char* grund )
  1074. {
  1075. if( !senden )
  1076. return;
  1077. char len = (char)textLength( grund );
  1078. lock();
  1079. senden->sendeEncrypted( "\2", 1 );
  1080. senden->sendeEncrypted( &len, 1 );
  1081. if( len )
  1082. senden->sendeEncrypted( grund, len );
  1083. unlock();
  1084. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1085. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1086. }
  1087. void SSKlient::backInWarteschlange( char st, char min, char sec )
  1088. {
  1089. if( !senden )
  1090. return;
  1091. lock();
  1092. senden->sendeEncrypted( "\4", 1 );
  1093. senden->sendeEncrypted( &st, 1 );
  1094. senden->sendeEncrypted( &min, 1 );
  1095. senden->sendeEncrypted( &sec, 1 );
  1096. unlock();
  1097. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1098. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1099. }
  1100. void SSKlient::erstellungFortsetzen()
  1101. {
  1102. if( !senden )
  1103. return;
  1104. lock();
  1105. senden->sendeEncrypted( "\5", 1 );
  1106. unlock();
  1107. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1108. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1109. }
  1110. void SSKlient::erstellungInitialisierung( SpielerTeamStruktur* sts )
  1111. {
  1112. if( !senden )
  1113. return;
  1114. lock();
  1115. senden->sendeEncrypted( "\6", 1 );
  1116. senden->sendeEncrypted( (char*)&sts->spielerAnzahl, 4 );
  1117. senden->sendeEncrypted( (char*)&sts->teamAnzahl, 4 );
  1118. for( int i = 0; i < sts->spielerAnzahl; i++ )
  1119. {
  1120. int f = sts->spielerFarbe->hat( i ) ? sts->spielerFarbe->get( i ) : 0;
  1121. senden->sendeEncrypted( (char*)&f, 4 );
  1122. }
  1123. for( int i = 0; i < sts->teamAnzahl; i++ )
  1124. {
  1125. int f = sts->teamFarbe->hat( i ) ? sts->teamFarbe->get( i ) : 0;
  1126. senden->sendeEncrypted( (char*)&f, 4 );
  1127. }
  1128. for( int i = 0; i < sts->teamAnzahl; i++ )
  1129. {
  1130. Text* name = sts->teamName->z( i );
  1131. char len = (char)name->getLength();
  1132. senden->sendeEncrypted( &len, 1 );
  1133. if( len )
  1134. senden->sendeEncrypted( name->getText(), len );
  1135. }
  1136. for( int i = 0; i < sts->teamAnzahl; i++ )
  1137. {
  1138. int size = sts->teamSize->hat( i ) ? sts->teamSize->get( i ) : 0;
  1139. senden->sendeEncrypted( (char*)&size, 4 );
  1140. }
  1141. unlock();
  1142. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1143. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1144. }
  1145. void SSKlient::erstellungAddSpieler( int accountId )
  1146. {
  1147. if( !senden )
  1148. return;
  1149. lock();
  1150. senden->sendeEncrypted( "\7", 1 );
  1151. senden->sendeEncrypted( (char*)&accountId, 4 );
  1152. unlock();
  1153. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1154. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1155. }
  1156. void SSKlient::erstellungRemoveSpieler( int accountId )
  1157. {
  1158. if( !senden )
  1159. return;
  1160. lock();
  1161. senden->sendeEncrypted( "\x8", 1 );
  1162. senden->sendeEncrypted( (char*)&accountId, 4 );
  1163. unlock();
  1164. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1165. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1166. }
  1167. void SSKlient::erstellungSpielerTeam( int accountId, int spielerNummer )
  1168. {
  1169. if( !senden )
  1170. return;
  1171. lock();
  1172. senden->sendeEncrypted( "\x9", 1 );
  1173. senden->sendeEncrypted( (char*)&accountId, 4 );
  1174. senden->sendeEncrypted( (char*)&spielerNummer, 4 );
  1175. unlock();
  1176. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1177. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1178. }
  1179. void SSKlient::erstellungChatNachricht( char* nachricht )
  1180. {
  1181. if( !senden )
  1182. return;
  1183. char len = (char)textLength( nachricht );
  1184. if( !len )
  1185. return;
  1186. lock();
  1187. senden->sendeEncrypted( "\xA", 1 );
  1188. senden->sendeEncrypted( &len, 1 );
  1189. senden->sendeEncrypted( nachricht, len );
  1190. unlock();
  1191. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1192. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1193. }
  1194. void SSKlient::spielLadenBeginn()
  1195. {
  1196. if( !senden )
  1197. return;
  1198. lock();
  1199. senden->sendeEncrypted( "\xC", 1 );
  1200. unlock();
  1201. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1202. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1203. }
  1204. void SSKlient::spielLadenSpielerAdd( int accId, int spielerNumer )
  1205. {
  1206. if( !senden )
  1207. return;
  1208. lock();
  1209. senden->sendeEncrypted( "\xD", 1 );
  1210. senden->sendeEncrypted( (char*)&accId, 4 );
  1211. senden->sendeEncrypted( (char*)&spielerNumer, 4 );
  1212. unlock();
  1213. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1214. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1215. }
  1216. void SSKlient::spielLadenSetSpielerProzent( int accId, int prozent )
  1217. {
  1218. if( !senden )
  1219. return;
  1220. lock();
  1221. senden->sendeEncrypted( "\xE", 1 );
  1222. senden->sendeEncrypted( (char*)&accId, 4 );
  1223. senden->sendeEncrypted( (char*)&prozent, 4 );
  1224. unlock();
  1225. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1226. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1227. }
  1228. void SSKlient::spielLadenSetSpielerPing( int accId, int ping )
  1229. {
  1230. if( !senden )
  1231. return;
  1232. lock();
  1233. senden->sendeEncrypted( "\xF", 1 );
  1234. senden->sendeEncrypted( (char*)&accId, 4 );
  1235. senden->sendeEncrypted( (char*)&ping, 4 );
  1236. unlock();
  1237. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1238. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1239. }
  1240. double SSKlient::ping()
  1241. {
  1242. if( !senden )
  1243. return 0;
  1244. ZeitMesser* zeit = new ZeitMesser();
  1245. char ret = 0;
  1246. lock();
  1247. zeit->messungStart();
  1248. senden->sendeEncrypted( "\x10", 1 );
  1249. senden->getNachrichtEncrypted( &ret, 1 );
  1250. zeit->messungEnde();
  1251. unlock();
  1252. double retVal = zeit->getSekunden();
  1253. zeit->release();
  1254. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1255. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1256. return retVal;
  1257. }
  1258. void SSKlient::spielLadenFertig()
  1259. {
  1260. if( !senden )
  1261. return;
  1262. lock();
  1263. senden->sendeEncrypted( "\x11", 1 );
  1264. unlock();
  1265. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1266. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1267. }
  1268. void SSKlient::spielNachricht( short len, char* bytes )
  1269. {
  1270. if( !senden )
  1271. return;
  1272. lock();
  1273. senden->sendeEncrypted( "\x12", 1 );
  1274. senden->sende( (char*)&len, 2 );
  1275. senden->sende( bytes, len );
  1276. unlock();
  1277. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1278. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1279. }
  1280. void SSKlient::statistikNachricht( short len, char* bytes )
  1281. {
  1282. if( !senden )
  1283. return;
  1284. lock();
  1285. senden->sendeEncrypted( "\x13", 1 );
  1286. senden->sendeEncrypted( (char*)&len, 2 );
  1287. senden->sendeEncrypted( bytes, len );
  1288. unlock();
  1289. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1290. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1291. }
  1292. bool SSKlient::keepAlive()
  1293. {
  1294. if( !senden || !verbunden )
  1295. return 0;
  1296. char res = 0;
  1297. lock();
  1298. senden->sendeEncrypted( "\x14", 1 );
  1299. senden->getNachrichtEncrypted( &res, 1 );
  1300. unlock();
  1301. return res == 1;
  1302. }
  1303. void SSKlient::trenne()
  1304. {
  1305. if( !verbunden )
  1306. return;
  1307. verbunden = 0;
  1308. if( !senden )
  1309. return;
  1310. lock();
  1311. senden->sendeEncrypted( "\0", 1 );
  1312. unlock();
  1313. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1314. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1315. }
  1316. void SSKlient::setSenden( SSKlient* klient )
  1317. {
  1318. senden = klient->getKlient();
  1319. Text* key = ss->zDB()->getKlientKey( klientNummer );
  1320. if( !key )
  1321. {
  1322. senden->sendeEncrypted( "\0", 1 );
  1323. errorZuKlientSende( "Es konnte kein Key ermittelt werden." );
  1324. }
  1325. else
  1326. {
  1327. senden->sendeEncrypted( "\1", 1 );
  1328. senden->setEmpfangKey( *key, key->getLength() );
  1329. senden->setSendeKey( *key, key->getLength() );
  1330. key->release();
  1331. }
  1332. verbunden = 1;
  1333. if( !ss->verteileKlient( this ) )
  1334. ss->unregisterKlient( this );
  1335. klient->nichtTrennen();
  1336. klient->release();
  1337. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1338. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1339. }
  1340. void SSKlient::thread()
  1341. {
  1342. int unbekannt = 0;
  1343. bool del = 0;
  1344. while( 1 )
  1345. {
  1346. bool br = 0;
  1347. char message = 0;
  1348. if( empfangen->getNachrichtEncrypted( &message, 1 ) )
  1349. {
  1350. switch( message )
  1351. {
  1352. case 1: // Klient Identifikation
  1353. empfangen->getNachrichtEncrypted( (char*)&klientNummer, 4 );
  1354. if( !klientNummer )
  1355. errorZuKlientEmpfang( "Du besitzt noch keine Klient Nummer." );
  1356. else
  1357. {
  1358. accountId = ss->zDB()->getAccountId( klientNummer );
  1359. termThread = 0;
  1360. if( ss->registerKlient( this ) )
  1361. return;
  1362. termThread = 1;
  1363. Text* key = ss->zDB()->getKlientKey( klientNummer );
  1364. if( !key )
  1365. errorZuKlientEmpfang( "Es konnte kein Key ermittelt werden." );
  1366. else
  1367. {
  1368. empfangen->sendeEncrypted( "\1", 1 );
  1369. empfangen->setEmpfangKey( *key, key->getLength() );
  1370. empfangen->setSendeKey( *key, key->getLength() );
  1371. key->release();
  1372. }
  1373. }
  1374. break;
  1375. case 2: // Main / Erhaltung Server message
  1376. if( 1 )
  1377. {
  1378. char befehl = 0;
  1379. empfangen->getNachrichtEncrypted( &befehl, 1 );
  1380. switch( befehl )
  1381. {
  1382. case 2: // klient absturtz
  1383. if( 1 )
  1384. {
  1385. int klientId = 0;
  1386. empfangen->getNachrichtEncrypted( (char*)&klientId, 4 );
  1387. if( klientId && ss->absturzKlient( klientId ) )
  1388. empfangen->sendeEncrypted( "\1", 1 );
  1389. else
  1390. empfangen->sendeEncrypted( "\0", 1 );
  1391. }
  1392. break;
  1393. default:
  1394. errorZuKlientEmpfang( "Befehl nicht bekannt!" );
  1395. break;
  1396. }
  1397. }
  1398. break;
  1399. case 3: // Verbindungsende
  1400. trenne();
  1401. empfangen->sendeEncrypted( "\1", 1 );
  1402. br = 1;
  1403. break;
  1404. case 4: // SpielErstellt annehmen
  1405. if( zErstellt )
  1406. {
  1407. if( zErstellt->klientNimmtAn( accountId ) )
  1408. empfangen->sendeEncrypted( "\1", 1 );
  1409. else
  1410. {
  1411. empfangen->sendeEncrypted( "\0", 1 );
  1412. errorZuKlientSende( "Es ist ein unbekannter Fehler aufgetreten." );
  1413. }
  1414. }
  1415. else
  1416. {
  1417. empfangen->sendeEncrypted( "\0", 1 );
  1418. errorZuKlientSende( "Dir wurde kein erstelltes Spiel zugeteilt." );
  1419. }
  1420. break;
  1421. case 5: // SpielErstellt ablehnen
  1422. if( zErstellt )
  1423. {
  1424. if( zErstellt->klientLehntAb( accountId ) )
  1425. empfangen->sendeEncrypted( "\1", 1 );
  1426. else
  1427. {
  1428. empfangen->sendeEncrypted( "\0", 1 );
  1429. errorZuKlientSende( "Es ist ein unbekannter Fehler aufgetreten." );
  1430. }
  1431. }
  1432. else
  1433. {
  1434. empfangen->sendeEncrypted( "\0", 1 );
  1435. errorZuKlientSende( "Dir wurde kein erstelltes Spiel zugeteilt." );
  1436. }
  1437. break;
  1438. case 6: // SpielErstellt team wechseln
  1439. if( zSpiel )
  1440. {
  1441. empfangen->sendeEncrypted( "\1", 1 );
  1442. int team = 0;
  1443. empfangen->getNachrichtEncrypted( (char*)&team, 4 );
  1444. if( zSpiel->klientWechseltTeam( accountId, team ) )
  1445. empfangen->sendeEncrypted( "\1", 1 );
  1446. else
  1447. {
  1448. empfangen->sendeEncrypted( "\0", 1 );
  1449. errorZuKlientSende( "Das Team Ist bereits voll." );
  1450. }
  1451. }
  1452. else
  1453. {
  1454. empfangen->sendeEncrypted( "\0", 1 );
  1455. errorZuKlientSende( "Dir wurde kein erstelltes Spiel zugeteilt." );
  1456. }
  1457. break;
  1458. case 7: // SpielErstellt chat Nachricht
  1459. if( zSpiel )
  1460. {
  1461. empfangen->sendeEncrypted( "\1", 1 );
  1462. unsigned char len = 0;
  1463. empfangen->getNachrichtEncrypted( (char*)&len, 1 );
  1464. char* nachricht = new char[ len + 1 ];
  1465. nachricht[ (int)len ] = 0;
  1466. if( len )
  1467. empfangen->getNachrichtEncrypted( nachricht, len );
  1468. Text* msg = ss->zDB()->getAccountRufName( accountId );
  1469. msg->append( ": " );
  1470. msg->append( nachricht );
  1471. delete[] nachricht;
  1472. if( zSpiel->chatNachricht( msg->getText() ) )
  1473. empfangen->sendeEncrypted( "\1", 1 );
  1474. else
  1475. {
  1476. empfangen->sendeEncrypted( "\0", 1 );
  1477. errorZuKlientSende( "Es ist ein unbekannter Fehler aufgetreten." );
  1478. }
  1479. msg->release();
  1480. }
  1481. else
  1482. {
  1483. empfangen->sendeEncrypted( "\0", 1 );
  1484. errorZuKlientSende( "Dir wurde kein erstelltes Spiel zugeteilt." );
  1485. }
  1486. break;
  1487. case 8: // Server Message
  1488. if( 1 )
  1489. {
  1490. char befehl = 0;
  1491. empfangen->getNachrichtEncrypted( &befehl, 1 );
  1492. switch( befehl )
  1493. {
  1494. case 0: // Verbindung Trennen
  1495. empfangen->sendeEncrypted( "\1", 1 );
  1496. br = 1;
  1497. del = 1;
  1498. break;
  1499. case 1: // Spiel Erstellen Abbrechen
  1500. if( 1 )
  1501. {
  1502. empfangen->sendeEncrypted( "\1", 1 );
  1503. int spielErstelltId = 0;
  1504. empfangen->getNachrichtEncrypted( (char*)&spielErstelltId, 4 );
  1505. ss->SpielErstelltAbbruch( spielErstelltId );
  1506. empfangen->sendeEncrypted( "\1", 1 );
  1507. }
  1508. break;
  1509. default:
  1510. empfangen->sendeEncrypted( "\0", 1 );
  1511. break;
  1512. }
  1513. }
  1514. break;
  1515. case 9: // Bereit zum Laden
  1516. if( zSpiel && zSpiel->klientBereitZumLaden( accountId ) )
  1517. empfangen->sendeEncrypted( "\1", 1 );
  1518. else
  1519. {
  1520. empfangen->sendeEncrypted( "\0", 1 );
  1521. errorZuKlientSende( "Es ist ein unbekannter Fehler aufgetreten." );
  1522. }
  1523. break;
  1524. case 0xA: // Bereit zum Spiel
  1525. if( zSpiel && zSpiel->klientBereitZumSpiel( accountId ) )
  1526. empfangen->sendeEncrypted( "\1", 1 );
  1527. else
  1528. {
  1529. empfangen->sendeEncrypted( "\0", 1 );
  1530. errorZuKlientSende( "Es ist ein unbekannter Fehler aufgetreten." );
  1531. }
  1532. break;
  1533. case 0xB: // Spiel Nachricht
  1534. if( 1 )
  1535. {
  1536. unsigned short len = 0;
  1537. empfangen->getNachricht( (char*)&len, 2 );
  1538. char* bytes = new char[ len ];
  1539. empfangen->getNachricht( bytes, len );
  1540. if( !zSpiel || !zSpiel->spielNachricht( accountId, len, bytes ) )
  1541. errorZuKlientSende( "Es ist ein unbekannter Fehler aufgetreten." );
  1542. delete[] bytes;
  1543. }
  1544. break;
  1545. case 0xC: // Spiel Laden Prozent
  1546. if( 1 )
  1547. {
  1548. empfangen->sendeEncrypted( "\1", 1 );
  1549. int prozent = 0;
  1550. empfangen->getNachrichtEncrypted( (char*)&prozent, 4 );
  1551. if( zSpiel && zSpiel->klientSpielLadenProzent( accountId, prozent ) )
  1552. empfangen->sendeEncrypted( "\1", 1 );
  1553. else
  1554. {
  1555. empfangen->sendeEncrypted( "\0", 1 );
  1556. errorZuKlientSende( "Es ist ein unbekannter Fehler aufgetreten." );
  1557. }
  1558. }
  1559. break;
  1560. case 0xD: // Statistik Nachricht
  1561. if( 1 )
  1562. {
  1563. empfangen->sendeEncrypted( "\1", 1 );
  1564. unsigned short len = 0;
  1565. empfangen->getNachrichtEncrypted( (char*)&len, 2 );
  1566. char* bytes = new char[ len ];
  1567. empfangen->getNachrichtEncrypted( bytes, len );
  1568. if( zSpiel && zSpiel->statistikNachricht( accountId, len, bytes ) )
  1569. empfangen->sendeEncrypted( "\1", 1 );
  1570. else
  1571. {
  1572. empfangen->sendeEncrypted( "\0", 1 );
  1573. errorZuKlientSende( "Es ist ein unbekannter Fehler aufgetreten." );
  1574. }
  1575. delete[] bytes;
  1576. }
  1577. break;
  1578. case 0xE: // Team wählen Fertig
  1579. if( 1 )
  1580. {
  1581. if( zSpiel && zSpiel->klientTeamAuswahlFertig( accountId ) )
  1582. empfangen->sendeEncrypted( "\1", 1 );
  1583. else
  1584. {
  1585. empfangen->sendeEncrypted( "\0", 1 );
  1586. errorZuKlientSende( "Es ist ein unbekannter Fehler aufgetreten." );
  1587. }
  1588. }
  1589. break;
  1590. case 0xF: // ping
  1591. if( 1 )
  1592. {
  1593. empfangen->sendeEncrypted( "\1", 1 );
  1594. keepAlive();
  1595. }
  1596. break;
  1597. default:
  1598. empfangen->sendeEncrypted( "\0", 1 );
  1599. errorZuKlientSende( "Unbekannte Nachricht." );
  1600. unbekannt += 2;
  1601. if( unbekannt > 10 )
  1602. {
  1603. trenne();
  1604. br = 1;
  1605. }
  1606. break;
  1607. }
  1608. unbekannt--;
  1609. if( unbekannt < 0 )
  1610. unbekannt = 0;
  1611. }
  1612. else
  1613. {
  1614. trenne();
  1615. br = 1;
  1616. }
  1617. if( br )
  1618. break;
  1619. ss->addEmpfangen( empfangen->getDownloadBytes( 1 ) );
  1620. ss->addGesendet( empfangen->getUploadBytes( 1 ) );
  1621. }
  1622. ss->addEmpfangen( empfangen->getDownloadBytes( 1 ) );
  1623. ss->addGesendet( empfangen->getUploadBytes( 1 ) );
  1624. if( del || !accountId )
  1625. {
  1626. termThread = 0;
  1627. delete this;
  1628. }
  1629. else
  1630. {
  1631. termThread = 0;
  1632. ss->unregisterKlient( this );
  1633. }
  1634. }
  1635. void SSKlient::errorZuKlientEmpfang( const char* nachricht ) // sendet eine Fehlernachricht zum Klient
  1636. {
  1637. unsigned char len = (unsigned char)textLength( nachricht );
  1638. if( !len )
  1639. return;
  1640. if( empfangen )
  1641. {
  1642. empfangen->sendeEncrypted( "\3", 1 );
  1643. empfangen->sendeEncrypted( (char*)&len, 1 );
  1644. empfangen->sendeEncrypted( nachricht, len );
  1645. }
  1646. ss->addEmpfangen( empfangen->getDownloadBytes( 1 ) );
  1647. ss->addGesendet( empfangen->getUploadBytes( 1 ) );
  1648. }
  1649. void SSKlient::errorZuKlientSende( const char* nachricht )
  1650. {
  1651. unsigned char len = (unsigned char)textLength( nachricht );
  1652. if( !len )
  1653. return;
  1654. if( senden )
  1655. {
  1656. lock();
  1657. senden->sendeEncrypted( "\3", 1 );
  1658. senden->sendeEncrypted( (char*)&len, 1 );
  1659. senden->sendeEncrypted( nachricht, len );
  1660. unlock();
  1661. ss->addEmpfangen( senden->getDownloadBytes( 1 ) );
  1662. ss->addGesendet( senden->getUploadBytes( 1 ) );
  1663. }
  1664. }
  1665. // const
  1666. int SSKlient::getAccountId() const
  1667. {
  1668. return accountId;
  1669. }
  1670. int SSKlient::getKlientNummer() const
  1671. {
  1672. return klientNummer;
  1673. }
  1674. SKlient* SSKlient::getKlient() const
  1675. {
  1676. return dynamic_cast<SKlient*>(empfangen->getThis());
  1677. }