networking.cpp 4.2 KB

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