summaryrefslogtreecommitdiff
path: root/src/response_table.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/response_table.lua')
-rw-r--r--src/response_table.lua65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/response_table.lua b/src/response_table.lua
new file mode 100644
index 0000000..31ac0c5
--- /dev/null
+++ b/src/response_table.lua
@@ -0,0 +1,65 @@
+--
+-- 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/>.
+--
+
+response_table = {}
+response_table.regex_to_handler = {
+ [".*\n"] = function(match) log.printf(log.DEBUG, "got response: %s", match) end
+}
+
+function response_table:dispatch(response_buffer)
+ local init = 1
+ repeat
+ local had_match = false
+ local regex = command_queue:get_expected_response()
+ if regex then
+ local match = string.match(response_buffer, "^" .. regex, init)
+ if match then
+ log.printf(log.DEBUG, "got expected response ('%s'), command completed", match)
+ -- TODO: send expected response to original requestor
+ command_queue:command_completed()
+ init = init + string.len(match)
+ end
+ end
+ -- TODO: check if ooor's are allowed when there is an expected response
+ for regex, handler in pairs(self.regex_to_handler) do
+ local match = string.match(response_buffer, "^" .. regex, init)
+ if match then
+ handler(match)
+ had_match = true
+ init = init + string.len(match)
+ break
+ end
+ end
+ until (not had_match)
+
+ return string.sub(response_buffer, init + 1)
+end