From a8ffa6ef4d593b4228b0c921741c65d1f8a2891b Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 19 Dec 2010 16:12:02 +0000 Subject: loading comamnds and response table form file git-svn-id: https://svn.spreadspace.org/gcsd/trunk@70 ac14a137-c7f1-4531-abe0-07747231d213 --- examples/basic_mode.lua | 8 +++++- examples/dynamic_dispatch_table.lua | 6 +++- src/Makefile | 1 + src/command_table.lua | 21 ++------------ src/dispatch_tables.lua | 57 +++++++++++++++++++++++++++++++++++++ src/main_loop.lua | 2 +- src/response_table.lua | 10 ++++++- 7 files changed, 82 insertions(+), 23 deletions(-) create mode 100644 src/dispatch_tables.lua diff --git a/examples/basic_mode.lua b/examples/basic_mode.lua index 04c16df..97cccd1 100644 --- a/examples/basic_mode.lua +++ b/examples/basic_mode.lua @@ -1,6 +1,12 @@ -return { +local commands = { ["%w+%s*\n"] = function(match) command_queue:enqueue(string.match(match , "(%w+)%s*")) end, [".*\n"] = function(match) end } + +local responses = { + [".*\n"] = function(match) end +} + +return commands, responses \ No newline at end of file diff --git a/examples/dynamic_dispatch_table.lua b/examples/dynamic_dispatch_table.lua index c515621..4d94fa2 100644 --- a/examples/dynamic_dispatch_table.lua +++ b/examples/dynamic_dispatch_table.lua @@ -13,4 +13,8 @@ local get_length_table = { end } -return get_length_table +local responses = { + [".*\n"] = function(match) end +} + +return get_length_table, responses diff --git a/src/Makefile b/src/Makefile index 4bdd2da..5f00f24 100644 --- a/src/Makefile +++ b/src/Makefile @@ -59,6 +59,7 @@ LUA_SRCS := client_list.lua \ command_queue.lua \ command_table.lua \ response_table.lua \ + dispatch_tables.lua \ main_loop.lua LUA_BYTECODE := $(EXECUTABLE).lc diff --git a/src/command_table.lua b/src/command_table.lua index f663df3..e3e6b42 100644 --- a/src/command_table.lua +++ b/src/command_table.lua @@ -38,29 +38,12 @@ command_table.regex_to_handler = { [".*\n"] = function(match) end } -function command_table:load_handler_table_file(filename) - local defines = require('defines') - if (type(filename) ~= "nil") then - if (type(filename) ~= "string") then - log.printf(log.ERROR, "filename must be of type 'string' and denote a valid path") - return defines.KILL_DAEMON - end - local chunk, err = loadfile(filename) - if (not chunk) then - log.printf(log.ERROR, "failed to load dispatch table: %s", err) - return defines.KILL_DAEMON - end - self:register_handler_table(chunk()) - log.printf(log.NOTICE, "loaded dispatch table from file %s", filename) - end - return defines.OK -end - function command_table:register_handler_table(handler_table) if (type(handler_table) ~= "table") then - error("handler_table must be of type 'table'") + error("command handler_table must be of type 'table'") end self.regex_to_handler = handler_table + log.printf(log.DEBUG, "loaded new command handler table") end function command_table:dispatch(command_buffer) diff --git a/src/dispatch_tables.lua b/src/dispatch_tables.lua new file mode 100644 index 0000000..768e33f --- /dev/null +++ b/src/dispatch_tables.lua @@ -0,0 +1,57 @@ +-- +-- gcsd +-- +-- gcsd the generic command sequencer daemon can be used to serialize +-- commands sent over various paralell communication channels to a +-- single command output. It can be seen as a multiplexer for any +-- kind of communication between a single resource and various clients +-- which want to submit commands to it or query information from it. +-- gcsd is written in C and Lua. The goal is to provide an easy to +-- understand high level API based on Lua which can be used to +-- implement the business logic of the so formed multiplexer daemon. +-- +-- +-- Copyright (C) 2009-2010 Markus Grueneis +-- Christian Pointner +-- +-- This file is part of gcsd. +-- +-- gcsd is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- any later version. +-- +-- gcsd is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with gcsd. If not, see . +-- + +dispatch_tables = {} + +function dispatch_tables:load_handler_tables_file(filename) + local defines = require('defines') + if (type(filename) ~= "nil") then + if (type(filename) ~= "string") then + log.printf(log.ERROR, "filename must be of type 'string' and denote a valid path") + return defines.KILL_DAEMON + end + local chunk, err = loadfile(filename) + if (not chunk) then + log.printf(log.ERROR, "failed to load dispatch table: %s", err) + return defines.KILL_DAEMON + end + commands, responses = chunk() + if commands then + command_table:register_handler_table(commands) + end + if responses then + response_table:register_handler_table(responses) + end + log.printf(log.NOTICE, "loaded dispatch tables from file %s", filename) + end + return defines.OK +end diff --git a/src/main_loop.lua b/src/main_loop.lua index b512dd2..ed719ad 100644 --- a/src/main_loop.lua +++ b/src/main_loop.lua @@ -74,7 +74,7 @@ function main_loop(opt) log.printf(log.NOTICE, "main_loop started") local sig = signal.init() - local return_value = command_table:load_handler_table_file(opt.lua_code) + local return_value = dispatch_tables:load_handler_tables_file(opt.lua_code) if (return_value == defines.KILL_DAEMON) then return_value = -1 else diff --git a/src/response_table.lua b/src/response_table.lua index 31ac0c5..3f5487b 100644 --- a/src/response_table.lua +++ b/src/response_table.lua @@ -32,9 +32,17 @@ response_table = {} response_table.regex_to_handler = { - [".*\n"] = function(match) log.printf(log.DEBUG, "got response: %s", match) end + [".*\n"] = function(match) end } +function response_table:register_handler_table(handler_table) + if (type(handler_table) ~= "table") then + error("response handler_table must be of type 'table'") + end + self.regex_to_handler = handler_table + log.printf(log.DEBUG, "loaded new response handler table") +end + function response_table:dispatch(response_buffer) local init = 1 repeat -- cgit v1.2.3