#include "stdafx.h" #include "ChromiumFSM.h" #include #include //#include "zmq_utils.h" #include #include "../mod_FreeRDPWrap/FreeRDPWrap_client_g.h" #include "../mod_browser/IEBrowser_client_g.h" #include "Chromium_msg_g.h" #include "baseEx.h" namespace Chromium{ CChromiumFSM::CChromiumFSM(CEntityBase* pEntity):m_pEntity(pEntity) { } CChromiumFSM::~CChromiumFSM(){ // if (NULL != m_hZmqServerThread) // { // m_hZmqServerThread->interrupt(); // } } ErrorCodeEnum CChromiumFSM::OnInit(){ return Error_Succeed; } ErrorCodeEnum CChromiumFSM::OnExit(){ return Error_Succeed; } void CChromiumFSM::s0_on_entry(){ // init zmq and start zmq service // m_hZmqServerThread = new boost::thread(boost::bind(&CChromiumFSM::zmq_stream_server_proc, this)); } void CChromiumFSM::s0_on_exit(){ return; } unsigned int CChromiumFSM::s0_on_event(FSMEvent* e){ return 0; } void CChromiumFSM::s1_on_entry(){ return; } void CChromiumFSM::s1_on_exit(){ return; } unsigned int CChromiumFSM::s1_on_event(FSMEvent* e){ return 0; } void CChromiumFSM::s2_on_entry(){ return; } void CChromiumFSM::s2_on_exit(){ return; } unsigned int CChromiumFSM::s2_on_event(FSMEvent* e){ return 0; } //ZmqStreamServerProc - 服务端线程函数 // void CChromiumFSM::zmq_stream_server_proc() { // // int rc; // std::set peer_ids; // DWORD prev_tick = GetTickCount(); // // // init zmq and start zmq service // if((m_pZmqCtx = zmq_ctx_new()) == NULL){ // DbgEx("zmq_ctx_new failled!"); // // Sleep(50); // return; // } // // init zmq socket // if((m_pZmqSock == zmq_socket(m_pZmqCtx, ZMQ_STREAM))){ // DbgEx("zmq_socket failed"); // // Sleep(50); // return; // } // // int enabled = 1; // rc = zmq_setsockopt(m_pZmqSock, ZMQ_STREAM_NOTIFY, &enabled, sizeof(enabled)); // if (rc != 0) // { // DbgEx("zmq_setsockopt failed"); // return; // } // // rc = zmq_bind(m_pZmqSock, m_strZmqAddr); // if (rc != 0) // { // DbgEx("zmq_bind failed"); // return; // } // // while (true) { // // check interrupt point // boost::this_thread::interruption_point(); // //对socket进行poll操作 // zmq_pollitem_t items[] = { // { m_pZmqSock, 0, ZMQ_POLLIN, 0 }, // }; // rc = zmq_poll(items, 1, 100); // // if (rc == 1) { // // if (items[0].revents & ZMQ_POLLIN) { // //有数据可读,分为两种情况,一种是STREAM NOTIFY,一种是真实的客户端发出的数据 // // zmq_msg_t peer_frame; // // //接收1st 对端ID帧 // rc = zmq_msg_init(&peer_frame); // // assert(rc == 0); // rc = zmq_msg_recv(&peer_frame, m_pZmqSock, 0); // // assert(rc != -1); // // assert(zmq_msg_size(&peer_frame) > 0); // // assert(has_more(m_pZmqSock)); // char * p_peer_frame_data = (char*)zmq_msg_data(&peer_frame); // //DbgEx("peer_id:%s\n", p_peer_frame_data); // // std::string str_peer_id(p_peer_frame_data, zmq_msg_size(&peer_frame)); // zmq_msg_close(&peer_frame); // // //接收2nd 对端数据帧 // zmq_msg_t data_frame; // rc = zmq_msg_init(&data_frame); // // assert(rc == 0); // rc = zmq_msg_recv(&data_frame, m_pZmqSock, 0); // // assert(rc != -1); // if (zmq_msg_size(&data_frame) == 0) { // if (peer_ids.find(str_peer_id) == peer_ids.end()) { // DbgEx("S :a new conn incoming\n"); // peer_ids.insert(str_peer_id); // } // else { // DbgEx("S :an exsit conn disconnected\n"); // peer_ids.erase(str_peer_id); // } // } // else { // char * p_data_frame_data = (char*)zmq_msg_data(&data_frame); // DbgEx("S :recv [%s]\n", p_data_frame_data); // } // zmq_msg_close(&data_frame); // } // // /*if (items[0].revents & ZMQ_POLLERR) { // DbgEx("S :ZMQ_POLLERR\n"); // }*/ // // } // else if (rc == 0) { // //0 表示poll没有相应事件,可认为socket出于空闲状态。 // //DbgEx("S :zmq_poll() return 0\n"); // //assert(false); // // //模拟每3秒钟给所有客户端发出请求 // if (peer_ids.size() > 0 && (GetTickCount() - prev_tick) > 3000) { // for (auto iter = peer_ids.begin(); iter != peer_ids.end(); ++iter) { // // //服务器端先发出请求 // //发出1st ID帧 // rc = zmq_send(m_pZmqSock, iter->c_str(), iter->size(), ZMQ_SNDMORE); // //DbgEx("S :send identity res=%d errno=%d\n", rc, errno); // //assert(rc != -1); // // //发出2nd 数据帧 // DbgEx("S :send:[%s]\n", "hello"); // rc = zmq_send(m_pZmqSock, "hello", 6, ZMQ_SNDMORE); // //assert(rc != -1); // } // prev_tick = GetTickCount(); // } // } // else { // DbgEx("S :zmq_poll() return error\n"); // // assert(false); // } // } // rc = zmq_close(m_pZmqSock); // // assert(rc == 0); // // rc = zmq_ctx_term(m_pZmqCtx); // // assert(rc == 0); // // return ; // } void CChromiumFSM::start_chromium_browser(){ using namespace FreeRDPWrap; FreeRDPWrapSrv_ClientBase *pClient = new FreeRDPWrapSrv_ClientBase(m_pEntity); auto rc = pClient->Connect(); if (Error_Succeed != rc) { DbgEx("connect to FreeRDPWrapSrv entity fail: %d", rc); }else{ FreeRDPWrapSrv_CreateProcessRunAs_Req req = {}; FreeRDPWrapSrv_CreateProcessRunAs_Ans ans = {}; req.strCmdLine = "D:\\xzc\\Release\\Release\\cefclient.exe --url=http://99.1.100.217/rvc.xzc.web"; rc = pClient->CreateProcessRunAs(req, ans, 10000); if (rc != Error_Succeed) { DbgEx("get CreateProcessRunAs fail from FreeRDPWrap: %d", rc); } else { DbgEx("get CreateProcessRunAs succeed from FreeRDPWrap: %d", rc); } } } }