InformationClient.cpp 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106
  1. #include "InformationClient.h"
  2. #include "Keys.h"
  3. #include <Klient.h>
  4. #include "EditorClient.h"
  5. #include "KartenClient.h"
  6. #include "HistorieClient.h"
  7. using namespace KSGClient;
  8. // Inhalt der InformationClient Klasse
  9. // Konstruktor
  10. InformationClient::InformationClient( int kId, unsigned short port, char *ip, char *key, unsigned char keyLen )
  11. {
  12. ref = 1;
  13. this->ip = ip;
  14. this->port = port;
  15. cId = kId;
  16. k = 0;
  17. this->key = new char[ keyLen ];
  18. memcpy( this->key, key, keyLen );
  19. this->keyLen = keyLen;
  20. }
  21. // Destruktor
  22. InformationClient::~InformationClient()
  23. {
  24. trenne( 1 );
  25. delete[] key;
  26. }
  27. // verbindet ich mit dem zugewiesenen Informaion Server
  28. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  29. bool InformationClient::verbinde()
  30. {
  31. cs.lock();
  32. if( k )
  33. {
  34. cs.unlock();
  35. return 1;
  36. }
  37. k = new Network::Klient();
  38. int l = 0;
  39. char *key;
  40. Keys::getServerKey( &key, l, Keys::INFORMATION, Keys::SENDEN );
  41. k->setSendeKey( key, l );
  42. delete[] key;
  43. Keys::getServerKey( &key, l, Keys::INFORMATION, Keys::EMPFANGEN );
  44. k->setEmpfangKey( key, l );
  45. delete[] key;
  46. if( k->verbinde( port, ip ) )
  47. {
  48. if( k->sendeEncrypted( "\1", 1 ) )
  49. {
  50. k->sendeEncrypted( (char*)&cId, 4 );
  51. char serverReturn = 0;
  52. k->getNachrichtEncrypted( &serverReturn, 1 );
  53. if( serverReturn == 3 )
  54. {
  55. char byte = 0;
  56. k->getNachrichtEncrypted( &byte, 1 );
  57. char *f = new char[ byte + 1 ];
  58. f[ byte ] = 0;
  59. k->getNachrichtEncrypted( f, byte );
  60. err = "error while identifying client Information Server returned: ";
  61. err += f;
  62. delete[]f;
  63. trenne( 0 );
  64. cs.unlock();
  65. return 0;
  66. }
  67. k->setSendeKey( this->key, this->keyLen );
  68. k->setEmpfangKey( this->key, this->keyLen );
  69. }
  70. else
  71. {
  72. err = "network error while sending to Information Server";
  73. k = k->release();
  74. cs.unlock();
  75. return 0;
  76. }
  77. }
  78. else
  79. {
  80. err = "network error while connecting to Information Server";
  81. k = k->release();
  82. cs.unlock();
  83. return 0;
  84. }
  85. cs.unlock();
  86. return 1;
  87. }
  88. // fragt nach dem Informationstext
  89. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  90. // txt: Ein Zeiger auf ein Text Objekt, welches bei einem erfolgreichen Aufruf den Informationstext enthält
  91. // typ: ein Zeieger auf ein Integer, welches bei einem erfolgreichen Aufruf den Typ der Information enthält
  92. bool InformationClient::getInformationText( Framework::Text *txt, int *typ )
  93. {
  94. cs.lock();
  95. if( !k )
  96. {
  97. err = "Der Client ist nicht verbunden.";
  98. cs.unlock();
  99. return 0;
  100. }
  101. bool ret = 1;
  102. ret = ret & k->sendeEncrypted( "\5", 1 );
  103. char serverReturn = 0;
  104. k->getNachrichtEncrypted( &serverReturn, 1 );
  105. if( serverReturn == 3 )
  106. {
  107. char byte = 0;
  108. k->getNachrichtEncrypted( &byte, 1 );
  109. char *f = new char[ byte + 1 ];
  110. f[ byte ] = 0;
  111. k->getNachrichtEncrypted( f, byte );
  112. err = f;
  113. delete[]f;
  114. cs.unlock();
  115. return 0;
  116. }
  117. short län = 0;
  118. ret = ret & k->getNachrichtEncrypted( (char*)&län, 2 );
  119. char *text = new char[ län + 1 ];
  120. text[ län ] = 0;
  121. if( län )
  122. ret = ret & k->getNachrichtEncrypted( text, län );
  123. txt->setText( text );
  124. delete[]text;
  125. char type = 0;
  126. ret = ret & k->getNachrichtEncrypted( &type, 1 );
  127. *typ = type;
  128. if( !ret )
  129. err = "Verbindungsfehler";
  130. cs.unlock();
  131. return ret;
  132. }
  133. // fragt, ob das entsprechende Spiel vom Server gesperrt wurde
  134. // spielId: Die Id des Spiels
  135. // Gibt 1 zurück, falls das Spiel gespielt werden darf, 0 sonnst
  136. bool InformationClient::istSpielErlaubt( int spielId )
  137. {
  138. cs.lock();
  139. if( !k )
  140. {
  141. err = "Der Client ist nicht verbunden.";
  142. cs.unlock();
  143. return 0;
  144. }
  145. k->sendeEncrypted( "\6", 1 );
  146. char serverReturn = 0;
  147. k->getNachrichtEncrypted( &serverReturn, 1 );
  148. if( serverReturn == 3 )
  149. {
  150. char byte = 0;
  151. k->getNachrichtEncrypted( &byte, 1 );
  152. char *f = new char[ byte + 1 ];
  153. f[ byte ] = 0;
  154. k->getNachrichtEncrypted( f, byte );
  155. err = f;
  156. delete[]f;
  157. cs.unlock();
  158. return 0;
  159. }
  160. k->sendeEncrypted( (char*)&spielId, 4 );
  161. char ret = 0;
  162. k->getNachrichtEncrypted( &ret, 1 );
  163. if( !ret )
  164. err = "Unbekannter Fehler";
  165. cs.unlock();
  166. return ret != 0;
  167. }
  168. // fragt, ob die entsprechende Karte vom Server gesperrt wurde
  169. // karteId: Die Id der Karte
  170. // Gibt 1 zurück, falls die Karte gespielt werden darf, 0 sonnst
  171. bool InformationClient::istKarteErlaubt( int karteId )
  172. {
  173. cs.lock();
  174. if( !k )
  175. {
  176. err = "Der Client ist nicht verbunden.";
  177. cs.unlock();
  178. return 0;
  179. }
  180. k->sendeEncrypted( "\7", 1 );
  181. char serverReturn = 0;
  182. k->getNachrichtEncrypted( &serverReturn, 1 );
  183. if( serverReturn == 3 )
  184. {
  185. char byte = 0;
  186. k->getNachrichtEncrypted( &byte, 1 );
  187. char *f = new char[ byte + 1 ];
  188. f[ byte ] = 0;
  189. k->getNachrichtEncrypted( f, byte );
  190. err = f;
  191. delete[]f;
  192. cs.unlock();
  193. return 0;
  194. }
  195. k->sendeEncrypted( (char*)&karteId, 4 );
  196. char ret = 0;
  197. k->getNachrichtEncrypted( &ret, 1 );
  198. if( !ret )
  199. err = "Unbekannter Fehler";
  200. cs.unlock();
  201. return ret != 0;
  202. }
  203. // Ermittelt die Id einer Karte
  204. // name: Der Name der Karte
  205. // Gibt bei misserfolg 0 zurück
  206. int InformationClient::getKarteId( char *name )
  207. {
  208. cs.lock();
  209. if( !k )
  210. {
  211. err = "Der Client ist nicht verbunden.";
  212. cs.unlock();
  213. return 0;
  214. }
  215. k->sendeEncrypted( "\x9", 1 );
  216. char serverReturn = 0;
  217. k->getNachrichtEncrypted( &serverReturn, 1 );
  218. if( serverReturn == 3 )
  219. {
  220. char byte = 0;
  221. k->getNachrichtEncrypted( &byte, 1 );
  222. char *f = new char[ byte + 1 ];
  223. f[ byte ] = 0;
  224. k->getNachrichtEncrypted( f, byte );
  225. err = f;
  226. delete[]f;
  227. cs.unlock();
  228. return 0;
  229. }
  230. char län = textLength( name );
  231. k->sendeEncrypted( &län, 1 );
  232. k->sendeEncrypted( name, län );
  233. int id = 0;
  234. k->getNachrichtEncrypted( (char*)&id, 4 );
  235. cs.unlock();
  236. return id;
  237. }
  238. // Fragt nach der Id eines Spiels
  239. // name: Der Name des Spiels
  240. // Gibt bei misserfolg 0 zurück
  241. int InformationClient::getSpielId( char *name )
  242. {
  243. cs.lock();
  244. if( !k )
  245. {
  246. err = "Der Client ist nicht verbunden.";
  247. cs.unlock();
  248. return 0;
  249. }
  250. k->sendeEncrypted( "\x8", 1 );
  251. char serverReturn = 0;
  252. k->getNachrichtEncrypted( &serverReturn, 1 );
  253. if( serverReturn == 3 )
  254. {
  255. char byte = 0;
  256. k->getNachrichtEncrypted( &byte, 1 );
  257. char *f = new char[ byte + 1 ];
  258. f[ byte ] = 0;
  259. k->getNachrichtEncrypted( f, byte );
  260. err = f;
  261. delete[]f;
  262. cs.unlock();
  263. return 0;
  264. }
  265. char län = textLength( name );
  266. k->sendeEncrypted( &län, 1 );
  267. k->sendeEncrypted( name, län );
  268. int id = 0;
  269. k->getNachrichtEncrypted( (char*)&id, 4 );
  270. cs.unlock();
  271. return id;
  272. }
  273. // fragt nach dem Namen eines Accounts
  274. // accountId: Die Id des Accounts
  275. // Gibt bei misserfolg 0 zurück
  276. Framework::Text *InformationClient::getSpielerName( int accountId )
  277. {
  278. cs.lock();
  279. if( !k )
  280. {
  281. err = "Der Client ist nicht verbunden.";
  282. cs.unlock();
  283. return 0;
  284. }
  285. k->sendeEncrypted( "\xA", 1 );
  286. char serverReturn = 0;
  287. k->getNachrichtEncrypted( &serverReturn, 1 );
  288. if( serverReturn == 3 )
  289. {
  290. char byte = 0;
  291. k->getNachrichtEncrypted( &byte, 1 );
  292. char *f = new char[ byte + 1 ];
  293. f[ byte ] = 0;
  294. k->getNachrichtEncrypted( f, byte );
  295. err = f;
  296. delete[]f;
  297. cs.unlock();
  298. return 0;
  299. }
  300. k->sendeEncrypted( (char*)&accountId, 4 );
  301. char län = 0;
  302. k->getNachrichtEncrypted( &län, 1 );
  303. char *name = new char[ län + 1 ];
  304. name[ län ] = 0;
  305. if( län )
  306. k->getNachrichtEncrypted( name, län );
  307. Text *ret = new Text( name );
  308. delete[]name;
  309. cs.unlock();
  310. return ret;
  311. }
  312. // fragt nach der Spiel Statistik eines Accounts
  313. // accountId: Die Id des Accounts
  314. // spielId: Die Id des Spiels
  315. // werte: Nach erfolgreichem Aufruf enthält die Liste die Statistik werte (gespielt, gewonnen, verloren, punkte, bw0, bw1, bw2, bw3, bw4, bw5)
  316. bool InformationClient::getSpielStatistik( int accountId, int spielId, Framework::Array< int > *werte )
  317. {
  318. cs.lock();
  319. if( !k )
  320. {
  321. err = "Der Client ist nicht verbunden.";
  322. cs.unlock();
  323. return 0;
  324. }
  325. bool ret = 1;
  326. ret = ret & k->sendeEncrypted( "\xB", 1 );
  327. char serverReturn = 0;
  328. k->getNachrichtEncrypted( &serverReturn, 1 );
  329. if( serverReturn == 3 )
  330. {
  331. char byte = 0;
  332. k->getNachrichtEncrypted( &byte, 1 );
  333. char *f = new char[ byte + 1 ];
  334. f[ byte ] = 0;
  335. k->getNachrichtEncrypted( f, byte );
  336. err = f;
  337. delete[]f;
  338. cs.unlock();
  339. return 0;
  340. }
  341. ret = ret & k->sendeEncrypted( (char*)&accountId, 4 );
  342. ret = ret & k->sendeEncrypted( (char*)&spielId, 4 );
  343. for( int i = 0; i < 10; i++ )
  344. {
  345. int tmp = 0;
  346. ret = ret & k->getNachrichtEncrypted( (char*)&tmp, 4 );
  347. werte->add( tmp, i );
  348. }
  349. if( !ret )
  350. err = "Verbindungsfehler";
  351. cs.unlock();
  352. return ret;
  353. }
  354. // fragt nach dem Namen einer Karte
  355. // karteId: Die id der Karte
  356. // Gibt bei misserfolg 0 zurück
  357. Framework::Text *InformationClient::getKarteName( int karteId )
  358. {
  359. cs.lock();
  360. if( !k )
  361. {
  362. err = "Der Client ist nicht verbunden.";
  363. cs.unlock();
  364. return 0;
  365. }
  366. k->sendeEncrypted( "\xE", 1 );
  367. char serverReturn = 0;
  368. k->getNachrichtEncrypted( &serverReturn, 1 );
  369. if( serverReturn == 3 )
  370. {
  371. char byte = 0;
  372. k->getNachrichtEncrypted( &byte, 1 );
  373. char *f = new char[ byte + 1 ];
  374. f[ byte ] = 0;
  375. k->getNachrichtEncrypted( f, byte );
  376. err = f;
  377. delete[]f;
  378. cs.unlock();
  379. return 0;
  380. }
  381. k->sendeEncrypted( (char*)&karteId, 4 );
  382. char län = 0;
  383. k->getNachrichtEncrypted( &län, 1 );
  384. char *name = new char[ län + 1 ];
  385. name[ län ] = 0;
  386. if( län )
  387. k->getNachrichtEncrypted( name, län );
  388. Text *ret = new Text( name );
  389. delete[]name;
  390. cs.unlock();
  391. return ret;
  392. }
  393. // fragt nach dem Namen eines Spiels
  394. // spielId: Die id des Spiels
  395. // Gibt bei misserfolg 0 zurück
  396. Framework::Text *InformationClient::getSpielName( int spielId )
  397. {
  398. cs.lock();
  399. if( !k )
  400. {
  401. err = "Der Client ist nicht verbunden.";
  402. cs.unlock();
  403. return 0;
  404. }
  405. k->sendeEncrypted( "\xF", 1 );
  406. char serverReturn = 0;
  407. k->getNachrichtEncrypted( &serverReturn, 1 );
  408. if( serverReturn == 3 )
  409. {
  410. char byte = 0;
  411. k->getNachrichtEncrypted( &byte, 1 );
  412. char *f = new char[ byte + 1 ];
  413. f[ byte ] = 0;
  414. k->getNachrichtEncrypted( f, byte );
  415. err = f;
  416. delete[]f;
  417. cs.unlock();
  418. return 0;
  419. }
  420. k->sendeEncrypted( (char*)&spielId, 4 );
  421. char län = 0;
  422. k->getNachrichtEncrypted( &län, 1 );
  423. char *name = new char[ län + 1 ];
  424. name[ län ] = 0;
  425. if( län )
  426. k->getNachrichtEncrypted( name, län );
  427. Text *ret = new Text( name );
  428. delete[]name;
  429. cs.unlock();
  430. return ret;
  431. }
  432. // fragt nach dem Namen eines Chatrooms
  433. // chatroomId: Die id des Chatrooms
  434. // Gibt bei misserfolg 0 zurück
  435. Framework::Text *InformationClient::getChatroomName( int chatroomId )
  436. {
  437. cs.lock();
  438. if( !k )
  439. {
  440. err = "Der Client ist nicht verbunden.";
  441. cs.unlock();
  442. return 0;
  443. }
  444. k->sendeEncrypted( "\x10", 1 );
  445. char serverReturn = 0;
  446. k->getNachrichtEncrypted( &serverReturn, 1 );
  447. if( serverReturn == 3 )
  448. {
  449. char byte = 0;
  450. k->getNachrichtEncrypted( &byte, 1 );
  451. char *f = new char[ byte + 1 ];
  452. f[ byte ] = 0;
  453. k->getNachrichtEncrypted( f, byte );
  454. err = f;
  455. delete[]f;
  456. cs.unlock();
  457. return 0;
  458. }
  459. k->sendeEncrypted( (char*)&chatroomId, 4 );
  460. char län = 0;
  461. k->getNachrichtEncrypted( &län, 1 );
  462. char *name = new char[ län + 1 ];
  463. name[ län ] = 0;
  464. if( län )
  465. k->getNachrichtEncrypted( name, län );
  466. Text *ret = new Text( name );
  467. delete[]name;
  468. cs.unlock();
  469. return ret;
  470. }
  471. // fragt zu welcher Spielart die Karte gehört
  472. // karteId: Die id der Karte
  473. // Gibt bei misserfolg 0 zurück
  474. int InformationClient::getSpielId( int karteId )
  475. {
  476. cs.lock();
  477. if( !k )
  478. {
  479. err = "Der Client ist nicht verbunden.";
  480. cs.unlock();
  481. return 0;
  482. }
  483. k->sendeEncrypted( "\x11", 1 );
  484. char serverReturn = 0;
  485. k->getNachrichtEncrypted( &serverReturn, 1 );
  486. if( serverReturn == 3 )
  487. {
  488. char byte = 0;
  489. k->getNachrichtEncrypted( &byte, 1 );
  490. char *f = new char[ byte + 1 ];
  491. f[ byte ] = 0;
  492. k->getNachrichtEncrypted( f, byte );
  493. err = f;
  494. delete[]f;
  495. cs.unlock();
  496. return 0;
  497. }
  498. k->sendeEncrypted( (char*)&karteId, 4 );
  499. int ret = 0;
  500. k->getNachrichtEncrypted( (char*)&ret, 4 );
  501. if( !ret )
  502. err = "Unbekannter Fehler";
  503. cs.unlock();
  504. return ret;
  505. }
  506. // gibt die Id eines Accounts zurück
  507. // name: Der Angezeigte Name des Accounts
  508. // Gibt bei misserfolg 0 zurück
  509. int InformationClient::getAccountId( char *name )
  510. {
  511. cs.lock();
  512. if( !k )
  513. {
  514. err = "Der Client ist nicht verbunden.";
  515. cs.unlock();
  516. return 0;
  517. }
  518. char län = textLength( name );
  519. if( !län )
  520. {
  521. cs.unlock();
  522. return 0;
  523. }
  524. k->sendeEncrypted( "\x12", 1 );
  525. char serverReturn = 0;
  526. k->getNachrichtEncrypted( &serverReturn, 1 );
  527. if( serverReturn == 3 )
  528. {
  529. char byte = 0;
  530. k->getNachrichtEncrypted( &byte, 1 );
  531. char *f = new char[ byte + 1 ];
  532. f[ byte ] = 0;
  533. k->getNachrichtEncrypted( f, byte );
  534. err = f;
  535. delete[]f;
  536. cs.unlock();
  537. return 0;
  538. }
  539. k->sendeEncrypted( &län, 1 );
  540. k->sendeEncrypted( name, län );
  541. int ret = 0;
  542. k->getNachrichtEncrypted( (char*)&ret, 4 );
  543. if( !ret )
  544. err = "Unbekannter Fehler";
  545. cs.unlock();
  546. return ret;
  547. }
  548. // gibt die Id des Chatrooms zurück
  549. // name: Der name des Chatrooms
  550. // Gibt bei misserfolg 0 zurück
  551. int InformationClient::getChatroomId( char *name )
  552. {
  553. cs.lock();
  554. if( !k )
  555. {
  556. err = "Der Client ist nicht verbunden.";
  557. cs.unlock();
  558. return 0;
  559. }
  560. char län = textLength( name );
  561. if( !län )
  562. {
  563. cs.unlock();
  564. return 0;
  565. }
  566. k->sendeEncrypted( "\x13", 1 );
  567. char serverReturn = 0;
  568. k->getNachrichtEncrypted( &serverReturn, 1 );
  569. if( serverReturn == 3 )
  570. {
  571. char byte = 0;
  572. k->getNachrichtEncrypted( &byte, 1 );
  573. char *f = new char[ byte + 1 ];
  574. f[ byte ] = 0;
  575. k->getNachrichtEncrypted( f, byte );
  576. err = f;
  577. delete[]f;
  578. cs.unlock();
  579. return 0;
  580. }
  581. k->sendeEncrypted( &län, 1 );
  582. k->sendeEncrypted( name, län );
  583. int ret = 0;
  584. k->getNachrichtEncrypted( (char*)&ret, 4 );
  585. if( !ret )
  586. err = "Unbekannter Fehler";
  587. cs.unlock();
  588. return ret;
  589. }
  590. // gibt die karten Id zurück, zu dem eine Gruppe erstellt wurde
  591. // gruppenId: Die id der Gruppe
  592. // Gibt bei misserfolg 0 zurück
  593. int InformationClient::getGruppenKarteId( int gruppenId )
  594. {
  595. cs.lock();
  596. if( !k )
  597. {
  598. err = "Der Client ist nicht verbunden.";
  599. cs.unlock();
  600. return 0;
  601. }
  602. k->sendeEncrypted( "\xD", 1 );
  603. char serverReturn = 0;
  604. k->getNachrichtEncrypted( &serverReturn, 1 );
  605. if( serverReturn == 3 )
  606. {
  607. char byte = 0;
  608. k->getNachrichtEncrypted( &byte, 1 );
  609. char *f = new char[ byte + 1 ];
  610. f[ byte ] = 0;
  611. k->getNachrichtEncrypted( f, byte );
  612. err = f;
  613. delete[]f;
  614. cs.unlock();
  615. return 0;
  616. }
  617. k->sendeEncrypted( (char*)&gruppenId, 4 );
  618. int id = 0;
  619. k->getNachrichtEncrypted( (char*)&id, 4 );
  620. if( !id )
  621. err = "Unbekannter Fehler";
  622. cs.unlock();
  623. return id;
  624. }
  625. // gibt 1 zurück, wenn zu einer Gruppe Spieler hinzugefügt werden können, 0 sonnst
  626. // gruppeId: Die id der Gruppe
  627. bool InformationClient::getGruppeSpielerHinzufügen( int gruppeId )
  628. {
  629. cs.lock();
  630. if( !k )
  631. {
  632. err = "Der Client ist nicht verbunden.";
  633. cs.unlock();
  634. return 0;
  635. }
  636. k->sendeEncrypted( "\x1E", 1 );
  637. char serverReturn = 0;
  638. k->getNachrichtEncrypted( &serverReturn, 1 );
  639. if( serverReturn == 3 )
  640. {
  641. char byte = 0;
  642. k->getNachrichtEncrypted( &byte, 1 );
  643. char *f = new char[ byte + 1 ];
  644. f[ byte ] = 0;
  645. k->getNachrichtEncrypted( f, byte );
  646. err = f;
  647. delete[]f;
  648. cs.unlock();
  649. return 0;
  650. }
  651. k->sendeEncrypted( (char*)&gruppeId, 4 );
  652. char sh = 0;
  653. k->getNachrichtEncrypted( (char*)&sh, 1 );
  654. cs.unlock();
  655. return sh == 1;
  656. }
  657. // gibt die Account Id des Gruppen Administrators zurück
  658. // gruppeId: Die Id der Gruppe
  659. // Gibt bei misserfolg 0 zurück
  660. int InformationClient::getGruppeAdminId( int gruppeId )
  661. {
  662. cs.lock();
  663. if( !k )
  664. {
  665. err = "Der Client ist nicht verbunden.";
  666. cs.unlock();
  667. return 0;
  668. }
  669. k->sendeEncrypted( "\x15", 1 );
  670. char serverReturn = 0;
  671. k->getNachrichtEncrypted( &serverReturn, 1 );
  672. if( serverReturn == 3 )
  673. {
  674. char byte = 0;
  675. k->getNachrichtEncrypted( &byte, 1 );
  676. char *f = new char[ byte + 1 ];
  677. f[ byte ] = 0;
  678. k->getNachrichtEncrypted( f, byte );
  679. err = f;
  680. delete[]f;
  681. cs.unlock();
  682. return 0;
  683. }
  684. k->sendeEncrypted( (char*)&gruppeId, 4 );
  685. int id = 0;
  686. k->getNachrichtEncrypted( (char*)&id, 4 );
  687. if( !id )
  688. err = "Unbekannter Fehler";
  689. cs.unlock();
  690. return id;
  691. }
  692. // gibt die Punkte eines Spielers zurück
  693. // accountId: Die Accont Id des Spielers
  694. // spielId: Die Id des Spiels
  695. // Gibt bei misserfolg 0 zurück
  696. int InformationClient::getSpielerPunkte( int accountId, int spielId )
  697. {
  698. cs.lock();
  699. if( !k )
  700. {
  701. err = "Der Client ist nicht verbunden.";
  702. cs.unlock();
  703. return 0;
  704. }
  705. k->sendeEncrypted( "\x14", 1 );
  706. char serverReturn = 0;
  707. k->getNachrichtEncrypted( &serverReturn, 1 );
  708. if( serverReturn == 3 )
  709. {
  710. char byte = 0;
  711. k->getNachrichtEncrypted( &byte, 1 );
  712. char *f = new char[ byte + 1 ];
  713. f[ byte ] = 0;
  714. k->getNachrichtEncrypted( f, byte );
  715. err = f;
  716. delete[]f;
  717. cs.unlock();
  718. return 0;
  719. }
  720. k->sendeEncrypted( (char*)&spielId, 4 );
  721. k->sendeEncrypted( (char*)&accountId, 4 );
  722. int punkte = 0;
  723. k->getNachrichtEncrypted( (char*)&punkte, 4 );
  724. cs.unlock();
  725. return punkte;
  726. }
  727. // gibt eine Liste mit Ids von gekauften Spielen zurück
  728. // Gibt bei misserfolg 0 zurück
  729. Framework::Array< int > *InformationClient::getAccountSpielArtListe()
  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( "\x16", 1 );
  740. k->getNachrichtEncrypted( &ret, 1 );
  741. if( ret == 1 )
  742. {
  743. int anz = 0;
  744. k->getNachrichtEncrypted( (char*)&anz, 4 );
  745. Array< int > *list = new Array< int >();
  746. for( int i = 0; i < anz; i++ )
  747. {
  748. int id = 0;
  749. k->getNachrichtEncrypted( (char*)&id, 4 );
  750. list->add( id );
  751. }
  752. cs.unlock();
  753. return list;
  754. }
  755. if( ref == 3 )
  756. {
  757. k->getNachrichtEncrypted( &ret, 1 );
  758. char *f = new char[ ret + 1 ];
  759. f[ ret ] = 0;
  760. if( ret )
  761. k->getNachrichtEncrypted( f, ret );
  762. err = f;
  763. delete[] f;
  764. cs.unlock();
  765. return 0;
  766. }
  767. err = "Unbekannter Fehler";
  768. cs.unlock();
  769. return 0;
  770. }
  771. // gibt die neuste Version eines Spiels zurück
  772. // spielId: Die Id des Spiels
  773. // Gibt bei misserfolg 0 zurück
  774. int InformationClient::getSpielVersion( int spielId )
  775. {
  776. cs.lock();
  777. if( !k )
  778. {
  779. err = "Der Client ist nicht verbunden.";
  780. cs.unlock();
  781. return 0;
  782. }
  783. k->sendeEncrypted( "\x17", 1 );
  784. char serverReturn = 0;
  785. k->getNachrichtEncrypted( &serverReturn, 1 );
  786. if( serverReturn == 3 )
  787. {
  788. char byte = 0;
  789. k->getNachrichtEncrypted( &byte, 1 );
  790. char *f = new char[ byte + 1 ];
  791. f[ byte ] = 0;
  792. k->getNachrichtEncrypted( f, byte );
  793. err = f;
  794. delete[] f;
  795. cs.unlock();
  796. return 0;
  797. }
  798. k->sendeEncrypted( (char*)&spielId, 4 );
  799. int version = 0;
  800. k->getNachrichtEncrypted( (char*)&version, 4 );
  801. cs.unlock();
  802. return version;
  803. }
  804. // gibt das Kupfer des Accounts zurück
  805. // Gibt bei misserfolg 0 zurück
  806. int InformationClient::getKupfer()
  807. {
  808. cs.lock();
  809. if( !k )
  810. {
  811. err = "Der Client ist nicht verbunden.";
  812. cs.unlock();
  813. return 0;
  814. }
  815. k->sendeEncrypted( "\x18", 1 );
  816. char serverReturn = 0;
  817. k->getNachrichtEncrypted( &serverReturn, 1 );
  818. if( serverReturn == 3 )
  819. {
  820. char byte = 0;
  821. k->getNachrichtEncrypted( &byte, 1 );
  822. char *f = new char[ byte + 1 ];
  823. f[ byte ] = 0;
  824. k->getNachrichtEncrypted( f, byte );
  825. err = f;
  826. delete[] f;
  827. cs.unlock();
  828. return 0;
  829. }
  830. int kupfer = 0;
  831. k->getNachrichtEncrypted( (char*)&kupfer, 4 );
  832. cs.unlock();
  833. return kupfer;
  834. }
  835. // Gibt die Dateigruppem Id eines Spieles zurück
  836. // spielId: Die Id des Spiels
  837. // Gibt bei misserfolg 0 zurück
  838. int InformationClient::getDateiGruppeIdVonSpiel( int spielId )
  839. {
  840. cs.lock();
  841. if( !k )
  842. {
  843. err = "Der Client ist nicht verbunden.";
  844. cs.unlock();
  845. return 0;
  846. }
  847. k->sendeEncrypted( "\x19", 1 );
  848. char serverReturn = 0;
  849. k->getNachrichtEncrypted( &serverReturn, 1 );
  850. if( serverReturn == 3 )
  851. {
  852. char byte = 0;
  853. k->getNachrichtEncrypted( &byte, 1 );
  854. char *f = new char[ byte + 1 ];
  855. f[ byte ] = 0;
  856. k->getNachrichtEncrypted( f, byte );
  857. err = f;
  858. delete[] f;
  859. cs.unlock();
  860. return 0;
  861. }
  862. k->sendeEncrypted( (char*)&spielId, 4 );
  863. int dgId = 0;
  864. k->getNachrichtEncrypted( (char*)&dgId, 4 );
  865. cs.unlock();
  866. return dgId;
  867. }
  868. // Gibt den Dateigruppen Pfad zurück
  869. // dgId: Die Id der Dateigruppe
  870. // Gibt bei misserfolg 0 zurück
  871. Framework::Text *InformationClient::getDateiGruppePfad( int dgId )
  872. {
  873. cs.lock();
  874. if( !k )
  875. {
  876. err = "Der Client ist nicht verbunden.";
  877. cs.unlock();
  878. return 0;
  879. }
  880. k->sendeEncrypted( "\x1A", 1 );
  881. char serverReturn = 0;
  882. k->getNachrichtEncrypted( &serverReturn, 1 );
  883. if( serverReturn == 1 )
  884. {
  885. k->sendeEncrypted( (char*)&dgId, 4 );
  886. k->getNachrichtEncrypted( &serverReturn, 1 );
  887. if( serverReturn == 1 )
  888. {
  889. char län = 0;
  890. k->getNachrichtEncrypted( &län, 1 );
  891. char *pf = new char[ län + 1 ];
  892. pf[ län ] = 0;
  893. if( län )
  894. k->getNachrichtEncrypted( pf, län );
  895. Text *pfad = new Text( pf );
  896. delete[] pf;
  897. cs.unlock();
  898. return pfad;
  899. }
  900. }
  901. if( serverReturn == 3 )
  902. {
  903. char byte = 0;
  904. k->getNachrichtEncrypted( &byte, 1 );
  905. char *f = new char[ byte + 1 ];
  906. f[ byte ] = 0;
  907. k->getNachrichtEncrypted( f, byte );
  908. err = f;
  909. delete[] f;
  910. cs.unlock();
  911. return 0;
  912. }
  913. err = "Unbekannter Fehler";
  914. cs.unlock();
  915. return 0;
  916. }
  917. // gibt eine Liste mit gekauften Karten zurück
  918. // spielId: Die Spiel Id zu der die Karten gehören sollen
  919. // Gibt bei misserfolg 0 zurück
  920. Framework::Array< int > *InformationClient::getAccountKarteListe( int spielId )
  921. {
  922. char ret = 0;
  923. cs.lock();
  924. if( !k )
  925. {
  926. err = "Der Client ist nicht verbunden.";
  927. cs.unlock();
  928. return 0;
  929. }
  930. k->sendeEncrypted( "\x1B", 1 );
  931. k->getNachrichtEncrypted( &ret, 1 );
  932. if( ret == 1 )
  933. {
  934. k->sendeEncrypted( (char*)&spielId, 4 );
  935. int anz = 0;
  936. k->getNachrichtEncrypted( (char*)&anz, 4 );
  937. Array< int > *list = new Array< int >();
  938. for( int i = 0; i < anz; i++ )
  939. {
  940. int id = 0;
  941. k->getNachrichtEncrypted( (char*)&id, 4 );
  942. list->add( id );
  943. }
  944. cs.unlock();
  945. return list;
  946. }
  947. if( ref == 3 )
  948. {
  949. k->getNachrichtEncrypted( &ret, 1 );
  950. char *f = new char[ ret + 1 ];
  951. f[ ret ] = 0;
  952. if( ret )
  953. k->getNachrichtEncrypted( f, ret );
  954. err = f;
  955. delete[] f;
  956. cs.unlock();
  957. return 0;
  958. }
  959. err = "Unbekannter Fehler";
  960. cs.unlock();
  961. return 0;
  962. }
  963. // Gibt die Dateigruppen Id eines Pfades zurück
  964. // pfad: Der Pfad der Dateigruppe
  965. // Gibt bei misserfolg 0 zurück
  966. int InformationClient::getDateiGruppeIdVonPfad( char *pfad )
  967. {
  968. char län = textLength( pfad );
  969. if( !län )
  970. return 0;
  971. cs.lock();
  972. if( !k )
  973. {
  974. err = "Der Client ist nicht verbunden.";
  975. cs.unlock();
  976. return 0;
  977. }
  978. k->sendeEncrypted( "\x2A", 1 );
  979. char serverReturn = 0;
  980. k->getNachrichtEncrypted( &serverReturn, 1 );
  981. if( serverReturn == 3 )
  982. {
  983. char byte = 0;
  984. k->getNachrichtEncrypted( &byte, 1 );
  985. char *f = new char[ byte + 1 ];
  986. f[ byte ] = 0;
  987. k->getNachrichtEncrypted( f, byte );
  988. err = f;
  989. delete[] f;
  990. cs.unlock();
  991. return 0;
  992. }
  993. k->sendeEncrypted( (char*)&län, 1 );
  994. k->sendeEncrypted( (char*)pfad, län );
  995. int dgId = 0;
  996. k->getNachrichtEncrypted( (char*)&dgId, 4 );
  997. cs.unlock();
  998. return dgId;
  999. }
  1000. // gibt die neuste Version einer Dateigruppe zurück
  1001. // dg: Die Dateigruppen Id
  1002. // Gibt bei misserfolg 0 zurück
  1003. int InformationClient::getDateiGruppeVersion( int dg )
  1004. {
  1005. cs.lock();
  1006. if( !k )
  1007. {
  1008. err = "Der Client ist nicht verbunden.";
  1009. cs.unlock();
  1010. return 0;
  1011. }
  1012. k->sendeEncrypted( "\x2B", 1 );
  1013. char serverReturn = 0;
  1014. k->getNachrichtEncrypted( &serverReturn, 1 );
  1015. if( serverReturn == 3 )
  1016. {
  1017. char byte = 0;
  1018. k->getNachrichtEncrypted( &byte, 1 );
  1019. char *f = new char[ byte + 1 ];
  1020. f[ byte ] = 0;
  1021. k->getNachrichtEncrypted( f, byte );
  1022. err = f;
  1023. delete[] f;
  1024. cs.unlock();
  1025. return 0;
  1026. }
  1027. k->sendeEncrypted( (char*)&dg, 4 );
  1028. int version = 0;
  1029. k->getNachrichtEncrypted( (char*)&version, 4 );
  1030. cs.unlock();
  1031. return version;
  1032. }
  1033. // Gibt eine Liste Mit Accounts zurück, die einen bestimmten Text im Namen haben und bestimmt Sortiert ist
  1034. // suche: Der Text, der in den Namen enthalten sein soll
  1035. // seite: Die gewünschte Seite der Tabelle (enthält nach einem Erfolgreichen Aufruf die korrekte Seite)
  1036. // maxSeite: Enthält nach erfolgreichem Aufruf die Maximale Seite
  1037. // sortSpalte: Die Spalte, nach der Sortiert werden soll
  1038. // rückwärts: 1:=Rückwärtzt Sortierung, 0:=Vorwärts Sortierung
  1039. // accounts: Enthält nach erfolgreichem Aufruf die Daten der Accounts
  1040. // Gibt die Anzahl der gefundenen Accounts zurück
  1041. // Gibt die Anzahl der Spieler zurück, -1 bei fehler
  1042. int InformationClient::getSpielerListe( char *suche, int *seite, int *maxSeite, char sortSpalte, char rückwärts, Framework::Array< AccountInfo > *accounts )
  1043. {
  1044. char län = textLength( suche );
  1045. if( !län )
  1046. return -1;
  1047. cs.lock();
  1048. if( !k )
  1049. {
  1050. err = "Der Client ist nicht verbunden.";
  1051. cs.unlock();
  1052. return 0;
  1053. }
  1054. char serverReturn = 0;
  1055. k->sendeEncrypted( "\xC", 1 );
  1056. k->getNachrichtEncrypted( &serverReturn, 1 );
  1057. if( serverReturn == 1 )
  1058. {
  1059. k->sendeEncrypted( &län, 1 );
  1060. k->sendeEncrypted( suche, län );
  1061. k->sendeEncrypted( (char*)seite, 4 );
  1062. k->sendeEncrypted( &sortSpalte, 1 );
  1063. k->sendeEncrypted( &rückwärts, 1 );
  1064. k->getNachrichtEncrypted( (char*)seite, 4 );
  1065. k->getNachrichtEncrypted( (char*)maxSeite, 4 );
  1066. int ret = 0;
  1067. k->getNachrichtEncrypted( (char*)&ret, 4 );
  1068. for( int i = 0; i < ret; i++ )
  1069. {
  1070. AccountInfo info;
  1071. k->getNachrichtEncrypted( (char*)&info.id, 4 );
  1072. k->getNachrichtEncrypted( &län, 1 );
  1073. char *txt = new char[ län + 1 ];
  1074. txt[ län ] = 0;
  1075. k->getNachrichtEncrypted( txt, län );
  1076. info.name = txt;
  1077. delete[] txt;
  1078. k->getNachrichtEncrypted( &län, 1 );
  1079. txt = new char[ län + 1 ];
  1080. txt[ län ] = 0;
  1081. k->getNachrichtEncrypted( txt, län );
  1082. info.zuletztOnline = txt;
  1083. delete[] txt;
  1084. k->getNachrichtEncrypted( &län, 1 );
  1085. txt = new char[ län + 1 ];
  1086. txt[ län ] = 0;
  1087. k->getNachrichtEncrypted( txt, län );
  1088. info.letztesSpiel = txt;
  1089. delete[] txt;
  1090. k->getNachrichtEncrypted( &län, 1 );
  1091. txt = new char[ län + 1 ];
  1092. txt[ län ] = 0;
  1093. k->getNachrichtEncrypted( txt, län );
  1094. info.letzteKarte = txt;
  1095. delete[] txt;
  1096. k->getNachrichtEncrypted( &län, 1 );
  1097. txt = new char[ län + 1 ];
  1098. txt[ län ] = 0;
  1099. k->getNachrichtEncrypted( txt, län );
  1100. info.punkte = txt;
  1101. delete[] txt;
  1102. accounts->add( info );
  1103. }
  1104. cs.unlock();
  1105. return ret;
  1106. }
  1107. if( serverReturn == 3 )
  1108. {
  1109. char byte = 0;
  1110. k->getNachrichtEncrypted( &byte, 1 );
  1111. char *f = new char[ byte + 1 ];
  1112. f[ byte ] = 0;
  1113. k->getNachrichtEncrypted( f, byte );
  1114. err = f;
  1115. delete[] f;
  1116. cs.unlock();
  1117. return -1;
  1118. }
  1119. err = "Unbekannter Fehler";
  1120. cs.unlock();
  1121. return -1;
  1122. }
  1123. // ermittelt die aktivität eines Spielers
  1124. // accId: Die Id des Accounts
  1125. // info: Enthält nach erfolgreichem Aufruf die Aktivitätsinformationen der letzten 30 Tage
  1126. bool InformationClient::getSpielerAktivität( int accId, Framework::Array< AccountActivityInfo > *info )
  1127. {
  1128. cs.lock();
  1129. if( !k )
  1130. {
  1131. err = "Der Client ist nicht verbunden.";
  1132. cs.unlock();
  1133. return 0;
  1134. }
  1135. char ret = 0;
  1136. k->sendeEncrypted( "\x1F", 1 );
  1137. k->getNachrichtEncrypted( &ret, 1 );
  1138. if( ret == 1 )
  1139. {
  1140. k->sendeEncrypted( (char*)&accId, 4 );
  1141. k->getNachrichtEncrypted( &ret, 1 );
  1142. if( ret == 1 )
  1143. {
  1144. k->getNachrichtEncrypted( &ret, 1 );
  1145. for( int i = 0; ret; i++ )
  1146. {
  1147. AccountActivityInfo inf;
  1148. char *txt = new char[ ret + 1 ];
  1149. txt[ ret ] = 0;
  1150. k->getNachrichtEncrypted( txt, ret );
  1151. inf.datum = txt;
  1152. delete[] txt;
  1153. k->getNachrichtEncrypted( (char*)&inf.stOnline, 8 );
  1154. k->getNachrichtEncrypted( (char*)&inf.stGespielt, 8 );
  1155. k->getNachrichtEncrypted( (char*)&inf.anzSpiele, 4 );
  1156. k->getNachrichtEncrypted( (char*)&inf.anzGewonnen, 4 );
  1157. k->getNachrichtEncrypted( &ret, 1 );
  1158. info->add( inf );
  1159. }
  1160. }
  1161. }
  1162. if( ret == 3 )
  1163. {
  1164. char byte = 0;
  1165. k->getNachrichtEncrypted( &byte, 1 );
  1166. char *f = new char[ byte + 1 ];
  1167. f[ byte ] = 0;
  1168. k->getNachrichtEncrypted( f, byte );
  1169. err = f;
  1170. delete[] f;
  1171. cs.unlock();
  1172. return 0;
  1173. }
  1174. cs.unlock();
  1175. return 1;
  1176. }
  1177. // Gibt zurück, wie oft ein Spieler eine Karte schon gespielt hat
  1178. // account: Die Id des Accounts
  1179. // karte: Die Id der Karte
  1180. int InformationClient::getAccountKarteSpiele( int account, int karte )
  1181. {
  1182. cs.lock();
  1183. if( !k )
  1184. {
  1185. err = "Der Client ist nicht verbunden.";
  1186. cs.unlock();
  1187. return 0;
  1188. }
  1189. char ret = 0;
  1190. k->sendeEncrypted( "\x20", 1 );
  1191. k->getNachrichtEncrypted( &ret, 1 );
  1192. if( ret == 1 )
  1193. {
  1194. k->sendeEncrypted( (char*)&account, 4 );
  1195. k->sendeEncrypted( (char*)&karte, 4 );
  1196. int anz = 0;
  1197. k->getNachrichtEncrypted( (char*)&anz, 4 );
  1198. cs.unlock();
  1199. return anz;
  1200. }
  1201. if( ret == 3 )
  1202. {
  1203. char byte = 0;
  1204. k->getNachrichtEncrypted( &byte, 1 );
  1205. char *f = new char[ byte + 1 ];
  1206. f[ byte ] = 0;
  1207. k->getNachrichtEncrypted( f, byte );
  1208. err = f;
  1209. delete[] f;
  1210. cs.unlock();
  1211. return 0;
  1212. }
  1213. err = "Unbekannter Fehler";
  1214. cs.unlock();
  1215. return 0;
  1216. }
  1217. // Gibt zurück, wie oft ein Spieler eine Karte schon gewonnen hat
  1218. // account: Die Id des Accounts
  1219. // karte: Die Id der Karte
  1220. int InformationClient::getAccountKarteSpieleGewonnen( int account, int karte )
  1221. {
  1222. cs.lock();
  1223. if( !k )
  1224. {
  1225. err = "Der Client ist nicht verbunden.";
  1226. cs.unlock();
  1227. return 0;
  1228. }
  1229. char ret = 0;
  1230. k->sendeEncrypted( "\x21", 1 );
  1231. k->getNachrichtEncrypted( &ret, 1 );
  1232. if( ret == 1 )
  1233. {
  1234. k->sendeEncrypted( (char*)&account, 4 );
  1235. k->sendeEncrypted( (char*)&karte, 4 );
  1236. int anz = 0;
  1237. k->getNachrichtEncrypted( (char*)&anz, 4 );
  1238. cs.unlock();
  1239. return anz;
  1240. }
  1241. if( ret == 3 )
  1242. {
  1243. char byte = 0;
  1244. k->getNachrichtEncrypted( &byte, 1 );
  1245. char *f = new char[ byte + 1 ];
  1246. f[ byte ] = 0;
  1247. k->getNachrichtEncrypted( f, byte );
  1248. err = f;
  1249. delete[] f;
  1250. cs.unlock();
  1251. return 0;
  1252. }
  1253. err = "Unbekannter Fehler";
  1254. cs.unlock();
  1255. return 0;
  1256. }
  1257. // Gibt zurück, ob ein Spieler die Karte im Besitz hat
  1258. // account: Die Id des Accounts
  1259. // karte: Die Id der Karte
  1260. bool InformationClient::hatAccountKarte( int account, int karte )
  1261. {
  1262. cs.lock();
  1263. if( !k )
  1264. {
  1265. err = "Der Client ist nicht verbunden.";
  1266. cs.unlock();
  1267. return 0;
  1268. }
  1269. char ret = 0;
  1270. k->sendeEncrypted( "\x22", 1 );
  1271. k->getNachrichtEncrypted( &ret, 1 );
  1272. if( ret == 1 )
  1273. {
  1274. k->sendeEncrypted( (char*)&account, 4 );
  1275. k->sendeEncrypted( (char*)&karte, 4 );
  1276. char status = 0;
  1277. k->getNachrichtEncrypted( &status, 1 );
  1278. cs.unlock();
  1279. return status != 0;
  1280. }
  1281. if( ret == 3 )
  1282. {
  1283. char byte = 0;
  1284. k->getNachrichtEncrypted( &byte, 1 );
  1285. char *f = new char[ byte + 1 ];
  1286. f[ byte ] = 0;
  1287. k->getNachrichtEncrypted( f, byte );
  1288. err = f;
  1289. delete[] f;
  1290. cs.unlock();
  1291. return 0;
  1292. }
  1293. err = "Unbekannter Fehler";
  1294. cs.unlock();
  1295. return 0;
  1296. }
  1297. // Gibt zurück, ob ein Spieler ein Spiel im Besitz hat
  1298. // account: Die Id des Accounts
  1299. // spiel: Die Id des Spiels
  1300. bool InformationClient::hatAccountSpiel( int account, int spiel )
  1301. {
  1302. cs.lock();
  1303. if( !k )
  1304. {
  1305. err = "Der Client ist nicht verbunden.";
  1306. cs.unlock();
  1307. return 0;
  1308. }
  1309. char ret = 0;
  1310. k->sendeEncrypted( "\x23", 1 );
  1311. k->getNachrichtEncrypted( &ret, 1 );
  1312. if( ret == 1 )
  1313. {
  1314. k->sendeEncrypted( (char*)&account, 4 );
  1315. k->sendeEncrypted( (char*)&spiel, 4 );
  1316. char status = 0;
  1317. k->getNachrichtEncrypted( &status, 1 );
  1318. cs.unlock();
  1319. return status != 0;
  1320. }
  1321. if( ret == 3 )
  1322. {
  1323. char byte = 0;
  1324. k->getNachrichtEncrypted( &byte, 1 );
  1325. char *f = new char[ byte + 1 ];
  1326. f[ byte ] = 0;
  1327. k->getNachrichtEncrypted( f, byte );
  1328. err = f;
  1329. delete[] f;
  1330. cs.unlock();
  1331. return 0;
  1332. }
  1333. err = "Unbekannter Fehler";
  1334. cs.unlock();
  1335. return 0;
  1336. }
  1337. // gibt eine Liste mit Ids von Karten zurück, die von einem Spieler bereits gespielt wurden
  1338. // account: Die Id des Accounts
  1339. // spiel: Die Id des Spiels
  1340. // Gibt bei misserfolg 0 zurück
  1341. Framework::Array< int > *InformationClient::getAccountKarteGespieltListe( int account, int spielId )
  1342. {
  1343. cs.lock();
  1344. if( !k )
  1345. {
  1346. err = "Der Client ist nicht verbunden.";
  1347. cs.unlock();
  1348. return 0;
  1349. }
  1350. k->sendeEncrypted( "\x24", 1 );
  1351. char ret = 0;
  1352. k->getNachrichtEncrypted( &ret, 1 );
  1353. if( ret == 1 )
  1354. {
  1355. k->sendeEncrypted( (char*)&account, 4 );
  1356. k->sendeEncrypted( (char*)&spielId, 4 );
  1357. int anz = 0;
  1358. k->getNachrichtEncrypted( (char*)&anz, 4 );
  1359. Array< int > *ret = new Array< int >();
  1360. for( int i = 0; i < anz; i++ )
  1361. {
  1362. int val = 0;
  1363. k->getNachrichtEncrypted( (char*)&val, 4 );
  1364. ret->set( val, i );
  1365. }
  1366. cs.unlock();
  1367. return ret;
  1368. }
  1369. if( ret == 3 )
  1370. {
  1371. char byte = 0;
  1372. k->getNachrichtEncrypted( &byte, 1 );
  1373. char *f = new char[ byte + 1 ];
  1374. f[ byte ] = 0;
  1375. k->getNachrichtEncrypted( f, byte );
  1376. err = f;
  1377. delete[] f;
  1378. cs.unlock();
  1379. return 0;
  1380. }
  1381. err = "Unbekannter Fehler";
  1382. cs.unlock();
  1383. return 0;
  1384. }
  1385. // gibt eine Liste mit Ids von Spielen zurück, die von einem Spieler bereits gespielt wurden
  1386. // account: Die Id des Accounts
  1387. // Gibt bei misserfolg 0 zurück
  1388. Framework::Array< int > *InformationClient::getAccountSpielGespieltListe( int account )
  1389. {
  1390. cs.lock();
  1391. if( !k )
  1392. {
  1393. err = "Der Client ist nicht verbunden.";
  1394. cs.unlock();
  1395. return 0;
  1396. }
  1397. k->sendeEncrypted( "\x25", 1 );
  1398. char ret = 0;
  1399. k->getNachrichtEncrypted( &ret, 1 );
  1400. if( ret == 1 )
  1401. {
  1402. k->sendeEncrypted( (char*)&account, 4 );
  1403. int anz = 0;
  1404. k->getNachrichtEncrypted( (char*)&anz, 4 );
  1405. Array< int > *ret = new Array< int >();
  1406. for( int i = 0; i < anz; i++ )
  1407. {
  1408. int val = 0;
  1409. k->getNachrichtEncrypted( (char*)&val, 4 );
  1410. ret->set( val, i );
  1411. }
  1412. cs.unlock();
  1413. return ret;
  1414. }
  1415. if( ret == 3 )
  1416. {
  1417. char byte = 0;
  1418. k->getNachrichtEncrypted( &byte, 1 );
  1419. char *f = new char[ byte + 1 ];
  1420. f[ byte ] = 0;
  1421. k->getNachrichtEncrypted( f, byte );
  1422. err = f;
  1423. delete[] f;
  1424. cs.unlock();
  1425. return 0;
  1426. }
  1427. err = "Unbekannter Fehler";
  1428. cs.unlock();
  1429. return 0;
  1430. }
  1431. // Gibt eine Liste von Spiel Partnern eines Spielers zurück
  1432. // account: Die Id des Accounts
  1433. // spieler: Enthält nach erfolgreichem Aufruf eine Liste mit Account Ids der Spiel Partner
  1434. // karten: Enthält nach erfolgreichem Aufruf eine Liste mit den Ids der gespielten Karten
  1435. // anzahl: Enthält nach erfolgreichem Aufruf eine Liste mit der Anzahl der Spiele
  1436. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  1437. bool InformationClient::getSpielPartnerListe( int account, Framework::Array< int > *spieler, Framework::Array< int > *karten, Framework::Array< int > *anzahl )
  1438. {
  1439. cs.lock();
  1440. if( !k )
  1441. {
  1442. err = "Der Client ist nicht verbunden.";
  1443. cs.unlock();
  1444. return 0;
  1445. }
  1446. k->sendeEncrypted( "\x26", 1 );
  1447. char ret = 0;
  1448. k->getNachrichtEncrypted( &ret, 1 );
  1449. if( ret == 1 )
  1450. {
  1451. k->sendeEncrypted( (char*)&account, 4 );
  1452. int anz = 0;
  1453. k->getNachrichtEncrypted( (char*)&anz, 4 );
  1454. for( int i = 0; i < anz; i++ )
  1455. {
  1456. int val = 0;
  1457. k->getNachrichtEncrypted( (char*)&val, 4 );
  1458. spieler->set( val, i );
  1459. k->getNachrichtEncrypted( (char*)&val, 4 );
  1460. karten->set( val, i );
  1461. k->getNachrichtEncrypted( (char*)&val, 4 );
  1462. anzahl->set( val, i );
  1463. }
  1464. cs.unlock();
  1465. return 1;
  1466. }
  1467. if( ret == 3 )
  1468. {
  1469. char byte = 0;
  1470. k->getNachrichtEncrypted( &byte, 1 );
  1471. char *f = new char[ byte + 1 ];
  1472. f[ byte ] = 0;
  1473. k->getNachrichtEncrypted( f, byte );
  1474. err = f;
  1475. delete[] f;
  1476. cs.unlock();
  1477. return 0;
  1478. }
  1479. err = "Unbekannter Fehler";
  1480. cs.unlock();
  1481. return 0;
  1482. }
  1483. // Gibt eine Liste mit Spiel Statistiken zurück
  1484. // account: Die Id des Accounts zu dem die Statistik ermittelt werden soll
  1485. // seite: Die gewünschte Seite. Enthält nach efolgreichem Aufruf die korrekte Seite
  1486. // maxSeite: Enthält nach erfolgreichem Aufruf die Macimale Seite
  1487. // sortSpalte: Die Spalte, nach der Sortiert werden soll
  1488. // rückwärts: 1:=Rückwärtzt Sortierung, 0:=Vorwärts Sortierung
  1489. // werte: Enthält nach erfolgreichem Aufruf eine Liste mit Statistik Werten (gespielt, gewonnen, verloren, punkte, bw0, bw1, bw2, bw3, bw4, bw5)
  1490. // namen: Enthält nach erfolgreichem Aufruf die Namen der Spiele
  1491. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  1492. bool InformationClient::getStatistikListe( int account, int *seite, int *maxSeite, char sortSpalte, char rückwärts,
  1493. Framework::RCArray< Framework::Array< int > > *werte, Framework::RCArray< Framework::Text > *namen )
  1494. {
  1495. if( !*seite )
  1496. *seite = 1;
  1497. cs.lock();
  1498. if( !k )
  1499. {
  1500. err = "Der Client ist nicht verbunden.";
  1501. cs.unlock();
  1502. return 0;
  1503. }
  1504. char serverReturn = 0;
  1505. k->sendeEncrypted( "\x27", 1 );
  1506. k->getNachrichtEncrypted( &serverReturn, 1 );
  1507. if( serverReturn == 1 )
  1508. {
  1509. k->sendeEncrypted( (char*)&account, 4 );
  1510. k->sendeEncrypted( (char*)seite, 4 );
  1511. k->sendeEncrypted( &sortSpalte, 1 );
  1512. k->sendeEncrypted( &rückwärts, 1 );
  1513. k->getNachrichtEncrypted( (char*)seite, 4 );
  1514. k->getNachrichtEncrypted( (char*)maxSeite, 4 );
  1515. int zAnz = 0;
  1516. int sAnz = 0;
  1517. k->getNachrichtEncrypted( (char*)&zAnz, 4 );
  1518. k->getNachrichtEncrypted( (char*)&sAnz, 4 );
  1519. for( int i = 0; i < zAnz; i++ )
  1520. {
  1521. Array< int > *tmp = new Array< int >();
  1522. for( int j = 0; j < sAnz; j++ )
  1523. {
  1524. if( j != 1 )
  1525. {
  1526. int val = 0;
  1527. k->getNachrichtEncrypted( (char*)&val, 4 );
  1528. tmp->set( val, j );
  1529. }
  1530. else
  1531. {
  1532. char län = 0;
  1533. k->getNachrichtEncrypted( &län, 1 );
  1534. char *n = new char[ län + 1 ];
  1535. n[ län ] = 0;
  1536. if( län )
  1537. k->getNachrichtEncrypted( n, län );
  1538. namen->set( new Text( n ), i );
  1539. delete[] n;
  1540. }
  1541. }
  1542. werte->set( tmp, i );
  1543. }
  1544. cs.unlock();
  1545. return 1;
  1546. }
  1547. if( serverReturn == 3 )
  1548. {
  1549. char byte = 0;
  1550. k->getNachrichtEncrypted( &byte, 1 );
  1551. char *f = new char[ byte + 1 ];
  1552. f[ byte ] = 0;
  1553. k->getNachrichtEncrypted( f, byte );
  1554. err = f;
  1555. delete[] f;
  1556. }
  1557. cs.unlock();
  1558. return 0;
  1559. }
  1560. // Gibt eine Liste mit den Daten der letzten 20 Spiele von einem Account zurück
  1561. // account: Die Id des Accounts
  1562. // Gibt bei misserfolg 0 zurück
  1563. Array< SpielHistorieDaten > *InformationClient::getSpielHistorieDaten( int account )
  1564. {
  1565. cs.lock();
  1566. if( !k )
  1567. {
  1568. err = "Der Client ist nicht verbunden.";
  1569. cs.unlock();
  1570. return 0;
  1571. }
  1572. k->sendeEncrypted( "\x28", 1 );
  1573. char ret = 0;
  1574. k->getNachrichtEncrypted( &ret, 1 );
  1575. if( ret == 1 )
  1576. {
  1577. Array< SpielHistorieDaten > *daten = new Array< SpielHistorieDaten >();
  1578. k->sendeEncrypted( (char*)&account, 4 );
  1579. char anz = 0;
  1580. k->getNachrichtEncrypted( &anz, 1 );
  1581. for( char i = 0; i < anz; i++ )
  1582. {
  1583. SpielHistorieDaten spiel;
  1584. k->getNachrichtEncrypted( (char*)&spiel.id, 4 );
  1585. k->getNachrichtEncrypted( (char*)&spiel.karteId, 4 );
  1586. char län = 0;
  1587. k->getNachrichtEncrypted( &län, 1 );
  1588. char *txt = new char[ län + 1 ];
  1589. txt[ län ] = 0;
  1590. if( län )
  1591. k->getNachrichtEncrypted( txt, län );
  1592. spiel.spiel = txt;
  1593. delete[] txt;
  1594. k->getNachrichtEncrypted( &län, 1 );
  1595. txt = new char[ län + 1 ];
  1596. txt[ län ] = 0;
  1597. if( län )
  1598. k->getNachrichtEncrypted( txt, län );
  1599. spiel.karte = txt;
  1600. delete[] txt;
  1601. k->getNachrichtEncrypted( &län, 1 );
  1602. txt = new char[ län + 1 ];
  1603. txt[ län ] = 0;
  1604. if( län )
  1605. k->getNachrichtEncrypted( txt, län );
  1606. spiel.datum = txt;
  1607. delete[] txt;
  1608. k->getNachrichtEncrypted( &län, 1 );
  1609. txt = new char[ län + 1 ];
  1610. txt[ län ] = 0;
  1611. if( län )
  1612. k->getNachrichtEncrypted( txt, län );
  1613. spiel.status = txt;
  1614. delete[] txt;
  1615. k->getNachrichtEncrypted( &län, 1 );
  1616. txt = new char[ län + 1 ];
  1617. txt[ län ] = 0;
  1618. if( län )
  1619. k->getNachrichtEncrypted( txt, län );
  1620. spiel.dauer = txt;
  1621. delete[] txt;
  1622. k->getNachrichtEncrypted( &län, 1 );
  1623. txt = new char[ län + 1 ];
  1624. txt[ län ] = 0;
  1625. if( län )
  1626. k->getNachrichtEncrypted( txt, län );
  1627. spiel.spielStatus = txt;
  1628. delete[] txt;
  1629. k->getNachrichtEncrypted( &län, 1 );
  1630. txt = new char[ län + 1 ];
  1631. txt[ län ] = 0;
  1632. if( län )
  1633. k->getNachrichtEncrypted( txt, län );
  1634. spiel.gewinner = txt;
  1635. delete[] txt;
  1636. k->getNachrichtEncrypted( (char*)&spiel.sAnzahl, 4 );
  1637. char tAnz = 0;
  1638. k->getNachrichtEncrypted( &tAnz, 1 );
  1639. for( char j = 0; j < tAnz; j++ )
  1640. {
  1641. SpielHistorieTeamDaten team;
  1642. char län = 0;
  1643. k->getNachrichtEncrypted( &län, 1 );
  1644. char *txt = new char[ län + 1 ];
  1645. txt[ län ] = 0;
  1646. if( län )
  1647. k->getNachrichtEncrypted( txt, län );
  1648. team.name = txt;
  1649. delete[] txt;
  1650. k->getNachrichtEncrypted( (char*)&team.sAnzahl, 4 );
  1651. k->getNachrichtEncrypted( &län, 1 );
  1652. txt = new char[ län + 1 ];
  1653. txt[ län ] = 0;
  1654. if( län )
  1655. k->getNachrichtEncrypted( txt, län );
  1656. team.status = txt;
  1657. delete[] txt;
  1658. k->getNachrichtEncrypted( (char*)&team.farbe, 4 );
  1659. char sAnz = 0;
  1660. k->getNachrichtEncrypted( &sAnz, 1 );
  1661. for( char ki = 0; ki < sAnz; ki++ )
  1662. {
  1663. SpielHistorieSpielerDaten spieler;
  1664. char län = 0;
  1665. k->getNachrichtEncrypted( &län, 1 );
  1666. char *txt = new char[ län + 1 ];
  1667. txt[ län ] = 0;
  1668. if( län )
  1669. k->getNachrichtEncrypted( txt, län );
  1670. spieler.name = txt;
  1671. delete[] txt;
  1672. k->getNachrichtEncrypted( (char*)&spieler.punkte, 4 );
  1673. k->getNachrichtEncrypted( &län, 1 );
  1674. txt = new char[ län + 1 ];
  1675. txt[ län ] = 0;
  1676. if( län )
  1677. k->getNachrichtEncrypted( txt, län );
  1678. spieler.status = txt;
  1679. delete[] txt;
  1680. k->getNachrichtEncrypted( (char*)&spieler.farbe, 4 );
  1681. team.spieler.add( spieler );
  1682. }
  1683. spiel.teams.add( team );
  1684. }
  1685. daten->add( spiel );
  1686. }
  1687. cs.unlock();
  1688. return daten;
  1689. }
  1690. if( ret == 3 )
  1691. {
  1692. char byte = 0;
  1693. k->getNachrichtEncrypted( &byte, 1 );
  1694. char *f = new char[ byte + 1 ];
  1695. f[ byte ] = 0;
  1696. k->getNachrichtEncrypted( f, byte );
  1697. err = f;
  1698. delete[] f;
  1699. cs.unlock();
  1700. return 0;
  1701. }
  1702. err = "Unbekannter Fehler";
  1703. cs.unlock();
  1704. return 0;
  1705. }
  1706. // Erzeugt einen Client zu dem Historie Server, welcher die Aufzeichnungen und Statistiken eines Bestimmten Spiels verwaltet
  1707. // spielId: Die id des Spiels
  1708. // Gibt bei misserfolg 0 zurück
  1709. HistorieServerClient *InformationClient::createHistorieServerClient( int spielId )
  1710. {
  1711. cs.lock();
  1712. if( !k )
  1713. {
  1714. err = "Der Client ist nicht verbunden.";
  1715. cs.unlock();
  1716. return 0;
  1717. }
  1718. k->sendeEncrypted( "\x29", 1 );
  1719. char ret = 0;
  1720. k->getNachrichtEncrypted( &ret, 1 );
  1721. if( ret == 1 )
  1722. {
  1723. k->sendeEncrypted( (char*)&spielId, 4 );
  1724. k->getNachrichtEncrypted( (char*)&ret, 1 );
  1725. if( ret == 1 )
  1726. {
  1727. k->getNachrichtEncrypted( (char*)&port, 4 );
  1728. char län = 0;
  1729. k->getNachrichtEncrypted( &län, 1 );
  1730. char *ip = new char[ län + 1 ];
  1731. ip[ län ] = 0;
  1732. k->getNachrichtEncrypted( ip, län );
  1733. HistorieClient *ret = new HistorieClient( cId, port, ip, key, keyLen, spielId );
  1734. delete[] ip;
  1735. cs.unlock();
  1736. return ret;
  1737. }
  1738. }
  1739. if( ret == 3 )
  1740. {
  1741. char byte = 0;
  1742. k->getNachrichtEncrypted( &byte, 1 );
  1743. char *f = new char[ byte + 1 ];
  1744. f[ byte ] = 0;
  1745. k->getNachrichtEncrypted( f, byte );
  1746. err = f;
  1747. delete[] f;
  1748. cs.unlock();
  1749. return 0;
  1750. }
  1751. err = "Unbekannter Fehler";
  1752. cs.unlock();
  1753. return 0;
  1754. }
  1755. // sucht nach dem Historie Server von einem Spiel
  1756. // Prüft, ob der Account bestimmte Berechtigungen besitzt
  1757. // recht: Die Id der Berechtigungen
  1758. bool InformationClient::hatRecht( int recht )
  1759. {
  1760. cs.lock();
  1761. if( !k )
  1762. {
  1763. err = "Der Client ist nicht verbunden.";
  1764. cs.unlock();
  1765. return 0;
  1766. }
  1767. k->sendeEncrypted( "\x2D", 1 );
  1768. char ret = 0;
  1769. k->getNachrichtEncrypted( &ret, 1 );
  1770. if( ret == 1 )
  1771. {
  1772. k->sendeEncrypted( (char*)&recht, 4 );
  1773. k->getNachrichtEncrypted( (char*)&ret, 1 );
  1774. }
  1775. if( ret == 3 )
  1776. {
  1777. char byte = 0;
  1778. k->getNachrichtEncrypted( &byte, 1 );
  1779. char *f = new char[ byte + 1 ];
  1780. f[ byte ] = 0;
  1781. k->getNachrichtEncrypted( f, byte );
  1782. err = f;
  1783. delete[] f;
  1784. }
  1785. cs.unlock();
  1786. return ret == 1;
  1787. }
  1788. // Prüft ob Berechtigung vorhanden
  1789. // Gibt eine Liste mit Karten zurück, die einen bestimmten Text im Namen enthalten und bestimmt sortiert ist
  1790. // filter: Die Zeichenkette, die im Namen Auftreten soll
  1791. // sortSpalte: Der Index der Spalte, nach der sortiert werden soll
  1792. // absteigend: 1:=absteigende sortierung,0:=aufsteigende Sortierung
  1793. // kId: Eine Liste, welche nach einem erfolgreichen Aufruf die Ids der Karten enthält
  1794. // kName: Eine Liste, welche nach einem erfolgreichen Aufruf die Namen der Karten enthält
  1795. // sName: Eine Liste, welche nach einem erfolgreichen Aufruf die Namen der Spiele der Karten enthält
  1796. // kupfer: Eine Liste, welche nach einem erfolgreichen Aufruf die Preise der Karten in Kupfer
  1797. // verkauft: Eine Liste, welche nach einem erfolgreichen Aufruf die Anzahl der Verkäufe der Karten enthält
  1798. // maxSpieler: Eine Liste, welche nach einem erfolgreichen Aufruf die Maximalen Spieleranzahlen der Karten enthält
  1799. int InformationClient::getKartenListe( char *filter, char sortSpalte, char absteigend, Framework::Array< int > *kId, Framework::RCArray< Framework::Text > *kName, Framework::RCArray< Framework::Text > *sName,
  1800. Framework::Array< int > *kupfer, Framework::Array< int > *verkauft, Framework::Array< int > *maxSpieler )
  1801. {
  1802. cs.lock();
  1803. if( !k )
  1804. {
  1805. err = "Der Client ist nicht verbunden.";
  1806. cs.unlock();
  1807. return 0;
  1808. }
  1809. k->sendeEncrypted( "\x2E", 1 );
  1810. char res = 0;
  1811. k->getNachrichtEncrypted( &res, 1 );
  1812. int ret = 0;
  1813. if( res == 1 )
  1814. {
  1815. char län = textLength( filter );
  1816. k->sendeEncrypted( &län, 1 );
  1817. k->sendeEncrypted( filter, län );
  1818. k->sendeEncrypted( &sortSpalte, 1 );
  1819. k->sendeEncrypted( &absteigend, 1 );
  1820. k->getNachrichtEncrypted( (char*)&ret, 4 );
  1821. for( int i = 0; i < ret; i++ )
  1822. {
  1823. int val = 0;
  1824. k->getNachrichtEncrypted( (char*)&val, 4 );
  1825. kId->set( val, i );
  1826. k->getNachrichtEncrypted( &län, 1 );
  1827. char *txt = new char[ län + 1 ];
  1828. txt[ län ] = 0;
  1829. if( län )
  1830. k->getNachrichtEncrypted( txt, län );
  1831. kName->set( new Text( txt ), i );
  1832. delete[] txt;
  1833. k->getNachrichtEncrypted( &län, 1 );
  1834. txt = new char[ län + 1 ];
  1835. txt[ län ] = 0;
  1836. if( län )
  1837. k->getNachrichtEncrypted( txt, län );
  1838. sName->set( new Text( txt ), i );
  1839. delete[] txt;
  1840. k->getNachrichtEncrypted( (char*)&val, 4 );
  1841. kupfer->set( val, i );
  1842. k->getNachrichtEncrypted( (char*)&val, 4 );
  1843. verkauft->set( val, i );
  1844. k->getNachrichtEncrypted( (char*)&val, 4 );
  1845. maxSpieler->set( val, i );
  1846. }
  1847. }
  1848. if( res == 3 )
  1849. {
  1850. char byte = 0;
  1851. k->getNachrichtEncrypted( &byte, 1 );
  1852. char *f = new char[ byte + 1 ];
  1853. f[ byte ] = 0;
  1854. k->getNachrichtEncrypted( f, byte );
  1855. err = f;
  1856. delete[] f;
  1857. }
  1858. cs.unlock();
  1859. return ret;
  1860. }
  1861. // Erzeugt einen Client zu dem Editor Server von der Karte mit einer bestimmten Id
  1862. // karteId: Die Id der Karte
  1863. // Gibt bei misserfolg 0 zurück
  1864. EditorServerClient *InformationClient::createEditorServerClient( int karteId )
  1865. {
  1866. cs.lock();
  1867. if( !k )
  1868. {
  1869. err = "Der Client ist nicht verbunden.";
  1870. cs.unlock();
  1871. return 0;
  1872. }
  1873. k->sendeEncrypted( "\x2F", 1 );
  1874. char ret = 0;
  1875. k->getNachrichtEncrypted( &ret, 1 );
  1876. if( ret == 1 )
  1877. {
  1878. k->sendeEncrypted( (char*)&karteId, 4 );
  1879. k->getNachrichtEncrypted( (char*)&ret, 1 );
  1880. if( ret == 1 )
  1881. {
  1882. int port = 0;
  1883. k->getNachrichtEncrypted( (char*)&port, 4 );
  1884. char län = 0;
  1885. k->getNachrichtEncrypted( &län, 1 );
  1886. char *ip = new char[ län + 1 ];
  1887. ip[ län ] = 0;
  1888. k->getNachrichtEncrypted( ip, län );
  1889. EditorClient *ret = new EditorClient( cId, (unsigned short)port, ip, this->key, this->keyLen );
  1890. delete[] ip;
  1891. cs.unlock();
  1892. return ret;
  1893. }
  1894. }
  1895. if( ret == 3 )
  1896. {
  1897. char byte = 0;
  1898. k->getNachrichtEncrypted( &byte, 1 );
  1899. char *f = new char[ byte + 1 ];
  1900. f[ byte ] = 0;
  1901. k->getNachrichtEncrypted( f, byte );
  1902. err = f;
  1903. delete[] f;
  1904. cs.unlock();
  1905. return 0;
  1906. }
  1907. err = "Unbekannter Fehler";
  1908. cs.unlock();
  1909. return 0;
  1910. }
  1911. // Erzeugt einen Client zu dem Karten Server von der Karte mit einer bestimmten Id
  1912. // karteId: Die Id der Karte
  1913. // Gibt bei misserfolg 0 zurück
  1914. KartenServerClient *InformationClient::createKartenServerClient( int karteId )
  1915. {
  1916. cs.lock();
  1917. if( !k )
  1918. {
  1919. err = "Der Client ist nicht verbunden.";
  1920. cs.unlock();
  1921. return 0;
  1922. }
  1923. k->sendeEncrypted( "\x30", 1 );
  1924. char ret = 0;
  1925. k->getNachrichtEncrypted( &ret, 1 );
  1926. if( ret == 1 )
  1927. {
  1928. k->sendeEncrypted( (char*)&karteId, 4 );
  1929. k->getNachrichtEncrypted( (char*)&ret, 1 );
  1930. if( ret == 1 )
  1931. {
  1932. int port = 0;
  1933. k->getNachrichtEncrypted( (char*)&port, 4 );
  1934. char län = 0;
  1935. k->getNachrichtEncrypted( &län, 1 );
  1936. char *ip = new char[ län + 1 ];
  1937. ip[ län ] = 0;
  1938. k->getNachrichtEncrypted( ip, län );
  1939. KartenClient *ret = new KartenClient( cId, (unsigned short)port, ip, this->key, this->keyLen );
  1940. delete[] ip;
  1941. cs.unlock();
  1942. return ret;
  1943. }
  1944. }
  1945. if( ret == 3 )
  1946. {
  1947. char byte = 0;
  1948. k->getNachrichtEncrypted( &byte, 1 );
  1949. char *f = new char[ byte + 1 ];
  1950. f[ byte ] = 0;
  1951. k->getNachrichtEncrypted( f, byte );
  1952. err = f;
  1953. delete[] f;
  1954. cs.unlock();
  1955. return 0;
  1956. }
  1957. err = "Unbekannter Fehler";
  1958. cs.unlock();
  1959. return 0;
  1960. }
  1961. // Erhält die Verbindung aufrecht
  1962. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  1963. // Sollte während einer bestehenden Verbindung etwa einmal alle 60 Sekunden aufgerufen werden, da sonst der Router die Verbindung automatisch trennt
  1964. bool InformationClient::keepAlive()
  1965. {
  1966. if( !cs.tryLock() )
  1967. return 1;
  1968. if( !k )
  1969. {
  1970. err = "Der Client ist nicht verbunden.";
  1971. cs.unlock();
  1972. return 0;
  1973. }
  1974. char res = 0;
  1975. bool ok = k->sendeEncrypted( "\x2C", 1 );
  1976. ok &= k->getNachrichtEncrypted( &res, 1 );
  1977. cs.unlock();
  1978. if( res != 1 || !ok )
  1979. trenne( 0 );
  1980. return res == 1;
  1981. }
  1982. // Trennt die Verbindung zum Server
  1983. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  1984. // Sollte erst nach einem erfolgreichen Aufruf von verbinde aufgerufen werden
  1985. bool InformationClient::trenne( bool abmelden )
  1986. {
  1987. cs.lock();
  1988. verbinde();
  1989. if( !k )
  1990. {
  1991. cs.unlock();
  1992. return 1;
  1993. }
  1994. if( abmelden )
  1995. {
  1996. k->sendeEncrypted( "\4", 1 );
  1997. char ret = 0;
  1998. k->getNachrichtEncrypted( &ret, 1 );
  1999. if( ret == 3 )
  2000. { // error
  2001. k->getNachrichtEncrypted( &ret, 1 );
  2002. char *msg = new char[ ret + 1 ];
  2003. msg[ ret ] = 0;
  2004. if( ret )
  2005. k->getNachrichtEncrypted( msg, ret );
  2006. err = "error while unregister Client Information Server returned: ";
  2007. err += msg;
  2008. delete[] msg;
  2009. }
  2010. }
  2011. k->sendeEncrypted( "\3", 1 );
  2012. char ret = 0;
  2013. k->getNachrichtEncrypted( &ret, 1 );
  2014. if( ret == 3 )
  2015. { // error
  2016. k->getNachrichtEncrypted( &ret, 1 );
  2017. char *msg = new char[ ret + 1 ];
  2018. msg[ ret ] = 0;
  2019. if( ret )
  2020. k->getNachrichtEncrypted( msg, ret );
  2021. err = "error while trenne Information Server returned: ";
  2022. err += msg;
  2023. delete[] msg;
  2024. }
  2025. k->trenne();
  2026. k = k->release();
  2027. cs.unlock();
  2028. return 1;
  2029. }
  2030. // Gibt 1 zurück, falls der Client verbunden ist, 0 sonst
  2031. bool InformationClient::istVerbunden() const
  2032. {
  2033. return k != 0;
  2034. }
  2035. // gibt den Letzten Fehlertext zuück
  2036. // sollte erst aufgerufen werden, nachdem eine andere aufgerufene Methode fehlgeschlagen ist
  2037. char *InformationClient::getLetzterFehler() const
  2038. {
  2039. return err;
  2040. }
  2041. // Erhöht den Reference Counter um 1 un gibt this zurück
  2042. InformationServerClient *InformationClient::getThis()
  2043. {
  2044. ref++;
  2045. return this;
  2046. }
  2047. // Verringert den Reference Counter um 1 und gibt 0 zurück.
  2048. // Falls der Reference Counter nach dem Aufruf auf 0 ist löscht sich das Objekt selbst
  2049. InformationServerClient *InformationClient::release()
  2050. {
  2051. if( !--ref )
  2052. delete this;
  2053. return 0;
  2054. }