KartenServer.cpp 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
  1. #include "KartenServer.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. // Inhalt der KartenServer Klasse aus KartenServer.h
  6. // Konstruktor
  7. KartenServer::KartenServer( InitDatei *zIni )
  8. : Thread()
  9. {
  10. Network::Start( 100 );
  11. std::cout << "KS: Verbindung mit Datenbank wird hergestellt...\n";
  12. db = new KSDatenbank( zIni );
  13. klientAnzahl = 0;
  14. klients = new RCArray< KSKlient >();
  15. empfangen = 0;
  16. gesendet = 0;
  17. fehler = new Text();
  18. ini = zIni->getThis();
  19. id = *zIni->zWert( "ServerId" );
  20. server = new Server();
  21. aServer = new Server();
  22. std::cout << "KS: Starten des Admin Servers...\n";
  23. if( !aServer->verbinde( (unsigned short)db->getAdminPort( id ), 10 ) )
  24. {
  25. std::cout << "KS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  26. exit( 1 );
  27. }
  28. db->setServerStatus( id, 2 );
  29. end = 0;
  30. nichtPausiert = 0;
  31. updateKarte = 0;
  32. InitializeCriticalSection( &cs );
  33. ref = 1;
  34. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  35. {
  36. serverStarten();
  37. serverFortsetzen();
  38. }
  39. updater = new Updater( getThis() );
  40. }
  41. // Destruktor
  42. KartenServer::~KartenServer()
  43. {
  44. updater->release();
  45. fehler->release();
  46. server->trenne();
  47. server->release();
  48. aServer->trenne();
  49. aServer->release();
  50. if( klients )
  51. klients->release();
  52. ini->release();
  53. db->release();
  54. DeleteCriticalSection( &cs );
  55. }
  56. // nicht constant
  57. void KartenServer::runn()
  58. {
  59. while( !end )
  60. {
  61. SKlient *klient;
  62. klient = aServer->getKlient();
  63. if( end && klient )
  64. {
  65. klient->trenne();
  66. klient = klient->release();
  67. Sleep( 1000 );
  68. return;
  69. }
  70. if( !klient )
  71. return;
  72. KSAKlient *clHandle = new KSAKlient( klient, getThis() );
  73. clHandle->start();
  74. }
  75. }
  76. void KartenServer::thread()
  77. {
  78. while( 1 )
  79. {
  80. SKlient *klient;
  81. klient = server->getKlient();
  82. if( !klient )
  83. break;
  84. Framework::getThreadRegister()->cleanUpClosedThreads();
  85. KSKlient *clHandle = new KSKlient( klient, getThis() );
  86. EnterCriticalSection( &cs );
  87. klients->set( clHandle, klientAnzahl );
  88. klientAnzahl++;
  89. LeaveCriticalSection( &cs );
  90. clHandle->start();
  91. }
  92. }
  93. void KartenServer::close()
  94. {
  95. db->setServerStatus( id, 1 );
  96. server->trenne();
  97. #ifdef WIN32
  98. warteAufThread( 1000 );
  99. #endif
  100. EnterCriticalSection( &cs );
  101. for( int i = 0; i < klientAnzahl; i++ )
  102. klients->z( i )->absturz();
  103. klients = klients->release();
  104. klientAnzahl = 0;
  105. LeaveCriticalSection( &cs );
  106. ende();
  107. run = 0;
  108. end = 1;
  109. Klient *klient = new Klient();
  110. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  111. Sleep( 500 );
  112. aServer->trenne();
  113. klient->release();
  114. }
  115. bool KartenServer::serverStarten()
  116. {
  117. if( nichtPausiert )
  118. {
  119. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  120. return 0;
  121. }
  122. if( server )
  123. server->release();
  124. server = new Server();
  125. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  126. {
  127. nichtPausiert = 1;
  128. start();
  129. return 1;
  130. }
  131. else
  132. {
  133. serverBeenden();
  134. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  135. return 0;
  136. }
  137. }
  138. bool KartenServer::serverPause()
  139. {
  140. if( !nichtPausiert )
  141. {
  142. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  143. return 0;
  144. }
  145. if( !db->setServerStatus( id, 2 ) )
  146. {
  147. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  148. fehler->append( db->getLetzterFehler() );
  149. return 0;
  150. }
  151. return 1;
  152. }
  153. bool KartenServer::serverFortsetzen()
  154. {
  155. if( !nichtPausiert )
  156. {
  157. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  158. return 0;
  159. }
  160. if( !db->setServerStatus( id, 3 ) )
  161. {
  162. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  163. fehler->append( db->getLetzterFehler() );
  164. return 0;
  165. }
  166. return 1;
  167. }
  168. bool KartenServer::serverBeenden()
  169. {
  170. if( !nichtPausiert )
  171. {
  172. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  173. return 0;
  174. }
  175. if( db->serverIstNichtPausiert( id ) )
  176. {
  177. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  178. return 0;
  179. }
  180. nichtPausiert = 0;
  181. ende();
  182. if( server )
  183. server->trenne();
  184. return 1;
  185. }
  186. bool KartenServer::setMaxKarten( int mk )
  187. {
  188. if( !db->setMaxKarten( id, mk ) )
  189. {
  190. fehler->setText( "Die maximale Anzahl der Karten konnte nicht gesetzt werden:\n" );
  191. fehler->append( db->getLetzterFehler() );
  192. return 0;
  193. }
  194. ini->setWert( "MaxKarten", Text() += mk );
  195. return 1;
  196. }
  197. bool KartenServer::absturzKlient( int klientId )
  198. {
  199. bool gefunden = 0;
  200. EnterCriticalSection( &cs );
  201. for( int i = 0; i < klientAnzahl; i++ )
  202. {
  203. if( klients->z( i )->getKlientNummer() == klientId )
  204. {
  205. klients->z( i )->absturz();
  206. klients->remove( i );
  207. klientAnzahl--;
  208. gefunden = 1;
  209. break;
  210. }
  211. }
  212. LeaveCriticalSection( &cs );
  213. return gefunden;
  214. }
  215. bool KartenServer::removeKlient( KSKlient *zKlient )
  216. {
  217. bool gefunden = 0;
  218. EnterCriticalSection( &cs );
  219. for( int i = 0; i < klientAnzahl; i++ )
  220. {
  221. if( klients->z( i ) == zKlient )
  222. {
  223. klients->remove( i );
  224. klientAnzahl--;
  225. gefunden = 1;
  226. break;
  227. }
  228. }
  229. LeaveCriticalSection( &cs );
  230. return gefunden;
  231. }
  232. void KartenServer::addGesendet( int bytes )
  233. {
  234. gesendet += bytes;
  235. }
  236. void KartenServer::addEmpfangen( int bytes )
  237. {
  238. empfangen += bytes;
  239. }
  240. void KartenServer::karteUpdateStart( int karteId )
  241. {
  242. updateKarte = karteId;
  243. }
  244. void KartenServer::karteUpdateEnde()
  245. {
  246. updateKarte = 0;
  247. }
  248. // constant
  249. bool KartenServer::istAn() const
  250. {
  251. return db->serverIstNichtPausiert( id );
  252. }
  253. Server *KartenServer::zServer() const
  254. {
  255. return server;
  256. }
  257. KSDatenbank *KartenServer::zDB() const
  258. {
  259. return db;
  260. }
  261. InitDatei *KartenServer::zIni() const
  262. {
  263. return ini;
  264. }
  265. bool KartenServer::hatClients() const
  266. {
  267. return klientAnzahl > 0;
  268. }
  269. int KartenServer::getId() const
  270. {
  271. return id;
  272. }
  273. char *KartenServer::getLetzterFehler() const
  274. {
  275. return fehler->getText();
  276. }
  277. bool KartenServer::wirdKarteGeupdatet( int id ) const
  278. {
  279. return id == updateKarte;
  280. }
  281. // Reference Counting
  282. KartenServer *KartenServer::getThis()
  283. {
  284. ref++;
  285. return this;
  286. }
  287. KartenServer *KartenServer::release()
  288. {
  289. ref--;
  290. if( !ref )
  291. delete this;
  292. return 0;
  293. }
  294. // Inhalt der KSAKlient Klasse aus KartenServer.h
  295. // Konstruktor
  296. KSAKlient::KSAKlient( SKlient *klient, KartenServer *ks )
  297. : Thread()
  298. {
  299. this->klient = klient;
  300. unsigned char key[ 20 ] = { 179, 126, 247, 108, 30, 201, 180, 160, 131, 216, 16, 47, 42, 31, 193, 200, 157, 86, 175, 133 };
  301. klient->setSendeKey( (char*)key, 20 );
  302. klient->setEmpfangKey( (char*)key, 20 );
  303. name = new Text( "" );
  304. passwort = new Text( "" );
  305. adminId = 0;
  306. this->ks = ks;
  307. }
  308. // Destruktor
  309. KSAKlient::~KSAKlient()
  310. {
  311. klient->trenne();
  312. klient->release();
  313. ks->release();
  314. name->release();
  315. passwort->release();
  316. }
  317. // nicht constant
  318. void KSAKlient::thread()
  319. {
  320. while( 1 )
  321. {
  322. char c = 0;
  323. if( !klient->getNachrichtEncrypted( &c, 1 ) )
  324. break;
  325. else
  326. {
  327. bool br = 0;
  328. switch( c )
  329. {
  330. case 1: // Login
  331. if( 1 )
  332. {
  333. klient->sendeEncrypted( "\1", 1 );
  334. char nLen = 0;
  335. klient->getNachrichtEncrypted( &nLen, 1 );
  336. char *n = new char[ nLen + 1 ];
  337. n[ (int)nLen ] = 0;
  338. if( nLen )
  339. klient->getNachrichtEncrypted( n, nLen );
  340. char pLen = 0;
  341. klient->getNachrichtEncrypted( &pLen, 1 );
  342. char *p = new char[ pLen + 1 ];
  343. p[ (int)pLen ] = 0;
  344. if( pLen )
  345. klient->getNachrichtEncrypted( p, pLen );
  346. int adminId = ks->zDB()->istAdministrator( n, p );
  347. if( adminId )
  348. {
  349. klient->sendeEncrypted( "\1", 1 );
  350. name->setText( n );
  351. passwort->setText( p );
  352. this->adminId = adminId;
  353. }
  354. else
  355. errorZuKlient( "Falsche Kombination aus Name und Passwort." );
  356. delete[] n;
  357. delete[] p;
  358. }
  359. break;
  360. case 2: // Logout
  361. adminId = 0;
  362. name->setText( "" );
  363. passwort->setText( "" );
  364. klient->sendeEncrypted( "\1", 1 );
  365. break;
  366. case 3: // Trennen
  367. br = 1;
  368. klient->sendeEncrypted( "\1", 1 );
  369. break;
  370. case 4: // Server starten
  371. if( !adminId )
  372. errorZuKlient( "Du musst dich einloggen." );
  373. else
  374. {
  375. if( ks->zDB()->adminHatRecht( adminId, Admin_Recht::KSStarten ) )
  376. {
  377. if( !ks->serverStarten() )
  378. {
  379. Text *err = new Text();
  380. err->append( ks->getLetzterFehler() );
  381. errorZuKlient( err->getText() );
  382. err->release();
  383. }
  384. else
  385. klient->sendeEncrypted( "\1", 1 );
  386. }
  387. else
  388. errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
  389. }
  390. break;
  391. case 5: // Server beenden
  392. if( !adminId )
  393. errorZuKlient( "Du musst dich einloggen." );
  394. else
  395. {
  396. if( ks->zDB()->adminHatRecht( adminId, Admin_Recht::KSBeenden ) )
  397. {
  398. if( ks->serverBeenden() )
  399. klient->sendeEncrypted( "\1", 1 );
  400. else
  401. {
  402. Text *err = new Text();
  403. err->append( ks->getLetzterFehler() );
  404. errorZuKlient( err->getText() );
  405. err->release();
  406. }
  407. }
  408. else
  409. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  410. }
  411. break;
  412. case 6: // Programm Schließen
  413. if( !adminId )
  414. errorZuKlient( "Du musst dich einloggen." );
  415. else
  416. {
  417. bool ok = 0;
  418. if( ks->isRunning() )
  419. {
  420. if( ks->zDB()->adminHatRecht( adminId, Admin_Recht::KSBeenden ) )
  421. {
  422. if( ks->serverBeenden() )
  423. ok = 1;
  424. else
  425. {
  426. Text *err = new Text();
  427. err->append( ks->getLetzterFehler() );
  428. errorZuKlient( err->getText() );
  429. err->release();
  430. }
  431. }
  432. else
  433. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  434. }
  435. else
  436. ok = 1;
  437. if( ok && ks->hatClients() )
  438. {
  439. errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
  440. break;
  441. }
  442. if( ok )
  443. {
  444. klient->sendeEncrypted( "\1", 1 );
  445. std::cout << "KS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  446. ks->close();
  447. br = 1;
  448. }
  449. }
  450. break;
  451. case 7: // Progtamm abstürzen
  452. if( !adminId )
  453. errorZuKlient( "Du musst dich einloggen." );
  454. else
  455. {
  456. bool ok = 0;
  457. if( ks->isRunning() )
  458. {
  459. if( ks->zDB()->adminHatRecht( adminId, Admin_Recht::KSBeenden ) )
  460. {
  461. ks->serverBeenden();
  462. ok = 1;
  463. }
  464. else
  465. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  466. }
  467. else
  468. ok = 1;
  469. if( ok )
  470. {
  471. klient->sendeEncrypted( "\1", 1 );
  472. std::cout << "KS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  473. ks->close();
  474. br = 1;
  475. }
  476. }
  477. break;
  478. case 8: // Status Frage
  479. if( 1 )
  480. {
  481. char status = 0;
  482. if( ks->isRunning() )
  483. {
  484. status = 1;
  485. if( ks->istAn() )
  486. status = 2;
  487. }
  488. klient->sendeEncrypted( "\1", 1 );
  489. klient->sendeEncrypted( &status, 1 );
  490. }
  491. break;
  492. case 9: // Server pausieren
  493. if( !adminId )
  494. errorZuKlient( "Du musst dich einloggen." );
  495. else
  496. {
  497. klient->sendeEncrypted( "\1", 1 );
  498. char pause = 0;
  499. klient->getNachrichtEncrypted( &pause, 1 );
  500. if( ks->zDB()->adminHatRecht( adminId, Admin_Recht::KSPausieren ) )
  501. {
  502. bool ok = 0;
  503. if( pause )
  504. ok = ks->serverPause();
  505. else
  506. ok = ks->serverFortsetzen();
  507. if( ok )
  508. klient->sendeEncrypted( "\1", 1 );
  509. else
  510. {
  511. Text *err = new Text();
  512. err->append( ks->getLetzterFehler() );
  513. errorZuKlient( err->getText() );
  514. err->release();
  515. }
  516. }
  517. else
  518. {
  519. if( pause )
  520. errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
  521. else
  522. errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
  523. }
  524. }
  525. break;
  526. case 0xA: // maximale Anzahl der Clients setzen
  527. if( !adminId )
  528. errorZuKlient( "Du musst dich einloggen." );
  529. else
  530. {
  531. klient->sendeEncrypted( "\1", 1 );
  532. int maxK = 0;
  533. klient->getNachrichtEncrypted( (char*)&maxK, 4 );
  534. if( ks->zDB()->adminHatRecht( adminId, Admin_Recht::KSMKChange ) )
  535. {
  536. if( ks->setMaxKarten( maxK ) )
  537. klient->sendeEncrypted( "\1", 1 );
  538. else
  539. {
  540. Text *err = new Text();
  541. err->append( ks->getLetzterFehler() );
  542. errorZuKlient( err->getText() );
  543. err->release();
  544. }
  545. }
  546. else
  547. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Karten zu verändern." );
  548. }
  549. break;
  550. case 0xC: // klient absturtz
  551. if( 1 )
  552. {
  553. klient->sendeEncrypted( "\1", 1 );
  554. int klientId = 0;
  555. klient->getNachrichtEncrypted( (char*)&klientId, 4 );
  556. if( klientId && ks->absturzKlient( klientId ) )
  557. klient->sendeEncrypted( "\1", 1 );
  558. else
  559. klient->sendeEncrypted( "\0", 1 );
  560. }
  561. break;
  562. default:
  563. errorZuKlient( "Unbekannte Nachricht!" );
  564. break;
  565. }
  566. if( br )
  567. break;
  568. ks->addEmpfangen( klient->getDownloadBytes( 1 ) );
  569. ks->addGesendet( klient->getUploadBytes( 1 ) );
  570. }
  571. }
  572. ks->addEmpfangen( klient->getDownloadBytes( 1 ) );
  573. ks->addGesendet( klient->getUploadBytes( 1 ) );
  574. delete this;
  575. }
  576. void KSAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  577. {
  578. klient->sendeEncrypted( "\3", 1 );
  579. char len = (char)textLength( nachricht );
  580. klient->sendeEncrypted( &len, 1 );
  581. klient->sendeEncrypted( nachricht, len );
  582. }
  583. // Inhalt der KSKlient aus KartenServer.h
  584. // Konstruktor
  585. KSKlient::KSKlient( SKlient *klient, KartenServer *ks )
  586. : Thread()
  587. {
  588. this->klient = klient;
  589. unsigned char key[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
  590. klient->setSendeKey( (char*)key, 20 );
  591. klient->setEmpfangKey( (char*)key, 20 );
  592. klientNummer = 0;
  593. this->ks = ks;
  594. ref = 1;
  595. }
  596. // Destruktor
  597. KSKlient::~KSKlient()
  598. {
  599. klient->release();
  600. ks->release();
  601. }
  602. // privat
  603. void KSKlient::suchDateien( const char *pf, RCArray< Text > *zDL, const char *rem )
  604. {
  605. Datei d;
  606. d.setDatei( pf );
  607. if( d.istOrdner() )
  608. {
  609. RCArray< Text > *list = d.getDateiListe();
  610. if( list )
  611. {
  612. int anz = list->getEintragAnzahl();
  613. for( int i = 0; i < anz; i++ )
  614. {
  615. Text pfad = pf;
  616. pfad += "/";
  617. pfad += list->z( i )->getText();
  618. suchDateien( pfad, zDL, rem );
  619. }
  620. list->release();
  621. }
  622. }
  623. else
  624. {
  625. Text *pfad = new Text( pf );
  626. pfad->remove( 0, textLength( rem ) );
  627. zDL->add( pfad );
  628. }
  629. }
  630. // nicht constant
  631. void KSKlient::absturz()
  632. {
  633. ende();
  634. klient->trenne();
  635. ks->zDB()->unregisterKlient( klientNummer, ks->getId() );
  636. }
  637. void KSKlient::thread()
  638. {
  639. while( 1 )
  640. {
  641. char c = 0;
  642. if( !klient->getNachrichtEncrypted( &c, 1 ) )
  643. break;
  644. else
  645. {
  646. bool br = 0;
  647. switch( c )
  648. {
  649. case 1: // Klient identifikation
  650. klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
  651. if( !ks->zDB()->proveKlient( klientNummer, ks->getId() ) )
  652. {
  653. klientNummer = 0;
  654. errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
  655. }
  656. else
  657. {
  658. Text *key = ks->zDB()->getKlientKey( klientNummer );
  659. if( !key )
  660. errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
  661. else
  662. {
  663. klient->sendeEncrypted( "\1", 1 );
  664. klient->setEmpfangKey( *key, key->getLength() );
  665. klient->setSendeKey( *key, key->getLength() );
  666. key->release();
  667. }
  668. }
  669. break;
  670. case 2: // Main / Erhaltung Server message
  671. if( 1 )
  672. {
  673. char befehl = 0;
  674. klient->getNachrichtEncrypted( &befehl, 1 );
  675. switch( befehl )
  676. {
  677. case 2: // klient absturtz
  678. if( 1 )
  679. {
  680. int klientId = 0;
  681. klient->getNachrichtEncrypted( (char*)&klientId, 4 );
  682. if( klientId && ks->absturzKlient( klientId ) )
  683. klient->sendeEncrypted( "\1", 1 );
  684. else
  685. klient->sendeEncrypted( "\0", 1 );
  686. }
  687. break;
  688. default:
  689. errorZuKlient( "Befehl nicht bekannt!" );
  690. break;
  691. }
  692. }
  693. break;
  694. case 3: // Verbindungsende
  695. br = 1;
  696. klient->sendeEncrypted( "\1", 1 );
  697. break;
  698. case 4: // unregister Klient
  699. if( !klientNummer )
  700. {
  701. errorZuKlient( "Du bist nicht Identifiziert." );
  702. break;
  703. }
  704. ks->zDB()->unregisterKlient( klientNummer, ks->getId() );
  705. klient->sendeEncrypted( "\1", 1 );
  706. break;
  707. case 5: // keep alive
  708. if( !klientNummer )
  709. {
  710. errorZuKlient( "Du bist nicht Identifiziert." );
  711. break;
  712. }
  713. klient->sendeEncrypted( "\1", 1 );
  714. break;
  715. case 6: // download Karte (Klient)
  716. if( !klientNummer )
  717. {
  718. errorZuKlient( "Du bist nicht Identifiziert." );
  719. break;
  720. }
  721. else
  722. {
  723. klient->sendeEncrypted( "\1", 1 );
  724. int id = 0;
  725. klient->getNachrichtEncrypted( (char*)&id, 4 );
  726. if( !ks->zDB()->proveKarte( id, ks->getId() ) )
  727. {
  728. errorZuKlient( "Die Karte wurde nicht gefunden." );
  729. break;
  730. }
  731. if( ks->wirdKarteGeupdatet( id ) )
  732. {
  733. char c = 2;
  734. klient->sendeEncrypted( &c, 1 );
  735. break;
  736. }
  737. klient->sendeEncrypted( "\1", 1 );
  738. Text pfad = ks->zIni()->zWert( "KartenPfad" )->getText();
  739. pfad += "/";
  740. pfad += id;
  741. pfad += "/client/map";
  742. RCArray< Text > *dList = new RCArray< Text >();
  743. suchDateien( pfad, dList, pfad );
  744. int anz = dList->getEintragAnzahl();
  745. klient->sendeEncrypted( (char*)&anz, 4 );
  746. for( int i = 0; i < anz; i++ )
  747. {
  748. Text pf = dList->z( i )->getText();
  749. unsigned char len = (unsigned char)pf.getLength();
  750. Text dp = pf.getText();
  751. dp.insert( 0, (char*)pfad );
  752. Datei d;
  753. d.setDatei( dp );
  754. if( !len || !d.open( Datei::Style::lesen ) )
  755. {
  756. klient->sendeEncrypted( "\0", 1 );
  757. continue;
  758. }
  759. klient->sendeEncrypted( (char*)&len, 1 );
  760. klient->sendeEncrypted( pf, len );
  761. __int64 size = d.getSize();
  762. klient->sendeEncrypted( (char*)&size, 8 );
  763. char *buffer = new char[ 2048 ];
  764. while( size )
  765. {
  766. int l = size >= 2048 ? 2048 : (int)size;
  767. d.lese( buffer, l );
  768. klient->sende( buffer, l );
  769. size -= l;
  770. }
  771. delete[] buffer;
  772. d.close();
  773. }
  774. dList->release();
  775. }
  776. break;
  777. case 7: // download Karte (Server)
  778. if( klientNummer )
  779. {
  780. errorZuKlient( "Du bist nicht berechtigt." );
  781. break;
  782. }
  783. else
  784. {
  785. klient->sendeEncrypted( "\1", 1 );
  786. int id = 0;
  787. klient->getNachrichtEncrypted( (char*)&id, 4 );
  788. if( !ks->zDB()->proveKarte( id, ks->getId() ) )
  789. {
  790. errorZuKlient( "Die Karte wurde nicht gefunden." );
  791. break;
  792. }
  793. if( ks->wirdKarteGeupdatet( id ) )
  794. {
  795. char c = 2;
  796. klient->sendeEncrypted( &c, 1 );
  797. break;
  798. }
  799. klient->sendeEncrypted( "\1", 1 );
  800. Text pfad = ks->zIni()->zWert( "KartenPfad" )->getText();
  801. pfad += "/";
  802. pfad += id;
  803. pfad += "/server";
  804. RCArray< Text > *dList = new RCArray< Text >();
  805. suchDateien( pfad, dList, pfad );
  806. int anz = dList->getEintragAnzahl();
  807. klient->sendeEncrypted( (char*)&anz, 4 );
  808. for( int i = 0; i < anz; i++ )
  809. {
  810. Text pf = dList->z( i )->getText();
  811. unsigned char len = (unsigned char)pf.getLength();
  812. Text dp = pf.getText();
  813. dp.insert( 0, (char*)pfad );
  814. Datei d;
  815. d.setDatei( dp );
  816. if( !len || !d.open( Datei::Style::lesen ) )
  817. continue;
  818. klient->sendeEncrypted( (char*)&len, 1 );
  819. klient->sendeEncrypted( pf, len );
  820. __int64 size = d.getSize();
  821. klient->sendeEncrypted( (char*)&size, 8 );
  822. char *buffer = new char[ 2048 ];
  823. while( size )
  824. {
  825. int l = size >= 2048 ? 2048 : (int)size;
  826. d.lese( buffer, l );
  827. klient->sende( buffer, l );
  828. size -= l;
  829. }
  830. delete[] buffer;
  831. d.close();
  832. }
  833. dList->release();
  834. }
  835. break;
  836. case 8: // Karte Titel Bild laden
  837. if( !klientNummer )
  838. {
  839. errorZuKlient( "Du bist nicht Identifiziert." );
  840. break;
  841. }
  842. else
  843. {
  844. klient->sendeEncrypted( "\1", 1 );
  845. int id = 0;
  846. klient->getNachrichtEncrypted( (char*)&id, 4 );
  847. if( !ks->zDB()->proveKarte( id, ks->getId() ) )
  848. {
  849. errorZuKlient( "Die Karte wurde nicht gefunden." );
  850. break;
  851. }
  852. if( ks->wirdKarteGeupdatet( id ) )
  853. {
  854. char c = 2;
  855. klient->sendeEncrypted( &c, 1 );
  856. break;
  857. }
  858. Text pfad = ks->zIni()->zWert( "KartenPfad" )->getText();
  859. pfad += "/";
  860. pfad += id;
  861. pfad += "/client/titel.ltdb";
  862. Datei d;
  863. d.setDatei( pfad );
  864. if( d.open( Datei::Style::lesen ) )
  865. klient->sendeEncrypted( "\1", 1 );
  866. else
  867. errorZuKlient( "Fehler beim lesen der Datei." );
  868. __int64 size = d.getSize();
  869. klient->sendeEncrypted( (char*)&size, 8 );
  870. char *buffer = new char[ 2048 ];
  871. while( size )
  872. {
  873. int l = size >= 2048 ? 2048 : (int)size;
  874. d.lese( buffer, l );
  875. klient->sende( buffer, l );
  876. size -= l;
  877. }
  878. delete[] buffer;
  879. d.close();
  880. }
  881. break;
  882. case 9: // Karte Beschreibung
  883. if( !klientNummer )
  884. {
  885. errorZuKlient( "Du bist nicht Identifiziert." );
  886. break;
  887. }
  888. else
  889. {
  890. klient->sendeEncrypted( "\1", 1 );
  891. int id = 0;
  892. klient->getNachrichtEncrypted( (char*)&id, 4 );
  893. if( !ks->zDB()->proveKarte( id, ks->getId() ) )
  894. {
  895. errorZuKlient( "Die Karte wurde nicht gefunden." );
  896. break;
  897. }
  898. if( ks->wirdKarteGeupdatet( id ) )
  899. {
  900. char c = 2;
  901. klient->sendeEncrypted( &c, 1 );
  902. break;
  903. }
  904. Text pfad = ks->zIni()->zWert( "KartenPfad" )->getText();
  905. pfad += "/";
  906. pfad += id;
  907. pfad += "/client/beschreibung.ksgs";
  908. Datei d;
  909. d.setDatei( pfad );
  910. if( d.open( Datei::Style::lesen ) )
  911. klient->sendeEncrypted( "\1", 1 );
  912. else
  913. errorZuKlient( "Fehler beim lesen der Datei." );
  914. __int64 size = d.getSize();
  915. klient->sendeEncrypted( (char*)&size, 8 );
  916. char *buffer = new char[ 2048 ];
  917. while( size )
  918. {
  919. int l = size >= 2048 ? 2048 : (int)size;
  920. d.lese( buffer, l );
  921. klient->sende( buffer, l );
  922. size -= l;
  923. }
  924. delete[] buffer;
  925. d.close();
  926. }
  927. break;
  928. case 10: // Karte Minimap
  929. if( !klientNummer )
  930. {
  931. errorZuKlient( "Du bist nicht Identifiziert." );
  932. break;
  933. }
  934. else
  935. {
  936. klient->sendeEncrypted( "\1", 1 );
  937. int id = 0;
  938. klient->getNachrichtEncrypted( (char*)&id, 4 );
  939. if( !ks->zDB()->proveKarte( id, ks->getId() ) )
  940. {
  941. errorZuKlient( "Die Karte wurde nicht gefunden." );
  942. break;
  943. }
  944. if( ks->wirdKarteGeupdatet( id ) )
  945. {
  946. char c = 2;
  947. klient->sendeEncrypted( &c, 1 );
  948. break;
  949. }
  950. Text pfad = ks->zIni()->zWert( "KartenPfad" )->getText();
  951. pfad += "/";
  952. pfad += id;
  953. pfad += "/client/minimap.ltdb";
  954. Datei d;
  955. d.setDatei( pfad );
  956. if( d.open( Datei::Style::lesen ) )
  957. klient->sendeEncrypted( "\1", 1 );
  958. else
  959. errorZuKlient( "Fehler beim lesen der Datei." );
  960. __int64 size = d.getSize();
  961. klient->sendeEncrypted( (char*)&size, 8 );
  962. char *buffer = new char[ 2048 ];
  963. while( size )
  964. {
  965. int l = size >= 2048 ? 2048 : (int)size;
  966. d.lese( buffer, l );
  967. klient->sende( buffer, l );
  968. size -= l;
  969. }
  970. delete[] buffer;
  971. d.close();
  972. }
  973. break;
  974. case 11: // Karte Ladebild
  975. if( !klientNummer )
  976. {
  977. errorZuKlient( "Du bist nicht Identifiziert." );
  978. break;
  979. }
  980. else
  981. {
  982. klient->sendeEncrypted( "\1", 1 );
  983. int id = 0;
  984. klient->getNachrichtEncrypted( (char*)&id, 4 );
  985. if( !ks->zDB()->proveKarte( id, ks->getId() ) )
  986. {
  987. errorZuKlient( "Die Karte wurde nicht gefunden." );
  988. break;
  989. }
  990. if( ks->wirdKarteGeupdatet( id ) )
  991. {
  992. char c = 2;
  993. klient->sendeEncrypted( &c, 1 );
  994. break;
  995. }
  996. Text pfad = ks->zIni()->zWert( "KartenPfad" )->getText();
  997. pfad += "/";
  998. pfad += id;
  999. pfad += "/client/ladebild.ltdb";
  1000. Datei d;
  1001. d.setDatei( pfad );
  1002. if( d.open( Datei::Style::lesen ) )
  1003. klient->sendeEncrypted( "\1", 1 );
  1004. else
  1005. errorZuKlient( "Fehler beim lesen der Datei." );
  1006. __int64 size = d.getSize();
  1007. klient->sendeEncrypted( (char*)&size, 8 );
  1008. char *buffer = new char[ 2048 ];
  1009. while( size )
  1010. {
  1011. int l = size >= 2048 ? 2048 : (int)size;
  1012. d.lese( buffer, l );
  1013. klient->sende( buffer, l );
  1014. size -= l;
  1015. }
  1016. delete[] buffer;
  1017. d.close();
  1018. }
  1019. break;
  1020. default:
  1021. errorZuKlient( "Unbekannte Nachricht!" );
  1022. break;
  1023. }
  1024. if( br )
  1025. break;
  1026. ks->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1027. ks->addGesendet( klient->getUploadBytes( 1 ) );
  1028. }
  1029. }
  1030. ks->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1031. ks->addGesendet( klient->getUploadBytes( 1 ) );
  1032. ks->removeKlient( this ); // delete this
  1033. }
  1034. // constant
  1035. void KSKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  1036. {
  1037. klient->sendeEncrypted( "\3", 1 );
  1038. char len = (char)textLength( nachricht );
  1039. klient->sendeEncrypted( &len, 1 );
  1040. klient->sendeEncrypted( nachricht, len );
  1041. }
  1042. int KSKlient::getKlientNummer() const // gibt die KlientId zurück
  1043. {
  1044. return klientNummer;
  1045. }
  1046. // Reference Counting
  1047. KSKlient *KSKlient::getThis()
  1048. {
  1049. ref++;
  1050. return this;
  1051. }
  1052. KSKlient *KSKlient::release()
  1053. {
  1054. ref--;
  1055. if( !ref )
  1056. delete this;
  1057. return 0;
  1058. }