gusucode.com > 通用协议编解码模块C#源码程序 > 通用协议编解码模块/codec_src/Codec_src/MsgCodec/FixMsgNode.cpp
// FixMsgNode.cpp: implementation of the CFixMsgNode class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MsgNode.h" #include "FixMsgNode.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif DEFINE_NODE_IMPLEMENTATION(FixMsgNode) CFixMsgNode::CFixMsgNode() { m_nLenSub = 0; } CFixMsgNode::~CFixMsgNode() { } BOOL GetParamElem(CString &strElem, CString &strParam, BOOL bRemoveElem = TRUE); BOOL CFixMsgNode::ParseParam(LPCTSTR szParam) { BOOL bResult = TRUE; CString str, strParam(szParam); int nItemNum = 0; while (nItemNum < 3) { GetParamElem(str, strParam); switch (nItemNum) { case (0): if (str.CompareNoCase("Number") == 0) m_mntNodeType = mntNumber; else if (str.CompareNoCase("Octet") == 0) m_mntNodeType = mntOctet; else if (str.CompareNoCase("ASCII") == 0) m_mntNodeType = mntASCII; else if (str.CompareNoCase("BCD") == 0) m_mntNodeType = mntBCD; else m_mntNodeType = mntOctet; break; case (1): if (str.IsEmpty()) { m_bFixLength = FALSE; } else { if (! ((str[0] >= '0') && (str[0] <= '9'))) { int nFind = str.Find('+'); int nFind2 = str.Find('-'); if (nFind > 0) { m_strLenNode = str.Left(nFind); str = str.Right(str.GetLength() - nFind - 1); m_nLenSub = ::atol(str); } else if (nFind2 > 0) { m_strLenNode = str.Left(nFind2); m_strLenNode.TrimRight(); m_strLenNode = "../" + m_strLenNode; str = str.Right(str.GetLength() - nFind2 - 1); m_nLenSub = - ::atol(str); } else { m_strLenNode = "../" + str; m_nLenSub = 0; } m_bFixLength = FALSE; m_PosInfo.nBitLen = 0; } else { m_PosInfo.nBitLen = ::atol(str); if (str.Right(3).CompareNoCase("bit") == 0) ; else if (str.Right(4).CompareNoCase("byte") == 0) m_PosInfo.nBitLen *= 8; else if (str.Right(4).CompareNoCase("word") == 0) m_PosInfo.nBitLen *= 16; else if (str.Right(5).CompareNoCase("dword") == 0) m_PosInfo.nBitLen *= 32; else m_PosInfo.nBitLen *= 8; } } break; case (2): if (! str.IsEmpty()) m_pEnumTable = CodecPrivateServ::GetEnumTable(str); break; } nItemNum ++; } return bResult; } BOOL CFixMsgNode::SetValue(const BYTE *szValue, LONG nByteLength) { if (! m_strLenNode.IsEmpty()) { IMsgNode *pLenNode = LocateNode(m_strLenNode); if (pLenNode) { pLenNode->SetNodeValue((DWORD)(nByteLength - m_nLenSub)); } } return CMsgNode::SetValue(szValue, nByteLength); } UINT CFixMsgNode::PrepareDecode(LONG &nByteStart, LONG &nBitStart) { if (! m_strLenNode.IsEmpty()) { IMsgNode *pLenNode = LocateNode(m_strLenNode); if (pLenNode) { DWORD nLen = 0; pLenNode->GetNodeValue(nLen); m_PosInfo.nBitLen = (nLen + m_nLenSub) * 8; } } return CMsgNode::PrepareDecode(nByteStart, nBitStart); }