MainClient.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  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. using namespace KSGClient;
  8. // Inhalt der MainClient Klasse
  9. // Konstruktor
  10. MainClient::MainClient()
  11. {
  12. ref = 1;
  13. port = 0;
  14. cId = 0;
  15. k = 0;
  16. key = 0;
  17. keyLen = 0;
  18. }
  19. MainClient::MainClient( char *ip, unsigned short port, int klientId, char *key, unsigned char keyLen )
  20. {
  21. ref = 1;
  22. this->ip = ip;
  23. this->port = port;
  24. cId = klientId;
  25. k = 0;
  26. this->keyLen = keyLen;
  27. this->key = new char[ keyLen ];
  28. memcpy( this->key, key, keyLen );
  29. }
  30. // Destruktor
  31. MainClient::~MainClient()
  32. {
  33. delete[]key;
  34. if( k )
  35. disconnect();
  36. }
  37. // 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
  38. bool MainClient::registerSSL( char *ip, unsigned short port )
  39. {
  40. cs.lock();
  41. if( cId )
  42. {
  43. cs.unlock();
  44. return 0;
  45. }
  46. Network::SSLKlient *klientSSL = new Network::SSLKlient();
  47. int l = 0;
  48. if( !klientSSL->verbinde( port, ip ) )
  49. {
  50. err = "error while trying to connect to Main SSL Server";
  51. klientSSL->release();
  52. cs.unlock();
  53. return 0;
  54. }
  55. klientSSL->sende( "\1", 5 );
  56. char byte = 0;
  57. klientSSL->getNachricht( &byte, 1 );
  58. if( byte == 3 )
  59. {
  60. klientSSL->getNachricht( &byte, 1 );
  61. char *message = new char[ byte + 1 ];
  62. message[ byte ] = 0;
  63. klientSSL->getNachricht( message, byte );
  64. err = "error while register new client server returned: ";
  65. err += message;
  66. delete[]message;
  67. klientSSL->sende( "\3", 1 );
  68. klientSSL->getNachricht( &byte, 1 );
  69. klientSSL->trenne();
  70. klientSSL->release();
  71. cs.unlock();
  72. return 0;
  73. }
  74. if( byte == 1 )
  75. {
  76. klientSSL->getNachricht( (char*)&this->port, 4 );
  77. klientSSL->getNachricht( (char*)&cId, 4 );
  78. klientSSL->getNachricht( (char*)&keyLen, 1 );
  79. this->ip = ip;
  80. if( keyLen )
  81. {
  82. key = new char[ keyLen ];
  83. klientSSL->getNachricht( key, keyLen );
  84. }
  85. }
  86. klientSSL->sende( "\3", 1 );
  87. klientSSL->getNachricht( &byte, 1 );
  88. klientSSL->trenne();
  89. klientSSL->release();
  90. cs.unlock();
  91. return 1;
  92. }
  93. // Verbindet den Client mit dem Server
  94. // Wird automatisch aufgerufen, falls eine Methode aufgerufen wird, die eine Verbindung erfordert. In diesem Fall wird die Verbindung auch automatisch wieder getrennt.
  95. bool MainClient::connect()
  96. {
  97. cs.lock();
  98. if( k )
  99. {
  100. cs.unlock();
  101. return 1;
  102. }
  103. k = new Network::Klient();
  104. int l = 0;
  105. char *key;
  106. Keys::getServerKey( &key, l, Keys::MAIN, Keys::SENDEN );
  107. k->setSendeKey( key, l );
  108. delete[] key;
  109. Keys::getServerKey( &key, l, Keys::MAIN, Keys::EMPFANGEN );
  110. k->setEmpfangKey( key, l );
  111. delete[] key;
  112. if( !k->verbinde( port, ip ) )
  113. {
  114. err = "error while trying to connect to Main Server";
  115. k = k->release();
  116. cs.unlock();
  117. return 0;
  118. }
  119. k->sende( "\0", 1 ); // Verschlüsselung aktivieren
  120. k->sendeEncrypted( "\1", 1 );
  121. k->sendeEncrypted( (char*)&cId, 4 );
  122. char serverReturn = 0;
  123. k->getNachrichtEncrypted( &serverReturn, 1 );
  124. if( serverReturn == 3 )
  125. {
  126. k->getNachrichtEncrypted( &serverReturn, 1 );
  127. char *message = new char[ serverReturn + 1 ];
  128. message[ serverReturn ] = 0;
  129. k->getNachrichtEncrypted( message, serverReturn );
  130. err = "error while trying to identify registered client server returned: ";
  131. err += message;
  132. delete[] message;
  133. k->sendeEncrypted( "\3", 1 );
  134. k->getNachrichtEncrypted( &serverReturn, 1 );
  135. k->trenne();
  136. k = k->release();
  137. cs.unlock();
  138. return 0;
  139. }
  140. else
  141. {
  142. k->setSendeKey( this->key, keyLen );
  143. k->setEmpfangKey( this->key, keyLen );
  144. cs.unlock();
  145. return 1;
  146. }
  147. }
  148. // Erzeugt einen Erhaltungs Server Client
  149. // Gibt bei misserfolg 0 zurück
  150. ErhaltungServerClient *MainClient::createErhaltungServerClient()
  151. {
  152. cs.lock();
  153. bool connected = k != 0;
  154. if( !connected )
  155. connect();
  156. if( !k )
  157. {
  158. err = "no connection to Main Server";
  159. cs.unlock();
  160. return 0;
  161. }
  162. k->sendeEncrypted( "\6\x8", 2 );
  163. char byte = 0;
  164. k->getNachrichtEncrypted( &byte, 1 );
  165. if( byte == 2 )
  166. {
  167. unsigned char lsIp[ 4 ];
  168. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  169. unsigned short lsPort = 0;
  170. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  171. Framework::Text ipT;
  172. ipT += (int)lsIp[ 0 ];
  173. ipT += ".";
  174. ipT += (int)lsIp[ 1 ];
  175. ipT += ".";
  176. ipT += (int)lsIp[ 2 ];
  177. ipT += ".";
  178. ipT += (int)lsIp[ 3 ];
  179. if( !connected )
  180. disconnect();
  181. cs.unlock();
  182. return new ErhaltungClient( cId, lsPort, ipT, key, keyLen );
  183. }
  184. else if( byte == 3 )
  185. {
  186. k->getNachrichtEncrypted( &byte, 1 );
  187. char *f = new char[ byte + 1 ];
  188. f[ byte ] = 0;
  189. k->getNachrichtEncrypted( f, byte );
  190. err = "error while requesting ErhaltungServer server returned: ";
  191. err += f;
  192. delete[]f;
  193. }
  194. if( !connected )
  195. disconnect();
  196. cs.unlock();
  197. return 0;
  198. }
  199. // Erzeugt einen Patch Server Client
  200. // Gibt bei misserfolg 0 zurück
  201. PatchServerClient *MainClient::createPatchServerClient()
  202. {
  203. cs.lock();
  204. bool connected = k != 0;
  205. if( !connected )
  206. connect();
  207. if( !k )
  208. {
  209. err = "no connection to Main Server";
  210. cs.unlock();
  211. return 0;
  212. }
  213. k->sendeEncrypted( "\6\2", 2 );
  214. char byte = 0;
  215. k->getNachrichtEncrypted( &byte, 1 );
  216. if( byte == 2 )
  217. {
  218. unsigned char lsIp[ 4 ];
  219. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  220. unsigned short lsPort = 0;
  221. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  222. Framework::Text ipT;
  223. ipT += (int)lsIp[ 0 ];
  224. ipT += ".";
  225. ipT += (int)lsIp[ 1 ];
  226. ipT += ".";
  227. ipT += (int)lsIp[ 2 ];
  228. ipT += ".";
  229. ipT += (int)lsIp[ 3 ];
  230. if( !connected )
  231. disconnect();
  232. cs.unlock();
  233. return new PatchClient( cId, lsPort, ipT, key, keyLen );
  234. }
  235. else if( byte == 3 )
  236. {
  237. k->getNachrichtEncrypted( &byte, 1 );
  238. char *f = new char[ byte + 1 ];
  239. f[ byte ] = 0;
  240. k->getNachrichtEncrypted( f, byte );
  241. err = "error while requesting PatchServer server returned: ";
  242. err += f;
  243. delete[]f;
  244. }
  245. if( !connected )
  246. disconnect();
  247. cs.unlock();
  248. return 0;
  249. }
  250. // Erzeugt einen News Server Client
  251. // Gibt bei misserfolg 0 zurück
  252. NewsServerClient *MainClient::createNewsServerClient()
  253. {
  254. cs.lock();
  255. bool connected = k != 0;
  256. if( !connected )
  257. connect();
  258. if( !k )
  259. {
  260. err = "no connection to Main Server";
  261. cs.unlock();
  262. return 0;
  263. }
  264. k->sendeEncrypted( "\6\x9", 2 );
  265. char byte = 0;
  266. k->getNachrichtEncrypted( &byte, 1 );
  267. if( byte == 2 )
  268. {
  269. unsigned char lsIp[ 4 ];
  270. k->getNachrichtEncrypted( (char *)lsIp, 4 );
  271. unsigned short lsPort = 0;
  272. k->getNachrichtEncrypted( (char*)&lsPort, 2 );
  273. Framework::Text ipT;
  274. ipT += (int)lsIp[ 0 ];
  275. ipT += ".";
  276. ipT += (int)lsIp[ 1 ];
  277. ipT += ".";
  278. ipT += (int)lsIp[ 2 ];
  279. ipT += ".";
  280. ipT += (int)lsIp[ 3 ];
  281. if( !connected )
  282. disconnect();
  283. cs.unlock();
  284. return new NewsClient( cId, lsPort, ipT, key, keyLen );
  285. }
  286. else if( byte == 3 )
  287. {
  288. k->getNachrichtEncrypted( &byte, 1 );
  289. char *f = new char[ byte + 1 ];
  290. f[ byte ] = 0;
  291. k->getNachrichtEncrypted( f, byte );
  292. err = "error while requesting NewsServer server returned: ";
  293. err += f;
  294. delete[]f;
  295. }
  296. if( !connected )
  297. disconnect();
  298. cs.unlock();
  299. return 0;
  300. }
  301. // Erzeugt einen Register Server Client
  302. // Gibt bei misserfolg 0 zurück
  303. RegisterServerClient *MainClient::createRegisterServerClient()
  304. {
  305. }
  306. // Erzeugt einen Login Server Client
  307. // Gibt bei misserfolg 0 zurück
  308. LoginServerClient *MainClient::createLoginServerClient()
  309. {
  310. }
  311. // Erzeugt einen Information Server Client
  312. // Gibt bei misserfolg 0 zurück
  313. InformationServerClient *MainClient::createInformationServerClient()
  314. {
  315. }
  316. // Erzeugt einen Chat Server Client
  317. // Gibt bei misserfolg 0 zurück
  318. ChatServerClient *MainClient::createChatServerClient()
  319. {
  320. }
  321. // Erzeugt einen Shop Server Client
  322. // Gibt bei misserfolg 0 zurück
  323. ShopServerClient *MainClient::createShopServerClient()
  324. {
  325. }
  326. // Erzeugt einen Anmeldung Server Client
  327. // Gibt bei misserfolg 0 zurück
  328. AnmeldungServerClient *MainClient::createAnmeldungServerClient()
  329. {
  330. }
  331. // Erzeugt einen Minigame Server Client
  332. // Gibt bei misserfolg 0 zurück
  333. MinigameServerClient *MainClient::createMinigameServerClient()
  334. {
  335. }
  336. // Trennt die Verbindung zum Server. Muss nur aufgerufen werden, wenn vorher manuell connect aufgerufen wurde
  337. bool MainClient::disconnect()
  338. {
  339. cs.lock();
  340. if( !k )
  341. {
  342. cs.unlock();
  343. return 1;
  344. }
  345. char serverReturn = 0;
  346. k->sendeEncrypted( "\3", 1 );
  347. k->getNachrichtEncrypted( &serverReturn, 1 );
  348. k->trenne();
  349. k = k->release();
  350. cs.unlock();
  351. return 1;
  352. }
  353. // Meldet den Client vom Server ab. Alle zuvor von diesem Client erzeugten Clients werden durch diesen Vorgang unbrauchbar
  354. bool MainClient::unregister()
  355. {
  356. cs.lock();
  357. bool connected = k != 0;
  358. if( !connected )
  359. connect();
  360. if( !k )
  361. {
  362. err = "no connection to Main Server";
  363. cs.unlock();
  364. return 0;
  365. }
  366. k->sendeEncrypted( "\7", 1 );
  367. char serverReturn = 0;
  368. k->getNachrichtEncrypted( &serverReturn, 1 );
  369. if( serverReturn == 3 )
  370. {
  371. k->getNachrichtEncrypted( &serverReturn, 1 );
  372. char *message = new char[ serverReturn + 1 ];
  373. message[ serverReturn ] = 0;
  374. k->getNachrichtEncrypted( message, serverReturn );
  375. err = "error while trying to unregistere client server returned: ";
  376. err += message;
  377. delete[] message;
  378. if( !connected )
  379. disconnect();
  380. cs.unlock();
  381. return 0;
  382. }
  383. disconnect();
  384. cId = 0;
  385. delete key;
  386. key = 0;
  387. keyLen = 0;
  388. port = 0;
  389. ip = "";
  390. cs.unlock();
  391. return 1;
  392. }
  393. // Gibt die dem Client zugewiesene Id zurück.
  394. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  395. int MainClient::getClientId() const
  396. {
  397. return cId;
  398. }
  399. // Gibt die Ip Adresse des dem Client zugewiesenen Main Servers zurück.
  400. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  401. Framework::Text *MainClient::getServerIp() const
  402. {
  403. return new Text( ip.getText() );
  404. }
  405. // Gibt den Port des dem Client zugewiesenen Main Servers zurück.
  406. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  407. unsigned short MainClient::getServerPort() const
  408. {
  409. return port;
  410. }
  411. // Gibt den Zeiger auf den Schlüssel zurück
  412. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  413. char *MainClient::zKey() const
  414. {
  415. return key;
  416. }
  417. // Gibt die Länge des Schlüssels zurück
  418. // sollte erst nach dem Aufruf von registerSSL verwendet werden.
  419. unsigned char MainClient::getKeyLen() const
  420. {
  421. return keyLen;
  422. }
  423. // gibt den Letzten Fehlertext zuück
  424. // sollte erst aufgerufen werden, nachdem eine andere aufgerufene Methode fehlgeschlagen ist
  425. char *MainClient::getLetzterFehler() const
  426. {
  427. return err;
  428. }
  429. // Erhöht den Reference Counter um 1 un gibt this zurück
  430. MainServerClient *MainClient::getThis()
  431. {
  432. ref++;
  433. return this;
  434. }
  435. // Verringert den Reference Counter um 1 und gibt 0 zurück.
  436. // Falls der Reference Counter nach dem Aufruf auf 0 ist löscht sich das Objekt selbst
  437. MainServerClient *MainClient::release()
  438. {
  439. if( !--ref )
  440. delete this;
  441. return 0;
  442. }