EditorServer.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930
  1. #include "EditorServer.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. // Inhalt der EditorServer Klasse aus EditorServer.h
  6. // Konstruktor
  7. EditorServer::EditorServer( InitDatei *zIni )
  8. : Thread()
  9. {
  10. Network::Start( 100 );
  11. std::cout << "EdS: Verbindung mit Datenbank wird hergestellt...\n";
  12. db = new EdSDatenbank( zIni );
  13. klientAnzahl = 0;
  14. klients = new RCArray< EdSKlient >();
  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 << "EdS: Starten des Admin Servers...\n";
  26. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  27. {
  28. std::cout << "EdS: 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. InitializeCriticalSection( &cs );
  35. ref = 1;
  36. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  37. {
  38. serverStarten();
  39. serverFortsetzen();
  40. }
  41. }
  42. // Destruktor
  43. EditorServer::~EditorServer()
  44. {
  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 EditorServer::runn()
  58. {
  59. while( !end && aServer->isConnected() )
  60. {
  61. SSLSKlient *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. continue;
  72. EdSAKlient *clHandle = new EdSAKlient( klient, getThis() );
  73. clHandle->start();
  74. }
  75. }
  76. void EditorServer::thread()
  77. {
  78. while( server->isConnected() )
  79. {
  80. SKlient *klient;
  81. klient = server->getKlient();
  82. if( !klient )
  83. continue;
  84. Framework::getThreadRegister()->cleanUpClosedThreads();
  85. EdSKlient *clHandle = new EdSKlient( klient, getThis() );
  86. EnterCriticalSection( &cs );
  87. klients->set( clHandle, klientAnzahl );
  88. klientAnzahl++;
  89. LeaveCriticalSection( &cs );
  90. clHandle->start();
  91. }
  92. }
  93. void EditorServer::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 EditorServer::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 EditorServer::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 EditorServer::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 EditorServer::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 EditorServer::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 EditorServer::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 EditorServer::removeKlient( EdSKlient *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 EditorServer::addGesendet( int bytes )
  233. {
  234. gesendet += bytes;
  235. }
  236. void EditorServer::addEmpfangen( int bytes )
  237. {
  238. empfangen += bytes;
  239. }
  240. // constant
  241. bool EditorServer::istAn() const
  242. {
  243. return db->serverIstNichtPausiert( id );
  244. }
  245. Server *EditorServer::zServer() const
  246. {
  247. return server;
  248. }
  249. EdSDatenbank *EditorServer::zDB() const
  250. {
  251. return db;
  252. }
  253. InitDatei *EditorServer::zIni() const
  254. {
  255. return ini;
  256. }
  257. bool EditorServer::hatClients() const
  258. {
  259. return klientAnzahl > 0;
  260. }
  261. int EditorServer::getId() const
  262. {
  263. return id;
  264. }
  265. char *EditorServer::getLetzterFehler() const
  266. {
  267. return fehler->getText();
  268. }
  269. // Reference Counting
  270. EditorServer *EditorServer::getThis()
  271. {
  272. ref++;
  273. return this;
  274. }
  275. EditorServer *EditorServer::release()
  276. {
  277. ref--;
  278. if( !ref )
  279. delete this;
  280. return 0;
  281. }
  282. // Inhalt der EdSAKlient Klasse aus EditorServer.h
  283. // Konstruktor
  284. EdSAKlient::EdSAKlient( SSLSKlient *klient, EditorServer *eds )
  285. : Thread()
  286. {
  287. this->klient = klient;
  288. name = new Text( "" );
  289. passwort = new Text( "" );
  290. adminId = 0;
  291. this->eds = eds;
  292. }
  293. // Destruktor
  294. EdSAKlient::~EdSAKlient()
  295. {
  296. klient->trenne();
  297. klient->release();
  298. eds->release();
  299. name->release();
  300. passwort->release();
  301. }
  302. // nicht constant
  303. void EdSAKlient::thread()
  304. {
  305. while( 1 )
  306. {
  307. char c = 0;
  308. if( !klient->getNachricht( &c, 1 ) )
  309. break;
  310. else
  311. {
  312. bool br = 0;
  313. switch( c )
  314. {
  315. case 1: // Login
  316. if( 1 )
  317. {
  318. klient->sende( "\1", 1 );
  319. unsigned char nLen = 0;
  320. klient->getNachricht( (char*)&nLen, 1 );
  321. char *n = new char[ nLen + 1 ];
  322. n[ (int)nLen ] = 0;
  323. if( nLen )
  324. klient->getNachricht( n, nLen );
  325. unsigned char pLen = 0;
  326. klient->getNachricht((char*)&pLen, 1 );
  327. char *p = new char[ pLen + 1 ];
  328. p[ (int)pLen ] = 0;
  329. if( pLen )
  330. klient->getNachricht( p, pLen );
  331. int adminId = eds->zDB()->istAdministrator( n, p );
  332. if( adminId )
  333. {
  334. klient->sende( "\1", 1 );
  335. name->setText( n );
  336. passwort->setText( p );
  337. this->adminId = adminId;
  338. }
  339. else
  340. errorZuKlient( "Falsche Kombination aus Name und Passwort." );
  341. delete[] n;
  342. delete[] p;
  343. }
  344. break;
  345. case 2: // Logout
  346. adminId = 0;
  347. name->setText( "" );
  348. passwort->setText( "" );
  349. klient->sende( "\1", 1 );
  350. break;
  351. case 3: // Trennen
  352. br = 1;
  353. klient->sende( "\1", 1 );
  354. break;
  355. case 4: // Server starten
  356. if( !adminId )
  357. errorZuKlient( "Du musst dich einloggen." );
  358. else
  359. {
  360. if( eds->zDB()->adminHatRecht( adminId, Admin_Recht::EdSStarten ) )
  361. {
  362. if( !eds->serverStarten() )
  363. {
  364. Text *err = new Text();
  365. err->append( eds->getLetzterFehler() );
  366. errorZuKlient( err->getText() );
  367. err->release();
  368. }
  369. else
  370. klient->sende( "\1", 1 );
  371. }
  372. else
  373. errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
  374. }
  375. break;
  376. case 5: // Server beenden
  377. if( !adminId )
  378. errorZuKlient( "Du musst dich einloggen." );
  379. else
  380. {
  381. if( eds->zDB()->adminHatRecht( adminId, Admin_Recht::EdSBeenden ) )
  382. {
  383. if( eds->serverBeenden() )
  384. klient->sende( "\1", 1 );
  385. else
  386. {
  387. Text *err = new Text();
  388. err->append( eds->getLetzterFehler() );
  389. errorZuKlient( err->getText() );
  390. err->release();
  391. }
  392. }
  393. else
  394. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  395. }
  396. break;
  397. case 6: // Programm Schließen
  398. if( !adminId )
  399. errorZuKlient( "Du musst dich einloggen." );
  400. else
  401. {
  402. bool ok = 0;
  403. if( eds->isRunning() )
  404. {
  405. if( eds->zDB()->adminHatRecht( adminId, Admin_Recht::EdSBeenden ) )
  406. {
  407. if( eds->serverBeenden() )
  408. ok = 1;
  409. else
  410. {
  411. Text *err = new Text();
  412. err->append( eds->getLetzterFehler() );
  413. errorZuKlient( err->getText() );
  414. err->release();
  415. }
  416. }
  417. else
  418. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  419. }
  420. else
  421. ok = 1;
  422. if( ok && eds->hatClients() )
  423. {
  424. errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
  425. break;
  426. }
  427. if( ok )
  428. {
  429. klient->sende( "\1", 1 );
  430. std::cout << "EdS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  431. eds->close();
  432. br = 1;
  433. }
  434. }
  435. break;
  436. case 7: // Progtamm abstürzen
  437. if( !adminId )
  438. errorZuKlient( "Du musst dich einloggen." );
  439. else
  440. {
  441. bool ok = 0;
  442. if( eds->isRunning() )
  443. {
  444. if( eds->zDB()->adminHatRecht( adminId, Admin_Recht::EdSBeenden ) )
  445. {
  446. eds->serverBeenden();
  447. ok = 1;
  448. }
  449. else
  450. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  451. }
  452. else
  453. ok = 1;
  454. if( ok )
  455. {
  456. klient->sende( "\1", 1 );
  457. std::cout << "EdS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  458. eds->close();
  459. br = 1;
  460. }
  461. }
  462. break;
  463. case 8: // Status Frage
  464. if( 1 )
  465. {
  466. char status = 0;
  467. if( eds->isRunning() )
  468. {
  469. status = 1;
  470. if( eds->istAn() )
  471. status = 2;
  472. }
  473. klient->sende( "\1", 1 );
  474. klient->sende( &status, 1 );
  475. }
  476. break;
  477. case 9: // Server pausieren
  478. if( !adminId )
  479. errorZuKlient( "Du musst dich einloggen." );
  480. else
  481. {
  482. klient->sende( "\1", 1 );
  483. char pause = 0;
  484. klient->getNachricht( &pause, 1 );
  485. if( eds->zDB()->adminHatRecht( adminId, Admin_Recht::EdSPausieren ) )
  486. {
  487. bool ok = 0;
  488. if( pause )
  489. ok = eds->serverPause();
  490. else
  491. ok = eds->serverFortsetzen();
  492. if( ok )
  493. klient->sende( "\1", 1 );
  494. else
  495. {
  496. Text *err = new Text();
  497. err->append( eds->getLetzterFehler() );
  498. errorZuKlient( err->getText() );
  499. err->release();
  500. }
  501. }
  502. else
  503. {
  504. if( pause )
  505. errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
  506. else
  507. errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
  508. }
  509. }
  510. break;
  511. case 0xA: // maximale Anzahl der Clients setzen
  512. if( !adminId )
  513. errorZuKlient( "Du musst dich einloggen." );
  514. else
  515. {
  516. klient->sende( "\1", 1 );
  517. int maxK = 0;
  518. klient->getNachricht( (char*)&maxK, 4 );
  519. if( eds->zDB()->adminHatRecht( adminId, Admin_Recht::EdSMKChange ) )
  520. {
  521. if( eds->setMaxKarten( maxK ) )
  522. klient->sende( "\1", 1 );
  523. else
  524. {
  525. Text *err = new Text();
  526. err->append( eds->getLetzterFehler() );
  527. errorZuKlient( err->getText() );
  528. err->release();
  529. }
  530. }
  531. else
  532. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Karten zu verändern." );
  533. }
  534. break;
  535. case 0xC: // klient absturtz
  536. if( 1 )
  537. {
  538. klient->sende( "\1", 1 );
  539. int klientId = 0;
  540. klient->getNachricht( (char*)&klientId, 4 );
  541. if( klientId && eds->absturzKlient( klientId ) )
  542. klient->sende( "\1", 1 );
  543. else
  544. klient->sende( "\0", 1 );
  545. }
  546. break;
  547. default:
  548. errorZuKlient( "Unbekannte Nachricht!" );
  549. break;
  550. }
  551. if( br )
  552. break;
  553. eds->addEmpfangen( klient->getDownloadBytes( 1 ) );
  554. eds->addGesendet( klient->getUploadBytes( 1 ) );
  555. }
  556. }
  557. eds->addEmpfangen( klient->getDownloadBytes( 1 ) );
  558. eds->addGesendet( klient->getUploadBytes( 1 ) );
  559. delete this;
  560. }
  561. void EdSAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  562. {
  563. klient->sende( "\3", 1 );
  564. char len = (char)textLength( nachricht );
  565. klient->sende( &len, 1 );
  566. klient->sende( nachricht, len );
  567. }
  568. // Inhalt der EdSKlient aus EditorServer.h
  569. // Konstruktor
  570. EdSKlient::EdSKlient( SKlient *klient, EditorServer *eds )
  571. : Thread()
  572. {
  573. this->klient = klient;
  574. unsigned char key[ 20 ] = { 55, 124, 19, 204, 23, 5, 59, 75, 247, 138, 119, 111, 57, 250, 206, 187, 165, 6, 247, 151 };
  575. klient->setSendeKey( (char*)key, 20 );
  576. klient->setEmpfangKey( (char*)key, 20 );
  577. klientNummer = 0;
  578. this->eds = eds;
  579. ked = 0;
  580. ref = 1;
  581. }
  582. // Destruktor
  583. EdSKlient::~EdSKlient()
  584. {
  585. if( ked )
  586. ked->release();
  587. klient->release();
  588. eds->release();
  589. }
  590. // nicht constant
  591. void EdSKlient::absturz()
  592. {
  593. ende();
  594. klient->trenne();
  595. eds->zDB()->unregisterKlient( klientNummer, eds->getId() );
  596. }
  597. void EdSKlient::thread()
  598. {
  599. while( 1 )
  600. {
  601. char c = 0;
  602. if( !klient->getNachrichtEncrypted( &c, 1 ) )
  603. break;
  604. else
  605. {
  606. bool br = 0;
  607. switch( c )
  608. {
  609. case 1: // Klient identifikation
  610. klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
  611. if( !eds->zDB()->proveKlient( klientNummer, eds->getId() ) )
  612. {
  613. klientNummer = 0;
  614. errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
  615. }
  616. else
  617. {
  618. Text *key = eds->zDB()->getKlientKey( klientNummer );
  619. if( !key )
  620. errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
  621. else
  622. {
  623. klient->sendeEncrypted( "\1", 1 );
  624. klient->setEmpfangKey( *key, key->getLength() );
  625. klient->setSendeKey( *key, key->getLength() );
  626. key->release();
  627. }
  628. }
  629. break;
  630. case 2: // Main / Erhaltung Server message
  631. if( 1 )
  632. {
  633. char befehl = 0;
  634. klient->getNachrichtEncrypted( &befehl, 1 );
  635. switch( befehl )
  636. {
  637. case 2: // klient absturtz
  638. if( 1 )
  639. {
  640. int klientId = 0;
  641. klient->getNachrichtEncrypted( (char*)&klientId, 4 );
  642. if( klientId && eds->absturzKlient( klientId ) )
  643. klient->sendeEncrypted( "\1", 1 );
  644. else
  645. klient->sendeEncrypted( "\0", 1 );
  646. }
  647. break;
  648. default:
  649. errorZuKlient( "Befehl nicht bekannt!" );
  650. break;
  651. }
  652. }
  653. break;
  654. case 3: // Verbindungsende
  655. br = 1;
  656. klient->sendeEncrypted( "\1", 1 );
  657. break;
  658. case 4: // unregister Klient
  659. if( !klientNummer )
  660. {
  661. errorZuKlient( "Du bist nicht Identifiziert." );
  662. break;
  663. }
  664. eds->zDB()->unregisterKlient( klientNummer, eds->getId() );
  665. klient->sendeEncrypted( "\1", 1 );
  666. break;
  667. case 5: // keep alive
  668. if( !klientNummer )
  669. {
  670. errorZuKlient( "Du bist nicht Identifiziert." );
  671. break;
  672. }
  673. klient->sendeEncrypted( "\1", 1 );
  674. break;
  675. case 6: // lade Karte
  676. if( !klientNummer )
  677. {
  678. errorZuKlient( "Du bist nicht Identifiziert." );
  679. break;
  680. }
  681. else
  682. {
  683. klient->sendeEncrypted( "\1", 1 );
  684. int karteId = 0;
  685. klient->getNachrichtEncrypted( (char*)&karteId, 4 );
  686. if( eds->zDB()->proveKarte( karteId, klientNummer, eds->getId() ) )
  687. {
  688. if( ked )
  689. ked->release();
  690. ked = new KarteEditor( karteId, eds->zDB()->getThis(), eds->zIni()->zWert( "KartenPfad" )->getText(), eds->zIni() );
  691. if( ked->istOk() )
  692. klient->sendeEncrypted( "\1", 1 );
  693. else
  694. {
  695. errorZuKlient( ked->getLetzterFehler() );
  696. ked = ked->release();
  697. }
  698. }
  699. else
  700. errorZuKlient( "Du kannst diese Karte nicht bearbeiten." );
  701. }
  702. break;
  703. case 7: // Nachricht
  704. if( !klientNummer )
  705. {
  706. errorZuKlient( "Du bist nicht Identifiziert." );
  707. break;
  708. }
  709. else
  710. {
  711. if( !ked || !ked->istOk() )
  712. errorZuKlient( "Es wurde keine Karte geladen." );
  713. else
  714. {
  715. klient->sendeEncrypted( "\1", 1 );
  716. if( !ked->prozessMessage( klient ) )
  717. errorZuKlient( ked->getLetzterFehler() );
  718. ked->removeError();
  719. }
  720. }
  721. break;
  722. case 8: // Shop Seite herunterladen (Vom Shop Server)
  723. if( klientNummer )
  724. {
  725. errorZuKlient( "Du bist nicht berechtigt." );
  726. break;
  727. }
  728. else
  729. {
  730. klient->sendeEncrypted( "\1", 1 );
  731. int id = 0;
  732. klient->getNachrichtEncrypted( (char*)&id, 4 );
  733. if( ked )
  734. ked->release();
  735. ked = new KarteEditor( id, eds->zDB()->getThis(), eds->zIni()->zWert( "KartenPfad" )->getText(), eds->zIni() );
  736. if( !ked->istOk() )
  737. {
  738. errorZuKlient( "Die Karte konnte nicht geladen werden." );
  739. ked = ked->release();
  740. break;
  741. }
  742. klient->sendeEncrypted( "\1", 1 );
  743. RCArray< Text > *list = new RCArray< Text >();
  744. int anz = ked->getDateiUpdateListe( ( char* )"shop", list );
  745. klient->sendeEncrypted( (char*)&anz, 4 );
  746. for( int i = 0; i < anz; i++ )
  747. {
  748. Text p = list->z( i )->getText();
  749. char l = (char)p.getLength();
  750. klient->sendeEncrypted( &l, 1 );
  751. klient->sendeEncrypted( p, l );
  752. Text tmp = ked->getPfad();
  753. tmp += "/live/shop";
  754. p.insert( 0, (char*)tmp );
  755. Datei d;
  756. d.setDatei( p );
  757. __int64 size = d.getSize();
  758. klient->sendeEncrypted( (char*)&size, 8 );
  759. d.open( Datei::Style::lesen );
  760. char *buffer = new char[ 2048 ];
  761. while( size )
  762. {
  763. int l = size > 2048 ? 2048 : (int)size;
  764. d.lese( buffer, l );
  765. klient->sende( buffer, l );
  766. size -= l;
  767. }
  768. delete[] buffer;
  769. d.close();
  770. }
  771. list->release();
  772. if( ked )
  773. ked = ked->release();
  774. }
  775. break;
  776. case 9: // Karte Update herunterladen (Vom Karten Server)
  777. if( klientNummer )
  778. {
  779. errorZuKlient( "Du bist nicht berechtigt." );
  780. break;
  781. }
  782. else
  783. {
  784. klient->sendeEncrypted( "\1", 1 );
  785. int id = 0;
  786. klient->getNachrichtEncrypted( (char*)&id, 4 );
  787. if( ked )
  788. ked->release();
  789. ked = new KarteEditor( id, eds->zDB()->getThis(), eds->zIni()->zWert( "KartenPfad" )->getText(), eds->zIni() );
  790. if( !ked->istOk() )
  791. {
  792. errorZuKlient( "Die Karte konnte nicht geladen werden." );
  793. ked = ked->release();
  794. break;
  795. }
  796. klient->sendeEncrypted( "\1", 1 );
  797. RCArray< Text > *list = new RCArray< Text >();
  798. int anz = ked->getDateiUpdateListe( ( char* )"map", list );
  799. klient->sendeEncrypted( (char*)&anz, 4 );
  800. for( int i = 0; i < anz; i++ )
  801. {
  802. Text p = list->z( i )->getText();
  803. char l = (char)p.getLength();
  804. klient->sendeEncrypted( &l, 1 );
  805. klient->sendeEncrypted( p, l );
  806. Text tmp = ked->getPfad();
  807. tmp += "/live/map";
  808. p.insert( 0, (char*)tmp );
  809. Datei d;
  810. d.setDatei( p );
  811. __int64 size = d.getSize();
  812. klient->sendeEncrypted( (char*)&size, 8 );
  813. d.open( Datei::Style::lesen );
  814. char *buffer = new char[ 2048 ];
  815. while( size )
  816. {
  817. int l = size > 2048 ? 2048 : (int)size;
  818. d.lese( buffer, l );
  819. klient->sende( buffer, l );
  820. size -= l;
  821. }
  822. delete[] buffer;
  823. d.close();
  824. }
  825. list->release();
  826. if( ked )
  827. ked = ked->release();
  828. }
  829. break;
  830. case 10: // Neue Karte erstellen
  831. {
  832. if( !klientNummer )
  833. {
  834. errorZuKlient( "Du bist nicht Identifiziert." );
  835. break;
  836. }
  837. else
  838. {
  839. klient->sendeEncrypted( "\1", 1 );
  840. unsigned char l = 0;
  841. klient->getNachrichtEncrypted((char*)&l, 1 );
  842. char *n = new char[ l + 1 ];
  843. n[ (int)l ] = 0;
  844. klient->getNachrichtEncrypted( n, l );
  845. int spielArt = 0;
  846. klient->getNachrichtEncrypted( (char*)&spielArt, 4 );
  847. if( eds->zDB()->karteErstellen( n, spielArt, klientNummer ) )
  848. klient->sendeEncrypted( "\1", 1 );
  849. else
  850. errorZuKlient( "Für dieses Spiel kann momentan keine Karte erstellt werden." );
  851. delete[] n;
  852. }
  853. break;
  854. }
  855. default:
  856. errorZuKlient( "Unbekannte Nachricht!" );
  857. break;
  858. }
  859. if( br )
  860. break;
  861. eds->addEmpfangen( klient->getDownloadBytes( 1 ) );
  862. eds->addGesendet( klient->getUploadBytes( 1 ) );
  863. }
  864. }
  865. eds->addEmpfangen( klient->getDownloadBytes( 1 ) );
  866. eds->addGesendet( klient->getUploadBytes( 1 ) );
  867. eds->removeKlient( this ); // delete this
  868. }
  869. // constant
  870. void EdSKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  871. {
  872. klient->sendeEncrypted( "\3", 1 );
  873. unsigned char len = (unsigned char)textLength( nachricht );
  874. klient->sendeEncrypted( (char*)&len, 1 );
  875. klient->sendeEncrypted( nachricht, len );
  876. }
  877. int EdSKlient::getKlientNummer() const // gibt die KlientId zurück
  878. {
  879. return klientNummer;
  880. }
  881. // Reference Counting
  882. EdSKlient *EdSKlient::getThis()
  883. {
  884. ref++;
  885. return this;
  886. }
  887. EdSKlient *EdSKlient::release()
  888. {
  889. ref--;
  890. if( !ref )
  891. delete this;
  892. return 0;
  893. }