KartenK.cpp 12 KB

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