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 Server();
  22. std::cout << "EdS: Starten des Admin Servers...\n";
  23. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  24. {
  25. std::cout << "EdS: 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. InitializeCriticalSection( &cs );
  32. ref = 1;
  33. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  34. {
  35. serverStarten();
  36. serverFortsetzen();
  37. }
  38. }
  39. // Destruktor
  40. EditorServer::~EditorServer()
  41. {
  42. fehler->release();
  43. server->trenne();
  44. server->release();
  45. aServer->trenne();
  46. aServer->release();
  47. if( klients )
  48. klients->release();
  49. ini->release();
  50. db->release();
  51. DeleteCriticalSection( &cs );
  52. }
  53. // nicht constant
  54. void EditorServer::runn()
  55. {
  56. while( !end )
  57. {
  58. SKlient *klient;
  59. klient = aServer->getKlient();
  60. if( end && klient )
  61. {
  62. klient->trenne();
  63. klient = klient->release();
  64. Sleep( 1000 );
  65. return;
  66. }
  67. if( !klient )
  68. return;
  69. EdSAKlient *clHandle = new EdSAKlient( klient, getThis() );
  70. clHandle->start();
  71. }
  72. }
  73. void EditorServer::thread()
  74. {
  75. while( 1 )
  76. {
  77. SKlient *klient;
  78. klient = server->getKlient();
  79. if( !klient )
  80. break;
  81. Framework::getThreadRegister()->cleanUpClosedThreads();
  82. EdSKlient *clHandle = new EdSKlient( klient, getThis() );
  83. EnterCriticalSection( &cs );
  84. klients->set( clHandle, klientAnzahl );
  85. klientAnzahl++;
  86. LeaveCriticalSection( &cs );
  87. clHandle->start();
  88. }
  89. }
  90. void EditorServer::close()
  91. {
  92. db->setServerStatus( id, 1 );
  93. server->trenne();
  94. #ifdef WIN32
  95. warteAufThread( 1000 );
  96. #endif
  97. EnterCriticalSection( &cs );
  98. for( int i = 0; i < klientAnzahl; i++ )
  99. klients->z( i )->absturz();
  100. klients = klients->release();
  101. klientAnzahl = 0;
  102. LeaveCriticalSection( &cs );
  103. ende();
  104. run = 0;
  105. end = 1;
  106. Klient *klient = new Klient();
  107. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  108. Sleep( 500 );
  109. aServer->trenne();
  110. klient->release();
  111. }
  112. bool EditorServer::serverStarten()
  113. {
  114. if( nichtPausiert )
  115. {
  116. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  117. return 0;
  118. }
  119. if( server )
  120. server->release();
  121. server = new Server();
  122. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  123. {
  124. nichtPausiert = 1;
  125. start();
  126. return 1;
  127. }
  128. else
  129. {
  130. serverBeenden();
  131. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  132. return 0;
  133. }
  134. }
  135. bool EditorServer::serverPause()
  136. {
  137. if( !nichtPausiert )
  138. {
  139. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  140. return 0;
  141. }
  142. if( !db->setServerStatus( id, 2 ) )
  143. {
  144. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  145. fehler->append( db->getLetzterFehler() );
  146. return 0;
  147. }
  148. return 1;
  149. }
  150. bool EditorServer::serverFortsetzen()
  151. {
  152. if( !nichtPausiert )
  153. {
  154. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  155. return 0;
  156. }
  157. if( !db->setServerStatus( id, 3 ) )
  158. {
  159. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  160. fehler->append( db->getLetzterFehler() );
  161. return 0;
  162. }
  163. return 1;
  164. }
  165. bool EditorServer::serverBeenden()
  166. {
  167. if( !nichtPausiert )
  168. {
  169. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  170. return 0;
  171. }
  172. if( db->serverIstNichtPausiert( id ) )
  173. {
  174. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  175. return 0;
  176. }
  177. nichtPausiert = 0;
  178. ende();
  179. if( server )
  180. server->trenne();
  181. return 1;
  182. }
  183. bool EditorServer::setMaxKarten( int mk )
  184. {
  185. if( !db->setMaxKarten( id, mk ) )
  186. {
  187. fehler->setText( "Die maximale Anzahl der Karten konnte nicht gesetzt werden:\n" );
  188. fehler->append( db->getLetzterFehler() );
  189. return 0;
  190. }
  191. ini->setWert( "MaxKarten", Text() += mk );
  192. return 1;
  193. }
  194. bool EditorServer::absturzKlient( int klientId )
  195. {
  196. bool gefunden = 0;
  197. EnterCriticalSection( &cs );
  198. for( int i = 0; i < klientAnzahl; i++ )
  199. {
  200. if( klients->z( i )->getKlientNummer() == klientId )
  201. {
  202. klients->z( i )->absturz();
  203. klients->remove( i );
  204. klientAnzahl--;
  205. gefunden = 1;
  206. break;
  207. }
  208. }
  209. LeaveCriticalSection( &cs );
  210. return gefunden;
  211. }
  212. bool EditorServer::removeKlient( EdSKlient *zKlient )
  213. {
  214. bool gefunden = 0;
  215. EnterCriticalSection( &cs );
  216. for( int i = 0; i < klientAnzahl; i++ )
  217. {
  218. if( klients->z( i ) == zKlient )
  219. {
  220. klients->remove( i );
  221. klientAnzahl--;
  222. gefunden = 1;
  223. break;
  224. }
  225. }
  226. LeaveCriticalSection( &cs );
  227. return gefunden;
  228. }
  229. void EditorServer::addGesendet( int bytes )
  230. {
  231. gesendet += bytes;
  232. }
  233. void EditorServer::addEmpfangen( int bytes )
  234. {
  235. empfangen += bytes;
  236. }
  237. // constant
  238. bool EditorServer::istAn() const
  239. {
  240. return db->serverIstNichtPausiert( id );
  241. }
  242. Server *EditorServer::zServer() const
  243. {
  244. return server;
  245. }
  246. EdSDatenbank *EditorServer::zDB() const
  247. {
  248. return db;
  249. }
  250. InitDatei *EditorServer::zIni() const
  251. {
  252. return ini;
  253. }
  254. bool EditorServer::hatClients() const
  255. {
  256. return klientAnzahl > 0;
  257. }
  258. int EditorServer::getId() const
  259. {
  260. return id;
  261. }
  262. char *EditorServer::getLetzterFehler() const
  263. {
  264. return fehler->getText();
  265. }
  266. // Reference Counting
  267. EditorServer *EditorServer::getThis()
  268. {
  269. ref++;
  270. return this;
  271. }
  272. EditorServer *EditorServer::release()
  273. {
  274. ref--;
  275. if( !ref )
  276. delete this;
  277. return 0;
  278. }
  279. // Inhalt der EdSAKlient Klasse aus EditorServer.h
  280. // Konstruktor
  281. EdSAKlient::EdSAKlient( SKlient *klient, EditorServer *eds )
  282. : Thread()
  283. {
  284. this->klient = klient;
  285. unsigned char key[ 20 ] = { 102, 98, 8, 248, 114, 86, 30, 28, 18, 142, 113, 108, 129, 101, 196, 53, 37, 184, 73, 108 };
  286. klient->setSendeKey( (char*)key, 20 );
  287. klient->setEmpfangKey( (char*)key, 20 );
  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->getNachrichtEncrypted( &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->sendeEncrypted( "\1", 1 );
  319. unsigned char nLen = 0;
  320. klient->getNachrichtEncrypted( (char*)&nLen, 1 );
  321. char *n = new char[ nLen + 1 ];
  322. n[ (int)nLen ] = 0;
  323. if( nLen )
  324. klient->getNachrichtEncrypted( n, nLen );
  325. unsigned char pLen = 0;
  326. klient->getNachrichtEncrypted((char*)&pLen, 1 );
  327. char *p = new char[ pLen + 1 ];
  328. p[ (int)pLen ] = 0;
  329. if( pLen )
  330. klient->getNachrichtEncrypted( p, pLen );
  331. int adminId = eds->zDB()->istAdministrator( n, p );
  332. if( adminId )
  333. {
  334. klient->sendeEncrypted( "\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->sendeEncrypted( "\1", 1 );
  350. break;
  351. case 3: // Trennen
  352. br = 1;
  353. klient->sendeEncrypted( "\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->sendeEncrypted( "\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->sendeEncrypted( "\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->sendeEncrypted( "\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->sendeEncrypted( "\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->sendeEncrypted( "\1", 1 );
  474. klient->sendeEncrypted( &status, 1 );
  475. }
  476. break;
  477. case 9: // Server pausieren
  478. if( !adminId )
  479. errorZuKlient( "Du musst dich einloggen." );
  480. else
  481. {
  482. klient->sendeEncrypted( "\1", 1 );
  483. char pause = 0;
  484. klient->getNachrichtEncrypted( &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->sendeEncrypted( "\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->sendeEncrypted( "\1", 1 );
  517. int maxK = 0;
  518. klient->getNachrichtEncrypted( (char*)&maxK, 4 );
  519. if( eds->zDB()->adminHatRecht( adminId, Admin_Recht::EdSMKChange ) )
  520. {
  521. if( eds->setMaxKarten( maxK ) )
  522. klient->sendeEncrypted( "\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->sendeEncrypted( "\1", 1 );
  539. int klientId = 0;
  540. klient->getNachrichtEncrypted( (char*)&klientId, 4 );
  541. if( klientId && eds->absturzKlient( klientId ) )
  542. klient->sendeEncrypted( "\1", 1 );
  543. else
  544. klient->sendeEncrypted( "\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->sendeEncrypted( "\3", 1 );
  564. char len = (char)textLength( nachricht );
  565. klient->sendeEncrypted( &len, 1 );
  566. klient->sendeEncrypted( 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. char len = (char)textLength( nachricht );
  874. klient->sendeEncrypted( &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. }