summaryrefslogtreecommitdiff
path: root/project2/json/presenter.cpp
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2012-02-17 19:44:04 +0000
committerrandomdan <randomdan@localhost>2012-02-17 19:44:04 +0000
commitb5dd4ebbebe50e999431409e186f699458f43225 (patch)
treebb21c00cb04fcb7cbb2e67aebf7c347f2dbb8e25 /project2/json/presenter.cpp
parentTurn script values inside out to avoid throwing internally (diff)
downloadproject2-b5dd4ebbebe50e999431409e186f699458f43225.tar.bz2
project2-b5dd4ebbebe50e999431409e186f699458f43225.tar.xz
project2-b5dd4ebbebe50e999431409e186f699458f43225.zip
Finer control over output to presenters, addresses issues with JSON output and makes some other bits more sensible
Tweaks to XSLT as some things have moved
Diffstat (limited to 'project2/json/presenter.cpp')
-rw-r--r--project2/json/presenter.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/project2/json/presenter.cpp b/project2/json/presenter.cpp
index f50c322..00ed334 100644
--- a/project2/json/presenter.cpp
+++ b/project2/json/presenter.cpp
@@ -13,36 +13,51 @@ class JsonPresenter : public MultiRowSetPresenter, public ContentPresenter, publ
SourceOf<json::Object>(s),
SourceOf<WritableContent>(s) {
curRowSet.push(&object);
+ vaStack.push(&JsonPresenter::addValueToObject);
}
+ typedef void (JsonPresenter::*ValueAdder)(const Glib::ustring &, const VariableType &) const;
+ typedef std::stack<ValueAdder> ValueAdderStack;
+ mutable ValueAdderStack vaStack;
void addNamedValue(const Glib::ustring & name, const VariableType & value) const {
+ (this->*vaStack.top())(name, value);
+ }
+ void addValueToObject(const Glib::ustring & name, const VariableType & value) const {
(*curRowSet.top())[name] = json::ValuePtr(new json::Value(boost::apply_visitor(Project2ToJson(), value)));
}
- void addNewRow(const Glib::ustring & name) const {
- if (!curRowArray.top()) {
- json::Value * v = new json::Value(json::Array());
- curRowArray.top() = boost::get<json::Array>(v);
- (*curRowSet.top())[name] = json::ValuePtr(v);
- }
+ void addValueToArray(const Glib::ustring &, const VariableType & value) const {
+ curRowArray.top()->push_back(json::ValuePtr(new json::Value(boost::apply_visitor(Project2ToJson(), value))));
+ }
+ void addNewRow(const Glib::ustring &) const {
json::Value * v = new json::Value(json::Object());
curRowSet.push(boost::get<json::Object>(v));
curRowArray.top()->push_back(json::ValuePtr(v));
+ vaStack.push(&JsonPresenter::addValueToObject);
}
void finishRow() const {
+ vaStack.pop();
curRowSet.pop();
}
void addNewRowSet(const Glib::ustring & name) const {
json::Value * v = new json::Value(json::Object());
(*curRowSet.top())[name] = json::ValuePtr(v);
curRowSet.push(boost::get<json::Object>(v));
- curRowArray.push(NULL);
}
void addNewRowSet(const Glib::ustring & name, const Glib::ustring & ns) const {
addNewRowSet(ns + ":" + name);
}
void finishRowSet() const {
- curRowArray.pop();
curRowSet.pop();
}
+ void addNewArray(const Glib::ustring & name, bool) const {
+ json::Value * v = new json::Value(json::Array());
+ curRowArray.push(boost::get<json::Array>(v));
+ (*curRowSet.top())[name] = json::ValuePtr(v);
+ vaStack.push(&JsonPresenter::addValueToArray);
+ }
+ void finishArray(bool) const {
+ vaStack.pop();
+ curRowArray.pop();
+ }
operator const json::Object *() const {
return &object;
}