public void AddFilter(IFilter filter, FilterChainOptions where)
{
Debug.Assert((where & FilterChainOptions.ReadWrite) != FilterChainOptions.ReadWrite);
List<IFilter> list = null;
// Which chain.
if ((where & FilterChainOptions.Read) > 0)
{
if (readFilters == null) readFilters = new List<IFilter>();
list = readFilters;
}
else
{
if (writeFilters == null) writeFilters = new List<IFilter>();
list = writeFilters;
}
// Position in the chain.
if ((where & FilterChainOptions.Tail) > 0)
{
list.Add(filter);
if ((list == readFilters) && (ReadBufferLength > 0))
{
// Process all the data in the read buffers.
var q = new Queue<TextElement>();
foreach (var o in readBuffers)
{
q.Enqueue(filter.Filter(_ctx, o, false));
}
readBuffers = q;
}
}
else
{
list.Insert(0, filter);
}
}