summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2010-07-29 23:51:40 +0000
committerrandomdan <randomdan@localhost>2010-07-29 23:51:40 +0000
commitca3c009de293bed788fa02a15c202747bf70a9f6 (patch)
tree2ad9c26cd9ae309181fa05afc835beb7753b58d1
parentFix typo in class name (diff)
downloadproject2-ca3c009de293bed788fa02a15c202747bf70a9f6.tar.bz2
project2-ca3c009de293bed788fa02a15c202747bf70a9f6.tar.xz
project2-ca3c009de293bed788fa02a15c202747bf70a9f6.zip
Add optional support for default values for variables
-rw-r--r--project2/appEngine.h2
-rw-r--r--project2/cgiEnvironment.cpp12
-rw-r--r--project2/cgiEnvironment.h2
-rw-r--r--project2/environment.cpp2
-rw-r--r--project2/environment.h2
-rw-r--r--project2/perRowValues.h2
-rw-r--r--project2/session.h1
-rw-r--r--project2/sessionShm.cpp6
-rw-r--r--project2/variables.cpp77
-rw-r--r--project2/variables.h5
10 files changed, 93 insertions, 18 deletions
diff --git a/project2/appEngine.h b/project2/appEngine.h
index 7f37cfd..54a8cec 100644
--- a/project2/appEngine.h
+++ b/project2/appEngine.h
@@ -8,6 +8,8 @@
class ApplicationEngine {
public:
+ class UriElementOutOfRange : std::exception { };
+ class ParamNotFound : std::exception { };
class DataSourceNotFound : std::exception { };
class DataSourceNotCompatible : std::exception { };
diff --git a/project2/cgiEnvironment.cpp b/project2/cgiEnvironment.cpp
index fe38f57..2faf165 100644
--- a/project2/cgiEnvironment.cpp
+++ b/project2/cgiEnvironment.cpp
@@ -1,4 +1,5 @@
#include "cgiEnvironment.h"
+#include "appEngine.h"
#include <map>
#include <cgicc/Cgicc.h>
#include <boost/tokenizer.hpp>
@@ -21,14 +22,21 @@ CgiEnvironment::~CgiEnvironment()
}
Glib::ustring
-CgiEnvironment::getParamUri(const std::string & p) const
+CgiEnvironment::getParamUri(unsigned int p) const
{
- return elems[atoi(p.c_str())];
+ if (p >= elems.size()) {
+ throw ApplicationEngine::UriElementOutOfRange();
+ }
+ return elems[p];
}
Glib::ustring
CgiEnvironment::getParamQuery(const std::string & p) const
{
+ cgicc::const_form_iterator i = cgi->getElement(p);
+ if (i == cgi->getElements().end()) {
+ throw ApplicationEngine::ParamNotFound();
+ }
return (*cgi)(p);
}
diff --git a/project2/cgiEnvironment.h b/project2/cgiEnvironment.h
index 7df65c9..c01d50d 100644
--- a/project2/cgiEnvironment.h
+++ b/project2/cgiEnvironment.h
@@ -15,7 +15,7 @@ class CgiEnvironment : public Environment, public cgicc::CgiEnvironment {
CgiEnvironment(cgicc::Cgicc *);
virtual ~CgiEnvironment();
- Glib::ustring getParamUri(const std::string & idx) const;
+ Glib::ustring getParamUri(unsigned int idx) const;
Glib::ustring getParamQuery(const std::string & idx) const;
std::string getServerName() const { return cgicc::CgiEnvironment::getServerName(); }
std::string getScriptName() const { return cgicc::CgiEnvironment::getScriptName(); }
diff --git a/project2/environment.cpp b/project2/environment.cpp
index 9e4d9f0..c0cc0fa 100644
--- a/project2/environment.cpp
+++ b/project2/environment.cpp
@@ -9,7 +9,7 @@ Environment::~Environment()
}
Glib::ustring
-Environment::getParamUri(const std::string &) const
+Environment::getParamUri(unsigned int) const
{
throw ParameterTypeNotSupported();
}
diff --git a/project2/environment.h b/project2/environment.h
index 2925f13..a8c6396 100644
--- a/project2/environment.h
+++ b/project2/environment.h
@@ -11,7 +11,7 @@ class Environment {
Environment();
virtual ~Environment() = 0;
- virtual Glib::ustring getParamUri(const std::string & idx) const = 0;
+ virtual Glib::ustring getParamUri(unsigned int idx) const = 0;
virtual Glib::ustring getParamQuery(const std::string & idx) const = 0;
virtual std::string getServerName() const = 0;
diff --git a/project2/perRowValues.h b/project2/perRowValues.h
index 26a0a6b..cee7e07 100644
--- a/project2/perRowValues.h
+++ b/project2/perRowValues.h
@@ -15,6 +15,8 @@ class RowUser {
class PerRowValues {
public:
+ class ParentOutOfRange : public std::exception { };
+ class FieldDoesNotExist : public std::exception { };
typedef std::vector<const PerRowValues *> RowValuesStack;
PerRowValues();
virtual ~PerRowValues() = 0;
diff --git a/project2/session.h b/project2/session.h
index de31626..8dc1b8b 100644
--- a/project2/session.h
+++ b/project2/session.h
@@ -8,6 +8,7 @@
class Session {
public:
+ class VariableNotFound : public std::exception { };
typedef std::map<Glib::ustring, Glib::ustring> Values;
Session();
diff --git a/project2/sessionShm.cpp b/project2/sessionShm.cpp
index c9f748c..e4c9d16 100644
--- a/project2/sessionShm.cpp
+++ b/project2/sessionShm.cpp
@@ -100,7 +100,11 @@ SessionShmData::~SessionShmData()
Glib::ustring
SessionShm::GetValue(const Glib::ustring & name) const
{
- return data->svs.find(name.c_str())->second.c_str();
+ SessionShmData::SessionValues::const_iterator i = data->svs.find(name.c_str());
+ if (i == data->svs.end()) {
+ throw Session::VariableNotFound();
+ }
+ return i->second.c_str();
}
void
diff --git a/project2/variables.cpp b/project2/variables.cpp
index 9aa1a5b..07d30aa 100644
--- a/project2/variables.cpp
+++ b/project2/variables.cpp
@@ -30,7 +30,15 @@ class VariableSession : public VariableImplDyn {
VariableSession(const Glib::ustring & src) : VariableImplDyn(src) { }
const Glib::ustring & value() const
{
- cache = ApplicationEngine::getCurrent()->session()->GetValue(source.substr(1));
+ try {
+ cache = ApplicationEngine::getCurrent()->session()->GetValue(name);
+ }
+ catch (Session::VariableNotFound) {
+ if (!defaultValue) {
+ throw;
+ }
+ cache = *defaultValue;
+ }
return cache;
}
};
@@ -41,7 +49,15 @@ class VariableParam : public VariableImplDyn {
const Glib::ustring & value() const
{
if (!cacheValid) {
- cache = ApplicationEngine::getCurrent()->env()->getParamQuery(source.substr(1));
+ try {
+ cache = ApplicationEngine::getCurrent()->env()->getParamQuery(name);
+ }
+ catch (ApplicationEngine::ParamNotFound) {
+ if (!defaultValue) {
+ throw;
+ }
+ cache = *defaultValue;
+ }
cacheValid = true;
}
return cache;
@@ -54,7 +70,15 @@ class VariableUri : public VariableImplDyn {
const Glib::ustring & value() const
{
if (!cacheValid) {
- cache = ApplicationEngine::getCurrent()->env()->getParamUri(source.substr(1));
+ try {
+ cache = ApplicationEngine::getCurrent()->env()->getParamUri(atoi(name.c_str()));
+ }
+ catch (ApplicationEngine::UriElementOutOfRange) {
+ if (!defaultValue) {
+ throw;
+ }
+ cache = *defaultValue;
+ }
cacheValid = true;
}
return cache;
@@ -73,16 +97,33 @@ class VariableParent : public VariableImplDyn, public RowUser {
const Glib::ustring & value() const
{
if (!cacheValid) {
- if (!row) {
- PerRowValues::RowValuesStack::const_reverse_iterator r = PerRowValues::Stack().rbegin();
- for (size_t p = depth; --p; r++) ;
- row = *r;
- row->use(this);
- if (dep) {
- row->use(dep);
+ try {
+ if (!row) {
+ PerRowValues::RowValuesStack::const_reverse_iterator r = PerRowValues::Stack().rbegin();
+ for (size_t p = depth; --p; r++) ;
+ if (r == PerRowValues::Stack().rend()) {
+ throw PerRowValues::ParentOutOfRange();
+ }
+ row = *r;
+ row->use(this);
+ if (dep) {
+ row->use(dep);
+ }
}
+ cache = row->getCurrentValue(source);
+ }
+ catch (PerRowValues::ParentOutOfRange) {
+ if (!defaultValue) {
+ throw;
+ }
+ cache = *defaultValue;
+ }
+ catch (PerRowValues::FieldDoesNotExist) {
+ if (!defaultValue) {
+ throw;
+ }
+ cache = *defaultValue;
}
- cache = row->getCurrentValue(source);
cacheValid = true;
}
return cache;
@@ -170,3 +211,17 @@ Variable::create(const Glib::ustring & s, RowUser * dep)
}
}
+VariableImpl::VariableImpl(const Glib::ustring & src) :
+ source(src)
+{
+ Glib::ustring::const_iterator nameStart = std::find_if(source.begin(), source.end(), Glib::Unicode::isalnum);
+ Glib::ustring::const_iterator nameEnd = std::find(nameStart, source.end(), '|');
+ name = Glib::ustring(nameStart, nameEnd);
+ Glib::ustring::const_iterator defaultStart = nameEnd;
+ if (defaultStart != source.end()) {
+ defaultStart++;
+ Glib::ustring::const_iterator defaultEnd = source.end();
+ defaultValue = Glib::ustring(defaultStart, defaultEnd);
+ }
+}
+
diff --git a/project2/variables.h b/project2/variables.h
index 3387a0a..ae3d3c6 100644
--- a/project2/variables.h
+++ b/project2/variables.h
@@ -2,6 +2,7 @@
#define VARIABLES_H
#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
#include <glibmm/ustring.h>
#include <libxml++/nodes/element.h>
#include <libxml++/attribute.h>
@@ -13,8 +14,10 @@ class VariableImpl {
virtual const Glib::ustring & value() const = 0;
protected:
- VariableImpl(const Glib::ustring & src) : source(src) { }
+ VariableImpl(const Glib::ustring & src);
const Glib::ustring source;
+ Glib::ustring name;
+ boost::optional<Glib::ustring> defaultValue;
};
class Variable {