#include "stdafx.h" #include "HsmsAction.h" CHsmsAction::CHsmsAction() { m_nAction = ACTION_IDLE; m_bNeedWaitReply = FALSE; m_nTimeout = 45; m_nResponseTime = 0; m_pContext = NULL; m_pSendMessage = NULL; m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); } CHsmsAction::CHsmsAction(int nAction, BOOL bNeedReply, unsigned int nTimeout) { m_nAction = nAction; m_bNeedWaitReply = bNeedReply; m_nTimeout = nTimeout; m_nResponseTime = 0; m_pContext = NULL; m_pSendMessage = NULL; m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); } CHsmsAction::~CHsmsAction() { if (m_hEvent != NULL) { CloseHandle(m_hEvent); m_hEvent = NULL; } if (m_pSendMessage != NULL) { HSMS_Destroy1Message(m_pSendMessage); m_pSendMessage = NULL; } } void CHsmsAction::reset() { m_nAction = ACTION_IDLE; m_bNeedWaitReply = FALSE; m_nTimeout = 45; m_nResponseTime = 0; if (m_pSendMessage != NULL) { HSMS_Destroy1Message(m_pSendMessage); m_pSendMessage = NULL; } ::ResetEvent(m_hEvent); } void CHsmsAction::resetResponseTime() { m_nResponseTime = 0; } void CHsmsAction::setAction(int nAction, BOOL bNeedReply/* = TRUE*/, unsigned int nTimeout/* = 45*/) { m_nAction = nAction; m_bNeedWaitReply = bNeedReply; m_nTimeout = nTimeout; } int CHsmsAction::getAction() { return m_nAction; } void CHsmsAction::setContext(CContext* pContext) { m_pContext = pContext; } CContext* CHsmsAction::getContext() { return m_pContext; } void CHsmsAction::setSendMessage(IMessage* pMessage) { if (m_pSendMessage != NULL && m_pSendMessage != pMessage) { HSMS_Destroy1Message(m_pSendMessage); } m_pSendMessage = pMessage; } IMessage* CHsmsAction::getSendMessage() { return m_pSendMessage; } unsigned int CHsmsAction::getTimeout() { return m_nTimeout; } BOOL CHsmsAction::isNeedWaitReply() { return m_bNeedWaitReply; } HANDLE CHsmsAction::getEvent() { return m_hEvent; } int CHsmsAction::responseTimeIncrement() { return InterlockedIncrement(&m_nResponseTime); } BOOL CHsmsAction::incrementAndCheckTimeout() { unsigned int nResponseTime = InterlockedIncrement(&m_nResponseTime); return nResponseTime >= m_nTimeout + 1; } int CHsmsAction::serialize(char* pszBuffer, int nBufferSize) { int index = 0; if (m_pSendMessage == NULL) { return 0; } if (pszBuffer == nullptr) { index += sizeof(int); index += sizeof(m_nTimeout); index += sizeof(int); index += sizeof(BOOL); index += m_pSendMessage->serialize(nullptr, 0); return index; } else { memcpy(&pszBuffer[index], &m_nAction, sizeof(int)); index += sizeof(int); memcpy(&pszBuffer[index], &m_nTimeout, sizeof(int)); index += sizeof(int); memcpy(&pszBuffer[index], &m_nResponseTime, sizeof(int)); index += sizeof(int); memcpy(&pszBuffer[index], &m_bNeedWaitReply, sizeof(BOOL)); index += sizeof(BOOL); index += m_pSendMessage->serialize(&pszBuffer[index], nBufferSize - index); return index; } } int CHsmsAction::unserialize(const char* pszBuffer, int nBufferSize) { int index = 0; if (index + sizeof(int) > nBufferSize) return -1; memcpy(&m_nAction, &pszBuffer[index], sizeof(int)); index += sizeof(int); if (index + sizeof(int) > nBufferSize) return -1; memcpy(&m_nTimeout, &pszBuffer[index], sizeof(int)); index += sizeof(int); if (index + sizeof(int) > nBufferSize) return -1; memcpy(&m_nResponseTime, &pszBuffer[index], sizeof(int)); index += sizeof(int); if (index + sizeof(BOOL) > nBufferSize) return -1; memcpy(&m_bNeedWaitReply, &pszBuffer[index], sizeof(BOOL)); index += sizeof(BOOL); if (m_pSendMessage != NULL) { HSMS_Destroy1Message(m_pSendMessage); m_pSendMessage = NULL; } if (HSMS_Create1Message(m_pSendMessage, 1, 1 | REPLY, 1, 1) != 0 || m_pSendMessage == NULL) { return -1; } int nRet = m_pSendMessage->unserialize(&pszBuffer[index], nBufferSize - index); if (nRet < 0) return nRet; return index + nRet; }