using System;
using System.Collections.Generic;
using log4net;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;
using System.Text;
using Microsoft.Win32;
using System.IO;
using System.Threading;
namespace SHARP_CLAS_UI
{
public class Panel_Info_Manager
{
#region Define
string str_extension = ".xml";
#endregion
#region Logger
///
/// Alarm Log
///
private ILog Panel_Info_Change_Log = LogManager.GetLogger("Panel_Info_Change");
///
/// Alarm Log Write
///
/// Method name of exception that occurred
/// exception
private void Write_Panel_Info_Change_Log(string message)
{
if (Panel_Info_Change_Log != null) Panel_Info_Change_Log.Debug($"{message}");
}
///
/// Create excepton logger
///
private void Create_Panel_Info_Change_logger()
{
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
RollingFileAppender rollingAppender = new RollingFileAppender();
PatternLayout layout = new PatternLayout();
hierarchy.Configured = true;
rollingAppender.Name = "Panel_Info_Change_RoolingFile";
rollingAppender.LockingModel = new RollingFileAppender.MinimalLock();
rollingAppender.File = $@"D:\Logger\Panel_Info_Change\";
rollingAppender.AppendToFile = true;
rollingAppender.DatePattern = "yyyy\\\\MM\\\\'Panel_Info_Change'_dd'.csv'";
rollingAppender.RollingStyle = RollingFileAppender.RollingMode.Composite;
rollingAppender.MaxSizeRollBackups = 10;
rollingAppender.MaximumFileSize = "100MB";
rollingAppender.StaticLogFileName = false;
rollingAppender.Encoding = Encoding.UTF8;
rollingAppender.PreserveLogFileNameExtension = true;
layout = new PatternLayout("%d{yyyy/MM/dd HH:mm:ss.fff},%m%n");
layout.ActivateOptions();
rollingAppender.Layout = layout;
rollingAppender.ActivateOptions();
hierarchy.GetLogger("Panel_Info_Change");
ILog log = LogManager.GetLogger("Panel_Info_Change");
Logger l = (Logger)log.Logger;
l.Level = log4net.Core.Level.Debug;
l.AddAppender(rollingAppender);
Panel_Info_Change_Log = LogManager.GetLogger("Panel_Info_Change");
}
#endregion
#region Property
private static readonly Lazy _instatnce = new Lazy(() => new Panel_Info_Manager());
public static Panel_Info_Manager Instance
{
get
{
return _instatnce.Value;
}
}
public Dictionary Panel_Infos { get; set; }
private Xml_Manager xml_manager = new Xml_Manager();
private string file_path;
private object _lockObject;
private bool _isLock;
#endregion
#region Construct
private Panel_Info_Manager()
{
Create_Panel_Info_Change_logger();
_lockObject = new object();
Get_File_Path();
Panel_Infos = new Dictionary();
foreach (Panel_Info_Names info in Enum.GetValues(typeof(Panel_Info_Names)))
{
Panel_Infos.Add(info, new Panel_Info());
}
}
#endregion
#region Function
private void Get_File_Path()
{
RegistryKey rkk = Registry.CurrentUser.OpenSubKey(Equipment.Registry_Path, true);
try
{
if (rkk == null)
{
rkk = Registry.CurrentUser.CreateSubKey(Equipment.Registry_Path);
rkk.SetValue("PANEL_INFO_PATH", @"C:\SHARP_CLAS\Config\PANEL_INFO\");
file_path = @"C:\SHARP_CLAS\Config\PANEL_INFO\";
}
else
{
object value = rkk.GetValue("PANEL_INFO_PATH");
if (value == null)
{
rkk.SetValue("PANEL_INFO_PATH", @"C:\SHARP_CLAS\Config\PANEL_INFO\");
file_path = @"C:\SHARP_CLAS\Config\PANEL_INFO\";
}
else
{
file_path = value.ToString();
}
}
}
finally
{
rkk.Close();
}
}
public Panel_Info Get_Panel_Info(Panel_Info_Names panel_name, int tray_panel_num = 0)
{
lock (_lockObject)
{
try
{
while (_isLock)
{
Monitor.Wait(_lockObject);
}
_isLock = true;
Panel_Info info;
string info_name = string.Empty;
if (panel_name == Panel_Info_Names.LD_Tray_In || panel_name == Panel_Info_Names.ULD_Tray_Ok || panel_name == Panel_Info_Names.ULD_Tray_Ng)
{
info_name = $"{panel_name}_{tray_panel_num}";
}
else
{
info_name = $"{panel_name}";
}
info_name += str_extension;
if (File.Exists(file_path + info_name))
{
info = xml_manager.Read_File(file_path + info_name);
}
else
{
info = new Panel_Info();
xml_manager.Save_File(file_path + info_name, info);
}
if(info == null)
{
info = new Panel_Info();
xml_manager.Save_File(file_path + info_name, info);
}
Panel_Infos[panel_name] = info.Clone();
return Panel_Infos[panel_name].Clone();
}
finally
{
_isLock = false;
Monitor.Pulse(_lockObject);
}
}
}
public bool Move_Panel_Info(Panel_Info_Names remove_info, Panel_Info_Names make_info)
{
try
{
bool check = true;
Get_Panel_Info(remove_info);
Set_Panel_Info(make_info, Panel_Infos[remove_info]);
Panel_Info resetInfo = new Panel_Info();
Set_Panel_Info(remove_info, resetInfo);
Get_Panel_Info(remove_info);
return check;
}
catch(Exception )
{
return false;
}
}
public bool Set_Panel_Info(Panel_Info_Names name, Panel_Info info)
{
lock (_lockObject)
{
try
{
while (_isLock)
{
Monitor.Wait(_lockObject);
}
_isLock = true;
string info_name = string.Empty;
if (name == Panel_Info_Names.LD_Tray_In || name == Panel_Info_Names.ULD_Tray_Ok || name == Panel_Info_Names.ULD_Tray_Ng)
{
info_name = $"{name}_{info.Panel_Num}";
}
else
{
info_name = $"{name}";
}
info_name += str_extension;
xml_manager.Save_File(file_path + info_name, info);
Write_Panel_Info_Change_Log($"{info_name},{info.ToString()}");
Panel_Infos[name] = info.Clone();
return true;
}
finally
{
_isLock = false;
Monitor.Pulse(_lockObject);
}
}
}
#endregion
}
}