Răsfoiți Sursa

Add generic command type

Daniele Bartolini 9 ani în urmă
părinte
comite
0d312e80d8

+ 24 - 17
src/device/console_api.cpp

@@ -27,36 +27,43 @@ static void console_command_script(ConsoleServer& /*cs*/, TCPSocket /*client*/,
 	device()->_lua_environment->execute_string(script.c_str());
 }
 
-static void console_command_reload(ConsoleServer& /*cs*/, TCPSocket /*client*/, const char* json, void* /*user_data*/)
+static void console_command(ConsoleServer& cs, TCPSocket client, const char* json, void* /*user_data*/)
 {
 	TempAllocator4096 ta;
 	JsonObject obj(ta);
-	DynamicString type(ta);
-	DynamicString name(ta);
+	JsonArray args(ta);
 
 	sjson::parse(json, obj);
-	sjson::parse_string(obj["resource_type"], type);
-	sjson::parse_string(obj["resource_name"], name);
+	sjson::parse_array(obj["args"], args);
 
-	device()->reload(ResourceId(type.c_str()), ResourceId(name.c_str()));
-}
+	DynamicString cmd(ta);
+	sjson::parse_string(args[0], cmd);
 
-static void console_command_pause(ConsoleServer& /*cs*/, TCPSocket /*client*/, const char* /*json*/, void* /*user_data*/)
-{
-	device()->pause();
-}
+	if (cmd == "pause")
+		device()->pause();
+	else if (cmd == "unpause")
+		device()->unpause();
+	else if (cmd == "reload")
+	{
+		if (array::size(args) != 3)
+		{
+			cs.error(client, "Usage: reload type name");
+			return;
+		}
 
-static void console_command_unpause(ConsoleServer& /*cs*/, TCPSocket /*client*/, const char* /*json*/, void* /*user_data*/)
-{
-	device()->unpause();
+		DynamicString type(ta);
+		DynamicString name(ta);
+		sjson::parse_string(args[1], type);
+		sjson::parse_string(args[2], name);
+
+		device()->reload(ResourceId(type.c_str()), ResourceId(name.c_str()));
+	}
 }
 
 void load_console_api(ConsoleServer& cs)
 {
 	cs.register_command("script",  console_command_script, NULL);
-	cs.register_command("reload",  console_command_reload, NULL);
-	cs.register_command("pause",   console_command_pause, NULL);
-	cs.register_command("unpause", console_command_unpause, NULL);
+	cs.register_command("command", console_command, NULL);
 }
 
 } // namespace crown

+ 12 - 0
tools/api/engine_api.vala

@@ -15,6 +15,18 @@ namespace Crown
 				);
 		}
 
+		public string command(string[] args)
+		{
+			StringBuilder sb = new StringBuilder();
+			for (int i = 0; i < args.length; ++i)
+			{
+				string arg = args[i].replace("\\", "\\\\").replace("\"", "\\\"");
+				sb.append("\"%s\",".printf(arg));
+			}
+
+			return "{\"type\":\"command\",\"args\":[%s]}".printf(sb.str);
+		}
+
 		public string reload(string type, string name)
 		{
 			return "{\"type\":\"reload\",\"resource_type\":\"%s\",\"resource_name\":\"%s\"}".printf(type, name);

+ 6 - 3
tools/core/console_client.vala

@@ -42,9 +42,12 @@ namespace Crown
 		{
 			try
 			{
-				_connection.close();
-				_connection = null;
-				disconnected();
+				if (_connection != null)
+				{
+					_connection.close();
+					_connection = null;
+					disconnected();
+				}
 			}
 			catch (Error e)
 			{

+ 10 - 26
tools/widgets/console_view.vala

@@ -102,31 +102,6 @@ namespace Crown
 			show_all();
 		}
 
-		private void do_command(string cmd)
-		{
-			string[] words = cmd.split(" ");
-
-			if (words[0] == "reload")
-			{
-				if (words.length == 3)
-					_console_client.send(EngineApi.reload(words[1], words[2]));
-				else
-					log("Console View", "Hint reload <type> <name>", "error");
-			}
-			else
-			{
-				log("Console View", "Unknown command: '%s'".printf(words[0]), "error");
-			}
-		}
-
-		private void do_stuff(string text)
-		{
-			if (text[0] == ':')
-				do_command(text[1:text.length]);
-			else
-				_console_client.send_script(text);
-		}
-
 		private void on_entry_activated()
 		{
 			string text = _entry.text;
@@ -135,7 +110,16 @@ namespace Crown
 			if (text.length > 0)
 			{
 				_entry_history.push(text);
-				do_stuff(text);
+
+				if (text[0] == ':')
+				{
+					string[] args = text[1:text.length].split(" ");
+					_console_client.send(EngineApi.command(args));
+				}
+				else
+				{
+					_console_client.send_script(text);
+				}
 			}
 
 			_entry.text = "";