clrghouz/app/Classes/FTN/Packet/FSC45.php

101 lines
2.9 KiB
PHP

<?php
namespace App\Classes\FTN\Packet;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use App\Classes\FTN\Packet;
use App\Models\Setup;
/**
* FSC-0045 http://ftsc.org/docs/fsc-0045.001
*
* Commonly known as Type 2.2 packets
* Supports 5D addressing
*/
final class FSC45 extends Packet
{
protected const HEADER = [
'onode' => [0x00,'v',2], // Orig Node
'dnode' => [0x02,'v',2], // Dest Node
'opoint' => [0x04,'v',2], // Orig Point
'dpoint' => [0x06,'v',2], // Dest Point
'reserved' => [0x08,'a8',8], // Reserved
'subver' => [0x10,'v',2], // Sub Version (should be 2)
'type' => [0x12,'v',2], // Packet Version (should be 2)
'onet' => [0x14,'v',2], // Orig Net
'dnet' => [0x16,'v',2], // Dest Net
'prodcode' => [0x18,'C',1], // Product Code
'prodrev-maj' => [0x19,'C',1], // Product Version
'password' => [0x1a,'a8',8], // Packet Password
'ozone' => [0x22,'v',2], // Orig Zone
'dzone' => [0x24,'v',2], // Dest Zone
'odomain' => [0x26,'a8',8], // Orig Domain
'ddomain' => [0x2e,'a8',8], // Dest Domain
'proddata' => [0x36,'a4',4], // ProdData
];
public const TYPE = '2.2';
public function __get($key)
{
switch ($key) {
case 'product':
return Arr::get($this->header,'prodcode');
case 'software_ver':
return Arr::get($this->header,'prodrev-maj');
default:
return parent::__get($key);
}
}
/**
* Create our message packet header
*/
protected function header(Collection $msgs): string
{
return pack(collect(self::HEADER)->pluck(1)->join(''),
$this->fftn_p->node_id, // Orig Node
$this->tftn_p->node_id, // Dest Node
$this->fftn_p->point_id, // Orig Point
$this->tftn_p->point_id, // Dest Point
'', // Reserved
2, // Sub Version (should be 2)
2, // Packet Version (should be 2)
$this->fftn_p->host_id, // Orig Net
$this->tftn_p->host_id, // Dest Net
(Setup::PRODUCT_ID & 0xff), // Product Code
Setup::PRODUCT_VERSION_MAJ, // Product Version
$this->pass_p ?: $this->tftn_p->pass_packet, // Packet Password
$this->fftn_p->zone->zone_id, // Orig Zone
$this->tftn_p->zone->zone_id, // Dest Zone
$this->fftn_p->zone->domain->name, // Orig Domain
$this->tftn_p->zone->domain->name, // Dest Domain
strtoupper(hexstr(Setup::PRODUCT_ID)), // ProdData
);
}
/**
* Determine if this is a fsc-0045 packet
*
* @param string $header
* @return bool
* @throws \Exception
*/
public static function is_type(string $header): bool
{
$head = unpack(self::unpackheader(self::HEADER),$header);
return (
(Arr::get($head,'type') === 2)
&& ((Arr::get($head,'opoint') === 0) || (Arr::get($head,'onet') !== 0xffff))
&& (strlen(rtrim(Arr::get($head,'reserved'),"\x00")) === 0)
&& (Arr::get($head,'subver') === 2)
&& (Arr::get($head,'odomain'))
&& (Arr::get($head,'ddomain'))
);
}
}