Updater.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  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. {
  10. client = psc;
  11. fehler = new Text();
  12. ref = 1;
  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->getThis() ) )
  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->getThis() ) )
  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. char *Updater::getError() const
  652. {
  653. return fehler->getText();
  654. }
  655. int Updater::getDownload() const
  656. {
  657. return client->getDownload();
  658. }
  659. // Reference Counting
  660. UpdaterV *Updater::getThis()
  661. {
  662. ref++;
  663. return this;
  664. }
  665. UpdaterV *Updater::release()
  666. {
  667. ref--;
  668. if( !ref )
  669. delete this;
  670. return 0;
  671. }