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