using System.IO.MemoryMappedFiles; using System.Text; namespace SharedComponents { public class LiveLogCache { /*// Staticka instancia pre singleton private static readonly LiveLogCache _instance = new LiveLogCache(); // Uzamykaci objekt pre bezpecny pristup z viacerych vlakien private static readonly object _lock = new object(); // Zoznam na ukladanie logov private readonly List _logs = new List(); // Udalost pre notifikaciu pri zmene logov public event Action LogAdded; // Sukromny konstruktor (singleton pattern) private LiveLogCache() { } // Metoda na ziskanie poctu logov public int GetCount() { return _logs.Count; } // Staticka metoda na ziskanie instancie public static LiveLogCache Instance { get { lock (_lock) { return _instance; } } } // Verejna vlastnost na ziskanie logov public IReadOnlyList Logs { get { lock (_lock) { return _logs.AsReadOnly(); } } } // Metoda na pridanie logu public void AddLog(string log) { // Ziskanie aktualneho casu v pozadovanom formate string timeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:"); // Vytvorenie noveho logu s casovou peciatkou na zaciatku string logWithTimeStamp = $"{timeStamp} {log}"; // Pridanie logu do zoznamu lock (_lock) { _logs.Add(logWithTimeStamp); } // Spustenie udalosti pre notifikaciu LogAdded?.Invoke(logWithTimeStamp); } // Metoda na vycistenie logov public void ClearLogs() { lock (_lock) { _logs.Clear(); } // Volitelne: Spusti udalost, ak by sme chceli notifikovat aj o vymazani logov LogAdded?.Invoke("Logs were cleared."); } // Ziskanie vsetkych logov public List GetAllLogs() { return new List(_logs); // Vratime kopiu logov } // Ziskanie logov medzi urcitou poziciou (s upravenym indexovanim) public List GetLogs(int startIndex, int count) { // Zabezpeci, ze indexy nebudu mimo rozsahu return _logs.Skip(startIndex).Take(count).ToList(); }*/ // Zlepseny kod, ktory umoznuje pracu s MemoryMappedFile, namiesto len priestoru vo virtualnej pamati, navyse je tento subor velkostne obmedzeny na 1MB // Staticka instancia pre singleton private static readonly LiveLogCache _instance = new LiveLogCache(true); // Uzamykaci objekt pre bezpecny pristup z viacerych vlakien private static readonly object _lock = new object(); // Zoznam na ukladanie logov private readonly List _logs = new List(); // Udalost pre notifikaciu pri zmene logov public event Action LogAdded; // Memory-mapped file private MemoryMappedFile _mmf; private MemoryMappedViewAccessor _accessor; private const int MaxLogSize = 1024 * 1024; // 1MB // Sukromny konstruktor (singleton pattern) private LiveLogCache(bool itsLogsCreator) { if (itsLogsCreator == true) { _mmf = MemoryMappedFile.CreateOrOpen("LiveLogCacheMMF", MaxLogSize); } else { _mmf = MemoryMappedFile.OpenExisting("LiveLogCacheMMF"); } _accessor = _mmf.CreateViewAccessor(); } // Metoda na ziskanie poctu logov public int GetCount() { return _logs.Count; } // Staticka metoda na ziskanie instancie public static LiveLogCache Instance { get { lock (_lock) { return _instance; } } } // Verejna vlastnost na ziskanie logov public IReadOnlyList Logs { get { lock (_lock) { return _logs.AsReadOnly(); } } } // Metoda na pridanie logu public void AddLog(string log) { // Ziskanie aktualneho casu v pozadovanom formate string timeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:"); // Vytvorenie noveho logu s casovou peciatkou na zaciatku string logWithTimeStamp = $"{timeStamp} {log}"; // Pridanie logu do zoznamu lock (_lock) { _logs.Add(logWithTimeStamp); WriteLogToMemoryMappedFile(logWithTimeStamp); } // Spustenie udalosti pre notifikaciu LogAdded?.Invoke(logWithTimeStamp); } // Metoda na vycistenie logov public void ClearLogs() { lock (_lock) { _logs.Clear(); ClearMemoryMappedFile(); } // Volitelne: Spusti udalost, ak by sme chceli notifikovat aj o vymazani logov LogAdded?.Invoke("Logs were cleared."); } // Ziskanie vsetkych logov public List GetAllLogs() { return new List(_logs); // Vratime kopiu logov } // Ziskanie logov medzi urcitou poziciou (s upravenym indexovanim) public List GetLogs(int startIndex, int count) { // Zabezpeci, ze indexy nebudu mimo rozsahu return _logs.Skip(startIndex).Take(count).ToList(); } // Metoda na naplnenie ListView /*public void PopulateListView(ListView listView) { listView.Items.Clear(); lock (_lock) { foreach (var log in _logs) { listView.Items.Add(new ListView Item(log)); } } }*/ // Write log to memory-mapped file private void WriteLogToMemoryMappedFile(string log) { byte[] logBytes = Encoding.UTF8.GetBytes(log + Environment.NewLine); _accessor.WriteArray(0, logBytes, 0, logBytes.Length); } // Clear memory-mapped file private void ClearMemoryMappedFile() { byte[] emptyBytes = new byte[MaxLogSize]; _accessor.WriteArray(0, emptyBytes, 0, emptyBytes.Length); } } }