Changeset 888 for trunk/Packages


Ignore:
Timestamp:
Dec 27, 2022, 7:50:23 PM (17 months ago)
Author:
chronos
Message:
  • Modified: Updated Common package to latest version.
  • Modified: Fixes related to PHP 8.x.
Location:
trunk/Packages/Common
Files:
13 added
1 deleted
15 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Packages/Common/Base.php

    r861 r888  
    11<?php
    2 
    3 class System
    4 {
    5   /* @var Database */
    6   var $Database;
    7 
    8   function __construct()
    9   {
    10     $this->Database = new Database();
    11   }
    12 }
    132
    143class Base
    154{
    16   /** @var Application */
    17   var $System;
    18   /* @var Database */
    19   var $Database;
     5  public System $System;
     6  public Database $Database;
    207
    21   function __construct(Application $System)
     8  function __construct(System $System)
    229  {
    2310    $this->System = &$System;
    2411    $this->Database = &$System->Database;
    2512  }
     13
     14  static function GetClassName()
     15  {
     16    return get_called_class();
     17  }
    2618}
    27 
    28 class Model extends Base
    29 {
    30 
    31 }
    32 
    33 class View extends Base
    34 {
    35 
    36 }
    37 
    38 class Controller extends Base
    39 {
    40 
    41 }
  • trunk/Packages/Common/Common.php

    r881 r888  
    1111include_once(dirname(__FILE__).'/Error.php');
    1212include_once(dirname(__FILE__).'/Base.php');
    13 include_once(dirname(__FILE__).'/Application.php');
    14 include_once(dirname(__FILE__).'/AppModule.php');
     13include_once(dirname(__FILE__).'/View.php');
     14include_once(dirname(__FILE__).'/Model.php');
     15include_once(dirname(__FILE__).'/ModelDesc.php');
     16include_once(dirname(__FILE__).'/Controller.php');
     17include_once(dirname(__FILE__).'/System.php');
     18include_once(dirname(__FILE__).'/Module.php');
     19include_once(dirname(__FILE__).'/ModuleManager.php');
    1520include_once(dirname(__FILE__).'/Config.php');
    1621include_once(dirname(__FILE__).'/Page.php');
    1722include_once(dirname(__FILE__).'/Locale.php');
    1823include_once(dirname(__FILE__).'/Update.php');
    19 include_once(dirname(__FILE__).'/Setup.php');
    2024include_once(dirname(__FILE__).'/Table.php');
     25include_once(dirname(__FILE__).'/Process.php');
     26include_once(dirname(__FILE__).'/Generics.php');
     27include_once(dirname(__FILE__).'/BigInt.php');
     28include_once(dirname(__FILE__).'/Int128.php');
     29include_once(dirname(__FILE__).'/Pdf.php');
     30include_once(dirname(__FILE__).'/Modules/Setup.php');
     31include_once(dirname(__FILE__).'/Modules/ModuleManager.php');
    2132
    2233class PackageCommon
    2334{
    24   var $Name;
    25   var $Version;
    26   var $License;
    27   var $Creator;
    28   var $Homepage;
     35  public string $Name;
     36  public string $Version;
     37  public int $ReleaseDate;
     38  public string $License;
     39  public string $Creator;
     40  public string $Homepage;
    2941
    3042  function __construct()
    3143  {
    3244    $this->Name = 'Common';
    33     $this->Version = '1.1';
     45    $this->Version = '1.2';
     46    $this->ReleaseDate = strtotime('2020-03-29');
    3447    $this->Creator = 'Chronos';
    35     $this->License = 'GNU/GPL';
     48    $this->License = 'GNU/GPLv3';
    3649    $this->Homepage = 'https://svn.zdechov.net/PHPlib/Common/';
    3750  }
     
    4053class Paging
    4154{
    42   var $TotalCount;
    43   var $ItemPerPage;
    44   var $Around;
    45   var $SQLLimit;
    46   var $Page;
     55  public int $TotalCount;
     56  public int $ItemPerPage;
     57  public int $Around;
     58  public string $SQLLimit;
     59  public int $Page;
    4760
    4861  function __construct()
     
    5467  }
    5568
    56   function Show()
     69  function Show(): string
    5770  {
    5871    $QueryItems = GetQueryStringArray($_SERVER['QUERY_STRING']);
  • trunk/Packages/Common/Config.php

    r880 r888  
    33class Config
    44{
    5   var $Data;
     5  public array $Data;
    66
    77  function __construct()
     
    1010  }
    1111
    12   function ReadValue($Name)
     12  function ReadValue(string $Name)
    1313  {
    1414    if (!is_array($Name)) $Name = explode('/', $Name);
     
    2222  }
    2323
    24   function WriteValue($Name, $Value)
     24  function WriteValue(string $Name, $Value)
    2525  {
    2626    if (!is_array($Name)) $Name = explode('/', $Name);
     
    3434  }
    3535
    36   function LoadFromFile($FileName)
     36  function LoadFromFile(string $FileName): void
    3737  {
    3838    $ConfigData = array();
     
    4040    foreach ($this->Data as $Index => $Item)
    4141    {
    42       if (array_key_exits($Index, $ConfigData))
     42      if (array_key_exists($Index, $ConfigData))
    4343        $this->Data[$Index] = $ConfigData[$Index];
    4444    }
    4545  }
    4646
    47   function SaveToFile($FileName)
     47  function SaveToFile(string $FileName): void
    4848  {
    4949    file_put_contents($FileName, "<?php \n\n\$ConfigData = ".var_export($this->Data, true).";\n");
    5050  }
    5151
    52   function GetAsArray()
     52  function GetAsArray(): array
    5353  {
    5454    return $this->Data;
  • trunk/Packages/Common/Database.php

    r880 r888  
    22
    33// Extended database class
    4 // Date: 2016-01-11
     4// Date: 2020-11-10
     5
     6function microtime_float()
     7{
     8  list($usec, $sec) = explode(" ", microtime());
     9  return (float)$usec + (float)$sec;
     10}
    511
    612class DatabaseResult
    713{
    8   var $PDOStatement;
    9   var $num_rows = 0;
     14  public PDOStatement $PDOStatement;
     15  public int $num_rows = 0;
    1016
    1117  function fetch_assoc()
     
    2733class Database
    2834{
    29   var $Prefix;
    30   var $Functions;
    31   var $Type;
    32   var $PDO;
    33   var $Error;
    34   var $insert_id;
    35   var $LastQuery;
    36   var $ShowSQLError;
    37   var $ShowSQLQuery;
    38   var $LogSQLQuery;
    39   var $LogFile;
     35  public string $Prefix;
     36  public array $Functions;
     37  public string $Type;
     38  public PDO $PDO;
     39  public string $Error;
     40  public string $insert_id;
     41  public string $LastQuery;
     42  public bool $ShowSQLError;
     43  public bool $ShowSQLQuery;
     44  public bool $LogSQLQuery;
     45  public string $LogFile;
     46  public string $Database;
    4047
    4148  function __construct()
    4249  {
    4350    $this->Prefix = '';
    44     $this->Functions = array('NOW()', 'CURDATE()', 'CURTIME()', 'UUID()');
     51    $this->Functions = array('NOW(', 'CURDATE(', 'CURTIME(', 'UUID(', 'SHA1(');
    4552    $this->Type = 'mysql';  // mysql, pgsql
    4653    $this->Error = '';
     
    5057    $this->LogSQLQuery = false;
    5158    $this->LogFile = dirname(__FILE__).'/../../Query.log';
    52   }
    53 
    54   function Connect($Host, $User, $Password, $Database)
     59    $this->Database = '';
     60  }
     61
     62  function Connect(string $Host, string $User, string $Password, string $Database): void
    5563  {
    5664    if ($this->Type == 'mysql') $ConnectionString = 'mysql:host='.$Host.';dbname='.$Database;
    5765      else if ($this->Type == 'pgsql') $ConnectionString = 'pgsql:dbname='.$Database.';host='.$Host;
    5866      else $ConnectionString = '';
     67    $this->Database = $Database;
    5968    try {
    6069      $this->PDO = new PDO($ConnectionString, $User, $Password);
    61 
    6270    } catch (Exception $E)
    6371    {
     
    6775  }
    6876
    69   function Disconnect()
     77  function Disconnect(): void
    7078  {
    7179    unset($this->PDO);
    7280  }
    7381
    74   function Connected()
     82  function Connected(): bool
    7583  {
    7684    return isset($this->PDO);
    7785  }
    7886
    79   function select_db($Database)
     87  function select_db(string $Database)
    8088  {
    8189    $this->query('USE `'.$Database.'`');
    8290  }
    8391
    84   function query($Query)
     92  function query($Query): DatabaseResult
    8593  {
    8694    if (!$this->Connected()) throw new Exception(T('Not connected to database'));
    87     if (($this->ShowSQLQuery == true) or ($this->LogSQLQuery == true)) $QueryStartTime = microtime();
     95    if (($this->ShowSQLQuery == true) or ($this->LogSQLQuery == true)) $QueryStartTime = microtime_float();
    8896    $this->LastQuery = $Query;
    8997    if (($this->ShowSQLQuery == true) or ($this->LogSQLQuery == true))
    90       $Duration = ' ; '.round(microtime() - $QueryStartTime, 4). ' s';
    91     if ($this->LogSQLQuery == true)
     98    {
     99      $Time = round(microtime_float() - $QueryStartTime, 4);
     100      $Duration = ' ; '.$Time. ' s';
     101    }
     102    if (($this->LogSQLQuery == true) and ($Time != 0))
    92103      file_put_contents($this->LogFile, $Query.$Duration."\n", FILE_APPEND);
    93104    if ($this->ShowSQLQuery == true)
     
    95106      'padding-bottom: 3px; padding-top: 3px; font-size: 12px; font-family: Arial;">'.$Query.$Duration.'</div>'."\n");
    96107    $Result = new DatabaseResult();
    97     $Result->PDOStatement = $this->PDO->query($Query);
    98     if ($Result->PDOStatement)
    99     {
    100       $Result->num_rows = $Result->PDOStatement->rowCount();
     108    $Statement = $this->PDO->query($Query);
     109    if ($Statement)
     110    {
     111      $Result->PDOStatement = $Statement;
     112      $Result->num_rows = $Statement->rowCount();
    101113      $this->insert_id = $this->PDO->lastInsertId();
    102114    } else
    103115    {
    104       $this->Error = $this->PDO->errorInfo();
    105       $this->Error = $this->Error[2];
     116      $Error = $this->PDO->errorInfo();
     117      $this->Error = $Error[2];
    106118      if (($this->Error != '') and ($this->ShowSQLError == true))
    107119        echo('<div><strong>SQL Error: </strong>'.$this->Error.'<br />'.$Query.'</div>');
     
    111123  }
    112124
    113   function select($Table, $What = '*', $Condition = 1)
     125  function select(string $Table, string $What = '*', string $Condition = '1'): DatabaseResult
    114126  {
    115127    return $this->query('SELECT '.$What.' FROM `'.$this->Prefix.$Table.'` WHERE '.$Condition);
    116128  }
    117129
    118   function delete($Table, $Condition)
     130  function delete(string $Table, string $Condition): void
    119131  {
    120132    $this->query('DELETE FROM `'.$this->Prefix.$Table.'` WHERE '.$Condition);
    121133  }
    122134
    123   function insert($Table, $Data)
     135  function insert(string $Table, array $Data): int
     136  {
     137    $this->query($this->GetInsert($Table, $Data));
     138    $this->insert_id = $this->PDO->lastInsertId();
     139    return $this->insert_id;
     140  }
     141
     142  function IsFunction(string $Text): bool
     143  {
     144    $Pos = strpos($Text, '(');
     145    return ($Pos !== false) && in_array(substr($Text, 0, $Pos + 1), $this->Functions);
     146  }
     147
     148  function GetInsert(string $Table, array $Data): string
    124149  {
    125150    $Name = '';
     
    128153    {
    129154      $Name .= ',`'.$Key.'`';
    130       if (!in_array($Value, $this->Functions))
     155      if (is_null($Value)) $Value = 'NULL';
     156      else if (!$this->IsFunction($Value))
    131157      {
    132         if (is_null($Value)) $Value = 'NULL';
    133         else $Value = $this->PDO->quote($Value);
     158        $Value = $this->PDO->quote($Value);
    134159      }
    135160      $Values .= ','.$Value;
     
    137162    $Name = substr($Name, 1);
    138163    $Values = substr($Values, 1);
    139     $this->query('INSERT INTO `'.$this->Prefix.$Table.'` ('.$Name.') VALUES('.$Values.')');
    140     $this->insert_id = $this->PDO->lastInsertId();
    141   }
    142 
    143   function update($Table, $Condition, $Data)
     164    return 'INSERT INTO `'.$this->Prefix.$Table.'` ('.$Name.') VALUES('.$Values.')';
     165  }
     166
     167  function update(string $Table, string $Condition, array $Data): void
     168  {
     169    $this->query($this->GetUpdate($Table, $Condition, $Data));
     170  }
     171
     172  function GetUpdate(string $Table, string $Condition, array $Data): string
    144173  {
    145174    $Values = '';
    146175    foreach ($Data as $Key => $Value)
    147176    {
    148       if (!in_array($Value, $this->Functions))
     177      if (is_null($Value)) $Value = 'NULL';
     178      else if (!$this->IsFunction($Value))
    149179      {
    150         if (is_null($Value)) $Value = 'NULL';
    151         else $Value = $this->PDO->quote($Value);
     180        $Value = $this->PDO->quote($Value);
    152181      }
    153182      $Values .= ', `'.$Key.'`='.$Value;
    154183    }
    155184    $Values = substr($Values, 2);
    156     $this->query('UPDATE `'.$this->Prefix.$Table.'` SET '.$Values.' WHERE ('.$Condition.')');
    157   }
    158 
    159   function replace($Table, $Data)
     185    return 'UPDATE `'.$this->Prefix.$Table.'` SET '.$Values.' WHERE ('.$Condition.')';
     186  }
     187
     188  function replace(string $Table, array $Data): void
    160189  {
    161190    $Name = '';
     
    163192    foreach ($Data as $Key => $Value)
    164193    {
    165       if (!in_array($Value, $this->Functions))
     194      if (is_null($Value)) $Value = 'NULL';
     195      else if (!$this->IsFunction($Value))
    166196      {
    167         if (is_null($Value)) $Value = 'NULL';
    168         else $Value = $this->PDO->quote($Value);
     197        $Value = $this->PDO->quote($Value);
    169198      }
    170199      $Name .= ',`'.$Key.'`';
     
    173202    $Name = substr($Name, 1);
    174203    $Values = substr($Values, 1);
    175     //echo('REPLACE INTO `'.$this->Prefix.$Table.'` ('.$Name.') VALUES ('.$Values.')<br />');
    176204    $this->query('REPLACE INTO `'.$this->Prefix.$Table.'` ('.$Name.') VALUES('.$Values.')');
    177     //echo($this->error().'<br>');
    178   }
    179 
    180   function charset($Charset)
     205  }
     206
     207  function charset(string $Charset): void
    181208  {
    182209    $this->query('SET NAMES "'.$Charset.'"');
    183210  }
    184211
    185   function real_escape_string($Text)
     212  function real_escape_string(string $Text): string
    186213  {
    187214    return addslashes($Text);
    188215  }
    189216
    190   function quote($Text)
     217  function quote(string $Text): string
    191218  {
    192219    return $this->PDO->quote($Text);
    193220  }
    194221
    195   public function __sleep()
     222  public function __sleep(): array
    196223  {
    197224    return array('LastQuery');
    198225  }
    199226
    200   public function __wakeup()
    201   {
     227  public function __wakeup(): void
     228  {
     229  }
     230
     231  public function Transaction(array $Queries): void
     232  {
     233    $this->PDO->beginTransaction();
     234    foreach ($Queries as $Query)
     235    {
     236      $Statement = $this->PDO->prepare($Query);
     237      $Statement->execute();
     238    }
     239    $this->PDO->commit();
     240  }
     241
     242  public function TableExists(string $Name): bool
     243  {
     244    $DbResult = $this->query('SELECT * FROM information_schema.tables  WHERE table_schema = "'.$this->Database.
     245    '" AND table_name = "'.$Name.'" LIMIT 1');
     246    return $DbResult->num_rows != 0;
    202247  }
    203248}
  • trunk/Packages/Common/Error.php

    r887 r888  
    1616  }
    1717
    18   function Start()
     18  function Start(): void
    1919  {
    2020    set_error_handler(array($this, 'ErrorHandler'));
     
    2222  }
    2323
    24   function Stop()
     24  function Stop(): void
    2525  {
    2626    restore_error_handler();
     
    2828  }
    2929
    30   function ErrorHandler($Number, $Message, $FileName, $LineNumber)
     30  function ErrorHandler(int $Number, string $Message, string $FileName, int $LineNumber, array $Variables = array()): bool
    3131  {
    3232    $ErrorType = array
     
    6363  }
    6464
    65   function ExceptionHandler(Throwable $Exception)
     65  function ExceptionHandler(Throwable $Exception): void
    6666  {
    6767    $Backtrace = $Exception->getTrace();
     
    8888  }
    8989
    90   function Report($Backtrace)
     90  function Report(array $Backtrace): void
    9191  {
    9292    $Date = date('Y-m-d H:i:s');
  • trunk/Packages/Common/Image.php

    r880 r888  
    99class Font
    1010{
    11   var $Size;
    12   var $FileName;
    13   var $Color;
     11  public int $Size;
     12  public string $FileName;
     13  public int $Color;
    1414
    1515  function __construct()
     
    2323class Pen
    2424{
    25   var $Color;
    26   var $X;
    27   var $Y;
     25  public int $Color;
     26  public int $X;
     27  public int $Y;
    2828
    2929  function __construct()
     
    3838class Brush
    3939{
    40   var $Color;
     40  public int $Color;
    4141
    4242  function __construct()
     
    4949class Image
    5050{
    51   var $Image;
    52   var $Type;
    53   var $Font;
    54   var $Pen;
     51  public $Image;
     52  public int $Type;
     53  public Font $Font;
     54  public Pen $Pen;
     55  public Brush $Brush;
    5556
    5657  function __construct()
     
    6364  }
    6465
    65   function SaveToFile($FileName)
     66  function SaveToFile(string $FileName): void
    6667  {
    6768    if ($this->Type == IMAGETYPE_JPEG)
     
    7980  }
    8081
    81   function LoadFromFile($FileName)
     82  function LoadFromFile(string $FileName): void
    8283  {
    8384    $ImageInfo = getimagesize($FileName);
     
    8990    if ($this->Type == IMAGETYPE_GIF)
    9091    {
    91       $this->Image = imagecreatefromgif($FileName);
     92      $this->Image = imagecreatefromgif ($FileName);
    9293    } else
    9394    if ( $this->Type == IMAGETYPE_PNG)
     
    9798  }
    9899
    99   function Output()
     100  function Output(): void
    100101  {
    101102    $this->SaveToFile(NULL);
    102103  }
    103104
    104   function SetSize($Width, $Height)
     105  function SetSize(int $Width, int $Height): void
    105106  {
    106107    $NewImage = imagecreatetruecolor($Width, $Height);
     
    110111  }
    111112
    112   function GetWidth()
     113  function GetWidth(): int
    113114  {
    114115    return imagesx($this->Image);
    115116  }
    116117
    117   function GetHeight()
     118  function GetHeight(): int
    118119  {
    119120    return imagesy($this->Image);
    120121  }
    121122
    122   function TextOut($X, $Y, $Text)
     123  function TextOut(int $X, int $Y, string $Text): void
    123124  {
    124125    imagettftext($this->Image, $this->Font->Size, 0, $X, $Y, $this->ConvertColor($this->Font->Color), $this->Font->FileName, $Text);
    125126  }
    126127
    127   function ConvertColor($Color)
     128  function ConvertColor(int $Color): int
    128129  {
    129130    return imagecolorallocate($this->Image, ($Color >> 16) & 0xff, ($Color >> 8) & 0xff, $Color & 0xff);
    130131  }
    131132
    132   function FillRect($X1, $Y1, $X2, $Y2)
     133  function FillRect(int $X1, int $Y1, int $X2, int $Y2): void
    133134  {
    134135    imagefilledrectangle($this->Image, $X1, $Y1, $X2, $Y2, $this->ConvertColor($this->Brush->Color));
    135136  }
    136137
    137   function Line($X1, $Y1, $X2, $Y2)
     138  function Line(int $X1, int $Y1, int $X2, int $Y2): void
    138139  {
    139140    imageline($this->Image, $X1, $Y1, $X2, $Y2, $this->ConvertColor($this->Pen->Color));
  • trunk/Packages/Common/Locale.php

    r884 r888  
    33class LocaleText
    44{
    5   var $Data;
    6   var $Code;
    7   var $Title;
     5  public array $Data;
     6  public string $Code;
     7  public string $Title;
    88
    99  function __construct()
     
    1414  }
    1515
    16   function Load()
    17   {
    18   }
    19 
    20   function Translate($Text, $Group = '')
     16  function Load(): void
     17  {
     18  }
     19
     20  function Translate(string $Text, string $Group = ''): string
    2121  {
    2222    if (array_key_exists($Text, $this->Data[$Group]) and ($this->Data[$Group][$Text] != ''))
     
    2525  }
    2626
    27   function TranslateReverse($Text, $Group = '')
     27  function TranslateReverse(string $Text, string $Group = ''): string
    2828  {
    2929    $Key = array_search($Text, $this->Data[$Group]);
     
    3535class LocaleFile extends Model
    3636{
    37   var $Texts;
    38   var $Dir;
     37  public LocaleText $Texts;
     38  public string $Dir;
    3939
    4040  function __construct(System $System)
     
    4444  }
    4545
    46   function Load($Language)
     46  function Load(string $Language): void
    4747  {
    4848    $FileName = $this->Dir.'/'.$Language.'.php';
     
    5555  }
    5656
    57   function AnalyzeCode($Path)
     57  function AnalyzeCode(string $Path): void
    5858  {
    5959    // Search for php files
     
    7575            $Previous = strtolower(substr($Content, strpos($Content, 'T(') - 1, 1));
    7676            $Content = substr($Content, strpos($Content, 'T(') + 2);
    77             $Ord = ord($Previous);
    78             //echo($Ord.',');
     77            $Ord = ord($Previous);           
    7978            if (!(($Ord >= ord('a')) and ($Ord <= ord('z'))))
    8079            {
     
    9897  }
    9998
    100   function SaveToFile($FileName)
     99  function SaveToFile(string $FileName): void
    101100  {
    102101    $Content = '<?php'."\n".
     
    119118  }
    120119
    121   function LoadFromDatabase($Database, $LangCode)
     120  function LoadFromDatabase(Database $Database, string $LangCode): void
    122121  {
    123122    $DbResult = $Database->select('Language', '*', 'Code='.$Database->quote($LangCode));
     
    132131  }
    133132
    134   function SaveToDatabase(Database $Database, $LangCode)
    135   {
    136     $DbResult = $Database->select('Language', '*', 'Code='.$Database->quote($LangCode));
     133  function SaveToDatabase(string $LangCode): void
     134  {
     135    $DbResult = $this->Database->select('Language', '*', 'Code='.$this->Database->quote($LangCode));
    137136    if ($DbResult->num_rows > 0)
    138137    {
    139138      $Language = $DbResult->fetch_assoc();
    140       $Database->delete('Locale', '`Language`='.$Language['Id']);
     139      $this->Database->delete('Locale', '`Language`='.$Language['Id']);
    141140      foreach ($this->Texts->Data as $Index => $Item)
    142         $Database->query('INSERT INTO `Locale` (`Language`,`Original`,`Translated`) '.
    143         'VALUES('.$Language['Id'].','.$Database->quote($Index).','.$Database->quote($Item).')');
    144     }
    145   }
    146 
    147   function UpdateToDatabase(Database $Database, $LangCode)
    148   {
    149     $DbResult = $Database->select('Language', '*', '`Code`='.$Database->quote($LangCode));
     141        $this->Database->query('INSERT INTO `Locale` (`Language`,`Original`,`Translated`) '.
     142        'VALUES('.$Language['Id'].','.$this->Database->quote($Index).','.$this->Database->quote($Item).')');
     143    }
     144  }
     145
     146  function UpdateToDatabase(string $LangCode): void
     147  {
     148    $DbResult = $this->Database->select('Language', '*', '`Code`='.$this->Database->quote($LangCode));
    150149    if ($DbResult->num_rows > 0)
    151150    {
     
    153152      foreach ($this->Texts->Data as $Index => $Item)
    154153      {
    155         if (is_array($Item)) continue;
    156         $DbResult = $Database->select('Locale', '*', '(`Original` ='.$Database->quote($Index).
     154        $DbResult = $this->Database->select('Locale', '*', '(`Original` ='.$this->Database->quote($Index).
    157155          ') AND (`Language`='.($Language['Id']).')');
    158156        if ($DbResult->num_rows > 0)
    159         {
    160           $Database->update('Locale', '(`Language`='.($Language['Id']).') AND '.
    161             '(`Original` ='.$Database->quote($Index).')', array('Translated' => $Item));
    162         } else
    163         {
    164           $Database->insert('Locale', array('Language' => $Language['Id'],
    165            'Original' => $Index, 'Translated' => $Item, 'Fuzzy' => 0));
    166         }
     157        $this->Database->update('Locale', '(`Language`='.($Language['Id']).') AND '.
     158          '(`Original` ='.$this->Database->quote($Index).')', array('Translated' => $Item));
     159        else $this->Database->insert('Locale', array('Language' => $Language['Id'],
     160         'Original' => $Index, 'Translated' => $Item));
    167161      }
    168162    }
     
    172166class LocaleManager extends Model
    173167{
    174   var $CurrentLocale;
    175   var $Codes;
    176   var $Dir;
    177   var $LangCode;
    178   var $DefaultLangCode;
    179   var $Available;
     168  public LocaleFile $CurrentLocale;
     169  public array $Codes;
     170  public string $Dir;
     171  public string $LangCode;
     172  public string $DefaultLangCode;
     173  public array $Available;
    180174
    181175  function __construct(System $System)
     
    187181    $this->DefaultLangCode = 'en';
    188182    $this->Available = array();
    189   }
    190 
    191   function LoadAvailable()
     183    $this->Dir = '';
     184  }
     185
     186  function LoadAvailable(): void
    192187  {
    193188    $this->Available = array();
     
    206201  }
    207202
    208   function UpdateAll($Directory)
     203  function UpdateAll(string $Directory): void
    209204  {
    210205    $Locale = new LocaleFile($this->System);
     
    227222          if (!array_key_exists($Index, $Locale->Texts->Data))
    228223            unset($FileLocale->Texts->Data[$Index]);
    229         $FileLocale->UpdateToDatabase($this->System->Database, $FileLocale->Texts->Code);
     224        $FileLocale->UpdateToDatabase($FileLocale->Texts->Code);
    230225        $FileName = $this->Dir.'/'.$FileLocale->Texts->Code.'.php';
    231226        $FileLocale->SaveToFile($FileName);
     
    235230  }
    236231
    237   function LoadLocale($Code)
     232  function LoadLocale(string $Code): void
    238233  {
    239234    if (array_key_exists($Code, $this->Available))
     
    246241
    247242// Short named global translation function
    248 function T($Text, $Group = '')
     243function T(string $Text, string $Group = ''): string
    249244{
    250245  global $GlobalLocaleManager;
  • trunk/Packages/Common/Mail.php

    r880 r888  
    99class Mail
    1010{
    11   var $Priorities;
    12   var $Subject;
    13   var $From;
    14   var $Recipients;
    15   var $Bodies;
    16   var $Attachments;
    17   var $AgentIdent;
    18   var $Organization;
    19   var $ReplyTo;
    20   var $Headers;
     11  public string $Subject;
     12  public string $From;
     13  public array $Recipients;
     14  public array $Bodies;
     15  public array $Attachments;
     16  public string $AgentIdent;
     17  public string $Organization;
     18  public string $ReplyTo;
     19  public array $Headers;
     20  private array $Priorities;
     21  private string $Boundary;
     22  public bool $TestMode;
    2123
    2224  function __construct()
     
    2527    $this->Boundary = md5(date('r', time()));
    2628    $this->AgentIdent = 'PHP/Mail';
     29    $this->TestMode = false;
    2730    $this->Clear();
    2831  }
    2932
    30   function Clear()
     33  function Clear(): void
    3134  {
    3235    $this->Bodies = array();
     
    4144  }
    4245
    43   function AddToCombined($Address)
     46  function AddToCombined(string $Address): void
    4447  {
    4548    $this->Recipients[] = array('Address' => $Address, 'Type' => 'SendCombined');
    4649  }
    4750
    48   function AddTo($Address, $Name)
     51  function AddTo(string $Address, string $Name): void
    4952  {
    5053    $this->Recipients[] = array('Address' => $Address, 'Name' => $Name, 'Type' => 'Send');
    5154  }
    5255
    53   function AddCc($Address, $Name)
     56  function AddCc(string $Address, string $Name): void
    5457  {
    5558    $this->Recipients[] = array('Address' => $Address, 'Name' => $Name, 'Type' => 'Copy');
    5659  }
    5760
    58   function AddBcc($Address, $Name)
     61  function AddBcc(string $Address, string $Name): void
    5962  {
    6063    $this->Recipients[] = array('Address' => $Address, 'Name' => $Name, 'Type' => 'HiddenCopy');
    6164  }
    6265
    63   function AddBody($Content, $MimeType = 'text/plain', $Charset = 'utf-8')
     66  function AddBody(string $Content, string $MimeType = 'text/plain', string $Charset = 'utf-8'): void
    6467  {
    6568    $this->Bodies[] = array('Content' => $Content, 'Type' => strtolower($MimeType),
     
    6770  }
    6871
    69   function Organization($org)
     72  function Organization(string $org): void
    7073  {
    7174    if (trim($org != '')) $this->xheaders['Organization'] = $org;
    7275  }
    7376
    74   function Priority($Priority)
     77  function Priority(int $Priority): bool
    7578  {
    7679    if (!intval($Priority)) return false;
    7780
    78     if (!isset($this->priorities[$Priority - 1])) return false;
    79 
    80     $this->xheaders['X-Priority'] = $this->priorities[$Priority - 1];
     81    if (!isset($this->Priorities[$Priority - 1])) return false;
     82
     83    $this->xheaders['X-Priority'] = $this->Priorities[$Priority - 1];
    8184    return true;
    8285  }
    8386
    84   function AttachFile($FileName, $FileType, $Disposition = DISPOSITION_ATTACHMENT)
     87  function AttachFile($FileName, $FileType, $Disposition = DISPOSITION_ATTACHMENT): void
    8588  {
    8689    $this->Attachments[] = array('FileName' => $FileName, 'FileType' => $FileType,
     
    8891  }
    8992
    90   function AttachData($FileName, $FileType, $Data, $Disposition = DISPOSITION_ATTACHMENT)
     93  function AttachData($FileName, $FileType, $Data, $Disposition = DISPOSITION_ATTACHMENT): void
    9194  {
    9295    $this->Attachments[] = array('FileName' => $FileName, 'FileType' => $FileType,
     
    9497  }
    9598
    96   function Send()
     99  function Send(): bool
    97100  {
    98101    if (count($this->Bodies) == 0) throw new Exception(T('Mail message need at least one text body'));
     
    132135    if ($this->AgentIdent != '') $this->Headers['X-Mailer'] = $this->AgentIdent;
    133136    if ($this->ReplyTo != '') $this->Headers['Reply-To'] = $this->ReplyTo;
    134     if ($this->From != '') $this->Headers['From'] = $this->From;
     137    if ($this->From != '')
     138    {
     139      $IndexStart = strpos($this->From, '<');
     140      if ($IndexStart !== false)
     141      {
     142        $this->Headers['From'] = '=?utf-8?Q?'.quoted_printable_encode(trim(substr($this->From, 0, $IndexStart))).'?= '.substr($this->From, $IndexStart);
     143      } else
     144      {
     145        $this->Headers['From'] = $this->From;
     146      }
     147    }
    135148
    136149    $Headers = '';
     
    144157    if ($this->Subject == '') throw new Exception(T('Mail message missing Subject'));
    145158
    146 
    147     $res = mail($To, $this->Subject, $Body, $Headers);
     159    if ($this->TestMode)
     160    {
     161      echo('to: '.$To.', subject: '.$this->Subject.', body: '.$Body.', headers: '.$Headers);
     162      $res = true;
     163    } else
     164    {
     165      $res = mail($To, $this->Subject, $Body, $Headers);
     166    }
    148167    return $res;
    149168  }
    150169
    151   function ValidEmail($Address)
    152   {
    153     if (ereg(".*<(.+)>", $Address, $regs)) $Address = $regs[1];
    154     if (ereg("^[^@  ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$", $Address))
     170  function ValidEmail(string $Address): bool
     171  {
     172    if (preg_match(".*<(.+)>", $Address, $regs)) $Address = $regs[1];
     173    if (preg_match("^[^@  ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$", $Address))
    155174      return true;
    156175      else return false;
    157176  }
    158177
    159   function CheckAdresses($Addresses)
     178  function CheckAdresses(array $Addresses): void
    160179  {
    161180    foreach ($Addresses as $Address)
    162181    {
    163182      if (!$this->ValidEmail($Address))
    164   throw new Exception(sprintf(T('Mail message invalid address %s'), $Address));
    165     }
    166   }
    167 
    168   private function ContentEncoding($Charset)
     183      {
     184        throw new Exception(sprintf(T('Mail message invalid address %s'), $Address));
     185      }
     186    }
     187  }
     188
     189  private function ContentEncoding($Charset): string
    169190  {
    170191    if ($Charset != CHARSET_ASCII) return '8bit';
     
    172193  }
    173194
    174   private function BuildAttachment($Body)
     195  private function BuildAttachment($Body): string
    175196  {
    176197    if (count($this->Attachments) > 0)
     
    206227  }
    207228
    208   private function BuildBody()
     229  private function BuildBody(): string
    209230  {
    210231    $Result = '';
     
    219240      $this->Headers['Content-Transfer-Encoding'] = $this->ContentEncoding($this->Bodies[0]['Charset']);
    220241    }
    221 
    222242
    223243    foreach ($this->Bodies as $Body)
  • trunk/Packages/Common/Module.php

    r887 r888  
    11<?php
    22
    3 /* This implementation will not support installation from remote source. Just
    4  * installation of already presented modules mainly to persistence preparation.
    5  */
    6 
    73class ModuleType
    84{
    95  const System = 0;
    10   const Normal = 1;
     6  const Library = 1;
    117  const Application = 2;
    128}
     
    2117  const Enable = 5;
    2218  const Disable = 6;
     19  const InsertSampleData = 7;
    2320}
    2421
     
    3229  const Running = 5;
    3330  const NotRunning = 6;
    34 }
    35 
    36 class AppModule
    37 {
    38   var $Id;
    39   var $Name;
    40   var $Title;
    41   var $Version;
    42   var $License;
    43   var $Creator;
    44   var $HomePage;
    45   var $Description;
    46   var $Running;
    47   var $Enabled;
    48   var $Installed;
    49   var $InstalledVersion;
    50   /** @var ModuleType */
    51   var $Type;
    52   var $Dependencies;
    53   /** @var Database */
    54   var $Database;
    55   /** @var System */
    56   var $System;
    57   /** @var AppModuleManager */
    58   var $Manager;
    59   var $OnChange;
     31  const System = 7;
     32  const Library = 8;
     33  const Application = 9;
     34}
     35
     36class Module extends Model
     37{
     38  public int $Id;
     39  public string $Name;
     40  public string $Title;
     41  public string $Version;
     42  public string $License;
     43  public string $Creator;
     44  public string $HomePage;
     45  public string $Description;
     46  public int $Type; // ModuleType
     47  public array $Dependencies;
     48  public array $Models; // Model
     49  public bool $Running;
     50  public bool $Enabled;
     51  public bool $Installed;
     52  public string $InstalledVersion;
     53  public Database $Database;
     54  public System $System;
     55  public ModuleManager $Manager;
     56  public $OnChange;
    6057
    6158  function __construct(System $System)
    6259  {
    63     $this->System = &$System;
    64     $this->Database = &$System->Database;
    65     $this->Installed = false;
    66     $this->Enabled = false;
    67     $this->Running = false;
     60    parent::__construct($System);
     61    $this->Name = '';
    6862    $this->HomePage = '';
    6963    $this->License = '';
    7064    $this->Version = '';
    7165    $this->Creator = '';
     66    $this->Title = '';
    7267    $this->Description = '';
    7368    $this->Dependencies = array();
    74     $this->Type = ModuleType::Normal;
    75   }
    76 
    77   function Install()
     69    $this->Models = array();
     70    $this->Type = ModuleType::Library;
     71    $this->Installed = false;
     72    $this->InstalledVersion = '';
     73    $this->Enabled = false;
     74    $this->Running = false;
     75  }
     76
     77  static function GetName()
     78  {
     79    $ClassName = get_called_class();
     80    if (substr($ClassName, 0, 6) == 'Module') return substr($ClassName, 6);
     81      else return $ClassName;
     82  }
     83
     84  static function GetModelDesc(): ModelDesc
     85  {
     86    $Desc = new ModelDesc(self::GetClassName());
     87    $Desc->AddString('Name');
     88    $Desc->AddString('Title');
     89    $Desc->AddString('Creator');
     90    $Desc->AddString('Version');
     91    $Desc->AddString('License');
     92    $Desc->AddBoolean('Installed');
     93    $Desc->AddString('InstalledVersion');
     94    $Desc->AddString('Description');
     95    return $Desc;
     96  }
     97
     98  function Install(): void
    7899  {
    79100    if ($this->Installed) return;
    80101    $List = array();
    81102    $this->Manager->EnumDependenciesCascade($this, $List, array(ModuleCondition::NotInstalled));
    82     $this->Manager->Perform($List, array(ModuleAction::Install), array(ModuleCondition::NotInstalled));
    83     $this->DoInstall();
     103    $this->Manager->PerformList($List, array(ModuleAction::Install), array(ModuleCondition::NotInstalled));
    84104    $this->Installed = true;
     105    $this->Enabled = true; // Automatically enable installed module
    85106    $this->InstalledVersion = $this->Version;
    86107    $this->Manager->Modules[$this->Name] = $this;
    87   }
    88 
    89   function Uninstall()
     108    $this->DoBeforeInstall();
     109    if ($this->Manager->OnInstallModule != null)
     110    {
     111      call_user_func($this->Manager->OnInstallModule, $this);
     112    }
     113    $this->InstallModels($this->Models);
     114    $this->DoInstall();
     115  }
     116
     117  function Uninstall(): void
    90118  {
    91119    if (!$this->Installed) return;
     
    94122    $List = array();
    95123    $this->Manager->EnumSuperiorDependenciesCascade($this, $List, array(ModuleCondition::Installed));
    96     $this->Manager->Perform($List, array(ModuleAction::Uninstall), array(ModuleCondition::Installed));
     124    $this->Manager->PerformList($List, array(ModuleAction::Uninstall), array(ModuleCondition::Installed));
    97125    $this->DoUninstall();
    98   }
    99 
    100   function Upgrade()
     126    $this->UninstallModels($this->Models);
     127    if ($this->Manager->OnUninstallModule != null)
     128    {
     129      call_user_func($this->Manager->OnUninstallModule, $this);
     130    }
     131    $this->DoAfterUninstall();
     132  }
     133
     134  function Upgrade(): void
    101135  {
    102136    if (!$this->Installed) return;
     
    104138    $List = array();
    105139    $this->Manager->EnumSuperiorDependenciesCascade($this, $List, array(ModuleCondition::Installed));
    106     $this->Manager->Perform($List, array(ModuleAction::Upgrade), array(ModuleCondition::Installed));
     140    $this->Manager->PerformList($List, array(ModuleAction::Upgrade), array(ModuleCondition::Installed));
    107141    $this->DoUpgrade();
    108142  }
    109143
    110   function Reinstall()
     144  function InsertSampleData(): void
     145  {
     146    $this->DoInsertSampleData();
     147  }
     148
     149  function Reinstall(): void
    111150  {
    112151    $this->Uninstall();
     
    115154  }
    116155
    117   function Start()
     156  function Start(): void
    118157  {
    119158    if ($this->Running) return;
     
    121160    $List = array();
    122161    $this->Manager->EnumDependenciesCascade($this, $List, array(ModuleCondition::NotRunning));
    123     $this->Manager->Perform($List, array(ModuleAction::Start), array(ModuleCondition::NotRunning));
     162    $this->Manager->PerformList($List, array(ModuleAction::Start), array(ModuleCondition::NotRunning));
    124163    $this->DoStart();
    125164    $this->Running = true;
    126165  }
    127166
    128   function Stop()
     167  function Stop(): void
    129168  {
    130169    if (!$this->Running) return;
     
    132171    $List = array();
    133172    $this->Manager->EnumSuperiorDependenciesCascade($this, $List, array(ModuleCondition::Running));
    134     $this->Manager->Perform($List, array(ModuleAction::Stop), array(ModuleCondition::Running));
     173    $this->Manager->PerformList($List, array(ModuleAction::Stop), array(ModuleCondition::Running));
    135174    $this->DoStop();
    136175  }
    137176
    138   function Restart()
     177  function Restart(): void
    139178  {
    140179    $this->Stop();
     
    142181  }
    143182
    144   function Enable()
     183  function Enable(): void
    145184  {
    146185    if ($this->Enabled) return;
     
    148187    $List = array();
    149188    $this->Manager->EnumDependenciesCascade($this, $List, array(ModuleCondition::NotEnabled));
    150     $this->Manager->Perform($List, array(ModuleAction::Enable), array(ModuleCondition::NotEnabled));
     189    $this->Manager->PerformList($List, array(ModuleAction::Enable), array(ModuleCondition::NotEnabled));
    151190    $this->Enabled = true;
    152191  }
    153192
    154   function Disable()
     193  function Disable(): void
    155194  {
    156195    if (!$this->Enabled) return;
     
    159198    $List = array();
    160199    $this->Manager->EnumSuperiorDependenciesCascade($this, $List, array(ModuleCondition::Enabled));
    161     $this->Manager->Perform($List, array(ModuleAction::Disable), array(ModuleCondition::Enabled));
    162   }
    163 
    164   protected function DoStart()
    165   {
    166   }
    167 
    168   protected function DoStop()
    169   {
    170   }
    171 
    172   protected function DoInstall()
    173   {
    174   }
    175 
    176   protected function DoUninstall()
    177   {
    178   }
    179 
    180   protected function DoUpgrade()
    181   {
    182 
    183   }
    184 }
    185 
    186 /* Manage installed modules */
    187 class AppModuleManager
    188 {
    189   var $Modules;
    190   var $System;
    191   var $FileName;
    192   var $ModulesDir;
    193   var $OnLoadModules;
    194 
    195   function __construct(System $System)
    196   {
    197     $this->Modules = array();
    198     $this->System = &$System;
    199     $this->FileName = dirname(__FILE__).'/../../Config/ModulesConfig.php';
    200     $this->ModulesDir = dirname(__FILE__).'/../../Modules';
    201   }
    202 
    203   function Perform($List, $Actions, $Conditions = array(ModuleCondition::All))
    204   {
    205     foreach ($List as $Index => $Module)
    206     {
    207       if (in_array(ModuleCondition::All, $Conditions) or
    208         ($Module->Running and in_array(ModuleCondition::Running, $Conditions)) or
    209         (!$Module->Running and in_array(ModuleCondition::NotRunning, $Conditions)) or
    210         ($Module->Installed and in_array(ModuleCondition::Installed, $Conditions)) or
    211         (!$Module->Installed and in_array(ModuleCondition::NotInstalled, $Conditions)) or
    212         ($Module->Enabled and in_array(ModuleCondition::Enabled, $Conditions)) or
    213         (!$Module->Enabled and in_array(ModuleCondition::NotEnabled, $Conditions)))
     200    $this->Manager->PerformList($List, array(ModuleAction::Disable), array(ModuleCondition::Enabled));
     201  }
     202
     203  protected function DoStart(): void
     204  {
     205  }
     206
     207  protected function DoStop(): void
     208  {
     209  }
     210
     211  protected function DoBeforeInstall(): void
     212  {
     213  }
     214
     215  protected function DoInstall(): void
     216  {
     217  }
     218
     219  protected function DoUninstall(): void
     220  {
     221  }
     222
     223  protected function DoAfterUninstall(): void
     224  {
     225  }
     226
     227  protected function DoUpgrade(): string
     228  {
     229    return '';
     230  }
     231
     232  protected function DoInsertSampleData(): void
     233  {
     234  }
     235
     236  function AddModel(Model $Model): void
     237  {
     238    $this->Models[get_class($Model)] = $Model;
     239  }
     240
     241  function InstallModels(array $Models): void
     242  {
     243    if ($this->Manager->OnInstallModel != null)
     244    {
     245      foreach ($Models as $Model)
    214246      {
    215         foreach ($Actions as $Action)
    216         {
    217           if ($Action == ModuleAction::Start) $Module->Start();
    218           if ($Action == ModuleAction::Stop) $Module->Stop();
    219           if ($Action == ModuleAction::Install) $Module->Install();
    220           if ($Action == ModuleAction::Uninstall) $Module->Uninstall();
    221           if ($Action == ModuleAction::Enable) $Module->Enable();
    222           if ($Action == ModuleAction::Disable) $Module->Disable();
    223           if ($Action == ModuleAction::Upgrade) $Module->Upgrade();
    224         }
     247        call_user_func($this->Manager->OnInstallModel, $Model::GetModelDesc(), $this);
    225248      }
    226249    }
    227250  }
    228251
    229   function EnumDependenciesCascade($Module, &$List, $Conditions = array(ModuleCondition::All))
    230   {
    231     foreach ($Module->Dependencies as $Dependency)
    232     {
    233       if (!array_key_exists($Dependency, $this->Modules))
    234         throw new Exception(sprintf(T('Module "%s" dependency "%s" not found'), $Module->Name, $Dependency));
    235       $DepModule = $this->Modules[$Dependency];
    236       if (in_array(ModuleCondition::All, $Conditions) or
    237         ($Module->Running and in_array(ModuleCondition::Running, $Conditions)) or
    238         (!$Module->Running and in_array(ModuleCondition::NotRunning, $Conditions)) or
    239         ($Module->Enabled and in_array(ModuleCondition::Enabled, $Conditions)) or
    240         (!$Module->Enabled and in_array(ModuleCondition::NotEnabled, $Conditions)) or
    241         ($Module->Installed and in_array(ModuleCondition::Installed, $Conditions)) or
    242         (!$Module->Installed and in_array(ModuleCondition::NotInstalled, $Conditions)))
     252  function UninstallModels(array $Models): void
     253  {
     254    if ($this->Manager->OnUninstallModel != null)
     255    {
     256      foreach (array_reverse($Models) as $Model)
    243257      {
    244         array_push($List, $DepModule);
    245         $this->EnumDependenciesCascade($DepModule, $List, $Conditions);
     258        call_user_func($this->Manager->OnUninstallModel, $Model::GetModelDesc(), $this);
    246259      }
    247260    }
    248261  }
    249 
    250   function EnumSuperiorDependenciesCascade($Module, &$List, $Conditions = array(ModuleCondition::All))
    251   {
    252     foreach ($this->Modules as $RefModule)
    253     {
    254       if (in_array($Module->Name, $RefModule->Dependencies) and
    255           (in_array(ModuleCondition::All, $Conditions) or
    256           ($Module->Running and in_array(ModuleCondition::Running, $Conditions)) or
    257           (!$Module->Running and in_array(ModuleCondition::NotRunning, $Conditions)) or
    258           ($Module->Enabled and in_array(ModuleCondition::Enabled, $Conditions)) or
    259           (!$Module->Enabled and in_array(ModuleCondition::NotEnabled, $Conditions)) or
    260           ($Module->Installed and in_array(ModuleCondition::Installed, $Conditions)) or
    261           (!$Module->Installed and in_array(ModuleCondition::NotInstalled, $Conditions))))
    262       {
    263         array_push($List, $RefModule);
    264         $this->EnumSuperiorDependenciesCascade($RefModule, $List, $Conditions);
    265       }
    266     }
    267   }
    268 
    269   function Start()
    270   {
    271     $this->LoadModules();
    272     if (file_exists($this->FileName)) $this->LoadState();
    273     $this->StartEnabled();
    274   }
    275 
    276   function StartAll()
    277   {
    278     $this->Perform($this->Modules, array(ModuleAction::Start));
    279   }
    280 
    281   function StartEnabled()
    282   {
    283     $this->Perform($this->Modules, array(ModuleAction::Start), array(ModuleCondition::Enabled));
    284   }
    285 
    286   function StopAll()
    287   {
    288     $this->Perform($this->Modules, array(ModuleAction::Stop));
    289   }
    290 
    291   function InstallAll()
    292   {
    293     $this->Perform($this->Modules, array(ModuleAction::Install));
    294     $this->SaveState();
    295   }
    296 
    297   function UninstallAll()
    298   {
    299     $this->Perform($this->Modules, array(ModuleAction::Uninstall));
    300     $this->SaveState();
    301   }
    302 
    303   function EnableAll()
    304   {
    305     $this->Perform($this->Modules, array(ModuleAction::Enable));
    306     $this->SaveState();
    307   }
    308 
    309   function DisableAll()
    310   {
    311     $this->Perform($this->Modules, array(ModuleAction::Disable));
    312     $this->SaveState();
    313   }
    314 
    315   function ModulePresent($Name)
    316   {
    317     return array_key_exists($Name, $this->Modules);
    318   }
    319 
    320   function ModuleEnabled($Name)
    321   {
    322     return array_key_exists($Name, $this->Modules) and $this->Modules[$Name]->Enabled;
    323   }
    324 
    325   function ModuleRunning($Name)
    326   {
    327     return array_key_exists($Name, $this->Modules) and $this->Modules[$Name]->Running;
    328   }
    329 
    330   /* @return Module */
    331   function SearchModuleById($Id)
    332   {
    333     foreach ($this->Modules as $Module)
    334     {
    335       //DebugLog($Module->Name.' '.$Module->Id);
    336       if ($Module->Id == $Id) return $Module->Name;
    337     }
    338     return '';
    339   }
    340 
    341   function LoadState()
    342   {
    343     $ConfigModules = array();
    344     include($this->FileName);
    345     foreach ($ConfigModules as $Mod)
    346     {
    347       if (array_key_exists($Mod['Name'], $this->Modules))
    348       {
    349         $this->Modules[$Mod['Name']] = $this->Modules[$Mod['Name']];
    350         $this->Modules[$Mod['Name']]->Enabled = $Mod['Enabled'];
    351         $this->Modules[$Mod['Name']]->Installed = $Mod['Installed'];
    352         $this->Modules[$Mod['Name']]->InstalledVersion = $Mod['Version'];
    353       }
    354     }
    355   }
    356 
    357   function SaveState()
    358   {
    359     $Data = array();
    360     foreach ($this->Modules as $Module)
    361     {
    362       $Data[] = array('Name' => $Module->Name, 'Enabled' => $Module->Enabled,
    363         'Version' => $Module->Version, 'Installed' => $Module->Installed);
    364     }
    365     file_put_contents($this->FileName, "<?php \n\n\$ConfigModules = ".var_export($Data, true).";\n");
    366   }
    367 
    368   function RegisterModule(AppModule $Module)
    369   {
    370     $this->Modules[$Module->Name] = &$Module;
    371     $Module->Manager = &$this;
    372     $Module->OnChange = &$this->OnModuleChange;
    373   }
    374 
    375   function UnregisterModule(AppModule $Module)
    376   {
    377     unset($this->Modules[array_search($Module, $this->Modules)]);
    378   }
    379 
    380   function LoadModulesFromDir($Directory)
    381   {
    382     $List = scandir($Directory);
    383     foreach ($List as $Item)
    384     {
    385       if (is_dir($Directory.'/'.$Item) and ($Item != '.') and ($Item != '..') and ($Item != '.svn'))
    386       {
    387         include_once($Directory.'/'.$Item.'/'.$Item.'.php');
    388         $ModuleName = 'Module'.$Item;
    389         $this->RegisterModule(new $ModuleName($this->System));
    390       }
    391     }
    392   }
    393 
    394   function LoadModules(): void
    395   {
    396     if (is_array($this->OnLoadModules) and (count($this->OnLoadModules) == 2) and method_exists($this->OnLoadModules[0], $this->OnLoadModules[1]))
    397       call_user_func($this->OnLoadModules);
    398     else $this->LoadModulesFromDir($this->ModulesDir);
    399   }
    400 }
     262}
  • trunk/Packages/Common/Modules/Setup.php

    r887 r888  
    11<?php
     2
     3class ModuleSetup extends Module
     4{
     5  public UpdateManager $UpdateManager;
     6
     7  function __construct(System $System)
     8  {
     9    global $DatabaseRevision;
     10
     11    parent::__construct($System);
     12    $this->Name = 'Setup';
     13    $this->Version = '1.0';
     14    $this->Creator = 'Chronos';
     15    $this->License = 'GNU/GPLv3';
     16    $this->Description = 'Base setup module';
     17    $this->Revision = 1;
     18    $this->Type = ModuleType::System;
     19
     20    // Check database persistence structure
     21    $this->UpdateManager = new UpdateManager();
     22    $this->UpdateManager->Database = &$this->Database;
     23    $this->UpdateManager->Revision = $DatabaseRevision;
     24    $this->UpdateManager->InstallMethod = 'FullInstall';
     25  }
     26
     27  static function Cast(Module $Module): ModuleSetup
     28  {
     29    if ($Module instanceof ModuleSetup)
     30    {
     31      return $Module;
     32    }
     33    throw new Exception('Expected ModuleSetup type but '.gettype($Module));
     34  }
     35
     36  function DoStart(): void
     37  {
     38    Core::Cast($this->System)->RegisterPage([''], 'PageSetupRedirect');
     39    Core::Cast($this->System)->RegisterPage(['setup'], 'PageSetup');
     40  }
     41
     42  function DoStop(): void
     43  {
     44    unset($this->UpdateManager);
     45    Core::Cast($this->System)->UnregisterPage(['']);
     46    Core::Cast($this->System)->UnregisterPage(['setup']);
     47  }
     48
     49  function CheckState(): bool
     50  {
     51    return $this->Database->Connected() and $this->UpdateManager->IsInstalled() and
     52      $this->UpdateManager->IsUpToDate();
     53  }
     54
     55  function DoUpgrade(): string
     56  {
     57    $Updates = new Updates();
     58    $this->UpdateManager->Trace = $Updates->Get();
     59    $Output = $this->UpdateManager->Upgrade();
     60    return $Output;
     61  }
     62}
    263
    364class PageSetup extends Page
    465{
    5   var $UpdateManager;
    6   var $ConfigDefinition;
    7   var $Config;
    8   var $DatabaseRevision;
    9   var $Revision;
    10   var $Updates;
    11   var $ConfigDir;
    12 
    13   function __construct($System)
     66  public UpdateManager $UpdateManager;
     67  public array $ConfigDefinition;
     68  public array $Config;
     69  public int $DatabaseRevision;
     70  public int $Revision;
     71  public string $ConfigDir;
     72  public array $YesNo;
     73
     74  function __construct(System $System)
    1475  {
    1576    parent::__construct($System);
    1677    $this->Title = T('Application setup');
    17     //$this->ParentClass = 'PagePortal';
     78    //$this->ParentClass = 'PageSetupRedirect';
    1879    $this->ConfigDir = dirname(dirname(dirname(__FILE__))).'/Config';
    1980    $this->YesNo = array(false => T('No'), true => T('Yes'));
    2081  }
    2182
    22   function LoginPanel()
     83  function LoginPanel(): string
    2384  {
    2485    $Output = '<h3>Přihlášení k instalaci</h3>'.
     
    3293  }
    3394
    34   function ControlPanel()
     95  function ControlPanel(): string
    3596  {
    3697    $Output = '<h3>'.T('Instance management').'</h3>';
     
    49110          $Output .= '<a href="?action=upgrade">'.T('Upgrade').'</a> ';
    50111        $Output .= '<a href="?action=insert_sample_data">Vložit vzorová data</a> ';
    51         $Output .= '<a href="?action=reload_modules">Obnovit seznam modulů</a> ';
     112        $Output .= '<a href="?action=reload-modules">Obnovit seznam modulů</a> ';
    52113        $Output .= '<a href="?action=uninstall">Odinstalovat</a> ';
    53         $Output .= '<a href="?action=modules">Správa modulů</a> ';
     114        $Output .= '<a href="'.$this->System->Link('/modules/').'">Správa modulů</a> ';
    54115        $Output .= '<a href="?action=models">Přegenerovat modely</a> ';
    55116      } else $Output .= '<a href="?action=install">Instalovat</a> ';
     
    62123  }
    63124
    64   function Show()
     125  function Show(): string
    65126  {
    66127    global $ConfigDefinition, $DatabaseRevision, $Config, $Updates;
    67128
    68     $this->UpdateManager = $this->System->Setup->UpdateManager;
     129    $this->UpdateManager = ModuleSetup::Cast($this->System->GetModule('Setup'))->UpdateManager;
    69130    $DefaultConfig = new DefaultConfig();
    70131    $this->ConfigDefinition = $DefaultConfig->Get();
     
    89150          $Output .= 'Odhlášen';
    90151          $Output .= $this->LoginPanel();
    91         } else
    92         if ($Action == 'models')
     152        }
     153        else if ($Action == 'models')
    93154        {
    94155          $this->System->FormManager->UpdateSQLMeta();
    95         } else
    96         if ($Action == 'upgrade')
     156        }
     157        else if ($Action == 'upgrade')
    97158        {
    98159          $Output .= '<h3>Povýšení</h3>';
    99           try {
    100             $Output .= $this->System->Setup->Upgrade();
    101           } catch (Exception $E) {
     160          try
     161          {
     162            $Output .= ModuleSetup::Cast($this->System->GetModule('Setup'))->DoUpgrade();
     163            $this->System->ModuleManager->UpgradeAll(array(ModuleCondition::System));
     164          } catch (Exception $E)
     165          {
    102166            $Output .= $this->SystemMessage('Chyba aktualizace',
    103167              'Došlo k chybě v SQL dotazu při aktualizaci: <br/>'.$E->getMessage());
    104168          }
    105169          $Output .= $this->ControlPanel();
    106         } else
    107         if ($Action == 'install')
    108         {
    109           $Output .= '<h3>Instalace</h3>';
    110           $this->System->Setup->Install();
     170        }
     171        else if ($Action == 'install')
     172        {
     173          $Output .= '<h3>Instalace systém</h3>';
     174          global $DatabaseRevision;
     175
     176          $this->Database->query("CREATE TABLE IF NOT EXISTS `".$this->UpdateManager->VersionTable."` (".
     177            '`Id` int(11) NOT NULL AUTO_INCREMENT, '.
     178            '`Revision` int(11) NOT NULL, '.
     179            'PRIMARY KEY (`Id`) '.
     180            ') ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;');
     181          $DbResult = $this->Database->select($this->UpdateManager->VersionTable, 'Id');
     182          if ($DbResult->num_rows == 0)
     183          {
     184            $this->Database->query("INSERT INTO `".$this->UpdateManager->VersionTable.
     185              "` (`Id`, `Revision`) VALUES (1, ".$DatabaseRevision.");");
     186          }
     187          $this->System->ModuleManager->InstallAll(array(ModuleCondition::System));
    111188          $this->System->ModuleManager->LoadModules();
    112189          $this->System->ModuleManager->SaveState();
    113           //$Output .= $this->System->Setup->Upgrade();
    114           $Output .= $this->ControlPanel();
    115         } else
    116         if ($Action == 'uninstall')
    117         {
    118           $Output .= '<h3>Odinstalace</h3>';
    119           $this->System->Setup->Uninstall();
    120           $Output .= $this->ControlPanel();
    121         } else
    122         if ($Action == 'reload_modules')
     190          //$Output .= ModuleSetup::Cast($this->System->GetModule('Setup'))->Upgrade();
     191          $Output .= $this->ControlPanel();
     192        }
     193        else if ($Action == 'uninstall')
     194        {
     195          $Output .= '<h3>Odinstalace vše</h3>';
     196          $this->System->ModuleManager->UninstallAll(array(ModuleCondition::All));
     197          $this->Database->query('DROP TABLE IF EXISTS `'.$this->UpdateManager->VersionTable.'`');
     198          $Output .= $this->ControlPanel();
     199        }
     200        else if ($Action == 'reload-modules')
    123201        {
    124202          $Output .= '<h3>Znovunačtení seznamu modulů</h3>';
     
    126204          $this->System->ModuleManager->SaveState();
    127205          $Output .= $this->ControlPanel();
    128         } else
    129         if ($Action == 'insert_sample_data')
     206        }
     207        else if ($Action == 'insert_sample_data')
    130208        {
    131209          $Output .= '<h3>Vložení vzorových dat</h3>';
    132           $this->System->Setup->InsertSampleData();
    133           $Output .= $this->ControlPanel();
    134         } else
    135         if ($Action == 'modules')
    136         {
    137           $Output .= $this->ShowModules();
    138         } else
    139         if ($Action == 'configure_save')
     210          $this->System->ModuleManager->Perform(array(ModuleAction::InsertSampleData), array(ModuleCondition::Installed));
     211          $Output .= $this->ControlPanel();
     212        }
     213        else if ($Action == 'configure_save')
    140214        {
    141215           $Output .= $this->ConfigSave($this->Config);
    142216           $Output .= $this->ControlPanel();
    143         } else
    144         if ($Action == 'configure')
     217        }
     218        else if ($Action == 'configure')
    145219        {
    146220          $Output .= $this->PrepareConfig($this->Config);
    147         } else
     221        }
     222        else
    148223        {
    149224          $Output .= $this->ControlPanel();
     
    163238  }
    164239
    165   function ShowModules()
    166   {
    167     $Output = '';
    168     if (array_key_exists('op', $_GET)) $Operation = $_GET['op'];
    169       else $Operation = '';
    170     if ($Operation == 'install')
    171     {
    172       $this->System->ModuleManager->Modules[$_GET['name']]->Install();
    173       $this->System->ModuleManager->SaveState();
    174       $Output .= 'Modul '.$_GET['name'].' instalován<br/>';
    175     } else
    176     if ($Operation == 'uninstall')
    177     {
    178       $this->System->ModuleManager->Modules[$_GET['name']]->Uninstall();
    179       $this->System->ModuleManager->SaveState();
    180       $Output .= 'Modul '.$_GET['name'].' odinstalován<br/>';
    181     } else
    182     if ($Operation == 'enable')
    183     {
    184       $this->System->ModuleManager->Modules[$_GET['name']]->Enable();
    185       $this->System->ModuleManager->SaveState();
    186       $Output .= 'Modul '.$_GET['name'].' povolen<br/>';
    187     } else
    188     if ($Operation == 'disable')
    189     {
    190       $this->System->ModuleManager->Modules[$_GET['name']]->Disable();
    191       $this->System->ModuleManager->SaveState();
    192       $Output .= 'Modul '.$_GET['name'].' zakázán<br/>';
    193     } else
    194     if ($Operation == 'upgrade')
    195     {
    196       $this->System->ModuleManager->Modules[$_GET['name']]->Upgrade();
    197       $this->System->ModuleManager->SaveState();
    198       $Output .= 'Modul '.$_GET['name'].' povýšen<br/>';
    199     }
    200     $Output .= '<h3>Správa modulů</h3>';
    201     $Output .= $this->ShowList();
    202     return $Output;
    203   }
    204 
    205   function ShowList()
    206   {
    207     $Output = '';
    208 
    209     $Pageing = new Paging();
    210     $Pageing->TotalCount = count($this->System->ModuleManager->Modules);
    211     $Table = new VisualTable();
    212     $Table->SetColumns(array(
    213       array('Name' => 'Name', 'Title' => 'Jméno'),
    214       array('Name' => 'Creator', 'Title' => 'Tvůrce'),
    215       array('Name' => 'Version', 'Title' => 'Verze'),
    216       array('Name' => 'License', 'Title' => 'Licence'),
    217       array('Name' => 'Installed', 'Title' => 'Instalováno'),
    218       array('Name' => 'Enabled', 'Title' => 'Povoleno'),
    219       array('Name' => 'Description', 'Title' => 'Popis'),
    220       array('Name' => 'Dependencies', 'Title' => 'Závislosti'),
    221       array('Name' => '', 'Title' => 'Akce'),
    222     ));
    223     foreach ($this->System->ModuleManager->Modules as $Module)
    224     {
    225       if (($Module->Dependencies) > 0) $Dependencies = implode(',', $Module->Dependencies);
    226        else $Dependencies = '&nbsp;';
    227       $Actions = '';
    228       if ($Module->Installed == true)
    229       {
    230         $Actions .= ' <a href="?action=modules&amp;op=uninstall&amp;name='.$Module->Name.'">Odinstalovat</a>';
    231         if ($Module->Enabled == true) $Actions .= ' <a href="?action=modules&amp;op=disable&amp;name='.$Module->Name.'">Zakázat</a>';
    232         else $Actions .= ' <a href="?action=modules&amp;op=enable&amp;name='.$Module->Name.'">Povolit</a>';
    233         if ($Module->InstalledVersion != $Module->Version) $Actions .= ' <a href="?action=modules&amp;op=upgrade&amp;name='.$Module->Name.'">Povýšit</a>';
    234       } else $Actions .= ' <a href="?action=modules&amp;op=install&amp;name='.$Module->Name.'">Instalovat</a>';
    235 
    236       $Table->Table->Cells[] = array($Module->Name,
    237         $Module->Creator, $Module->Version,
    238         $Module->License, $this->YesNo[$Module->Installed],
    239         $this->YesNo[$Module->Enabled], $Module->Description,
    240         $Dependencies, $Actions);
    241     }
    242     $Output .= $Pageing->Show();
    243     $Output .= $Table->Show();
    244     $Output .= $Pageing->Show();
    245     //$Output .= '<p><a href="?A=SaveToDb">Uložit do databáze</a></p>';
    246     return $Output;
    247   }
    248 
    249   function PrepareConfig($Config)
     240  function PrepareConfig($Config): string
    250241  {
    251242    $Output = '';
     
    255246      $Output .= 'Varování: Konfigurační soubor nebude možné zapsat, protože soubor "'.$this->ConfigDir.'/Config.php" není povolen pro zápis!';
    256247    $Output .= '<h3>Nastavení systému</h3>'.
    257         '<form action="?action=configure_save" method="post">'.
    258         '<table>';
     248      '<form action="?action=configure_save" method="post">'.
     249      '<table>';
    259250    foreach ($this->ConfigDefinition as $Def)
    260251    {
     
    278269    }
    279270    $Output .= '</td></tr>'.
    280         '<tr><td colspan="2"><input type="submit" name="configure_save" value="'.T('Save').'"/></td></tr>'.
    281         '</table>'.
    282         '</form>';
     271      '<tr><td colspan="2"><input type="submit" name="configure_save" value="'.T('Save').'"/></td></tr>'.
     272      '</table>'.
     273      '</form>';
    283274    return $Output;
    284275  }
     
    322313  }
    323314
    324   function CreateConfig($Config)
     315  function CreateConfig($Config): string
    325316  {
    326317    $Output = "<?php\n\n".
     
    359350class PageSetupRedirect extends Page
    360351{
    361   function Show()
     352  function Show(): string
    362353  {
    363354    $Output = '';
    364     if (!$this->Database->Connected()) $Output .= T('Can\'t connect to database').'<br>';
    365     else {
    366       if (!$this->System->Setup->UpdateManager->IsInstalled())
    367         $Output .= T('System requires database initialization').'<br>';
    368       else
    369       if (!$this->System->Setup->UpdateManager->IsUpToDate())
    370         $Output .= T('System requires database upgrade').'<br>';
    371     }
    372     $Output .= sprintf(T('Front page was not configured. Continue to %s'), '<a href="'.$this->System->Link('/setup/').'">'.T('setup').'</a>');
     355    if (!$this->Database->Connected())
     356    {
     357      $Output .= T('Can\'t connect to database.').'<br>';
     358    } else
     359    {
     360      if (!ModuleSetup::Cast($this->System->GetModule('Setup'))->UpdateManager->IsInstalled())
     361      {
     362        $Output .= T('System requires database initialization.').'<br>';
     363      } else
     364      if (!ModuleSetup::Cast($this->System->GetModule('Setup'))->UpdateManager->IsUpToDate())
     365      {
     366        $Output .= T('System requires database upgrade.').'<br>';
     367      }
     368    }
     369    $Output .= sprintf(T('Front page was not configured. Continue to %s.'), '<a href="'.$this->System->Link('/setup/').'">'.T('setup').'</a>');
    373370    return $Output;
    374371  }
    375372}
    376 
    377 class Setup extends Model
    378 {
    379   var $UpdateManager;
    380 
    381   function Start()
    382   {
    383     global $DatabaseRevision;
    384 
    385     $this->System->RegisterPage('', 'PageSetupRedirect');
    386     $this->System->RegisterPage('setup', 'PageSetup');
    387 
    388     // Check database persistence structure
    389     $this->UpdateManager = new UpdateManager();
    390     $this->UpdateManager->Database = &$this->Database;
    391     $this->UpdateManager->Revision = $DatabaseRevision;
    392     $this->UpdateManager->InstallMethod = 'FullInstall';
    393   }
    394 
    395   function Stop()
    396   {
    397     unset($this->UpdateManager);
    398     $this->System->UnregisterPage('');
    399     $this->System->UnregisterPage('setup');
    400   }
    401 
    402   function CheckState()
    403   {
    404     return $this->Database->Connected() and $this->UpdateManager->IsInstalled() and
    405       $this->UpdateManager->IsUpToDate();
    406   }
    407 
    408   function Install()
    409   {
    410     global $DatabaseRevision;
    411 
    412     $this->Database->query('CREATE TABLE IF NOT EXISTS `'.$this->UpdateManager->VersionTable.'` (
    413   `Id` int(11) NOT NULL AUTO_INCREMENT,
    414   `Revision` int(11) NOT NULL,
    415   PRIMARY KEY (`Id`)
    416 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;');
    417     $this->Database->query('INSERT INTO `'.$this->UpdateManager->VersionTable.'` (`Id`, `Revision`) VALUES
    418       (1, '.$DatabaseRevision.');');
    419     $this->Database->query("CREATE TABLE IF NOT EXISTS `Module` (
    420   `Id` int(11) NOT NULL AUTO_INCREMENT,
    421   `Name` varchar(255) NOT NULL,
    422   `Title` varchar(255) NOT NULL,
    423   PRIMARY KEY (`Id`)
    424 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;");
    425   }
    426 
    427   function Uninstall()
    428   {
    429     $this->System->ModuleManager->UninstallAll();
    430     $this->Database->query('DROP TABLE `Module`');
    431     $this->Database->query('DROP TABLE `'.$this->UpdateManager->VersionTable.'`');
    432   }
    433 
    434   function IsInstalled()
    435   {
    436     $DbResult = $this->Database->query('SHOW TABLES LIKE "'.$this->UpdateManager->VersionTable.'"');
    437     return $DbResult->num_rows > 0;
    438   }
    439 
    440   function Upgrade()
    441   {
    442     $Updates = new Updates();
    443     $this->UpdateManager->Trace = $Updates->Get();
    444     $Output = $this->UpdateManager->Upgrade();
    445     return $Output;
    446   }
    447 }
  • trunk/Packages/Common/NetworkAddress.php

    r880 r888  
    11<?php
     2
     3define('IPV4_BIT_WIDTH', 32);
    24
    35class NetworkAddressIPv4
    46{
    5   var $Address;
    6   var $Prefix;
     7  public int $Address;
     8  public int $Prefix;
    79
    810  function __construct()
     
    1214  }
    1315
    14   function GetNetMask()
     16  function GetNetMask(): int
    1517  {
    16     return 0xffffffff ^ ((1 << (32 - $this->Prefix)) - 1);
     18    return ((1 << IPV4_BIT_WIDTH) - 1) ^ ((1 << (IPV4_BIT_WIDTH - $this->Prefix)) - 1);
    1719  }
    1820
    19   function AddressToString()
     21  function AddressToString(): string
    2022  {
    2123    return implode('.', array(($this->Address >> 24) & 255, ($this->Address >> 16) & 255, ($this->Address >> 8) & 255, ($this->Address & 255)));
    2224  }
    2325
    24   function AddressFromString($Value)
     26  function AddressFromString(string $Value): void
    2527  {
    2628    $Parts = explode('.', $Value);
     
    2830  }
    2931
    30   function GetRange()
     32  function GetRange(): array
    3133  {
    3234    $From = new NetworkAddressIPv4();
    3335    $From->Address = $this->Address;
    34     $From->Prefix = 32;
     36    $From->Prefix = IPV4_BIT_WIDTH;
    3537    $HostMask = 0xffffffff ^ $this->GetNetMask();
    3638    $To = new NetworkAddressIPv4();
    3739    $To->Address = $From->Address + $HostMask;
    38     $To->Prefix = 32;
     40    $To->Prefix = IPV4_BIT_WIDTH;
    3941    return array('From' => $From, 'To' => $To);
    4042  }
    4143
    42   function ChangePrefix($NewPrefix)
     44  function ChangePrefix(int $NewPrefix): void
    4345  {
    4446    $this->Prefix = $NewPrefix;
    45     if ($this->Prefix > 32) $this->Prefix = 32;
     47    if ($this->Prefix > IPV4_BIT_WIDTH) $this->Prefix = IPV4_BIT_WIDTH;
    4648    if ($this->Prefix < 0) $this->Prefix = 0;
    4749    $this->Address = $this->Address & $this->GetNetMask();
    4850  }
    4951
    50   function Contain($Address)
     52  function Contain(NetworkAddressIPv4 $Address): bool
    5153  {
    5254    $UpperNetmask = $this->GetNetMask();
    5355    if (($this->Prefix < $Address->Prefix) and (($Address->Address & $UpperNetmask) == ($this->Address & $UpperNetmask))) $Result = true;
    5456      else $Result = false;
    55     //echo($Address->AddressToString().'/'.$Address->Prefix.' in '.$this->AddressToString().'/'.$this->Prefix.' '.$Result."\n");
    5657    return $Result;
    5758  }
    5859}
    5960
     61define('IPV6_BIT_WIDTH', 128);
     62
    6063class NetworkAddressIPv6
    6164{
    62   var $Address;
    63   var $Prefix;
     65  public string $Address;
     66  public int $Prefix;
    6467
    6568  function __construct()
     
    6972  }
    7073
    71   function AddressToString()
     74  function GetNetMask(): string
     75  {
     76    return Int128Xor(Int128Sub(Int128Shl(IntToInt128(1), IntToInt128(IPV6_BIT_WIDTH)), IntToInt128(1)),
     77      Int128Sub(Int128Shl(IntToInt128(1), IntToInt128(IPV6_BIT_WIDTH - $this->Prefix)), IntToInt128(1)));
     78  }
     79
     80  function AddressToString(): string
    7281  {
    7382    return inet_ntop($this->Address);
    7483  }
    7584
    76   function AddressFromString($Value)
     85  function AddressFromString(string $Value)
    7786  {
    7887    $this->Address = inet_pton($Value);
    7988  }
    8089
    81   function GetOctets()
     90  function ChangePrefix(int $NewPrefix): void
     91  {
     92    $this->Prefix = $NewPrefix;
     93    if ($this->Prefix > IPV6_BIT_WIDTH) $this->Prefix = IPV6_BIT_WIDTH;
     94    if ($this->Prefix < 0) $this->Prefix = 0;
     95    $this->Address = Int128And($this->Address, $this->GetNetMask());
     96  }
     97
     98  function GetOctets(): array
    8299  {
    83100    $Result = array();
     
    85102    foreach ($Data as $Item)
    86103    {
    87 
    88104      $Result[] = dechex($Item & 15);
    89105      $Result[] = dechex(($Item >> 4) & 15);
     
    92108  }
    93109
    94   function EncodeMAC($MAC)
     110  function EncodeMAC(string $MAC): void
    95111  {
    96112    $MAC = explode(':', $MAC);
     
    107123  }
    108124
     125  function Contain(NetworkAddressIPv6 $Address): bool
     126  {
     127    $UpperNetmask = $this->GetNetMask();
     128    if (($this->Prefix < $Address->Prefix) and ((Int128Equal(Int128And($Address->Address, $UpperNetmask), Int128And($this->Address, $UpperNetmask))))) $Result = true;
     129      else $Result = false;
     130    return $Result;
     131  }
    109132}
  • trunk/Packages/Common/Page.php

    r880 r888  
    33class Page extends View
    44{
    5   var $Title;
    6   var $ParentClass;
    7   var $RawPage;
    8   var $OnSystemMessage;
     5  public string $Title;
     6  public string $Description;
     7  public string $ParentClass;
     8  public bool $RawPage;
     9  public $OnSystemMessage;
     10  public string $Load;
     11  public string $Unload;
    912
    1013  function __construct(System $System)
     
    1316    $this->RawPage = false;
    1417    $this->OnSystemMessage = array();
     18    $this->Title = "";
     19    $this->Description = "";
     20    $this->ParentClass = "";
    1521  }
    1622
    17   function Show()
     23  function Show(): string
    1824  {
    1925    return '';
    2026  }
    2127
    22   function GetOutput()
     28  function GetOutput(): string
    2329  {
    2430    $Output = $this->Show();
     
    2632  }
    2733
    28   function SystemMessage($Title, $Text)
     34  function SystemMessage(string $Title, string $Text): string
    2935  {
    3036    return call_user_func_array($this->OnSystemMessage, array($Title, $Text));
  • trunk/Packages/Common/PrefixMultiplier.php

    r880 r888  
    7272class PrefixMultiplier
    7373{
    74   function TruncateDigits($Value, $Digits = 4)
     74  function TruncateDigits($Value, $Digits = 4): string
    7575  {
    7676    for ($II = 2; $II > -6; $II--)
     
    8787  }
    8888
    89   function Add($Value, $Unit, $Digits = 4, $PrefixType = 'Decimal')
     89  function Add($Value, $Unit, $Digits = 4, $PrefixType = 'Decimal'): string
    9090  {
    9191    global $PrefixMultipliers;
  • trunk/Packages/Common/RSS.php

    r880 r888  
    33class RSS
    44{
    5   var $Charset;
    6   var $Title;
    7   var $Link;
    8   var $Description;
    9   var $WebmasterEmail;
    10   var $Items;
     5  public string $Charset;
     6  public string $Title;
     7  public string $Link;
     8  public string $Description;
     9  public string $WebmasterEmail;
     10  public array $Items;
    1111
    1212  function __construct()
    1313  {
    1414    $this->Charset = 'utf8';
     15    $this->Title = '';
     16    $this->Link = '';
     17    $this->Description = '';
     18    $this->WebmasterEmail = '';
    1519    $this->Items = array();
    1620  }
    1721
    18   function Generate()
     22  function Generate(): string
    1923  {
    2024    $Result = '<?xml version="1.0" encoding="'.$this->Charset.'" ?>'."\n". //<?
  • trunk/Packages/Common/Table.php

    r880 r888  
    33class Control
    44{
    5   var $Name;
     5  public string $Name;
    66
    7   function Show()
     7  function Show(): string
    88  {
    99    return '';
     
    1313class Table
    1414{
    15   function GetCell($Y, $X)
     15  function GetCell($Y, $X): string
    1616  {
    1717    return '';
     
    2626  }
    2727
    28   function RowsCount()
     28  function RowsCount(): int
    2929  {
    3030    return 0;
     
    3434class TableMemory extends Table
    3535{
    36   var $Cells;
     36  public array $Cells;
    3737
    38   function GetCell($Y, $X)
     38  function GetCell($Y, $X): string
    3939  {
    4040    return $this->Cells[$Y][$X];
    4141  }
    4242
    43   function RowsCount()
     43  function RowsCount(): int
    4444  {
    4545    return count($this->Cells);
     
    4949class TableSQL extends Table
    5050{
    51   var $Query;
    52   var $Database;
    53   var $Cells;
     51  public string $Query;
     52  public Database $Database;
     53  public array $Cells;
    5454
    55   function GetCell($Y, $X)
     55  function GetCell($Y, $X): string
    5656  {
    5757    return $this->Cells[$Y][$X];
     
    7373  }
    7474
    75   function RowsCount()
     75  function RowsCount(): int
    7676  {
    7777    return count($this->Cells);
     
    8181class TableColumn
    8282{
    83   var $Name;
    84   var $Title;
     83  public string $Name;
     84  public string $Title;
    8585}
    8686
    8787class VisualTable extends Control
    8888{
    89   var $Cells;
    90   var $Columns;
    91   var $OrderSQL;
    92   var $OrderColumn;
    93   var $OrderDirection;
    94   var $OrderArrowImage;
    95   var $DefaultColumn;
    96   var $DefaultOrder;
    97   var $Table;
    98   var $Style;
     89  public array $Cells;
     90  public array $Columns;
     91  public string $OrderSQL;
     92  public string $OrderColumn;
     93  public int $OrderDirection;
     94  public array $OrderArrowImage;
     95  public string $DefaultColumn;
     96  public int $DefaultOrder;
     97  public TableMemory $Table;
     98  public string $Style;
    9999
    100100  function __construct()
     
    126126  }
    127127
    128   function Show()
     128  function Show(): string
    129129  {
    130130    $Output = '<table class="'.$this->Style.'">';
     
    148148  }
    149149
    150   function GetOrderHeader()
     150  function GetOrderHeader(): string
    151151  {
    152152    if (array_key_exists('OrderCol', $_GET)) $_SESSION['OrderCol'] = $_GET['OrderCol'];
  • trunk/Packages/Common/UTF8.php

    r887 r888  
    526526  }
    527527
    528   function ToUTF8($String, $Charset = 'iso2')
     528  function ToUTF8(string $String, string $Charset = 'iso2'): string
    529529  {
    530530    $Result = '';
     
    540540  }
    541541
    542   function FromUTF8($String, $Charset = 'iso2')
     542  function FromUTF8(string $String, string $Charset = 'iso2'): string
    543543  {
    544544    $Result = '';
  • trunk/Packages/Common/Update.php

    r880 r888  
    33class UpdateManager
    44{
    5   var $Revision;
    6   var $Trace;
    7   var $VersionTable;
    8   /* @var Database */
    9   var $Database;
    10   var $InstallMethod;
     5  public int $Revision;
     6  public array $Trace;
     7  public string $VersionTable;
     8  public Database $Database;
     9  public string $InstallMethod;
    1110
    1211  function __construct()
     
    1918  }
    2019
    21   function GetDbVersion()
     20  function GetDbVersion(): ?int
    2221  {
    2322    $DbResult = $this->Database->select($this->VersionTable, '*', 'Id=1');
     
    2625  }
    2726
    28   function IsInstalled()
     27  function IsInstalled(): bool
    2928  {
    3029    $DbResult = $this->Database->query('SHOW TABLES LIKE "'.$this->VersionTable.'"');
     
    3231  }
    3332
    34   function IsUpToDate()
     33  function IsUpToDate(): bool
    3534  {
    3635    return $this->Revision <= $this->GetDbVersion();
    3736  }
    3837
    39   function Upgrade()
     38  function Upgrade(): string
    4039  {
    4140    $DbRevision = $this->GetDbVersion();
     
    4342    while ($this->Revision > $DbRevision)
    4443    {
     44      if (!array_key_exists($DbRevision, $this->Trace))
     45        die('Missing upgrade trace for revision '.$DbRevision);
    4546      $TraceItem = $this->Trace[$DbRevision];
    4647      $Output .= 'Aktualizace na verzi '.$TraceItem['Revision'].':<br/>';
     
    5758  }
    5859
    59   function Install()
     60  function Install(): void
    6061  {
    6162    $InstallMethod = $this->InstallMethod;
    6263    $InstallMethod($this);
    63     $this->Update();
    6464  }
    6565
    66   function Uninstall()
     66  function Uninstall(): void
    6767  {
    68 
    6968  }
    7069
    71   function InsertSampleData()
     70  function InsertSampleData(): void
    7271  {
    7372    $InstallMethod = $this->InsertSampleDataMethod;
     
    7574  }
    7675
    77   function Execute($Query)
     76  function Execute(string $Query): DatabaseResult
    7877  {
    7978    echo($Query.';<br/>');
Note: See TracChangeset for help on using the changeset viewer.