Updater.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. #include "Updater.h"
  2. #include <Text.h>
  3. #include <InitDatei.h>
  4. #include <Datei.h>
  5. #include <KSGTDatei.h>
  6. // Inhalt der Updater Klasse aus Updater.h
  7. // Konstruktor
  8. Updater::Updater(KSGClient::PatchServerClient* psc)
  9. : ReferenceCounter()
  10. {
  11. client = psc;
  12. fehler = new Text();
  13. }
  14. // Destruktor
  15. Updater::~Updater()
  16. {
  17. if (client->istVerbunden())
  18. client->trenne(1);
  19. client->release();
  20. fehler->release();
  21. }
  22. // nicht constant
  23. int Updater::getNextDateiGruppe(Text* zDgPfad)
  24. {
  25. if (!client->istVerbunden() && !client->verbinde())
  26. {
  27. fehler->setText(client->getLetzterFehler());
  28. return -1;
  29. }
  30. KSGTDatei* sDgTb = client->getDateiGruppenListe();
  31. if (!sDgTb)
  32. {
  33. fehler->setText(client->getLetzterFehler());
  34. client->trenne(0);
  35. return -1;
  36. }
  37. client->trenne(0);
  38. KSGTDatei* lDgTb = new KSGTDatei("data/dg.ksgt"); // Tabellen Spalten: Id, Pfad, Version, Priorität
  39. lDgTb->laden();
  40. InitDatei* ur = new InitDatei();
  41. for (int i = 0; i < sDgTb->getZeilenAnzahl(); i++)
  42. {
  43. int id = TextZuInt(sDgTb->zFeld(i, 0)->getText(), 10);
  44. int vs = TextZuInt(sDgTb->zFeld(i, 2)->getText(), 10);
  45. bool gefunden = 0;
  46. for (int j = 0; j < lDgTb->getZeilenAnzahl(); j++)
  47. {
  48. if (id == TextZuInt(lDgTb->zFeld(j, 0)->getText(), 10))
  49. {
  50. if (vs != TextZuInt(lDgTb->zFeld(j, 2)->getText(), 10))
  51. {
  52. if (!sDgTb->zFeld(i, 1)->getLength())
  53. ur->addWert(sDgTb->zFeld(i, 0)->getText(), "SOFORT");
  54. else if (!lDgTb->zFeld(j, 3)->istGleich("NICHT"))
  55. ur->addWert(sDgTb->zFeld(i, 0)->getText(), lDgTb->zFeld(j, 3)->getText());
  56. }
  57. gefunden = 1;
  58. break;
  59. }
  60. }
  61. if (gefunden)
  62. continue;
  63. if (!sDgTb->zFeld(i, 1)->getLength())
  64. ur->addWert(sDgTb->zFeld(i, 0)->getText(), "SOFORT");
  65. else if (DateiExistiert(sDgTb->getFeld(i, 1)))
  66. ur->addWert(sDgTb->zFeld(i, 0)->getText(), "SPÄTER");
  67. }
  68. lDgTb->release();
  69. if (!ur->getWertAnzahl())
  70. {
  71. ur->release();
  72. sDgTb->release();
  73. return 0;
  74. }
  75. int gruppe = 0;
  76. for (int i = 0; i < ur->getWertAnzahl(); i++)
  77. {
  78. if (ur->zWert(i)->istGleich("SOFORT"))
  79. {
  80. gruppe = TextZuInt(ur->zName(i)->getText(), 10);
  81. break;
  82. }
  83. }
  84. if (!gruppe)
  85. {
  86. unsigned int klein = 0xFFFFFFFF;
  87. for (int i = 0; i < ur->getWertAnzahl(); i++)
  88. {
  89. if (!ur->zWert(i)->istGleich("SPÄTER"))
  90. {
  91. unsigned int num = TextZuInt(ur->zWert(i)->getText(), 10);
  92. if (num < klein)
  93. {
  94. klein = num;
  95. gruppe = TextZuInt(ur->zName(i)->getText(), 10);
  96. }
  97. }
  98. }
  99. if (!gruppe)
  100. {
  101. for (int i = 0; i < ur->getWertAnzahl(); i++)
  102. {
  103. if (ur->zWert(i)->istGleich("SPÄTER"))
  104. {
  105. gruppe = TextZuInt(ur->zName(i)->getText(), 10);
  106. break;
  107. }
  108. }
  109. }
  110. }
  111. ur->release();
  112. if (zDgPfad)
  113. { // Pfad der Dateigruppe ermitteln
  114. for (int i = 0; i < sDgTb->getZeilenAnzahl(); i++)
  115. {
  116. if (gruppe == TextZuInt(sDgTb->zFeld(i, 0)->getText(), 10))
  117. {
  118. zDgPfad->setText(sDgTb->zFeld(i, 1)->getText());
  119. break;
  120. }
  121. }
  122. }
  123. sDgTb->release();
  124. return gruppe;
  125. }
  126. int Updater::update(UpdateParams* zParams)
  127. {
  128. if (zParams->zStatus)
  129. {
  130. zParams->zStatus->lockZeichnung();
  131. zParams->zStatus->setText("Verbinden . . .");
  132. zParams->zStatus->unlockZeichnung();
  133. }
  134. if (!client->istVerbunden() && !client->verbinde())
  135. {
  136. fehler->setText(client->getLetzterFehler());
  137. return 1;
  138. }
  139. bool clientGruppe = 0;
  140. KSGTDatei* dgL = client->getDateiGruppenListe();
  141. if (!dgL)
  142. {
  143. fehler->setText(client->getLetzterFehler());
  144. client->trenne(0);
  145. return 1;
  146. }
  147. Text* pfad = new Text("");
  148. for (int i = 0; i < dgL->getZeilenAnzahl(); i++)
  149. { // Pfad der Dateigruppe ermitteln
  150. if (zParams->dateiGruppe == TextZuInt(dgL->zFeld(i, 0)->getText(), 10))
  151. {
  152. pfad->setText(dgL->zFeld(i, 1)->getText());
  153. if (!pfad->getLength())
  154. clientGruppe = 1;
  155. break;
  156. }
  157. }
  158. if (!clientGruppe)
  159. pfad->append("/");
  160. Text* dlPf = new Text(pfad->getText());
  161. dlPf->append("data/update/datei_versionen.ini");
  162. InitDatei* dateiListe = new InitDatei(dlPf);
  163. dateiListe->laden();
  164. Text* dsPf = new Text(pfad->getText());
  165. dsPf->append("data/update/datei_status.ini");
  166. InitDatei* dateiStatus = new InitDatei(dsPf);
  167. dateiStatus->laden();
  168. Text* llPf = new Text(pfad->getText());
  169. llPf->append("data/update/datei_remove.patch");
  170. Datei* removeListe = new Datei();
  171. removeListe->setDatei(llPf);
  172. if (!removeListe->existiert())
  173. removeListe->erstellen();
  174. removeListe->open(Datei::Style::schreiben);
  175. KSGTDatei* dl = client->getDateiListe(zParams->dateiGruppe); // Liste mit Dateien aus der Gruppe
  176. if (!dl)
  177. { // error
  178. dgL->release();
  179. pfad->release();
  180. dateiListe->release();
  181. dateiStatus->release();
  182. removeListe->release();
  183. fehler->setText(client->getLetzterFehler());
  184. client->trenne(0);
  185. return 1;
  186. }
  187. for (int i = 0; i < dl->getZeilenAnzahl(); i++)
  188. {
  189. if (dl->zFeld(i, 0)->istGleich("1"))
  190. { // existierende Datei
  191. if (!dateiListe->wertExistiert(dl->zFeld(i, 1)->getText()))
  192. {
  193. dateiListe->addWert(dl->zFeld(i, 1)->getText(), dl->zFeld(i, 2)->getText());
  194. dateiStatus->addWert(dl->zFeld(i, 1)->getText(), "Ausstehend");
  195. }
  196. else
  197. {
  198. if (!dateiListe->zWert(dl->zFeld(i, 1)->getText())->istGleich(dl->zFeld(i, 2)->getText()))
  199. {
  200. dateiListe->setWert(dl->zFeld(i, 1)->getText(), dl->zFeld(i, 2)->getText());
  201. dateiStatus->setWert(dl->zFeld(i, 1)->getText(), "Ausstehend");
  202. }
  203. }
  204. }
  205. else
  206. { // gelöschte Datei
  207. removeListe->schreibe(dl->zFeld(i, 1)->getText(), dl->zFeld(i, 1)->getLength());
  208. removeListe->schreibe("\n", 1);
  209. dateiListe->removeWert(dl->zFeld(i, 1)->getText());
  210. dateiStatus->removeWert(dl->zFeld(i, 1)->getText());
  211. }
  212. }
  213. removeListe->close();
  214. removeListe->release();
  215. dateiListe->speichern();
  216. dateiStatus->speichern();
  217. dl->release();
  218. Text* ldPf = new Text(pfad->getText());
  219. ldPf->append("data/versionen.ini");
  220. InitDatei* lokaleDateien = new InitDatei(ldPf);
  221. if (!lokaleDateien->laden())
  222. DateiPfadErstellen(lokaleDateien->zPfad()->getText());
  223. __int64 maxAktionen = 0;
  224. for (int i = 0; i < dateiListe->getWertAnzahl(); i++)
  225. {
  226. bool geändert = 0;
  227. if (!lokaleDateien->wertExistiert(dateiListe->zName(i)->getText()))
  228. {
  229. geändert = 1;
  230. if (dateiStatus->zWert(dateiListe->zName(i)->getText()) &&
  231. dateiStatus->zWert(dateiListe->zName(i)->getText())->istGleich("Fertig"))
  232. geändert = 0;
  233. }
  234. else
  235. {
  236. if (!lokaleDateien->zWert(dateiListe->zName(i)->getText())->istGleich(dateiListe->zWert(i)->getText()))
  237. geändert = 1;
  238. else
  239. dateiStatus->setWert(dateiListe->zName(i)->getText(), "Fertig");
  240. }
  241. if (geändert && !dateiStatus->zWert(dateiListe->zName(i)->getText())->istGleich("Fertig"))
  242. {
  243. maxAktionen += client->getDateiGröße(zParams->dateiGruppe, dateiListe->zName(i)->getText());
  244. if (dateiStatus->zWert(dateiListe->zName(i)->getText())->istGleich("InBearbeitung"))
  245. {
  246. Text* jPf = new Text(pfad->getText());
  247. jPf->append("data/update/jetzt_position.patch");
  248. Datei* jetzt = new Datei();
  249. jetzt->setDatei(jPf);
  250. if (jetzt->open(Datei::Style::lesen))
  251. {
  252. __int64 pos = 0;
  253. jetzt->lese((char*)&pos, 8);
  254. maxAktionen -= pos;
  255. jetzt->close();
  256. }
  257. jetzt->release();
  258. }
  259. }
  260. }
  261. dateiStatus->speichern();
  262. if (zParams->zFortschritt)
  263. {
  264. zParams->zFortschritt->reset();
  265. zParams->zFortschritt->setAktionAnzahl(maxAktionen);
  266. }
  267. for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
  268. {
  269. if (dateiStatus->zWert(i)->istGleich("InBearbeitung"))
  270. {
  271. Text* jPf = new Text(pfad->getText());
  272. jPf->append("data/update/jetzt_position.patch");
  273. Datei* jetzt = new Datei();
  274. jetzt->setDatei(jPf);
  275. __int64 pos = 0;
  276. if (jetzt->open(Datei::Style::lesen))
  277. {
  278. jetzt->lese((char*)&pos, 8);
  279. jetzt->close();
  280. }
  281. jetzt->release();
  282. Text* zielPf = new Text(pfad->getText());
  283. zielPf->append("data/update/download/");
  284. zielPf->append(dateiStatus->zName(i)->getText());
  285. InitDatei* poIni = new InitDatei("data/patch/po.ini");
  286. poIni->laden();
  287. int maxbps = 0;
  288. if (poIni->wertExistiert("ülps") && poIni->zWert("ülps")->getLength() && poIni->wertExistiert("üle"))
  289. {
  290. if (poIni->zWert("üle")->istGleich("kb/s"))
  291. maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024;
  292. if (poIni->zWert("üle")->istGleich("mb/s"))
  293. maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024 * 1024;
  294. }
  295. poIni->release();
  296. if (zParams->zStatus)
  297. {
  298. zParams->zStatus->lockZeichnung();
  299. zParams->zStatus->setText(dateiStatus->zName(i)->getText());
  300. zParams->zStatus->unlockZeichnung();
  301. }
  302. if (client->downloadDatei(zParams->dateiGruppe, &pos, dateiStatus->zName(i)->getText(), zielPf->getText(), zParams->zFortschritt, zParams->abbruch, maxbps))
  303. {
  304. if ((*zParams->abbruch))
  305. { // übertragung unterbrochen
  306. jPf = new Text(pfad->getText());
  307. jPf->append("data/update/jetzt_position.patch");
  308. jetzt = new Datei();
  309. jetzt->setDatei(jPf);
  310. if (jetzt->open(Datei::Style::schreiben))
  311. {
  312. jetzt->schreibe((char*)&pos, 8);
  313. jetzt->close();
  314. }
  315. jetzt->release();
  316. dgL->release();
  317. pfad->release();
  318. dateiListe->release();
  319. dateiStatus->release();
  320. zielPf->release();
  321. lokaleDateien->release();
  322. fehler->setText("");
  323. client->trenne(0);
  324. return 2;
  325. }
  326. else
  327. {
  328. dateiStatus->setWert(i, "Fertig");
  329. dateiStatus->speichern();
  330. }
  331. }
  332. else
  333. { // error
  334. dgL->release();
  335. pfad->release();
  336. dateiListe->release();
  337. dateiStatus->release();
  338. zielPf->release();
  339. lokaleDateien->release();
  340. fehler->setText(client->getLetzterFehler());
  341. client->trenne(0);
  342. return 1;
  343. }
  344. zielPf->release();
  345. break;
  346. }
  347. }
  348. for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
  349. {
  350. if (dateiStatus->zWert(i)->istGleich("Ausstehend"))
  351. {
  352. dateiStatus->setWert(i, "InBearbeitung");
  353. Text* jPf = new Text(pfad->getText());
  354. jPf->append("data/update/jetzt_position.patch");
  355. Datei* jetzt = new Datei();
  356. jetzt->setDatei(jPf);
  357. __int64 pos = 0;
  358. jetzt->open(Datei::Style::schreiben);
  359. jetzt->schreibe((char*)&pos, 8);
  360. jetzt->close();
  361. jetzt->release();
  362. dateiStatus->speichern();
  363. Text* zielPf = new Text(pfad->getText());
  364. zielPf->append("data/update/download/");
  365. zielPf->append(dateiStatus->zName(i)->getText());
  366. InitDatei* poIni = new InitDatei("data/patch/po.ini");
  367. poIni->laden();
  368. int maxbps = 0;
  369. if (poIni->wertExistiert("ülps") && poIni->zWert("ülps")->getLength() && poIni->wertExistiert("üle"))
  370. {
  371. if (poIni->zWert("üle")->istGleich("kb/s"))
  372. maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024;
  373. if (poIni->zWert("üle")->istGleich("mb/s"))
  374. maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024 * 1024;
  375. }
  376. poIni->release();
  377. if (zParams->zStatus)
  378. {
  379. zParams->zStatus->lockZeichnung();
  380. zParams->zStatus->setText(dateiStatus->zName(i)->getText());
  381. zParams->zStatus->unlockZeichnung();
  382. }
  383. if (client->downloadDatei(zParams->dateiGruppe, &pos, dateiStatus->zName(i)->getText(), zielPf->getText(), zParams->zFortschritt, zParams->abbruch, maxbps))
  384. {
  385. if ((*zParams->abbruch))
  386. { // übertragung unterbrochen
  387. jPf = new Text(pfad->getText());
  388. jPf->append("data/update/jetzt_position.patch");
  389. jetzt = new Datei();
  390. jetzt->setDatei(jPf);
  391. if (jetzt->open(Datei::Style::schreiben))
  392. {
  393. jetzt->schreibe((char*)&pos, 8);
  394. jetzt->close();
  395. }
  396. jetzt->release();
  397. dgL->release();
  398. pfad->release();
  399. dateiListe->release();
  400. dateiStatus->release();
  401. zielPf->release();
  402. lokaleDateien->release();
  403. fehler->setText("");
  404. client->trenne(0);
  405. return 2;
  406. }
  407. else
  408. {
  409. dateiStatus->setWert(i, "Fertig");
  410. dateiStatus->speichern();
  411. }
  412. }
  413. else
  414. { // error
  415. dgL->release();
  416. pfad->release();
  417. dateiListe->release();
  418. dateiStatus->release();
  419. zielPf->release();
  420. lokaleDateien->release();
  421. fehler->setText(client->getLetzterFehler());
  422. client->trenne(0);
  423. return 1;
  424. }
  425. zielPf->release();
  426. }
  427. }
  428. if (zParams->zStatus)
  429. {
  430. zParams->zStatus->lockZeichnung();
  431. zParams->zStatus->setText("Übernehme Änderungen...");
  432. zParams->zStatus->unlockZeichnung();
  433. }
  434. removeListe = new Datei();
  435. llPf = new Text(pfad->getText());
  436. llPf->append("data/update/datei_remove.patch");
  437. removeListe->setDatei(llPf);
  438. removeListe->open(Datei::Style::lesen);
  439. Text* zeile = removeListe->leseZeile();
  440. while (zeile)
  441. {
  442. zeile->remove("\r\n");
  443. zeile->remove("\n");
  444. if (!zeile->getLength())
  445. break;
  446. Text pf = pfad->getText();
  447. pf += zeile->getText();
  448. lokaleDateien->removeWert(zeile->getText());
  449. DateiRemove(pf);
  450. zeile->release();
  451. zeile = removeListe->leseZeile();
  452. }
  453. lokaleDateien->speichern();
  454. removeListe->close();
  455. removeListe->remove();
  456. removeListe->release();
  457. if (clientGruppe)
  458. { // Es wird der Patcher selbst geupdatet
  459. Text* uPf = new Text(pfad->getText());
  460. uPf->append("data/update/unable/list.patch");
  461. Datei* unable = new Datei();
  462. unable->setDatei(uPf);
  463. unable->erstellen();
  464. unable->open(Datei::Style::schreiben);
  465. bool fertig = 1;
  466. for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
  467. {
  468. Text* altPfad = new Text(pfad->getText());
  469. altPfad->append("data/update/download/");
  470. altPfad->append(dateiStatus->zName(i)->getText());
  471. Text* neuPfad = new Text(pfad->getText());
  472. neuPfad->append(dateiStatus->zName(i)->getText());
  473. if (DateiExistiert(altPfad->getText()))
  474. {
  475. bool b = 0;
  476. if (!DateiExistiert(neuPfad->getText()))
  477. DateiPfadErstellen(neuPfad->getText());
  478. if (DateiExistiert(neuPfad->getText()))
  479. {
  480. if (DateiRemove(neuPfad->getText()))
  481. {
  482. if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
  483. b = 1;
  484. }
  485. else
  486. b = 1;
  487. }
  488. else
  489. {
  490. if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
  491. b = 1;
  492. }
  493. if (b)
  494. {
  495. unable->schreibe("\2", 1);
  496. unable->schreibe(neuPfad->getText(), neuPfad->getLength());
  497. unable->schreibe("=>", 2);
  498. unable->schreibe(altPfad->getText(), altPfad->getLength());
  499. unable->schreibe("\n", 1);
  500. fertig = 0;
  501. }
  502. }
  503. altPfad->release();
  504. neuPfad->release();
  505. if (!lokaleDateien->wertExistiert(dateiStatus->zName(i)->getText()))
  506. lokaleDateien->addWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
  507. else
  508. lokaleDateien->setWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
  509. }
  510. unable->close();
  511. if (fertig)
  512. unable->remove();
  513. unable->release();
  514. }
  515. else
  516. { // Es werden Spiele und Karten geupdatet
  517. for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
  518. {
  519. Text* altPfad = new Text(pfad->getText());
  520. altPfad->append("data/update/download/");
  521. altPfad->append(dateiStatus->zName(i)->getText());
  522. Text* neuPfad = new Text(pfad->getText());
  523. neuPfad->append(dateiStatus->zName(i)->getText());
  524. if (DateiExistiert(altPfad->getText()))
  525. {
  526. bool b = 0;
  527. if (!DateiExistiert(neuPfad->getText()))
  528. DateiPfadErstellen(neuPfad->getText());
  529. if (DateiExistiert(neuPfad->getText()))
  530. {
  531. if (DateiRemove(neuPfad->getText()))
  532. {
  533. if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
  534. b = 1;
  535. }
  536. else
  537. b = 1;
  538. }
  539. else
  540. {
  541. if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
  542. b = 1;
  543. }
  544. if (b)
  545. { // error
  546. dgL->release();
  547. pfad->release();
  548. lokaleDateien->speichern();
  549. lokaleDateien->release();
  550. dateiListe->release();
  551. dateiStatus->release();
  552. fehler->setText(client->getLetzterFehler());
  553. client->trenne(0);
  554. return 1;
  555. }
  556. }
  557. altPfad->release();
  558. neuPfad->release();
  559. if (!lokaleDateien->wertExistiert(dateiStatus->zName(i)->getText()))
  560. lokaleDateien->addWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
  561. else
  562. lokaleDateien->setWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
  563. }
  564. }
  565. lokaleDateien->speichern();
  566. lokaleDateien->release();
  567. dateiListe->release();
  568. dateiStatus->release();
  569. Text* jpPf = new Text(pfad->getText());
  570. jpPf->append("data/update/jetzt_position.patch");
  571. DateiRemove(jpPf);
  572. Text* dvPf = new Text(pfad->getText());
  573. dvPf->append("data/update/datei_versionen.ini");
  574. DateiRemove(dvPf);
  575. dsPf = new Text(pfad->getText());
  576. dsPf->append("data/update/datei_status.ini");
  577. DateiRemove(dsPf);
  578. if (clientGruppe)
  579. {
  580. Text* ulPf = new Text(pfad->getText());
  581. ulPf->append("data/update/unable/list.patch");
  582. if (DateiExistiert(ulPf))
  583. { // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
  584. dgL->release();
  585. pfad->release();
  586. fehler->setText("");
  587. client->trenne(0);
  588. return 3;
  589. }
  590. }
  591. pfad->release();
  592. KSGTDatei* lDgL = new KSGTDatei("data/dg.ksgt");
  593. lDgL->laden();
  594. bool gefunden = 0;
  595. for (int i = 0; i < lDgL->getZeilenAnzahl(); i++)
  596. {
  597. if (zParams->dateiGruppe == TextZuInt(lDgL->zFeld(i, 0)->getText(), 10))
  598. {
  599. for (int j = 0; j < dgL->getZeilenAnzahl(); j++)
  600. {
  601. if (zParams->dateiGruppe == TextZuInt(dgL->zFeld(j, 0)->getText(), 10))
  602. {
  603. lDgL->setFeld(i, 2, dgL->zFeld(j, 2)->getText());
  604. break;
  605. }
  606. }
  607. gefunden = 1;
  608. break;
  609. }
  610. }
  611. if (!gefunden)
  612. {
  613. unsigned int rfPos = 0;
  614. for (int i = 0; i < lDgL->getZeilenAnzahl(); i++)
  615. {
  616. if (rfPos <= TextZuInt(lDgL->zFeld(i, 3)->getText(), 10))
  617. rfPos = TextZuInt(lDgL->zFeld(i, 3)->getText(), 10) + 1;
  618. }
  619. rfPos++;
  620. for (int i = 0; i < dgL->getZeilenAnzahl(); i++)
  621. {
  622. if (zParams->dateiGruppe == TextZuInt(dgL->zFeld(i, 0)->getText(), 10))
  623. {
  624. RCArray< Text >* zeile = new RCArray< Text >();
  625. zeile->set(new Text(dgL->zFeld(i, 0)->getText()), 0);
  626. zeile->set(new Text(dgL->zFeld(i, 1)->getText()), 1);
  627. zeile->set(new Text(dgL->zFeld(i, 2)->getText()), 2);
  628. Text* rfPosT = new Text();
  629. rfPosT->append(rfPos);
  630. zeile->set(rfPosT, 3);
  631. lDgL->addZeile(4, zeile);
  632. zeile->release();
  633. break;
  634. }
  635. }
  636. }
  637. dgL->release();
  638. lDgL->speichern();
  639. lDgL->release();
  640. if ((*zParams->abbruch))
  641. {
  642. fehler->setText("");
  643. client->trenne(0);
  644. return 2;
  645. }
  646. client->trenne(0);
  647. fehler->setText("");
  648. return 0;
  649. }
  650. // constant
  651. const char* Updater::getError() const
  652. {
  653. return fehler->getText();
  654. }
  655. int Updater::getDownload() const
  656. {
  657. return client->getDownload();
  658. }