123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664 |
- #include "Updater.h"
- #include <Text.h>
- #include <InitDatei.h>
- #include <Datei.h>
- #include <KSGTDatei.h>
- // Inhalt der Updater Klasse aus Updater.h
- // Konstruktor
- Updater::Updater(KSGClient::PatchServerClient* psc)
- : ReferenceCounter()
- {
- client = psc;
- fehler = new Text();
- }
- // Destruktor
- Updater::~Updater()
- {
- if (client->istVerbunden())
- client->trenne(1);
- client->release();
- fehler->release();
- }
- // nicht constant
- int Updater::getNextDateiGruppe(Text* zDgPfad)
- {
- if (!client->istVerbunden() && !client->verbinde())
- {
- fehler->setText(client->getLetzterFehler());
- return -1;
- }
- KSGTDatei* sDgTb = client->getDateiGruppenListe();
- if (!sDgTb)
- {
- fehler->setText(client->getLetzterFehler());
- client->trenne(0);
- return -1;
- }
- client->trenne(0);
- KSGTDatei* lDgTb = new KSGTDatei("data/dg.ksgt"); // Tabellen Spalten: Id, Pfad, Version, Priorität
- lDgTb->laden();
- InitDatei* ur = new InitDatei();
- for (int i = 0; i < sDgTb->getZeilenAnzahl(); i++)
- {
- int id = TextZuInt(sDgTb->zFeld(i, 0)->getText(), 10);
- int vs = TextZuInt(sDgTb->zFeld(i, 2)->getText(), 10);
- bool gefunden = 0;
- for (int j = 0; j < lDgTb->getZeilenAnzahl(); j++)
- {
- if (id == TextZuInt(lDgTb->zFeld(j, 0)->getText(), 10))
- {
- if (vs != TextZuInt(lDgTb->zFeld(j, 2)->getText(), 10))
- {
- if (!sDgTb->zFeld(i, 1)->getLength())
- ur->addWert(sDgTb->zFeld(i, 0)->getText(), "SOFORT");
- else if (!lDgTb->zFeld(j, 3)->istGleich("NICHT"))
- ur->addWert(sDgTb->zFeld(i, 0)->getText(), lDgTb->zFeld(j, 3)->getText());
- }
- gefunden = 1;
- break;
- }
- }
- if (gefunden)
- continue;
- if (!sDgTb->zFeld(i, 1)->getLength())
- ur->addWert(sDgTb->zFeld(i, 0)->getText(), "SOFORT");
- else if (DateiExistiert(sDgTb->getFeld(i, 1)))
- ur->addWert(sDgTb->zFeld(i, 0)->getText(), "SPÄTER");
- }
- lDgTb->release();
- if (!ur->getWertAnzahl())
- {
- ur->release();
- sDgTb->release();
- return 0;
- }
- int gruppe = 0;
- for (int i = 0; i < ur->getWertAnzahl(); i++)
- {
- if (ur->zWert(i)->istGleich("SOFORT"))
- {
- gruppe = TextZuInt(ur->zName(i)->getText(), 10);
- break;
- }
- }
- if (!gruppe)
- {
- unsigned int klein = 0xFFFFFFFF;
- for (int i = 0; i < ur->getWertAnzahl(); i++)
- {
- if (!ur->zWert(i)->istGleich("SPÄTER"))
- {
- unsigned int num = TextZuInt(ur->zWert(i)->getText(), 10);
- if (num < klein)
- {
- klein = num;
- gruppe = TextZuInt(ur->zName(i)->getText(), 10);
- }
- }
- }
- if (!gruppe)
- {
- for (int i = 0; i < ur->getWertAnzahl(); i++)
- {
- if (ur->zWert(i)->istGleich("SPÄTER"))
- {
- gruppe = TextZuInt(ur->zName(i)->getText(), 10);
- break;
- }
- }
- }
- }
- ur->release();
- if (zDgPfad)
- { // Pfad der Dateigruppe ermitteln
- for (int i = 0; i < sDgTb->getZeilenAnzahl(); i++)
- {
- if (gruppe == TextZuInt(sDgTb->zFeld(i, 0)->getText(), 10))
- {
- zDgPfad->setText(sDgTb->zFeld(i, 1)->getText());
- break;
- }
- }
- }
- sDgTb->release();
- return gruppe;
- }
- int Updater::update(UpdateParams* zParams)
- {
- if (zParams->zStatus)
- {
- zParams->zStatus->lockZeichnung();
- zParams->zStatus->setText("Verbinden . . .");
- zParams->zStatus->unlockZeichnung();
- }
- if (!client->istVerbunden() && !client->verbinde())
- {
- fehler->setText(client->getLetzterFehler());
- return 1;
- }
- bool clientGruppe = 0;
- KSGTDatei* dgL = client->getDateiGruppenListe();
- if (!dgL)
- {
- fehler->setText(client->getLetzterFehler());
- client->trenne(0);
- return 1;
- }
- Text* pfad = new Text("");
- for (int i = 0; i < dgL->getZeilenAnzahl(); i++)
- { // Pfad der Dateigruppe ermitteln
- if (zParams->dateiGruppe == TextZuInt(dgL->zFeld(i, 0)->getText(), 10))
- {
- pfad->setText(dgL->zFeld(i, 1)->getText());
- if (!pfad->getLength())
- clientGruppe = 1;
- break;
- }
- }
- if (!clientGruppe)
- pfad->append("/");
- Text* dlPf = new Text(pfad->getText());
- dlPf->append("data/update/datei_versionen.ini");
- InitDatei* dateiListe = new InitDatei(dlPf);
- dateiListe->laden();
- Text* dsPf = new Text(pfad->getText());
- dsPf->append("data/update/datei_status.ini");
- InitDatei* dateiStatus = new InitDatei(dsPf);
- dateiStatus->laden();
- Text* llPf = new Text(pfad->getText());
- llPf->append("data/update/datei_remove.patch");
- Datei* removeListe = new Datei();
- removeListe->setDatei(llPf);
- if (!removeListe->existiert())
- removeListe->erstellen();
- removeListe->open(Datei::Style::schreiben);
- KSGTDatei* dl = client->getDateiListe(zParams->dateiGruppe); // Liste mit Dateien aus der Gruppe
- if (!dl)
- { // error
- dgL->release();
- pfad->release();
- dateiListe->release();
- dateiStatus->release();
- removeListe->release();
- fehler->setText(client->getLetzterFehler());
- client->trenne(0);
- return 1;
- }
- for (int i = 0; i < dl->getZeilenAnzahl(); i++)
- {
- if (dl->zFeld(i, 0)->istGleich("1"))
- { // existierende Datei
- if (!dateiListe->wertExistiert(dl->zFeld(i, 1)->getText()))
- {
- dateiListe->addWert(dl->zFeld(i, 1)->getText(), dl->zFeld(i, 2)->getText());
- dateiStatus->addWert(dl->zFeld(i, 1)->getText(), "Ausstehend");
- }
- else
- {
- if (!dateiListe->zWert(dl->zFeld(i, 1)->getText())->istGleich(dl->zFeld(i, 2)->getText()))
- {
- dateiListe->setWert(dl->zFeld(i, 1)->getText(), dl->zFeld(i, 2)->getText());
- dateiStatus->setWert(dl->zFeld(i, 1)->getText(), "Ausstehend");
- }
- }
- }
- else
- { // gelöschte Datei
- removeListe->schreibe(dl->zFeld(i, 1)->getText(), dl->zFeld(i, 1)->getLength());
- removeListe->schreibe("\n", 1);
- dateiListe->removeWert(dl->zFeld(i, 1)->getText());
- dateiStatus->removeWert(dl->zFeld(i, 1)->getText());
- }
- }
- removeListe->close();
- removeListe->release();
- dateiListe->speichern();
- dateiStatus->speichern();
- dl->release();
- Text* ldPf = new Text(pfad->getText());
- ldPf->append("data/versionen.ini");
- InitDatei* lokaleDateien = new InitDatei(ldPf);
- if (!lokaleDateien->laden())
- DateiPfadErstellen(lokaleDateien->zPfad()->getText());
- __int64 maxAktionen = 0;
- for (int i = 0; i < dateiListe->getWertAnzahl(); i++)
- {
- bool geändert = 0;
- if (!lokaleDateien->wertExistiert(dateiListe->zName(i)->getText()))
- {
- geändert = 1;
- if (dateiStatus->zWert(dateiListe->zName(i)->getText()) &&
- dateiStatus->zWert(dateiListe->zName(i)->getText())->istGleich("Fertig"))
- geändert = 0;
- }
- else
- {
- if (!lokaleDateien->zWert(dateiListe->zName(i)->getText())->istGleich(dateiListe->zWert(i)->getText()))
- geändert = 1;
- else
- dateiStatus->setWert(dateiListe->zName(i)->getText(), "Fertig");
- }
- if (geändert && !dateiStatus->zWert(dateiListe->zName(i)->getText())->istGleich("Fertig"))
- {
- maxAktionen += client->getDateiGröße(zParams->dateiGruppe, dateiListe->zName(i)->getText());
- if (dateiStatus->zWert(dateiListe->zName(i)->getText())->istGleich("InBearbeitung"))
- {
- Text* jPf = new Text(pfad->getText());
- jPf->append("data/update/jetzt_position.patch");
- Datei* jetzt = new Datei();
- jetzt->setDatei(jPf);
- if (jetzt->open(Datei::Style::lesen))
- {
- __int64 pos = 0;
- jetzt->lese((char*)&pos, 8);
- maxAktionen -= pos;
- jetzt->close();
- }
- jetzt->release();
- }
- }
- }
- dateiStatus->speichern();
- if (zParams->zFortschritt)
- {
- zParams->zFortschritt->reset();
- zParams->zFortschritt->setAktionAnzahl(maxAktionen);
- }
- for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
- {
- if (dateiStatus->zWert(i)->istGleich("InBearbeitung"))
- {
- Text* jPf = new Text(pfad->getText());
- jPf->append("data/update/jetzt_position.patch");
- Datei* jetzt = new Datei();
- jetzt->setDatei(jPf);
- __int64 pos = 0;
- if (jetzt->open(Datei::Style::lesen))
- {
- jetzt->lese((char*)&pos, 8);
- jetzt->close();
- }
- jetzt->release();
- Text* zielPf = new Text(pfad->getText());
- zielPf->append("data/update/download/");
- zielPf->append(dateiStatus->zName(i)->getText());
- InitDatei* poIni = new InitDatei("data/patch/po.ini");
- poIni->laden();
- int maxbps = 0;
- if (poIni->wertExistiert("ülps") && poIni->zWert("ülps")->getLength() && poIni->wertExistiert("üle"))
- {
- if (poIni->zWert("üle")->istGleich("kb/s"))
- maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024;
- if (poIni->zWert("üle")->istGleich("mb/s"))
- maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024 * 1024;
- }
- poIni->release();
- if (zParams->zStatus)
- {
- zParams->zStatus->lockZeichnung();
- zParams->zStatus->setText(dateiStatus->zName(i)->getText());
- zParams->zStatus->unlockZeichnung();
- }
- if (client->downloadDatei(zParams->dateiGruppe, &pos, dateiStatus->zName(i)->getText(), zielPf->getText(), zParams->zFortschritt, zParams->abbruch, maxbps))
- {
- if ((*zParams->abbruch))
- { // übertragung unterbrochen
- jPf = new Text(pfad->getText());
- jPf->append("data/update/jetzt_position.patch");
- jetzt = new Datei();
- jetzt->setDatei(jPf);
- if (jetzt->open(Datei::Style::schreiben))
- {
- jetzt->schreibe((char*)&pos, 8);
- jetzt->close();
- }
- jetzt->release();
- dgL->release();
- pfad->release();
- dateiListe->release();
- dateiStatus->release();
- zielPf->release();
- lokaleDateien->release();
- fehler->setText("");
- client->trenne(0);
- return 2;
- }
- else
- {
- dateiStatus->setWert(i, "Fertig");
- dateiStatus->speichern();
- }
- }
- else
- { // error
- dgL->release();
- pfad->release();
- dateiListe->release();
- dateiStatus->release();
- zielPf->release();
- lokaleDateien->release();
- fehler->setText(client->getLetzterFehler());
- client->trenne(0);
- return 1;
- }
- zielPf->release();
- break;
- }
- }
- for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
- {
- if (dateiStatus->zWert(i)->istGleich("Ausstehend"))
- {
- dateiStatus->setWert(i, "InBearbeitung");
- Text* jPf = new Text(pfad->getText());
- jPf->append("data/update/jetzt_position.patch");
- Datei* jetzt = new Datei();
- jetzt->setDatei(jPf);
- __int64 pos = 0;
- jetzt->open(Datei::Style::schreiben);
- jetzt->schreibe((char*)&pos, 8);
- jetzt->close();
- jetzt->release();
- dateiStatus->speichern();
- Text* zielPf = new Text(pfad->getText());
- zielPf->append("data/update/download/");
- zielPf->append(dateiStatus->zName(i)->getText());
- InitDatei* poIni = new InitDatei("data/patch/po.ini");
- poIni->laden();
- int maxbps = 0;
- if (poIni->wertExistiert("ülps") && poIni->zWert("ülps")->getLength() && poIni->wertExistiert("üle"))
- {
- if (poIni->zWert("üle")->istGleich("kb/s"))
- maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024;
- if (poIni->zWert("üle")->istGleich("mb/s"))
- maxbps = (int)TextZuInt(poIni->zWert("ülps")->getText(), 10) * 1024 * 1024;
- }
- poIni->release();
- if (zParams->zStatus)
- {
- zParams->zStatus->lockZeichnung();
- zParams->zStatus->setText(dateiStatus->zName(i)->getText());
- zParams->zStatus->unlockZeichnung();
- }
- if (client->downloadDatei(zParams->dateiGruppe, &pos, dateiStatus->zName(i)->getText(), zielPf->getText(), zParams->zFortschritt, zParams->abbruch, maxbps))
- {
- if ((*zParams->abbruch))
- { // übertragung unterbrochen
- jPf = new Text(pfad->getText());
- jPf->append("data/update/jetzt_position.patch");
- jetzt = new Datei();
- jetzt->setDatei(jPf);
- if (jetzt->open(Datei::Style::schreiben))
- {
- jetzt->schreibe((char*)&pos, 8);
- jetzt->close();
- }
- jetzt->release();
- dgL->release();
- pfad->release();
- dateiListe->release();
- dateiStatus->release();
- zielPf->release();
- lokaleDateien->release();
- fehler->setText("");
- client->trenne(0);
- return 2;
- }
- else
- {
- dateiStatus->setWert(i, "Fertig");
- dateiStatus->speichern();
- }
- }
- else
- { // error
- dgL->release();
- pfad->release();
- dateiListe->release();
- dateiStatus->release();
- zielPf->release();
- lokaleDateien->release();
- fehler->setText(client->getLetzterFehler());
- client->trenne(0);
- return 1;
- }
- zielPf->release();
- }
- }
- if (zParams->zStatus)
- {
- zParams->zStatus->lockZeichnung();
- zParams->zStatus->setText("Übernehme Änderungen...");
- zParams->zStatus->unlockZeichnung();
- }
- removeListe = new Datei();
- llPf = new Text(pfad->getText());
- llPf->append("data/update/datei_remove.patch");
- removeListe->setDatei(llPf);
- removeListe->open(Datei::Style::lesen);
- Text* zeile = removeListe->leseZeile();
- while (zeile)
- {
- zeile->remove("\r\n");
- zeile->remove("\n");
- if (!zeile->getLength())
- break;
- Text pf = pfad->getText();
- pf += zeile->getText();
- lokaleDateien->removeWert(zeile->getText());
- DateiRemove(pf);
- zeile->release();
- zeile = removeListe->leseZeile();
- }
- lokaleDateien->speichern();
- removeListe->close();
- removeListe->remove();
- removeListe->release();
- if (clientGruppe)
- { // Es wird der Patcher selbst geupdatet
- Text* uPf = new Text(pfad->getText());
- uPf->append("data/update/unable/list.patch");
- Datei* unable = new Datei();
- unable->setDatei(uPf);
- unable->erstellen();
- unable->open(Datei::Style::schreiben);
- bool fertig = 1;
- for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
- {
- Text* altPfad = new Text(pfad->getText());
- altPfad->append("data/update/download/");
- altPfad->append(dateiStatus->zName(i)->getText());
- Text* neuPfad = new Text(pfad->getText());
- neuPfad->append(dateiStatus->zName(i)->getText());
- if (DateiExistiert(altPfad->getText()))
- {
- bool b = 0;
- if (!DateiExistiert(neuPfad->getText()))
- DateiPfadErstellen(neuPfad->getText());
- if (DateiExistiert(neuPfad->getText()))
- {
- if (DateiRemove(neuPfad->getText()))
- {
- if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
- b = 1;
- }
- else
- b = 1;
- }
- else
- {
- if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
- b = 1;
- }
- if (b)
- {
- unable->schreibe("\2", 1);
- unable->schreibe(neuPfad->getText(), neuPfad->getLength());
- unable->schreibe("=>", 2);
- unable->schreibe(altPfad->getText(), altPfad->getLength());
- unable->schreibe("\n", 1);
- fertig = 0;
- }
- }
- altPfad->release();
- neuPfad->release();
- if (!lokaleDateien->wertExistiert(dateiStatus->zName(i)->getText()))
- lokaleDateien->addWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
- else
- lokaleDateien->setWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
- }
- unable->close();
- if (fertig)
- unable->remove();
- unable->release();
- }
- else
- { // Es werden Spiele und Karten geupdatet
- for (int i = 0; i < dateiStatus->getWertAnzahl(); i++)
- {
- Text* altPfad = new Text(pfad->getText());
- altPfad->append("data/update/download/");
- altPfad->append(dateiStatus->zName(i)->getText());
- Text* neuPfad = new Text(pfad->getText());
- neuPfad->append(dateiStatus->zName(i)->getText());
- if (DateiExistiert(altPfad->getText()))
- {
- bool b = 0;
- if (!DateiExistiert(neuPfad->getText()))
- DateiPfadErstellen(neuPfad->getText());
- if (DateiExistiert(neuPfad->getText()))
- {
- if (DateiRemove(neuPfad->getText()))
- {
- if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
- b = 1;
- }
- else
- b = 1;
- }
- else
- {
- if (!DateiUmbenennen(altPfad->getText(), neuPfad->getText()))
- b = 1;
- }
- if (b)
- { // error
- dgL->release();
- pfad->release();
- lokaleDateien->speichern();
- lokaleDateien->release();
- dateiListe->release();
- dateiStatus->release();
- fehler->setText(client->getLetzterFehler());
- client->trenne(0);
- return 1;
- }
- }
- altPfad->release();
- neuPfad->release();
- if (!lokaleDateien->wertExistiert(dateiStatus->zName(i)->getText()))
- lokaleDateien->addWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
- else
- lokaleDateien->setWert(dateiStatus->zName(i)->getText(), dateiListe->zWert(dateiStatus->zName(i)->getText())->getText());
- }
- }
- lokaleDateien->speichern();
- lokaleDateien->release();
- dateiListe->release();
- dateiStatus->release();
- Text* jpPf = new Text(pfad->getText());
- jpPf->append("data/update/jetzt_position.patch");
- DateiRemove(jpPf);
- Text* dvPf = new Text(pfad->getText());
- dvPf->append("data/update/datei_versionen.ini");
- DateiRemove(dvPf);
- dsPf = new Text(pfad->getText());
- dsPf->append("data/update/datei_status.ini");
- DateiRemove(dsPf);
- if (clientGruppe)
- {
- Text* ulPf = new Text(pfad->getText());
- ulPf->append("data/update/unable/list.patch");
- if (DateiExistiert(ulPf))
- { // es gibt Dateien, die der Patcher (wegen momentaner Benutzung) nicht pätchen konnte
- dgL->release();
- pfad->release();
- fehler->setText("");
- client->trenne(0);
- return 3;
- }
- }
- pfad->release();
- KSGTDatei* lDgL = new KSGTDatei("data/dg.ksgt");
- lDgL->laden();
- bool gefunden = 0;
- for (int i = 0; i < lDgL->getZeilenAnzahl(); i++)
- {
- if (zParams->dateiGruppe == TextZuInt(lDgL->zFeld(i, 0)->getText(), 10))
- {
- for (int j = 0; j < dgL->getZeilenAnzahl(); j++)
- {
- if (zParams->dateiGruppe == TextZuInt(dgL->zFeld(j, 0)->getText(), 10))
- {
- lDgL->setFeld(i, 2, dgL->zFeld(j, 2)->getText());
- break;
- }
- }
- gefunden = 1;
- break;
- }
- }
- if (!gefunden)
- {
- unsigned int rfPos = 0;
- for (int i = 0; i < lDgL->getZeilenAnzahl(); i++)
- {
- if (rfPos <= TextZuInt(lDgL->zFeld(i, 3)->getText(), 10))
- rfPos = TextZuInt(lDgL->zFeld(i, 3)->getText(), 10) + 1;
- }
- rfPos++;
- for (int i = 0; i < dgL->getZeilenAnzahl(); i++)
- {
- if (zParams->dateiGruppe == TextZuInt(dgL->zFeld(i, 0)->getText(), 10))
- {
- RCArray< Text >* zeile = new RCArray< Text >();
- zeile->set(new Text(dgL->zFeld(i, 0)->getText()), 0);
- zeile->set(new Text(dgL->zFeld(i, 1)->getText()), 1);
- zeile->set(new Text(dgL->zFeld(i, 2)->getText()), 2);
- Text* rfPosT = new Text();
- rfPosT->append(rfPos);
- zeile->set(rfPosT, 3);
- lDgL->addZeile(4, zeile);
- zeile->release();
- break;
- }
- }
- }
- dgL->release();
- lDgL->speichern();
- lDgL->release();
- if ((*zParams->abbruch))
- {
- fehler->setText("");
- client->trenne(0);
- return 2;
- }
- client->trenne(0);
- fehler->setText("");
- return 0;
- }
- // constant
- const char* Updater::getError() const
- {
- return fehler->getText();
- }
- int Updater::getDownload() const
- {
- return client->getDownload();
- }
|