summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins/element/postpone/PostponeElement.cpp
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-03-06 18:23:17 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-03-06 18:23:17 (GMT)
commite1a31a44c946d58a1b4654e5daa2d10d9c6f881d (patch)
tree7ce434b9bfb30c2de74cfe1f226c2ceda4ee8178 /src/uscxml/plugins/element/postpone/PostponeElement.cpp
parent8c4977361f9e7998da298b9648f3ad4be5e772ff (diff)
downloaduscxml-e1a31a44c946d58a1b4654e5daa2d10d9c6f881d.zip
uscxml-e1a31a44c946d58a1b4654e5daa2d10d9c6f881d.tar.gz
uscxml-e1a31a44c946d58a1b4654e5daa2d10d9c6f881d.tar.bz2
Changed directory monitor to polling behaviour :(
Diffstat (limited to 'src/uscxml/plugins/element/postpone/PostponeElement.cpp')
-rw-r--r--src/uscxml/plugins/element/postpone/PostponeElement.cpp69
1 files changed, 52 insertions, 17 deletions
diff --git a/src/uscxml/plugins/element/postpone/PostponeElement.cpp b/src/uscxml/plugins/element/postpone/PostponeElement.cpp
index 5dc1c60..b50b5c2 100644
--- a/src/uscxml/plugins/element/postpone/PostponeElement.cpp
+++ b/src/uscxml/plugins/element/postpone/PostponeElement.cpp
@@ -41,16 +41,16 @@ void PostponeElement::enterElement(const Arabica::DOM::Node<std::string>& node)
}
// when will we refire the event?
- std::string until;
- try {
- if (HAS_ATTR(node, "untilexpr")) {
- until = _interpreter->getDataModel().evalAsString(ATTR(node, "untilexpr"));
- } else if (HAS_ATTR(node, "until")) {
- until = ATTR(node, "until");
- }
+ std::string until;
+ try {
+ if (HAS_ATTR(node, "untilexpr")) {
+ until = _interpreter->getDataModel().evalAsString(ATTR(node, "untilexpr"));
+ } else if (HAS_ATTR(node, "until")) {
+ until = ATTR(node, "until");
+ }
} catch (Event e) {
LOG(ERROR) << "Syntax error in postpone element untilexpr:" << std::endl << e << std::endl;
- return;
+ return;
}
if (until.length() == 0) {
@@ -58,30 +58,65 @@ void PostponeElement::enterElement(const Arabica::DOM::Node<std::string>& node)
return;
}
+ LOG(INFO) << until;
+
+#if 0
+ std::string timeoutStr = "0s";
+ try {
+ if (HAS_ATTR(node, "timeoutexpr")) {
+ timeoutStr = _interpreter->getDataModel().evalAsString(ATTR(node, "timeoutexpr"));
+ } else if (HAS_ATTR(node, "timeout")) {
+ timeoutStr = ATTR(node, "timeout");
+ }
+ } catch (Event e) {
+ LOG(ERROR) << "Syntax error in postpone element timeoutexpr:" << std::endl << e << std::endl;
+ return;
+ }
+
+ uint64_t timeout = 0;
+ NumAttr timeoutAttr(timeoutStr);
+ if (boost::iequals(timeoutAttr.unit, "s")) {
+ timeout = strTo<int>(timeoutAttr.value) * 1000;
+ } else if (boost::iequals(timeoutAttr.unit, "ms")) {
+ timeout = strTo<int>(timeoutAttr.value);
+ }
+ if (timeout > 0) {
+ timeout += tthread::chrono::system_clock::now();
+ }
+#endif
Event currEvent = _interpreter->getCurrentEvent();
- Resubmitter::postpone(currEvent, until, _interpreter);
+ Resubmitter::postpone(currEvent, until, 0, _interpreter);
}
void PostponeElement::exitElement(const Arabica::DOM::Node<std::string>& node) {
}
-void PostponeElement::Resubmitter::postpone(const Event& event, std::string until, Interpreter* interpreter) {
+void PostponeElement::Resubmitter::postpone(const Event& event, std::string until, uint64_t timeout, Interpreter* interpreter) {
Resubmitter* resubmitter = getInstance(interpreter);
- resubmitter->_postponedEvents.push_back(std::make_pair(until, event));
+ resubmitter->_postponedEvents.push_back(Postponed(event, until, timeout));
}
void PostponeElement::Resubmitter::onStableConfiguration(Interpreter* interpreter) {
- std::list<std::pair<std::string, Event> >::iterator eventIter = _postponedEvents.begin();
+ std::list<Postponed>::iterator eventIter = _postponedEvents.begin();
while(eventIter != _postponedEvents.end()) {
try {
- LOG(INFO) << "Reevaluating: >> " << eventIter->first << " <<";
- if (interpreter->getDataModel().evalAsBool(eventIter->first)) {
- LOG(INFO) << " -> is TRUE";
- interpreter->receive(eventIter->second, true);
+// LOG(INFO) << "Reevaluating: >> " << eventIter->first << " <<";
+ if (eventIter->timeout > 0 && tthread::chrono::system_clock::now() < eventIter->timeout) {
+ // TODO: We should use an event queue
+// LOG(INFO) << " -> Timeout";
+ eventIter->event.name += ".timeout";
+ interpreter->receive(eventIter->event, true);
+ _postponedEvents.erase(eventIter);
+ break;
+ }
+ if (interpreter->getDataModel().evalAsBool(eventIter->until)) {
+// LOG(INFO) << " -> is TRUE";
+ eventIter->event.name += ".postponed";
+ interpreter->receive(eventIter->event, true);
_postponedEvents.erase(eventIter);
break;
}
- LOG(INFO) << " -> is FALSE";
+// LOG(INFO) << " -> is FALSE";
} catch (Event e) {
LOG(ERROR) << "Syntax error while evaluating until attribute of postpone element:" << std::endl << e << std::endl;
_postponedEvents.erase(eventIter++);