libpairtwo/src/Sws.php

739 lines
26 KiB
PHP
Raw Normal View History

2019-01-10 20:05:23 +01:00
<?php
/*
* The MIT License
*
* Copyright 2019 Jeroen De Meerleer <schaak@jeroened.be>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace JeroenED\Libpairtwo;
2019-02-01 15:51:35 +01:00
use JeroenED\Libpairtwo\Enums\Title;
2019-03-04 11:51:06 +01:00
use JeroenED\Libpairtwo\Enums\Gender;
2019-02-11 16:43:36 +01:00
use JeroenED\Libpairtwo\Enums\Color;
use JeroenED\Libpairtwo\Enums\Result;
2019-02-01 15:53:39 +01:00
use JeroenED\Libpairtwo\Models\Sws as SwsModel;
use JeroenED\Libpairtwo\Enums\TournamentSystem;
2019-02-11 17:27:26 +01:00
use DateTime;
2019-01-16 18:03:07 +01:00
2019-01-10 20:05:23 +01:00
/**
* This class reads a SWS file
*
* @author Jeroen De Meerleer
*/
2019-02-01 15:53:39 +01:00
class Sws extends SwsModel
2019-01-18 14:17:43 +01:00
{
2019-01-18 18:11:53 +01:00
private const PT_DAYFACTOR = 32;
private const PT_MONTHFACTOR = 16;
private const PT_YEARFACTOR = 512;
private const PT_PASTOFFSET = 117;
2019-01-18 14:17:43 +01:00
/**
2019-03-20 17:33:09 +01:00
* Reads out $swsfile and returns a Sws class object
2019-02-11 17:27:26 +01:00
*
2019-01-18 14:17:43 +01:00
* @param string $swsfile
2019-03-20 17:33:09 +01:00
* @return Sws
2019-01-18 14:17:43 +01:00
*/
2019-01-10 20:05:23 +01:00
public static function ReadSws(string $swsfile)
{
$swshandle = fopen($swsfile, 'rb');
2019-01-18 14:17:43 +01:00
$swscontents = fread($swshandle, filesize($swsfile));
fclose($swshandle);
2019-01-16 18:03:07 +01:00
2019-03-20 17:33:09 +01:00
$sws = new Sws();
2019-01-18 14:17:43 +01:00
$offset = 0;
$length = 4;
$sws->setRelease(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
2019-01-16 18:03:07 +01:00
$sws->setTournament(new Tournament());
2019-01-18 14:17:43 +01:00
// UserCountry
$length = 4;
$sws->setBinaryData("UserCountry", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// SavedOffset
$length = 4;
$sws->setBinaryData("SavedOffset", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// NewPlayer
$length = 4;
$sws->setBinaryData("NewPlayer", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// AmericanHandicap
$length = 4;
$sws->setBinaryData("AmericanHandicap", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// LowOrder
$length = 4;
$sws->setBinaryData("LowOrder", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// PairingMethod
$length = 4;
$sws->setBinaryData("PairingMethod", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// AmericanPresence
$length = 4;
$sws->setBinaryData("AmericanPresence", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// CheckSameClub
$length = 4;
$sws->setBinaryData("CheckSameClub", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// NoColorCheck
$length = 4;
$sws->setBinaryData("NoColorCheck", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// SeparateCategories
$length = 4;
$sws->setBinaryData("SeparateCategories", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// EloUsed
$length = 4;
$sws->setBinaryData("EloUsed", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// AlternateColors
$length = 4;
$sws->setBinaryData("AlternateColors", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// MaxMeetings
$length = 4;
$sws->setBinaryData("MaxMeetings", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// MaxDistance
$length = 4;
$sws->setBinaryData("MaxDistance", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// MinimizeKeizer
$length = 4;
$sws->setBinaryData("MinimizeKeizer", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// MinRoundsMeetings
$length = 4;
$sws->setBinaryData("MinRoundsMeetings", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// MaxRoundsAbsent
$length = 4;
$sws->setBinaryData("MaxRoundsAbsent", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// SpecialPoints
$length = 4 * 6;
$sws->setBinaryData("SpecialPoints", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// NewNamePos
$length = 4;
$sws->setBinaryData("NewNamePos", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// CurrentRound
$length = 4;
$sws->setBinaryData("CurrentRound", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// CreatedRounds
$length = 4;
$sws->setBinaryData("CreatedRounds", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// CreatedPlayers
$length = 4;
$sws->setBinaryData("CreatedPlayers", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// MaxSelection
$length = 4;
$sws->setBinaryData("MaxSelection", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// NumberOfRounds
$length = 4;
$sws->setBinaryData("NumberOfRounds", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// NumberOfPairings
$length = 4;
$sws->setBinaryData("NumberOfPairings", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// CreatedPairings
$length = 4;
$sws->setBinaryData("CreatedPairings", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// PairingElems
$length = 4;
$sws->setBinaryData("PairingElems", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// RandomSeed
$length = 4;
$sws->setBinaryData("RandomSeed", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// TieOrder
$length = 4 * 5;
$sws->setBinaryData("TieOrder", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// Categorie
$length = 4 * 10;
$sws->setBinaryData("Categorie", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// ExtraPoints
$length = 4 * 20;
$sws->setBinaryData("ExtraPoints", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// SelectP
$length = 4 * 20;
$sws->setBinaryData("SelectP", self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// Players
2019-02-01 15:55:34 +01:00
for ($i = 0; $i < $sws->getBinaryData("NewPlayer"); $i++) {
$player = new Player();
$length = 4;
$player->SetRank(self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 4;
$sws->setBinaryData("Players($i)_NamePos", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 4;
$player->SetFideId(self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 4;
$player->SetExtraPts(self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 4;
$player->SetKbsbElo(self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 4;
$player->SetDateOfBirth(self::ReadData('Date', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 4;
$player->setKbsbID(self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 4;
2019-02-06 20:47:46 +01:00
$player->setPoints(self::ReadData('Int', substr($swscontents, $offset, $length)) / 2);
2019-02-01 15:55:34 +01:00
$offset += $length;
$length = 4;
$player->setClubNr(self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 4;
2019-02-06 20:47:46 +01:00
$player->setScoreBucholtz(self::ReadData('Int', substr($swscontents, $offset, $length)) / 2);
2019-02-01 15:55:34 +01:00
$offset += $length;
$length = 4;
2019-02-06 20:47:46 +01:00
$player->setScoreAmerican(self::ReadData('Int', substr($swscontents, $offset, $length)) / 2);
2019-02-01 15:55:34 +01:00
$offset += $length;
$length = 4;
$sws->setBinaryData("Players($i)_HelpValue", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 4;
$player->setFideElo(self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
$sws->setBinaryData("Players($i)_NameLength", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 3;
$player->setNation(self::ReadData('String', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
$player->setCategory(self::ReadData('String', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
switch (self::ReadData('Int', substr($swscontents, $offset, $length))) {
case 1:
$title = Title::ELO;
break;
case 2:
$title = Title::NM;
break;
case 3:
$title = Title::WCM;
break;
case 4:
$title = Title::WFM;
break;
case 5:
$title = Title::CM;
break;
case 6:
$title = Title::WIM;
break;
case 7:
$title = Title::FM;
break;
case 8:
$title = Title::WGM;
break;
case 9:
$title = Title::HM;
break;
case 10:
$title = Title::IM;
break;
case 11:
$title = Title::HG;
break;
case 12:
$title = Title::GM;
break;
case 0:
default:
$title = Title::NONE;
break;
}
$player->setTitle(new Title($title));
2019-02-01 15:55:34 +01:00
$offset += $length;
$length = 1;
2019-03-04 11:51:06 +01:00
switch (self::ReadData('Int', substr($swscontents, $offset, $length))) {
case 1:
2019-03-19 16:40:18 +01:00
$gender = Gender::Male;
2019-03-04 11:51:06 +01:00
break;
case 2:
2019-03-19 16:40:18 +01:00
$gender = Gender::Female;
2019-03-04 11:51:06 +01:00
break;
default:
2019-03-19 16:40:18 +01:00
$gender = Gender::Neutral;
2019-03-04 11:51:06 +01:00
break;
}
$player->setGender(new Gender($gender));
2019-02-01 15:55:34 +01:00
$offset += $length;
$length = 1;
$player->setNumberOfTies(self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
2019-02-11 17:27:26 +01:00
$player->setAbsent(self::ReadData('Bool', substr($swscontents, $offset, $length)));
2019-02-01 15:55:34 +01:00
$offset += $length;
$length = 1;
$sws->setBinaryData("Players($i)_ColorDiff", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
$sws->setBinaryData("Players($i)_ColorPref", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
$sws->setBinaryData("Players($i)_Paired", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
$sws->setBinaryData("Players($i)_Float", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
$sws->setBinaryData("Players($i)_FloatPrev", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
$sws->setBinaryData("Players($i)_FloatBefore", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$length = 1;
$sws->setBinaryData("Players($i)_TieMatch", self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
$sws->getTournament()->addPlayer($player);
}
2019-01-18 14:17:43 +01:00
// PlayerNames
2019-02-01 15:55:34 +01:00
$length = (Integer)$sws->getBinaryData("NewNamePos") + 0;
$sws->setBinaryData("PlayerNames", substr($swscontents, $offset, $length));
2019-01-18 14:17:43 +01:00
$offset += $length;
2019-02-01 17:02:33 +01:00
for ($i = 0; $i < $sws->getBinaryData("NewPlayer"); $i++) {
$namelength = $sws->getBinaryData("Players($i)_NameLength");
$nameoffset = $sws->getBinaryData("Players($i)_NamePos");
$player = $sws->getTournament()->getPlayerById($i);
$player->setName(self::ReadData("String", substr($sws->getBinaryData("PlayerNames"), $nameoffset, $namelength)));
$sws->getTournament()->updatePlayer($i, $player);
}
2019-01-18 14:17:43 +01:00
// TournamentName
$length = 80;
$sws->getTournament()->setName(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// TournamentOrganiser
$length = 50;
$sws->getTournament()->setOrganiser(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// TournamentTempo
$length = 50;
$sws->getTournament()->setTempo(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// TournamentCountry
$length = 32;
$sws->getTournament()->setOrganiserCountry(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
// Arbiters
$length = 128;
$sws->getTournament()->setArbiter(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-18 14:17:43 +01:00
$offset += $length;
2019-01-18 18:11:53 +01:00
// Rounds
$length = 4;
$sws->getTournament()->setNoOfRounds(self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 18:11:53 +01:00
$offset += $length;
// Participants
$length = 4;
$sws->getTournament()->setParticipants(self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 18:11:53 +01:00
$offset += $length;
// Fidehomol
$length = 4;
$sws->getTournament()->setFideHomol(self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-18 18:11:53 +01:00
$offset += $length;
// StartDate
$length = 4;
2019-02-01 15:55:13 +01:00
$sws->getTournament()->setStartDate(self::ReadData('Date', substr($swscontents, $offset, $length)));
2019-01-18 18:11:53 +01:00
$offset += $length;
// EndDate
$length = 4;
2019-02-01 15:55:13 +01:00
$sws->getTournament()->setEndDate(self::ReadData('Date', substr($swscontents, $offset, $length)));
2019-01-18 18:11:53 +01:00
$offset += $length;
2019-01-19 14:14:01 +01:00
// Place
$length = 36;
$sws->getTournament()->setOrganiserPlace(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-19 14:14:01 +01:00
$offset += $length;
// First period
$length = 32;
$sws->getTournament()->setFirstPeriod(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-19 14:14:01 +01:00
$offset += $length;
// Second period
$length = 32;
$sws->getTournament()->setSecondPeriod(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-19 14:14:01 +01:00
$offset += $length;
// Unrated Elo
$length = 4;
$sws->getTournament()->setNonRatedElo(self::ReadData('Int', substr($swscontents, $offset, $length)));
2019-01-19 14:14:01 +01:00
$offset += $length;
// Type
$length = 4;
2019-03-20 17:33:09 +01:00
switch (self::ReadData('Int', substr($swscontents, $offset, $length))) {
case 2:
$system = TournamentSystem::Closed;
break;
case 4:
$system = TournamentSystem::American;
break;
case 6:
$system = TournamentSystem::Imperial;
2019-03-20 17:33:09 +01:00
break;
case 0:
default:
$system = TournamentSystem::Swiss;
break;
}
$sws->getTournament()->setSystem(new TournamentSystem($system));
2019-01-19 14:14:01 +01:00
$offset += $length;
// Federation
$length = 12;
$sws->getTournament()->setFederation(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-19 14:14:01 +01:00
$offset += $length;
// Soustype
/*
* 32 Bits:
* 1 bit = Libre?
* 6 bits = First round sent to FIDE
* 6 bits = First round sent to FRBE-KBSB
* 6 bits = Last round sent to FIDE
* 6 bits = Last round sent to FRBE-KBSB
* 6 bits = Number of the First board
* 1 bit = Double round robin
*/
$length = 4;
$sws->setBinaryData('SousType', self::ReadData('Hex', substr($swscontents, $offset, $length)));
2019-01-19 14:14:01 +01:00
$offset += $length;
// Organising club no
$length = 4;
$sws->getTournament()->setOrganiserClubNo(self::ReadData('String', substr($swscontents, $offset, $length), 0));
2019-01-19 14:14:01 +01:00
$offset += $length;
// Organising club
2019-02-12 18:04:12 +01:00
$length = 8;
$sws->getTournament()->setOrganiserClub(self::ReadData('String', substr($swscontents, $offset, $length)));
2019-01-19 14:14:01 +01:00
$offset += $length;
2019-02-11 16:42:20 +01:00
// Tournament year
$length = 4;
$sws->getTournament()->setYear(self::ReadData('Int', substr($swscontents, $offset, $length)));
$offset += $length;
// Round dates
2019-02-12 18:04:12 +01:00
for ($i = 0; $i < $sws->getTournament()->getNoOfRounds(); $i++) {
2019-02-11 16:42:20 +01:00
$length = 4;
2019-02-12 18:05:19 +01:00
$round = new Round();
$round->setRoundNo($i);
$round->setDate(self::ReadData('Date', substr($swscontents, $offset, $length)));
$sws->getTournament()->addRound($round);
2019-02-11 16:42:20 +01:00
$offset += $length;
}
if ($sws->getBinaryData("CurrentRound") > 0) {
2019-02-11 16:43:36 +01:00
for ($i = 0; $i < $sws->getBinaryData("NewPlayer"); $i++) {
for ($x = 0; $x < $sws->getBinaryData("CreatedRounds"); $x++) {
$pairing = new Pairing();
2019-02-11 16:43:36 +01:00
$pairing->setPlayer($sws->getTournament()->getPlayerById($i));
2019-02-11 16:43:36 +01:00
$length = 4;
$opponent = self::ReadData('Int', substr($swscontents, $offset, $length));
if ($opponent != 4294967295) {
$pairing->setOpponent($sws->getTournament()->getPlayerById($opponent));
}
$offset += $length;
2019-02-11 16:43:36 +01:00
$length = 1;
switch (self::ReadData('Int', substr($swscontents, $offset, $length))) {
case 255:
case 253:
2019-03-19 16:41:31 +01:00
$color = Color::black;
break;
case 1:
case 3:
2019-03-19 16:41:31 +01:00
$color = Color::white;
break;
case 0:
default:
2019-03-19 16:41:31 +01:00
$color = Color::none;
break;
}
$pairing->setColor(new Color($color));
2019-02-11 16:43:36 +01:00
$offset += $length;
$length = 1;
switch (self::ReadData('Int', substr($swscontents, $offset, $length))) {
case 1:
2019-03-19 16:47:19 +01:00
$result = Result::lost;
break;
case 2:
2019-03-19 16:47:19 +01:00
$result = Result::absent;
break;
case 3:
2019-03-19 16:47:19 +01:00
$result = Result::adjourned;
break;
case 4:
2019-03-19 16:47:19 +01:00
$result = Result::bye;
break;
case 6:
2019-03-19 16:47:19 +01:00
$result = Result::draw;
break;
case 8:
2019-03-19 16:47:19 +01:00
$result = Result::drawadjourned;
break;
case 11:
2019-03-19 16:47:19 +01:00
$result = Result::won;
break;
case 12:
2019-03-19 16:47:19 +01:00
$result = Result::wonforfait;
break;
case 13:
2019-03-19 16:47:19 +01:00
$result = Result::wonadjourned;
break;
2019-03-20 17:33:09 +01:00
case 14:
2019-03-19 16:47:19 +01:00
$result = Result::wonbye;
break;
2019-03-20 17:33:09 +01:00
case 0:
default:
$result = Result::none;
break;
}
$pairing->setResult(new Result($result));
2019-02-11 16:43:36 +01:00
$offset += $length;
2019-02-11 16:43:36 +01:00
$pairing->setRound($x);
$offset += 2;
if (!($result == Result::none && $opponent == 0)) {
$sws->getTournament()->addPairing($pairing);
}
2019-02-11 16:43:36 +01:00
}
}
}
2019-01-19 14:14:01 +01:00
$sws->getTournament()->pairingsToRounds();
2019-01-10 20:05:23 +01:00
return $sws;
}
2019-02-01 15:55:34 +01:00
/**
2019-03-20 17:33:09 +01:00
* Converts $data to $type and defaults to $default if given
*
* Possible types for $type are:
* * String (UTF-8 String representation of $data. Default: empty string '')
* * Hex (Capitalized Hex Value of $data. Default: 00)
* * Int (Unsigned Integer value of $data Default: 0)
* * Bool (Boolean representation of $data. Default: false)
* * Date (Date representation of $data. Default: 1902/01/01)
*
* @static
2019-02-11 17:27:26 +01:00
* @param string $type
* @param string $data
* @param mixed $default
2019-02-11 17:27:26 +01:00
* @return bool|DateTime|int|string
2019-02-01 15:55:34 +01:00
*/
private static function ReadData(string $type, string $data, $default = null)
2019-01-18 14:17:43 +01:00
{
switch ($type) {
case 'String':
2019-02-12 14:11:58 +01:00
$data = trim($data);
if ($data == '') {
return (is_null($default)) ? '' : $default;
}
return iconv('windows-1252', 'utf-8', $data);
break;
case 'Hex':
case 'Int':
2019-02-11 17:27:26 +01:00
case 'Bool':
2019-02-01 15:55:13 +01:00
case 'Date':
$hex = implode(unpack("H*", $data));
$hex = array_reverse(str_split($hex, 2));
foreach ($hex as $key => $item) {
if ($item == "00") {
$hex[$key] = "";
} else {
break;
}
}
$hex = implode($hex);
2019-02-11 16:43:36 +01:00
$hex = ($hex == "") ? "00" : $hex;
if ($type == 'Hex') {
if ($hex == '00') {
return (is_null($default)) ? '00' : $default;
}
return $hex;
} elseif ($type == 'Int') {
if ($hex == '00') {
return (is_null($default)) ? 0 : $default;
}
return hexdec($hex);
2019-02-01 15:55:13 +01:00
} elseif ($type == 'Date') {
if ($hex == '00') {
return (is_null($default)) ? self::UIntToTimestamp(0) : $default;
}
2019-02-01 15:55:13 +01:00
return self::UIntToTimestamp(hexdec($hex));
2019-02-11 17:27:26 +01:00
} elseif ($type == 'Bool') {
return ($hex == "01") ? true : false;
}
break;
default:
throw new \InvalidArgumentException("Datatype not known");
2019-01-18 22:28:03 +01:00
break;
}
2019-02-01 15:55:34 +01:00
return false;
2019-01-18 14:17:43 +01:00
}
2019-01-18 18:11:53 +01:00
2019-02-01 15:55:34 +01:00
/**
2019-03-20 17:33:09 +01:00
* Converts integer value to a date representation
*
* @static
2019-02-11 17:27:26 +01:00
* @param int $date
* @return bool|DateTime
2019-02-01 15:55:34 +01:00
*/
2019-02-11 17:27:26 +01:00
private static function UIntToTimestamp(int $date)
2019-01-18 18:11:53 +01:00
{
$curyear = date('Y');
$yearoffset = $curyear - self::PT_PASTOFFSET;
// Day
$day = $date % self::PT_DAYFACTOR;
if ($day < 1) {
$day = 1;
}
// Month
$month = ($date / self::PT_DAYFACTOR) % self::PT_MONTHFACTOR;
if ($month < 1) {
$month = 1;
}
// Year
$year = ($date / self::PT_YEARFACTOR) + $yearoffset;
$concat = $month . '/' . $day . '/' . intval($year);
$format = 'm/d/Y';
2019-02-11 17:27:26 +01:00
return DateTime::createFromFormat($format, $concat);
2019-01-18 18:11:53 +01:00
}
2019-01-10 20:05:23 +01:00
}