#include #include #include #include #include "xmlparam.h" #include "rawpic.pb.h" #include "CivetServer.h" #include #ifdef _WIN32 #include #else #include #endif #include "grpccivet.h" #define DOCUMENT_ROOT "./frontend/dist" QByteArray gbasnow; grpcpc * ggrpc; class WsStartHandler : public CivetHandler { public: bool handleGet(CivetServer *server, struct mg_connection *conn) { mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: " "close\r\n\r\n"); mg_printf(conn, "\n"); mg_printf(conn, "\n\n"); mg_printf(conn, "\n"); mg_printf(conn, "ADC IV RemoteCtrl UI\n"); QFile xFile; xFile.setFileName("./frontend/index.html"); if(xFile.open(QIODevice::ReadOnly)) { QByteArray ba = xFile.readAll(); mg_printf(conn,ba.data()); } return 1; } }; class PicFrontHandler : public CivetHandler { public: bool handleGet(CivetServer *server, struct mg_connection *conn) { static int ncount; mg_printf(conn, "HTTP/1.1 200 OK\r\n" "Connection: close\r\n" "Max-Age: 0\r\n" "Expires: 0\r\n" "Cache-Control: no-cache, no-store, must-revalidate, private\r\n" "Pragma: no-cache\r\n" "Content-Type: multipart/x-mixed-replace; " "boundary=--BoundaryString\r\n" "\r\n"); mg_printf(conn,""); mg_printf(conn, "\r\n"); QByteArray ba; iv::vision::rawpic xrawpic; if(ggrpc->GetRawPic(0,xrawpic) == 1) { ba.append(xrawpic.picdata().data(),xrawpic.picdata().size()); } else { ba = gbasnow; } // if(gLastUpdate > 0) // { // iv::vision::rawpic xrawpic; // gMutex.lock(); // xrawpic.CopyFrom(mRawPic); // gMutex.unlock(); // ba.append(xrawpic.picdata().data(),xrawpic.picdata().size()); // } mg_printf(conn, "--BoundaryString\r\n" "Content-type: image/jpeg\r\n" "Content-Length: %zu\r\n" "\r\n", ba.size()); mg_write(conn, ba.data(), ba.size()); mg_printf(conn, "\r\n\r\n"); ncount++; printf("send pic. %d\n",ncount); return true; } }; class PicRearHandler : public CivetHandler { public: bool handleGet(CivetServer *server, struct mg_connection *conn) { static int ncount; mg_printf(conn, "HTTP/1.1 200 OK\r\n" "Connection: close\r\n" "Max-Age: 0\r\n" "Expires: 0\r\n" "Cache-Control: no-cache, no-store, must-revalidate, private\r\n" "Pragma: no-cache\r\n" "Content-Type: multipart/x-mixed-replace; " "boundary=--BoundaryString\r\n" "\r\n"); mg_printf(conn,""); mg_printf(conn, "\r\n"); QByteArray ba; iv::vision::rawpic xrawpic; if(ggrpc->GetRawPic(1,xrawpic) == 1) { ba.append(xrawpic.picdata().data(),xrawpic.picdata().size()); } else { ba = gbasnow; } // if(gLastUpdate > 0) // { // iv::vision::rawpic xrawpic; // gMutex.lock(); // xrawpic.CopyFrom(mRawPic); // gMutex.unlock(); // ba.append(xrawpic.picdata().data(),xrawpic.picdata().size()); // } mg_printf(conn, "--BoundaryString\r\n" "Content-type: image/jpeg\r\n" "Content-Length: %zu\r\n" "\r\n", ba.size()); mg_write(conn, ba.data(), ba.size()); mg_printf(conn, "\r\n\r\n"); ncount++; printf("send pic. %d\n",ncount); return true; } }; class PicLeftHandler : public CivetHandler { public: bool handleGet(CivetServer *server, struct mg_connection *conn) { static int ncount; mg_printf(conn, "HTTP/1.1 200 OK\r\n" "Connection: close\r\n" "Max-Age: 0\r\n" "Expires: 0\r\n" "Cache-Control: no-cache, no-store, must-revalidate, private\r\n" "Pragma: no-cache\r\n" "Content-Type: multipart/x-mixed-replace; " "boundary=--BoundaryString\r\n" "\r\n"); mg_printf(conn,""); mg_printf(conn, "\r\n"); QByteArray ba; iv::vision::rawpic xrawpic; if(ggrpc->GetRawPic(2,xrawpic) == 1) { ba.append(xrawpic.picdata().data(),xrawpic.picdata().size()); } else { ba = gbasnow; } // if(gLastUpdate > 0) // { // iv::vision::rawpic xrawpic; // gMutex.lock(); // xrawpic.CopyFrom(mRawPic); // gMutex.unlock(); // ba.append(xrawpic.picdata().data(),xrawpic.picdata().size()); // } mg_printf(conn, "--BoundaryString\r\n" "Content-type: image/jpeg\r\n" "Content-Length: %zu\r\n" "\r\n", ba.size()); mg_write(conn, ba.data(), ba.size()); mg_printf(conn, "\r\n\r\n"); ncount++; printf("send pic. %d\n",ncount); return true; } }; class PicRightHandler : public CivetHandler { public: bool handleGet(CivetServer *server, struct mg_connection *conn) { static int ncount; mg_printf(conn, "HTTP/1.1 200 OK\r\n" "Connection: close\r\n" "Max-Age: 0\r\n" "Expires: 0\r\n" "Cache-Control: no-cache, no-store, must-revalidate, private\r\n" "Pragma: no-cache\r\n" "Content-Type: multipart/x-mixed-replace; " "boundary=--BoundaryString\r\n" "\r\n"); mg_printf(conn,""); mg_printf(conn, "\r\n"); QByteArray ba; iv::vision::rawpic xrawpic; if(ggrpc->GetRawPic(3,xrawpic) == 1) { ba.append(xrawpic.picdata().data(),xrawpic.picdata().size()); } else { ba = gbasnow; } // if(gLastUpdate > 0) // { // iv::vision::rawpic xrawpic; // gMutex.lock(); // xrawpic.CopyFrom(mRawPic); // gMutex.unlock(); // ba.append(xrawpic.picdata().data(),xrawpic.picdata().size()); // } mg_printf(conn, "--BoundaryString\r\n" "Content-type: image/jpeg\r\n" "Content-Length: %zu\r\n" "\r\n", ba.size()); mg_write(conn, ba.data(), ba.size()); mg_printf(conn, "\r\n\r\n"); ncount++; printf("send pic. %d\n",ncount); return true; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); iv::xmlparam::Xmlparam xp("./driver_cloud_grpc_civetweb.xml"); // std::string strmsgname = xp.GetParam("imagemsgname","picfront"); std::string strport = xp.GetParam("Port","6101"); // gpa = iv::modulecomm::RegisterRecv(strmsgname.data(),Listenpic); QFile xFile; xFile.setFileName("./frontend/tvsnow.jpg"); if(xFile.open(QIODevice::ReadOnly)) { gbasnow = xFile.readAll(); } xFile.close(); mg_init_library(0); const char *options[] = { "document_root", DOCUMENT_ROOT, "listening_ports", strport.data(), 0}; std::vector cpp_options; for (int i=0; i<(sizeof(options)/sizeof(options[0])-1); i++) { cpp_options.push_back(options[i]); } // CivetServer server(options); // <-- C style start CivetServer server(cpp_options); // <-- C++ style start WsStartHandler h_ws; server.addHandler("/", h_ws); PicFrontHandler h_picfront; server.addHandler("/picfront", h_picfront); PicRearHandler h_picrear; server.addHandler("/picrear", h_picrear); PicLeftHandler h_picleft; server.addHandler("/picleft", h_picleft); PicRightHandler h_picright; server.addHandler("/picright", h_picright); ggrpc = new grpcpc("test"); ggrpc->start(); return a.exec(); }