瀏覽代碼

minor iomanager restructure, fix version check, add minimal machineiomanager functionality

Missingmew 5 年之前
父節點
當前提交
a315ac89e7
共有 3 個文件被更改,包括 80 次插入7 次删除
  1. 0 1
      cli/include/iomanager.hpp
  2. 6 5
      cli/src/iomanager.cpp
  3. 74 1
      cli/src/machineiomanager.cpp

+ 0 - 1
cli/include/iomanager.hpp

@@ -10,7 +10,6 @@ using boost::asio::ip::tcp;
 
 class IoManager {
 protected:
-	boost::asio::streambuf recvbuf;
 	boost::asio::io_service ios;
 	tcp::socket *tcpsock;
 	boost::system::error_code errcode;

+ 6 - 5
cli/src/iomanager.cpp

@@ -12,10 +12,12 @@ IoManager::IoManager(char *ipcstring) {
 }
 
 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());
@@ -39,7 +41,6 @@ bool IoManager::connect() {
 	fflush(stdout);
 	
 	// send version check
-	// TODO make client version global
 	root["version"] = VERSION;
 	
 	std::cout << root << std::endl;
@@ -85,14 +86,14 @@ bool IoManager::connect() {
 	
 	// check if version check was ok
 	checkok = root["accept"];
-	if(checkok.type() != Json::ValueType::booleanValue || !checkok) {
-		// TODO make client version global
+	
+	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");
+	printf("check ok\n\n\n");
 	fflush(stdout);
 	
 	/* */
@@ -155,7 +156,7 @@ IoManager::~IoManager() {
 	
 	/* */
 	
-	
+	boost::asio::streambuf recvbuf;
 	Json::Value root, checkok;
 	const char *recvjson;
 	std::string jsonerror;

+ 74 - 1
cli/src/machineiomanager.cpp

@@ -1,8 +1,81 @@
 #include "../include/machineiomanager.hpp"
+#include "../include/commands.hpp"
 
 #include <iostream>
 #include <jsoncpp/json/json.h>
 
+#include <readline/readline.h>
+
+using boost::asio::buffer;
+
 void MachineIoManager::run() {
 	std::cout << "MachineIoManager::run() says hello!" << std::endl;
-}
+
+	boost::asio::streambuf recvbuf;
+	boost::system::error_code errcode;
+	
+	Json::Value root;
+	const char *recvjson;
+	
+	Json::StreamWriterBuilder wbuilder;
+	
+	bool keep_reading = true;
+	COMMANDID cmd;
+	char *line = NULL;
+	while(keep_reading){
+		free(line);
+		root = Json::Value();
+		
+		// read an input line
+		line = readline ("");
+        
+		// if no input continue
+		if (strlen(line) == 0) {
+			continue;
+		}
+		
+		cmd = getCmdIdFromString(line);
+		
+		switch(cmd) {
+			case CMD_DISCONNECT: {
+				std::cerr << "disconnecting\n";
+				keep_reading = false;
+				break;
+			}
+			case CMD_STATUS: {
+				root["command"] = "status";
+				
+				// send request
+				boost::asio::write(*tcpsock, buffer(Json::writeString(wbuilder, root)), errcode);
+				if(errcode) {
+					std::cerr << "couldnt send version check" << std::endl
+						  << errcode.message() << std::endl;
+					break;
+				}
+				
+				// receive answer
+				// using transfer_at_least(1) to avoid lockup with transfer_all()
+				boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_at_least(1), errcode);
+				if (errcode && errcode != boost::asio::error::eof) {
+					std::cerr << "couldnt recieve version check" << std::endl
+						  << errcode.message() << std::endl;
+					break;
+				}
+				
+				// dump received data to stdout for gui to handle
+				recvjson = boost::asio::buffer_cast<const char *>(recvbuf.data());
+				std::cout << recvjson;
+				
+				break;
+			}
+			default: {
+				std::cerr << "unknown command " << line << "\n";
+				break;
+			}
+		}
+		std::printf("\n");
+	}
+	free(line);
+	
+	return;
+}