KartenK.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. #include "../KSGKlient.h"
  2. #include "../KSGServer.h"
  3. #include <Datei.h>
  4. #include "../../Global/Variablen.h"
  5. #include "../Keys.h"
  6. #include <Globals.h>
  7. // Inhalt der KartenKlient Klasse aus KSGKlient.h
  8. // Konstruktor
  9. KartenKlient::KartenKlient()
  10. {
  11. verbunden = 0;
  12. klient = 0;
  13. fehler = new Text( "" );
  14. klientId = getKlientId();
  15. ref = 1;
  16. }
  17. // Destruktor
  18. KartenKlient::~KartenKlient()
  19. {
  20. cs.lock();
  21. if( verbunden )
  22. trenne();
  23. fehler = fehler->release();
  24. cs.unlock();
  25. }
  26. // nicht constant
  27. bool KartenKlient::verbinde( unsigned short port, char *ip ) // verbindet ich mit dem Karten Server
  28. {
  29. if( klient && verbunden && klient->getServerPort() == port && Text( ip ).istGleich( klient->getServerIp() ) )
  30. return 1;
  31. if( klient || verbunden )
  32. trenne();
  33. klient = new Klient();
  34. Framework::logLine( ( ( Text( "Zugeteilter Karten Server:" ) += ip ) += ":" ) += port );
  35. Framework::logLine( "Verbinung mit Karten Server wird hergestellt..." );
  36. int keyLen = 0;
  37. char *key = 0;
  38. Keys::getServerKey( &key, keyLen, Keys::KARTEN, Keys::SENDEN );
  39. klient->setSendeKey( key, keyLen );
  40. delete[] key;
  41. Keys::getServerKey( &key, keyLen, Keys::KARTEN, Keys::EMPFANGEN );
  42. klient->setEmpfangKey( key, keyLen );
  43. delete[] key;
  44. if( !klient->verbinde( (unsigned short)port, ip ) )
  45. {
  46. Framework::logLine( "ERROR: Server nicht erreichbar." );
  47. klient = klient->release();
  48. fehler->setText( "Fehler beim verbinden mit dem Editor Server." );
  49. return 0;
  50. }
  51. klient->sendeEncrypted( "\1", 1 );
  52. klient->sendeEncrypted( (char*)&klientId, 4 );
  53. char ret = 0;
  54. klient->getNachrichtEncrypted( &ret, 1 );
  55. if( ret == 3 )
  56. {
  57. char län = 0;
  58. klient->getNachrichtEncrypted( &län, 1 );
  59. char *nachricht = new char[ län + 1 ];
  60. nachricht[ län ] = 0;
  61. klient->getNachrichtEncrypted( nachricht, län );
  62. fehler->setText( nachricht );
  63. Framework::logLine( Text( "ERROR: " ) += nachricht );
  64. delete[]nachricht;
  65. trenne();
  66. return 0;
  67. }
  68. if( ret == 1 )
  69. {
  70. char *sl = 0;
  71. char slLän = getSchlüssel( &sl );
  72. klient->setSendeKey( sl, slLän );
  73. klient->setEmpfangKey( sl, slLän );
  74. delete[] sl;
  75. verbunden = 1;
  76. }
  77. Framework::logLine( "Erfolgreich mit Karten Server verbunden." );
  78. return 1;
  79. }
  80. bool KartenKlient::downloadKarte( int id ) // läd die Karte herunter
  81. {
  82. cs.lock();
  83. if( !verbunden )
  84. {
  85. cs.unlock();
  86. return 0;
  87. }
  88. klient->sendeEncrypted( "\x6", 1 );
  89. char ret = 0;
  90. klient->getNachrichtEncrypted( &ret, 1 );
  91. if( ret == 1 )
  92. {
  93. klient->sendeEncrypted( (char*)&id, 4 );
  94. klient->getNachrichtEncrypted( &ret, 1 );
  95. if( ret == 2 )
  96. { // update
  97. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Karte wird momentan aktualisiert." ), new Text( "Ok" ) );
  98. cs.unlock();
  99. return 0;
  100. }
  101. else if( ret == 1 )
  102. {
  103. int anz = 0;
  104. klient->getNachrichtEncrypted( (char*)&anz, 4 );
  105. for( int i = 0; i < anz; i++ )
  106. {
  107. char län = 0;
  108. klient->getNachrichtEncrypted( &län, 1 );
  109. if( !län )
  110. continue;
  111. char *pf = new char[ län + 1 ];
  112. pf[ län ] = 0;
  113. klient->getNachrichtEncrypted( pf, län );
  114. __int64 größe = 0;
  115. klient->getNachrichtEncrypted( (char*)&größe, 8 );
  116. char *buffer = new char[ 2048 ];
  117. Text pfad = "data/tmp/Karten/";
  118. pfad += id;
  119. pfad += "/spiel";
  120. pfad += pf;
  121. delete[] pf;
  122. Datei d;
  123. d.setDatei( pfad );
  124. d.erstellen();
  125. d.open( Datei::Style::schreiben );
  126. while( größe )
  127. {
  128. int l = größe >= 2048 ? 2048 : (int)größe;
  129. klient->getNachricht( buffer, l );
  130. d.schreibe( buffer, l );
  131. größe -= l;
  132. }
  133. d.close();
  134. delete[] buffer;
  135. }
  136. }
  137. }
  138. if( ret == 3 )
  139. {
  140. char byte = 0;
  141. klient->getNachrichtEncrypted( &byte, 1 );
  142. char *f = new char[ byte + 1 ];
  143. f[ byte ] = 0;
  144. klient->getNachrichtEncrypted( f, byte );
  145. fehler->setText( f );
  146. delete[] f;
  147. cs.unlock();
  148. return 0;
  149. }
  150. cs.unlock();
  151. return 1;
  152. }
  153. bool KartenKlient::downloadKarteTitel( int id ) // läd das Titelbild einer Karte herunter
  154. {
  155. cs.lock();
  156. if( !verbunden )
  157. {
  158. cs.unlock();
  159. return 0;
  160. }
  161. klient->sendeEncrypted( "\x8", 1 );
  162. char ret = 0;
  163. klient->getNachrichtEncrypted( &ret, 1 );
  164. if( ret == 1 )
  165. {
  166. klient->sendeEncrypted( (char*)&id, 4 );
  167. klient->getNachrichtEncrypted( &ret, 1 );
  168. if( ret == 2 )
  169. { // update
  170. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Karte wird momentan aktualisiert." ), new Text( "Ok" ) );
  171. cs.unlock();
  172. return 0;
  173. }
  174. else if( ret == 1 )
  175. {
  176. __int64 größe = 0;
  177. klient->getNachrichtEncrypted( (char*)&größe, 8 );
  178. char *buffer = new char[ 2048 ];
  179. Text pfad = "data/tmp/Karten/";
  180. pfad += id;
  181. pfad += "/titel.ltdb";
  182. Datei d;
  183. d.setDatei( pfad );
  184. d.erstellen();
  185. d.open( Datei::Style::schreiben );
  186. while( größe )
  187. {
  188. int l = größe >= 2048 ? 2048 : (int)größe;
  189. klient->getNachricht( buffer, l );
  190. d.schreibe( buffer, l );
  191. größe -= l;
  192. }
  193. d.close();
  194. delete[] buffer;
  195. }
  196. }
  197. if( ret == 3 )
  198. {
  199. char byte = 0;
  200. klient->getNachrichtEncrypted( &byte, 1 );
  201. char *f = new char[ byte + 1 ];
  202. f[ byte ] = 0;
  203. klient->getNachrichtEncrypted( f, byte );
  204. fehler->setText( f );
  205. delete[] f;
  206. cs.unlock();
  207. return 0;
  208. }
  209. cs.unlock();
  210. return 1;
  211. }
  212. bool KartenKlient::downloadKarteBeschreibung( int id ) // läd die Beschreibung einer Karte herunter
  213. {
  214. cs.lock();
  215. if( !verbunden )
  216. {
  217. cs.unlock();
  218. return 0;
  219. }
  220. klient->sendeEncrypted( "\x9", 1 );
  221. char ret = 0;
  222. klient->getNachrichtEncrypted( &ret, 1 );
  223. if( ret == 1 )
  224. {
  225. klient->sendeEncrypted( (char*)&id, 4 );
  226. klient->getNachrichtEncrypted( &ret, 1 );
  227. if( ret == 2 )
  228. { // update
  229. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Karte wird momentan aktualisiert." ), new Text( "Ok" ) );
  230. cs.unlock();
  231. return 0;
  232. }
  233. else if( ret == 1 )
  234. {
  235. __int64 größe = 0;
  236. klient->getNachrichtEncrypted( (char*)&größe, 8 );
  237. char *buffer = new char[ 2048 ];
  238. Text pfad = "data/tmp/Karten/";
  239. pfad += id;
  240. pfad += "/beschreibung.ksgs";
  241. Datei d;
  242. d.setDatei( pfad );
  243. d.erstellen();
  244. d.open( Datei::Style::schreiben );
  245. while( größe )
  246. {
  247. int l = größe >= 2048 ? 2048 : (int)größe;
  248. klient->getNachricht( buffer, l );
  249. d.schreibe( buffer, l );
  250. größe -= l;
  251. }
  252. d.close();
  253. delete[] buffer;
  254. }
  255. }
  256. if( ret == 3 )
  257. {
  258. char byte = 0;
  259. klient->getNachrichtEncrypted( &byte, 1 );
  260. char *f = new char[ byte + 1 ];
  261. f[ byte ] = 0;
  262. klient->getNachrichtEncrypted( f, byte );
  263. fehler->setText( f );
  264. delete[] f;
  265. cs.unlock();
  266. return 0;
  267. }
  268. cs.unlock();
  269. return 1;
  270. }
  271. bool KartenKlient::downloadKarteMinimap( int id ) // läd die Minimap einer Karte herunter
  272. {
  273. cs.lock();
  274. if( !verbunden )
  275. {
  276. cs.unlock();
  277. return 0;
  278. }
  279. klient->sendeEncrypted( "\xA", 1 );
  280. char ret = 0;
  281. klient->getNachrichtEncrypted( &ret, 1 );
  282. if( ret == 1 )
  283. {
  284. klient->sendeEncrypted( (char*)&id, 4 );
  285. klient->getNachrichtEncrypted( &ret, 1 );
  286. if( ret == 2 )
  287. { // update
  288. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Karte wird momentan aktualisiert." ), new Text( "Ok" ) );
  289. cs.unlock();
  290. return 0;
  291. }
  292. else if( ret == 1 )
  293. {
  294. __int64 größe = 0;
  295. klient->getNachrichtEncrypted( (char*)&größe, 8 );
  296. char *buffer = new char[ 2048 ];
  297. Text pfad = "data/tmp/Karten/";
  298. pfad += id;
  299. pfad += "/minimap.ltdb";
  300. Datei d;
  301. d.setDatei( pfad );
  302. d.erstellen();
  303. d.open( Datei::Style::schreiben );
  304. while( größe )
  305. {
  306. int l = größe >= 2048 ? 2048 : (int)größe;
  307. klient->getNachricht( buffer, l );
  308. d.schreibe( buffer, l );
  309. größe -= l;
  310. }
  311. d.close();
  312. delete[] buffer;
  313. }
  314. }
  315. if( ret == 3 )
  316. {
  317. char byte = 0;
  318. klient->getNachrichtEncrypted( &byte, 1 );
  319. char *f = new char[ byte + 1 ];
  320. f[ byte ] = 0;
  321. klient->getNachrichtEncrypted( f, byte );
  322. fehler->setText( f );
  323. delete[] f;
  324. cs.unlock();
  325. return 0;
  326. }
  327. cs.unlock();
  328. return 1;
  329. }
  330. bool KartenKlient::downloadKarteLadebild( int id ) // läd das Ladebild einer Karte herunter
  331. {
  332. cs.lock();
  333. if( !verbunden )
  334. {
  335. cs.unlock();
  336. return 0;
  337. }
  338. klient->sendeEncrypted( "\xB", 1 );
  339. char ret = 0;
  340. klient->getNachrichtEncrypted( &ret, 1 );
  341. if( ret == 1 )
  342. {
  343. klient->sendeEncrypted( (char*)&id, 4 );
  344. klient->getNachrichtEncrypted( &ret, 1 );
  345. if( ret == 2 )
  346. { // update
  347. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Karte wird momentan aktualisiert." ), new Text( "Ok" ) );
  348. cs.unlock();
  349. return 0;
  350. }
  351. else if( ret == 1 )
  352. {
  353. __int64 größe = 0;
  354. klient->getNachrichtEncrypted( (char*)&größe, 8 );
  355. char *buffer = new char[ 2048 ];
  356. Text pfad = "data/tmp/Karten/";
  357. pfad += id;
  358. pfad += "/ladebild.ltdb";
  359. Datei d;
  360. d.setDatei( pfad );
  361. d.erstellen();
  362. d.open( Datei::Style::schreiben );
  363. while( größe )
  364. {
  365. int l = größe >= 2048 ? 2048 : (int)größe;
  366. klient->getNachricht( buffer, l );
  367. d.schreibe( buffer, l );
  368. größe -= l;
  369. }
  370. d.close();
  371. delete[] buffer;
  372. }
  373. }
  374. if( ret == 3 )
  375. {
  376. char byte = 0;
  377. klient->getNachrichtEncrypted( &byte, 1 );
  378. char *f = new char[ byte + 1 ];
  379. f[ byte ] = 0;
  380. klient->getNachrichtEncrypted( f, byte );
  381. fehler->setText( f );
  382. delete[] f;
  383. cs.unlock();
  384. return 0;
  385. }
  386. cs.unlock();
  387. return 1;
  388. }
  389. bool KartenKlient::keepAlive() // Erhält die Verbindung aufrecht
  390. {
  391. if( !verbunden )
  392. return 0;
  393. char res = 0;
  394. if( !cs.tryLock() )
  395. return 1;
  396. Framework::logLine( "Verbindungstest zum Karten Server..." );
  397. bool ok = klient->sendeEncrypted( "\x5", 1 );
  398. ok &= klient->getNachrichtEncrypted( &res, 1 );
  399. cs.unlock();
  400. if( res != 1 || !ok )
  401. {
  402. Framework::logLine( "Verbindungsabbruch." );
  403. trenne();
  404. fehler->setText( "Verbindung unterbrochen: 'Keep Alive' nicht erfolgreich." );
  405. }
  406. else
  407. Framework::logLine( "Verbindung besteht." );
  408. return res == 1;
  409. }
  410. bool KartenKlient::trenne() // trennt sich von dem Editor Server
  411. {
  412. if( !klient || !verbunden )
  413. {
  414. if( klient )
  415. klient = klient->release();
  416. return 1;
  417. }
  418. Framework::logLine( "Verbindung zum Karten Server wird getrennt..." );
  419. char serverReturn;
  420. klient->sendeEncrypted( "\4", 1 );
  421. klient->getNachrichtEncrypted( &serverReturn, 1 );
  422. if( serverReturn == 3 )
  423. {
  424. char län = 0;
  425. klient->getNachrichtEncrypted( &län, 1 );
  426. char *nachricht = new char[ län + 1 ];
  427. nachricht[ län ] = 0;
  428. klient->getNachrichtEncrypted( nachricht, län );
  429. delete[]nachricht;
  430. }
  431. klient->sendeEncrypted( "\3", 1 );
  432. klient->getNachrichtEncrypted( &serverReturn, 1 );
  433. klient->trenne();
  434. klient = klient->release();
  435. return 1;
  436. }
  437. // constant
  438. bool KartenKlient::istVerbunden() const // prüft, ob mit Editor Server verbunden
  439. {
  440. return verbunden;
  441. }
  442. char *KartenKlient::getLetzterFehler() const // gibt den Letzten Fehlertext zuück
  443. {
  444. return fehler->getText();
  445. }
  446. // Reference Counting
  447. KartenKlient *KartenKlient::getThis()
  448. {
  449. ref++;
  450. return this;
  451. }
  452. KartenKlient *KartenKlient::release()
  453. {
  454. ref--;
  455. if( !ref )
  456. delete this;
  457. return 0;
  458. }