ShopClient.cpp 28 KB

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