Files
2024-06-26 10:30:00 +09:00

457 lines
24 KiB
C#

using DevExpress.Data.Helpers;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Navigation;
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using SystemX.Net;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.Comm;
using SystemX.Net.Schedule;
using SystemX.Net.DB;
using SystemX.Common.Serialization;
using SystemX.Common.Archive;
using System.Threading.Tasks;
using SystemX.Common.Protocol.SIA;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using System.Threading;
using SystemX.Net.Middleware.Commons;
using SystemX.Net.Platform.SystemX.Common;
using CpTesterPlatform.CpLogUtil;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
private async void WatchMappedLogQueue()
{
await Task.Delay(250);
while (!m_bTaskMappedLogBlock)
{
try
{
CT.ThrowIfCancellationRequested();
}
catch (OperationCanceledException CancelEx)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
break;
}
//
try
{
if (MappedLogQueueData.Count > 0)
{
Tuple<string, int, HEADER_PACKET, byte[]> GetMappedLogData;
if (MappedLogQueueData.TryPeek(out GetMappedLogData))
{
if (SetMemoryMappedFile(GetMappedLogData.Item1, GetMappedLogData.Item2, GetMappedLogData.Item3, GetMappedLogData.Item4))
{
nMappedLogDataInOutFailedCnt = 0;
if (MappedLogQueueData.TryDequeue(out GetMappedLogData) == false)
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Dequeue(PASS) failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
else
{
if (nMappedLogDataInOutFailedCnt > 1)
{
nMappedLogDataInOutFailedCnt = 0;
if (MappedLogQueueData.TryDequeue(out GetMappedLogData) == false)
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Dequeue(FAIL) failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
nMappedLogDataInOutFailedCnt++;
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" SetMemoryMappedFile Process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
else
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" TryPeek failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" General Queue Process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
if(bUseMapLogProcess)
await Task.Delay(100);
else
await Task.Delay(10000);
}
}
public bool SetMemoryMappedFile(string strType, int nPos, HEADER_PACKET getHeader, byte[] ucFileData)
{
bool bMapLogCreateResult = true;
int nSetSize = int.MaxValue;
byte[] ucSetLogArray = null;
int nSetReadyPos = (nPos - PORT_DISTRIBUTION_NUM) * LogSharedMemory.nMaxStationSize;
string strProcessDebugInfo = string.Empty;
strProcessDebugInfo = "[" + (nPos).ToString("D2") + "]" +
"[" + ConnPool[nPos].nUseStreamPort + "]" +
"[" + thisConnInfo[nPos].strConnectHostID + "]" +
"[" + thisConnInfo[nPos].strConnectSection + "]";
CpLogProcessInfo.strProcessDebugInfo = strProcessDebugInfo;
try
{
using (InfoLogSharedMemory memInfoLog = new InfoLogSharedMemory(ParamterMapInfoLog))
{
InfoLogMappedPacket InfoLogMapFile = new InfoLogMappedPacket();
nSetSize = Marshal.SizeOf(InfoLogMapFile);
ucSetLogArray = new byte[nSetSize];
InfoLogMapFile = (InfoLogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, InfoLogMapFile.GetType());
if (memInfoLog.CheckFile())
{
bool bFindInfoLogResult = false;
//로그 처리가 필요한 위치 조회
bool[] bGetStationReadyLog = memInfoLog.Get(out bFindInfoLogResult, nSetSize);
if (bFindInfoLogResult)
Array.Copy(bGetStationReadyLog, 0, InfoLogMapFile.bLogDataReady, 0, SharedMemory.nMaxInfoFullAccessSize);
using (LogSharedMemory memLog = new LogSharedMemory(ParamterMapLog))
{
LogMappedPacket LogMapFile = new LogMappedPacket();
nSetSize = Marshal.SizeOf(LogMapFile);
ucSetLogArray = new byte[nSetSize];
LogMapFile = (LogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, LogMapFile.GetType());
LogMapFile.bSectionUse = true;
LogMapFile.objLogType[0].Data = strType;
LogMapFile.bLogFileReadComplete = false;
LogMapFile.bLogFileProcessComplete = false;
LogMapFile.nNumber = nPos;
LogMapFile.bShowCpLogProcessTime = bShowCpLogProcessTime;
LogMapFile.nCommandPort = ConnPool[nPos].nUseCommandPort;
LogMapFile.nStreamPort = ConnPool[nPos].nUseStreamPort;
LogMapFile.objHost[0].Data = thisConnInfo[nPos].strConnectHostID;
LogMapFile.objSection[0].Data = thisConnInfo[nPos].strConnectSection;
bool bMakeTempTestListCntID = false;
string strGetStationNameChk = getHeader.objCP_Packet[0].objStationName[0].Data;
string strSetOrgStationName = string.Empty;
bool bHaveTestListID = false;
string strGetTransferTestListCntID = string.Empty;
if (strGetStationNameChk.IndexOf(";@#$%;TFL") >= 0)
{
bMakeTempTestListCntID = true;
strSetOrgStationName = strGetStationNameChk.Substring(0, strGetStationNameChk.IndexOf(";@#$%;TFL"));
}
else
strSetOrgStationName = strGetStationNameChk;
strGetTransferTestListCntID = getHeader.objVarParam1[0].Data;
if (strGetTransferTestListCntID.Split('@').Count() > 1)
bHaveTestListID = true;
LogMapFile.objStationName[0].Data = strSetOrgStationName;
LogMapFile.objOptionFileName[0].Data = getHeader.objOptionName[0].Data;
LogMapFile.objOptionFileExtension[0].Data = getHeader.objOptionExtension[0].Data;
LogMapFile.nStationID = 0;
LogMapFile.objProdPNo[0].Data = getHeader.objCP_Packet[0].objProdNo_P[0].Data;
LogMapFile.objProdCNo[0].Data = getHeader.objCP_Packet[0].objProdNo_C[0].Data;
LogMapFile.objTestType[0].Data = getHeader.objCP_Packet[0].objTestType[0].Data;
LogMapFile.objTestCode[0].Data = getHeader.objCP_Packet[0].objTestCode[0].Data;
LogMapFile.objVersion[0].Data = getHeader.objCP_Packet[0].objVersion[0].Data;
LogMapFile.objProdCode[0].Data = getHeader.objCP_Packet[0].objProdCode[0].Data;
LogMapFile.nTestListVariantNo = (int)getHeader.objCP_Packet[0].uiTestListNo;
bool bCheckResult = string.IsNullOrEmpty(thisConnInfo[nPos].strResultTestListCntID);
if (bCheckResult || bMakeTempTestListCntID)
{
string strSetTempTestListCntID = string.Empty;
if (bHaveTestListID == false)
strSetTempTestListCntID = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "@0";
else
strSetTempTestListCntID = strGetTransferTestListCntID;
/// TODO : Failed Transfer File
/// Ver 0
/// 빈 아이디가 아닐 경우 현재 아이디 정보와 재전송 파일 정보 비교하여 동일할 경우 현재 아이디로 저장
/// > 추후 분류(검색)에 문제가 될경우 임시 아이디로 변경 해야 할수도 있다.
///
/// Ver 1
/// 실패한 파일일때만 아이디 확인, 없으면 임시, 있으면 보낸 아이디로 저장
/*
if (bCheckResult == false)
{
string strHostSectionInfo =
thisConnInfo[nPos].strConnectHostID + ";" +
thisConnInfo[nPos].strConnectSection;
string strMakeCntID =
getHeader.objCP_Packet[0].objProdNo_C[0].Data + ";" +
getHeader.objCP_Packet[0].objTestType[0].Data + ";" +
getHeader.objCP_Packet[0].objTestCode[0].Data + ";" +
getHeader.objCP_Packet[0].objVersion[0].Data + ";" +
getHeader.objCP_Packet[0].objProdCode[0].Data;// + ";" +
//strFileName;
//패킷의 정보로 Dic 검색 후 존재 한다면 생성하여 현재 아이디랑 비교후 일치한다면 현재 ID 사용
if (dicQueryTestListCntID.ContainsKey(strHostSectionInfo))
{
if (dicQueryTestListCntID[strHostSectionInfo].ContainsKey(strMakeCntID))
{
string strGetCurTLCntID = dicQueryTestListCntID[strHostSectionInfo][strMakeCntID].dtAccessTime.ToString("yyyyMMddHHmmssfff") + "@" +
dicQueryTestListCntID[strHostSectionInfo][strMakeCntID].nCnt.ToString();
if (thisConnInfo[nPos].strResultTestListCntID.CompareTo(strGetCurTLCntID) == 0)
strSetTempTestListCntID = thisConnInfo[nPos].strResultTestListCntID;
}
}
}
*/
LogMapFile.objResultTestListCntID[0].Data = strSetTempTestListCntID;
}
else
LogMapFile.objResultTestListCntID[0].Data = thisConnInfo[nPos].strResultTestListCntID;
ucFileData.CopyTo(LogMapFile.ucLogData, 0);
LogMapFile.nLogDataSize = ucFileData.Count();
//
string strRandFilePath = string.Empty;
byte[] ucGetFileData = null;
byte[] ucSetFileData = null;
try
{
ucGetFileData = new byte[LogMapFile.nLogDataSize];
Array.Copy(LogMapFile.ucLogData, 0, ucGetFileData, 0, LogMapFile.nLogDataSize);
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - Create file data make failed. [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
ucGetFileData = null;
bMapLogCreateResult = false;
}
//
try
{
string strRandName = Path.GetRandomFileName();
string strRandFile = Path.GetFileNameWithoutExtension(strRandName);
string strRandPath = Path.GetTempPath();
strRandFilePath = strRandPath + strRandFile + LogMapFile.objOptionFileExtension[0].Data;
if (ucGetFileData == null)
throw new Exception("CpLog - Log file data null.");
if (LogMapFile.objLogType[0].Data == "RAW_SIZE")
ucSetFileData = XDataArchive.DecompressGZipByteToByte(ucGetFileData);
else if (LogMapFile.objLogType[0].Data == "FILE_TRANSFER")
ucSetFileData = XDataArchive.DecompressDeflateByteToByte(ucGetFileData);
if (ucSetFileData == null)
throw new Exception("CpLog - Log file data decompress failed.");
CpLogHeader getCpLogHeader = null;
File.WriteAllBytes(strRandFilePath, ucSetFileData);
//해당 CpLog 파일 읽기 및 헤더 정보 획득
DataTable dtLogData = null;
dtLogData = CpLogFileIO.GetLogData(strRandFilePath, out getCpLogHeader);
if (dtLogData != null && getCpLogHeader != null)
{
string strGetStationID = getCpLogHeader.CHANNEL.Trim();
int nGetStationID = int.MaxValue;
if (int.TryParse(strGetStationID, out nGetStationID))
LogMapFile.nStationID = nGetStationID;
if (nGetStationID < 0)
{
LogMapFile.nStationID = 0;
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - StationID negative value [" + nGetStationID.ToString() + "] detect. [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] ", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
if (LogMapFile.nStationID >= LogSharedMemory.nMaxStationSize)
{
if (InfoLogMapFile.bLogDataReady[nSetReadyPos])
InfoLogMapFile.bLogDataReady[nSetReadyPos] = false;
else
InfoLogMapFile.bLogDataReady[nSetReadyPos] = true;
}
else
{
if (InfoLogMapFile.bLogDataReady[nSetReadyPos + LogMapFile.nStationID])
InfoLogMapFile.bLogDataReady[nSetReadyPos + LogMapFile.nStationID] = false;
else
InfoLogMapFile.bLogDataReady[nSetReadyPos + LogMapFile.nStationID] = true;
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - Check StationID failed. [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
bMapLogCreateResult = false;
}
finally
{
if (File.Exists(strRandFilePath))
File.Delete(strRandFilePath);
if (bMapLogCreateResult == false)
{
//문제 발생 로그 확인 파일생성 위치 및 파일명 생성
if (ucGetFileData == null)
goto CHECK_LOG_FILE_MAKE_SKIP;
if (ucSetFileData == null)
goto CHECK_LOG_FILE_MAKE_SKIP;
try
{
string strMakeDate = DateTime.Now.ToString(@"yyyy\\MM\\dd\\");
string strCreateFileName = CPXV2_GetCheckLogFilePath(LogMapFile, strMakeDate);
if (File.Exists(strCreateFileName) == false)
File.WriteAllBytes(strCreateFileName, ucSetFileData);
}
catch (Exception ex)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - Check log file create failed. [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
CHECK_LOG_FILE_MAKE_SKIP:;
}
memLog.Set(nPos, LogMapFile);
}
memInfoLog.Set(InfoLogMapFile);
}
else
{
if(memInfoLog.CheckExistsInfoFile() == false)
memInfoLog.Set(InfoLogMapFile);
//Info File Access Failed
bMapLogCreateResult = false;
}
}
}
catch (Exception e)
{
/*
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Frame Count {st.FrameCount} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
for (int n = 0; n < st.FrameCount; n++)
{
StackFrame sf = st.GetFrame(n);
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Method To String {sf.GetMethod()} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Method Name {sf.GetMethod().Name} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Line Number {sf.GetFileLineNumber()} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Column Number {sf.GetFileColumnNumber()} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
}
*/
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - Create Map Log failed. [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
bMapLogCreateResult = false;
}
//long l1 = stChkTime.ElapsedMilliseconds;
return bMapLogCreateResult;
}
private string CPXV2_GetLogFileName(LogMappedPacket GetMappedInfo, string strCreateName)
{
Random randNumber = new Random();
string strFileName = strCreateName;
if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0)
strFileName += @"LogFileTemp" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
else
strFileName += @GetMappedInfo.objOptionFileName[0].Data + @GetMappedInfo.objOptionFileExtension[0].Data;
if (File.Exists(strFileName) == true)
{
while (true)
{
strFileName = strCreateName;
if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0)
strFileName += @"LogFileTemp" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
else
strFileName += @GetMappedInfo.objOptionFileName[0].Data + "_" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
if (File.Exists(strFileName) == false)
break;
}
}
return strFileName;
}
private string CPXV2_GetCheckLogFilePath(LogMappedPacket GetMappedInfo,
string strMakeDate,
bool bGetOnlyFilePath = false)
{
string strMakeInfo = string.Empty;
string strMakeName = string.Empty;
strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate;
strMakeInfo += @"LogFileSave_ProcessPort" + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\LogCheck\";
if (Directory.Exists(strMakeInfo) == false)
Directory.CreateDirectory(strMakeInfo);
if (bGetOnlyFilePath == false)
strMakeName = CPXV2_GetLogFileName(GetMappedInfo, strMakeInfo);
else
strMakeName = strMakeInfo;
return strMakeName;
}
}
}