123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- #include "../include/iomanager.hpp"
- #include <iostream>
- #include <jsoncpp/json/json.h>
- using boost::asio::buffer;
- IoManager::IoManager(char *ipcstring) {
- ipstring = new std::string(ipcstring);
- port = 1234;
- tcpsock = new tcp::socket(ios);
- }
- bool IoManager::connect() {
- boost::asio::streambuf recvbuf;
- tcp::endpoint *ep;
- Json::Value root, checkok;
- const char *recvjson;
- std::string jsonerror;
- bool bcheckok;
- Json::CharReaderBuilder rbuilder;
- const std::unique_ptr<Json::CharReader> reader(rbuilder.newCharReader());
- Json::StreamWriterBuilder wbuilder;
- // builder["indentation"] = ""; // If you want whitespace-less output
- // const std::string output = Json::writeString(wbuilder, root);
- ep =
- new tcp::endpoint(boost::asio::ip::address::from_string(*ipstring), 1234);
- // establish connection
- std::cerr << "connecting to " << *ipstring << std::endl;
- tcpsock->connect(*ep, errcode);
- if (errcode) {
- std::cerr << "couldnt connect to " << *ipstring << std::endl
- << errcode.message() << std::endl;
- return false;
- }
- printf("connect ok\n");
- fflush(stdout);
- // send version check
- root["version"] = VERSION;
- std::cout << root << std::endl;
- boost::asio::write(*tcpsock, buffer(Json::writeString(wbuilder, root)),
- errcode);
- if (errcode) {
- std::cerr << "couldnt send version check" << std::endl
- << errcode.message() << std::endl;
- return false;
- }
- printf("send ok\n");
- fflush(stdout);
- // recieve answer to version check
- // using transfer_at_least(1) to avoid lockup with transfer_all()
- boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_at_least(1),
- errcode);
- //~ boost::asio::read(*tcpsock, recvbuf, errcode);
- if (errcode && errcode != boost::asio::error::eof) {
- std::cerr << "couldnt recieve version check" << std::endl
- << errcode.message() << std::endl;
- return false;
- }
- printf("recieve ok\n");
- fflush(stdout);
- // parse json
- recvjson = boost::asio::buffer_cast<const char *>(recvbuf.data());
- if (!reader->parse(recvjson, recvjson + recvbuf.size(), &root, &jsonerror)) {
- std::cerr << "couldnt parse recieved json" << std::endl
- << jsonerror << std::endl;
- return false;
- }
- printf("parse ok\n");
- fflush(stdout);
- // remove processed data from recvbuf
- recvbuf.consume(recvbuf.size());
- std::cout << root << std::endl;
- // check if version check was ok
- checkok = root["accept"];
- if (!checkok.asBool()) {
- std::cerr << "version check failed. client version is " << VERSION
- << std::endl
- << "server reports version " << root["version"] << std::endl;
- return false;
- }
- printf("check ok\n\n\n");
- fflush(stdout);
- /* */
- // TODO remove hardcoded login
- root = Json::Value();
- // send version check
- // TODO make client version global
- root["user"] = "user";
- root["pass"] = "pass";
- std::cout << root << std::endl;
- boost::asio::write(*tcpsock, buffer(Json::writeString(wbuilder, root)),
- errcode);
- if (errcode) {
- std::cerr << "couldnt send login" << std::endl
- << errcode.message() << std::endl;
- return false;
- }
- printf("send ok\n");
- fflush(stdout);
- // recieve answer to version check
- // using transfer_at_least(1) to avoid lockup with transfer_all()
- boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_at_least(1),
- errcode);
- //~ boost::asio::read(*tcpsock, recvbuf, errcode);
- if (errcode && errcode != boost::asio::error::eof) {
- std::cerr << "couldnt recieve login response" << std::endl
- << errcode.message() << std::endl;
- return false;
- }
- printf("recieve ok\n");
- fflush(stdout);
- // parse json
- recvjson = boost::asio::buffer_cast<const char *>(recvbuf.data());
- if (!reader->parse(recvjson, recvjson + recvbuf.size(), &root, &jsonerror)) {
- std::cerr << "couldnt parse recieved json" << std::endl
- << jsonerror << std::endl;
- return false;
- }
- printf("parse ok\n");
- fflush(stdout);
- // remove processed data from recvbuf
- recvbuf.consume(recvbuf.size());
- std::cout << root << std::endl;
- /* */
- // clean up
- delete ep;
- return true;
- }
- IoManager::~IoManager() {
- /* */
- boost::asio::streambuf recvbuf;
- Json::Value root, checkok;
- const char *recvjson;
- std::string jsonerror;
- Json::CharReaderBuilder rbuilder;
- const std::unique_ptr<Json::CharReader> reader(rbuilder.newCharReader());
- Json::StreamWriterBuilder wbuilder;
- // TODO remove hardcoded login
- root = Json::Value();
- // send version check
- // TODO make client version global
- root["command"] = "close";
- std::cout << root << std::endl;
- boost::asio::write(*tcpsock, buffer(Json::writeString(wbuilder, root)),
- errcode);
- if (errcode) {
- std::cerr << "couldnt send close" << std::endl
- << errcode.message() << std::endl;
- }
- printf("send ok\n");
- fflush(stdout);
- // recieve answer to version check
- // using transfer_at_least(1) to avoid lockup with transfer_all()
- boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_at_least(1),
- errcode);
- //~ boost::asio::read(*tcpsock, recvbuf, errcode);
- if (errcode && errcode != boost::asio::error::eof) {
- std::cerr << "couldnt recieve close response" << std::endl
- << errcode.message() << std::endl;
- }
- printf("recieve ok\n");
- fflush(stdout);
- // parse json
- recvjson = boost::asio::buffer_cast<const char *>(recvbuf.data());
- if (!reader->parse(recvjson, recvjson + recvbuf.size(), &root, &jsonerror)) {
- std::cerr << "couldnt parse recieved json" << std::endl
- << jsonerror << std::endl;
- }
- printf("parse ok\n");
- fflush(stdout);
- // remove processed data from recvbuf
- recvbuf.consume(recvbuf.size());
- std::cout << root << std::endl;
- /* */
- tcpsock->close();
- delete ipstring;
- delete tcpsock;
- }
|