summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/server.cc9
-rw-r--r--server/src/template.h1
-rw-r--r--server/src/templateparser.cc95
3 files changed, 44 insertions, 61 deletions
diff --git a/server/src/server.cc b/server/src/server.cc
index 884284a..8bfd827 100644
--- a/server/src/server.cc
+++ b/server/src/server.cc
@@ -148,17 +148,14 @@ static std::string handleTransaction(Transaction *transaction,
while(mi2 != templ->course.macros.end()) {
Macro &macro = (*mi2);
- // FIXME: This is to be made in some other way in a later version.
- if(macro.attributes.find("header") != macro.attributes.end()) {
- // Macro is a special headline macro
- // Simply output a headline, and ignore the rest of it.
- answer += " <macro header=\"" + macro.attributes["header"] + "\"></macro>\n";
+ if(macro.isHeader) {
+ answer += " <header caption=\"" + macro.attributes["caption"] + "\"/>\n";
mi2++;
continue;
}
bool completed = db->checkMacro(transaction->cpr, macro.attributes["name"]);
-
+
answer += " <macro completed=";
if(completed) answer += "\"true\"";
else answer += "\"false\"";
diff --git a/server/src/template.h b/server/src/template.h
index f39baac..ac5900f 100644
--- a/server/src/template.h
+++ b/server/src/template.h
@@ -65,6 +65,7 @@ public:
Widget window;
std::map< std::string, std::string > attributes;
Resume resume;
+ bool isHeader;
};
class Course {
diff --git a/server/src/templateparser.cc b/server/src/templateparser.cc
index 8db6bbf..49cc29d 100644
--- a/server/src/templateparser.cc
+++ b/server/src/templateparser.cc
@@ -47,28 +47,14 @@
void TemplateParser::error(const char* fmt, ...)
{
- // TODO: Throw exception here.
-
va_list argp;
- int s = 256;
- char *p = new char[s];
- /* See printf(3) for details on the loop how to get the right buffersize. */
- while(1) {
- va_start(argp, fmt);
- int n = vsnprintf(p, s, fmt, argp);
- va_end(argp);
- if(n > -1 && n < s)
- break;
- if(n > -1) /* glibc 2.1 */
- s = n+1; /* precisely what is needed */
- else /* glibc 2.0 */
- s *= 2; /* twice the old size */
- delete[] p;
- p = new char[s];
- }
+ char *p;
+ va_start(argp, fmt);
+ vasprintf(&p, fmt, argp);
+ va_end(argp);
PRACRO_ERR_LOG(macro, "Error in TemplateParser: %s\n", p);
- delete[] p;
- throw Exception("Error in TemplateParser");
+ throw Exception(std::string("Error in TemplateParser: ") + p);
+ free(p);
}
TemplateParser::TemplateParser(std::string course)
@@ -77,11 +63,7 @@ TemplateParser::TemplateParser(std::string course)
t = new Template();
current_macro = NULL;
-#ifndef TEST_TEMPLATEPARSER
file = Conf::xml_basedir + "/templates/" + course + ".xml";
-#else
- file = "../xml/templates/" + course + ".xml";
-#endif/*TEST_TEMPLATEPARSER*/
PRACRO_DEBUG(macro, "Using template file: %s\n", file.c_str());
@@ -114,7 +96,7 @@ void TemplateParser::startTag(std::string name, std::map< std::string, std::stri
}
// Create macro and enable parsing of queries, maps and window
- if(name == "macro") {
+ if(name == "macro" || name == "header") {
if(state != COURSE) error("macro found outside course.");
state = MACRO;
@@ -122,6 +104,7 @@ void TemplateParser::startTag(std::string name, std::map< std::string, std::stri
Macro m;
m.attributes = attributes;
+ m.isHeader = name == "header";
t->course.macros.push_back(m);
current_macro = &(t->course.macros.back());
@@ -134,7 +117,7 @@ void TemplateParser::startTag(std::string name, std::map< std::string, std::stri
void TemplateParser::endTag(std::string name)
{
if(name == "course") state = UNDEFINED;
- if(name == "macro") {
+ if(name == "macro" || name == "header") {
current_macro = NULL;
state = COURSE;
}
@@ -182,41 +165,43 @@ void print_attributes(std::string prefix,
int main()
{
+ Conf::xml_basedir = "../xml/";
+
try {
- TemplateParser parser("example");
- parser.parse();
+ TemplateParser parser("example");
+ parser.parse();
- Template *t = parser.getTemplate();
+ Template *t = parser.getTemplate();
- printf("[Template]:\n");
- print_attributes("\t-", t->attributes);
+ printf("[Template]:\n");
+ print_attributes("\t-", t->attributes);
- printf("\t[Course]:\n");
- print_attributes("\t\t-", t->course.attributes);
+ printf("\t[Course]:\n");
+ print_attributes("\t\t-", t->course.attributes);
- printf("\t\t[Macros]:\n");
- std::vector< Macro >::iterator i = t->course.macros.begin();
-
- while(i != t->course.macros.end()) {
- printf("\t\t\t[Macro]:\n");
- print_attributes("\t\t\t\t-", (*i).attributes);
-
- std::vector< Query >::iterator qi = (*i).queries.begin();
- while(qi != (*i).queries.end()) {
- printf("\t\t\t\t[Query]:\n");
- print_attributes("\t\t\t\t\t-", (*qi).attributes);
- qi++;
+ printf("\t\t[Macros]:\n");
+ std::vector< Macro >::iterator i = t->course.macros.begin();
+
+ while(i != t->course.macros.end()) {
+ printf("\t\t\t[Macro]:\n");
+ print_attributes("\t\t\t\t-", (*i).attributes);
+
+ std::vector< Query >::iterator qi = (*i).queries.begin();
+ while(qi != (*i).queries.end()) {
+ printf("\t\t\t\t[Query]:\n");
+ print_attributes("\t\t\t\t\t-", (*qi).attributes);
+ qi++;
+ }
+
+ std::vector< Map >::iterator mi = (*i).maps.begin();
+ while(mi != (*i).maps.end()) {
+ printf("\t\t\t\t[Map]:\n");
+ print_attributes("\t\t\t\t\t-", (*mi).attributes);
+ mi++;
+ }
+
+ i++;
}
-
- std::vector< Map >::iterator mi = (*i).maps.begin();
- while(mi != (*i).maps.end()) {
- printf("\t\t\t\t[Map]:\n");
- print_attributes("\t\t\t\t\t-", (*mi).attributes);
- mi++;
- }
-
- i++;
- }
} catch(Exception &e) {
printf("ERROR: %s\n", e.what());
return 1;