EditorServer.cpp 30 KB

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