SpielServer.cpp 51 KB

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