MiddleWares_YiHe 郑州颐和医院随访系统中间件

CellSocket.cpp 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. #include "StdAfx.h"
  2. #include "CellSocket.h"
  3. #include "IvrFlow.h"
  4. #include "FlowDataProvider.h"
  5. #include "MarkupSTL.h"
  6. using namespace std;
  7. IMPLEMENT_CELL_AUTOCREATE(CCellSocket, CELL_NAME_SOCKET)
  8. CCellSocket::CCellSocket(void) : m_FarPort(0), m_TimeOut(0), m_SuccessPos(0), m_FailPos(0)
  9. {
  10. }
  11. CCellSocket::CCellSocket( CCellSocket & cellSocket ) : CCellBase(cellSocket)
  12. {
  13. POSITION pos = cellSocket.m_InputVarList.GetHeadPosition();
  14. while(pos != NULL)
  15. {
  16. InputVarInfo *pVarInfo = cellSocket.m_InputVarList.GetNext(pos);
  17. ASSERT(pVarInfo != NULL);
  18. InputVarInfo *pVarInfoTmp = new InputVarInfo(*pVarInfo);
  19. ASSERT(pVarInfoTmp != NULL);
  20. m_InputVarList.AddTail(pVarInfoTmp);
  21. }
  22. for (int i = 0; i < cellSocket.m_OutputVarList.GetSize(); ++i)
  23. {
  24. ASSERT(cellSocket.m_OutputVarList[i].GetLength() != 0);
  25. m_OutputVarList.Add(cellSocket.m_OutputVarList[i]);
  26. }
  27. m_OpType = cellSocket.m_OpType;
  28. m_FarAddr = cellSocket.m_FarAddr;
  29. m_FarPort = cellSocket.m_FarPort;
  30. m_TimeOut = cellSocket.m_TimeOut;
  31. m_SuccessPos = cellSocket.m_SuccessPos;
  32. m_FailPos = cellSocket.m_FailPos;
  33. }
  34. CCellSocket::~CCellSocket(void)
  35. {
  36. __release();
  37. }
  38. /*****************************************************************
  39. **【函数名称】 __release
  40. **【函数功能】 释放资源
  41. **【参数】
  42. **【返回值】
  43. ****************************************************************/
  44. void CCellSocket::__release( void )
  45. {
  46. while(!m_InputVarList.IsEmpty())
  47. delete m_InputVarList.RemoveHead();
  48. }
  49. /*****************************************************************
  50. **【函数名称】 __formatInputVar
  51. **【函数功能】 格式化输入字符串
  52. **【参数】
  53. **【返回值】
  54. ****************************************************************/
  55. int CCellSocket::__formatInputVar( char* InputText )
  56. {
  57. CMarkupSTL XmlInput;
  58. XmlInput.AddElem(SOCKET_INPUT_PREFIX);
  59. XmlInput.AddAttrib(SOCKET_INPUT_OP_TYPE, m_OpType);
  60. int i = 1;
  61. CString VarName;
  62. CString VarValue;
  63. POSITION Pos = m_InputVarList.GetHeadPosition();
  64. while(Pos != NULL)
  65. {
  66. InputVarInfo* pVarInfo = m_InputVarList.GetNext(Pos);
  67. ASSERT(pVarInfo != NULL);
  68. if(pVarInfo->VarType == CELL_DATA_VAR)
  69. {
  70. if(!m_pIvrFlow->findVarValue(pVarInfo->szVarValue, VarValue))
  71. {
  72. CString Info;
  73. _getCellInfo(Info);
  74. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错,变量[%s]未找到对应值"), Info, pVarInfo->szVarValue);
  75. }
  76. }
  77. else
  78. {
  79. VarValue = pVarInfo->szVarValue;
  80. }
  81. VarName.Format(_T("%s%d"), SOCKET_VAR_PREFIX, i++);
  82. XmlInput.AddChildElem(VarName, VarValue);
  83. }
  84. lstrcpy(InputText, XmlInput.GetDoc().c_str());
  85. return XmlInput.GetDoc().length();
  86. }
  87. /*****************************************************************
  88. **【函数名称】 __analyzeOutputVar
  89. **【函数功能】 解析输出字符串
  90. **【参数】
  91. **【返回值】
  92. ****************************************************************/
  93. bool CCellSocket::__analyzeOutputVar( char* OutputText )
  94. {
  95. CMarkupSTL XmlOutput;
  96. if(!XmlOutput.SetDoc(OutputText))
  97. {
  98. CString Info;
  99. _getCellInfo(Info);
  100. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错,无法加载网络返回数据, Data = %s"), Info, OutputText);
  101. return false;
  102. }
  103. if(!XmlOutput.FindElem(SOCKET_OUTPUT_PREFIX))
  104. {
  105. CString Info;
  106. _getCellInfo(Info);
  107. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错,无法解析网络返回数据, Data = %s"), Info, OutputText);
  108. return false;
  109. }
  110. CString Element;
  111. Element = XmlOutput.GetAttrib(SOCKET_INPUT_OP_TYPE).c_str();
  112. if(Element != m_OpType)
  113. {
  114. CString Info;
  115. _getCellInfo(Info);
  116. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错,网络返回的操作类型[%s]与当前类型[%s]不匹配"), Info, Element, m_OpType);
  117. return false;
  118. }
  119. for(int i = 0; i < m_OutputVarList.GetSize(); ++i)
  120. {
  121. Element.Format(_T("%s%d"), SOCKET_VAR_PREFIX, i + 1);
  122. if(XmlOutput.FindChildElem(Element))
  123. {
  124. XmlOutput.IntoElem();
  125. m_pIvrFlow->addVar(m_OutputVarList[i], XmlOutput.GetData().c_str());
  126. XmlOutput.OutOfElem();
  127. }
  128. else
  129. {
  130. CString Info;
  131. _getCellInfo(Info);
  132. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错,无法在网络数据中定位字段[%s], Data = %s"), Info, Element, OutputText);
  133. return false;
  134. }
  135. }
  136. return true;
  137. }
  138. /*****************************************************************
  139. **【函数名称】 __wait4Recv
  140. **【函数功能】 等候接收网络数据
  141. **【参数】
  142. **【返回值】
  143. ****************************************************************/
  144. bool CCellSocket::__wait4Recv(SOCKET Sock)
  145. {
  146. struct timeval tv;
  147. fd_set fds;
  148. FD_ZERO(&fds);
  149. FD_SET(Sock, &fds);
  150. tv.tv_sec = m_TimeOut;
  151. tv.tv_usec = 0;
  152. int res = select(0, &fds, NULL, NULL, &tv);
  153. if(res > 0)
  154. return FD_ISSET(Sock, &fds) > 0 ? true : false;
  155. else
  156. return false;
  157. }
  158. /*****************************************************************
  159. **【函数名称】 addInputVar
  160. **【函数功能】 添加输入变量
  161. **【参数】
  162. **【返回值】
  163. ****************************************************************/
  164. void CCellSocket::addInputVar( int VarType, const CString& VarVal )
  165. {
  166. InputVarInfo *pInputVar = new InputVarInfo(VarType, VarVal);
  167. ASSERT(pInputVar != NULL);
  168. m_InputVarList.AddTail(pInputVar);
  169. }
  170. /*****************************************************************
  171. **【函数名称】 Operate
  172. **【函数功能】 节点执行函数
  173. **【参数】
  174. **【返回值】 下一个节点编号
  175. ****************************************************************/
  176. int CCellSocket::operate( void )
  177. {
  178. if(m_pIvrFlow == NULL)
  179. return CELL_OP_ERROR;
  180. CString Info;
  181. _getCellInfo(Info);
  182. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info);
  183. SOCKET Sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  184. if(Sock == INVALID_SOCKET)
  185. {
  186. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 初始化套接字失败"), Info);
  187. return m_FailPos;
  188. }
  189. CHAR Buffer[VAR_LEN] = { 0 };
  190. int Len = __formatInputVar(Buffer);
  191. SOCKADDR_IN AddrFar;
  192. AddrFar.sin_family = AF_INET;
  193. AddrFar.sin_port = htons(m_FarPort);
  194. inet_pton(AF_INET, m_FarAddr, &(AddrFar.sin_addr));
  195. if(AddrFar.sin_addr.s_addr == INADDR_NONE)
  196. {
  197. hostent* pHost = gethostbyname(m_FarAddr);
  198. if(pHost == NULL)
  199. {
  200. closesocket(Sock);
  201. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 远端地址异常, FarAddr = %s"), Info, m_FarAddr);
  202. return m_FailPos;
  203. }
  204. memcpy((char*)&AddrFar.sin_addr, pHost->h_addr, pHost->h_length);
  205. }
  206. int AddrLen = sizeof(SOCKADDR);
  207. Len = sendto(Sock, Buffer, Len, 0, (SOCKADDR*)&AddrFar, AddrLen) ;
  208. if(Len == SOCKET_ERROR)
  209. {
  210. closesocket(Sock);
  211. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 发送通讯数据失败, ErrCode = %d"), Info, WSAGetLastError());
  212. return m_FailPos;
  213. }
  214. if(!__wait4Recv(Sock))
  215. {
  216. closesocket(Sock);
  217. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 接收数据超时"), Info);
  218. return m_FailPos;
  219. }
  220. ZeroMemory(Buffer, VAR_LEN);
  221. ZeroMemory(&AddrFar, sizeof(AddrFar));
  222. Len = recvfrom(Sock, Buffer, VAR_LEN, 0, (SOCKADDR*)&AddrFar, &AddrLen);
  223. if(Len <= 0)
  224. {
  225. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 接收数据失败, ErrCode = %d"), Info, WSAGetLastError());
  226. closesocket(Sock);
  227. return m_FailPos;
  228. }
  229. closesocket(Sock);
  230. Buffer[Len] = 0;
  231. if(!__analyzeOutputVar(Buffer))
  232. return m_FailPos;
  233. else
  234. return m_SuccessPos;
  235. }
  236. /*****************************************************************
  237. **【函数名称】 copy
  238. **【函数功能】 拷贝自身
  239. **【参数】
  240. **【返回值】 拷贝副本
  241. ****************************************************************/
  242. CCellBase * CCellSocket::copy( void )
  243. {
  244. CCellBase *pCellBase = new CCellSocket(*this);
  245. return pCellBase;
  246. }
  247. /*****************************************************************
  248. **【函数名称】 fillData
  249. **【函数功能】 节点解析,填充数据
  250. **【参数】 Provider:数据提供器
  251. **【返回值】 成功true,失败false
  252. ****************************************************************/
  253. bool CCellSocket::fillData( IFlowDataProvider& Provider )
  254. {
  255. CString Data;
  256. do
  257. {
  258. if(!Provider.getData(CELL_ATTRIBUTE_POS, Data))
  259. {
  260. Data = _T("节点号");
  261. break;
  262. }
  263. else
  264. {
  265. sscanf_s(Data, _T("%d"), &m_Pos);
  266. if(m_Pos < 1)
  267. {
  268. Data = _T("节点号");
  269. break;
  270. }
  271. }
  272. if(!Provider.getData(CELL_ATTRIBUTE_OP_TYPE, m_OpType))
  273. {
  274. Data = _T("操作类型标识");
  275. break;
  276. }
  277. if(!Provider.getData(CELL_ATTRIBUTE_FAR_IP, m_FarAddr))
  278. {
  279. Data = _T("远端IP");
  280. break;
  281. }
  282. if(!Provider.getData(CELL_ATTRIBUTE_FAR_PORT, Data))
  283. {
  284. Data = _T("远端端口");
  285. break;
  286. }
  287. else
  288. {
  289. sscanf_s(Data, _T("%d"), &m_FarPort);
  290. if(m_FarPort <= 0)
  291. {
  292. Data = _T("远端端口");
  293. break;
  294. }
  295. }
  296. if(!Provider.getData(CELL_ATTRIBUTE_RECV_TIME_OUT, Data))
  297. {
  298. Data = _T("接收超时");
  299. break;
  300. }
  301. else
  302. {
  303. sscanf_s(Data, _T("%d"), &m_TimeOut);
  304. if(m_TimeOut <= 0)
  305. {
  306. Data = _T("接收超时");
  307. break;
  308. }
  309. }
  310. if(!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data))
  311. {
  312. Data = _T("成功跳转节点");
  313. break;
  314. }
  315. else
  316. {
  317. sscanf_s(Data, _T("%d"), &m_SuccessPos);
  318. if(m_SuccessPos < 0)
  319. {
  320. Data = _T("成功跳转节点");
  321. break;
  322. }
  323. }
  324. if(!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data))
  325. {
  326. Data = _T("失败跳转节点");
  327. break;
  328. }
  329. else
  330. {
  331. sscanf_s(Data, _T("%d"), &m_FailPos);
  332. if(m_FailPos < 0)
  333. {
  334. Data = _T("失败跳转节点");
  335. break;
  336. }
  337. }
  338. Data.Format(_T("%s[@%s='%d']/%s"), XPATH_CELL, CELL_ATTRIBUTE_POS, m_Pos, FLOW_SUB_NODE_SOCK_INPUT);
  339. if(!Provider.getFlowSocketInputVar(Data, *this))
  340. {
  341. Data = _T("输入变量");
  342. break;
  343. }
  344. Data.Format(_T("%s[@%s='%d']/%s"), XPATH_CELL, CELL_ATTRIBUTE_POS, m_Pos, FLOW_SUB_NODE_SOCK_OUTPUT);
  345. if(!Provider.getDataSet(Data, CELL_ATTRIBUTE_VAR, m_OutputVarList))
  346. {
  347. Data = _T("输出变量");
  348. break;
  349. }
  350. Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note);
  351. return true;
  352. } while (false);
  353. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_SOCKET, Data);
  354. return false;
  355. }