多数据源中间件标准版1.0

CellSubFlow.cpp 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include "StdAfx.h"
  2. #include "CellSubFlow.h"
  3. #include "IvrFlow.h"
  4. #include "FlowDataProvider.h"
  5. #include "IvrCore.h"
  6. #include "FlowTemplate.h"
  7. IMPLEMENT_CELL_AUTOCREATE(CCellSubFlow, CELL_NAME_SUB_FLOW)
  8. CCellSubFlow::CCellSubFlow(void) : m_pInnerFlow(NULL), m_NextPos(0), m_BeginPos(0)
  9. {
  10. }
  11. CCellSubFlow::CCellSubFlow( CCellSubFlow& CellSubFlow ) : CCellBase(CellSubFlow)
  12. {
  13. m_NextPos = CellSubFlow.m_NextPos;
  14. m_BeginPos = CellSubFlow.m_BeginPos;
  15. m_FLowName = CellSubFlow.m_FLowName;
  16. }
  17. CCellSubFlow::~CCellSubFlow(void)
  18. {
  19. if(m_pInnerFlow != NULL)
  20. delete m_pInnerFlow;
  21. }
  22. /*****************************************************************
  23. **【函数名称】 operate
  24. **【函数功能】 节点执行函数
  25. **【参数】
  26. **【返回值】 下一个节点编号
  27. ****************************************************************/
  28. int CCellSubFlow::operate( void )
  29. {
  30. if(m_pIvrFlow == NULL)
  31. return CELL_OP_ERROR;
  32. CString Info;
  33. _getCellInfo(Info);
  34. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info);
  35. CFlowTemplate* pTemplate = CIvrCore::GetInstance().flowTemplateMgr().findTemplate(m_FLowName);
  36. ASSERT(pTemplate != NULL);
  37. if(pTemplate == NULL)
  38. {
  39. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 未找到子流程模板[%s]"), Info, m_FLowName);
  40. return CELL_OP_ERROR;
  41. }
  42. m_pInnerFlow = new CIvrFlow(m_pIvrFlow->id());
  43. ASSERT(m_pInnerFlow != NULL);
  44. if(m_pInnerFlow == NULL)
  45. {
  46. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 创建子流程执行体失败"), Info);
  47. return CELL_OP_ERROR;
  48. }
  49. m_pInnerFlow->copyVar(*m_pIvrFlow);
  50. int Res = m_pInnerFlow->start(pTemplate, m_BeginPos);
  51. switch(Res)
  52. {
  53. case CELL_OP_END:
  54. case CELL_OP_ERROR:
  55. case CELL_OP_SEND_ERROR:
  56. return m_NextPos;
  57. break;
  58. case CELL_OP_WAIT_FOR:
  59. return CELL_OP_WAIT_FOR;
  60. break;
  61. default:
  62. ASSERT(FALSE);
  63. }
  64. return m_NextPos;
  65. }
  66. /*****************************************************************
  67. **【函数名称】 copy
  68. **【函数功能】 拷贝自身
  69. **【参数】
  70. **【返回值】 拷贝副本
  71. ****************************************************************/
  72. CCellBase * CCellSubFlow::copy( void )
  73. {
  74. CCellBase * pCellBase = new CCellSubFlow(*this);
  75. return pCellBase;
  76. }
  77. /*****************************************************************
  78. **【函数名称】 fillData
  79. **【函数功能】 节点解析,填充数据
  80. **【参数】 Provider:数据提供器
  81. **【返回值】 成功true,失败false
  82. ****************************************************************/
  83. bool CCellSubFlow::fillData( IFlowDataProvider& Provider )
  84. {
  85. CString Data;
  86. do
  87. {
  88. if(!Provider.getData(CELL_ATTRIBUTE_POS, Data))
  89. {
  90. Data = _T("节点号");
  91. break;
  92. }
  93. else
  94. {
  95. sscanf_s(Data, _T("%d"), &m_Pos);
  96. if(m_Pos < 1)
  97. {
  98. Data = _T("节点号");
  99. break;
  100. }
  101. }
  102. if(!Provider.getData(CELL_ATTRIBUTE_FLOW_NAME, m_FLowName))
  103. {
  104. Data = _T("子流程名");
  105. break;
  106. }
  107. if(!Provider.getData(CELL_ATTRIBUTE_BEGIN_POS, Data))
  108. {
  109. Data = _T("起始节点");
  110. break;
  111. }
  112. else
  113. {
  114. sscanf_s(Data, _T("%d"), &m_BeginPos);
  115. if(m_BeginPos < 1)
  116. {
  117. Data = _T("起始节点");
  118. break;
  119. }
  120. }
  121. if(!Provider.getData(CELL_ATTRIBUTE_NEXT, Data))
  122. {
  123. Data = _T("跳转节点");
  124. break;
  125. }
  126. else
  127. {
  128. sscanf_s(Data, _T("%d"), &m_NextPos);
  129. if(m_NextPos < 1)
  130. {
  131. Data = _T("跳转节点");
  132. break;
  133. }
  134. }
  135. Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note);
  136. return true;
  137. } while (false);
  138. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_SUB_FLOW, Data);
  139. return false;
  140. }
  141. /*****************************************************************
  142. **【函数名称】 onOpResultReturn
  143. **【函数功能】 处理PDU命令
  144. **【参数】 a_pPduEntity:PDU命令
  145. **【返回值】 下一个节点编号
  146. ****************************************************************/
  147. int CCellSubFlow::onOpResultReturn( CPduEntity *a_pPduEntity )
  148. {
  149. int Res = m_pInnerFlow->procPdu(a_pPduEntity);
  150. switch(Res)
  151. {
  152. case CELL_OP_END:
  153. case CELL_OP_ERROR:
  154. case CELL_OP_SEND_ERROR:
  155. return m_NextPos;
  156. break;
  157. case CELL_OP_WAIT_FOR:
  158. return CELL_OP_WAIT_FOR;
  159. break;
  160. default:
  161. ASSERT(FALSE);
  162. }
  163. return m_NextPos;
  164. }