Compare commits

...

3 Commits

Author SHA1 Message Date
jta
483ff2b93f wip: add callback method to readDataFromFile method 2022-06-09 15:12:32 -04:00
jta
50e94eb373 File IO Rate Limiting
feature: adds rate limiting for FileIO
2022-06-07 12:54:28 -04:00
jta
96dbd44a04 FileIO fix for 4 series
fix: removes unnecessary DirectoryInfo call which would fail on 4 series
2022-06-06 12:55:46 -04:00

View File

@@ -6,6 +6,8 @@ using Crestron.SimplSharp;
using Crestron.SimplSharp.CrestronIO;
using PepperDash.Core;
using Crestron.SimplSharpPro.CrestronThread;
using Crestron.SimplSharp.Net.Http;
using Crestron.SimplSharp.CrestronIO;
namespace PepperDash.Essentials.Core
{
@@ -15,12 +17,19 @@ namespace PepperDash.Essentials.Core
static CCriticalSection fileLock = new CCriticalSection();
public delegate void GotFileEventHandler(object sender, FileEventArgs e);
public static event GotFileEventHandler GotFileEvent;
private static Dictionary<string, CTimer> WriteTimers;
public const long WriteTimeout = 5000;
/// <summary>
/// Get the full file info from a path/filename, can include wildcards.
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
///
static FileIO()
{
WriteTimers = new Dictionary<string, CTimer>();
}
public static FileInfo[] GetFiles(string fileName)
{
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
@@ -35,7 +44,7 @@ namespace PepperDash.Essentials.Core
return null;
}
}
public static FileInfo GetFile(string fileName)
{
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
@@ -81,7 +90,6 @@ namespace PepperDash.Essentials.Core
{
if (fileLock.TryEnter())
{
DirectoryInfo dirInfo = new DirectoryInfo(file.Name);
Debug.Console(2, "FileIO Getting Data {0}", file.FullName);
if (File.Exists(file.FullName))
@@ -118,11 +126,11 @@ namespace PepperDash.Essentials.Core
}
public static void ReadDataFromFileASync(string fileName)
public static void ReadDataFromFileASync(string fileName, GotFileEventHandler callback)
{
try
{
ReadDataFromFileASync(GetFile(fileName));
ReadDataFromFileASync(GetFile(fileName), callback);
}
catch (Exception e)
{
@@ -130,11 +138,13 @@ namespace PepperDash.Essentials.Core
}
}
public static void ReadDataFromFileASync(FileInfo file)
public static void ReadDataFromFileASync(FileInfo file, GotFileEventHandler callback)
{
try
{
CrestronInvoke.BeginInvoke(o => _ReadDataFromFileASync(file));
CrestronInvoke.BeginInvoke((o => _ReadDataFromFileASync(file, callback)));
}
catch (Exception e)
{
@@ -142,7 +152,7 @@ namespace PepperDash.Essentials.Core
}
}
private static void _ReadDataFromFileASync(FileInfo file)
private static void _ReadDataFromFileASync(FileInfo file, GotFileEventHandler callback)
{
string data;
try
@@ -165,11 +175,13 @@ namespace PepperDash.Essentials.Core
Debug.Console(2, "File {0} Does not exsist", file.FullName);
data = "";
}
GotFileEvent.Invoke(null, new FileEventArgs(data));
callback.Invoke(null, new FileEventArgs(data));
//callback.Invoke(null, new FileEventArgs(data));
}
else
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock");
Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock retrying");
}
}
@@ -189,6 +201,41 @@ namespace PepperDash.Essentials.Core
}
/// <summary>
/// Resets (or starts) the write timer
/// </summary>
static void ResetTimer(string data, string filePath)
{
try
{
if (WriteTimers.ContainsKey(filePath))
{
WriteTimers[filePath].Stop();
WriteTimers[filePath] = null;
WriteTimers.Remove(filePath);
}
WriteTimers.Add(filePath, new CTimer((o) =>
{
Thread _WriteFileThread;
_WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended);
_WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority;
_WriteFileThread.Start();
Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
WriteTimers.Remove(filePath);
}, WriteTimeout));
Debug.Console(0, "FileIO write timer has been reset.");
}
catch (Exception e)
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO ResetTimer failed: \r{0}", e);
data = "";
}
}
/// <summary>
///
/// </summary>
@@ -201,11 +248,7 @@ namespace PepperDash.Essentials.Core
/// <param name="filePath"></param>
public static void WriteDataToFile(string data, string filePath)
{
Thread _WriteFileThread;
_WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended);
_WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority;
_WriteFileThread.Start();
Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
ResetTimer(data, filePath);
}
@@ -240,6 +283,7 @@ namespace PepperDash.Essentials.Core
fileLock.Leave();
}
Debug.Console(0, Debug.ErrorLogLevel.Notice, "File Written to : '{0}'", filePath);
return null;
}
@@ -274,5 +318,9 @@ namespace PepperDash.Essentials.Core
public FileEventArgs(string data) { Data = data; }
public string Data { get; private set; } // readonly
}
public enum ReadFileDispatchError
{
}
}