InformationServer.cpp 47 KB

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