seb-win-refactoring/SafeExamBrowser.Proctoring/ScreenProctoring/Buffer.cs

92 lines
2 KiB
C#

/*
* Copyright (c) 2024 ETH Zürich, IT Services
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using SafeExamBrowser.Logging.Contracts;
using SafeExamBrowser.Proctoring.ScreenProctoring.Data;
using SafeExamBrowser.Proctoring.ScreenProctoring.Imaging;
namespace SafeExamBrowser.Proctoring.ScreenProctoring
{
internal class Buffer
{
private readonly object @lock = new object();
private readonly List<(MetaData metaData, DateTime schedule, ScreenShot screenShot)> list;
private readonly ILogger logger;
internal int Count
{
get
{
lock (@lock)
{
return list.Count;
}
}
}
internal Buffer(ILogger logger)
{
this.list = new List<(MetaData, DateTime, ScreenShot)>();
this.logger = logger;
}
internal bool Any()
{
lock (@lock)
{
return list.Any();
}
}
internal void Dequeue()
{
lock (@lock)
{
if (list.Any())
{
var (_, schedule, screenShot) = list.First();
list.RemoveAt(0);
logger.Debug($"Removed data for '{screenShot.CaptureTime:HH:mm:ss} -> {schedule:HH:mm:ss}', {Count} item(s) remaining.");
}
}
}
internal void Enqueue(MetaData metaData, DateTime schedule, ScreenShot screenShot)
{
lock (@lock)
{
list.Add((metaData, schedule, screenShot));
list.Sort((a, b) => DateTime.Compare(a.schedule, b.schedule));
logger.Debug($"Buffered data for '{screenShot.CaptureTime:HH:mm:ss} -> {schedule:HH:mm:ss}', now holding {Count} item(s).");
}
}
internal bool TryPeek(out MetaData metaData, out DateTime schedule, out ScreenShot screenShot)
{
lock (@lock)
{
metaData = default;
schedule = default;
screenShot = default;
if (list.Any())
{
(metaData, schedule, screenShot) = list.First();
}
return metaData != default && screenShot != default;
}
}
}
}