107 lines
3.4 KiB
PHP
107 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Classes\File;
|
|
|
|
use Illuminate\Support\Collection;
|
|
|
|
/**
|
|
* A file we are sending or receiving
|
|
*
|
|
* For sending, we have sub types of Mail (Netmail/Echomail) and Files (File & TIC)
|
|
* When sending, we can queue up a list of items, and mark one active (the one being sent) at a time.
|
|
*
|
|
* + Netmail/Echomail/TIC
|
|
* + name is dynamically calculated, based on timew() of the youngest item in the mail bundle
|
|
* + size is dynamically calculated based on the size of the bundle
|
|
* + mtime is dynamically calculated, based on the age of the youngest item
|
|
* + sendas (nameas) is name + [.pkt|.tic]
|
|
*
|
|
* = Need to know the DB ID for the items being sent, so as to mark them sent
|
|
*
|
|
* + Files
|
|
* + name is the full path file name
|
|
* + size is the file size
|
|
* + mtime is the file mtime
|
|
* + sendas (nameas) is filename only
|
|
*
|
|
* For receiving, we just received files, and based on its name, we determine if it is a mail/file/tic or request
|
|
* When receiving, we receive one file at a time, and our list has the list of files we've received
|
|
*
|
|
* + name our name (including path) with the address ID prefixed of the sender
|
|
* + size is advised to us by the remote
|
|
* + mtime is advised to us by the remote
|
|
* + receiveas (nameas) advised to us by the remote
|
|
*
|
|
* @property string $name The (full path) name of the file we are sending or receiving
|
|
* @property string $nameas The name as we communicate with the remote
|
|
* @property int $mtime The date/time timestamp of the item we are sending or receiving
|
|
* @property int $pos Our counter of where we have read to when sending
|
|
* @property int $size The size of the item we are sending or receiving
|
|
*/
|
|
abstract class Base
|
|
{
|
|
private const LOGKEY = 'I--';
|
|
|
|
// @todo MAX_COMPSIZE hasnt been implemented in RECEIVE OR SEND
|
|
/** @var int max size of file to use compression */
|
|
protected const MAX_COMPSIZE = 0x1fff;
|
|
|
|
// 4 BITS of type
|
|
protected const IS_FILE = (1<<0);
|
|
public const IS_PKT = (1<<1);
|
|
protected const IS_ARC = (1<<2);
|
|
protected const IS_REQ = (1<<3);
|
|
protected const IS_TIC = (1<<4);
|
|
|
|
/** Current read/write pointer */
|
|
protected int $pos;
|
|
|
|
/** File descriptor - for receiving this is the file resource, for sending, this is a string of the data to send */
|
|
protected mixed $f;
|
|
|
|
/** @var int Type of Item - first 8 bits are the type of item, the last 8 bits are dependent on the send/receive T_* values */
|
|
protected int $ftype;
|
|
|
|
/** @var Collection The list of items we are sending */
|
|
protected Collection $list;
|
|
|
|
/** @var int|null The item in the list that we are sending/receiving */
|
|
protected ?int $index = NULL;
|
|
|
|
/** @var bool Item has been sent or received */
|
|
protected bool $complete = FALSE;
|
|
|
|
/** Time we started sending/receiving */
|
|
protected int $start;
|
|
|
|
protected function isType(int $type): bool
|
|
{
|
|
return ($this->ftype&0xff) & $type;
|
|
}
|
|
|
|
public function whatType(): int
|
|
{
|
|
static $ext = ['su','mo','tu','we','th','fr','sa','req'];
|
|
|
|
$x = strrchr($this->full_name,'.');
|
|
|
|
if (! $x || (strlen(substr($x,1)) != 3))
|
|
return self::IS_FILE;
|
|
|
|
if (strcasecmp(substr($x,1),'pkt') === 0)
|
|
return self::IS_PKT;
|
|
|
|
if (strcasecmp(substr($x,1),'req') === 0)
|
|
return self::IS_REQ;
|
|
|
|
if (strcasecmp(substr($x,1),'tic') === 0)
|
|
return self::IS_TIC;
|
|
|
|
for ($i=0;$i<count($ext);$i++)
|
|
if (! strncasecmp($x,'.'.$ext[$i],strlen($ext[$i]))
|
|
&& (preg_match('/^[0-9a-z]/',strtolower(substr($x,3,1)))))
|
|
return self::IS_ARC;
|
|
|
|
return self::IS_FILE;
|
|
}
|
|
} |