ShopK.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164
  1. #include "../KSGKlient.h"
  2. #include "../KSGServer.h"
  3. #include <Datei.h>
  4. #include "../Keys.h"
  5. #include <Globals.h>
  6. // Inhalt der ShopKlient Klasse aus KSGKtient.h
  7. // Konstruktor
  8. ShopKlient::ShopKlient()
  9. {
  10. verbunden = 0;
  11. klient = 0;
  12. fehler = new Text( "" );
  13. klientId = getKlientId();
  14. ref = 1;
  15. }
  16. // Destruktor
  17. ShopKlient::~ShopKlient()
  18. {
  19. cs.lock();
  20. if( klient )
  21. {
  22. char serverReturn = 0;
  23. if( verbunden )
  24. {
  25. klient->sendeEncrypted( "\4", 1 );
  26. klient->getNachrichtEncrypted( &serverReturn, 1 );
  27. if( serverReturn == 3 )
  28. {
  29. char län = 0;
  30. klient->getNachrichtEncrypted( &län, 1 );
  31. char *nachricht = new char[ län + 1 ];
  32. nachricht[ län ] = 0;
  33. klient->getNachrichtEncrypted( nachricht, län );
  34. delete[]nachricht;
  35. }
  36. klient->sendeEncrypted( "\3", 1 );
  37. klient->getNachrichtEncrypted( &serverReturn, 1 );
  38. klient->trenne();
  39. }
  40. else
  41. {
  42. int keyLen = 0;
  43. char *key = 0;
  44. Keys::getServerKey( &key, keyLen, Keys::SHOP, Keys::SENDEN );
  45. klient->setSendeKey( key, keyLen );
  46. delete[] key;
  47. Keys::getServerKey( &key, keyLen, Keys::SHOP, Keys::EMPFANGEN );
  48. klient->setEmpfangKey( key, keyLen );
  49. delete[] key;
  50. klient->verbinde( klient->getServerPort(), klient->getServerIp() );
  51. klient->sendeEncrypted( "\1", 1 );
  52. klient->sendeEncrypted( (char*)&klientId, 4 );
  53. klient->getNachrichtEncrypted( &serverReturn, 1 );
  54. if( serverReturn == 3 )
  55. {
  56. char län = 0;
  57. klient->getNachrichtEncrypted( &län, 1 );
  58. char *nachricht = new char[ län + 1 ];
  59. nachricht[ län ] = 0;
  60. klient->getNachrichtEncrypted( nachricht, län );
  61. delete[]nachricht;
  62. }
  63. else
  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. klient->sendeEncrypted( "\4", 1 );
  71. klient->getNachrichtEncrypted( &serverReturn, 1 );
  72. if( serverReturn == 3 )
  73. {
  74. char län = 0;
  75. klient->getNachrichtEncrypted( &län, 1 );
  76. char *nachricht = new char[ län + 1 ];
  77. nachricht[ län ] = 0;
  78. klient->getNachrichtEncrypted( nachricht, län );
  79. delete[]nachricht;
  80. }
  81. }
  82. klient->sendeEncrypted( "\3", 1 );
  83. klient->getNachrichtEncrypted( &serverReturn, 1 );
  84. klient->trenne();
  85. }
  86. klient = klient->release();
  87. }
  88. fehler = fehler->release();
  89. cs.unlock();
  90. }
  91. // privat
  92. bool ShopKlient::verbinde( int port, char *ip ) // verbindet sich mit vorgegebenem Server
  93. {
  94. int keyLen = 0;
  95. char *key = 0;
  96. Framework::logLine( ( ( Text( "Zugeteilter Shop Server:" ) += ip ) += ":" ) += port );
  97. Framework::logLine( "Verbinung mit Shop Server wird hergestellt..." );
  98. Keys::getServerKey( &key, keyLen, Keys::SHOP, Keys::SENDEN );
  99. klient->setSendeKey( key, keyLen );
  100. delete[] key;
  101. Keys::getServerKey( &key, keyLen, Keys::SHOP, Keys::EMPFANGEN );
  102. klient->setEmpfangKey( key, keyLen );
  103. delete[] key;
  104. if( klient->verbinde( port, ip ) )
  105. {
  106. if( klient->sendeEncrypted( "\1", 1 ) )
  107. {
  108. klient->sendeEncrypted( (char*)&klientId, 4 );
  109. char serverReturn = 0;
  110. klient->getNachrichtEncrypted( &serverReturn, 1 );
  111. if( serverReturn == 3 )
  112. {
  113. char byte = 0;
  114. klient->getNachrichtEncrypted( &byte, 1 );
  115. char *f = new char[ byte + 1 ];
  116. f[ byte ] = 0;
  117. klient->getNachrichtEncrypted( f, byte );
  118. Framework::logLine( Text( "ERROR: " ) += f );
  119. fehler->setText( f );
  120. delete[]f;
  121. return 0;
  122. }
  123. char *sl = 0;
  124. char slLän = getSchlüssel( &sl );
  125. klient->setSendeKey( sl, slLän );
  126. klient->setEmpfangKey( sl, slLän );
  127. delete[] sl;
  128. Framework::logLine( "Erfolgreich mit Shop Server verbunden." );
  129. return 1;
  130. }
  131. else
  132. {
  133. Framework::logLine( "ERROR: Senden zum Server nicht moeglich." );
  134. fehler->setText( "Der dir zugewiesene Shop Server hat die Verbindung abgebrochen. Bitte versuche es Später erneut." );
  135. klient = klient->release();
  136. }
  137. }
  138. else
  139. {
  140. Framework::logLine( "ERROR: Server nicht erreichbar." );
  141. fehler->setText( "Der dir zugewiesene Shop Server antwortet nicht. Bitte versuche es Später erneut." );
  142. klient = klient->release();
  143. }
  144. return 0;
  145. }
  146. // nicht constant
  147. bool ShopKlient::verbinde() // verbindet ich mit dem Shop Server
  148. {
  149. cs.lock();
  150. if( verbunden )
  151. {
  152. cs.unlock();
  153. return 1;
  154. }
  155. if( !klient )
  156. {
  157. char *msIp = getMainServerIp();
  158. unsigned short msPort = getMainServerPort();
  159. klient = new Klient();
  160. int keyLen = 0;
  161. char *key = 0;
  162. Keys::getServerKey( &key, keyLen, Keys::MAIN, Keys::SENDEN );
  163. klient->setSendeKey( key, keyLen );
  164. delete[] key;
  165. Keys::getServerKey( &key, keyLen, Keys::MAIN, Keys::EMPFANGEN );
  166. klient->setEmpfangKey( key, keyLen );
  167. delete[] key;
  168. if( !klient->verbinde( msPort, msIp ) )
  169. {
  170. fehler->setText( "Fehler beim verbinden mit dem Main Server. Bitte versuche es Später erneut." );
  171. klient = klient->release();
  172. delete[]msIp;
  173. cs.unlock();
  174. return 0;
  175. }
  176. delete[]msIp;
  177. klient->sende( "\0", 1 ); // Verschlüsselung aktivieren
  178. klient->sendeEncrypted( "\1", 1 );
  179. klient->sendeEncrypted( (char*)&klientId, 4 );
  180. char serverReturn = 0;
  181. klient->getNachrichtEncrypted( &serverReturn, 1 );
  182. if( serverReturn == 3 )
  183. {
  184. char län = 0;
  185. klient->getNachrichtEncrypted( &län, 1 );
  186. char *nachricht = new char[ län + 1 ];
  187. nachricht[ län ] = 0;
  188. klient->getNachrichtEncrypted( nachricht, län );
  189. fehler->setText( nachricht );
  190. delete[]nachricht;
  191. klient->sendeEncrypted( "\3", 1 );
  192. klient->getNachrichtEncrypted( &serverReturn, 1 );
  193. klient->trenne();
  194. klient = klient->release();
  195. cs.unlock();
  196. return 0;
  197. }
  198. char *sl = 0;
  199. char slLän = getSchlüssel( &sl );
  200. klient->setSendeKey( sl, slLän );
  201. klient->setEmpfangKey( sl, slLän );
  202. delete[] sl;
  203. klient->sendeEncrypted( "\6\7", 2 );
  204. char byte = 0;
  205. klient->getNachrichtEncrypted( &byte, 1 );
  206. if( byte == 2 )
  207. {
  208. unsigned char lsIp[ 4 ];
  209. klient->getNachrichtEncrypted( (char *)lsIp, 4 );
  210. unsigned short lsPort = 0;
  211. klient->getNachrichtEncrypted( (char*)&lsPort, 2 );
  212. klient->sendeEncrypted( "\3", 1 );
  213. klient->getNachrichtEncrypted( &serverReturn, 1 );
  214. klient->trenne();
  215. Text *lsIpT = new Text( "" );
  216. lsIpT->append( (int)lsIp[ 0 ] );
  217. lsIpT->append( "." );
  218. lsIpT->append( (int)lsIp[ 1 ] );
  219. lsIpT->append( "." );
  220. lsIpT->append( (int)lsIp[ 2 ] );
  221. lsIpT->append( "." );
  222. lsIpT->append( (int)lsIp[ 3 ] );
  223. int keyLen = 0;
  224. char *key = 0;
  225. Keys::getServerKey( &key, keyLen, Keys::SHOP, Keys::SENDEN );
  226. klient->setSendeKey( key, keyLen );
  227. delete[] key;
  228. Keys::getServerKey( &key, keyLen, Keys::SHOP, Keys::EMPFANGEN );
  229. klient->setEmpfangKey( key, keyLen );
  230. delete[] key;
  231. klient->verbinde( lsPort, lsIpT->getText() );
  232. lsIpT = lsIpT->release();
  233. klient->sendeEncrypted( "\3", 1 );
  234. klient->getNachrichtEncrypted( &serverReturn, 1 );
  235. klient->trenne();
  236. }
  237. if( byte == 3 )
  238. {
  239. klient->getNachrichtEncrypted( &byte, 1 );
  240. char *f = new char[ byte + 1 ];
  241. f[ byte ] = 0;
  242. klient->getNachrichtEncrypted( f, byte );
  243. fehler->setText( f );
  244. delete[]f;
  245. klient->sendeEncrypted( "\3", 1 );
  246. klient->getNachrichtEncrypted( &serverReturn, 1 );
  247. klient->trenne();
  248. klient = klient->release();
  249. cs.unlock();
  250. return 0;
  251. }
  252. }
  253. int keyLen = 0;
  254. char *key = 0;
  255. Keys::getServerKey( &key, keyLen, Keys::SHOP, Keys::SENDEN );
  256. klient->setSendeKey( key, keyLen );
  257. delete[] key;
  258. Keys::getServerKey( &key, keyLen, Keys::SHOP, Keys::EMPFANGEN );
  259. klient->setEmpfangKey( key, keyLen );
  260. delete[] key;
  261. if( klient->verbinde( klient->getServerPort(), klient->getServerIp() ) )
  262. {
  263. if( klient->sendeEncrypted( "\1", 1 ) )
  264. {
  265. klient->sendeEncrypted( (char*)&klientId, 4 );
  266. char serverReturn = 0;
  267. klient->getNachrichtEncrypted( &serverReturn, 1 );
  268. if( serverReturn == 3 )
  269. {
  270. char byte = 0;
  271. klient->getNachrichtEncrypted( &byte, 1 );
  272. char *f = new char[ byte + 1 ];
  273. f[ byte ] = 0;
  274. klient->getNachrichtEncrypted( f, byte );
  275. fehler->setText( f );
  276. delete[]f;
  277. klient->sendeEncrypted( "\3", 1 );
  278. klient->getNachrichtEncrypted( &serverReturn, 1 );
  279. klient->trenne();
  280. cs.unlock();
  281. return 0;
  282. }
  283. char *sl = 0;
  284. char slLän = getSchlüssel( &sl );
  285. klient->setSendeKey( sl, slLän );
  286. klient->setEmpfangKey( sl, slLän );
  287. delete[] sl;
  288. verbunden = 1;
  289. cs.unlock();
  290. return 1;
  291. }
  292. else
  293. {
  294. fehler->setText( "Der dir zugewiesene Shop Server hat die Verbindung abgebrochen. Bitte versuche es Später erneut." );
  295. klient = klient->release();
  296. }
  297. }
  298. else
  299. {
  300. fehler->setText( "Der dir zugewiesene Shop Server antwortet nicht. Bitte versuche es Später erneut." );
  301. klient = klient->release();
  302. }
  303. cs.unlock();
  304. return 0;
  305. }
  306. Array< int > *ShopKlient::suchSpiele( const char *suche ) // sucht nach Spielen
  307. {
  308. char län = (char)textLength( suche );
  309. char ret = 0;
  310. cs.lock();
  311. if( !verbunden )
  312. verbinde();
  313. if( !verbunden )
  314. {
  315. cs.unlock();
  316. return 0;
  317. }
  318. klient->sendeEncrypted( "\5", 1 );
  319. klient->getNachrichtEncrypted( &ret, 1 );
  320. if( ret == 1 )
  321. {
  322. klient->sendeEncrypted( &län, 1 );
  323. if( län )
  324. klient->sendeEncrypted( suche, län );
  325. klient->getNachrichtEncrypted( &ret, 1 );
  326. if( ret == 1 )
  327. {
  328. int anz = 0;
  329. klient->getNachrichtEncrypted( (char*)&anz, 4 );
  330. Array< int > *ret = new Array< int >();
  331. for( int i = 0; i < anz; i++ )
  332. {
  333. int w = 0;
  334. klient->getNachrichtEncrypted( (char*)&w, 4 );
  335. ret->add( w );
  336. }
  337. cs.unlock();
  338. return ret;
  339. }
  340. }
  341. if( ret == 3 )
  342. {
  343. klient->getNachrichtEncrypted( &län, 1 );
  344. char *err = new char[ län + 1 ];
  345. err[ län ] = 0;
  346. if( län )
  347. klient->getNachrichtEncrypted( err, län );
  348. fehler->setText( err );
  349. delete[] err;
  350. }
  351. cs.unlock();
  352. return 0;
  353. }
  354. bool ShopKlient::ladeSpielTitel( int id ) // läd Titelbild des Spieles herunter
  355. {
  356. char ret = 0;
  357. cs.lock();
  358. if( !verbunden )
  359. verbinde();
  360. if( !verbunden )
  361. {
  362. cs.unlock();
  363. return 0;
  364. }
  365. klient->sendeEncrypted( "\6", 1 );
  366. klient->getNachrichtEncrypted( &ret, 1 );
  367. if( ret == 1 )
  368. {
  369. klient->sendeEncrypted( (char*)&id, 4 );
  370. klient->getNachrichtEncrypted( &ret, 1 );
  371. if( ret == 1 )
  372. {
  373. Text *pf = new Text( "data/tmp/shop/kaufen/spiele/" );
  374. pf->append( id );
  375. pf->append( "/titelbg.ltdb" );
  376. Datei *dat = new Datei();
  377. dat->setDatei( pf );
  378. dat->erstellen();
  379. dat->open( Datei::Style::schreiben );
  380. __int64 gr = 0;
  381. klient->getNachrichtEncrypted( (char*)&gr, 8 );
  382. char bytes[ 2048 ];
  383. while( gr > 0 )
  384. {
  385. int län = gr > 2048 ? 2048 : (int)gr;
  386. klient->getNachricht( bytes, län );
  387. dat->schreibe( bytes, län );
  388. gr -= län;
  389. }
  390. dat->close();
  391. dat->release();
  392. }
  393. if( ret == 2 )
  394. { // Verweis auf anderen ShopServer
  395. int port = 0;
  396. char län = 0;
  397. klient->getNachrichtEncrypted( (char*)&port, 4 );
  398. klient->getNachrichtEncrypted( &län, 1 );
  399. char *ip = new char[ län + 1 ];
  400. klient->getNachrichtEncrypted( ip, län );
  401. ip[ län ] = 0;
  402. klient->trenne();
  403. if( !verbinde( port, ip ) )
  404. {
  405. delete[] ip;
  406. trenne();
  407. cs.unlock();
  408. return 0;
  409. }
  410. delete[] ip;
  411. cs.unlock();
  412. return ladeSpielTitel( id );
  413. }
  414. }
  415. if( ret == 3 )
  416. {
  417. klient->getNachrichtEncrypted( &ret, 1 );
  418. char *err = new char[ ret + 1 ];
  419. err[ ret ] = 0;
  420. if( ret )
  421. klient->getNachrichtEncrypted( err, ret );
  422. fehler->setText( err );
  423. delete[] err;
  424. cs.unlock();
  425. return 0;
  426. }
  427. cs.unlock();
  428. return 1;
  429. }
  430. bool ShopKlient::ladeSpielSeite( int id ) // läd Seite des Spieles herunter
  431. {
  432. char ret = 0;
  433. cs.lock();
  434. if( !verbunden )
  435. verbinde();
  436. if( !verbunden )
  437. {
  438. cs.unlock();
  439. return 0;
  440. }
  441. klient->sendeEncrypted( "\7", 1 );
  442. klient->getNachrichtEncrypted( &ret, 1 );
  443. if( ret == 1 )
  444. {
  445. klient->sendeEncrypted( (char*)&id, 4 );
  446. klient->getNachrichtEncrypted( &ret, 1 );
  447. if( ret == 1 )
  448. {
  449. Text *pf = new Text( "data/tmp/shop/kaufen/spiele/" );
  450. pf->append( id );
  451. pf->append( "/" );
  452. int anz = 0;
  453. klient->getNachrichtEncrypted( (char*)&anz, 4 );
  454. for( int i = 0; i < anz; i++ )
  455. {
  456. char län = 0;
  457. klient->getNachrichtEncrypted( &län, 1 );
  458. char *name = new char[ län + 1 ];
  459. name[ län ] = 0;
  460. klient->getNachrichtEncrypted( name, län );
  461. Text *pfad = new Text( pf->getText() );
  462. pfad->append( name );
  463. delete[] name;
  464. Datei *d = new Datei();
  465. d->setDatei( pfad );
  466. d->erstellen();
  467. d->open( Datei::Style::schreiben );
  468. __int64 gr = 0;
  469. klient->getNachrichtEncrypted( (char*)&gr, 8 );
  470. char bytes[ 2048 ];
  471. while( gr > 0 )
  472. {
  473. int län = gr > 2048 ? 2048 : (int)gr;
  474. klient->getNachricht( bytes, län );
  475. d->schreibe( bytes, län );
  476. gr -= län;
  477. }
  478. d->close();
  479. d->release();
  480. }
  481. pf->release();
  482. }
  483. if( ret == 2 )
  484. { // Verweis auf anderen ShopServer
  485. int port = 0;
  486. char län = 0;
  487. klient->getNachrichtEncrypted( (char*)&port, 4 );
  488. klient->getNachrichtEncrypted( &län, 1 );
  489. char *ip = new char[ län + 1 ];
  490. klient->getNachrichtEncrypted( ip, län );
  491. ip[ län ] = 0;
  492. klient->trenne();
  493. if( !verbinde( port, ip ) )
  494. {
  495. delete[] ip;
  496. trenne();
  497. cs.unlock();
  498. return 0;
  499. }
  500. delete[] ip;
  501. cs.unlock();
  502. return ladeSpielSeite( id );
  503. }
  504. }
  505. if( ret == 3 )
  506. {
  507. klient->getNachrichtEncrypted( &ret, 1 );
  508. char *err = new char[ ret + 1 ];
  509. err[ ret ] = 0;
  510. if( ret )
  511. klient->getNachrichtEncrypted( err, ret );
  512. fehler->setText( err );
  513. delete[] err;
  514. cs.unlock();
  515. return 0;
  516. }
  517. cs.unlock();
  518. return 1;
  519. }
  520. int ShopKlient::getSpielBesitzStatus( int id ) // 0 = nicht im Besitz, 1 = Testversion, 2 = gekauft
  521. {
  522. char ret = 0;
  523. cs.lock();
  524. if( !verbunden )
  525. verbinde();
  526. if( !verbunden )
  527. {
  528. cs.unlock();
  529. return 0;
  530. }
  531. klient->sendeEncrypted( "\x8", 1 );
  532. klient->getNachrichtEncrypted( &ret, 1 );
  533. if( ret == 1 )
  534. {
  535. klient->sendeEncrypted( (char*)&id, 4 );
  536. int ret = 0;
  537. klient->getNachrichtEncrypted( (char*)&ret, 4 );
  538. cs.unlock();
  539. return ret;
  540. }
  541. if( ret == 3 )
  542. {
  543. klient->getNachrichtEncrypted( &ret, 1 );
  544. char *err = new char[ ret + 1 ];
  545. err[ ret ] = 0;
  546. if( ret )
  547. klient->getNachrichtEncrypted( err, ret );
  548. fehler->setText( err );
  549. delete[] err;
  550. }
  551. cs.unlock();
  552. return 0;
  553. }
  554. int ShopKlient::getSpielTestversion( int id ) // gibt die Anzahl der verbleibenden Spiele zurück
  555. {
  556. char ret = 0;
  557. cs.lock();
  558. if( !verbunden )
  559. verbinde();
  560. if( !verbunden )
  561. {
  562. cs.unlock();
  563. return 0;
  564. }
  565. klient->sendeEncrypted( "\x9", 1 );
  566. klient->getNachrichtEncrypted( &ret, 1 );
  567. if( ret == 1 )
  568. {
  569. klient->sendeEncrypted( (char*)&id, 4 );
  570. int ret = 0;
  571. klient->getNachrichtEncrypted( (char*)&ret, 4 );
  572. cs.unlock();
  573. return ret;
  574. }
  575. if( ret == 3 )
  576. {
  577. klient->getNachrichtEncrypted( &ret, 1 );
  578. char *err = new char[ ret + 1 ];
  579. err[ ret ] = 0;
  580. if( ret )
  581. klient->getNachrichtEncrypted( err, ret );
  582. fehler->setText( err );
  583. delete[] err;
  584. }
  585. cs.unlock();
  586. return 0;
  587. }
  588. int ShopKlient::istSpielErwerbbar( int id ) // prüft, ob das Spiel erworben werden kann
  589. {
  590. char ret = 0;
  591. cs.lock();
  592. if( !verbunden )
  593. verbinde();
  594. if( !verbunden )
  595. {
  596. cs.unlock();
  597. return 0;
  598. }
  599. klient->sendeEncrypted( "\xA", 1 );
  600. klient->getNachrichtEncrypted( &ret, 1 );
  601. if( ret == 1 )
  602. {
  603. klient->sendeEncrypted( (char*)&id, 4 );
  604. int ret = 0;
  605. klient->getNachrichtEncrypted( (char*)&ret, 4 );
  606. cs.unlock();
  607. return ret;
  608. }
  609. if( ret == 3 )
  610. {
  611. klient->getNachrichtEncrypted( &ret, 1 );
  612. char *err = new char[ ret + 1 ];
  613. err[ ret ] = 0;
  614. if( ret )
  615. klient->getNachrichtEncrypted( err, ret );
  616. fehler->setText( err );
  617. delete[] err;
  618. }
  619. cs.unlock();
  620. return 0;
  621. }
  622. int ShopKlient::getSpielPreis( int id, bool testVersion ) // gibt den Preis eines Spieles zurück
  623. {
  624. char ret = 0;
  625. cs.lock();
  626. if( !verbunden )
  627. verbinde();
  628. if( !verbunden )
  629. {
  630. cs.unlock();
  631. return 0;
  632. }
  633. klient->sendeEncrypted( "\xB", 1 );
  634. klient->getNachrichtEncrypted( &ret, 1 );
  635. if( ret == 1 )
  636. {
  637. klient->sendeEncrypted( (char*)&id, 4 );
  638. klient->sendeEncrypted( (char*)&testVersion, 1 );
  639. int ret = 0;
  640. klient->getNachrichtEncrypted( (char*)&ret, 4 );
  641. cs.unlock();
  642. return ret;
  643. }
  644. if( ret == 3 )
  645. {
  646. klient->getNachrichtEncrypted( &ret, 1 );
  647. char *err = new char[ ret + 1 ];
  648. err[ ret ] = 0;
  649. if( ret )
  650. klient->getNachrichtEncrypted( err, ret );
  651. fehler->setText( err );
  652. delete[] err;
  653. }
  654. cs.unlock();
  655. return 0;
  656. }
  657. bool ShopKlient::spielErwerben( int spielId, bool testVersion ) // Spiel kaufen
  658. {
  659. char ret = 0;
  660. cs.lock();
  661. if( !verbunden )
  662. verbinde();
  663. if( !verbunden )
  664. {
  665. cs.unlock();
  666. return 0;
  667. }
  668. klient->sendeEncrypted( "\xC", 1 );
  669. klient->getNachrichtEncrypted( &ret, 1 );
  670. if( ret == 1 )
  671. {
  672. klient->sendeEncrypted( (char*)&spielId, 4 );
  673. klient->sendeEncrypted( (char*)&testVersion, 1 );
  674. klient->getNachrichtEncrypted( &ret, 1 );
  675. if( ret == 1 )
  676. {
  677. cs.unlock();
  678. return 1;
  679. }
  680. }
  681. if( ret == 3 )
  682. {
  683. klient->getNachrichtEncrypted( &ret, 1 );
  684. char *err = new char[ ret + 1 ];
  685. err[ ret ] = 0;
  686. if( ret )
  687. klient->getNachrichtEncrypted( err, ret );
  688. fehler->setText( err );
  689. delete[] err;
  690. }
  691. cs.unlock();
  692. return 0;
  693. }
  694. Array< int > *ShopKlient::suchKarten( const char *suche, int spielId ) // sucht nach Karten
  695. {
  696. char län = (char)textLength( suche );
  697. char ret = 0;
  698. cs.lock();
  699. if( !verbunden )
  700. verbinde();
  701. if( !verbunden )
  702. {
  703. cs.unlock();
  704. return 0;
  705. }
  706. klient->sendeEncrypted( "\xD", 1 );
  707. klient->getNachrichtEncrypted( &ret, 1 );
  708. if( ret == 1 )
  709. {
  710. klient->sendeEncrypted( (char*)&spielId, 4 );
  711. klient->sendeEncrypted( &län, 1 );
  712. if( län )
  713. klient->sendeEncrypted( suche, län );
  714. klient->getNachrichtEncrypted( &ret, 1 );
  715. if( ret == 1 )
  716. {
  717. int anz = 0;
  718. klient->getNachrichtEncrypted( (char*)&anz, 4 );
  719. Array< int > *ret = new Array< int >();
  720. for( int i = 0; i < anz; i++ )
  721. {
  722. int w = 0;
  723. klient->getNachrichtEncrypted( (char*)&w, 4 );
  724. ret->add( w );
  725. }
  726. cs.unlock();
  727. return ret;
  728. }
  729. }
  730. if( ret == 3 )
  731. {
  732. klient->getNachrichtEncrypted( &län, 1 );
  733. char *err = new char[ län + 1 ];
  734. err[ län ] = 0;
  735. if( län )
  736. klient->getNachrichtEncrypted( err, län );
  737. fehler->setText( err );
  738. delete[] err;
  739. }
  740. cs.unlock();
  741. return 0;
  742. }
  743. bool ShopKlient::ladeKarteTitel( int id ) // läd Titelbild der Karte herunter
  744. {
  745. char ret = 0;
  746. cs.lock();
  747. if( !verbunden )
  748. verbinde();
  749. if( !verbunden )
  750. {
  751. cs.unlock();
  752. return 0;
  753. }
  754. klient->sendeEncrypted( "\xE", 1 );
  755. klient->getNachrichtEncrypted( &ret, 1 );
  756. if( ret == 1 )
  757. {
  758. klient->sendeEncrypted( (char*)&id, 4 );
  759. klient->getNachrichtEncrypted( &ret, 1 );
  760. if( ret == 1 )
  761. {
  762. Text *pf = new Text( "data/tmp/shop/kaufen/karten/" );
  763. pf->append( id );
  764. pf->append( "/titelbg.ltdb" );
  765. Datei *dat = new Datei();
  766. dat->setDatei( pf );
  767. dat->erstellen();
  768. dat->open( Datei::Style::schreiben );
  769. __int64 gr = 0;
  770. klient->getNachrichtEncrypted( (char*)&gr, 8 );
  771. char bytes[ 2048 ];
  772. while( gr > 0 )
  773. {
  774. int län = gr > 2048 ? 2048 : (int)gr;
  775. klient->getNachricht( bytes, län );
  776. dat->schreibe( bytes, län );
  777. gr -= län;
  778. }
  779. dat->close();
  780. dat->release();
  781. }
  782. if( ret == 2 )
  783. { // Verweis auf anderen ShopServer
  784. int port = 0;
  785. char län = 0;
  786. klient->getNachrichtEncrypted( (char*)&port, 4 );
  787. klient->getNachrichtEncrypted( &län, 1 );
  788. char *ip = new char[ län + 1 ];
  789. klient->getNachrichtEncrypted( ip, län );
  790. ip[ län ] = 0;
  791. klient->trenne();
  792. if( !verbinde( port, ip ) )
  793. {
  794. delete[] ip;
  795. trenne();
  796. cs.unlock();
  797. return 0;
  798. }
  799. delete[] ip;
  800. cs.unlock();
  801. return ladeKarteTitel( id );
  802. }
  803. }
  804. if( ret == 3 )
  805. {
  806. klient->getNachrichtEncrypted( &ret, 1 );
  807. char *err = new char[ ret + 1 ];
  808. err[ ret ] = 0;
  809. if( ret )
  810. klient->getNachrichtEncrypted( err, ret );
  811. fehler->setText( err );
  812. delete[] err;
  813. cs.unlock();
  814. return 0;
  815. }
  816. cs.unlock();
  817. return 1;
  818. }
  819. bool ShopKlient::ladeKarteSeite( int id ) // läd Seite der Karte herunter
  820. {
  821. char ret = 0;
  822. cs.lock();
  823. if( !verbunden )
  824. verbinde();
  825. if( !verbunden )
  826. {
  827. cs.unlock();
  828. return 0;
  829. }
  830. klient->sendeEncrypted( "\xF", 1 );
  831. klient->getNachrichtEncrypted( &ret, 1 );
  832. if( ret == 1 )
  833. {
  834. klient->sendeEncrypted( (char*)&id, 4 );
  835. klient->getNachrichtEncrypted( &ret, 1 );
  836. if( ret == 1 )
  837. {
  838. Text *pf = new Text( "data/tmp/shop/kaufen/karten/" );
  839. pf->append( id );
  840. pf->append( "/" );
  841. int anz = 0;
  842. klient->getNachrichtEncrypted( (char*)&anz, 4 );
  843. for( int i = 0; i < anz; i++ )
  844. {
  845. char län = 0;
  846. klient->getNachrichtEncrypted( &län, 1 );
  847. char *name = new char[ län + 1 ];
  848. name[ län ] = 0;
  849. klient->getNachrichtEncrypted( name, län );
  850. Text *pfad = new Text( pf->getText() );
  851. pfad->append( name );
  852. delete[] name;
  853. Datei *d = new Datei();
  854. d->setDatei( pfad );
  855. d->erstellen();
  856. d->open( Datei::Style::schreiben );
  857. __int64 gr = 0;
  858. klient->getNachrichtEncrypted( (char*)&gr, 8 );
  859. char bytes[ 2048 ];
  860. while( gr > 0 )
  861. {
  862. int län = gr > 2048 ? 2048 : (int)gr;
  863. klient->getNachricht( bytes, län );
  864. d->schreibe( bytes, län );
  865. gr -= län;
  866. }
  867. d->close();
  868. d->release();
  869. }
  870. pf->release();
  871. }
  872. if( ret == 2 )
  873. { // Verweis auf anderen ShopServer
  874. int port = 0;
  875. char län = 0;
  876. klient->getNachrichtEncrypted( (char*)&port, 4 );
  877. klient->getNachrichtEncrypted( &län, 1 );
  878. char *ip = new char[ län + 1 ];
  879. klient->getNachrichtEncrypted( ip, län );
  880. ip[ län ] = 0;
  881. klient->trenne();
  882. if( !verbinde( port, ip ) )
  883. {
  884. delete[] ip;
  885. trenne();
  886. cs.unlock();
  887. return 0;
  888. }
  889. delete[] ip;
  890. cs.unlock();
  891. return ladeKarteSeite( id );
  892. }
  893. }
  894. if( ret == 3 )
  895. {
  896. klient->getNachrichtEncrypted( &ret, 1 );
  897. char *err = new char[ ret + 1 ];
  898. err[ ret ] = 0;
  899. if( ret )
  900. klient->getNachrichtEncrypted( err, ret );
  901. fehler->setText( err );
  902. delete[] err;
  903. cs.unlock();
  904. return 0;
  905. }
  906. cs.unlock();
  907. return 1;
  908. }
  909. int ShopKlient::getKarteBesitzStatus( int id ) // 0 = nicht im Besitz, 1 = Testversion, 2 = gekauft
  910. {
  911. char ret = 0;
  912. cs.lock();
  913. if( !verbunden )
  914. verbinde();
  915. if( !verbunden )
  916. {
  917. cs.unlock();
  918. return 0;
  919. }
  920. klient->sendeEncrypted( "\x10", 1 );
  921. klient->getNachrichtEncrypted( &ret, 1 );
  922. if( ret == 1 )
  923. {
  924. klient->sendeEncrypted( (char*)&id, 4 );
  925. int ret = 0;
  926. klient->getNachrichtEncrypted( (char*)&ret, 4 );
  927. cs.unlock();
  928. return ret;
  929. }
  930. if( ret == 3 )
  931. {
  932. klient->getNachrichtEncrypted( &ret, 1 );
  933. char *err = new char[ ret + 1 ];
  934. err[ ret ] = 0;
  935. if( ret )
  936. klient->getNachrichtEncrypted( err, ret );
  937. fehler->setText( err );
  938. delete[] err;
  939. }
  940. cs.unlock();
  941. return 0;
  942. }
  943. int ShopKlient::getKarteTestversion( int id ) // gibt die Anzahl der verbleibenden Spiele zurück
  944. {
  945. char ret = 0;
  946. cs.lock();
  947. if( !verbunden )
  948. verbinde();
  949. if( !verbunden )
  950. {
  951. cs.unlock();
  952. return 0;
  953. }
  954. klient->sendeEncrypted( "\x11", 1 );
  955. klient->getNachrichtEncrypted( &ret, 1 );
  956. if( ret == 1 )
  957. {
  958. klient->sendeEncrypted( (char*)&id, 4 );
  959. int ret = 0;
  960. klient->getNachrichtEncrypted( (char*)&ret, 4 );
  961. cs.unlock();
  962. return ret;
  963. }
  964. if( ret == 3 )
  965. {
  966. klient->getNachrichtEncrypted( &ret, 1 );
  967. char *err = new char[ ret + 1 ];
  968. err[ ret ] = 0;
  969. if( ret )
  970. klient->getNachrichtEncrypted( err, ret );
  971. fehler->setText( err );
  972. delete[] err;
  973. }
  974. cs.unlock();
  975. return 0;
  976. }
  977. int ShopKlient::istKarteErwerbbar( int id ) // prüft, ob die Karte erworben werden kann
  978. {
  979. char ret = 0;
  980. cs.lock();
  981. if( !verbunden )
  982. verbinde();
  983. if( !verbunden )
  984. {
  985. cs.unlock();
  986. return 0;
  987. }
  988. klient->sendeEncrypted( "\x12", 1 );
  989. klient->getNachrichtEncrypted( &ret, 1 );
  990. if( ret == 1 )
  991. {
  992. klient->sendeEncrypted( (char*)&id, 4 );
  993. int ret = 0;
  994. klient->getNachrichtEncrypted( (char*)&ret, 4 );
  995. cs.unlock();
  996. return ret;
  997. }
  998. if( ret == 3 )
  999. {
  1000. klient->getNachrichtEncrypted( &ret, 1 );
  1001. char *err = new char[ ret + 1 ];
  1002. err[ ret ] = 0;
  1003. if( ret )
  1004. klient->getNachrichtEncrypted( err, ret );
  1005. fehler->setText( err );
  1006. delete[] err;
  1007. }
  1008. cs.unlock();
  1009. return 0;
  1010. }
  1011. int ShopKlient::getKartePreis( int id, bool testVersion ) // gibt den Preis einer Karte zurück
  1012. {
  1013. char ret = 0;
  1014. cs.lock();
  1015. if( !verbunden )
  1016. verbinde();
  1017. if( !verbunden )
  1018. {
  1019. cs.unlock();
  1020. return 0;
  1021. }
  1022. klient->sendeEncrypted( "\x13", 1 );
  1023. klient->getNachrichtEncrypted( &ret, 1 );
  1024. if( ret == 1 )
  1025. {
  1026. klient->sendeEncrypted( (char*)&id, 4 );
  1027. klient->sendeEncrypted( (char*)&testVersion, 1 );
  1028. int ret = 0;
  1029. klient->getNachrichtEncrypted( (char*)&ret, 4 );
  1030. cs.unlock();
  1031. return ret;
  1032. }
  1033. if( ret == 3 )
  1034. {
  1035. klient->getNachrichtEncrypted( &ret, 1 );
  1036. char *err = new char[ ret + 1 ];
  1037. err[ ret ] = 0;
  1038. if( ret )
  1039. klient->getNachrichtEncrypted( err, ret );
  1040. fehler->setText( err );
  1041. delete[] err;
  1042. }
  1043. cs.unlock();
  1044. return 0;
  1045. }
  1046. bool ShopKlient::karteErwerben( int karteId, bool testVersion ) // Karte kaufen
  1047. {
  1048. char ret = 0;
  1049. cs.lock();
  1050. if( !verbunden )
  1051. verbinde();
  1052. if( !verbunden )
  1053. {
  1054. cs.unlock();
  1055. return 0;
  1056. }
  1057. klient->sendeEncrypted( "\x14", 1 );
  1058. klient->getNachrichtEncrypted( &ret, 1 );
  1059. if( ret == 1 )
  1060. {
  1061. klient->sendeEncrypted( (char*)&karteId, 4 );
  1062. klient->sendeEncrypted( (char*)&testVersion, 1 );
  1063. klient->getNachrichtEncrypted( &ret, 1 );
  1064. if( ret == 1 )
  1065. {
  1066. cs.unlock();
  1067. return 1;
  1068. }
  1069. }
  1070. if( ret == 3 )
  1071. {
  1072. klient->getNachrichtEncrypted( &ret, 1 );
  1073. char *err = new char[ ret + 1 ];
  1074. err[ ret ] = 0;
  1075. if( ret )
  1076. klient->getNachrichtEncrypted( err, ret );
  1077. fehler->setText( err );
  1078. delete[] err;
  1079. }
  1080. cs.unlock();
  1081. return 0;
  1082. }
  1083. bool ShopKlient::keepAlive() // Erhält die Verbindung aufrecht
  1084. {
  1085. if( !verbunden )
  1086. return 0;
  1087. char res = 0;
  1088. if( !cs.tryLock() )
  1089. return 1;
  1090. Framework::logLine( "Verbindungstest zum Shop Server..." );
  1091. bool ok = klient->sendeEncrypted( "\x15", 1 );
  1092. ok &= klient->getNachrichtEncrypted( &res, 1 );
  1093. cs.unlock();
  1094. if( res != 1 || !ok )
  1095. {
  1096. Framework::logLine( "Verbindungsabbruch." );
  1097. trenne();
  1098. }
  1099. else
  1100. Framework::logLine( "Verbindung besteht." );
  1101. return res == 1;
  1102. }
  1103. bool ShopKlient::trenne() // trennt sich von dem Shop Server
  1104. {
  1105. if( !verbunden )
  1106. return 1;
  1107. cs.lock();
  1108. Framework::logLine( "Verbindung zum Shop Server wird getrennt..." );
  1109. klient->sendeEncrypted( "\3", 1 );
  1110. char serverReturn = 0;
  1111. klient->getNachrichtEncrypted( &serverReturn, 1 );
  1112. klient->trenne();
  1113. verbunden = 0;
  1114. cs.unlock();
  1115. return 1;
  1116. }
  1117. // constant
  1118. bool ShopKlient::istVerbunden() const // prüft, ob mit Shop Server verbunden
  1119. {
  1120. return verbunden;
  1121. }
  1122. char *ShopKlient::getLetzterFehler() const // gibt den Letzten Fehlertext zuück
  1123. {
  1124. return fehler->getText();
  1125. }
  1126. // Reference Counting
  1127. ShopKlient *ShopKlient::getThis()
  1128. {
  1129. ref++;
  1130. return this;
  1131. }
  1132. ShopKlient *ShopKlient::release()
  1133. {
  1134. ref--;
  1135. if( !ref )
  1136. delete this;
  1137. return 0;
  1138. }