升龙物业 老版本 ocx IPO, 加密狗 转值班电话

PduDataFormat.cpp 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "StdAfx.h"
  2. #include "PduDataFormat.h"
  3. #include "PduLinkInc.h"
  4. #include "PduDataFormatOne.h"
  5. CPduDataFormat* CPduDataFormat::m_pInstance = NULL;
  6. CPduDataFormat::CPduDataFormat(void)
  7. {
  8. ZeroMemory(m_pDataFormatArray, PDU_MAX_CMD_COUNT*sizeof(long));
  9. }
  10. CPduDataFormat::~CPduDataFormat(void)
  11. {
  12. if(NULL != m_pInstance) delete m_pInstance;
  13. }
  14. /*****************************************************************
  15. **【函数名称】 getInstance
  16. **【函数功能】 得到接口指针
  17. **【参数】
  18. **【返回值】
  19. ****************************************************************/
  20. CPduDataFormat* CPduDataFormat::getInstance()
  21. {
  22. if(NULL == m_pInstance)
  23. {
  24. m_pInstance = new CPduDataFormat();
  25. } // end if
  26. return m_pInstance;
  27. }
  28. /*****************************************************************
  29. **【函数名称】 Load
  30. **【函数功能】 从配置文件中读取PDU数据格式配置信息
  31. **【参数】 a_lpFileName 配置文件名
  32. **【返回值】
  33. ****************************************************************/
  34. BOOL CPduDataFormat::Load(LPCTSTR a_lpFileName)
  35. {
  36. // 读取配置文件头
  37. int nTotalCount = GetPrivateProfileInt("Head", "TotalCount", 0, a_lpFileName);
  38. ASSERT(nTotalCount != 0);
  39. // 读取配置文件内容
  40. for(int i=0; i<nTotalCount; i++)
  41. {
  42. // 读取单个命令的配置信息
  43. CHAR szAppName[32];
  44. ZeroMemory(szAppName, 32);
  45. sprintf_s(szAppName, 32, "PDU_CMD_FORMAT_%03d", i);
  46. // 生成PDU命令格式解析类
  47. int nCmdType = GetPrivateProfileInt(szAppName, "CmdType", 0, a_lpFileName); // 命令类型
  48. CPduDataFormatOne* pFormat = new CPduDataFormatOne((PDU_CMD_TYPE)nCmdType);
  49. // 生成元数据内容
  50. int nDataCount = GetPrivateProfileInt(szAppName, "DataCount", 0, a_lpFileName); // 元数据条数
  51. for(int j=0; j<nDataCount; j++)
  52. {
  53. // 得到Key值
  54. CHAR szKey[32];
  55. ZeroMemory(szKey, 32);
  56. sprintf_s(szKey, 32, "DATA[%d]", j);
  57. // 填充元数据条目
  58. CHAR szMemo[256];
  59. ZeroMemory(szMemo, 256);
  60. GetPrivateProfileString(szAppName, szKey, "0|0|null|0", szMemo, 256, a_lpFileName);
  61. pFormat->InsertDataMemo(j, szMemo);
  62. } // end for(DataCount)
  63. // 保存当前命令解析
  64. m_pDataFormatArray[nCmdType] = pFormat;
  65. } // end for(TotalCount)
  66. return TRUE;
  67. }
  68. /*****************************************************************
  69. **【函数名称】 Load
  70. **【函数功能】 从数据库中读取PDU数据格式配置信息
  71. **【参数】
  72. **【返回值】
  73. ****************************************************************/
  74. BOOL CPduDataFormat::Load()
  75. {
  76. return FALSE;
  77. }
  78. /*****************************************************************
  79. **【函数名称】 Clone
  80. **【函数功能】 拷贝一个指定命令的副本
  81. **【参数】 a_nCmdType 命令类型
  82. a_pCloned 命令副本
  83. **【返回值】
  84. ****************************************************************/
  85. CPduDataFormatOne* CPduDataFormat::Clone(PDU_CMD_TYPE a_nCmdType)
  86. {
  87. // 命令格式定义
  88. if(a_nCmdType >= PDU_MAX_CMD_COUNT) return NULL;
  89. CPduDataFormatOne* pSource = m_pDataFormatArray[a_nCmdType];
  90. if(pSource == NULL) return NULL;
  91. // 生成副本
  92. CPduDataFormatOne* pDest = new CPduDataFormatOne(a_nCmdType);
  93. for(int i=0; i<PDU_CMD_MAX_DATA_COUNT; i++)
  94. {
  95. if(pSource->m_pDataMemoArray[i] == NULL) break;
  96. // 拷贝数据
  97. PduDataMemo* pDataMemo = new PduDataMemo;
  98. memcpy(pDataMemo, pSource->m_pDataMemoArray[i], sizeof(PduDataMemo));
  99. pDest->m_pDataMemoArray[i] = pDataMemo;
  100. } // end for
  101. return pDest;
  102. }