From c1bb76eeda86b16e8f00c5cb7ad2d31a1d94fe46 Mon Sep 17 00:00:00 2001 From: deva Date: Tue, 6 May 2008 15:27:40 +0000 Subject: Added experimental parser of the external data query XML results. --- server/src/externaldataqueryparser.cc | 112 ++++++++++++++++++++++++++++++++++ server/src/externaldataqueryparser.h | 58 ++++++++++++++++++ 2 files changed, 170 insertions(+) create mode 100644 server/src/externaldataqueryparser.cc create mode 100644 server/src/externaldataqueryparser.h diff --git a/server/src/externaldataqueryparser.cc b/server/src/externaldataqueryparser.cc new file mode 100644 index 0000000..2de7fba --- /dev/null +++ b/server/src/externaldataqueryparser.cc @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * externaldataqueryparser.cc + * + * Tue May 6 17:02:37 CEST 2008 + * Copyright 2008 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup + * deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro 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 2 of the License, or + * (at your option) any later version. + * + * Pracro 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 Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "externaldataqueryparser.h" + +ExternalDataQueryParser::ExternalDataQueryParser(std::string document) +{ + this->document = document; + p = 0; + stack.push_back(&result); +} + +void ExternalDataQueryParser::startTag(std::string name, std::map< std::string, std::string> attributes) +{ + + if(name == "group") { + QueryResult q; + stack.back()->groups[attributes["name"]] = q; + stack.push_back(&stack.back()->groups[attributes["name"]]); + } + + if(name == "value") { + stack.back()->values[attributes["name"]] = attributes["value"]; + } + +} + +void ExternalDataQueryParser::endTag(std::string name) +{ + if(name == "group") stack.pop_back(); +} + +// FIXME: This is *not* the optimal way to do this. +int ExternalDataQueryParser::readData(char *data, size_t size) +{ + size_t len = document.size() - p < size ? document.size() - p : size; + strncpy(data, document.c_str() + p, len); + p += len; + return len; +} + +#ifdef TEST_EXTERNALDATAQUERYPARSER + +static std::string loadresultstring(QueryResult &res, std::string group = "") +{ + std::string s; + + std::map< std::string, std::string >::iterator v = res.values.begin(); + while(v != res.values.end()) { + s += group + (*v).first + " = \"" + (*v).second + "\"\n"; + v++; + } + + std::map< std::string, QueryResult >::iterator g = res.groups.begin(); + while(g != res.groups.end()) { + s += group + (*g).first + " = {}\n"; + s += loadresultstring((*g).second, group + (*g).first + "."); + g++; + } + + return s; +} + +char xml[] = + "\n" + "\n" + " " + " " + " \n" + " " + " " + " \n" + " \n" + " " + " " + " \n" + "\n"; + +int main() +{ + ExternalDataQueryParser e(xml); + e.parse(); + + printf("%s\n", loadresultstring(e.result).c_str()); + + return 0; +} + +#endif diff --git a/server/src/externaldataqueryparser.h b/server/src/externaldataqueryparser.h new file mode 100644 index 0000000..1b760de --- /dev/null +++ b/server/src/externaldataqueryparser.h @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * externaldataqueryparser.h + * + * Tue May 6 17:02:36 CEST 2008 + * Copyright 2008 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup + * deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro 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 2 of the License, or + * (at your option) any later version. + * + * Pracro 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 Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __PRACRO_EXTERNALDATAQUERYPARSER_H__ +#define __PRACRO_EXTERNALDATAQUERYPARSER_H__ + +#include "queryresult.h" +#include "sax_parser.h" + +#include + +/** + * This class parses xml entyties into a QueryResult structure. + */ +class ExternalDataQueryParser : public SAXParser { +public: + ExternalDataQueryParser(std::string document); + + void startTag(std::string name, std::map< std::string, std::string> attributes); + void endTag(std::string name); + + QueryResult result; + +protected: + int readData(char *data, size_t size); + +private: + // For read + int p; + std::string document; + + std::vector< QueryResult * > stack; +}; + +#endif/*__PRACRO_EXTERNALDATAQUERYPARSER_H__*/ -- cgit v1.2.3