|
@@ -0,0 +1,102 @@
|
|
|
+#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() {
|
|
|
+ tcp::endpoint *ep;
|
|
|
+ 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;
|
|
|
+ // 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
|
|
|
+ // TODO make client version global
|
|
|
+ root["version"] = "0.1";
|
|
|
+
|
|
|
+ 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
|
|
|
+ boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_all(), 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);
|
|
|
+
|
|
|
+ // check if version check was ok
|
|
|
+ checkok = root["accept"];
|
|
|
+ if(checkok.type() != Json::ValueType::booleanValue || !checkok) {
|
|
|
+ // TODO make client version global
|
|
|
+ std::cerr << "version check failed. client version is " << "0.1" << std::endl
|
|
|
+ << "server reports version " << root["version"] << std::endl;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("check ok\n");
|
|
|
+ fflush(stdout);
|
|
|
+
|
|
|
+ // clean up
|
|
|
+ delete ep;
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+IoManager::~IoManager() {
|
|
|
+ tcpsock->close();
|
|
|
+
|
|
|
+ delete ipstring;
|
|
|
+ delete tcpsock;
|
|
|
+}
|