Ver código fonte

adhere to current protocol with server

Missingmew 5 anos atrás
pai
commit
3914463af4
2 arquivos alterados com 115 adições e 3 exclusões
  1. 114 3
      cli/src/iomanager.cpp
  2. 1 0
      cli/src/main.cpp

+ 114 - 3
cli/src/iomanager.cpp

@@ -40,7 +40,7 @@ bool IoManager::connect() {
 	
 	// send version check
 	// TODO make client version global
-	root["version"] = "0.2";
+	root["version"] = "0.1";
 	
 	std::cout << root << std::endl;
 	
@@ -55,7 +55,8 @@ bool IoManager::connect() {
 	fflush(stdout);
 	
 	// recieve answer to version check
-	boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_all(), errcode);
+	// 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
@@ -77,13 +78,16 @@ bool IoManager::connect() {
 	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.type() != Json::ValueType::booleanValue || !checkok) {
 		// TODO make client version global
-		std::cerr << "version check failed. client version is " << "0.2" << std::endl
+		std::cerr << "version check failed. client version is " << "0.1" << std::endl
 			  << "server reports version " << root["version"] << std::endl;
 		return false;
 	}
@@ -91,6 +95,56 @@ bool IoManager::connect() {
 	printf("check ok\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;
 	
@@ -98,6 +152,63 @@ bool IoManager::connect() {
 }
 
 IoManager::~IoManager() {
+	
+	/* */
+	
+	
+	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;

+ 1 - 0
cli/src/main.cpp

@@ -124,5 +124,6 @@ int main(int argc, char **argv) {
   if(ioman->connect()) {
 	  ioman->run();
   }
+  delete ioman;
   std::printf("done\n");
 }