// 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 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 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 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; }