networking.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include <algorithm>
  2. std::string random_string(size_t length)
  3. {
  4. auto randchar = []() -> char
  5. {
  6. const char charset[] =
  7. "0123456789_-"
  8. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  9. "abcdefghijklmnopqrstuvwxyz";
  10. const size_t max_index = (sizeof(charset) - 1);
  11. return charset[ rand() % max_index ];
  12. };
  13. std::string str(length,0);
  14. std::generate_n(str.begin(), length, randchar);
  15. return str;
  16. }
  17. char *set_temp_filename(
  18. struct mg_connection *conn) const
  19. {
  20. std::string filename = random_string(TMP_FILE_SIZE);
  21. char *c_filename = new char[TMP_FILE_SIZE+TMP_DIR_SIZE+1];
  22. strncpy(c_filename, TMP_DIR, TMP_DIR_SIZE);
  23. for (size_t i = 0; i < TMP_FILE_SIZE; i++)
  24. c_filename[i + TMP_DIR_SIZE] = filename[i];
  25. c_filename[TMP_DIR_SIZE + TMP_FILE_SIZE] = 0;
  26. mg_set_user_connection_data(conn, c_filename);
  27. return c_filename;
  28. }
  29. bool RemoteControlHandler::handleGet(CivetServer *server, struct mg_connection *conn)
  30. {
  31. unique_lock<mutex> lck(sync->mtx);
  32. mg_printf(conn,
  33. "HTTP/1.1 200 OK\r\nContent-Type: "
  34. "text/plain\r\nConnection: close\r\n\r\n");
  35. if (message.empty())
  36. mg_printf(conn, "Event triggered.\n");
  37. else
  38. mg_printf(conn, "%s\n", message.c_str());
  39. sync->val++;
  40. sync->cv.notify_all();
  41. return true;
  42. }
  43. bool AltRemoteControlHandler::handleGet(CivetServer *server, struct mg_connection *conn)
  44. {
  45. unique_lock<mutex> lck(sync->mtx);
  46. const struct mg_request_info *info = mg_get_request_info(conn);
  47. if (info->query_string)
  48. query = info->query_string;
  49. mg_printf(conn,
  50. "HTTP/1.1 200 OK\r\nContent-Type: "
  51. "text/plain\r\nConnection: close\r\n\r\n");
  52. if (message.empty())
  53. mg_printf(conn, "Event triggered.\n");
  54. else
  55. mg_printf(conn, "%s\n", message.c_str());
  56. sync->val2 = value;
  57. sync->cv.notify_all();
  58. return true;
  59. }
  60. std::string AltRemoteControlHandler::query() const
  61. {
  62. return query;
  63. }
  64. static int synchro_websocket_data_handler(
  65. struct mg_connection *conn,
  66. int bits,
  67. char *data,
  68. size_t data_len,
  69. void *user_data)
  70. {
  71. if ((bits & 0xf) == MG_WEBSOCKET_OPCODE_CONNECTION_CLOSE)
  72. return false;
  73. if ((bits & 0xf) == MG_WEBSOCKET_OPCODE_DATACOMPLETE)
  74. {
  75. struct synchronization_tool *synch = (struct synchronization_tool *) user_data;
  76. unique_lock<mutex> lck(synch->mtx);
  77. synch->val++;
  78. return false;
  79. }
  80. std::cerr << "Unknown response when trying to get update lock." << std::endl;
  81. return false;
  82. }
  83. static void synchro_websocket_close_handler(
  84. const struct mg_connection *conn,
  85. void *user_data)
  86. {
  87. struct synchronization_tool *synch = (struct synchronization_tool *) user_data;
  88. unique_lock<mutex> lck(synch->mtx);
  89. synch->val2 = 1;
  90. synch->cv.notify_all();
  91. }
  92. static int file_websocket_data_handler(
  93. struct mg_connection *conn,
  94. int bits,
  95. char *data,
  96. size_t data_len,
  97. void *user_data)
  98. {
  99. if ((bits & 0xf) == MG_WEBSOCKET_OPCODE_CONNECTION_CLOSE || (bits & 0xf) == MG_WEBSOCKET_OPCODE_DATACOMPLETE)
  100. return false;
  101. if ((bits & 0xf) != MG_WEBSOCKET_OPCODE_BINARY && (bits & 0xf) != MG_WEBSOCKET_OPCODE_CONTINUATION)
  102. {
  103. std::cerr << "Unknown opcode: failing." << std::endl;
  104. return false;
  105. }
  106. struct synchronization_tool *sync = (struct synchronization_tool *) user_data;
  107. char *filename = (char *) mg_get_user_connection_data(conn);
  108. std::unique_lock<std::mutex> lck(sync->mtx);
  109. FILE *currFile = fopen(filename, "ab");
  110. fwrite(data, sizeof(char), data_len, currFile);
  111. fclose(currFile);
  112. return true;
  113. }
  114. static void file_websocket_close_handler(
  115. const struct mg_connection *conn,
  116. void *user_data)
  117. {
  118. struct synchronization_tool *sync = (struct synchronization_tool *) user_data;
  119. unique_lock<mutex> lck(sync->mtx);
  120. sync->val = 1;
  121. sync->cv.notify_all();
  122. }