123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668 |
- // LogicDevice.cpp : 定义 DLL 应用程序的导出函数。
- //
- #include "StdAfx.h"
- #include "objbase.h"
- #include "LogicDevice.h"
- #include "PacketAnalizer.h"
- #include "MessageInfo.h"
- #include "common_api.h"
- #include "LocalConfig.h"
- #include "Base64.h"
- #include "SystemLogger.hpp"
- //-------------Logic Device SysIF--------------------------
- LogicDeviceSysIF::LogicDeviceSysIF(void)
- {
- }
- LogicDeviceSysIF::~LogicDeviceSysIF(void)
- {
- }
- //init
- void LogicDeviceSysIF::SetLogicDevice(LogicDevice *p)
- {
- m_pLogicDev = p;
- p->SetSysLogicDevice(this);
- };
- LogicDevice* LogicDeviceSysIF::GetLogicDevice()
- {
- return m_pLogicDev;
- }
- //Command In and Out
- //notify from lower layer
- RET_STATUS HW_ACTION LogicDeviceSysIF::CmdFromLogicDev(ResDataObject PARAM_IN *pCmd)
- {
- return RET_FAILED;
- };
- //notify to lower layer
- RET_STATUS SYSTEM_CALL LogicDeviceSysIF::CmdToLogicDev(ResDataObject PARAM_IN *pCmd)
- {
- if (m_pLogicDev)
- {
- return m_pLogicDev->CmdToLogicDev(pCmd);
- }
- return RET_NOSUPPORT;
- };
- //-------------Data Logic Device--------------------------
- LogicDevice::LogicDevice(void)
- {
- m_pLogger = NULL;
- m_pSysLogic = NULL;
- m_pDevInstance = new char[40];
- m_pResErrorList = new ResDataObject();
- GUID guid;
- string strDevInstance;
- CoCreateGuid(&guid);
- guid_2_string(guid, strDevInstance);
- sprintf_s(m_pDevInstance,40, "%s", strDevInstance.c_str());
- m_EvtNotify = CreateEvent(0, 0, 0, 0);
- m_pDrvDPC = NULL;
-
- }
- LogicDevice::~LogicDevice(void)
- {
- delete []m_pDevInstance;
- delete m_pResErrorList;
- CloseHandle(m_EvtNotify);
- m_EvtNotify = NULL;
- }
- void LogicDevice::NotifyDrvThread()
- {
- if (m_EvtNotify)
- {
- SetEvent(m_EvtNotify);
- }
- }
- HANDLE LogicDevice::GetEvtHandle()
- {
- return m_EvtNotify;
- }
- //1. init part
- void LogicDevice::SetSysLogicDevice(LogicDeviceSysIF *pLogic)
- {
- m_pSysLogic = pLogic;
- }
- void LogicDevice::SetLogHandle(Logger PARAM_IN *pLogger)
- {
- m_pLogger = pLogger;
- }
- Logger *LogicDevice::GetLogHandle()
- {
- return m_pLogger;
- }
- void LogicDevice::SetDrvDPC(DriverDPC *pDPC)
- {
- m_pDrvDPC = pDPC;
- }
- DriverDPC *LogicDevice::GetDrvDPC()
- {
- return m_pDrvDPC;
- }
- void SYSTEM_CALL LogicDevice::CompleteInit()
- {
- }
- void SYSTEM_CALL LogicDevice::CompleteUnInit()
- {
- }
- int LogicDevice::GetDevice_Thread_Priority()
- {
- return THREAD_PRIORITY_NONE;
- }
- RET_STATUS LogicDevice::GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource)
- {
-
- //Get Unit Type (Unit GUID)
- if (pDeviceResource->GetFirstOf("LogicDevInstance")<0)
- {
- pDeviceResource->add("LogicDevInstance", m_pDevInstance);
- }
- ////
- size_t idx = (*pDeviceResource)["Attribute"].size();
- if (idx > 0)
- {
- int erroridx = (*pDeviceResource)["Attribute"].GetFirstOf("ErrorList");
- if (erroridx < 0)
- {
- (*pDeviceResource)["Attribute"].add("ErrorList", *m_pResErrorList);
- }
- else
- {
- (*pDeviceResource)["Attribute"]["ErrorList"] = *m_pResErrorList;
- }
- }
- else
- {
- ResDataObject Attribute;
- Attribute.add("ErrorList", *m_pResErrorList);
- pDeviceResource->add("Attribute", Attribute);
- }
-
- return RET_SUCCEED;
- }
- //notify from lower layer
- RET_STATUS LogicDevice::CmdFromLogicDev(ResDataObject *pCmd)
- {
- if (pCmd && m_pSysLogic)
- {
- return m_pSysLogic->CmdFromLogicDev(pCmd);
- }
- //put log here
- return RET_FAILED;
- }
- std::wstring mb2wc_a(const char* mbstr)
- {
- std::wstring strVal;
- int size = MultiByteToWideChar(CP_UTF8, 0, mbstr, -1, NULL, 0);
- wchar_t* wcstr = new wchar_t[size + 1];
- if (wcstr)
- {
- memset(wcstr, 0, size * sizeof(wchar_t));
- int ret = MultiByteToWideChar(CP_UTF8, 0, mbstr, -1, wcstr, size);
- if (ret != 0) // MultiByteToWideChar returns 0 if it does not succeed.
- {
- strVal = wcstr;
- }
- delete[] wcstr;
- wcstr = NULL;
- }
- return strVal;
- }
- RET_STATUS HW_ACTION LogicDevice::AddErrorMessageUnicode(const char* DevInstance, const char* Code, int &Level, const wchar_t* ResInfo, const wchar_t* Description, int nMessageType)
- {
- string ResBase64, DesBase64;
- wstring wResUTF = ResInfo;
- wstring wDesUTF = Description;
- CBase64::Encode((const unsigned char *)wResUTF.c_str(), (unsigned long)wResUTF.size() * sizeof(wchar_t), ResBase64);
- CBase64::Encode((const unsigned char *)wDesUTF.c_str(), (unsigned long)wDesUTF.size() * sizeof(wchar_t), DesBase64);
- return AddErrorMessage(DevInstance, Code, Level, ResBase64.c_str(), DesBase64.c_str(), nMessageType);
- }
- RET_STATUS HW_ACTION LogicDevice::AddErrorMessage(const char* DevInstance, const char* Code, int &Level, const char* ResInfo, const char* Description, int nMessageType, const char* pAppId)
- {
- string ResBase64,DesBase64;
- wstring wResUTF = mb2wc_a(ResInfo);
- wstring wDesUTF = mb2wc_a(Description);
- CBase64::Encode((const unsigned char *)wResUTF.c_str(), (unsigned long)wResUTF.size() * sizeof(wchar_t), ResBase64);
- CBase64::Encode((const unsigned char *)wDesUTF.c_str(), (unsigned long)wDesUTF.size() * sizeof(wchar_t), DesBase64);
- return AddErrorMessageBase(DevInstance, Code, Level, ResBase64.c_str(), DesBase64.c_str(), nMessageType, pAppId);
- }
- RET_STATUS LogicDevice::AddErrorMessageBase(const char* DevInstance, const char* Code, int &Level, const char* ResInfo, const char* Description, int nMessageType, const char* pAppId)
- {
- //int ret = 1;
- if (Code == 0 || (string)ResInfo == "")
- {
- TPRINTA_ERROR("Code or ResInfo is empty");
- return RET_FAILED;
- }
- MessageInfo info;
- info.CodeID = Code;
- info.Type = nMessageType;
- info.Level = Level;
- info.Resouceinfo = ResInfo;
- info.Description = Description;
- string strDevInstanceCode = DevInstance;
- strDevInstanceCode += Code;
- for (size_t i = 0; i < m_pResErrorList->size(); i++)
- {
- string strInstancekey = m_pResErrorList->GetKey(i);
- if (strInstancekey == strDevInstanceCode)
- {
- //for (size_t j = 0; j < (*m_pResErrorList)[DevInstance].size(); j++)
- //{
- // string strCodekey = (*m_pResErrorList)[DevInstance].GetKey(j);
- // string strtype = (*m_pResErrorList)[DevInstance][strCodekey.c_str()]["Type"];
- // if (strCodekey == (string)Code && atoi(strtype.c_str()) == nMessageType)
- // {
- //ret = 0;
- TPRINTA_DEBUG("Same Code:%s with MessageType:%d already Exist", Code,nMessageType);
- return RET_SUCCEED;
- // }
- //}
- //ret = 2;
- //break;
- }
- }
- //if (ret==1)
- {
-
- ResDataObject NotifyData, ResNotify, ErrorInfo/*, tempInfo*/;
- //info.GetResDataObject(tempInfo);
- //ErrorInfo.update(Code, tempInfo);
- info.GetResDataObject(ErrorInfo);
- SYSTEMTIME st;
- GetLocalTime(&st);
- string TimeTag = FormatstdString("%04d-%02d-%02d %02d:%02d:%02d.%03u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
- ErrorInfo.add("CreationTime", TimeTag.c_str());
- ErrorInfo.add("AppId", pAppId);
- ErrorInfo.add("InstanceId", DevInstance);
-
- if (nMessageType == ERRORTYPE)//只有错误会增加到错误列表中,警告通知上层即可
- {
- m_pResErrorList->update(strDevInstanceCode.c_str(), ErrorInfo);
- }
- ResNotify.update(strDevInstanceCode.c_str(), ErrorInfo);
- PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_ADD, "ErrorList", ResNotify);
- RES_TPRINTA_DEBUG(NotifyData, "preposterror ErrorType:%u", nMessageType);
- CmdFromLogicDev(&NotifyData);
- }
- //else if (ret == 2)
- //{
- // ResDataObject NotifyData, ResNotify, ErrorInfo, tempInfo;
- // info.GetResDataObject(tempInfo);
- // ErrorInfo.update(Code, tempInfo);
- // if (nMessageType == ERRORTYPE)//只有错误会增加到错误列表中,警告通知上层即可
- // {
- // (*m_pResErrorList)[DevInstance].update(Code, tempInfo);
- // }
- // ResNotify.update(DevInstance, ErrorInfo);
- // PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_ADD, "ErrorList", ResNotify);
- // RES_TPRINTA_DEBUG(NotifyData, "preposterror RET:%d,ErrorType:%u", ret, nMessageType);
- // CmdFromLogicDev(&NotifyData);
- //}
- //put log here
- return RET_SUCCEED;
- }
- RET_STATUS LogicDevice::AddErrorMessage(const char* Code, int &Level, const char* ResInfo, int nMessageType, const char* pAppId)
- {
- AddErrorMessage(m_pDevInstance, Code, Level, ResInfo, "",nMessageType, pAppId);
- //put log here
- return RET_FAILED;
- }
- RET_STATUS LogicDevice::DelErrorMessage(const char* DevInstance, const char* Code, int &Level, const char* ResInfo, const char* Description, int nMessageType)
- {
- int index = -1;
- bool m_bClearAll = false;
- //trim empty code string
- string CodeStr = Code;
- if (CodeStr.size() == 0 || CodeStr == "0" || CodeStr == "")
- {
- CodeStr = " ";
- Code = CodeStr.c_str();
- m_bClearAll = true;
- }
-
- //if ((string)Code == "0" || (string)Code == "")
- //{
- // m_bClearAll = true;
- //}
- string strDevInstanceCode = DevInstance;
- strDevInstanceCode += Code;
- if (m_bClearAll)
- {
- m_pResErrorList->clear();
- }
- else
- {
- MessageInfo info;
- info.CodeID = Code;
- info.Type = nMessageType;
- info.Level = Level;
- info.Resouceinfo = ResInfo;
- info.Description = Description;
-
- for (size_t i = 0; i < m_pResErrorList->size(); i++)
- {
- string strInstancekey = m_pResErrorList->GetKey(i);
- if (strInstancekey == strDevInstanceCode)
- {
- //for (size_t j = 0; j < (*m_pResErrorList)[DevInstance].size(); j++)
- //{
- // string strCodekey = (*m_pResErrorList)[DevInstance].GetKey(j);
- // string strtype = (*m_pResErrorList)[DevInstance][strCodekey.c_str()]["Type"];
- // if (strCodekey == (string)Code && atoi(strtype.c_str()) == nMessageType)
- // {
- // index = (INT)j;
- // break;
- // }
- //}
- index = (INT)i;
- break;
- }
- }
- }
- MessageInfo info;
- info.CodeID = Code;
- info.Type = nMessageType;
- info.Level = Level;
- info.Resouceinfo = ResInfo;
- info.Description = Description;
- ResDataObject NotifyData, ResNotify, ErrorInfo/*, tempInfo*/;
- //info.GetResDataObject(tempInfo);
- //ErrorInfo.add(Code, tempInfo);
- info.GetResDataObject(ErrorInfo);
- ErrorInfo.add("InstanceId", DevInstance);
- bool result = false;
- if (index>=0)
- {
- //result = (*m_pResErrorList)[DevInstance].eraseOneOf(Code, index);
- result = (*m_pResErrorList).eraseAllOf(strDevInstanceCode.c_str());
-
- }
- if (index >= 0 || m_bClearAll || nMessageType == WARNTYPE)
- {
- ResNotify.add(strDevInstanceCode.c_str(), ErrorInfo);
- PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_DEL, "ErrorList", ResNotify);
- RES_TPRINTA_DEBUG(NotifyData, "pre Del error ErrorCode:%s", Code);
- CmdFromLogicDev(&NotifyData);
- }
- return RET_SUCCEED;
- }
- RET_STATUS LogicDevice::DelErrorMessage(const char* Code, int &Level, const char* ResInfo, int nMessageType)
- {
- DelErrorMessage(m_pDevInstance, Code, Level, ResInfo, "", nMessageType);
- //put log here
- return RET_FAILED;
- }
- RET_STATUS LogicDevice::EvtProcedure()
- {
- return RET_FAILED;
- }
- bool LogicDevice::CheckFeatureLicense(const char *pszFeatureId)
- {
- TPRINTA_ERROR("NOT FINISHED YET");
- return false;
- }
- RET_STATUS LogicDevice::IoSystemLog(int Level, const char* pCode, const char* pContext, size_t ContextSize, const char* pAppId)
- {
- std::string strResult = "";
- //组Context包
- if (m_pLogger)
- {
- wstring wContect = mb2wc_a(pContext);
- CBase64::Encode((const unsigned char*)wContect.c_str(), (unsigned long)wContect.size() * sizeof(wchar_t), strResult);
- }
- //Thread_Lock();
- //if (NULL != fmt)
- //{
- // va_list marker = NULL;
- // va_start(marker, fmt);
- // size_t nLength = _vscprintf(fmt, marker) + 1;
- // std::vector<char> vBuffer(nLength, '\0');
- // int nWritten = vsnprintf_s(&vBuffer[0], vBuffer.size(), nLength, fmt, marker);
- // if (nWritten > 0)
- // {
- // strResult = &vBuffer[0];
- // }
- // va_end(marker);
- //}
- //Thread_UnLock();
- ResDataObject SysLogNode;
- string guidstr;
- GUID DeviceGuid;
- //组Log包
- if (GetDeviceType(DeviceGuid))
- {
- guid_2_string(DeviceGuid, guidstr);
- SysLogNode.add("Module", guidstr.c_str());
- SysLogNode.add("AppId", pAppId);
- SysLogNode.add("ThreadId", GetCurrentThreadId());
- if (pCode)
- {
- SysLogNode.add("BusinessKey", pCode);
- }
- else
- {
- SysLogNode.add("BusinessKey", "");
- }
- SysLogNode.add("IP", (const char*)getLocalIpAddress());
- SYSTEMTIME st;
- GetLocalTime(&st);
- string TimeTag = FormatstdString("%04d-%02d-%02d %02d:%02d:%02d.%03u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
- SysLogNode.add("CreationTime", TimeTag.c_str());
- string strLevel = SysLogLevel2str(Level);
- SysLogNode.add("Level", strLevel.c_str());
- SysLogNode.add("HostName", (const char*)getLocalMachineId());
- SysLogNode.add("ProcessName", (const char*)GetModuleTitle());
- SysLogNode.add("FreeText", strResult.c_str());
- SysLogNode.add("Context", pCode);
- ResDataObject NotifyData;
- PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_MSG, "Syslog", SysLogNode);
- CmdFromLogicDev(&NotifyData);
- }
- else
- {
- PRINTA_ERROR(m_pLogger, "no Guid??");
- return RET_FAILED;
- }
- //打印LOG
- switch (Level)
- {
- case Syslog_Debug:
- RES_PRINTA_DEBUG(m_pLogger, SysLogNode, "SysLog");
- break;
- case Syslog_Information:
- RES_PRINTA_INFO(m_pLogger, SysLogNode, "SysLog");
- break;
- case Syslog_Warning:
- RES_PRINTA_WARN(m_pLogger, SysLogNode, "SysLog");
- break;
- case Syslog_Error:
- RES_PRINTA_ERROR(m_pLogger, SysLogNode, "SysLog");
- break;
- case Syslog_Fatal:
- RES_PRINTA_FATAL(m_pLogger, SysLogNode, "SysLog");
- break;
- default:
- RES_PRINTA_TRACE(m_pLogger, SysLogNode, "SysLog");
- break;
- }
- return RET_SUCCEED;
- }
- RET_STATUS LogicDevice::SystemLog(SYSLOGLEVEL Level,const char *pCode, const char* fmt, ...)
- {
- std::string strResult = "";
- //组Context包
- if (m_pLogger)
- {
- m_pLogger->Thread_Lock();
- if (NULL != fmt)
- {
- va_list marker = NULL;
- va_start(marker, fmt);
- size_t nLength = _vscprintf(fmt, marker) + 1;
- std::vector<char> vBuffer(nLength, '\0');
- int nWritten = vsnprintf_s(&vBuffer[0], vBuffer.size(), nLength, fmt, marker);
- if (nWritten > 0)
- {
- strResult = &vBuffer[0];
- }
- va_end(marker);
- }
- m_pLogger->Thread_UnLock();
- }
- //Thread_Lock();
- //if (NULL != fmt)
- //{
- // va_list marker = NULL;
- // va_start(marker, fmt);
- // size_t nLength = _vscprintf(fmt, marker) + 1;
- // std::vector<char> vBuffer(nLength, '\0');
- // int nWritten = vsnprintf_s(&vBuffer[0], vBuffer.size(), nLength, fmt, marker);
- // if (nWritten > 0)
- // {
- // strResult = &vBuffer[0];
- // }
- // va_end(marker);
- //}
- //Thread_UnLock();
- ResDataObject SysLogNode;
- string guidstr;
- GUID DeviceGuid;
- //组Log包
- if (GetDeviceType(DeviceGuid))
- {
- guid_2_string(DeviceGuid, guidstr);
- SysLogNode.add("Module", guidstr.c_str());
- SysLogNode.add("AppId", "");
- SysLogNode.add("ThreadId", GetCurrentThreadId());
- if (pCode)
- {
- SysLogNode.add("BusinessKey", pCode);
- }
- else
- {
- SysLogNode.add("BusinessKey", "");
- }
- SysLogNode.add("IP", (const char *)getLocalIpAddress());
- SYSTEMTIME st;
- GetLocalTime(&st);
- string TimeTag = FormatstdString("%04d-%02d-%02d %02d:%02d:%02d.%03u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
- SysLogNode.add("CreationTime", TimeTag.c_str());
- SysLogNode.add("Level", Level);
- SysLogNode.add("HostName", (const char *)getLocalMachineId());
- SysLogNode.add("ProcessName", (const char *)GetModuleTitle());
- SysLogNode.add("FreeText", strResult.c_str());
- ResDataObject NotifyData;
- PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_MSG, "Syslog", SysLogNode);
- CmdFromLogicDev(&NotifyData);
- }
- else
- {
- PRINTA_ERROR(m_pLogger,"no Guid??");
- return RET_FAILED;
- }
- //打印LOG
- switch (Level)
- {
- case Syslog_Debug:
- RES_PRINTA_DEBUG(m_pLogger, SysLogNode, "SysLog");
- break;
- case Syslog_Information:
- RES_PRINTA_INFO(m_pLogger, SysLogNode, "SysLog");
- break;
- case Syslog_Warning:
- RES_PRINTA_WARN(m_pLogger, SysLogNode, "SysLog");
- break;
- case Syslog_Error:
- RES_PRINTA_ERROR(m_pLogger, SysLogNode, "SysLog");
- break;
- case Syslog_Fatal:
- RES_PRINTA_FATAL(m_pLogger, SysLogNode, "SysLog");
- break;
- default:
- RES_PRINTA_TRACE(m_pLogger, SysLogNode, "SysLog");
- break;
- }
- return RET_SUCCEED;
- }
|