<?php

define('FILE_NOT_FOUND', 'Soubor "%s" nenalezen.');

class FileStream
{
  private $Handle;
  private $FileName;

  function __construct()
  {
    $this->Handle = false;
  }

  function __destruct()
  {
    if ($this->Handle)
      fclose($this->Handle);
  }

  public function OpenFile($FileName)
  {
    $this->FileName = $FileName;
    $this->CloseFile();
    $this->Handle = fopen($FileName, 'rb');
    if (!$this->Handle) die(str_replace('%s', $FileName, FILE_NOT_FOUND));
  }

  public function CreateFile($FileName)
  {
    $this->FileName = $FileName;
    $this->CloseFile();
    $this->Handle = fopen($FileName, 'wb+');
    if (!$this->Handle) die(str_replace('%s', $FileName, FILE_NOT_FOUND));
  }

  public function CloseFile()
  {
    if ($this->Handle)
      fclose($this->Handle);
  }

  public function ReadBlock($Count)
  {
    return fread($this->Handle, $Count);
  }

  public function ReadByte()
  {
    return fread($this->Handle, 1);
  }

  public function ReadUint()
  {
    $val = unpack('V*', fread($this->Handle, 4));
    return $val[1];
  }

  public function ReadInt()
  {
    $val = unpack('I*', fread($this->Handle, 4));
    return $val[1];
  }

  public function ReadFloat()
  {
    $val = unpack('f*', fread($this->Handle, 4));
    return $val[1];
  }

  public function ReadChar()
  {
    return fread($this->Handle, 1);
  }

  public function ReadLine()
  {
    return fgets($this->Handle);
  }

  public function ReadTextLine()
  {
    return fgets($this->Handle);
  }

  public function WriteBlock($Value, $Count)
  {
    fwrite($this->Handle, $Value, $Count);
  }

  public function WriteByte($Value)
  {
    fwrite($this->Handle, pack('C*', $Value), 1);
  }

  public function WriteUint($Value)
  {
    fwrite($this->Handle, pack('V*', $Value), 4);
  }

  public function WriteInt($Value)
  {
    fwrite($this->Handle, pack('I*', $Value), 4);
  }

  public function WriteFloat($Value)
  {
    fwrite($this->Handle, pack('f*', $Value), 4);
  }

  public function WriteChar($Value)
  {
    fwrite($this->Handle, $Value, 1);
  }

  public function WriteString($Value)
  {
    fwrite($this->Handle, $Value);
  }

  public function WriteLine($Value)
  {
    fputs($this->Handle, $Value);
  }

  public function SetPosition($Position)
  {
    fseek($this->Handle, $Position, SEEK_SET);
  }

  public function GetPosition()
  {
    return ftell($this->Handle);
  }

  public function GetSize()
  {
    return filesize($this->FileName);
  }

  public function SetSize($Size)
  {
    return ftruncate($this->Handle, $Size);
  }

  public function EOF()
  {
    return feof($this->Handle);
  }
}
