aowow/includes/setup/files/binaryfile.class.php
Sarjuuk c85675e181 Setup/DBCReader
* port extended client file handling from other branch
 * class DBC -> DBCReader now initializes a DBCFile
   which itself is a BinaryFile
 * update DBCReader to use the new DB wrappers multi-insert feature
2026-02-26 16:26:03 +01:00

202 lines
4.2 KiB
PHP

<?php
namespace Aowow;
if (!defined('AOWOW_REVISION'))
die('illegal access');
class BinaryFile
{
private /*res*/ $handle = null;
private string $data = '';
private int $pos = 0;
protected int $filesize = 0;
public string $error = '';
public function __construct(string $file, private bool $inRAM = true)
{
if (!file_exists($file))
{
$this->error = 'file '.$file.' not found';
return;
}
if (!$this->handle = fopen($file, 'rb'))
{
$this->error = 'failed to open file '.$file;
return;
}
$this->filesize = filesize($file);
if ($inRAM)
$this->data = file_get_contents($file);
}
public function __destruct()
{
$this->close();
}
/**********************/
/* direct file access */
/**********************/
public function read(int $bytes) : ?string
{
if ($this->error || !is_resource($this->handle) || $bytes < 0)
return null;
$start = $this->pos;
$this->pos += $bytes;
if ($this->inRAM)
return substr($this->data, $start, $bytes);
else
return fread($this->handle, $bytes);
}
public function readOffset(int $bytes, int $offset, bool $jumpBack = true) : ?string
{
if ($this->error || !is_resource($this->handle))
return null;
if ($jumpBack)
$curPos = $this->inRAM ? $this->pos : ftell($this->handle);
$this->seek($offset);
$str = $this->read($bytes);
if ($jumpBack)
$this->seek($curPos);
return $str;
}
public function seek(int $pos) : int
{
if (!is_resource($this->handle))
return 0;
if ($pos < 0)
$pos = 0;
if ($pos > $this->filesize)
$pos = $this->filesize;
$this->pos = $pos;
if (!$this->inRAM)
fseek($this->handle, $pos, SEEK_SET);
return $pos;
}
public function ffwd(int $bytes) : int
{
if (!is_resource($this->handle))
return 0;
$curPos = $this->inRAM ? $this->pos : ftell($this->handle);
if ($curPos + $bytes < 0)
$bytes -= $curPos;
if ($curPos + $bytes > $this->filesize)
$bytes -= $this->filesize;
$this->pos += $bytes;
if ($this->inRAM)
return $this->pos;
fseek($this->handle, $bytes, SEEK_CUR);
return ftell($this->handle);
}
public function close() : void
{
if (is_resource($this->handle))
fclose($this->handle);
}
public function tell() : int
{
if (!is_resource($this->handle))
return 0;
return $this->inRAM ? $this->pos : ftell($this->handle);
}
/******************/
/* read Primitive */
/******************/
public function readInt8() : ?Int8
{
if (!is_resource($this->handle))
return null;
return new Int8($this);
}
public function readInt16() : ?Int16
{
if (!is_resource($this->handle))
return null;
return new Int16($this);
}
public function readInt32() : ?Int32
{
if (!is_resource($this->handle))
return null;
return new Int32($this);
}
public function readUInt8() : ?UInt8
{
if (!is_resource($this->handle))
return null;
return new UInt8($this);
}
public function readUInt16() : ?UInt16
{
if (!is_resource($this->handle))
return null;
return new UInt16($this);
}
public function readUInt32() : ?UInt32
{
if (!is_resource($this->handle))
return null;
return new UInt32($this);
}
public function readFloat() : ?Double
{
if (!is_resource($this->handle))
return null;
return new Double($this);
}
public function readChar() : ?Char
{
if (!is_resource($this->handle))
return null;
return new Char($this);
}
public function readBool() : ?Boolean
{
if (!is_resource($this->handle))
return null;
return new Boolean($this);
}
}
?>