MainClient.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. #include "MainClient.h"
  2. #include <Klient.h>
  3. #include "Keys.h"
  4. #include "ErhaltungClient.h"
  5. #include "PatchClient.h"
  6. #include "NewsClient.h"
  7. #include "RegisterServer.h"
  8. #include "LoginClient.h"
  9. #include "ShopClient.h"
  10. #include "ChatClient.h"
  11. #include "AnmeldungClient.h"
  12. #include "MinigameClient.h"
  13. #include "InformationClient.h"
  14. using namespace KSGClient;
  15. // Inhalt der MainClient Klasse
  16. // Konstruktor
  17. MainClient::MainClient()
  18. {
  19. ref = 1;
  20. port = 0;
  21. cId = 0;
  22. k = 0;
  23. key = 0;
  24. keyLen = 0;
  25. }
  26. MainClient::MainClient( char *ip, unsigned short port, int klientId, char *key, unsigned char keyLen )
  27. {
  28. ref = 1;
  29. this->ip = ip;
  30. this->port = port;
  31. cId = klientId;
  32. k = 0;
  33. this->keyLen = keyLen;
  34. this->key = new char[ keyLen ];
  35. memcpy( this->key, key, keyLen );
  36. }
  37. // Destruktor
  38. MainClient::~MainClient()
  39. {
  40. if( k )
  41. disconnect();
  42. delete[]key;
  43. }
  44. // Meldet den neuen Client beim Serversystem an. Durch diesen Vorgang erhält der Client eine Id und den Port und die Ip Addresse des Main Servers
  45. bool MainClient::registerSSL( char *ip, unsigned short port )
  46. {
  47. cs.lock();
  48. if( cId )
  49. {
  50. cs.unlock();
  51. return 0;
  52. }
  53. Network::SSLKlient *klientSSL = new Network::SSLKlient();
  54. int l = 0;
  55. if( !klientSSL->verbinde( port, ip ) )
  56. {
  57. err = "error while trying to connect to Main SSL Server";
  58. klientSSL->release();
  59. cs.unlock();
  60. return 0;
  61. }
  62. klientSSL->sende( "\1", 5 );
  63. char byte = 0;
  64. klientSSL->getNachricht( &byte, 1 );
  65. if( byte == 3 )
  66. {
  67. klientSSL->getNachricht( &byte, 1 );
  68. char *message = new char[ byte + 1 ];
  69. message[ byte ] = 0;
  70. klientSSL->getNachricht( message, byte );
  71. err = "error while register new client server returned: ";
  72. err += message;
  73. delete[]message;
  74. klientSSL->sende( "\3", 1 );
  75. klientSSL->getNachricht( &byte, 1 );
  76. klientSSL->trenne();
  77. klientSSL->release();
  78. cs.unlock();
  79. return 0;
  80. }
  81. if( byte == 1 )
  82. {
  83. klientSSL->getNachricht( (char*)&this->port, 4 );
  84. klientSSL->getNachricht( (char*)&cId, 4 );
  85. klientSSL->getNachricht( (char*)&keyLen, 1 );
  86. this->ip = ip;
  87. if( keyLen )
  88. {
  89. key = new char[ keyLen ];
  90. klientSSL->getNachricht( key, keyLen );
  91. }
  92. }
  93. klientSSL->sende( "\3", 1 );
  94. klientSSL->getNachricht( &byte, 1 );
  95. klientSSL->trenne();
  96. klientSSL->release();
  97. cs.unlock();
  98. return 1;
  99. }
  100. // Verbindet den Client mit dem Server
  101. // Wird automatisch aufgerufen, falls eine Methode aufgerufen wird, die eine Verbindung erfordert. In diesem Fall wird die Verbindung auch automatisch wieder getrennt.
  102. bool MainClient::connect()
  103. {
  104. cs.lock();
  105. if( k )
  106. {
  107. cs.unlock();
  108. return 1;
  109. }
  110. k = new Network::Klient();
  111. int l = 0;
  112. char *key;
  113. Keys::getServerKey( &key, l, Keys::MAIN, Keys::SENDEN );
  114. k->setSendeKey( key, l );
  115. delete[] key;
  116. Keys::getServerKey( &key, l, Keys::MAIN, Keys::EMPFANGEN );
  117. k->setEmpfangKey( key, l );
  118. delete[] key;
  119. if( !k->verbinde( port, ip ) )
  120. {
  121. err = "error while trying to connect to Main Server";
  122. k = k->release();
  123. cs.unlock();
  124. return 0;
  125. }
  126. k->sende( "\0", 1 ); // Verschlüsselung aktivieren
  127. k->sendeEncrypted( "\1", 1 );
  128. k->sendeEncrypted( (char*)&cId, 4 );
  129. char serverReturn = 0;
  130. k->getNachrichtEncrypted( &serverReturn, 1 );
  131. if( serverReturn == 3 )
  132. {
  133. k->getNachrichtEncrypted( &serverReturn, 1 );
  134. char *message = new char[ serverReturn + 1 ];
  135. message[ serverReturn ] = 0;
  136. k->getNachrichtEncrypted( message, serverReturn );
  137. err = "error while trying to identify registered client server returned: ";
  138. err += message;
  139. delete[] message;
  140. k->sendeEncrypted( "\3", 1 );
  141. k->getNachrichtEncrypted( &serverReturn, 1 );
  142. k->trenne();
  143. k = k->release();
  144. cs.unlock();
  145. return 0;
  146. }
  147. else
  148. {
  149. k->setSendeKey( this->key, keyLen );
  150. k->setEmpfangKey( this->key, keyLen );
  151. cs.unlock();
  152. return 1;
  153. }
  154. }
  155. // Erzeugt einen Erhaltungs Server Client
  156. // Gibt bei misserfolg 0 zurück
  157. ErhaltungServerClient *MainClient::createErhaltungServerClient()
  158. {
  159. cs.lock();
  160. bool connected = k != 0;
  161. if( !connected )
  162. connect();
  163. if( !k )
  164. {
  165. err = "no connection to Main Server";
  166. cs.unlock();
  167. return 0;
  168. }
  169. k->sendeEncrypted( "\6\x8", 2 );
  170. char byte = 0;
  171. k->getNachrichtEncrypted( &byte, 1 );
  172. if( byte == 2 )
  173. {
  174. unsigned char lsIp[ 4 ];
  175. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  176. unsigned short lsPort = 0;
  177. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  178. Framework::Text ipT;
  179. ipT += (int)lsIp[ 0 ];
  180. ipT += ".";
  181. ipT += (int)lsIp[ 1 ];
  182. ipT += ".";
  183. ipT += (int)lsIp[ 2 ];
  184. ipT += ".";
  185. ipT += (int)lsIp[ 3 ];
  186. if( !connected )
  187. disconnect();
  188. cs.unlock();
  189. return new ErhaltungClient( cId, lsPort, ipT, key, keyLen );
  190. }
  191. else if( byte == 3 )
  192. {
  193. k->getNachrichtEncrypted( &byte, 1 );
  194. char *f = new char[ byte + 1 ];
  195. f[ byte ] = 0;
  196. k->getNachrichtEncrypted( f, byte );
  197. err = "error while requesting ErhaltungServer server returned: ";
  198. err += f;
  199. delete[]f;
  200. }
  201. if( !connected )
  202. disconnect();
  203. cs.unlock();
  204. return 0;
  205. }
  206. // Erzeugt einen Patch Server Client
  207. // Gibt bei misserfolg 0 zurück
  208. PatchServerClient *MainClient::createPatchServerClient()
  209. {
  210. cs.lock();
  211. bool connected = k != 0;
  212. if( !connected )
  213. connect();
  214. if( !k )
  215. {
  216. err = "no connection to Main Server";
  217. cs.unlock();
  218. return 0;
  219. }
  220. k->sendeEncrypted( "\6\2", 2 );
  221. char byte = 0;
  222. k->getNachrichtEncrypted( &byte, 1 );
  223. if( byte == 2 )
  224. {
  225. unsigned char lsIp[ 4 ];
  226. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  227. unsigned short lsPort = 0;
  228. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  229. Framework::Text ipT;
  230. ipT += (int)lsIp[ 0 ];
  231. ipT += ".";
  232. ipT += (int)lsIp[ 1 ];
  233. ipT += ".";
  234. ipT += (int)lsIp[ 2 ];
  235. ipT += ".";
  236. ipT += (int)lsIp[ 3 ];
  237. if( !connected )
  238. disconnect();
  239. cs.unlock();
  240. return new PatchClient( cId, lsPort, ipT, key, keyLen );
  241. }
  242. else if( byte == 3 )
  243. {
  244. k->getNachrichtEncrypted( &byte, 1 );
  245. char *f = new char[ byte + 1 ];
  246. f[ byte ] = 0;
  247. k->getNachrichtEncrypted( f, byte );
  248. err = "error while requesting PatchServer server returned: ";
  249. err += f;
  250. delete[]f;
  251. }
  252. if( !connected )
  253. disconnect();
  254. cs.unlock();
  255. return 0;
  256. }
  257. // Erzeugt einen News Server Client
  258. // Gibt bei misserfolg 0 zurück
  259. NewsServerClient *MainClient::createNewsServerClient()
  260. {
  261. cs.lock();
  262. bool connected = k != 0;
  263. if( !connected )
  264. connect();
  265. if( !k )
  266. {
  267. err = "no connection to Main Server";
  268. cs.unlock();
  269. return 0;
  270. }
  271. k->sendeEncrypted( "\6\x9", 2 );
  272. char byte = 0;
  273. k->getNachrichtEncrypted( &byte, 1 );
  274. if( byte == 2 )
  275. {
  276. unsigned char lsIp[ 4 ];
  277. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  278. unsigned short lsPort = 0;
  279. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  280. Framework::Text ipT;
  281. ipT += (int)lsIp[ 0 ];
  282. ipT += ".";
  283. ipT += (int)lsIp[ 1 ];
  284. ipT += ".";
  285. ipT += (int)lsIp[ 2 ];
  286. ipT += ".";
  287. ipT += (int)lsIp[ 3 ];
  288. if( !connected )
  289. disconnect();
  290. cs.unlock();
  291. return new NewsClient( cId, lsPort, ipT, key, keyLen );
  292. }
  293. else if( byte == 3 )
  294. {
  295. k->getNachrichtEncrypted( &byte, 1 );
  296. char *f = new char[ byte + 1 ];
  297. f[ byte ] = 0;
  298. k->getNachrichtEncrypted( f, byte );
  299. err = "error while requesting NewsServer server returned: ";
  300. err += f;
  301. delete[]f;
  302. }
  303. if( !connected )
  304. disconnect();
  305. cs.unlock();
  306. return 0;
  307. }
  308. // Erzeugt einen Register Server Client
  309. // Gibt bei misserfolg 0 zurück
  310. RegisterServerClient *MainClient::createRegisterServerClient()
  311. {
  312. cs.lock();
  313. bool connected = k != 0;
  314. if( !connected )
  315. connect();
  316. if( !k )
  317. {
  318. err = "no connection to Main Server";
  319. cs.unlock();
  320. return 0;
  321. }
  322. k->sendeEncrypted( "\6\1", 2 );
  323. char byte = 0;
  324. k->getNachrichtEncrypted( &byte, 1 );
  325. if( byte == 2 )
  326. {
  327. unsigned char lsIp[ 4 ];
  328. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  329. unsigned short lsPort = 0;
  330. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  331. Framework::Text ipT;
  332. ipT += (int)lsIp[ 0 ];
  333. ipT += ".";
  334. ipT += (int)lsIp[ 1 ];
  335. ipT += ".";
  336. ipT += (int)lsIp[ 2 ];
  337. ipT += ".";
  338. ipT += (int)lsIp[ 3 ];
  339. if( !connected )
  340. disconnect();
  341. cs.unlock();
  342. return new RegisterClient( cId, lsPort, ipT, key, keyLen );
  343. }
  344. else if( byte == 3 )
  345. {
  346. k->getNachrichtEncrypted( &byte, 1 );
  347. char *f = new char[ byte + 1 ];
  348. f[ byte ] = 0;
  349. k->getNachrichtEncrypted( f, byte );
  350. err = "error while requesting RegisterServer server returned: ";
  351. err += f;
  352. delete[]f;
  353. }
  354. if( !connected )
  355. disconnect();
  356. cs.unlock();
  357. return 0;
  358. }
  359. // Erzeugt einen Login Server Client
  360. // Gibt bei misserfolg 0 zurück
  361. LoginServerClient *MainClient::createLoginServerClient()
  362. {
  363. cs.lock();
  364. bool connected = k != 0;
  365. if( !connected )
  366. connect();
  367. if( !k )
  368. {
  369. err = "no connection to Main Server";
  370. cs.unlock();
  371. return 0;
  372. }
  373. k->sendeEncrypted( "\6\3", 2 );
  374. char byte = 0;
  375. k->getNachrichtEncrypted( &byte, 1 );
  376. if( byte == 2 )
  377. {
  378. unsigned char lsIp[ 4 ];
  379. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  380. unsigned short lsPort = 0;
  381. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  382. Framework::Text ipT;
  383. ipT += (int)lsIp[ 0 ];
  384. ipT += ".";
  385. ipT += (int)lsIp[ 1 ];
  386. ipT += ".";
  387. ipT += (int)lsIp[ 2 ];
  388. ipT += ".";
  389. ipT += (int)lsIp[ 3 ];
  390. if( !connected )
  391. disconnect();
  392. cs.unlock();
  393. return new LoginClient( cId, lsPort, ipT, key, keyLen );
  394. }
  395. else if( byte == 3 )
  396. {
  397. k->getNachrichtEncrypted( &byte, 1 );
  398. char *f = new char[ byte + 1 ];
  399. f[ byte ] = 0;
  400. k->getNachrichtEncrypted( f, byte );
  401. err = "error while requesting LoginServer server returned: ";
  402. err += f;
  403. delete[]f;
  404. }
  405. if( !connected )
  406. disconnect();
  407. cs.unlock();
  408. return 0;
  409. }
  410. // Erzeugt einen Information Server Client
  411. // Gibt bei misserfolg 0 zurück
  412. InformationServerClient *MainClient::createInformationServerClient()
  413. {
  414. cs.lock();
  415. bool connected = k != 0;
  416. if( !connected )
  417. connect();
  418. if( !k )
  419. {
  420. err = "no connection to Main Server";
  421. cs.unlock();
  422. return 0;
  423. }
  424. k->sendeEncrypted( "\6\4", 2 );
  425. char byte = 0;
  426. k->getNachrichtEncrypted( &byte, 1 );
  427. if( byte == 2 )
  428. {
  429. unsigned char lsIp[ 4 ];
  430. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  431. unsigned short lsPort = 0;
  432. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  433. Framework::Text ipT;
  434. ipT += (int)lsIp[ 0 ];
  435. ipT += ".";
  436. ipT += (int)lsIp[ 1 ];
  437. ipT += ".";
  438. ipT += (int)lsIp[ 2 ];
  439. ipT += ".";
  440. ipT += (int)lsIp[ 3 ];
  441. if( !connected )
  442. disconnect();
  443. cs.unlock();
  444. return new InformationClient( cId, lsPort, ipT, key, keyLen );
  445. }
  446. else if( byte == 3 )
  447. {
  448. k->getNachrichtEncrypted( &byte, 1 );
  449. char *f = new char[ byte + 1 ];
  450. f[ byte ] = 0;
  451. k->getNachrichtEncrypted( f, byte );
  452. err = "error while requesting InformationServer server returned: ";
  453. err += f;
  454. delete[]f;
  455. }
  456. if( !connected )
  457. disconnect();
  458. cs.unlock();
  459. return 0;
  460. }
  461. // Erzeugt einen Chat Server Client
  462. // Gibt bei misserfolg 0 zurück
  463. ChatServerClient *MainClient::createChatServerClient()
  464. {
  465. cs.lock();
  466. bool connected = k != 0;
  467. if( !connected )
  468. connect();
  469. if( !k )
  470. {
  471. err = "no connection to Main Server";
  472. cs.unlock();
  473. return 0;
  474. }
  475. k->sendeEncrypted( "\6\5", 2 );
  476. char byte = 0;
  477. k->getNachrichtEncrypted( &byte, 1 );
  478. if( byte == 2 )
  479. {
  480. unsigned char lsIp[ 4 ];
  481. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  482. unsigned short lsPort = 0;
  483. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  484. Framework::Text ipT;
  485. ipT += (int)lsIp[ 0 ];
  486. ipT += ".";
  487. ipT += (int)lsIp[ 1 ];
  488. ipT += ".";
  489. ipT += (int)lsIp[ 2 ];
  490. ipT += ".";
  491. ipT += (int)lsIp[ 3 ];
  492. if( !connected )
  493. disconnect();
  494. cs.unlock();
  495. return new ChatClient( cId, lsPort, ipT, key, keyLen );
  496. }
  497. else if( byte == 3 )
  498. {
  499. k->getNachrichtEncrypted( &byte, 1 );
  500. char *f = new char[ byte + 1 ];
  501. f[ byte ] = 0;
  502. k->getNachrichtEncrypted( f, byte );
  503. err = "error while requesting ChatServer server returned: ";
  504. err += f;
  505. delete[]f;
  506. }
  507. if( !connected )
  508. disconnect();
  509. cs.unlock();
  510. return 0;
  511. }
  512. // Erzeugt einen Shop Server Client
  513. // Gibt bei misserfolg 0 zurück
  514. ShopServerClient *MainClient::createShopServerClient()
  515. {
  516. cs.lock();
  517. bool connected = k != 0;
  518. if( !connected )
  519. connect();
  520. if( !k )
  521. {
  522. err = "no connection to Main Server";
  523. cs.unlock();
  524. return 0;
  525. }
  526. k->sendeEncrypted( "\6\7", 2 );
  527. char byte = 0;
  528. k->getNachrichtEncrypted( &byte, 1 );
  529. if( byte == 2 )
  530. {
  531. unsigned char lsIp[ 4 ];
  532. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  533. unsigned short lsPort = 0;
  534. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  535. Framework::Text ipT;
  536. ipT += (int)lsIp[ 0 ];
  537. ipT += ".";
  538. ipT += (int)lsIp[ 1 ];
  539. ipT += ".";
  540. ipT += (int)lsIp[ 2 ];
  541. ipT += ".";
  542. ipT += (int)lsIp[ 3 ];
  543. if( !connected )
  544. disconnect();
  545. cs.unlock();
  546. return new ShopClient( cId, lsPort, ipT, key, keyLen );
  547. }
  548. else if( byte == 3 )
  549. {
  550. k->getNachrichtEncrypted( &byte, 1 );
  551. char *f = new char[ byte + 1 ];
  552. f[ byte ] = 0;
  553. k->getNachrichtEncrypted( f, byte );
  554. err = "error while requesting ShopServer server returned: ";
  555. err += f;
  556. delete[]f;
  557. }
  558. if( !connected )
  559. disconnect();
  560. cs.unlock();
  561. return 0;
  562. }
  563. // Erzeugt einen Anmeldung Server Client
  564. // Gibt bei misserfolg 0 zurück
  565. AnmeldungServerClient *MainClient::createAnmeldungServerClient()
  566. {
  567. cs.lock();
  568. bool connected = k != 0;
  569. if( !connected )
  570. connect();
  571. if( !k )
  572. {
  573. err = "no connection to Main Server";
  574. cs.unlock();
  575. return 0;
  576. }
  577. k->sendeEncrypted( "\6\6", 2 );
  578. char byte = 0;
  579. k->getNachrichtEncrypted( &byte, 1 );
  580. if( byte == 2 )
  581. {
  582. unsigned char lsIp[ 4 ];
  583. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  584. unsigned short lsPort = 0;
  585. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  586. Framework::Text ipT;
  587. ipT += (int)lsIp[ 0 ];
  588. ipT += ".";
  589. ipT += (int)lsIp[ 1 ];
  590. ipT += ".";
  591. ipT += (int)lsIp[ 2 ];
  592. ipT += ".";
  593. ipT += (int)lsIp[ 3 ];
  594. if( !connected )
  595. disconnect();
  596. cs.unlock();
  597. return new AnmeldungClient( cId, lsPort, ipT, key, keyLen );
  598. }
  599. else if( byte == 3 )
  600. {
  601. k->getNachrichtEncrypted( &byte, 1 );
  602. char *f = new char[ byte + 1 ];
  603. f[ byte ] = 0;
  604. k->getNachrichtEncrypted( f, byte );
  605. err = "error while requesting AnmeldungServer server returned: ";
  606. err += f;
  607. delete[]f;
  608. }
  609. if( !connected )
  610. disconnect();
  611. cs.unlock();
  612. return 0;
  613. }
  614. // Erzeugt einen Minigame Server Client
  615. // Gibt bei misserfolg 0 zurück
  616. MinigameServerClient *MainClient::createMinigameServerClient()
  617. {
  618. cs.lock();
  619. bool connected = k != 0;
  620. if( !connected )
  621. connect();
  622. if( !k )
  623. {
  624. err = "no connection to minigame Server";
  625. cs.unlock();
  626. return 0;
  627. }
  628. k->sendeEncrypted( "\6\xA", 2 );
  629. char byte = 0;
  630. k->getNachrichtEncrypted( &byte, 1 );
  631. if( byte == 2 )
  632. {
  633. unsigned char lsIp[ 4 ];
  634. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  635. unsigned short lsPort = 0;
  636. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  637. Framework::Text ipT;
  638. ipT += (int)lsIp[ 0 ];
  639. ipT += ".";
  640. ipT += (int)lsIp[ 1 ];
  641. ipT += ".";
  642. ipT += (int)lsIp[ 2 ];
  643. ipT += ".";
  644. ipT += (int)lsIp[ 3 ];
  645. if( !connected )
  646. disconnect();
  647. cs.unlock();
  648. return new MinigameClient( cId, lsPort, ipT, key, keyLen );
  649. }
  650. else if( byte == 3 )
  651. {
  652. k->getNachrichtEncrypted( &byte, 1 );
  653. char *f = new char[ byte + 1 ];
  654. f[ byte ] = 0;
  655. k->getNachrichtEncrypted( f, byte );
  656. err = "error while requesting MinigameServer server returned: ";
  657. err += f;
  658. delete[]f;
  659. }
  660. if( !connected )
  661. disconnect();
  662. cs.unlock();
  663. return 0;
  664. }
  665. // Trennt die Verbindung zum Server. Muss nur aufgerufen werden, wenn vorher manuell connect aufgerufen wurde
  666. bool MainClient::disconnect()
  667. {
  668. cs.lock();
  669. if( !k )
  670. {
  671. cs.unlock();
  672. return 1;
  673. }
  674. char serverReturn = 0;
  675. k->sendeEncrypted( "\3", 1 );
  676. k->getNachrichtEncrypted( &serverReturn, 1 );
  677. k->trenne();
  678. k = k->release();
  679. cs.unlock();
  680. return 1;
  681. }
  682. // Meldet den Client vom Server ab. Alle zuvor von diesem Client erzeugten Clients werden durch diesen Vorgang unbrauchbar
  683. bool MainClient::unregister()
  684. {
  685. cs.lock();
  686. bool connected = k != 0;
  687. if( !connected )
  688. connect();
  689. if( !k )
  690. {
  691. err = "no connection to Main Server";
  692. cs.unlock();
  693. return 0;
  694. }
  695. k->sendeEncrypted( "\7", 1 );
  696. char serverReturn = 0;
  697. k->getNachrichtEncrypted( &serverReturn, 1 );
  698. if( serverReturn == 3 )
  699. {
  700. k->getNachrichtEncrypted( &serverReturn, 1 );
  701. char *message = new char[ serverReturn + 1 ];
  702. message[ serverReturn ] = 0;
  703. k->getNachrichtEncrypted( message, serverReturn );
  704. err = "error while trying to unregistere client server returned: ";
  705. err += message;
  706. delete[] message;
  707. if( !connected )
  708. disconnect();
  709. cs.unlock();
  710. return 0;
  711. }
  712. disconnect();
  713. cId = 0;
  714. delete key;
  715. key = 0;
  716. keyLen = 0;
  717. port = 0;
  718. ip = "";
  719. cs.unlock();
  720. return 1;
  721. }
  722. // Gibt die dem Client zugewiesene Id zurück.
  723. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  724. int MainClient::getClientId() const
  725. {
  726. return cId;
  727. }
  728. // Gibt die Ip Adresse des dem Client zugewiesenen Main Servers zurück.
  729. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  730. Framework::Text *MainClient::getServerIp() const
  731. {
  732. return new Text( ip.getText() );
  733. }
  734. // Gibt den Port des dem Client zugewiesenen Main Servers zurück.
  735. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  736. unsigned short MainClient::getServerPort() const
  737. {
  738. return port;
  739. }
  740. // Gibt den Zeiger auf den Schlüssel zurück
  741. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  742. char *MainClient::zKey() const
  743. {
  744. return key;
  745. }
  746. // Gibt die Länge des Schlüssels zurück
  747. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  748. unsigned char MainClient::getKeyLen() const
  749. {
  750. return keyLen;
  751. }
  752. // gibt den Letzten Fehlertext zuück
  753. // sollte erst aufgerufen werden, nachdem eine andere aufgerufene Methode fehlgeschlagen ist
  754. char *MainClient::getLetzterFehler() const
  755. {
  756. return err;
  757. }
  758. // Erhöht den Reference Counter um 1 un gibt this zurück
  759. MainServerClient *MainClient::getThis()
  760. {
  761. ref++;
  762. return this;
  763. }
  764. // Verringert den Reference Counter um 1 und gibt 0 zurück.
  765. // Falls der Reference Counter nach dem Aufruf auf 0 ist löscht sich das Objekt selbst
  766. MainServerClient *MainClient::release()
  767. {
  768. if( !--ref )
  769. delete this;
  770. return 0;
  771. }