main.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include <memory>
  2. #include <tuple>
  3. #include "src/pico_server_dispatcher.hpp"
  4. using namespace std;
  5. extern std::ostream out(cout.rdbuf());
  6. extern SimpleLogger logger(out, "pico", "picologs");
  7. void createDirectoryRecursively(const std::string &directory) {
  8. static const std::string separators("\\/");
  9. // If the specified directory name doesn't exist, do our thing
  10. DWORD fileAttributes = ::GetFileAttributesA(directory.c_str());
  11. if(fileAttributes == INVALID_FILE_ATTRIBUTES) {
  12. // Recursively do it all again for the parent directory, if any
  13. std::size_t slashIndex = directory.find_last_of(separators);
  14. if(slashIndex != std::wstring::npos) {
  15. createDirectoryRecursively(directory.substr(0, slashIndex));
  16. }
  17. // Create the last directory on the path (the recursive calls will have taken
  18. // care of the parent directories by now)
  19. BOOL result = ::CreateDirectoryA(directory.c_str(), nullptr);
  20. if(result == FALSE) {
  21. throw std::runtime_error("Could not create directory");
  22. }
  23. } else { // Specified directory name already exists as a file or directory
  24. bool isDirectoryOrJunction =
  25. ((fileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) ||
  26. ((fileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0);
  27. if(!isDirectoryOrJunction) {
  28. throw std::runtime_error(
  29. "Could not create directory because a file with the same name exists"
  30. );
  31. }
  32. }
  33. }
  34. int main()
  35. {
  36. logger.enableConsoleOutput(true);
  37. logger << "Open socket" << endl;
  38. CPassiveSocket SocketPassive(CSimpleSocket::CSocketType::SocketTypeTcp);
  39. if (!SocketPassive.Initialize())
  40. {
  41. logger << LogPref::Flag(ERROR) << "Socket initialization failed" << endl;
  42. return -1;
  43. }
  44. if(!SocketPassive.Listen("localhost", 5003))
  45. {
  46. logger << LogPref::Flag(ERROR) << "Socket listening failed" << endl;
  47. return -1;
  48. }
  49. logger << "Socket initialized!" << endl;
  50. CActiveSocket* ClientSocket = nullptr;
  51. pico_server_dispatcher pico_server(ClientSocket);
  52. while(true)
  53. {
  54. logger << LogPref::Flag(INFO) << "Wait for connection..." << endl;
  55. logger.closeLogger();
  56. if ((ClientSocket = SocketPassive.Accept()) == nullptr)
  57. {
  58. logger.closeLogger();
  59. logger.initializeLogger("picologs", "pico");
  60. logger.enableConsoleOutput(true);
  61. logger << LogPref::Flag(ERROR) << "Socket accept failed" << endl;
  62. logger.closeLogger();
  63. return -1;
  64. }
  65. logger.initializeLogger("picologs", "pico");
  66. logger.enableConsoleOutput(true);
  67. logger << LogPref::Flag(INFO) << "Client connected" << endl;
  68. while(pico_server.acceptRequest() == true)
  69. {
  70. logger << LogPref::Flag(INFO) << "Request received" << endl;
  71. }
  72. logger << LogPref::Flag(INFO) << "Request processing finished" << endl;
  73. delete ClientSocket;
  74. ClientSocket = nullptr;
  75. }
  76. return 0;
  77. }