Updater.cpp 19 KB

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