<?php
declare(strict_types=1);

namespace Archive\StreamWrapper\Filter;

/**
 * Interface für benutzerdefinierte Stream-Filter
 */
interface StreamFilterInterface
{
    /**
     * Filtert Daten beim Lesen/Schreiben
     *
     * @param resource $in Input-Bucket-Brigade
     * @param resource $out Output-Bucket-Brigade
     * @param int $consumed Anzahl der verbrauchten Bytes
     * @param bool $closing Gibt an, ob der Stream geschlossen wird
     * @return int PSFS_PASS_ON, PSFS_FEED_ME oder PSFS_ERR_FATAL
     */
    public function filter($in, $out, &$consumed, bool $closing): int;

    /**
     * Wird beim Anhängen des Filters an einen Stream aufgerufen
     *
     * @return bool True bei Erfolg, false bei Fehler
     */
    public function onCreate(): bool;

    /**
     * Wird beim Entfernen des Filters aufgerufen
     */
    public function onClose(): void;

    /**
     * Gibt den Filter-Namen zurück
     */
    public function getFilterName(): string;

    /**
     * Gibt die unterstützten Modi zurück (read, write, read|write)
     */
    public function getSupportedModes(): array;
}
