ShopK.cpp 33 KB

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