/// <summary>
/// Insert the filter into the filter chains.
/// </summary>
/// <param name="ctx">Runtime context.</param>
/// <param name="stream">Which stream's filter chains.</param>
/// <param name="filter">What filter.</param>
/// <param name="where">What position in the chains.</param>
/// <param name="parameters">Additional parameters for the filter.</param>
/// <returns>Filters that have been added.</returns>
internal static (PhpFilter readFilter, PhpFilter writeFilter) AddToStream(Context ctx, PhpStream stream, string filter, FilterChainOptions where, PhpValue parameters)
{
if ((stream.Options & StreamAccessOptions.Read) == 0)
{
where &= ~FilterChainOptions.Read;
}
if ((stream.Options & StreamAccessOptions.Write) == 0)
{
where &= ~FilterChainOptions.Write;
}
PhpFilter readFilter = null, writeFilter = null;
if ((where & FilterChainOptions.Read) != 0)
{
if (GetFilter(ctx, filter, true, out readFilter, parameters))
{
stream.AddFilter(readFilter, where);
readFilter.OnCreate();
// Add to chain, (filters buffers too).
}
else
{
PhpException.Throw(PhpError.Warning, Core.Resources.ErrResources.invalid_filter_name, filter);
//return false;
throw new ArgumentException(nameof(filter));
}
}
if ((where & FilterChainOptions.Write) != 0)
{
if (GetFilter(ctx, filter, true, out writeFilter, parameters))
{
stream.AddFilter(writeFilter, where);
writeFilter.OnCreate();
// Add to chain.
}
else
{
PhpException.Throw(PhpError.Warning, Core.Resources.ErrResources.invalid_filter_name, filter);
//return false;
throw new ArgumentException(nameof(filter));
}
}
return(readFilter, writeFilter);
}