MeOS version 3.5.860

This commit is contained in:
Erik Melin 2018-04-21 21:59:00 +02:00
parent 5327deebbb
commit b53348f17f
26 changed files with 2629 additions and 204 deletions

View File

@ -987,20 +987,46 @@ void PunchMachine::process(gdioutput &gdi, oEvent *oe, AutoSyncType ast)
{
#ifndef MEOSDB
SICard sic(ConvertedTimeStatus::Hour24);
oe->generateTestCard(sic);
SportIdent &si = TabSI::getSI(gdi);
if (!sic.empty()) {
if (!radio) si.addCard(sic);
}
else gdi.addInfoBox("", L"Failed to generate card.", interval*2);
if (radio && !sic.empty()) {
pRunner r=oe->getRunnerByCardNo(sic.CardNumber, 0, false);
if (r && r->getCardNo()) {
sic.CardNumber=r->getCardNo();
sic.punchOnly=true;
sic.nPunch=1;
sic.Punch[0].Code=radio;
if (radio == 0) {
oe->generateTestCard(sic);
if (!sic.empty()) {
if (!radio) si.addCard(sic);
}
else gdi.addInfoBox("", L"Failed to generate card.", interval * 2);
}
else {
SICard sic(ConvertedTimeStatus::Hour24);
vector<pRunner> rr;
oe->getRunners(0, 0, rr);
vector<pRunner> cCand;
vector<pFreePunch> pp;
for (auto r : rr) {
if (r->getStatus() == StatusUnknown && r->startTimeAvailable()) {
auto pc = r->getCourse(false);
if (radio < 10 || pc->hasControlCode(radio)) {
pp.clear();
oe->getPunchesForRunner(r->getId(), pp);
bool hit = false;
for (auto p : pp) {
if (p->getTypeCode() == radio)
hit = true;
}
if (!hit)
cCand.push_back(r);
}
}
}
if (cCand.size() > 0) {
int ix = rand() % cCand.size();
pRunner r = cCand[ix];
sic.convertedTime = ConvertedTimeStatus::Done;
sic.CardNumber = r->getCardNo();
sic.punchOnly = true;
sic.nPunch = 1;
sic.Punch[0].Code = radio;
sic.Punch[0].Time = 600 + rand() % 1200 + r->getStartTime();
si.addCard(sic);
}
}

View File

@ -432,7 +432,7 @@ int TabClass::multiCB(gdioutput &gdi, int type, void *data)
wstring st=gdi.getText("StartTime");
int nst = oe->convertAbsoluteTime(st);
if (warnDrawStartTime(gdi, nst)) {
if (nst >= 0 && warnDrawStartTime(gdi, nst, true)) {
nst = 3600;
st = oe->getAbsTime(nst);
}
@ -876,9 +876,11 @@ int TabClass::classCB(gdioutput &gdi, int type, void *data)
}
else
specs[ci.classId].push_back(cds);
maxST = max(cds.firstStart + drawInfo.nFields * drawInfo.baseInterval * ci.interval, maxST);
}
if (warnDrawStartTime(gdi, maxST))
if (warnDrawStartTime(gdi, maxST, false))
return 0;
for (map<int, vector<ClassDrawSpecification> >::iterator it = specs.begin();
@ -1409,7 +1411,7 @@ int TabClass::classCB(gdioutput &gdi, int type, void *data)
else if (bi.id=="DoDrawBefore")
dtype = oEvent::remainingBefore;
else {
if (warnDrawStartTime(gdi, t))
if (warnDrawStartTime(gdi, t, false))
return 0;
}
//bool pairwise = false;
@ -4181,11 +4183,14 @@ void TabClass::setLockForkingState(gdioutput &gdi, bool poolState, bool lockStat
bool TabClass::warnDrawStartTime(gdioutput &gdi, const wstring &firstStart) {
int st = oe->getRelativeTime(firstStart);
return warnDrawStartTime(gdi, st);
return warnDrawStartTime(gdi, st, false);
}
bool TabClass::warnDrawStartTime(gdioutput &gdi, int time) {
if (!hasWarnedStartTime && time > 3600 * 8 && !oe->useLongTimes()) {
bool TabClass::warnDrawStartTime(gdioutput &gdi, int time, bool absTime) {
if (absTime)
time = oe->getRelativeTime(formatTimeHMS(time));
if (!hasWarnedStartTime && (time > 3600 * 11 && !oe->useLongTimes())) {
bool res = gdi.ask(L"warn:latestarttime#" + itow(time/3600));
if (res)
hasWarnedStartTime = true;

View File

@ -82,7 +82,7 @@ class TabClass :
void pursuitDialog(gdioutput &gdi);
bool warnDrawStartTime(gdioutput &gdi, int time);
bool warnDrawStartTime(gdioutput &gdi, int time, bool absTime);
bool warnDrawStartTime(gdioutput &gdi, const wstring &firstStart);
void static clearPage(gdioutput &gdi, bool autoRefresh);

View File

@ -1710,6 +1710,13 @@ int TabCompetition::competitionCB(gdioutput &gdi, int type, void *data)
else if (bi.id=="DoFreeImport") {
fi.addEntries(oe, entries);
entryText.clear();
// Update qualification/final
vector<pClass> cls;
oe->getClasses(cls, false);
for (pClass c : cls) {
c->updateFinalClasses(0, false);
}
loadPage(gdi);
}
else if (bi.id=="Startlist") {
@ -2377,7 +2384,8 @@ void TabCompetition::loadAboutPage(gdioutput &gdi) const
"\n\nDanish Translation by Michael Leth Jess and Chris Bagge"
"\n\nRussian Translation by Paul A. Kazakov and Albert Salihov"
"\n\nOriginal French Translation by Jerome Monclard"
"\n\nAdaption to French conditions and extended translation by Pierre Gaufillet");
"\n\nAdaption to French conditions and extended translation by Pierre Gaufillet"
"\n\nCzech Translation by Marek Kustka");
gdi.dropLine();
gdi.addString("", 0, "Det här programmet levereras utan någon som helst garanti. Programmet är ");
@ -2514,7 +2522,7 @@ bool TabCompetition::loadPage(gdioutput &gdi)
gdi.dropLine(1.2);
gdi.addCheckbox("LongTimes", "Aktivera stöd för tider över 24 timmar", CompetitionCB, oe->useLongTimes());
if (oe->isClient()) {
if (false && oe->isClient()) {
gdi.popX();
gdi.disableInput("ZeroTime");
gdi.disableInput("LongTimes");
@ -3502,6 +3510,12 @@ TabCompetition::FlowOperation TabCompetition::saveEntries(gdioutput &gdi, bool r
}
}
// Update qualification/final
vector<pClass> cls;
oe->getClasses(cls, false);
for (pClass c : cls) {
c->updateFinalClasses(0, false);
}
return FlowContinue;
}

View File

@ -1124,7 +1124,7 @@ wstring TabCourse::encodeCourse(const wstring &in, bool firstStart, bool lastFin
out.reserve(in.length() * 2);
wstring bf;
for (size_t i = 0; i < newC.size(); ++i) {
if (i == 0) {
if (i == 0 && (newC.size() > 1 || firstStart)) {
out += lang.tl("Start");
if (firstStart)
out += L"(" + itow(newC[i]) + L")";
@ -1141,6 +1141,9 @@ wstring TabCourse::encodeCourse(const wstring &in, bool firstStart, bool lastFin
out += dash;
if (i+1 == newC.size()) {
if (i == 0) {
out = lang.tl("Start") + dash;
}
if (lastFinish)
out += lang.tl("Mål") + L"(" + itow(newC[i]) + L")";
else

View File

@ -111,9 +111,6 @@ void TabSI::logCard(gdioutput &gdi, const SICard &card)
extern SportIdent *gSI;
extern pEvent gEvent;
void LoadRunnerPage(gdioutput &gdi);
int SportIdentCB(gdioutput *gdi, int type, void *data) {
TabSI &tsi = dynamic_cast<TabSI &>(*gdi->getTabs().get(TSITab));
@ -1580,17 +1577,6 @@ bool TabSI::loadPage(gdioutput &gdi) {
gdi.addInput("C" + itos(i+1), itow(c), 3, 0, L"#C" + itow(i+1));
}
/*
gdi.addInput("C1", "33", 5, 0, "#C1");
gdi.addInput("C2", "34", 5, 0, "#C2");
gdi.addInput("C3", "45", 5, 0, "#C3");
gdi.addInput("C4", "50", 5, 0, "#C4");
gdi.addInput("C5", "61", 5, 0, "#C5");
gdi.addInput("C6", "62", 5, 0, "#C6");
gdi.addInput("C7", "67", 5, 0, "#C7");
gdi.addInput("C8", "100", 5, 0, "#C8");
*/
gdi.dropLine();
gdi.addButton("Save", "Bricka", SportIdentCB);
@ -1666,7 +1652,7 @@ bool TabSI::loadPage(gdioutput &gdi) {
gdi.dropLine(2);
gdi.setRestorePoint("SIPageLoaded");
if (mode==ModeReadOut) {
if (mode == ModeReadOut) {
gdi.addButton("Import", "Importera från fil...", SportIdentCB);
gdi.setRestorePoint("Help");
@ -1677,7 +1663,7 @@ bool TabSI::loadPage(gdioutput &gdi) {
gdi.dropLine();
}
else if (mode==ModeAssignCards) {
else if (mode == ModeAssignCards) {
gdi.dropLine(1);
showAssignCard(gdi, true);
}
@ -3867,6 +3853,19 @@ void TabSI::handleAutoComplete(gdioutput &gdi, AutoCompleteInfo &info) {
directEntryGUI.updateFees(gdi, cls, getThisYear() - year);
}
}
if (r) {
if (gdi.hasField("Club") && r->dbe().clubNo) {
if (gdi.getText("Club").empty()) {
auto pclub = oe->getRunnerDatabase().getClub(r->dbe().clubNo);
if (pclub)
gdi.setText("Club", pclub->getName());
}
}
if (gdi.hasField("CardNo") && r->dbe().cardNo) {
if (gdi.getText("CardNo").empty())
gdi.setText("CardNo", r->dbe().cardNo);
}
}
}
}
gdi.clearAutoComplete("");

View File

@ -31,15 +31,16 @@ class csvparser;
struct AutoCompleteRecord;
class TabSI : public TabBase, AutoCompleteHandler {
public:
enum SIMode {
public:
enum SIMode {
ModeReadOut,
ModeAssignCards,
ModeCheckCards,
ModeEntry,
ModeCardData
};
void setMode(SIMode m) { mode = m; }
private:
/** Try to automatcally assign a class to runner (if none is given)
Return true if runner has a class on exist */

View File

@ -1 +0,0 @@
encoding = EASTEUROPE

View File

@ -1 +0,0 @@
encoding = HEBREW

2316
code/czech.lng Normal file

File diff suppressed because it is too large Load Diff

View File

@ -16,6 +16,39 @@
[Radera] = [Slet]
[Uppdaterad anmälan] = [Opdateret tilmelding]
[VARNING] ingen/okänd = [ADVARSEL] ingen/ukendt
ÅÅÅÅ-MM-DD = ÅÅÅÅ-MM-DD
Åldersfilter = Aldersfilter
Åldersgräns äldre = Aldersgrænse ældre
Åldersgräns ungdom = Aldersgrænse ungdom
Åldersgränser, reducerad anmälningsavgift = Aldersgrænser, reduceret løbsafgift
Ångra = Fortryd
Återansluten mot databasen, tävlingen synkroniserad = Gentilsluttet til databasen, løbet synkroniseret
Återbud = Slet tilmelding
Återbud[status] = Afbud
Återgå = Gå tilbage
Återskapa = Gendan
Återskapa tidigare sparade fönster- och speakerinställningar = Gendan vidues- og speakerindstillinger.
Återställ / uppdatera klasstillhörighet = Gendan / opdater klassetilhørsforhold
Återställ <Ej Start> till <Status Okänd> = Tilbagefør <Ej Startet> till <Status ukendt>
Återställ = Fortryd
Återställ löpare <Ej Start> med registrering till <Status Okänd> = Gendan løber med status <Ikke startet> til <Status ukendt>
Återställ säkerhetskopia = Gendan fra sikkerhedskopi
Återställ tabeldesignen och visa allt = Gendan tabeldesign og vis alt
övriga = øvrige
är först i mål med tiden X = er først i mål med tiden X
är först vid växeln med tiden X = er først ved skiftet med tiden X
är först vid X med tiden Y = er først ved X med tiden Y
är inte godkänd = er diskvalificeret
är nu på delad X plats med tiden Y = er nu på delt X plads med tiden Y
är nu på X plats med tiden Y = er nu på X plads med tiden Y
är X efter = er X efter
är X efter Y = er X efter Y
är X efter; har tagit in Y = er X efter; har indhentet Y
är X efter; har tappat Y = er X efter; har tabt Y
är X före Y = er X foran Y
återställd = gendannet
åtta = otte
åttonde = ottende
Ökande = Stigende
Öppen = Åben
Öppen klass = Åben klasse
@ -56,39 +89,6 @@
Ändra X = Ændr X
Ändrad = Ændret
Ändrade avgift för X deltagare = Ændret afgift for X deltager(e)
är först i mål med tiden X = er først i mål med tiden X
är först vid växeln med tiden X = er først ved skiftet med tiden X
är först vid X med tiden Y = er først ved X med tiden Y
är inte godkänd = er diskvalificeret
är nu på delad X plats med tiden Y = er nu på delt X plads med tiden Y
är nu på X plats med tiden Y = er nu på X plads med tiden Y
är X efter = er X efter
är X efter Y = er X efter Y
är X efter; har tagit in Y = er X efter; har indhentet Y
är X efter; har tappat Y = er X efter; har tabt Y
är X före Y = er X foran Y
återställd = gendannet
åtta = otte
åttonde = ottende
övriga = øvrige
ÅÅÅÅ-MM-DD = ÅÅÅÅ-MM-DD
Åldersfilter = Aldersfilter
Åldersgräns äldre = Aldersgrænse ældre
Åldersgräns ungdom = Aldersgrænse ungdom
Åldersgränser, reducerad anmälningsavgift = Aldersgrænser, reduceret løbsafgift
Ångra = Fortryd
Återansluten mot databasen, tävlingen synkroniserad = Gentilsluttet til databasen, løbet synkroniseret
Återbud = Slet tilmelding
Återbud[status] = Afbud
Återgå = Gå tilbage
Återskapa = Gendan
Återskapa tidigare sparade fönster- och speakerinställningar = Gendan vidues- og speakerindstillinger.
Återställ / uppdatera klasstillhörighet = Gendan / opdater klassetilhørsforhold
Återställ <Ej Start> till <Status Okänd> = Tilbagefør <Ej Startet> till <Status ukendt>
Återställ = Fortryd
Återställ löpare <Ej Start> med registrering till <Status Okänd> = Gendan løber med status <Ikke startet> til <Status ukendt>
Återställ säkerhetskopia = Gendan fra sikkerhedskopi
Återställ tabeldesignen och visa allt = Gendan tabeldesign og vis alt
Accepterade elektroniska fakturor = Godkendte elektroniske fakturaer
Adress = Adresse
Adress och kontakt = Adresse og kontakt
@ -527,11 +527,10 @@ Extra avstånd ovanför textblock = Ekstra plads over tekstblok
Extra stämplingar = Ekstra stemplinger
Extralöparstafett = Ekstraløberstafet
Extraplatser = Ekstra pladser
Färg = Farve
Födelseår = Fødselsår
Följande deltagare överfördes ej = Følgende deltagere blev ikke overført
Följande deltagare är anmälda till nästa etapp men inte denna = Følgende deltagere er tilmeldt næste etape, men ikke denne
Följande deltagare är nyanmälda = Følgende deltagere er nytilmeldte
Följande deltagare överfördes ej = Følgende deltagere blev ikke overført
Följande deltagare deltar ej = Følgende deltagere deltager ikke
Följande deltagare har bytt klass (inget totalresultat) = Følgende deltagere har skiftet klasse (intet samlet resultat)
Följande deltagare har bytt klass = Følgende deltagere har skiftet klasse
@ -567,6 +566,7 @@ Förväntad andel efteranmälda = Forventet andel eftertilmeldte
Förväntat antal besökare: X = Forventet antal deltagere: X
Förvarning på (SI-kod): alla stämplingar = Forvarsel (SI kode): alle stemplinger
Förvarningsröst = Forvarselsstemme
Färg = Farve
Failed to generate card = FEJL: Kunne ikke indlæse
Failed to open 'X' for reading = FEJL: Kunne ikke læse 'X'
Failed to read file = Kunne ikke læse fil
@ -680,6 +680,8 @@ Grund avg. = Grundafg.
Grundavgift = Grundafgift
Grundinställningar = Grundindstillinger
Gruppera = Grupper
Hög avgift = Forhøjet afgift
Höger = Højre
Hämta (efter)anmälningar från Eventor = Hent (efter)tilmeldinger fra Eventor
Hämta data från Eventor = Hent data fra Eventor
Hämta efteranmälningar = Hent eftertilmeldinger
@ -697,8 +699,6 @@ Hämtar löpardatabasen = Henter løberdatabasen
Hämtar tävling = Henter løb
Händelser - tidslinje = Begivenheder - tidslinje
Händelser = Begivenheder
Hög avgift = Forhøjet afgift
Höger = Højre
handskakning = handshaking
Hantera brickor = Håndter brikker
Hantera deltagare som bytt klass = Håndtering af deltagere der har skiftet klasse
@ -856,6 +856,7 @@ Informationsserver = Informationsserver
Inga = Ingen
Inga bommar registrerade =
Inga deltagare = Ingen deltagere
Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = Ingen klasser tillader tilmeldong på stævneplads.\n\nDu kan ændre dette på siden klasser.
Inga vakanser tillgängliga. Vakanser skapas vanligen vid lottning = Ingen vakante. Vakante pladser oprettes normalt ved lodtrækning
Ingen / okänd = Ingen / ukendt
Ingen = Ingen
@ -908,19 +909,19 @@ IOF Startlista, version 3.0 (xml) = IOF Startliste, version 3.0 (xml)
IP-adress eller namn på en MySQL-server = IP addresse eller navn på en MySQL server
Italic = Kursiv
ItalicMediumPlus = Kursiv, større
Ja = Ja
Jämna klasser (placering) = Udjævn klasser (placering)
Jämna klasser (ranking) = Udjævn klasser (ranking)
Jämna klasser (tid) = Udjævn klasser (tid)
Ja = Ja
Jag sköter lottning själv = Jeg foretager lodtrækning manuelt
Jaktstart = Jagtstart
Justera blockvis = Blokvis justering
Justera mot = Juster i forhold til
Justera visningsinställningar = Juster visningsindstilninger
Källa = Kilde(fra)
Källkatalog = Mappe at hente fra
Kön = Køn
Kör kontroll inför tävlingen = Foretag kontrol før løbet
Källa = Kilde(fra)
Källkatalog = Mappe at hente fra
Kalkylblad/csv = Regneark/csv
kartor = kort
klar = færdig
@ -986,8 +987,8 @@ Kontant = Kontant
Kontant betalning = Kontant betaling
Konto = Konto
Kontroll %s = Post %s
kontroll = post
Kontroll = Post
kontroll = post
Kontroll inför tävlingen = Kontrol før løbet
kontroll X (Y) = post X (Y)
Kontroll X = Post X
@ -1017,30 +1018,6 @@ Kval-Final-Schema = Kval-Finale-Skema
Kvar-i-skogen = Løbere i skoven
Kvinna = Kvinde
Kvinnor = Kvinder
Lägg till = Tilføj
Lägg till alla = Tilføj alle
Lägg till en ny rad i tabellen (X) = Tilføj række i tabellen (X)
Lägg till klasser = Tilføj klasser
Lägg till ny = Tilføj ny
Lägg till ny etapp = Tilføj ny etape
Lägg till rad = Tilføj række
Lägg till stämpling = Tilføj stempling
Lägger till klubbar = Tilføjer klubber
Lägger till löpare = Tilføjer løbere
Längd (m) = Længde (m)
Längd = Længde
Längsta svarstid: X ms = Længste svarstid: X ms
Längsta tid i sekunder att vänta med utskrift = Det længste, i sekunder, der ventes med udskrift
Länk till resultatlistan = Link til resultatlisten
Länk till startlistan = Link til startlisten
Läs brickor = Læs brikker
Läser klubbar = Læser klubber
Läser löpare = Læser løbere
Långt namn = Langt navn
Lås gafflingar = Lås gafflinger
Lås startlista = Lås startliste
Låt de bästa start först = Lad de bedste starte først
Låt klassen ha mer än en bana eller sträcka = Lad klassen have mere end en bane eller en tur
Löpande = Løbende
Löpande information om viktiga händelser i tävlingen = Løbende information om vigtige begivenheder i løbet
Löparbricka %d = Løberbrik %d
@ -1063,6 +1040,30 @@ Löpare: X, kontroll: Y, kl Z = Løber: X, post: Y, kl: Z
Löparen hittades inte = Løber ikke fundet
Löptid = Løbstid
Lösenord = Password
Lägg till = Tilføj
Lägg till alla = Tilføj alle
Lägg till en ny rad i tabellen (X) = Tilføj række i tabellen (X)
Lägg till klasser = Tilføj klasser
Lägg till ny = Tilføj ny
Lägg till ny etapp = Tilføj ny etape
Lägg till rad = Tilføj række
Lägg till stämpling = Tilføj stempling
Lägger till klubbar = Tilføjer klubber
Lägger till löpare = Tilføjer løbere
Längd (m) = Længde (m)
Längd = Længde
Längsta svarstid: X ms = Længste svarstid: X ms
Längsta tid i sekunder att vänta med utskrift = Det længste, i sekunder, der ventes med udskrift
Långt namn = Langt navn
Länk till resultatlistan = Link til resultatlisten
Länk till startlistan = Link til startlisten
Läs brickor = Læs brikker
Lås gafflingar = Lås gafflinger
Lås startlista = Lås startliste
Läser klubbar = Læser klubber
Läser löpare = Læser løbere
Låt de bästa start först = Lad de bedste starte først
Låt klassen ha mer än en bana eller sträcka = Lad klassen have mere end en bane eller en tur
Ladda upp öppnad tävling på server = Upload åbnet løb til server
Lag %d = Hold %d
Lag + sträcka = Hold + tur
@ -1138,7 +1139,6 @@ Lottar: X = Trækker lod: X
Lottning = Lodtrækning
Lyssna = Lyt
Lyssnar på X = Lytter på X
Män = Mænd
mål = mål
Mål = Mål
målet (X) = målet (X)
@ -1148,6 +1148,7 @@ Målstämpling saknas = Manglende målstempling
Måltid = Måltid
Måltid saknas = Måltid mangler
Måltid: X = Måltid: X
Män = Mænd
Man = Mand
Manual point reductions and adjustments = Manuel pointreduktion og justering
Manual time penalties and adjustments = Manuelle tidsstraf og justeringer
@ -1186,12 +1187,12 @@ MediumPlus = Noget større tekst
Medlöpare = Medløber
Mellantider visas för namngivna kontroller = Mellemtider vises for navngivne poster
MeOS = MeOS
MeOS Funktioner = MeOS Funktioner
MeOS Resultatkiosk = MeOS Resultatformidling
MeOS Features = MeOS Specialfunktioner
MeOS Funktioner = MeOS Funktioner
MeOS Informationsserver REST-API = MeOS Informationsserver REST-API
MeOS lokala datakatalog är = MeOS lokale datamappe er
MeOS Funktioner = MeOS Funktioner
MeOS Resultatkiosk = MeOS Resultatformidling
MeOS Three Days Race X = MeOS Tredages Løb X
MeOS Timing = MeOS Timing
Metod = Metode
@ -1371,6 +1372,7 @@ prefsAutoTie = Knyt automatisk Si brik til løber
prefsCardFee = Forvalgt Si brik leje
prefsclasslimit = Begräns antal viste resultater per klasse
prefsClient = Klientnavn i netværket
prefsCodePage = Tegnsæt for 8-bits text vid im- og export
prefsControlFrom = Senest brugte <fra> post
prefsControlTo = Senest brugte <til> post
prefsCurrencyFactor = Valutakurs
@ -1430,8 +1432,8 @@ Prel. bomtid = Forel. tidstab
Prel. placering = Forel. placering
Prepare start lists = Forbered startliste
Press Enter to continue = Tast <Enter> for at fortsætte
Print card data = Udskriv brikdata
Print Card Data = Udskriv brikdata
Print card data = Udskriv brikdata
Printing failed (X: Y) Z = Utskrivning fejlede (X: Y) Z
Prioritering = Prioritering
Prisutdelningslista = Prisuddelingsliste
@ -1496,8 +1498,8 @@ Reserverade = Reserveret
RestService = RestService
Result at a control = Resultat ved post
Result Calculation = Resultatberegning
Result Module X = Resultatmodul X
Result module identifier = Resultatmodul ID
Result Module X = Resultatmodul X
Result Modules = Resultatmoduler
Result on leg = Result for stræk
Result score calculation for runner = Resultatberegning for løber
@ -1628,18 +1630,18 @@ RunnerTotalTimeAfter = Løbers totaltid efter
RunnerTotalTimeStatus = Løbers totaltid / status
RunnerUMMasterPoint = Uppsala möte, mesterskabspoints
Running time for each team member = Løbstid for hvert holdmedlem
Säkerhetskopiera = Lav sikkerhedskopi
Säkerhetskopierar om = Laver sikkerhedskopi om
Säkerhetskopiering = Interval Backup
Sätt okända löpare utan registrering till <Ej Start> = Sæt ukendte løbere uden registrering til <Ikke startet>
Sätt som oparad = Sæt som uparret
Sätter reptid (X) och omstartstid (Y) för = Sætter sidste skiftetid (X) og omstarttid (Y) for
Sök (X) = Søg (X)
Sök = Søg
Sök deltagare = Søg deltagere
Sök och starta automatiskt = Søg og start automatisk
Sök på namn, bricka eller startnummer = Søg efter et navn, en brik eller et startnummer
Söker efter SI-enheter = Søger efter SI-enheder
Säkerhetskopiera = Lav sikkerhedskopi
Säkerhetskopierar om = Laver sikkerhedskopi om
Säkerhetskopiering = Interval Backup
Sätt okända löpare utan registrering till <Ej Start> = Sæt ukendte løbere uden registrering til <Ikke startet>
Sätt som oparad = Sæt som uparret
Sätter reptid (X) och omstartstid (Y) för = Sætter sidste skiftetid (X) og omstarttid (Y) for
Saknad starttid = Manglende starttid
saknas = mangler
Samlade poäng = Samlet antal point
@ -1783,6 +1785,10 @@ Speakerstöd = Speaker funktion
SportIdent = SPORTident
Språk = Sprog
SRR Dongle = SRR Dongle
Större = Større
Störst = Meget stor
Största gruppen med samma inledning har X platser = Største gruppe med samme indledning har X pladser
Största intervall i klass = Største interval i klasse
Stämpelkod = Stempelkode
Stämpelkod(er) = Stempelkode(r)
Stämpelkoder = Stempelkoder
@ -1800,10 +1806,6 @@ Stämplingstest = Stemplingstest
Stämplingstid = Stemplingstid
Stäng = Luk
Stäng tävlingen = Luk løbet
Större = Større
Störst = Meget stor
Största gruppen med samma inledning har X platser = Største gruppe med samme indledning har X pladser
Största intervall i klass = Største interval i klasse
Stad = By
Stafett - sammanställning = Stafet - sammenfatning
Stafett - sträcka = Stafet - tur
@ -1884,8 +1886,8 @@ Str. X = Tur X
Sträcka %d = Tur %d
Sträcka = Tur
Sträcka att lotta = Ture til lodtrækning
sträcka X = tur X
Sträcka X = Tur X
sträcka X = tur X
Sträckans banor = Strækkets baner
Sträcktider (WinSplits) = Stræktider (WinSplits)
Sträcktider / WinSplits = Stræktider / WinSplits
@ -1910,13 +1912,8 @@ Support time from control = Understøt tid fra post
Support time to control = Understøt tid til post
Symboler = Symboler
Synkronisera med Eventor = Synkroniser med Eventor
Ta bort / slå ihop = Fjern / slå sammen
Ta bort = Fjern
Ta bort eventuella avanmälda deltagare = Fjern evt. afmeldte deltagere
Ta bort listposten = Fjern listeposten
Ta bort markerad = Fjern valgte
Ta bort stämpling = Fjern stempling
Ta bort valda rader från tabellen (X) = Fjern valgte rækker fra tabellen (X)
Töm = Clear
Töm databasen = Ryd database
Tävling = Løb
Tävling från Eventor = Løb fra Eventor
Tävling med lag = Løb med hold
@ -1933,8 +1930,13 @@ Tävlingsnamn = Løbsnavn
Tävlingsrapport = Løbsrapport
Tävlingsregler = Løbsreglement
Tävlingsstatistik = Løbsstatistik
Töm = Clear
Töm databasen = Ryd database
Ta bort / slå ihop = Fjern / slå sammen
Ta bort = Fjern
Ta bort eventuella avanmälda deltagare = Fjern evt. afmeldte deltagere
Ta bort listposten = Fjern listeposten
Ta bort markerad = Fjern valgte
Ta bort stämpling = Fjern stempling
Ta bort valda rader från tabellen (X) = Fjern valgte rækker fra tabellen (X)
Tabell = Tabel
Tabelläge = Tabelindstilling
Tabellverktyg = Tabelværktøj

View File

@ -2315,3 +2315,9 @@ Ingen nummerlapp = No bib
Rogaining results for a team, where each team member collects points individually = Rogaining results for a team, where each team member collects points individually
prefsCodePage = Code table for 8 bit text on import/export.
Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = No class is marked to allow quick entry.\n\nOn the page Classes you can change this property.
Database is used and cannot be deleted = Database is used and cannot be deleted
Classes together = Classes together
Finish order = Finish order
First to finish = First to finish
Individual result by finish time = Individual result by finish time
Endast tidtagning = Only timing

View File

@ -2389,6 +2389,11 @@ LRESULT gdioutput::ProcessMsgWrp(UINT iMessage, LPARAM lParam, WPARAM wParam)
}
}
else if (iMessage==WM_LBUTTONDOWN) {
if (autoCompleteInfo) {
autoCompleteInfo.reset();
return 0;
}
list<InfoBox>::iterator it=IBox.begin();
POINT pt;
@ -6920,9 +6925,17 @@ AutoCompleteInfo &gdioutput::addAutoComplete(const string &key) {
POINT pt;
int height = scaleLength(200);
pt.x = rc.right;
pt.y = min(rc.top, rcMain.bottom-height);
//pt.y = min(rc.top, rcMain.bottom-height);
pt.y = rc.bottom;
if (pt.y + height > rcMain.bottom)
pt.y = rc.top - height;
ScreenToClient(hWndTarget, &pt);
// TODO Place window
if (pt.y < 0) { //Fallback
pt.x = rc.right;
pt.y = min(rc.top, rcMain.bottom - height);
ScreenToClient(hWndTarget, &pt);
}
if (autoCompleteInfo && autoCompleteInfo->matchKey(key)) {
return *autoCompleteInfo;

View File

@ -1,4 +1,4 @@
/************************************************************************
/************************************************************************
MeOS - Orienteering Software
Copyright (C) 2009-2018 Melin Software HB
@ -16,7 +16,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
Melin Software HB - software@melin.nu - www.melin.nu
Eksoppsvägen 16, SE-75646 UPPSALA, Sweden
Eksoppsvägen 16, SE-75646 UPPSALA, Sweden
************************************************************************/
@ -287,17 +287,18 @@ int APIENTRY WinMain(HINSTANCE hInstance,
lang.get().addLangResource(L"Svenska", L"103");
lang.get().addLangResource(L"Deutsch", L"105");
lang.get().addLangResource(L"Dansk", L"106");
lang.get().addLangResource(L"Français", L"110");
lang.get().addLangResource(L"Český", L"108");
lang.get().addLangResource(L"Français", L"110");
lang.get().addLangResource(L"Russian", L"107");
if (fileExist(L"extra.lng")) {
lang.get().addLangResource(L"Extraspråk", L"extra.lng");
lang.get().addLangResource(L"Extraspråk", L"extra.lng");
}
else {
wchar_t lpath[260];
getUserFile(lpath, L"extra.lng");
if (fileExist(lpath))
lang.get().addLangResource(L"Extraspråk", lpath);
lang.get().addLangResource(L"Extraspråk", lpath);
}
wstring defLang = gEvent->getPropertyString("Language", L"Svenska");
@ -1020,7 +1021,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
case WM_CREATE:
tabList->push_back(TabObject(gdi_main->getTabs().get(TCmpTab), "Tävling"));
tabList->push_back(TabObject(gdi_main->getTabs().get(TCmpTab), "Tävling"));
tabList->push_back(TabObject(gdi_main->getTabs().get(TRunnerTab), "Deltagare"));
tabList->push_back(TabObject(gdi_main->getTabs().get(TTeamTab), "Lag(flera)"));
tabList->push_back(TabObject(gdi_main->getTabs().get(TListTab), "Listor"));
@ -1174,7 +1175,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
}
case WM_USER+1:
MessageBox(hWnd, lang.tl(L"Kommunikationen med en SI-enhet avbröts.").c_str(), L"SportIdent", MB_OK);
MessageBox(hWnd, lang.tl(L"Kommunikationen med en SI-enhet avbröts.").c_str(), L"SportIdent", MB_OK);
break;
case WM_USER + 3:
@ -1209,7 +1210,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
case WM_CLOSE:
if (!gEvent || gEvent->empty() || gdi_main->ask(L"Vill du verkligen stänga MeOS?"))
if (!gEvent || gEvent->empty() || gdi_main->ask(L"Vill du verkligen stänga MeOS?"))
DestroyWindow(hWnd);
break;
@ -1227,20 +1228,20 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
gEvent->save();
}
catch (meosException &ex) {
MessageBox(hWnd, lang.tl(ex.wwhat()).c_str(), L"Fel när tävlingen skulle sparas", MB_OK);
MessageBox(hWnd, lang.tl(ex.wwhat()).c_str(), L"Fel när tävlingen skulle sparas", MB_OK);
}
catch(std::exception &ex) {
MessageBox(hWnd, lang.tl(ex.what()).c_str(), L"Fel när tävlingen skulle sparas", MB_OK);
MessageBox(hWnd, lang.tl(ex.what()).c_str(), L"Fel när tävlingen skulle sparas", MB_OK);
}
try {
gEvent->saveRunnerDatabase(L"database", true);
}
catch (meosException &ex) {
MessageBox(hWnd, lang.tl(ex.wwhat()).c_str(), L"Fel när löpardatabas skulle sparas", MB_OK);
MessageBox(hWnd, lang.tl(ex.wwhat()).c_str(), L"Fel när löpardatabas skulle sparas", MB_OK);
}
catch(std::exception &ex) {
MessageBox(hWnd, lang.tl(ex.what()).c_str(), L"Fel när löpardatabas skulle sparas", MB_OK);
MessageBox(hWnd, lang.tl(ex.what()).c_str(), L"Fel när löpardatabas skulle sparas", MB_OK);
}
if (gEvent)

View File

@ -37,6 +37,7 @@
#include "../progress.h"
#include "../metalist.h"
#include "../MeOSFeatures.h"
#include "../meosexception.h"
using namespace mysqlpp;
@ -3493,7 +3494,7 @@ bool MeosSQL::checkConnection(oEvent *oe)
monitorId=static_cast<int>(res.insert_id);
}
catch (const mysqlpp::Exception& er){
oe->connectedClients.push_back(er.what());
oe->connectedClients.push_back(L"Error: " + fromUTF(er.what()));
return false;
}
}
@ -3505,7 +3506,7 @@ bool MeosSQL::checkConnection(oEvent *oe)
query.execute();
}
catch (const mysqlpp::Exception& er){
oe->connectedClients.push_back(er.what());
oe->connectedClients.push_back(L"Error: " + fromUTF(er.what()));
return false;
}
}
@ -3521,7 +3522,7 @@ bool MeosSQL::checkConnection(oEvent *oe)
if (res) {
for (int i=0; i<res.num_rows(); i++) {
Row row=res.at(i);
oe->connectedClients.push_back(string(row["Client"]));
oe->connectedClients.push_back(fromUTF(string(row["Client"])));
if (int(row["Id"])==monitorId)
callback=true;
@ -3529,7 +3530,7 @@ bool MeosSQL::checkConnection(oEvent *oe)
}
}
catch (const mysqlpp::Exception& er){
oe->connectedClients.push_back(er.what());
oe->connectedClients.push_back(L"Error: " + fromUTF(er.what()));
return false;
}
return callback;
@ -3554,16 +3555,14 @@ void MeosSQL::setDefaultDB()
bool MeosSQL::dropDatabase(oEvent *oe)
{
// Check if other cients are connected.
// Check if other clients are connected.
if ( !checkConnection(oe) ) {
if (!oe->connectedClients.empty())
alert(oe->connectedClients[0]);
return false;
throw meosException("Database is used and cannot be deleted.");
}
if (oe->connectedClients.size()!=1) {
alert("Database is used and cannot be deleted");
throw meosException("Database is used and cannot be deleted.");
return false;
}

View File

@ -12,8 +12,7 @@ IDR_3002 300 DISCARDABLE "english.lng"
IDR_3003 300 DISCARDABLE "german.lng"
IDR_3004 300 DISCARDABLE "danish.lng"
IDR_3005 300 DISCARDABLE "russian.lng"
IDR_3006 300 DISCARDABLE "cp1250.lng"
IDR_3007 300 DISCARDABLE "cp1255.lng"
IDR_3006 300 DISCARDABLE "czech.lng"
IDR_3008 300 DISCARDABLE "french.lng"
/////////////////////////////////////////////////////////////////////////////

View File

@ -27,9 +27,9 @@
//V2: ABCDEFGHIHJKMN
//V31: a
//V33: abcde
//V35: abcde
//V35: abcdef
int getMeosBuild() {
string revision("$Rev: 669 $");
string revision("$Rev: 686 $");
return 174 + atoi(revision.substr(5, string::npos).c_str());
}
@ -41,12 +41,12 @@ int getMeosBuild() {
//V33: abcdefghij
//V34: abcdfge
wstring getMeosDate() {
wstring date(L"$Date: 2018-03-25 07:29:55 +0200 (sö, 25 mar 2018) $");
wstring date(L"$Date: 2018-04-17 21:45:35 +0200 (ti, 17 apr 2018) $");
return date.substr(7,10);
}
wstring getBuildType() {
return L"RC2"; // No parantheses (...)
return L""; // No parantheses (...)
}
wstring getMajorVersion() {
@ -188,4 +188,6 @@ void getSupporters(vector<wstring> &supp)
supp.push_back(L"Siguldas Takas, Latvia");
supp.push_back(L"Eric Teutsch, Ottawa Orienteering Club, Canada");
supp.push_back(L"Silkeborg OK, Denmark");
supp.push_back(L"Erik Ivarsson Sandberg");
supp.push_back(L"Stenungsunds OK");
}

View File

@ -4006,17 +4006,20 @@ void oClass::drawSeeded(ClassSeedMethod seed, int leg, int firstStart,
}
if (noClubNb) {
set<int> pushed_back;
for (size_t k = 1; k < startOrder.size(); k++) {
int idMe = startOrder[k]->getClubId();
if (idMe != 0 && idMe == startOrder[k-1]->getClubId()) {
// Make sure the runner with worst ranking is moved back. (Swedish SM rules)
if (startOrder[k-1]->getRanking() > startOrder[k]->getRanking())
bool skipRank = pushed_back.count(startOrder[k - 1]->getId()) != 0;
if (!skipRank && startOrder[k-1]->getRanking() > startOrder[k]->getRanking())
swap(startOrder[k-1], startOrder[k]);
pushed_back.insert(startOrder[k]->getId());
vector<pair<int, pRunner> > rqueue;
rqueue.push_back(make_pair(k, startOrder[k]));
for (size_t j = k + 1; j < startOrder.size(); j++) {
if (idMe != startOrder[j]->getClubId()) {
pushed_back.insert(startOrder[j]->getId());
swap(startOrder[j], startOrder[k]); // k-1 now has a non-club nb behind
rqueue.push_back(make_pair(j, pRunner(0)));
// Shift the queue

View File

@ -1377,6 +1377,14 @@ bool oCourse::hasControl(const oControl *ctrl) const {
return false;
}
bool oCourse::hasControlCode(int code) const {
for (int i = 0; i < nControls; i++) {
if (Controls[i]->hasNumber(code))
return true;
}
return false;
}
void oCourse::getClasses(vector<pClass> &usageClass) const {
vector<pClass> cls;
oe->getClasses(cls, false);

View File

@ -103,6 +103,7 @@ public:
wstring getRadioName(int courseControlId) const;
bool hasControl(const oControl *ctrl) const;
bool hasControlCode(int code) const;
/// Returns course specific id for specified control (taking duplicats of the control into account)
int getCourseControlId(int controlIx) const;

View File

@ -4825,7 +4825,7 @@ void oEvent::analyzeClassResultStatus() const
void oEvent::generateTestCard(SICard &sic) const
{
sic.clear(0);
sic.convertedTime == ConvertedTimeStatus::Hour24;
sic.convertedTime = ConvertedTimeStatus::Hour24;
if (Runners.empty())
return;

View File

@ -393,7 +393,7 @@ protected:
void storeChangeStatus(bool onlyChangable=true);
wstring clientName;
vector<string> connectedClients;
vector<wstring> connectedClients;
DWORD clientCheckSum() const; //Calculate a check sum for current clients
DWORD currentClientCS; //The current, stored check sum.

View File

@ -836,7 +836,7 @@ void oEvent::drawList(const vector<ClassDrawSpecification> &spec,
int minStartNo = Runners.size();
for(unsigned k=0;k<stimes.size(); k++) {
runners[k]->setStartTime(stimes[k], true, false);
runners[k]->setStartTime(stimes[k], true, false, false);
minStartNo = min(minStartNo, runners[k]->getStartNo());
}
@ -1113,12 +1113,14 @@ void oEvent::drawListClumped(int ClassID, int FirstStart, int Interval, int Vaca
k=0;
for (it=Runners.begin(); it != Runners.end(); ++it)
if (it->Class && it->Class->Id==ClassID){
it->setStartTime(stimes[k++], true, false);
it->StartNo=k;
for (it = Runners.begin(); it != Runners.end(); ++it) {
if (it->Class && it->Class->Id == ClassID) {
it->setStartTime(stimes[k++], true, false, false);
it->StartNo = k;
it->synchronize();
}
}
reCalculateLeaderTimes(ClassID);
delete[] stimes;
}
@ -1426,15 +1428,15 @@ void oEvent::drawPersuitList(int classId, int firstTime, int restartTime,
if ((times[k].first - delta) < maxTime && breakIndex == -1) {
if (!reverse)
r->setStartTime(firstTime + times[k].first - delta, true, false);
r->setStartTime(firstTime + times[k].first - delta, true, false, false);
else
r->setStartTime(firstTime - times[k].first + reverseDelta, true, false);
r->setStartTime(firstTime - times[k].first + reverseDelta, true, false, false);
}
else if (!reverse) {
if (breakIndex == -1)
breakIndex = k;
r->setStartTime(restartTime + ((k - breakIndex)/pairSize) * interval, true, false);
r->setStartTime(restartTime + ((k - breakIndex)/pairSize) * interval, true, false, false);
}
else {
if (breakIndex == -1) {
@ -1442,8 +1444,9 @@ void oEvent::drawPersuitList(int classId, int firstTime, int restartTime,
odd = times.size() % 2;
}
r->setStartTime(restartTime + ((breakIndex - k + odd)/pairSize) * interval, true, false);
r->setStartTime(restartTime + ((breakIndex - k + odd)/pairSize) * interval, true, false, false);
}
r->synchronize(true);
}
reCalculateLeaderTimes(classId);
}

View File

@ -468,38 +468,50 @@ pFreePunch oEvent::addFreePunch(int time, int type, int card, bool updateStartFi
fp->updateChanged();
fp->synchronize();
pRunner tr = fp->getTiedRunner();
// Update start/finish time
if (updateStartFinish && type == oPunch::PunchStart || type == oPunch::PunchFinish) {
pRunner tr = fp->getTiedRunner();
if (tr && tr->getStatus() == StatusUnknown && time > 0) {
tr->synchronize();
if (type == oPunch::PunchStart) {
if (tr->getClassRef(false) && !tr->getClassRef(true)->ignoreStartPunch())
tr->setStartTime(time, true, false);
}
else
tr->setFinishTime(time);
// Direct result
if (type == oPunch::PunchFinish && tr->getClassRef(false) && tr->getClassRef(true)->hasDirectResult()) {
if (tr->getCourse(false) == 0 && tr->getCard() == 0) {
tr->setStatus(StatusOK, true, false, true);
}
else if (tr->getCourse(false) != 0 && tr->getCard() == 0) {
pCard card = allocateCard(tr);
card->setupFromRadioPunches(*tr);
vector<int> mp;
card->synchronize();
tr->addPunches(card, mp);
}
if (tr != nullptr) {
// Update start/finish time
if (updateStartFinish) {
int startType = oPunch::PunchStart;
int finishType = oPunch::PunchFinish;
pCourse pCrs = tr->getCourse(false);
if (pCrs) {
startType = pCrs->getStartPunchType();
finishType = pCrs->getFinishPunchType();
}
tr->synchronize(true);
if (type == startType || type == finishType) {
if (tr->getStatus() == StatusUnknown && time > 0) {
tr->synchronize();
if (type == startType) {
if (tr->getClassRef(false) && !tr->getClassRef(true)->ignoreStartPunch())
tr->setStartTime(time, true, false);
}
else
tr->setFinishTime(time);
// Direct result
if (type == finishType && tr->getClassRef(false) && tr->getClassRef(true)->hasDirectResult()) {
if (tr->getCourse(false) == 0 && tr->getCard() == 0) {
tr->setStatus(StatusOK, true, false, true);
}
else if (tr->getCourse(false) != 0 && tr->getCard() == 0) {
pCard card = allocateCard(tr);
card->setupFromRadioPunches(*tr);
vector<int> mp;
card->synchronize();
tr->addPunches(card, mp);
}
}
tr->synchronize(true);
}
}
}
}
if (fp->getTiedRunner())
pushDirectChange();
}
return fp;
}

View File

@ -2317,3 +2317,9 @@ Ingen nummerlapp = Ingen nummerlapp
Rogaining results for a team, where each team member collects points individually = Rogainingresultat för ett lag där varje lagmedlem samlar poäng individuellt
prefsCodePage = Kodtabell för 8-bitars text vid import/export
Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = Inga klasser tillåter direktanmälan.\n\nPå sidan klasser kan du ändra denna egenskap.
Database is used and cannot be deleted = Databasen används och kan inte tas bort
Classes together = Klasser gemensamt
Finish order = Målgångsordning
First to finish = Först i mål
Individual result by finish time = Individuella resultat efter måltid
Endast tidtagning = Endast tidtagning

View File

@ -135,9 +135,12 @@ void TestMeOS::runProtected(bool protect) const {
oe_main->setProperty("FirstTime", 0);
oe_main->setProperty("TestPath", tp);
oe_main->getPropertyInt("UseEventor", 1);
TabSI *tsi = dynamic_cast<TabSI*>(gdi_main->getTabs().get(TabType::TSITab));
tsi->setMode(TabSI::ModeReadOut);
//string pmOrig = oe_main->getPropertyString("PayModes", "");
//oe_main->setProperty("PayModes", "");
OutputDebugString((L"Running test" + gdi_main->widen(test) + L"\n").c_str());
try {
status = RUNNING;
run();
@ -153,6 +156,7 @@ void TestMeOS::runProtected(bool protect) const {
gdi_main->isTestMode = false;
}
catch (const meosAssertionFailure & ex) {
OutputDebugString(L"Test FAILED (assert)\n");
status = FAILED;
oe_main->useDefaultProperties(false);
gdi_main->clearDialogAnswers(false);
@ -166,6 +170,8 @@ void TestMeOS::runProtected(bool protect) const {
}
catch (const std::exception &ex) {
status = FAILED;
OutputDebugString(L"Test FAILED (std)\n");
oe_main->useDefaultProperties(false);
gdi_main->clearDialogAnswers(false);
gdi_main->dbRegisterSubCommand(0, "");
@ -177,6 +183,8 @@ void TestMeOS::runProtected(bool protect) const {
throw;
}
catch (...) {
OutputDebugString(L"Test FAILED (...)\n");
status = FAILED;
oe_main->useDefaultProperties(false);
gdi_main->clearDialogAnswers(false);
@ -195,7 +203,7 @@ void TestMeOS::runProtected(bool protect) const {
for (size_t k = 0; k < tmpFiles.size(); k++)
removeTempFile(tmpFiles[k]);
tmpFiles.clear();
OutputDebugString(L"Test PASSED\n");
if (protect) {
cleanup();
}