PatchServer.cpp 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909
  1. #include "PatchServer.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. // Inhalt der PatchServer Klasse aus PatchServer.h
  6. // Konstruktor
  7. PatchServer::PatchServer( InitDatei *zIni )
  8. : Thread()
  9. {
  10. Network::Start( 100 );
  11. std::cout << "PS: Verbindung mit Datenbank wird hergestellt...\n";
  12. db = new PSDatenbank( zIni );
  13. klientAnzahl = 0;
  14. klients = new RCArray< PSKlient >();
  15. empfangen = 0;
  16. gesendet = 0;
  17. fehler = new Text();
  18. ini = zIni->getThis();
  19. id = *zIni->zWert( "ServerId" );
  20. Text *dgInitPfad = new Text( ini->zWert( "SystemPfad" )->getText() );
  21. dgInitPfad->append( "/datei_gruppe.ini" );
  22. InitDatei *dgInit = new InitDatei( dgInitPfad );
  23. dgInit->laden();
  24. for( int i = 0; i < dgInit->getWertAnzahl(); i++ )
  25. db->setDateiGruppe( id, TextZuInt( dgInit->zName( i )->getText(), 10 ), (int)TextZuInt( dgInit->zWert( i )->getText(), 10 ) );
  26. dgInit->release();
  27. server = new Server();
  28. aServer = new SSLServer();
  29. aServer->setPrivateKeyPassword( zIni->zWert( "SSLPasswort" )->getText() );
  30. aServer->setCertificateFile( zIni->zWert( "SSLCert" )->getText() );
  31. aServer->setPrivateKeyFile( zIni->zWert( "SSLKey" )->getText() );
  32. std::cout << "PS: Starten des Admin Servers...\n";
  33. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  34. {
  35. std::cout << "PS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  36. exit( 1 );
  37. }
  38. db->setServerStatus( id, 2 );
  39. end = 0;
  40. nichtPausiert = 0;
  41. InitializeCriticalSection( &cs );
  42. updateAnzahl = 0;
  43. updateGruppe = new Array< int >();
  44. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  45. {
  46. serverStarten();
  47. serverFortsetzen();
  48. }
  49. }
  50. // Destruktor
  51. PatchServer::~PatchServer()
  52. {
  53. fehler->release();
  54. server->trenne();
  55. server->release();
  56. aServer->trenne();
  57. aServer->release();
  58. if( klients )
  59. klients->release();
  60. ini->release();
  61. db->release();
  62. updateGruppe->release();
  63. DeleteCriticalSection( &cs );
  64. }
  65. // nicht constant
  66. void PatchServer::runn()
  67. {
  68. while( !end && aServer->isConnected() )
  69. {
  70. SSLSKlient *klient;
  71. klient = aServer->getKlient();
  72. if( end && klient )
  73. {
  74. klient->trenne();
  75. klient = klient->release();
  76. Sleep( 1000 );
  77. return;
  78. }
  79. if( !klient )
  80. continue;
  81. PSAKlient * clHandle = new PSAKlient( klient, (PatchServer *)getThis(), ini->getThis() );
  82. clHandle->start();
  83. }
  84. }
  85. void PatchServer::thread()
  86. {
  87. while( server->isConnected() )
  88. {
  89. SKlient *klient;
  90. klient = server->getKlient();
  91. if( !klient )
  92. continue;
  93. Framework::getThreadRegister()->cleanUpClosedThreads();
  94. PSKlient * clHandle = new PSKlient( klient, (PatchServer *)getThis(), ini->getThis() );
  95. EnterCriticalSection( &cs );
  96. klients->set( clHandle, klientAnzahl );
  97. klientAnzahl++;
  98. LeaveCriticalSection( &cs );
  99. clHandle->start();
  100. }
  101. }
  102. void PatchServer::close()
  103. {
  104. db->setServerStatus( id, 1 );
  105. server->trenne();
  106. #ifdef WIN32
  107. warteAufThread( 1000 );
  108. #endif
  109. EnterCriticalSection( &cs );
  110. for( int i = 0; i < klientAnzahl; i++ )
  111. klients->z( i )->absturz();
  112. klients = klients->release();
  113. klientAnzahl = 0;
  114. LeaveCriticalSection( &cs );
  115. ende();
  116. run = 0;
  117. end = 1;
  118. Klient * klient = new Klient();
  119. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  120. Sleep( 500 );
  121. aServer->trenne();
  122. klient->release();
  123. }
  124. bool PatchServer::serverStarten()
  125. {
  126. if( nichtPausiert )
  127. {
  128. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  129. return 0;
  130. }
  131. if( server )
  132. server->release();
  133. server = new Server();
  134. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  135. {
  136. nichtPausiert = 1;
  137. start();
  138. return 1;
  139. }
  140. else
  141. {
  142. serverBeenden();
  143. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  144. return 0;
  145. }
  146. }
  147. bool PatchServer::serverPause()
  148. {
  149. if( !nichtPausiert )
  150. {
  151. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  152. return 0;
  153. }
  154. if( !db->setServerStatus( id, 2 ) )
  155. {
  156. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  157. fehler->append( db->getLetzterFehler() );
  158. return 0;
  159. }
  160. return 1;
  161. }
  162. bool PatchServer::serverFortsetzen()
  163. {
  164. if( !nichtPausiert )
  165. {
  166. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  167. return 0;
  168. }
  169. if( !db->setServerStatus( id, 3 ) )
  170. {
  171. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  172. fehler->append( db->getLetzterFehler() );
  173. return 0;
  174. }
  175. return 1;
  176. }
  177. bool PatchServer::serverBeenden()
  178. {
  179. if( !nichtPausiert )
  180. {
  181. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  182. return 0;
  183. }
  184. if( db->serverIstNichtPausiert( id ) )
  185. {
  186. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  187. return 0;
  188. }
  189. nichtPausiert = 0;
  190. ende();
  191. if( server )
  192. server->trenne();
  193. return 1;
  194. }
  195. bool PatchServer::setMaxKlients( int mc )
  196. {
  197. if( !db->setMaxClients( id, mc ) )
  198. {
  199. fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
  200. fehler->append( db->getLetzterFehler() );
  201. return 0;
  202. }
  203. ini->setWert( "MaxClients", Text() += mc );
  204. return 1;
  205. }
  206. bool PatchServer::absturzKlient( int klientId )
  207. {
  208. bool gefunden = 0;
  209. EnterCriticalSection( &cs );
  210. for( int i = 0; i < klientAnzahl; i++ )
  211. {
  212. if( klients->z( i )->getKlientNummer() == klientId )
  213. {
  214. klients->z( i )->absturz();
  215. klients->remove( i );
  216. klientAnzahl--;
  217. gefunden = 1;
  218. break;
  219. }
  220. }
  221. LeaveCriticalSection( &cs );
  222. return gefunden;
  223. }
  224. bool PatchServer::removeKlient( PSKlient * zKlient )
  225. {
  226. bool gefunden = 0;
  227. EnterCriticalSection( &cs );
  228. for( int i = 0; i < klientAnzahl; i++ )
  229. {
  230. if( klients->z( i ) == zKlient )
  231. {
  232. klients->remove( i );
  233. klientAnzahl--;
  234. gefunden = 1;
  235. break;
  236. }
  237. }
  238. LeaveCriticalSection( &cs );
  239. return gefunden;
  240. }
  241. void PatchServer::addGesendet( int bytes )
  242. {
  243. gesendet += bytes;
  244. }
  245. void PatchServer::addEmpfangen( int bytes )
  246. {
  247. empfangen += bytes;
  248. }
  249. bool PatchServer::beginnUpdate( int gruppe )
  250. {
  251. bool update = 0;
  252. for( int i = 0; i < updateAnzahl; i++ )
  253. {
  254. if( updateGruppe->get( i ) == gruppe )
  255. {
  256. update = 1;
  257. break;
  258. }
  259. }
  260. if( update || proveVersion( gruppe ) )
  261. return 0;
  262. if( !db->supportedDateiGruppe( id, gruppe ) )
  263. {
  264. db->setDateiGruppe( id, gruppe, 0 );
  265. }
  266. if( !db->setDateiGruppe( id, gruppe, true ) )
  267. return 0;
  268. Text * gruppeN = db->getDateiGruppeName( gruppe );
  269. if( !gruppeN )
  270. return 0;
  271. Result systemT = db->getSystemListe();
  272. for( int i = 0; i < systemT.zeilenAnzahl; i++ )
  273. {
  274. Text *pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
  275. pfad->append( "/" );
  276. pfad->append( gruppeN->getText() );
  277. pfad->append( "/" );
  278. pfad->append( systemT.values[ i * 2 + 1 ].getText() );
  279. pfad->append( "/version.ini" );
  280. InitDatei * vIni = new InitDatei( pfad->getText() );
  281. vIni->laden();
  282. pfad->remove( pfad->getLength() - 11, pfad->getLength() );
  283. Result dateiT = db->getDeletedFiles( TextZuInt( systemT.values[ i * 2 ].getText(), 10 ), gruppe );
  284. for( int j = 0; j < dateiT.zeilenAnzahl; j++ )
  285. {
  286. if( vIni->wertExistiert( dateiT.values[ j ].getText() ) )
  287. {
  288. Text *pf = new Text( pfad->getText() );
  289. pf->append( dateiT.values[ j ].getText() );
  290. DateiRemove( pf );
  291. vIni->removeWert( dateiT.values[ j ].getText() );
  292. }
  293. }
  294. dateiT.destroy();
  295. DateiPfadErstellen( vIni->getPfad() );
  296. vIni->speichern();
  297. vIni->release();
  298. pfad->release();
  299. }
  300. gruppeN->release();
  301. systemT.destroy();
  302. return 1;
  303. }
  304. void PatchServer::endUpdate( int gruppe )
  305. {
  306. Text *dgInitPfad = new Text( ini->zWert( "SystemPfad" )->getText() );
  307. dgInitPfad->append( "/datei_gruppe.ini" );
  308. InitDatei *dgInit = new InitDatei( dgInitPfad );
  309. dgInit->laden();
  310. Text *gT = new Text();
  311. gT->append( gruppe );
  312. Text *vT = new Text();
  313. vT->append( db->getDateiGruppeVersion( gruppe ) );
  314. if( !dgInit->wertExistiert( gT->getText() ) )
  315. dgInit->addWert( gT->getText(), vT->getText() );
  316. else
  317. dgInit->setWert( gT->getText(), vT->getText() );
  318. gT->release();
  319. vT->release();
  320. dgInit->speichern();
  321. dgInit->release();
  322. db->dateiGruppeUpdateFertig( id, gruppe );
  323. for( int i = 0; i < updateAnzahl; i++ )
  324. {
  325. if( updateGruppe->get( i ) == gruppe )
  326. {
  327. updateAnzahl--;
  328. updateGruppe->remove( i );
  329. break;
  330. }
  331. }
  332. }
  333. void PatchServer::updateAbbruch( int gruppe )
  334. {
  335. db->setDateiGruppe( id, gruppe, (bool)0 );
  336. for( int i = 0; i < updateAnzahl; i++ )
  337. {
  338. if( updateGruppe->get( i ) == gruppe )
  339. {
  340. updateAnzahl--;
  341. updateGruppe->remove( i );
  342. break;
  343. }
  344. }
  345. }
  346. // constant
  347. bool PatchServer::istAn() const
  348. {
  349. return db->serverIstNichtPausiert( id );
  350. }
  351. Server *PatchServer::zServer() const
  352. {
  353. return server;
  354. }
  355. PSDatenbank *PatchServer::zDB() const
  356. {
  357. return db;
  358. }
  359. bool PatchServer::hatClients() const
  360. {
  361. return klientAnzahl > 0;
  362. }
  363. int PatchServer::getId() const
  364. {
  365. return id;
  366. }
  367. char *PatchServer::getLetzterFehler() const
  368. {
  369. return fehler->getText();
  370. }
  371. bool PatchServer::proveVersion( int gruppe ) const
  372. {
  373. Result systemT = db->getSystemListe();
  374. for( int i = 0; i < systemT.zeilenAnzahl; i++ )
  375. {
  376. int system = TextZuInt( systemT.values[ i * 2 ].getText(), 10 );
  377. Result dateiT = db->getDateiListeOhneOrdner( system, gruppe );
  378. Text *gruppeN = db->getDateiGruppeName( gruppe );
  379. if( !gruppeN )
  380. continue;
  381. Text * pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
  382. pfad->append( "/" );
  383. pfad->append( gruppeN );
  384. pfad->append( "/" );
  385. pfad->append( systemT.values[ i * 2 + 1 ].getText() );
  386. pfad->append( "/version.ini" );
  387. InitDatei * vIni = new InitDatei( pfad );
  388. vIni->laden();
  389. int dAnz = vIni->getWertAnzahl();
  390. if( dAnz != dateiT.zeilenAnzahl ) // nicht aktuell
  391. {
  392. systemT.destroy();
  393. dateiT.destroy();
  394. vIni->release();
  395. return 0;
  396. }
  397. for( int j = 0; j < dAnz; j++ )
  398. {
  399. if( !vIni->wertExistiert( dateiT.values[ j * 2 ].getText() ) ) // nicht aktuell
  400. {
  401. systemT.destroy();
  402. dateiT.destroy();
  403. vIni->release();
  404. return 0;
  405. }
  406. if( !vIni->zWert( dateiT.values[ j * 2 ].getText() )->istGleich( dateiT.values[ j * 2 + 1 ].getText() ) ) // nicht aktuell
  407. {
  408. systemT.destroy();
  409. dateiT.destroy();
  410. vIni->release();
  411. return 0;
  412. }
  413. }
  414. dateiT.destroy();
  415. dateiT = db->getDeletedFiles( system, gruppe );
  416. for( int j = 0; j < dateiT.zeilenAnzahl; j++ )
  417. {
  418. if( vIni->wertExistiert( dateiT.values[ j ].getText() ) ) // nicht aktuell
  419. {
  420. systemT.destroy();
  421. dateiT.destroy();
  422. vIni->release();
  423. return 0;
  424. }
  425. }
  426. dateiT.destroy();
  427. vIni->release();
  428. }
  429. systemT.destroy();
  430. return 1;
  431. }
  432. bool PatchServer::proveVersion() const
  433. {
  434. Result gruppeT = db->getGruppeIds();
  435. for( int g = 0; g < gruppeT.zeilenAnzahl; g++ )
  436. {
  437. int gruppe = TextZuInt( gruppeT.values[ g ].getText(), 10 );
  438. Result systemT = db->getSystemListe();
  439. for( int i = 0; i < systemT.zeilenAnzahl; i++ )
  440. {
  441. int system = TextZuInt( systemT.values[ i * 2 ].getText(), 10 );
  442. Result dateiT = db->getDateiListeOhneOrdner( system, gruppe );
  443. Text *gruppeN = db->getDateiGruppeName( gruppe );
  444. if( !gruppeN )
  445. continue;
  446. Text * pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
  447. pfad->append( "/" );
  448. pfad->append( gruppeN );
  449. pfad->append( "/" );
  450. pfad->append( systemT.values[ i * 2 + 1 ].getText() );
  451. pfad->append( "/version.ini" );
  452. InitDatei * vIni = new InitDatei( pfad );
  453. vIni->laden();
  454. int dAnz = vIni->getWertAnzahl();
  455. if( dAnz != dateiT.zeilenAnzahl ) // nicht aktuell
  456. {
  457. gruppeT.destroy();
  458. systemT.destroy();
  459. dateiT.destroy();
  460. vIni->release();
  461. return 0;
  462. }
  463. for( int j = 0; j < dAnz; j++ )
  464. {
  465. if( !vIni->wertExistiert( dateiT.values[ j * 2 ].getText() ) ) // nicht aktuell
  466. {
  467. gruppeT.destroy();
  468. systemT.destroy();
  469. dateiT.destroy();
  470. vIni->release();
  471. return 0;
  472. }
  473. if( !vIni->zWert( dateiT.values[ j * 2 ].getText() )->istGleich( dateiT.values[ j * 2 + 1 ].getText() ) ) // nicht aktuell
  474. {
  475. gruppeT.destroy();
  476. systemT.destroy();
  477. dateiT.destroy();
  478. vIni->release();
  479. return 0;
  480. }
  481. }
  482. dateiT.destroy();
  483. dateiT = db->getDeletedFiles( system, gruppe );
  484. for( int j = 0; j < dateiT.zeilenAnzahl; j++ )
  485. {
  486. if( vIni->wertExistiert( dateiT.values[ j ].getText() ) ) // nicht aktuell
  487. {
  488. gruppeT.destroy();
  489. systemT.destroy();
  490. dateiT.destroy();
  491. vIni->release();
  492. return 0;
  493. }
  494. Text tmp = vIni->zPfad()->getText();
  495. tmp.remove( "version.ini" );
  496. tmp += dateiT.values[ j ].getText();
  497. if( DateiExistiert( tmp ) ) // nicht aktuell
  498. {
  499. gruppeT.destroy();
  500. systemT.destroy();
  501. dateiT.destroy();
  502. vIni->release();
  503. return 0;
  504. }
  505. }
  506. dateiT.destroy();
  507. vIni->release();
  508. }
  509. systemT.destroy();
  510. }
  511. gruppeT.destroy();
  512. return 1;
  513. }
  514. // Inhalt der PSAKlient Klasse aus PatchServer.h
  515. // Konstruktor
  516. PSAKlient::PSAKlient( SSLSKlient * klient, PatchServer * ps, InitDatei * ini )
  517. : Thread()
  518. {
  519. this->klient = klient;
  520. name = new Text( "" );
  521. passwort = new Text( "" );
  522. adminId = 0;
  523. updateGruppe = 0;
  524. gruppeN = 0;
  525. this->ps = ps;
  526. this->ini = ini;
  527. }
  528. // Destruktor
  529. PSAKlient::~PSAKlient()
  530. {
  531. klient->trenne();
  532. klient->release();
  533. ps->release();
  534. name->release();
  535. passwort->release();
  536. ini->release();
  537. if( gruppeN )
  538. gruppeN->release();
  539. }
  540. // nicht constant
  541. void PSAKlient::thread()
  542. {
  543. while( 1 )
  544. {
  545. char c = 0;
  546. if( !klient->getNachricht( &c, 1 ) )
  547. break;
  548. else
  549. {
  550. bool br = 0;
  551. switch( c )
  552. {
  553. case 1: // Login
  554. if( 1 )
  555. {
  556. klient->sende( "\1", 1 );
  557. unsigned char len = 0;
  558. klient->getNachricht( (char *)& len, 1 );
  559. char *n = new char[ len + 1 ];
  560. n[ (int)len ] = 0;
  561. if( len )
  562. klient->getNachricht( n, len );
  563. unsigned char pLen = 0;
  564. klient->getNachricht( (char *)& pLen, 1 );
  565. char *p = new char[ pLen + 1 ];
  566. p[ (int)pLen ] = 0;
  567. if( pLen )
  568. klient->getNachricht( p, pLen );
  569. int adminId = ps->zDB()->istAdministrator( n, p );
  570. if( adminId )
  571. {
  572. klient->sende( "\1", 1 );
  573. name->setText( n );
  574. passwort->setText( p );
  575. this->adminId = adminId;
  576. }
  577. else
  578. errorZuKlient( "Falsche Kombination aus Name und Passwort." );
  579. delete[] n;
  580. delete[] p;
  581. }
  582. break;
  583. case 2: // Logout
  584. adminId = 0;
  585. name->setText( "" );
  586. passwort->setText( "" );
  587. klient->sende( "\1", 1 );
  588. break;
  589. case 3: // Trennen
  590. br = 1;
  591. klient->sende( "\1", 1 );
  592. break;
  593. case 4: // Server starten
  594. if( !adminId )
  595. errorZuKlient( "Du musst dich einloggen." );
  596. else
  597. {
  598. if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSStarten ) )
  599. {
  600. if( !ps->serverStarten() )
  601. {
  602. Text *err = new Text();
  603. err->append( ps->getLetzterFehler() );
  604. errorZuKlient( err->getText() );
  605. err->release();
  606. }
  607. else
  608. klient->sende( "\1", 1 );
  609. }
  610. else
  611. errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
  612. }
  613. break;
  614. case 5: // Server beenden
  615. if( !adminId )
  616. errorZuKlient( "Du musst dich einloggen." );
  617. else
  618. {
  619. if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSBeenden ) )
  620. {
  621. if( ps->serverBeenden() )
  622. klient->sende( "\1", 1 );
  623. else
  624. {
  625. Text *err = new Text();
  626. err->append( ps->getLetzterFehler() );
  627. errorZuKlient( err->getText() );
  628. err->release();
  629. }
  630. }
  631. else
  632. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  633. }
  634. break;
  635. case 6: // Programm Schließen
  636. if( !adminId )
  637. errorZuKlient( "Du musst dich einloggen." );
  638. else
  639. {
  640. bool ok = 0;
  641. if( ps->isRunning() )
  642. {
  643. if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSBeenden ) )
  644. {
  645. if( ps->serverBeenden() )
  646. ok = 1;
  647. else
  648. {
  649. Text *err = new Text();
  650. err->append( ps->getLetzterFehler() );
  651. errorZuKlient( err->getText() );
  652. err->release();
  653. }
  654. }
  655. else
  656. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  657. }
  658. else
  659. ok = 1;
  660. if( ok &&ps->hatClients() )
  661. {
  662. errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
  663. break;
  664. }
  665. if( ok )
  666. {
  667. klient->sende( "\1", 1 );
  668. std::cout << "PS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  669. ps->close();
  670. br = 1;
  671. }
  672. }
  673. break;
  674. case 7: // Progtamm abstürzen
  675. if( !adminId )
  676. errorZuKlient( "Du musst dich einloggen." );
  677. else
  678. {
  679. bool ok = 0;
  680. if( ps->isRunning() )
  681. {
  682. if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSBeenden ) )
  683. {
  684. ps->serverBeenden();
  685. ok = 1;
  686. }
  687. else
  688. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  689. }
  690. else
  691. ok = 1;
  692. if( ok )
  693. {
  694. klient->sende( "\1", 1 );
  695. std::cout << "PS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  696. ps->close();
  697. br = 1;
  698. }
  699. }
  700. break;
  701. case 8: // Status Frage
  702. if( 1 )
  703. {
  704. char status = 0;
  705. if( ps->isRunning() )
  706. {
  707. status = 1;
  708. if( ps->istAn() )
  709. status = 2;
  710. }
  711. if( !ps->proveVersion() )
  712. status = 3;
  713. klient->sende( "\1", 1 );
  714. klient->sende( &status, 1 );
  715. }
  716. break;
  717. case 9: // Server pausieren
  718. if( !adminId )
  719. errorZuKlient( "Du musst dich einloggen." );
  720. else
  721. {
  722. klient->sende( "\1", 1 );
  723. char pause = 0;
  724. klient->getNachricht( &pause, 1 );
  725. if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSPausieren ) )
  726. {
  727. bool ok = 0;
  728. if( pause )
  729. ok = ps->serverPause();
  730. else
  731. ok = ps->serverFortsetzen();
  732. if( ok )
  733. klient->sende( "\1", 1 );
  734. else
  735. {
  736. Text *err = new Text();
  737. err->append( ps->getLetzterFehler() );
  738. errorZuKlient( err->getText() );
  739. err->release();
  740. }
  741. }
  742. else
  743. {
  744. if( pause )
  745. errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
  746. else
  747. errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
  748. }
  749. }
  750. break;
  751. case 0xA: // maximale Anzahl der Clients setzen
  752. if( !adminId )
  753. errorZuKlient( "Du musst dich einloggen." );
  754. else
  755. {
  756. klient->sende( "\1", 1 );
  757. int maxC = 0;
  758. klient->getNachricht( (char *)& maxC, 4 );
  759. if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSMCChange ) )
  760. {
  761. if( ps->setMaxKlients( maxC ) )
  762. klient->sende( "\1", 1 );
  763. else
  764. {
  765. Text *err = new Text();
  766. err->append( ps->getLetzterFehler() );
  767. errorZuKlient( err->getText() );
  768. err->release();
  769. }
  770. }
  771. else
  772. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern." );
  773. }
  774. break;
  775. case 0xB: // frage nach geänderten Dateien
  776. if( !adminId )
  777. {
  778. errorZuKlient( "Du musst dich einloggen." );
  779. break;
  780. }
  781. if( updateGruppe )
  782. {
  783. klient->sende( "\1", 1 );
  784. Result systemT = ps->zDB()->getSystemListe();
  785. for( int i = 0; i < systemT.zeilenAnzahl; i++ )
  786. {
  787. int len = systemT.values[ i * 2 + 1 ].getLength();
  788. klient->sende( (char *)& len, 4 );
  789. klient->sende( systemT.values[ i * 2 + 1 ].getText(), len );
  790. Result dateiT = ps->zDB()->getDateiListeOhneOrdner( TextZuInt( systemT.values[ i * 2 ].getText(), 10 ), updateGruppe );
  791. Text * pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
  792. pfad->append( "/" );
  793. pfad->append( gruppeN->getText() );
  794. pfad->append( "/" );
  795. pfad->append( systemT.values[ i * 2 + 1 ].getText() );
  796. pfad->append( "/version.ini" );
  797. InitDatei * vIni = new InitDatei( pfad );
  798. vIni->laden();
  799. for( int j = 0; j < dateiT.zeilenAnzahl; j++ )
  800. {
  801. bool veraltet = 0;
  802. if( !vIni->wertExistiert( dateiT.values[ j * 2 ].getText() ) )
  803. veraltet = 1;
  804. if( !veraltet && !vIni->zWert( dateiT.values[ j * 2 ].getText() )->istGleich( dateiT.values[ j * 2 + 1 ].getText() ) )
  805. veraltet = 1;
  806. if( veraltet )
  807. {
  808. int len = dateiT.values[ j * 2 ].getLength();
  809. klient->sende( (char *)& len, 4 );
  810. klient->sende( dateiT.values[ j * 2 ].getText(), len );
  811. }
  812. }
  813. klient->sende( "\0\0\0\0", 4 );
  814. dateiT.destroy();
  815. vIni->release();
  816. }
  817. klient->sende( "\0\0\0\0", 4 );
  818. systemT.destroy();
  819. }
  820. else
  821. errorZuKlient( "Du musst zunächst den Aktualisierungsvorgang starten." );
  822. break;
  823. case 0xC: // Update Beendet
  824. if( !adminId )
  825. errorZuKlient( "Du musst dich einloggen." );
  826. else
  827. {
  828. if( !updateGruppe )
  829. {
  830. errorZuKlient( "Du musst zunächst den Aktualisierungsvorgang starten." );
  831. break;
  832. }
  833. ps->endUpdate( updateGruppe );
  834. updateGruppe = 0;
  835. if( gruppeN )
  836. gruppeN = gruppeN->release();
  837. std::cout << "PS: Update erfolgreich abgeschlossen.\n";
  838. klient->sende( "\1", 1 );
  839. }
  840. break;
  841. case 0xD: // Update Vorgang starten
  842. if( !adminId )
  843. errorZuKlient( "Du musst dich einloggen." );
  844. else
  845. {
  846. if( updateGruppe )
  847. {
  848. errorZuKlient( "Du musst die Aktualisierung erst beenden." );
  849. break;
  850. }
  851. klient->sende( "\1", 1 );
  852. int dg = 0;
  853. klient->getNachricht( (char *)& dg, 4 );
  854. gruppeN = ps->zDB()->getDateiGruppeName( dg );
  855. if( !gruppeN )
  856. {
  857. updateGruppe = 0;
  858. errorZuKlient( "Die Dateigruppe existiert nicht." );
  859. break;
  860. }
  861. if( !ps->proveVersion() )
  862. {
  863. if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
  864. {
  865. if( ps->beginnUpdate( dg ) )
  866. {
  867. klient->sende( "\1", 1 );
  868. std::cout << "PS: Die Dateigruppe " << dg << " wird von Benutzer " << adminId << " geupdatet.\n";
  869. updateGruppe = dg;
  870. }
  871. else
  872. errorZuKlient( "Es läuft bereits eine andere Aktualisierung." );
  873. }
  874. else
  875. errorZuKlient( "Die Version ist bereits aktuel." );
  876. }
  877. else
  878. errorZuKlient( "Dir fehlt die Berechtigung für diesen Vorgang." );
  879. }
  880. break;
  881. case 0xE: // Datei übertragen
  882. if( !adminId )
  883. errorZuKlient( "Du musst dich einloggen." );
  884. else
  885. {
  886. if( !updateGruppe )
  887. {
  888. errorZuKlient( "Du musst zunächst den Aktualisierungsvorgang starten." );
  889. break;
  890. }
  891. klient->sende( "\1", 1 );
  892. int system = 0;
  893. klient->getNachricht( (char *)& system, 4 );
  894. int version = 0;
  895. klient->getNachricht( (char *)& version, 4 );
  896. Text *sName = ps->zDB()->getSystemName( system );
  897. unsigned short len = 0;
  898. klient->getNachricht( (char *)& len, 2 );
  899. char *pfad = new char[ len + 1 ];
  900. pfad[ len ] = 0;
  901. if( len )
  902. klient->getNachricht( pfad, len );
  903. if( !len || !sName )
  904. {
  905. errorZuKlient( "Die Datei konnte nicht angelegt werden." );
  906. delete[] pfad;
  907. if( sName )
  908. sName->release();
  909. break;
  910. }
  911. Text *pf = new Text( ini->zWert( "SystemPfad" )->getText() );
  912. pf->append( "/" );
  913. pf->append( gruppeN->getText() );
  914. pf->append( "/" );
  915. pf->append( sName->getText() );
  916. sName->release();
  917. pf->append( "/version.ini" );
  918. InitDatei *vIni = new InitDatei( pf->getText() );
  919. vIni->laden();
  920. pf->remove( pf->getLength() - 11, pf->getLength() );
  921. pf->append( pfad );
  922. Datei *d = new Datei();
  923. d->setDatei( pf );
  924. d->erstellen();
  925. if( d->open( Datei::Style::schreiben ) )
  926. {
  927. klient->sende( "\1", 1 );
  928. klient->getNachricht( (char *)& len, 2 );
  929. while( len )
  930. {
  931. char *buff = new char[ len ];
  932. klient->getNachricht( buff, len );
  933. d->schreibe( buff, len );
  934. delete[] buff;
  935. klient->getNachricht( (char *)& len, 2 );
  936. ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
  937. ps->addGesendet( klient->getUploadBytes( 1 ) );
  938. }
  939. klient->sende( "\1", 1 );
  940. Text *vT = new Text();
  941. vT->append( version );
  942. if( !vIni->wertExistiert( pfad ) )
  943. vIni->addWert( pfad, vT->getText() );
  944. else
  945. vIni->setWert( pfad, vT->getText() );
  946. vIni->speichern();
  947. vT->release();
  948. }
  949. else
  950. errorZuKlient( "Die Datei konnte nicht zum schreiben geöffnet werden." );
  951. d->close();
  952. d->release();
  953. vIni->release();
  954. delete[] pfad;
  955. }
  956. break;
  957. case 0xF: // klient absturtz
  958. if( !adminId )
  959. errorZuKlient( "Du musst dich einloggen." );
  960. else
  961. {
  962. klient->sende( "\1", 1 );
  963. int klientId = 0;
  964. klient->getNachricht( (char *)& klientId, 4 );
  965. if( klientId &&ps->absturzKlient( klientId ) )
  966. klient->sende( "\1", 1 );
  967. else
  968. klient->sende( "\0", 1 );
  969. }
  970. break;
  971. case 0x10: // SMP Frage nach Datei Gruppen Status
  972. if( !adminId )
  973. errorZuKlient( "Du musst dich einloggen." );
  974. else
  975. {
  976. if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
  977. errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
  978. else
  979. {
  980. Array< FileGroupInfo * > list;
  981. if( ps->zDB()->getFileGroupInfoList( ps->getId(), &list ) )
  982. {
  983. klient->sende( "\1", 1 );
  984. int anz = list.getEintragAnzahl();
  985. klient->sende( (char *)& anz, 4 );
  986. for( int i = 0; i < anz; i++ )
  987. {
  988. FileGroupInfo *info = list.get( i );
  989. klient->sende( (char *)& info->id, 4 );
  990. unsigned char len = (unsigned char)info->name.getLength();
  991. klient->sende( (char *)& len, 1 );
  992. klient->sende( info->name, len );
  993. len = (unsigned char)info->status.getLength();
  994. klient->sende( (char *)& len, 1 );
  995. klient->sende( info->status, len );
  996. unsigned short l = (unsigned short)info->pfad.getLength();
  997. klient->sende( (char *)& l, 2 );
  998. klient->sende( info->pfad, l );
  999. klient->sende( (char *)& info->version, 4 );
  1000. delete info;
  1001. }
  1002. }
  1003. else
  1004. errorZuKlient( "Fehler beim abrufen der Datei Gruppen Informationen." );
  1005. }
  1006. }
  1007. break;
  1008. case 0x11: // SMP Get System List
  1009. if( !adminId )
  1010. errorZuKlient( "Du musst dich einloggen." );
  1011. else
  1012. {
  1013. if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
  1014. errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
  1015. else
  1016. {
  1017. klient->sende( "\1", 1 );
  1018. Result res = ps->zDB()->getSystemListe();
  1019. klient->sende( (char *)& res.zeilenAnzahl, 4 );
  1020. for( int i = 0; i < res.zeilenAnzahl; i++ )
  1021. {
  1022. int id = res.values[ i * 2 ];
  1023. klient->sende( (char *)& id, 4 );
  1024. unsigned char len = (unsigned char)res.values[ i * 2 + 1 ].getLength();
  1025. klient->sende( (char *)& len, 1 );
  1026. klient->sende( res.values[ i * 2 + 1 ], len );
  1027. }
  1028. res.destroy();
  1029. }
  1030. }
  1031. break;
  1032. case 0x12: // SMP Get File List
  1033. if( !adminId )
  1034. errorZuKlient( "Du musst dich einloggen." );
  1035. else
  1036. {
  1037. if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
  1038. errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
  1039. else
  1040. {
  1041. klient->sende( "\1", 1 );
  1042. int system, group;
  1043. klient->getNachricht( (char *)& system, 4 );
  1044. klient->getNachricht( (char *)& group, 4 );
  1045. Result res = ps->zDB()->getDateiListeSMP( system, group );
  1046. klient->sende( (char *)& res.zeilenAnzahl, 4 );
  1047. for( int i = 0; i < res.zeilenAnzahl; i++ )
  1048. {
  1049. int id = res.values[ i * 4 ];
  1050. klient->sende( (char *)& id, 4 );
  1051. unsigned short len = (unsigned short)res.values[ i * 4 + 1 ].getLength();
  1052. klient->sende( (char *)& len, 2 );
  1053. klient->sende( res.values[ i * 4 + 1 ], len );
  1054. int version = res.values[ i * 4 + 2 ];
  1055. klient->sende( (char *)& version, 4 );
  1056. unsigned char l = (unsigned char)res.values[ i * 4 + 3 ].getLength();
  1057. klient->sende( (char *)& l, 1 );
  1058. klient->sende( res.values[ i * 4 + 3 ], l );
  1059. }
  1060. res.destroy();
  1061. }
  1062. }
  1063. break;
  1064. case 0x13: // Get File Version
  1065. if( !adminId )
  1066. errorZuKlient( "Du musst dich einloggen." );
  1067. else
  1068. {
  1069. if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
  1070. errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
  1071. else
  1072. {
  1073. klient->sende( "\1", 1 );
  1074. int group, system;
  1075. unsigned short len;
  1076. klient->getNachricht( (char *)& len, 2 );
  1077. char *path = new char[ len + 1 ];
  1078. klient->getNachricht( path, len );
  1079. path[ len ] = 0;
  1080. klient->getNachricht( (char *)& group, 4 );
  1081. klient->getNachricht( (char *)& system, 4 );
  1082. int version = ps->zDB()->getDateiVersion( path, system, group );
  1083. delete[] path;
  1084. klient->sende( (char *)& version, 4 );
  1085. }
  1086. }
  1087. break;
  1088. case 0x14: // Update File
  1089. if( !adminId )
  1090. errorZuKlient( "Du musst dich einloggen." );
  1091. else
  1092. {
  1093. if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
  1094. errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
  1095. else
  1096. {
  1097. klient->sende( "\1", 1 );
  1098. unsigned short len;
  1099. klient->getNachricht( (char *)& len, 2 );
  1100. char *path = new char[ len + 1 ];
  1101. klient->getNachricht( path, len );
  1102. path[ len ] = 0;
  1103. unsigned char l;
  1104. klient->getNachricht( (char *)& l, 1 );
  1105. char *time = new char[ l + 1 ];
  1106. klient->getNachricht( time, l );
  1107. time[ l ] = 0;
  1108. int system, gruppe;
  1109. klient->getNachricht( (char *)& system, 4 );
  1110. klient->getNachricht( (char *)& gruppe, 4 );
  1111. if( ps->zDB()->updateDatei( path, time, system, gruppe ) )
  1112. klient->sende( "\1", 1 );
  1113. else
  1114. errorZuKlient( "Fehler beim updaten der Datei." );
  1115. }
  1116. }
  1117. break;
  1118. case 0x15: // Update Gruppe
  1119. if( !adminId )
  1120. errorZuKlient( "Du musst dich einloggen." );
  1121. else
  1122. {
  1123. if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
  1124. errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
  1125. else
  1126. {
  1127. klient->sende( "\1", 1 );
  1128. int gruppe;
  1129. klient->getNachricht( (char *)& gruppe, 4 );
  1130. if( ps->zDB()->dateiGruppeUpdate( gruppe ) )
  1131. klient->sende( "\1", 1 );
  1132. else
  1133. errorZuKlient( "Fehler beim updaten der Gruppe." );
  1134. }
  1135. }
  1136. break;
  1137. default:
  1138. errorZuKlient( "Unbekannte Nachricht!" );
  1139. break;
  1140. }
  1141. if( br )
  1142. break;
  1143. ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1144. ps->addGesendet( klient->getUploadBytes( 1 ) );
  1145. }
  1146. }
  1147. ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1148. ps->addGesendet( klient->getUploadBytes( 1 ) );
  1149. if( updateGruppe )
  1150. ps->updateAbbruch( updateGruppe );
  1151. delete this;
  1152. }
  1153. void PSAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  1154. {
  1155. klient->sende( "\3", 1 );
  1156. char len = (char)textLength( nachricht );
  1157. klient->sende( &len, 1 );
  1158. klient->sende( nachricht, len );
  1159. }
  1160. // Inhalt der PSKlient aus PatchServer.h
  1161. // Konstruktor
  1162. PSKlient::PSKlient( SKlient * klient, PatchServer * ps, InitDatei * ini )
  1163. : Thread()
  1164. {
  1165. this->klient = klient;
  1166. unsigned char key[ 20 ] = { 102, 139, 140, 143, 52, 52, 194, 167, 97, 106, 23, 72, 170, 121, 213, 178, 28, 28, 124, 185 };
  1167. klient->setSendeKey( (char *)key, 20 );
  1168. klient->setEmpfangKey( (char *)key, 20 );
  1169. klientNummer = 0;
  1170. system = 0;
  1171. this->ps = ps;
  1172. this->ini = ini;
  1173. encrypted = 0;
  1174. }
  1175. // Destruktor
  1176. PSKlient::~PSKlient()
  1177. {
  1178. ps->release();
  1179. klient->release();
  1180. ini->release();
  1181. }
  1182. // nicht constant
  1183. void PSKlient::absturz()
  1184. {
  1185. ende();
  1186. klient->trenne();
  1187. ps->zDB()->unregisterKlient( klientNummer, ps->getId() );
  1188. }
  1189. void PSKlient::thread()
  1190. {
  1191. int hack = 0;
  1192. while( 1 )
  1193. {
  1194. char c = 0;
  1195. if( ( !encrypted && !klient->getNachricht( &c, 1 ) ) || ( encrypted && !klient->getNachrichtEncrypted( &c, 1 ) ) )
  1196. break;
  1197. else
  1198. {
  1199. bool br = 0;
  1200. switch( c )
  1201. {
  1202. case 0:
  1203. encrypted = 1;
  1204. break;
  1205. case 1: // Klient identifikation
  1206. if( encrypted )
  1207. {
  1208. klient->getNachrichtEncrypted( (char *)& klientNummer, 4 );
  1209. klient->getNachrichtEncrypted( (char *)& system, 1 );
  1210. }
  1211. else
  1212. {
  1213. klient->getNachricht( (char *)& klientNummer, 4 );
  1214. klient->getNachricht( (char *)& system, 1 );
  1215. }
  1216. if( !ps->zDB()->proveKlient( klientNummer, ps->getId() ) )
  1217. {
  1218. klientNummer = 0;
  1219. errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
  1220. }
  1221. else
  1222. {
  1223. if( encrypted )
  1224. {
  1225. Text *key = ps->zDB()->getKlientKey( klientNummer );
  1226. if( !key )
  1227. errorZuKlient( "Es konnte kein Key ermittelt werden." );
  1228. else
  1229. {
  1230. klient->sendeEncrypted( "\1", 1 );
  1231. klient->setEmpfangKey( *key, key->getLength() );
  1232. klient->setSendeKey( *key, key->getLength() );
  1233. key->release();
  1234. }
  1235. }
  1236. else
  1237. klient->sende( "\1", 1 );
  1238. }
  1239. break;
  1240. case 2: // Erhaltung Server message
  1241. if( 1 )
  1242. {
  1243. char befehl = 0;
  1244. if( encrypted )
  1245. klient->getNachrichtEncrypted( &befehl, 1 );
  1246. else
  1247. klient->getNachricht( &befehl, 1 );
  1248. switch( befehl )
  1249. {
  1250. case 2: // Klient absturz
  1251. if( 1 )
  1252. {
  1253. int klientId = 0;
  1254. if( encrypted )
  1255. {
  1256. klient->getNachrichtEncrypted( (char *)& klientId, 4 );
  1257. if( klientId &&ps->absturzKlient( klientId ) )
  1258. klient->sendeEncrypted( "\1", 1 );
  1259. else
  1260. klient->sendeEncrypted( "\0", 1 );
  1261. }
  1262. else
  1263. {
  1264. klient->getNachricht( (char *)& klientId, 4 );
  1265. if( klientId &&ps->absturzKlient( klientId ) )
  1266. klient->sende( "\1", 1 );
  1267. else
  1268. klient->sende( "\0", 1 );
  1269. }
  1270. }
  1271. break;
  1272. default:
  1273. errorZuKlient( "Befehl nicht bekannt!" );
  1274. break;
  1275. }
  1276. }
  1277. break;
  1278. case 3: // Verbindungsende
  1279. br = 1;
  1280. if( encrypted )
  1281. klient->sendeEncrypted( "\1", 1 );
  1282. else
  1283. klient->sende( "\1", 1 );
  1284. break;
  1285. case 4: // unregister Klient
  1286. if( klientNummer )
  1287. {
  1288. ps->zDB()->unregisterKlient( klientNummer, ps->getId() );
  1289. if( encrypted )
  1290. klient->sendeEncrypted( "\1", 1 );
  1291. else
  1292. klient->sende( "\1", 1 );
  1293. }
  1294. else
  1295. errorZuKlient( "Du bist nicht Identifiziert." );
  1296. break;
  1297. case 5: // update anfrage ****Altes Update System
  1298. if( klientNummer )
  1299. { // Keine Verkeyung bei den alten Clients
  1300. klient->sende( "\1", 1 );
  1301. char version[ 4 ];
  1302. klient->getNachricht( version, 4 );
  1303. //int v = ( ( version[ 3 ] << 24 ) & 0xFF000000 ) | ( ( version[ 2 ] << 16 ) & 0x00FF0000 ) | ( ( version[ 1 ] << 8 ) & 0x0000FF00 ) | ( version[ 0 ] & 0x000000FF );
  1304. //Result änderungen = ps->zDB()->getGeänderteDateien( v, (int)X64 + 1 );
  1305. char byte = 0;
  1306. // ********neu beginn*********
  1307. klient->sende( "\2", 1 );
  1308. Text *pfad = new Text( "start.exe" );
  1309. byte = (char)pfad->getLength();
  1310. klient->sende( &byte, 1 );
  1311. klient->sende( pfad->getText(), byte );
  1312. klient->sende( "\2", 1 );
  1313. pfad->setText( "framework.dll" );
  1314. byte = (char)pfad->getLength();
  1315. klient->sende( &byte, 1 );
  1316. klient->sende( pfad->getText(), byte );
  1317. klient->sende( "\2", 1 );
  1318. pfad->setText( "network.dll" );
  1319. byte = (char)pfad->getLength();
  1320. klient->sende( &byte, 1 );
  1321. klient->sende( pfad->getText(), byte );
  1322. klient->sende( "\2", 1 );
  1323. pfad->setText( "data/patch/bin/patcher.exe" );
  1324. byte = (char)pfad->getLength();
  1325. klient->sende( &byte, 1 );
  1326. klient->sende( pfad->getText(), byte );
  1327. klient->sende( "\2", 1 );
  1328. pfad->setText( "data/patch/bin/übernehmen.exe" );
  1329. byte = (char)pfad->getLength();
  1330. klient->sende( &byte, 1 );
  1331. klient->sende( pfad->getText(), byte );
  1332. klient->sende( "\2", 1 );
  1333. pfad->setText( "data/start/icon.exe" );
  1334. byte = (char)pfad->getLength();
  1335. klient->sende( &byte, 1 );
  1336. klient->sende( pfad->getText(), byte );
  1337. klient->sende( "\2", 1 );
  1338. pfad->setText( "data/optionen.ini" );
  1339. byte = (char)pfad->getLength();
  1340. klient->sende( &byte, 1 );
  1341. klient->sende( pfad->getText(), byte );
  1342. pfad->release();
  1343. klient->sende( "\4", 1 );
  1344. // ********neu ende********
  1345. //for( int i = 0; i < änderungen.zeilenAnzahl; i++ )
  1346. //{
  1347. // if( änderungen.values[ i * 2 + 1 ].istGleich( "t" ) )
  1348. // byte = 1;
  1349. // else
  1350. // byte = 2;
  1351. // klient->sende( &byte, 1 );
  1352. // byte = änderungen.values[ i * 2 ].getLength();
  1353. // klient->sende( &byte, 1 );
  1354. // klient->sende( änderungen.values[ i * 2 ].getText(), byte );
  1355. //}
  1356. //änderungen.destroy();
  1357. //Result remove = ps->zDB()->getGelöschteDateien( v, (int)X64 + 1 );
  1358. //for( int i = 0; i < remove.zeilenAnzahl; i++ )
  1359. //{
  1360. // klient->sende( "\3", 1 );
  1361. // byte = remove.values[ i * 2 ].getLength();
  1362. // klient->sende( &byte, 1 );
  1363. // klient->sende( remove.values[ i * 2 ].getText(), byte );
  1364. //}
  1365. //klient->sende( "\4", 1 );
  1366. //remove.destroy();
  1367. }
  1368. else
  1369. errorZuKlient( "Du bist nicht Identifiziert." );
  1370. break;
  1371. case 6: // Frage nach Datei ****Altes Update System
  1372. if( 1 )
  1373. { // Keine Verkeyung bei den alten Clients
  1374. if( !klientNummer )
  1375. {
  1376. errorZuKlient( "Du bist nicht Identifiziert." );
  1377. break;
  1378. }
  1379. klient->sende( "\1", 1 );
  1380. unsigned char byte = 0;
  1381. klient->getNachricht( (char *)& byte, 1 );
  1382. Text *pfad = new Text( "" );
  1383. pfad->fillText( ' ', byte );
  1384. klient->getNachricht( pfad->getText(), byte );
  1385. __int64 pos = 0;
  1386. klient->getNachricht( (char *)& pos, 8 );
  1387. if( system )
  1388. pfad->insert( 0, "../versions/x64/live/" );
  1389. else
  1390. pfad->insert( 0, "../versions/x32/live/" );
  1391. pfad->ersetzen( "ü", "ue" );
  1392. Datei * datei = new Datei();
  1393. datei->setDatei( pfad );
  1394. datei->open( Datei::Style::lesen );
  1395. if( pos )
  1396. datei->setLPosition( pos, 0 );
  1397. __int64 length = datei->getSize();
  1398. length -= pos;
  1399. char *bytes = new char[ 2048 ];
  1400. unsigned short byteLen = 0;
  1401. while( 1 )
  1402. {
  1403. if( !length )
  1404. {
  1405. klient->sende( "\0\0", 2 );
  1406. break;
  1407. }
  1408. byteLen = 2048;
  1409. if( length < 2048 )
  1410. byteLen = (unsigned short)length;
  1411. klient->sende( (char *)& byteLen, 2 );
  1412. datei->lese( bytes, byteLen );
  1413. klient->sende( bytes, byteLen );
  1414. length -= byteLen;
  1415. char ret = 0;
  1416. if( byteLen != 2048 )
  1417. break;
  1418. klient->getNachricht( (char *)& ret, 1 );
  1419. ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1420. ps->addGesendet( klient->getUploadBytes( 1 ) );
  1421. if( ret == 1 )
  1422. continue;
  1423. if( !ret )
  1424. break;
  1425. if( ret == 2 )
  1426. {
  1427. pos = 0;
  1428. klient->getNachricht( (char *)& pos, 8 );
  1429. if( pos > length )
  1430. pos = length;
  1431. datei->setLPosition( pos, 0 );
  1432. length = datei->getSize();
  1433. length -= pos;
  1434. }
  1435. }
  1436. delete[]bytes;
  1437. datei->close();
  1438. datei->release();
  1439. }
  1440. break;
  1441. case 7: // Frage nach neuster Version ****Altes Update System
  1442. if( 1 )
  1443. { // Keine Verkeyung bei den alten Clients
  1444. if( !klientNummer )
  1445. {
  1446. errorZuKlient( "Du bist nicht Identifiziert." );
  1447. break;
  1448. }
  1449. klient->sende( "\1", 1 );
  1450. int version = 30;
  1451. klient->sende( (char *)& version, 4 );
  1452. }
  1453. break;
  1454. case 8: // Frage nach Dateigröße ****Altes Update System
  1455. if( 1 )
  1456. { // Keine Verkeyung bei den alten Clients
  1457. if( !klientNummer )
  1458. {
  1459. errorZuKlient( "Du bist nicht Identifiziert." );
  1460. break;
  1461. }
  1462. klient->sende( "\1", 1 );
  1463. char byte = 0;
  1464. klient->getNachricht( &byte, 1 );
  1465. Text *pfad = new Text( "" );
  1466. pfad->fillText( ' ', byte );
  1467. klient->getNachricht( pfad->getText(), byte );
  1468. if( system )
  1469. pfad->insert( 0, "../versions/x64/live/" );
  1470. else
  1471. pfad->insert( 0, "../versions/x32/live/" );
  1472. pfad->ersetzen( "ü", "ue" );
  1473. Datei * datei = new Datei();
  1474. datei->setDatei( pfad );
  1475. __int64 size = datei->getSize();
  1476. datei->release();
  1477. klient->sende( (char *)& size, 8 );
  1478. }
  1479. break;
  1480. case 9: // Frage nach Dateiliste ****Neues Update System
  1481. if( 1 )
  1482. {
  1483. if( !klientNummer )
  1484. {
  1485. errorZuKlient( "Du bist nicht Identifiziert." );
  1486. break;
  1487. }
  1488. if( encrypted )
  1489. klient->sendeEncrypted( "\1", 1 );
  1490. else
  1491. klient->sende( "\1", 1 );
  1492. int updateGruppe = 0;
  1493. if( encrypted )
  1494. klient->getNachrichtEncrypted( (char *)& updateGruppe, 4 );
  1495. else
  1496. klient->getNachricht( (char *)& updateGruppe, 4 );
  1497. Result dateien = ps->zDB()->getDateiListeOhneOrdner( system, updateGruppe );
  1498. if( !dateien.zeilenAnzahl )
  1499. {
  1500. dateien.destroy();
  1501. errorZuKlient( "Dein System wird nicht unterstützt." );
  1502. break;
  1503. }
  1504. Result deleted = ps->zDB()->getDeletedFiles( system, updateGruppe );
  1505. if( encrypted )
  1506. klient->sendeEncrypted( "\1", 1 );
  1507. else
  1508. klient->sende( "\1", 1 );
  1509. for( int i = 0; i < dateien.zeilenAnzahl; i++ )
  1510. {
  1511. int len = dateien.values[ i * 2 ].getLength();
  1512. if( !len )
  1513. break;
  1514. if( encrypted )
  1515. {
  1516. klient->sendeEncrypted( (char *)& len, 4 );
  1517. klient->sendeEncrypted( dateien.values[ i * 2 ].getText(), len );
  1518. int version = TextZuInt( dateien.values[ i * 2 + 1 ].getText(), 10 );
  1519. klient->sendeEncrypted( (char *)& version, 4 );
  1520. }
  1521. else
  1522. {
  1523. klient->sende( (char *)& len, 4 );
  1524. klient->sende( dateien.values[ i * 2 ].getText(), len );
  1525. int version = TextZuInt( dateien.values[ i * 2 + 1 ].getText(), 10 );
  1526. klient->sende( (char *)& version, 4 );
  1527. }
  1528. }
  1529. if( encrypted )
  1530. klient->sendeEncrypted( "\0\0\0\0", 4 );
  1531. else
  1532. klient->sende( "\0\0\0\0", 4 );
  1533. for( int i = 0; i < deleted.zeilenAnzahl; i++ )
  1534. {
  1535. int len = deleted.values[ i ].getLength();
  1536. if( !len )
  1537. break;
  1538. if( encrypted )
  1539. {
  1540. klient->sendeEncrypted( (char *)& len, 4 );
  1541. klient->sendeEncrypted( deleted.values[ i ].getText(), len );
  1542. }
  1543. else
  1544. {
  1545. klient->sende( (char *)& len, 4 );
  1546. klient->sende( deleted.values[ i ].getText(), len );
  1547. }
  1548. }
  1549. if( encrypted )
  1550. klient->sendeEncrypted( "\0\0\0\0", 4 );
  1551. else
  1552. klient->sende( "\0\0\0\0", 4 );
  1553. deleted.destroy();
  1554. dateien.destroy();
  1555. }
  1556. break;
  1557. case 10: // Frage nach Dateigröße ****Neues Update System
  1558. if( 1 )
  1559. {
  1560. if( !klientNummer )
  1561. {
  1562. errorZuKlient( "Du bist nicht Identifiziert." );
  1563. break;
  1564. }
  1565. if( encrypted )
  1566. klient->sendeEncrypted( "\1", 1 );
  1567. else
  1568. klient->sende( "\1", 1 );
  1569. int updateGruppe = 0;
  1570. if( encrypted )
  1571. klient->getNachrichtEncrypted( (char *)& updateGruppe, 4 );
  1572. else
  1573. klient->getNachricht( (char *)& updateGruppe, 4 );
  1574. if( !ps->zDB()->supportedDateiGruppe( ps->getId(), updateGruppe ) )
  1575. {
  1576. int s = ps->zDB()->getDateiGruppePatchServer( klientNummer, updateGruppe );
  1577. int port = 0;
  1578. Text *ip = new Text();
  1579. bool ok = ps->zDB()->getPatchServerPortIp( s, &port, ip );
  1580. if( !s || !ok )
  1581. errorZuKlient( "Es ist momentan nicht möglich diese Datei herunterzuladen." );
  1582. else
  1583. {
  1584. if( encrypted )
  1585. {
  1586. klient->sendeEncrypted( "\2", 1 );
  1587. klient->sendeEncrypted( (char *)& port, 4 );
  1588. int len = ip->getLength();
  1589. klient->sendeEncrypted( (char *)& len, 4 );
  1590. klient->sendeEncrypted( (char *)ip->getText(), len );
  1591. }
  1592. else
  1593. {
  1594. klient->sende( "\2", 1 );
  1595. klient->sende( (char *)& port, 4 );
  1596. int len = ip->getLength();
  1597. klient->sende( (char *)& len, 4 );
  1598. klient->sende( (char *)ip->getText(), len );
  1599. }
  1600. }
  1601. ip->release();
  1602. break;
  1603. }
  1604. Text *gruppeN = ps->zDB()->getDateiGruppeName( updateGruppe );
  1605. if( !gruppeN )
  1606. {
  1607. errorZuKlient( "Dein System wird nicht unterstützt." );
  1608. break;
  1609. }
  1610. Text *pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
  1611. pfad->append( "/" );
  1612. pfad->append( gruppeN );
  1613. pfad->append( "/" );
  1614. Text *tmp = ps->zDB()->getSystemName( system );
  1615. if( !tmp )
  1616. {
  1617. errorZuKlient( "Dein System wird nicht unterstützt." );
  1618. pfad->release();
  1619. break;
  1620. }
  1621. pfad->append( tmp );
  1622. pfad->append( "/" );
  1623. if( encrypted )
  1624. klient->sendeEncrypted( "\1", 1 );
  1625. else
  1626. klient->sende( "\1", 1 );
  1627. int len = 0;
  1628. if( encrypted )
  1629. klient->getNachrichtEncrypted( (char *)& len, 4 );
  1630. else
  1631. klient->getNachricht( (char *)& len, 4 );
  1632. char *pf = new char[ len + 1 ];
  1633. pf[ len ] = 0;
  1634. if( encrypted )
  1635. klient->getNachrichtEncrypted( pf, len );
  1636. else
  1637. klient->getNachricht( pf, len );
  1638. pfad->append( pf );
  1639. delete[] pf;
  1640. Datei * datei = new Datei();
  1641. datei->setDatei( pfad );
  1642. __int64 size = datei->getSize();
  1643. datei->release();
  1644. if( encrypted )
  1645. klient->sendeEncrypted( (char *)& size, 8 );
  1646. else
  1647. klient->sende( (char *)& size, 8 );
  1648. }
  1649. break;
  1650. case 11: // Frage nach Datei ****Neues Update System
  1651. if( 1 )
  1652. {
  1653. if( !klientNummer )
  1654. {
  1655. errorZuKlient( "Du bist nicht Identifiziert." );
  1656. break;
  1657. }
  1658. if( encrypted )
  1659. klient->sendeEncrypted( "\1", 1 );
  1660. else
  1661. klient->sende( "\1", 1 );
  1662. int updateGruppe = 0;
  1663. if( encrypted )
  1664. klient->getNachrichtEncrypted( (char *)& updateGruppe, 4 );
  1665. else
  1666. klient->getNachricht( (char *)& updateGruppe, 4 );
  1667. if( !ps->zDB()->supportedDateiGruppe( ps->getId(), updateGruppe ) )
  1668. {
  1669. int s = ps->zDB()->getDateiGruppePatchServer( klientNummer, updateGruppe );
  1670. int port = 0;
  1671. Text *ip = new Text();
  1672. bool ok = ps->zDB()->getPatchServerPortIp( s, &port, ip );
  1673. if( !s || !ok )
  1674. errorZuKlient( "Es ist momentan nicht möglich diese Datei herunterzuladen." );
  1675. else
  1676. {
  1677. if( encrypted )
  1678. {
  1679. klient->sendeEncrypted( "\2", 1 );
  1680. klient->sendeEncrypted( (char *)& port, 4 );
  1681. int len = ip->getLength();
  1682. klient->sendeEncrypted( (char *)& len, 4 );
  1683. klient->sendeEncrypted( (char *)ip->getText(), len );
  1684. }
  1685. else
  1686. {
  1687. klient->sende( "\2", 1 );
  1688. klient->sende( (char *)& port, 4 );
  1689. int len = ip->getLength();
  1690. klient->sende( (char *)& len, 4 );
  1691. klient->sende( (char *)ip->getText(), len );
  1692. }
  1693. }
  1694. ip->release();
  1695. break;
  1696. }
  1697. Text *gruppeN = ps->zDB()->getDateiGruppeName( updateGruppe );
  1698. if( !gruppeN )
  1699. {
  1700. errorZuKlient( "Dein System wird nicht unterstützt." );
  1701. break;
  1702. }
  1703. Text *pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
  1704. pfad->append( "/" );
  1705. pfad->append( gruppeN );
  1706. pfad->append( "/" );
  1707. Text *tmp = ps->zDB()->getSystemName( system );
  1708. if( !tmp )
  1709. {
  1710. errorZuKlient( "Dein System wird nicht unterstützt." );
  1711. pfad->release();
  1712. break;
  1713. }
  1714. pfad->append( tmp );
  1715. pfad->append( "/" );
  1716. if( encrypted )
  1717. klient->sendeEncrypted( "\1", 1 );
  1718. else
  1719. klient->sende( "\1", 1 );
  1720. int len = 0;
  1721. if( encrypted )
  1722. klient->getNachrichtEncrypted( (char *)& len, 4 );
  1723. else
  1724. klient->getNachricht( (char *)& len, 4 );
  1725. char *pf = new char[ len + 1 ];
  1726. pf[ len ] = 0;
  1727. if( encrypted )
  1728. klient->getNachrichtEncrypted( pf, len );
  1729. else
  1730. klient->getNachricht( pf, len );
  1731. pfad->append( pf );
  1732. delete[] pf;
  1733. __int64 pos = 0;
  1734. if( encrypted )
  1735. klient->getNachrichtEncrypted( (char *)& pos, 8 );
  1736. else
  1737. klient->getNachricht( (char *)& pos, 8 );
  1738. Datei * datei = new Datei();
  1739. datei->setDatei( pfad );
  1740. datei->open( Datei::Style::lesen );
  1741. if( pos )
  1742. datei->setLPosition( pos, 0 );
  1743. __int64 length = datei->getSize();
  1744. length -= pos;
  1745. char *bytes = new char[ 2048 ];
  1746. unsigned short byteLen = 0;
  1747. while( 1 )
  1748. {
  1749. if( !length )
  1750. {
  1751. klient->sende( "\0\0", 2 );
  1752. break;
  1753. }
  1754. byteLen = 2048;
  1755. if( length < 2048 )
  1756. byteLen = (unsigned short)length;
  1757. if( !klient->sende( (char *)&byteLen, 2 ) )
  1758. break;
  1759. datei->lese( bytes, byteLen );
  1760. if( !klient->sende( bytes, byteLen ) )
  1761. break;
  1762. length -= byteLen;
  1763. if( byteLen != 2048 )
  1764. break;
  1765. ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1766. ps->addGesendet( klient->getUploadBytes( 1 ) );
  1767. }
  1768. char ret = 0;
  1769. if( encrypted )
  1770. klient->getNachrichtEncrypted( &ret, 1 );
  1771. else
  1772. klient->getNachricht( &ret, 1 );
  1773. delete[] bytes;
  1774. datei->close();
  1775. datei->release();
  1776. }
  1777. break;
  1778. case 12: // Frage nach Datei Gruppen Liste ****Neues Update System
  1779. if( 1 )
  1780. {
  1781. if( !klientNummer )
  1782. {
  1783. errorZuKlient( "Du bist nicht Identifiziert." );
  1784. break;
  1785. }
  1786. if( encrypted )
  1787. klient->sendeEncrypted( "\1", 1 );
  1788. else
  1789. klient->sende( "\1", 1 );
  1790. Result dgl = ps->zDB()->getDateiGruppeListe();
  1791. for( int i = 0; i < dgl.zeilenAnzahl; i++ )
  1792. {
  1793. if( encrypted )
  1794. {
  1795. int id = TextZuInt( dgl.values[ i * 3 ].getText(), 10 );
  1796. klient->sendeEncrypted( (char *)& id, 4 );
  1797. int len = dgl.values[ i * 3 + 1 ].getLength();
  1798. klient->sendeEncrypted( (char *)& len, 4 );
  1799. if( len )
  1800. klient->sendeEncrypted( dgl.values[ i * 3 + 1 ].getText(), len );
  1801. int vs = TextZuInt( dgl.values[ i * 3 + 2 ].getText(), 10 );
  1802. klient->sendeEncrypted( (char *)& vs, 4 );
  1803. }
  1804. else
  1805. {
  1806. int id = TextZuInt( dgl.values[ i * 3 ].getText(), 10 );
  1807. klient->sende( (char *)& id, 4 );
  1808. int len = dgl.values[ i * 3 + 1 ].getLength();
  1809. klient->sende( (char *)& len, 4 );
  1810. if( len )
  1811. klient->sende( dgl.values[ i * 3 + 1 ].getText(), len );
  1812. int vs = TextZuInt( dgl.values[ i * 3 + 2 ].getText(), 10 );
  1813. klient->sende( (char *)& vs, 4 );
  1814. }
  1815. }
  1816. if( encrypted )
  1817. klient->sendeEncrypted( "\0\0\0\0", 4 );
  1818. else
  1819. klient->sende( "\0\0\0\0", 4 );
  1820. dgl.destroy();
  1821. char ret = 0;
  1822. if( encrypted )
  1823. klient->getNachrichtEncrypted( &ret, 1 );
  1824. else
  1825. klient->getNachricht( &ret, 1 );
  1826. }
  1827. break;
  1828. default:
  1829. hack++;
  1830. if( !errorZuKlient( "Unbekannte Nachricht!" ) )
  1831. br = 1;
  1832. break;
  1833. }
  1834. if( br || hack >= 10 )
  1835. break;
  1836. }
  1837. ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1838. ps->addGesendet( klient->getUploadBytes( 1 ) );
  1839. }
  1840. ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1841. ps->addGesendet( klient->getUploadBytes( 1 ) );
  1842. ps->removeKlient( this ); // delete this
  1843. }
  1844. // constant
  1845. bool PSKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  1846. {
  1847. if( encrypted )
  1848. {
  1849. if( !klient->sendeEncrypted( "\3", 1 ) )
  1850. return 0;
  1851. char len = (char)textLength( nachricht );
  1852. if( !klient->sendeEncrypted( &len, 1 ) )
  1853. return 0;
  1854. if( !klient->sendeEncrypted( nachricht, len ) )
  1855. return 0;
  1856. }
  1857. else
  1858. {
  1859. if( !klient->sende( "\3", 1 ) )
  1860. return 0;
  1861. char len = (char)textLength( nachricht );
  1862. if( !klient->sende( &len, 1 ) )
  1863. return 0;
  1864. if( !klient->sende( nachricht, len ) )
  1865. return 0;
  1866. }
  1867. return 1;
  1868. }
  1869. int PSKlient::getKlientNummer() const // gibt die KlientId zurück
  1870. {
  1871. return klientNummer;
  1872. }