iomanager.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #include "../include/iomanager.hpp"
  2. #include <iostream>
  3. #include <jsoncpp/json/json.h>
  4. using boost::asio::buffer;
  5. IoManager::IoManager(char *ipcstring) {
  6. ipstring = new std::string(ipcstring);
  7. port = 1234;
  8. tcpsock = new tcp::socket(ios);
  9. }
  10. bool IoManager::connect() {
  11. boost::asio::streambuf recvbuf;
  12. tcp::endpoint *ep;
  13. Json::Value root, checkok;
  14. const char *recvjson;
  15. std::string jsonerror;
  16. bool bcheckok;
  17. Json::CharReaderBuilder rbuilder;
  18. const std::unique_ptr<Json::CharReader> reader(rbuilder.newCharReader());
  19. Json::StreamWriterBuilder wbuilder;
  20. // builder["indentation"] = ""; // If you want whitespace-less output
  21. // const std::string output = Json::writeString(wbuilder, root);
  22. ep =
  23. new tcp::endpoint(boost::asio::ip::address::from_string(*ipstring), 1234);
  24. // establish connection
  25. std::cerr << "connecting to " << *ipstring << std::endl;
  26. tcpsock->connect(*ep, errcode);
  27. if (errcode) {
  28. std::cerr << "couldnt connect to " << *ipstring << std::endl
  29. << errcode.message() << std::endl;
  30. return false;
  31. }
  32. printf("connect ok\n");
  33. fflush(stdout);
  34. // send version check
  35. root["version"] = VERSION;
  36. std::cout << root << std::endl;
  37. boost::asio::write(*tcpsock, buffer(Json::writeString(wbuilder, root)),
  38. errcode);
  39. if (errcode) {
  40. std::cerr << "couldnt send version check" << std::endl
  41. << errcode.message() << std::endl;
  42. return false;
  43. }
  44. printf("send ok\n");
  45. fflush(stdout);
  46. // recieve answer to version check
  47. // using transfer_at_least(1) to avoid lockup with transfer_all()
  48. boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_at_least(1),
  49. errcode);
  50. //~ boost::asio::read(*tcpsock, recvbuf, errcode);
  51. if (errcode && errcode != boost::asio::error::eof) {
  52. std::cerr << "couldnt recieve version check" << std::endl
  53. << errcode.message() << std::endl;
  54. return false;
  55. }
  56. printf("recieve ok\n");
  57. fflush(stdout);
  58. // parse json
  59. recvjson = boost::asio::buffer_cast<const char *>(recvbuf.data());
  60. if (!reader->parse(recvjson, recvjson + recvbuf.size(), &root, &jsonerror)) {
  61. std::cerr << "couldnt parse recieved json" << std::endl
  62. << jsonerror << std::endl;
  63. return false;
  64. }
  65. printf("parse ok\n");
  66. fflush(stdout);
  67. // remove processed data from recvbuf
  68. recvbuf.consume(recvbuf.size());
  69. std::cout << root << std::endl;
  70. // check if version check was ok
  71. checkok = root["accept"];
  72. if (!checkok.asBool()) {
  73. std::cerr << "version check failed. client version is " << VERSION
  74. << std::endl
  75. << "server reports version " << root["version"] << std::endl;
  76. return false;
  77. }
  78. printf("check ok\n\n\n");
  79. fflush(stdout);
  80. /* */
  81. // TODO remove hardcoded login
  82. root = Json::Value();
  83. // send version check
  84. // TODO make client version global
  85. root["user"] = "user";
  86. root["pass"] = "pass";
  87. std::cout << root << std::endl;
  88. boost::asio::write(*tcpsock, buffer(Json::writeString(wbuilder, root)),
  89. errcode);
  90. if (errcode) {
  91. std::cerr << "couldnt send login" << std::endl
  92. << errcode.message() << std::endl;
  93. return false;
  94. }
  95. printf("send ok\n");
  96. fflush(stdout);
  97. // recieve answer to version check
  98. // using transfer_at_least(1) to avoid lockup with transfer_all()
  99. boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_at_least(1),
  100. errcode);
  101. //~ boost::asio::read(*tcpsock, recvbuf, errcode);
  102. if (errcode && errcode != boost::asio::error::eof) {
  103. std::cerr << "couldnt recieve login response" << std::endl
  104. << errcode.message() << std::endl;
  105. return false;
  106. }
  107. printf("recieve ok\n");
  108. fflush(stdout);
  109. // parse json
  110. recvjson = boost::asio::buffer_cast<const char *>(recvbuf.data());
  111. if (!reader->parse(recvjson, recvjson + recvbuf.size(), &root, &jsonerror)) {
  112. std::cerr << "couldnt parse recieved json" << std::endl
  113. << jsonerror << std::endl;
  114. return false;
  115. }
  116. printf("parse ok\n");
  117. fflush(stdout);
  118. // remove processed data from recvbuf
  119. recvbuf.consume(recvbuf.size());
  120. std::cout << root << std::endl;
  121. /* */
  122. // clean up
  123. delete ep;
  124. return true;
  125. }
  126. IoManager::~IoManager() {
  127. /* */
  128. boost::asio::streambuf recvbuf;
  129. Json::Value root, checkok;
  130. const char *recvjson;
  131. std::string jsonerror;
  132. Json::CharReaderBuilder rbuilder;
  133. const std::unique_ptr<Json::CharReader> reader(rbuilder.newCharReader());
  134. Json::StreamWriterBuilder wbuilder;
  135. // TODO remove hardcoded login
  136. root = Json::Value();
  137. // send version check
  138. // TODO make client version global
  139. root["command"] = "close";
  140. std::cout << root << std::endl;
  141. boost::asio::write(*tcpsock, buffer(Json::writeString(wbuilder, root)),
  142. errcode);
  143. if (errcode) {
  144. std::cerr << "couldnt send close" << std::endl
  145. << errcode.message() << std::endl;
  146. }
  147. printf("send ok\n");
  148. fflush(stdout);
  149. // recieve answer to version check
  150. // using transfer_at_least(1) to avoid lockup with transfer_all()
  151. boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_at_least(1),
  152. errcode);
  153. //~ boost::asio::read(*tcpsock, recvbuf, errcode);
  154. if (errcode && errcode != boost::asio::error::eof) {
  155. std::cerr << "couldnt recieve close response" << std::endl
  156. << errcode.message() << std::endl;
  157. }
  158. printf("recieve ok\n");
  159. fflush(stdout);
  160. // parse json
  161. recvjson = boost::asio::buffer_cast<const char *>(recvbuf.data());
  162. if (!reader->parse(recvjson, recvjson + recvbuf.size(), &root, &jsonerror)) {
  163. std::cerr << "couldnt parse recieved json" << std::endl
  164. << jsonerror << std::endl;
  165. }
  166. printf("parse ok\n");
  167. fflush(stdout);
  168. // remove processed data from recvbuf
  169. recvbuf.consume(recvbuf.size());
  170. std::cout << root << std::endl;
  171. /* */
  172. tcpsock->close();
  173. delete ipstring;
  174. delete tcpsock;
  175. }