summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2010-12-19 16:12:02 +0000
committerChristian Pointner <equinox@spreadspace.org>2010-12-19 16:12:02 +0000
commita8ffa6ef4d593b4228b0c921741c65d1f8a2891b (patch)
treeadfafbf89d5516a7a56933f39e9236a929d6b6dc
parentupdated TODO (diff)
loading comamnds and response table form file
git-svn-id: https://svn.spreadspace.org/gcsd/trunk@70 ac14a137-c7f1-4531-abe0-07747231d213
-rw-r--r--examples/basic_mode.lua8
-rw-r--r--examples/dynamic_dispatch_table.lua6
-rw-r--r--src/Makefile1
-rw-r--r--src/command_table.lua21
-rw-r--r--src/dispatch_tables.lua57
-rw-r--r--src/main_loop.lua2
-rw-r--r--src/response_table.lua10
7 files changed, 82 insertions, 23 deletions
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 <gimpf@spreadspace.org>
+-- Christian Pointner <equinox@spreadspace.org>
+--
+-- 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 <http://www.gnu.org/licenses/>.
+--
+
+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