ChromiumFSM.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #include "stdafx.h"
  2. #include "ChromiumFSM.h"
  3. #include <set>
  4. #include <string>
  5. //#include "zmq_utils.h"
  6. #include <boost/bind.hpp>
  7. #include "../mod_FreeRDPWrap/FreeRDPWrap_client_g.h"
  8. #include "../mod_browser/IEBrowser_client_g.h"
  9. #include "Chromium_msg_g.h"
  10. #include "baseEx.h"
  11. namespace Chromium{
  12. CChromiumFSM::CChromiumFSM(CEntityBase* pEntity):m_pEntity(pEntity)
  13. {
  14. }
  15. CChromiumFSM::~CChromiumFSM(){
  16. // if (NULL != m_hZmqServerThread)
  17. // {
  18. // m_hZmqServerThread->interrupt();
  19. // }
  20. }
  21. ErrorCodeEnum CChromiumFSM::OnInit(){
  22. return Error_Succeed;
  23. }
  24. ErrorCodeEnum CChromiumFSM::OnExit(){
  25. return Error_Succeed;
  26. }
  27. void CChromiumFSM::s0_on_entry(){
  28. // init zmq and start zmq service
  29. // m_hZmqServerThread = new boost::thread(boost::bind(&CChromiumFSM::zmq_stream_server_proc, this));
  30. }
  31. void CChromiumFSM::s0_on_exit(){
  32. return;
  33. }
  34. unsigned int CChromiumFSM::s0_on_event(FSMEvent* e){
  35. return 0;
  36. }
  37. void CChromiumFSM::s1_on_entry(){
  38. return;
  39. }
  40. void CChromiumFSM::s1_on_exit(){
  41. return;
  42. }
  43. unsigned int CChromiumFSM::s1_on_event(FSMEvent* e){
  44. return 0;
  45. }
  46. void CChromiumFSM::s2_on_entry(){
  47. return;
  48. }
  49. void CChromiumFSM::s2_on_exit(){
  50. return;
  51. }
  52. unsigned int CChromiumFSM::s2_on_event(FSMEvent* e){
  53. return 0;
  54. }
  55. //ZmqStreamServerProc - 服务端线程函数
  56. // void CChromiumFSM::zmq_stream_server_proc() {
  57. //
  58. // int rc;
  59. // std::set<std::string> peer_ids;
  60. // DWORD prev_tick = GetTickCount();
  61. //
  62. // // init zmq and start zmq service
  63. // if((m_pZmqCtx = zmq_ctx_new()) == NULL){
  64. // DbgEx("zmq_ctx_new failled!");
  65. // // Sleep(50);
  66. // return;
  67. // }
  68. // // init zmq socket
  69. // if((m_pZmqSock == zmq_socket(m_pZmqCtx, ZMQ_STREAM))){
  70. // DbgEx("zmq_socket failed");
  71. // // Sleep(50);
  72. // return;
  73. // }
  74. //
  75. // int enabled = 1;
  76. // rc = zmq_setsockopt(m_pZmqSock, ZMQ_STREAM_NOTIFY, &enabled, sizeof(enabled));
  77. // if (rc != 0)
  78. // {
  79. // DbgEx("zmq_setsockopt failed");
  80. // return;
  81. // }
  82. //
  83. // rc = zmq_bind(m_pZmqSock, m_strZmqAddr);
  84. // if (rc != 0)
  85. // {
  86. // DbgEx("zmq_bind failed");
  87. // return;
  88. // }
  89. //
  90. // while (true) {
  91. // // check interrupt point
  92. // boost::this_thread::interruption_point();
  93. // //对socket进行poll操作
  94. // zmq_pollitem_t items[] = {
  95. // { m_pZmqSock, 0, ZMQ_POLLIN, 0 },
  96. // };
  97. // rc = zmq_poll(items, 1, 100);
  98. //
  99. // if (rc == 1) {
  100. //
  101. // if (items[0].revents & ZMQ_POLLIN) {
  102. // //有数据可读,分为两种情况,一种是STREAM NOTIFY,一种是真实的客户端发出的数据
  103. //
  104. // zmq_msg_t peer_frame;
  105. //
  106. // //接收1st 对端ID帧
  107. // rc = zmq_msg_init(&peer_frame);
  108. // // assert(rc == 0);
  109. // rc = zmq_msg_recv(&peer_frame, m_pZmqSock, 0);
  110. // // assert(rc != -1);
  111. // // assert(zmq_msg_size(&peer_frame) > 0);
  112. // // assert(has_more(m_pZmqSock));
  113. // char * p_peer_frame_data = (char*)zmq_msg_data(&peer_frame);
  114. // //DbgEx("peer_id:%s\n", p_peer_frame_data);
  115. //
  116. // std::string str_peer_id(p_peer_frame_data, zmq_msg_size(&peer_frame));
  117. // zmq_msg_close(&peer_frame);
  118. //
  119. // //接收2nd 对端数据帧
  120. // zmq_msg_t data_frame;
  121. // rc = zmq_msg_init(&data_frame);
  122. // // assert(rc == 0);
  123. // rc = zmq_msg_recv(&data_frame, m_pZmqSock, 0);
  124. // // assert(rc != -1);
  125. // if (zmq_msg_size(&data_frame) == 0) {
  126. // if (peer_ids.find(str_peer_id) == peer_ids.end()) {
  127. // DbgEx("S :a new conn incoming\n");
  128. // peer_ids.insert(str_peer_id);
  129. // }
  130. // else {
  131. // DbgEx("S :an exsit conn disconnected\n");
  132. // peer_ids.erase(str_peer_id);
  133. // }
  134. // }
  135. // else {
  136. // char * p_data_frame_data = (char*)zmq_msg_data(&data_frame);
  137. // DbgEx("S :recv [%s]\n", p_data_frame_data);
  138. // }
  139. // zmq_msg_close(&data_frame);
  140. // }
  141. //
  142. // /*if (items[0].revents & ZMQ_POLLERR) {
  143. // DbgEx("S :ZMQ_POLLERR\n");
  144. // }*/
  145. //
  146. // }
  147. // else if (rc == 0) {
  148. // //0 表示poll没有相应事件,可认为socket出于空闲状态。
  149. // //DbgEx("S :zmq_poll() return 0\n");
  150. // //assert(false);
  151. //
  152. // //模拟每3秒钟给所有客户端发出请求
  153. // if (peer_ids.size() > 0 && (GetTickCount() - prev_tick) > 3000) {
  154. // for (auto iter = peer_ids.begin(); iter != peer_ids.end(); ++iter) {
  155. //
  156. // //服务器端先发出请求
  157. // //发出1st ID帧
  158. // rc = zmq_send(m_pZmqSock, iter->c_str(), iter->size(), ZMQ_SNDMORE);
  159. // //DbgEx("S :send identity res=%d errno=%d\n", rc, errno);
  160. // //assert(rc != -1);
  161. //
  162. // //发出2nd 数据帧
  163. // DbgEx("S :send:[%s]\n", "hello");
  164. // rc = zmq_send(m_pZmqSock, "hello", 6, ZMQ_SNDMORE);
  165. // //assert(rc != -1);
  166. // }
  167. // prev_tick = GetTickCount();
  168. // }
  169. // }
  170. // else {
  171. // DbgEx("S :zmq_poll() return error\n");
  172. // // assert(false);
  173. // }
  174. // }
  175. // rc = zmq_close(m_pZmqSock);
  176. // // assert(rc == 0);
  177. //
  178. // rc = zmq_ctx_term(m_pZmqCtx);
  179. // // assert(rc == 0);
  180. //
  181. // return ;
  182. // }
  183. void CChromiumFSM::start_chromium_browser(){
  184. using namespace FreeRDPWrap;
  185. FreeRDPWrapSrv_ClientBase *pClient = new FreeRDPWrapSrv_ClientBase(m_pEntity);
  186. auto rc = pClient->Connect();
  187. if (Error_Succeed != rc)
  188. {
  189. DbgEx("connect to FreeRDPWrapSrv entity fail: %d", rc);
  190. }else{
  191. FreeRDPWrapSrv_CreateProcessRunAs_Req req = {};
  192. FreeRDPWrapSrv_CreateProcessRunAs_Ans ans = {};
  193. req.strCmdLine = "D:\\xzc\\Release\\Release\\cefclient.exe --url=http://99.1.100.217/rvc.xzc.web";
  194. rc = pClient->CreateProcessRunAs(req, ans, 10000);
  195. if (rc != Error_Succeed)
  196. {
  197. DbgEx("get CreateProcessRunAs fail from FreeRDPWrap: %d", rc);
  198. }
  199. else
  200. {
  201. DbgEx("get CreateProcessRunAs succeed from FreeRDPWrap: %d", rc);
  202. }
  203. }
  204. }
  205. }