summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2008-06-03 08:13:20 +0000
committerdeva <deva>2008-06-03 08:13:20 +0000
commitbb3fad646f94739a876869464a484c99795bce61 (patch)
tree1894d6b43055b654150bf9e56cc1baefce34dcad
parent13b9aa0c0ab5a7b66c08f7a7e02c193530640ed3 (diff)
Added support for lua validator programs.
-rw-r--r--server/src/luaquerymapper.cc1
-rw-r--r--server/src/queryhandler.cc4
-rw-r--r--server/src/queryparser.cc5
-rw-r--r--server/src/server.cc20
-rw-r--r--server/src/template.h6
-rw-r--r--server/src/templateparser.cc38
-rw-r--r--server/src/templateparser.h5
-rw-r--r--server/src/widgetgenerator.cc2
-rw-r--r--server/xml/example2.xml16
9 files changed, 85 insertions, 12 deletions
diff --git a/server/src/luaquerymapper.cc b/server/src/luaquerymapper.cc
index c99b48b..b698fe9 100644
--- a/server/src/luaquerymapper.cc
+++ b/server/src/luaquerymapper.cc
@@ -60,7 +60,6 @@ LUAQueryMapper::LUAQueryMapper(QueryResult &res)
luaL_openlibs(L);
- // FIXME: Insert these variables directly into the LUA stack instead of parsing them.
std::string preload = loadresultstring(res);
int s = luaL_loadbuffer(L, preload.c_str(), preload.size(), "preload");
diff --git a/server/src/queryhandler.cc b/server/src/queryhandler.cc
index 309c014..cd96b03 100644
--- a/server/src/queryhandler.cc
+++ b/server/src/queryhandler.cc
@@ -176,8 +176,8 @@ std::string QueryHandler::exec()
" device_type=\"%s\"\n"
" filter=\"latest\"\n"
" location=\"all\"/>\n",
- query.attributes["device_id"].c_str(),
- query.attributes["device_type"].c_str());
+ query.attributes["class"].c_str(),
+ query.attributes["class"].c_str());
socket->write(buf, strlen(buf));
diff --git a/server/src/queryparser.cc b/server/src/queryparser.cc
index fc64c76..0135515 100644
--- a/server/src/queryparser.cc
+++ b/server/src/queryparser.cc
@@ -47,6 +47,11 @@ void QueryParser::startTag(std::string name, std::map< std::string, std::string>
if(name == "result") {
this->timestamp = atol(attributes["timestamp"].c_str());
+
+ QueryResult q;
+ q.timestamp = this->timestamp;
+ stack.back()->groups[attributes["class"]] = q;
+ stack.push_back(&stack.back()->groups[attributes["class"]]);
}
if(name == "group") {
diff --git a/server/src/server.cc b/server/src/server.cc
index e85c35c..f74c2b0 100644
--- a/server/src/server.cc
+++ b/server/src/server.cc
@@ -150,6 +150,26 @@ static void connection(TCPSocket &socket)
socket.write("\">\n");
if(macro.attributes["name"] == request.macro) {
+ // Handle lua programs
+ if(macro.luaprograms.size()) {
+ socket.write(" <luaprograms>\n");
+
+ std::vector< LUAProgram >::iterator lpi = macro.luaprograms.begin();
+ while(lpi != macro.luaprograms.end()) {
+ socket.write(" <luaprogram name=\"");
+ socket.write(lpi->attributes["name"]);
+ socket.write("\">\n");
+
+ socket.write(lpi->attributes["lua"]);
+
+ socket.write("\n </luaprogram>\n");
+
+ lpi++;
+ }
+
+ socket.write(" </luaprograms>\n");
+ }
+
widgetgenerator(socket, macro, lqm, db);
}
diff --git a/server/src/template.h b/server/src/template.h
index 954aa76..f19746a 100644
--- a/server/src/template.h
+++ b/server/src/template.h
@@ -36,6 +36,11 @@ public:
std::map< std::string, std::string > attributes;
};
+class LUAProgram {
+public:
+ std::map< std::string, std::string > attributes;
+};
+
class Map {
public:
std::map< std::string, std::string > attributes;
@@ -50,6 +55,7 @@ class Macro {
public:
std::vector< Query > queries;
std::vector< Map > maps;
+ std::vector< LUAProgram > luaprograms;
Widget window;
std::map< std::string, std::string > attributes;
};
diff --git a/server/src/templateparser.cc b/server/src/templateparser.cc
index d35811a..04650ca 100644
--- a/server/src/templateparser.cc
+++ b/server/src/templateparser.cc
@@ -65,6 +65,7 @@ TemplateParser::TemplateParser(std::string course)
t = NULL;
current_macro = NULL;
current_map = NULL;
+ current_luaprogram = NULL;
file = XML"/";
file.append(course);
@@ -85,11 +86,14 @@ TemplateParser::~TemplateParser()
void TemplateParser::characterData(std::string &data)
{
if(state == MAP) {
- // assert(current_macro->maps.size()); // No maps present!
- // current_macro->maps.back().attributes["lua"].append(data);
assert(current_map); // No map present!
current_map->attributes["lua"].append(data);
}
+
+ if(state == LUAPROGRAM) {
+ assert(current_luaprogram); // No lua program present!
+ current_luaprogram->attributes["lua"].append(data);
+ }
}
void TemplateParser::startTag(std::string name, std::map< std::string, std::string> attributes)
@@ -183,6 +187,31 @@ void TemplateParser::startTag(std::string name, std::map< std::string, std::stri
return;
}
+ // Enable LUA Program parsing
+ if(name == "luaprograms") {
+ if(state != MACRO) error("luaprograms found outside macro.");
+ state = LUAPROGRAMS;
+
+ assert(current_macro); // No macro is currently available, cannot create maps!
+
+ return;
+ }
+
+ // Create Query
+ if(name == "luaprogram") {
+ if(state != LUAPROGRAMS) error("lua program found outside maps.");
+ state = LUAPROGRAM;
+
+ assert(current_macro); // No macro is currently available, cannot create map!
+
+ LUAProgram l;
+ l.attributes = attributes;
+ current_macro->luaprograms.push_back(l);
+ current_luaprogram = &(current_macro->luaprograms.back());
+
+ return;
+ }
+
// Enable widget parsing
if(name == "window") {
@@ -243,6 +272,11 @@ void TemplateParser::endTag(std::string name)
current_map = NULL;
state = MAPS;
}
+ if(name == "luaprograms") state = MACRO;
+ if(name == "luaprogram") {
+ current_luaprogram = NULL;
+ state = LUAPROGRAMS;
+ }
if(name == "window") state = MACRO;
if(state == WINDOW) {
diff --git a/server/src/templateparser.h b/server/src/templateparser.h
index 70197eb..61ad42a 100644
--- a/server/src/templateparser.h
+++ b/server/src/templateparser.h
@@ -39,7 +39,9 @@ typedef enum {
QUERY,
MAPS,
MAP,
- WINDOW
+ WINDOW,
+ LUAPROGRAMS,
+ LUAPROGRAM
} ParserState;
class TemplateParser : public SAXParser {
@@ -67,6 +69,7 @@ private:
Template *t;
Macro *current_macro;
Map *current_map;
+ LUAProgram *current_luaprogram;
std::vector< Widget* > widgetstack;
// Error callback function.
diff --git a/server/src/widgetgenerator.cc b/server/src/widgetgenerator.cc
index 52752cc..6234513 100644
--- a/server/src/widgetgenerator.cc
+++ b/server/src/widgetgenerator.cc
@@ -113,6 +113,6 @@ void widgetgenerator(TCPSocket &socket, Macro &macro, LUAQueryMapper &mapper, Da
get_fields(macro.window, fields);
Values values = db.getValues("2003791613", fields);
-
+
send_macro_widget(macro, macro.window, socket, " ", mapper, values);
}
diff --git a/server/xml/example2.xml b/server/xml/example2.xml
index 0bfee27..ddcc4e6 100644
--- a/server/xml/example2.xml
+++ b/server/xml/example2.xml
@@ -22,6 +22,16 @@
return lensmeter.right.cyl.value, lensmeter.right.cyl.timestamp
</map>
</maps>
+ <luaprograms>
+ <luaprogram name="theanswer">
+ if( tonumber(value) == 42 )
+ then
+ return true
+ else
+ return false
+ end
+ </luaprogram>
+ </luaprograms>
<window name="mainwindow"
caption="Fundus"
width="500"
@@ -30,11 +40,7 @@
<frame name="linse_frame" caption="Linser:" layout="vbox">
<frame name="linse_framea" layout="hbox">
<label name="a" width="300" caption="Akse rotation:"/>
- <lineedit name="linse4"
- regexp="[24]*"
- map="axis"
- lua_validator="if( tonumber(value) == 42 ) then return 'true' else return 'false' end"
- value="90K"/>
+ <lineedit name="linse4" regexp="[24]*" map="axis" lua="theanswer" value="90K"/>
</frame>
<frame name="linse_frameb" layout="hbox">
<label name="b" width="300" caption="Sphere:"/>