KartenServer.cpp 35 KB

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