AnmeldungServer.cpp 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788
  1. #include "AnmeldungServer.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. // Inhalt der AnmeldungServer Klasse aus AnmeldungServer.h
  6. // Konstruktor
  7. AnmeldungServer::AnmeldungServer( InitDatei *zIni )
  8. : Thread()
  9. {
  10. Network::Start( 100 );
  11. std::cout << "AS: Verbindung mit Datenbank wird hergestellt...\n";
  12. db = new ASDatenbank( zIni );
  13. klientAnzahl = 0;
  14. klients = new RCArray< ASKlient >();
  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 << "AS: Starten des Admin Servers...\n";
  23. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  24. {
  25. std::cout << "AS: 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. AnmeldungServer::~AnmeldungServer()
  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 AnmeldungServer::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. ASAKlient *clHandle = new ASAKlient( klient, getThis() );
  70. clHandle->start();
  71. }
  72. }
  73. void AnmeldungServer::thread()
  74. {
  75. while( 1 )
  76. {
  77. SKlient *klient;
  78. klient = server->getKlient();
  79. if( !klient )
  80. break;
  81. Framework::getThreadRegister()->cleanUpClosedThreads();
  82. ASKlient *clHandle = new ASKlient( klient, getThis() );
  83. EnterCriticalSection( &cs );
  84. klients->set( clHandle, klientAnzahl );
  85. klientAnzahl++;
  86. LeaveCriticalSection( &cs );
  87. clHandle->start();
  88. }
  89. }
  90. void AnmeldungServer::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 AnmeldungServer::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 AnmeldungServer::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 AnmeldungServer::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 AnmeldungServer::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 AnmeldungServer::setMaxKlients( int mc )
  184. {
  185. if( !db->setMaxClients( id, mc ) )
  186. {
  187. fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
  188. fehler->append( db->getLetzterFehler() );
  189. return 0;
  190. }
  191. return 1;
  192. }
  193. bool AnmeldungServer::absturzKlient( int klientId )
  194. {
  195. bool gefunden = 0;
  196. EnterCriticalSection( &cs );
  197. for( int i = 0; i < klientAnzahl; i++ )
  198. {
  199. if( klients->z( i )->getKlientNummer() == klientId )
  200. {
  201. klients->z( i )->absturz();
  202. klients->remove( i );
  203. klientAnzahl--;
  204. gefunden = 1;
  205. break;
  206. }
  207. }
  208. LeaveCriticalSection( &cs );
  209. return gefunden;
  210. }
  211. bool AnmeldungServer::removeKlient( ASKlient *zKlient )
  212. {
  213. bool gefunden = 0;
  214. EnterCriticalSection( &cs );
  215. for( int i = 0; i < klientAnzahl; i++ )
  216. {
  217. if( klients->z( i ) == zKlient )
  218. {
  219. klients->remove( i );
  220. klientAnzahl--;
  221. gefunden = 1;
  222. break;
  223. }
  224. }
  225. LeaveCriticalSection( &cs );
  226. return gefunden;
  227. }
  228. void AnmeldungServer::addGesendet( int bytes )
  229. {
  230. gesendet += bytes;
  231. }
  232. void AnmeldungServer::addEmpfangen( int bytes )
  233. {
  234. empfangen += bytes;
  235. }
  236. // constant
  237. bool AnmeldungServer::istAn() const
  238. {
  239. return db->serverIstNichtPausiert( id );
  240. }
  241. Server *AnmeldungServer::zServer() const
  242. {
  243. return server;
  244. }
  245. ASDatenbank *AnmeldungServer::zDB() const
  246. {
  247. return db;
  248. }
  249. bool AnmeldungServer::hatClients() const
  250. {
  251. return klientAnzahl > 0;
  252. }
  253. int AnmeldungServer::getId() const
  254. {
  255. return id;
  256. }
  257. char *AnmeldungServer::getLetzterFehler() const
  258. {
  259. return fehler->getText();
  260. }
  261. char *AnmeldungServer::getIp() const
  262. {
  263. return ini->zWert( "ServerIP" )->getText();
  264. }
  265. // Reference Counting
  266. AnmeldungServer *AnmeldungServer::getThis()
  267. {
  268. ref++;
  269. return this;
  270. }
  271. AnmeldungServer *AnmeldungServer::release()
  272. {
  273. ref--;
  274. if( !ref )
  275. delete this;
  276. return 0;
  277. }
  278. // Inhalt der ASAKlient Klasse aus AnmeldungServer.h
  279. // Konstruktor
  280. ASAKlient::ASAKlient( SKlient *klient, AnmeldungServer *as )
  281. : Thread()
  282. {
  283. this->klient = klient;
  284. unsigned char key[ 20 ] = { 208, 28, 97, 9, 169, 209, 137, 159, 123, 216, 202, 244, 86, 78, 172, 35, 26, 180, 113, 47 };
  285. klient->setSendeKey( (char*)key, 20 );
  286. klient->setEmpfangKey( (char*)key, 20 );
  287. name = new Text( "" );
  288. passwort = new Text( "" );
  289. adminId = 0;
  290. version = 0;
  291. this->as = as;
  292. }
  293. // Destruktor
  294. ASAKlient::~ASAKlient()
  295. {
  296. klient->trenne();
  297. klient->release();
  298. as->release();
  299. name->release();
  300. passwort->release();
  301. }
  302. // nicht constant
  303. void ASAKlient::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. char nLen = 0;
  320. klient->getNachrichtEncrypted( &nLen, 1 );
  321. char *n = new char[ nLen + 1 ];
  322. n[ (int)nLen ] = 0;
  323. if( nLen )
  324. klient->getNachrichtEncrypted( n, nLen );
  325. char pLen = 0;
  326. klient->getNachrichtEncrypted( &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 = as->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( as->zDB()->adminHatRecht( adminId, Admin_Recht::ASStarten ) )
  361. {
  362. if( !as->serverStarten() )
  363. {
  364. Text *err = new Text();
  365. err->append( as->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( as->zDB()->adminHatRecht( adminId, Admin_Recht::ASBeenden ) )
  382. {
  383. if( as->serverBeenden() )
  384. klient->sendeEncrypted( "\1", 1 );
  385. else
  386. {
  387. Text *err = new Text();
  388. err->append( as->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( as->isRunning() )
  404. {
  405. if( as->zDB()->adminHatRecht( adminId, Admin_Recht::ASBeenden ) )
  406. {
  407. if( as->serverBeenden() )
  408. ok = 1;
  409. else
  410. {
  411. Text *err = new Text();
  412. err->append( as->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 && as->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 << "AS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  431. as->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( as->isRunning() )
  443. {
  444. if( as->zDB()->adminHatRecht( adminId, Admin_Recht::ASBeenden ) )
  445. {
  446. as->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 << "AS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  458. as->close();
  459. br = 1;
  460. }
  461. }
  462. break;
  463. case 8: // Status Frage
  464. if( 1 )
  465. {
  466. char status = 0;
  467. if( as->isRunning() )
  468. {
  469. status = 1;
  470. if( as->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( as->zDB()->adminHatRecht( adminId, Admin_Recht::ASPausieren ) )
  486. {
  487. bool ok = 0;
  488. if( pause )
  489. ok = as->serverPause();
  490. else
  491. ok = as->serverFortsetzen();
  492. if( ok )
  493. klient->sendeEncrypted( "\1", 1 );
  494. else
  495. {
  496. Text *err = new Text();
  497. err->append( as->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 maxC = 0;
  518. klient->getNachrichtEncrypted( (char*)&maxC, 4 );
  519. if( as->zDB()->adminHatRecht( adminId, Admin_Recht::ASMCChange ) )
  520. {
  521. if( as->setMaxKlients( maxC ) )
  522. klient->sendeEncrypted( "\1", 1 );
  523. else
  524. {
  525. Text *err = new Text();
  526. err->append( as->getLetzterFehler() );
  527. errorZuKlient( err->getText() );
  528. err->release();
  529. }
  530. }
  531. else
  532. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Clients 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 && as->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. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  554. as->addGesendet( klient->getUploadBytes( 1 ) );
  555. }
  556. }
  557. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  558. as->addGesendet( klient->getUploadBytes( 1 ) );
  559. delete this;
  560. }
  561. void ASAKlient::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 ASKlient aus AnmeldungServer.h
  569. // Konstruktor
  570. ASKlient::ASKlient( SKlient *klient, AnmeldungServer *as )
  571. : Thread()
  572. {
  573. this->klient = klient;
  574. unsigned char key[ 20 ] = { 158, 10, 37, 155, 117, 58, 28, 197, 132, 76, 252, 83, 84, 222, 11, 125, 240, 218, 25, 201 };
  575. klient->setSendeKey( (char*)key, 20 );
  576. klient->setEmpfangKey( (char*)key, 20 );
  577. klientNummer = 0;
  578. this->as = as;
  579. accountId = 0;
  580. ref = 1;
  581. }
  582. // Destruktor
  583. ASKlient::~ASKlient()
  584. {
  585. klient->release();
  586. as->release();
  587. }
  588. // nicht constant
  589. void ASKlient::absturz()
  590. {
  591. ende();
  592. klient->trenne();
  593. as->zDB()->unregisterKlient( klientNummer, as->getId() );
  594. }
  595. void ASKlient::thread()
  596. {
  597. while( 1 )
  598. {
  599. char c = 0;
  600. if( !klient->getNachrichtEncrypted( &c, 1 ) )
  601. break;
  602. else
  603. {
  604. bool br = 0;
  605. switch( c )
  606. {
  607. case 1: // Klient identifikation
  608. klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
  609. if( !as->zDB()->proveKlient( klientNummer, as->getId() ) )
  610. {
  611. klientNummer = 0;
  612. errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
  613. }
  614. else
  615. {
  616. accountId = as->zDB()->getAccountId( klientNummer );
  617. if( accountId )
  618. {
  619. Text *key = as->zDB()->getKlientKey( klientNummer );
  620. if( !key )
  621. errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
  622. else
  623. {
  624. klient->sendeEncrypted( "\1", 1 );
  625. klient->setEmpfangKey( *key, key->getLength() );
  626. klient->setSendeKey( *key, key->getLength() );
  627. key->release();
  628. }
  629. }
  630. else
  631. {
  632. klientNummer = 0;
  633. errorZuKlient( "Du bist nicht eingeloggt." );
  634. }
  635. }
  636. break;
  637. case 2: // Main / Erhaltung Server message
  638. if( 1 )
  639. {
  640. char befehl = 0;
  641. klient->getNachrichtEncrypted( &befehl, 1 );
  642. switch( befehl )
  643. {
  644. case 2: // klient absturtz
  645. if( 1 )
  646. {
  647. int klientId = 0;
  648. klient->getNachrichtEncrypted( (char*)&klientId, 4 );
  649. if( klientId && as->absturzKlient( klientId ) )
  650. klient->sendeEncrypted( "\1", 1 );
  651. else
  652. klient->sendeEncrypted( "\0", 1 );
  653. }
  654. break;
  655. default:
  656. errorZuKlient( "Befehl nicht bekannt!" );
  657. break;
  658. }
  659. }
  660. break;
  661. case 3: // Verbindungsende
  662. br = 1;
  663. klient->sendeEncrypted( "\1", 1 );
  664. break;
  665. case 4: // unregister Klient
  666. if( !klientNummer )
  667. {
  668. errorZuKlient( "Du bist nicht Identifiziert." );
  669. break;
  670. }
  671. as->zDB()->unregisterKlient( klientNummer, as->getId() );
  672. klient->sendeEncrypted( "\1", 1 );
  673. break;
  674. case 5: // gruppe erstellen
  675. if( 1 )
  676. {
  677. if( !klientNummer )
  678. {
  679. errorZuKlient( "Du bist nicht Identifiziert." );
  680. break;
  681. }
  682. klient->sendeEncrypted( "\1", 1 );
  683. int karteId = 0;
  684. klient->getNachrichtEncrypted( (char*)&karteId, 4 );
  685. int gruppeId = 0;
  686. int ret = as->zDB()->gruppeErstellen( accountId, karteId, &gruppeId );
  687. switch( ret )
  688. {
  689. case 0:
  690. errorZuKlient( "Du bist nicht eingeloggt." );
  691. break;
  692. case 1:
  693. errorZuKlient( "Du wurdest bereits einem Spiel zugeordnet." );
  694. break;
  695. case 2:
  696. errorZuKlient( "Du bist in einem anderen noch laufendem Spiel. Spiele es zu Ende." );
  697. break;
  698. case 3:
  699. errorZuKlient( "Du bist in einer anderen Gruppe." );
  700. break;
  701. case 4:
  702. errorZuKlient( "Du bist bereits in der Warteschlange." );
  703. break;
  704. case 5:
  705. errorZuKlient( "Die Karte ist zur Zeit nicht spielbar." );
  706. break;
  707. case 6:
  708. errorZuKlient( "Unbekannter Fehler." );
  709. break;
  710. case 7:
  711. klient->sendeEncrypted( "\1", 1 );
  712. klient->sendeEncrypted( (char*)&gruppeId, 4 );
  713. break;
  714. }
  715. }
  716. break;
  717. case 6: // gruppe betreten
  718. if( 1 )
  719. {
  720. if( !klientNummer )
  721. {
  722. errorZuKlient( "Du bist nicht Identifiziert." );
  723. break;
  724. }
  725. klient->sendeEncrypted( "\1", 1 );
  726. int gruppeId = 0;
  727. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  728. if( as->zDB()->gruppeIstInWarteschlange( gruppeId ) )
  729. {
  730. errorZuKlient( "Die Gruppe befindet sich bereits in der Warteschlange." );
  731. break;
  732. }
  733. if( !as->zDB()->gruppeSpielerIstEingeladen( gruppeId, accountId ) )
  734. {
  735. errorZuKlient( "Du bist nicht mehr eingeladen." );
  736. break;
  737. }
  738. int anzahl = 0;
  739. Array< int > *accIds = new Array< int >();
  740. as->zDB()->getSpielerInGruppe( gruppeId, accIds, &anzahl );
  741. int res = as->zDB()->gruppeBetreten( accountId, gruppeId );
  742. switch( res )
  743. {
  744. case 0:
  745. errorZuKlient( "Du bist nicht eingeloggt." );
  746. break;
  747. case 1:
  748. errorZuKlient( "Du wurdest bereits einem Spiel zugeordnet." );
  749. break;
  750. case 2:
  751. errorZuKlient( "Du bist in einem anderen noch laufendem Spiel. Spiele es zu Ende." );
  752. break;
  753. case 3:
  754. errorZuKlient( "Du bist in einer anderen Gruppe." );
  755. break;
  756. case 4:
  757. errorZuKlient( "Du bist bereits in der Warteschlange." );
  758. break;
  759. case 5:
  760. errorZuKlient( "Die Gruppe ist bereits in einem Spiel." );
  761. break;
  762. case 6:
  763. errorZuKlient( "Unbekannter Fehler." );
  764. break;
  765. case 7:
  766. if( 1 )
  767. {
  768. klient->sendeEncrypted( "\1", 1 );
  769. klient->sendeEncrypted( (char*)&anzahl, 4 );
  770. for( int i = 0; i < anzahl; i++ )
  771. {
  772. int id = accIds->get( i );
  773. if( id == accountId )
  774. continue;
  775. klient->sendeEncrypted( (char*)&id, 4 );
  776. }
  777. as->zDB()->gruppeEinladungAbbrechen( as->zDB()->getGruppeAdminId( gruppeId ), gruppeId, accountId );
  778. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  779. weiter->spielerBetrittGruppe( gruppeId );
  780. weiter->release();
  781. }
  782. break;
  783. }
  784. accIds->release();
  785. }
  786. break;
  787. case 7: // gruppe verlassen
  788. if( 1 )
  789. {
  790. if( !klientNummer )
  791. {
  792. errorZuKlient( "Du bist nicht Identifiziert." );
  793. break;
  794. }
  795. klient->sendeEncrypted( "\1", 1 );
  796. int gruppeId = 0;
  797. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  798. if( as->zDB()->gruppeIstInWarteschlange( gruppeId ) )
  799. {
  800. errorZuKlient( "Die Gruppe befindet sich bereits in der Warteschlange." );
  801. break;
  802. }
  803. int ret = as->zDB()->gruppeVerlassen( accountId, gruppeId );
  804. if( !ret )
  805. errorZuKlient( "Du kannst die gruppe momentan nicht mehr verlassen." );
  806. if( ret == 1 )
  807. {
  808. klient->sendeEncrypted( "\1", 1 );
  809. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  810. weiter->spielerLeavesGruppe( gruppeId );
  811. weiter->release();
  812. }
  813. if( ret == 2 )
  814. klient->sendeEncrypted( "\1", 1 );
  815. if( ret == 3 )
  816. {
  817. klient->sendeEncrypted( "\1", 1 );
  818. int adminId = as->zDB()->getGruppeAdminId( gruppeId );
  819. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  820. weiter->setGruppeAdmin( gruppeId, adminId );
  821. weiter->spielerLeavesGruppe( gruppeId );
  822. weiter->release();
  823. }
  824. if( ret == 4 )
  825. {
  826. klient->sendeEncrypted( "\1", 1 );
  827. Array< int > *spieler = new Array< int >();
  828. int anzahl = 0;
  829. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  830. if( as->zDB()->getSpielerInGruppe( gruppeId, spieler, &anzahl ) )
  831. {
  832. for( int i = 0; i < anzahl; i++ )
  833. {
  834. if( spieler->hat( i ) )
  835. {
  836. weiter->kickSpielerAusGruppe( spieler->get( i ), gruppeId );
  837. as->zDB()->gruppeVerlassen( spieler->get( i ), gruppeId );
  838. }
  839. }
  840. }
  841. spieler->release();
  842. weiter->release();
  843. }
  844. }
  845. break;
  846. case 9: // gruppe anmelden
  847. if( 1 )
  848. {
  849. if( !klientNummer )
  850. {
  851. errorZuKlient( "Du bist nicht Identifiziert." );
  852. break;
  853. }
  854. klient->sendeEncrypted( "\1", 1 );
  855. int gruppeId = 0;
  856. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  857. if( !as->zDB()->spielerBesitztKarte( accountId, as->zDB()->getGruppenKarte( gruppeId ) ) )
  858. {
  859. errorZuKlient( "Du besitzt entweder die Karte oder das Spiel nicht." );
  860. break;
  861. }
  862. if( as->zDB()->getGruppeSpielStarten( gruppeId ) && as->zDB()->getSpielerInGruppeAnzahl( gruppeId ) <= 1 )
  863. {
  864. errorZuKlient( "Es müssen mindestens 2 Spieler in der Gruppe vorhanden sein." );
  865. break;
  866. }
  867. if( as->zDB()->gruppeAnmelden( accountId, gruppeId ) )
  868. {
  869. klient->sendeEncrypted( "\1", 1 );
  870. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  871. weiter->gruppeAngemeldet( gruppeId );
  872. weiter->release();
  873. }
  874. else
  875. errorZuKlient( "Du kannst die Gruppe nicht anmelden." );
  876. }
  877. break;
  878. case 0xA: // gruppe abmelden
  879. if( 1 )
  880. {
  881. if( !klientNummer )
  882. {
  883. errorZuKlient( "Du bist nicht Identifiziert." );
  884. break;
  885. }
  886. klient->sendeEncrypted( "\1", 1 );
  887. int gruppeId = 0;
  888. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  889. if( as->zDB()->gruppeAbmelden( accountId, gruppeId ) )
  890. {
  891. klient->sendeEncrypted( "\1", 1 );
  892. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  893. weiter->gruppeAbgemeldet( gruppeId );
  894. weiter->release();
  895. }
  896. else
  897. errorZuKlient( "Du kannst die Gruppe nicht abmelden." );
  898. break;
  899. }
  900. case 0xB: // spieler einladen
  901. if( 1 )
  902. {
  903. if( !klientNummer )
  904. {
  905. errorZuKlient( "Du bist nicht Identifiziert." );
  906. break;
  907. }
  908. klient->sendeEncrypted( "\1", 1 );
  909. int gruppeId = 0;
  910. int zuAccountId = 0;
  911. klient->getNachrichtEncrypted( (char*)&zuAccountId, 4 );
  912. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  913. if( as->zDB()->gruppeIstInWarteschlange( gruppeId ) )
  914. {
  915. errorZuKlient( "Die Gruppe befindet sich bereits in der Warteschlange." );
  916. break;
  917. }
  918. if( as->zDB()->gruppeSpielerEinladen( accountId, zuAccountId, gruppeId ) )
  919. {
  920. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  921. if( weiter->spielEinladung( gruppeId, zuAccountId ) )
  922. klient->sendeEncrypted( "\1", 1 );
  923. else
  924. {
  925. if( weiter->zLetzterFehler()->getLength() )
  926. errorZuKlient( weiter->zLetzterFehler()->getText() );
  927. else
  928. errorZuKlient( "Fehler beim zuteilen der Einladung." );
  929. }
  930. weiter->release();
  931. }
  932. else
  933. errorZuKlient( "Du kannst diesen Spieler nicht einladen." );
  934. }
  935. break;
  936. case 0xC: // spieler kicken
  937. if( 1 )
  938. {
  939. if( !klientNummer )
  940. {
  941. errorZuKlient( "Du bist nicht Identifiziert." );
  942. break;
  943. }
  944. klient->sendeEncrypted( "\1", 1 );
  945. int gruppeId = 0;
  946. int zuAccountId = 0;
  947. klient->getNachrichtEncrypted( (char*)&zuAccountId, 4 );
  948. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  949. if( as->zDB()->gruppeIstInWarteschlange( gruppeId ) )
  950. {
  951. errorZuKlient( "Die Gruppe befindet sich bereits in der Warteschlange." );
  952. break;
  953. }
  954. if( as->zDB()->spielerKannKicken( accountId, gruppeId ) )
  955. {
  956. klient->sendeEncrypted( "\1", 1 );
  957. as->zDB()->gruppeVerlassen( zuAccountId, gruppeId );
  958. MsgWeiterleitung *weiter = new MsgWeiterleitung( zuAccountId, as->getThis() );
  959. weiter->kickSpielerAusGruppe( zuAccountId, gruppeId );
  960. weiter->spielerLeavesGruppe( gruppeId );
  961. weiter->release();
  962. }
  963. else
  964. errorZuKlient( "Du hast keine berechtigung diesen Spieler zu kicken." );
  965. }
  966. break;
  967. case 0xD: // gruppen Nachricht senden
  968. if( 1 )
  969. {
  970. if( !klientNummer )
  971. {
  972. errorZuKlient( "Du bist nicht Identifiziert." );
  973. break;
  974. }
  975. klient->sendeEncrypted( "\1", 1 );
  976. int gruppeId = 0;
  977. char key = 0;
  978. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  979. klient->getNachrichtEncrypted( &key, 1 );
  980. char *nachricht = new char[ key + 1 ];
  981. nachricht[ (int)key ] = 0;
  982. if( key )
  983. klient->getNachrichtEncrypted( nachricht, key );
  984. else
  985. {
  986. klient->sendeEncrypted( "\1", 1 );
  987. delete[] nachricht;
  988. break;
  989. }
  990. klient->sendeEncrypted( "\1", 1 );
  991. Text *message = as->zDB()->getAccountRufName( accountId );
  992. message->append( ": " );
  993. message->append( nachricht );
  994. delete[] nachricht;
  995. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  996. weiter->gruppenNachricht( gruppeId, message->getText() );
  997. weiter->release();
  998. message->release();
  999. }
  1000. break;
  1001. case 0xE: // spieler anmelden
  1002. if( 1 )
  1003. {
  1004. if( !klientNummer )
  1005. {
  1006. errorZuKlient( "Du bist nicht Identifiziert." );
  1007. break;
  1008. }
  1009. klient->sendeEncrypted( "\1", 1 );
  1010. int karteId = 0;
  1011. klient->getNachrichtEncrypted( (char*)&karteId, 4 );
  1012. if( !as->zDB()->spielerBesitztKarte( accountId, karteId ) )
  1013. {
  1014. errorZuKlient( "Du besitzt entweder die Karte oder das Spiel nicht." );
  1015. break;
  1016. }
  1017. int ret = as->zDB()->accountAnmelden( accountId, karteId );
  1018. switch( ret )
  1019. {
  1020. case 0:
  1021. errorZuKlient( "Du bist nicht eingeloggt." );
  1022. break;
  1023. case 1:
  1024. errorZuKlient( "Du wurdest bereits einem Spiel zugeordnet." );
  1025. break;
  1026. case 2:
  1027. errorZuKlient( "Du bist in einem anderen noch laufendem Spiel. Spiele es zu Ende." );
  1028. break;
  1029. case 3:
  1030. errorZuKlient( "Du bist in einer anderen Gruppe." );
  1031. break;
  1032. case 4:
  1033. errorZuKlient( "Du bist bereits in der Warteschlange." );
  1034. break;
  1035. case 5:
  1036. errorZuKlient( "Die Karte ist zur Zeit nicht spielbar." );
  1037. break;
  1038. case 6:
  1039. errorZuKlient( "Unbekannter Fehler." );
  1040. break;
  1041. case 7:
  1042. klient->sendeEncrypted( "\1", 1 );
  1043. break;
  1044. }
  1045. }
  1046. break;
  1047. case 0xF: // spieler abmelden
  1048. if( !klientNummer )
  1049. {
  1050. errorZuKlient( "Du bist nicht Identifiziert." );
  1051. break;
  1052. }
  1053. klient->sendeEncrypted( "\1", 1 );
  1054. as->zDB()->accountAbmelden( accountId );
  1055. break;
  1056. case 0x10: // gruppe Spiel Starten
  1057. if( 1 )
  1058. {
  1059. if( !klientNummer )
  1060. {
  1061. errorZuKlient( "Du bist nicht Identifiziert." );
  1062. break;
  1063. }
  1064. klient->sendeEncrypted( "\1", 1 );
  1065. char spielStarten = 0;
  1066. int gruppeId = 0;
  1067. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  1068. klient->getNachrichtEncrypted( &spielStarten, 1 );
  1069. if( spielStarten && as->zDB()->getSpielerInGruppeAnzahl( gruppeId ) < 2 )
  1070. {
  1071. errorZuKlient( "Es müssen sich mindestens 2 Spieler in der Gruppe befinden." );
  1072. break;
  1073. }
  1074. if( as->zDB()->setGruppeSpielStarten( accountId, gruppeId, spielStarten == 1 ) )
  1075. {
  1076. klient->sendeEncrypted( "\1", 1 );
  1077. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  1078. weiter->gruppeSpielStarten( gruppeId, spielStarten == 1 );
  1079. weiter->release();
  1080. }
  1081. else
  1082. errorZuKlient( "Du kannst diese Option nicht setzen." );
  1083. }
  1084. break;
  1085. case 0x11: // gruppe Einladung abbrechen
  1086. if( 1 )
  1087. {
  1088. if( !klientNummer )
  1089. {
  1090. errorZuKlient( "Du bist nicht Identifiziert." );
  1091. break;
  1092. }
  1093. klient->sendeEncrypted( "\1", 1 );
  1094. int gruppeId = 0;
  1095. int accountId = 0;
  1096. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  1097. klient->getNachrichtEncrypted( (char*)&accountId, 4 );
  1098. if( as->zDB()->gruppeEinladungAbbrechen( this->accountId, gruppeId, accountId ) )
  1099. {
  1100. klient->sendeEncrypted( "\1", 1 );
  1101. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  1102. weiter->spielEinladungAbbrechen( gruppeId, accountId );
  1103. weiter->release();
  1104. }
  1105. else
  1106. errorZuKlient( "Du kannst diese Option nicht setzen." );
  1107. }
  1108. break;
  1109. case 0x12: // gruppe Einladung ablehnen
  1110. if( 1 )
  1111. {
  1112. if( !klientNummer )
  1113. {
  1114. errorZuKlient( "Du bist nicht Identifiziert." );
  1115. break;
  1116. }
  1117. klient->sendeEncrypted( "\1", 1 );
  1118. int gruppeId = 0;
  1119. klient->getNachrichtEncrypted( (char*)&gruppeId, 4 );
  1120. klient->sendeEncrypted( "\1", 1 );
  1121. as->zDB()->gruppeEinladungAbbrechen( as->zDB()->getGruppeAdminId( gruppeId ), gruppeId, accountId );
  1122. MsgWeiterleitung *weiter = new MsgWeiterleitung( accountId, as->getThis() );
  1123. weiter->spielEinladungAblehnen( gruppeId );
  1124. weiter->release();
  1125. }
  1126. break;
  1127. case 0x13: // ping
  1128. if( 1 )
  1129. {
  1130. if( !klientNummer )
  1131. {
  1132. errorZuKlient( "Du bist nicht Identifiziert." );
  1133. break;
  1134. }
  1135. klient->sendeEncrypted( "\1", 1 );
  1136. }
  1137. break;
  1138. default:
  1139. errorZuKlient( "Unbekannte Nachricht!" );
  1140. break;
  1141. }
  1142. if( br )
  1143. break;
  1144. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1145. as->addGesendet( klient->getUploadBytes( 1 ) );
  1146. }
  1147. }
  1148. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1149. as->addGesendet( klient->getUploadBytes( 1 ) );
  1150. as->removeKlient( this ); // delete this
  1151. }
  1152. // constant
  1153. void ASKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  1154. {
  1155. klient->sendeEncrypted( "\3", 1 );
  1156. char key = (char)textLength( nachricht );
  1157. klient->sendeEncrypted( &key, 1 );
  1158. klient->sendeEncrypted( nachricht, key );
  1159. }
  1160. int ASKlient::getKlientNummer() const // gibt die KlientId zurück
  1161. {
  1162. return klientNummer;
  1163. }
  1164. // Reference Counting
  1165. ASKlient *ASKlient::getThis()
  1166. {
  1167. ref++;
  1168. return this;
  1169. }
  1170. ASKlient *ASKlient::release()
  1171. {
  1172. ref--;
  1173. if( !ref )
  1174. delete this;
  1175. return 0;
  1176. }
  1177. // Inhalt der MsgWeiterleitung Klasse aus AnmeldungServer.h
  1178. // Konstruktor
  1179. MsgWeiterleitung::MsgWeiterleitung( int accountId, AnmeldungServer *as )
  1180. {
  1181. fehler = new Text( "" );
  1182. this->accountId = accountId;
  1183. this->as = as;
  1184. ref = 1;
  1185. }
  1186. // Destruktor
  1187. MsgWeiterleitung::~MsgWeiterleitung()
  1188. {
  1189. fehler->release();
  1190. as->release();
  1191. }
  1192. // nicht constant
  1193. bool MsgWeiterleitung::spielerBetrittGruppe( int gruppeId )
  1194. {
  1195. bool ret = 1;
  1196. Array< int > *accId = new Array< int >();
  1197. int anzahl = 0;
  1198. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1199. for( int i = 0; i < anzahl; i++ )
  1200. {
  1201. int account = accId->get( i );
  1202. if( account == accountId )
  1203. continue;
  1204. Text *ip = new Text( "" );
  1205. int port = 0;
  1206. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1207. if( ip->istGleich( as->getIp() ) )
  1208. ip->setText( "127.0.0.1" );
  1209. if( ip->getLength() )
  1210. {
  1211. Klient *klient = new Klient();
  1212. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1213. klient->setSendeKey( (char*)key, 20 );
  1214. klient->setEmpfangKey( (char*)key, 20 );
  1215. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1216. ret = ret & klient->sendeEncrypted( "\5\x14", 2 );
  1217. char res = 0;
  1218. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1219. if( res )
  1220. {
  1221. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1222. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1223. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1224. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1225. }
  1226. ret = (char)ret & res;
  1227. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1228. as->addGesendet( klient->getUploadBytes( 1 ) );
  1229. klient->trenne();
  1230. klient = klient->release();
  1231. }
  1232. ip->release();
  1233. }
  1234. accId->release();
  1235. if( !ret )
  1236. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1237. return ret;
  1238. }
  1239. bool MsgWeiterleitung::spielerLeavesGruppe( int gruppeId )
  1240. {
  1241. bool ret = 1;
  1242. Array< int > *accId = new Array< int >();
  1243. int anzahl = 0;
  1244. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1245. for( int i = 0; i < anzahl; i++ )
  1246. {
  1247. int account = accId->get( i );
  1248. if( account == accountId )
  1249. continue;
  1250. Text *ip = new Text( "" );
  1251. int port = 0;
  1252. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1253. if( ip->istGleich( as->getIp() ) )
  1254. ip->setText( "127.0.0.1" );
  1255. if( ip->getLength() )
  1256. {
  1257. Klient *klient = new Klient();
  1258. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1259. klient->setSendeKey( (char*)key, 20 );
  1260. klient->setEmpfangKey( (char*)key, 20 );
  1261. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1262. ret = ret & klient->sendeEncrypted( "\5\x15", 2 );
  1263. char res = 0;
  1264. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1265. if( res )
  1266. {
  1267. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1268. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1269. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1270. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1271. }
  1272. ret = (char)ret & res;
  1273. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1274. as->addGesendet( klient->getUploadBytes( 1 ) );
  1275. klient->trenne();
  1276. klient = klient->release();
  1277. }
  1278. ip->release();
  1279. }
  1280. accId->release();
  1281. if( !ret )
  1282. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1283. return ret;
  1284. }
  1285. bool MsgWeiterleitung::setGruppeAdmin( int gruppeId, int admin )
  1286. {
  1287. bool ret = 1;
  1288. Array< int > *accId = new Array< int >();
  1289. int anzahl = 0;
  1290. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1291. for( int i = 0; i < anzahl; i++ )
  1292. {
  1293. int account = accId->get( i );
  1294. if( account == accountId )
  1295. continue;
  1296. Text *ip = new Text( "" );
  1297. int port = 0;
  1298. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1299. if( ip->istGleich( as->getIp() ) )
  1300. ip->setText( "127.0.0.1" );
  1301. if( ip->getLength() )
  1302. {
  1303. Klient *klient = new Klient();
  1304. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1305. klient->setSendeKey( (char*)key, 20 );
  1306. klient->setEmpfangKey( (char*)key, 20 );
  1307. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1308. ret = ret & klient->sendeEncrypted( "\5\x1B", 2 );
  1309. char res = 0;
  1310. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1311. if( res )
  1312. {
  1313. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1314. ret = ret & klient->sendeEncrypted( (char*)&admin, 4 );
  1315. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1316. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1317. }
  1318. ret = (char)ret & res;
  1319. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1320. as->addGesendet( klient->getUploadBytes( 1 ) );
  1321. klient->trenne();
  1322. klient = klient->release();
  1323. }
  1324. ip->release();
  1325. }
  1326. accId->release();
  1327. if( !ret )
  1328. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1329. return ret;
  1330. }
  1331. bool MsgWeiterleitung::kickSpielerAusGruppe( int accountId, int gruppeId )
  1332. {
  1333. bool ret = 1;
  1334. Text *ip = new Text( "" );
  1335. int port = 0;
  1336. ret = ret & as->zDB()->getChatServer( accountId, ip, &port );
  1337. if( ip->istGleich( as->getIp() ) )
  1338. ip->setText( "127.0.0.1" );
  1339. if( ip->getLength() )
  1340. {
  1341. Klient *klient = new Klient();
  1342. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1343. klient->setSendeKey( (char*)key, 20 );
  1344. klient->setEmpfangKey( (char*)key, 20 );
  1345. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1346. ret = ret & klient->sendeEncrypted( "\5\x16", 2 );
  1347. char res = 0;
  1348. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1349. if( res )
  1350. {
  1351. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1352. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1353. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1354. }
  1355. ret = (char)ret & res;
  1356. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1357. as->addGesendet( klient->getUploadBytes( 1 ) );
  1358. klient->trenne();
  1359. klient = klient->release();
  1360. }
  1361. ip->release();
  1362. if( !ret )
  1363. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1364. return ret;
  1365. }
  1366. bool MsgWeiterleitung::gruppenNachricht( int gruppeId, char *txt )
  1367. {
  1368. bool ret = 1;
  1369. char len = (char)textLength( txt );
  1370. if( !len )
  1371. return 0;
  1372. Array< int > *accId = new Array< int >();
  1373. int anzahl = 0;
  1374. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1375. for( int i = 0; i < anzahl; i++ )
  1376. {
  1377. int account = accId->get( i );
  1378. Text *ip = new Text( "" );
  1379. int port = 0;
  1380. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1381. if( ip->istGleich( as->getIp() ) )
  1382. ip->setText( "127.0.0.1" );
  1383. if( ip->getLength() )
  1384. {
  1385. Klient *klient = new Klient();
  1386. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1387. klient->setSendeKey( (char*)key, 20 );
  1388. klient->setEmpfangKey( (char*)key, 20 );
  1389. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1390. ret = ret & klient->sendeEncrypted( "\5\x19", 2 );
  1391. char res = 0;
  1392. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1393. if( res )
  1394. {
  1395. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1396. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1397. ret = ret & klient->sendeEncrypted( (char*)&len, 1 );
  1398. if( len )
  1399. ret = ret & klient->sendeEncrypted( txt, len );
  1400. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1401. }
  1402. ret = (char)ret & res;
  1403. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1404. as->addGesendet( klient->getUploadBytes( 1 ) );
  1405. klient->trenne();
  1406. klient = klient->release();
  1407. }
  1408. ip->release();
  1409. }
  1410. accId->release();
  1411. if( !ret )
  1412. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1413. return ret;
  1414. }
  1415. bool MsgWeiterleitung::gruppeAngemeldet( int gruppeId )
  1416. {
  1417. bool ret = 1;
  1418. Array< int > *accId = new Array< int >();
  1419. int anzahl = 0;
  1420. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1421. for( int i = 0; i < anzahl; i++ )
  1422. {
  1423. int account = accId->get( i );
  1424. Text *ip = new Text( "" );
  1425. int port = 0;
  1426. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1427. if( ip->istGleich( as->getIp() ) )
  1428. ip->setText( "127.0.0.1" );
  1429. if( ip->getLength() )
  1430. {
  1431. Klient *klient = new Klient();
  1432. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1433. klient->setSendeKey( (char*)key, 20 );
  1434. klient->setEmpfangKey( (char*)key, 20 );
  1435. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1436. ret = ret & klient->sendeEncrypted( "\5\x17", 2 );
  1437. char res = 0;
  1438. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1439. if( res )
  1440. {
  1441. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1442. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1443. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1444. }
  1445. ret = (char)ret & res;
  1446. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1447. as->addGesendet( klient->getUploadBytes( 1 ) );
  1448. klient->trenne();
  1449. klient = klient->release();
  1450. }
  1451. ip->release();
  1452. }
  1453. accId->release();
  1454. if( !ret )
  1455. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1456. return ret;
  1457. }
  1458. bool MsgWeiterleitung::gruppeAbgemeldet( int gruppeId )
  1459. {
  1460. bool ret = 1;
  1461. Array< int > *accId = new Array< int >();
  1462. int anzahl = 0;
  1463. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1464. for( int i = 0; i < anzahl; i++ )
  1465. {
  1466. int account = accId->get( i );
  1467. Text *ip = new Text( "" );
  1468. int port = 0;
  1469. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1470. if( ip->istGleich( as->getIp() ) )
  1471. ip->setText( "127.0.0.1" );
  1472. if( ip->getLength() )
  1473. {
  1474. Klient *klient = new Klient();
  1475. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1476. klient->setSendeKey( (char*)key, 20 );
  1477. klient->setEmpfangKey( (char*)key, 20 );
  1478. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1479. ret = ret & klient->sendeEncrypted( "\5\x18", 2 );
  1480. char res = 0;
  1481. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1482. if( res )
  1483. {
  1484. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1485. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1486. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1487. }
  1488. ret = (char)ret & res;
  1489. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1490. as->addGesendet( klient->getUploadBytes( 1 ) );
  1491. klient->trenne();
  1492. klient = klient->release();
  1493. }
  1494. ip->release();
  1495. }
  1496. accId->release();
  1497. if( !ret )
  1498. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1499. return ret;
  1500. }
  1501. bool MsgWeiterleitung::gruppeSpielStarten( int gruppeId, bool starten )
  1502. {
  1503. bool ret = 1;
  1504. Array< int > *accId = new Array< int >();
  1505. int anzahl = 0;
  1506. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1507. for( int i = 0; i < anzahl; i++ )
  1508. {
  1509. int account = accId->get( i );
  1510. Text *ip = new Text( "" );
  1511. int port = 0;
  1512. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1513. if( ip->istGleich( as->getIp() ) )
  1514. ip->setText( "127.0.0.1" );
  1515. if( ip->getLength() )
  1516. {
  1517. Klient *klient = new Klient();
  1518. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1519. klient->setSendeKey( (char*)key, 20 );
  1520. klient->setEmpfangKey( (char*)key, 20 );
  1521. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1522. ret = ret & klient->sendeEncrypted( "\5\x1A", 2 );
  1523. char res = 0;
  1524. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1525. if( res )
  1526. {
  1527. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1528. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1529. ret = ret & klient->sendeEncrypted( (char*)&starten, 1 );
  1530. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1531. }
  1532. ret = (char)ret & res;
  1533. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1534. as->addGesendet( klient->getUploadBytes( 1 ) );
  1535. klient->trenne();
  1536. klient = klient->release();
  1537. }
  1538. ip->release();
  1539. }
  1540. accId->release();
  1541. if( !ret )
  1542. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1543. return ret;
  1544. }
  1545. bool MsgWeiterleitung::spielEinladung( int gruppeId, int accountId )
  1546. {
  1547. // Einladung zum spieler Senden
  1548. bool ret = 1;
  1549. Text *ip = new Text( "" );
  1550. int port = 0;
  1551. ret = ret & as->zDB()->getChatServer( accountId, ip, &port );
  1552. if( ip->istGleich( as->getIp() ) )
  1553. ip->setText( "127.0.0.1" );
  1554. if( ip->getLength() )
  1555. {
  1556. Klient *klient = new Klient();
  1557. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1558. klient->setSendeKey( (char*)key, 20 );
  1559. klient->setEmpfangKey( (char*)key, 20 );
  1560. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1561. ret = ret & klient->sendeEncrypted( "\5\5", 2 );
  1562. char res = 0;
  1563. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1564. if( res )
  1565. {
  1566. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1567. ret = ret & klient->sendeEncrypted( (char*)&this->accountId, 4 );
  1568. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1569. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1570. }
  1571. ret = (char)ret & res;
  1572. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1573. as->addGesendet( klient->getUploadBytes( 1 ) );
  1574. klient->trenne();
  1575. klient = klient->release();
  1576. }
  1577. ip->release();
  1578. // Einladung zu den Gruppenmitgliedern senden
  1579. Array< int > *accId = new Array< int >();
  1580. int anzahl = 0;
  1581. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1582. for( int i = 0; i < anzahl; i++ )
  1583. {
  1584. int account = accId->get( i );
  1585. Text *ip = new Text( "" );
  1586. int port = 0;
  1587. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1588. if( ip->istGleich( as->getIp() ) )
  1589. ip->setText( "127.0.0.1" );
  1590. if( ip->getLength() )
  1591. {
  1592. Klient *klient = new Klient();
  1593. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1594. klient->setSendeKey( (char*)key, 20 );
  1595. klient->setEmpfangKey( (char*)key, 20 );
  1596. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1597. ret = ret & klient->sendeEncrypted( "\5\x1F", 2 );
  1598. char res = 0;
  1599. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1600. if( res )
  1601. {
  1602. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1603. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1604. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1605. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1606. }
  1607. ret = (char)ret & res;
  1608. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1609. as->addGesendet( klient->getUploadBytes( 1 ) );
  1610. klient->trenne();
  1611. klient = klient->release();
  1612. }
  1613. ip->release();
  1614. }
  1615. accId->release();
  1616. if( !ret )
  1617. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1618. return ret;
  1619. }
  1620. bool MsgWeiterleitung::spielEinladungAbbrechen( int gruppeId, int accountId )
  1621. {
  1622. bool ret = 1;
  1623. Array< int > *accId = new Array< int >();
  1624. int anzahl = 0;
  1625. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1626. for( int i = 0; i < anzahl; i++ )
  1627. {
  1628. int account = accId->get( i );
  1629. Text *ip = new Text( "" );
  1630. int port = 0;
  1631. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1632. if( ip->istGleich( as->getIp() ) )
  1633. ip->setText( "127.0.0.1" );
  1634. if( ip->getLength() )
  1635. {
  1636. Klient *klient = new Klient();
  1637. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1638. klient->setSendeKey( (char*)key, 20 );
  1639. klient->setEmpfangKey( (char*)key, 20 );
  1640. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1641. ret = ret & klient->sendeEncrypted( "\5\x1E", 2 );
  1642. char res = 0;
  1643. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1644. if( res )
  1645. {
  1646. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1647. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1648. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1649. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1650. }
  1651. ret = (char)ret & res;
  1652. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1653. as->addGesendet( klient->getUploadBytes( 1 ) );
  1654. klient->trenne();
  1655. klient = klient->release();
  1656. }
  1657. ip->release();
  1658. }
  1659. accId->release();
  1660. if( !ret )
  1661. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1662. return ret;
  1663. }
  1664. bool MsgWeiterleitung::spielEinladungAblehnen( int gruppeId )
  1665. {
  1666. bool ret = 1;
  1667. Array< int > *accId = new Array< int >();
  1668. int anzahl = 0;
  1669. as->zDB()->getSpielerInGruppe( gruppeId, accId, &anzahl );
  1670. for( int i = 0; i < anzahl; i++ )
  1671. {
  1672. int account = accId->get( i );
  1673. Text *ip = new Text( "" );
  1674. int port = 0;
  1675. ret = ret & as->zDB()->getChatServer( account, ip, &port );
  1676. if( ip->istGleich( as->getIp() ) )
  1677. ip->setText( "127.0.0.1" );
  1678. if( ip->getLength() )
  1679. {
  1680. Klient *klient = new Klient();
  1681. unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1682. klient->setSendeKey( (char*)key, 20 );
  1683. klient->setEmpfangKey( (char*)key, 20 );
  1684. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1685. ret = ret & klient->sendeEncrypted( "\5\x1C", 2 );
  1686. char res = 0;
  1687. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1688. if( res )
  1689. {
  1690. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1691. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1692. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1693. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1694. }
  1695. ret = (char)ret & res;
  1696. as->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1697. as->addGesendet( klient->getUploadBytes( 1 ) );
  1698. klient->trenne();
  1699. klient = klient->release();
  1700. }
  1701. ip->release();
  1702. }
  1703. accId->release();
  1704. if( !ret )
  1705. fehler->setText( "Einer oder mehr Accounts konnen nicht erreicht werden" );
  1706. return ret;
  1707. }
  1708. // constant
  1709. int MsgWeiterleitung::getAccountId() const
  1710. {
  1711. return accountId;
  1712. }
  1713. Text *MsgWeiterleitung::getLetzterFehler() const
  1714. {
  1715. return fehler->getThis();
  1716. }
  1717. Text *MsgWeiterleitung::zLetzterFehler() const
  1718. {
  1719. return fehler;
  1720. }
  1721. // Reference Counting
  1722. MsgWeiterleitung *MsgWeiterleitung::getThis()
  1723. {
  1724. ref++;
  1725. return this;
  1726. }
  1727. MsgWeiterleitung *MsgWeiterleitung::release()
  1728. {
  1729. ref--;
  1730. if( !ref )
  1731. delete this;
  1732. return 0;
  1733. }