/** * @file * @author 2012-2013 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) * @copyright Simplified BSD * * @cond * This program is free software: you can redistribute it and/or modify * it under the terms of the FreeBSD license as published by the FreeBSD * project. * * This program 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. * * You should have received a copy of the FreeBSD license along with this * program. If not, see . * @endcond */ #include #include "FetchElement.h" #include "uscxml/DOMUtils.h" #include #include #include #ifdef BUILD_AS_PLUGINS #include #endif namespace uscxml { #ifdef BUILD_AS_PLUGINS PLUMA_CONNECTOR bool pluginConnect(pluma::Host& host) { host.add( new FetchElementProvider() ); return true; } #endif boost::shared_ptr FetchElement::create(InterpreterImpl* interpreter) { boost::shared_ptr element = boost::shared_ptr(new FetchElement()); element->_interpreter = interpreter; return element; } FetchElement::~FetchElement() { URLFetcher::breakURL(_targetUrl); } void FetchElement::downloadCompleted(const URL& url) { Event event; event.name = _callback; std::string content = url.getInContent(); std::map headerFields = url.getInHeaderFields(); if (false) { } else if (iequals(_type, "text")) { event.data.atom = content; event.data.type = Data::VERBATIM; } else if (iequals(_type, "url")) { } else if (iequals(_type, "json")) { event.data = Data::fromJSON(content); } else if (iequals(_type, "xml")) { event = Event::fromXML(content); } _interpreter->receive(event); } void FetchElement::downloadFailed(const URL& url, int errorCode) { Event event; event.name = _callback + ".failed"; _interpreter->receive(event); } void FetchElement::enterElement(const Arabica::DOM::Element& node) { if (!HAS_ATTR(node, "target") && !HAS_ATTR(node, "targetexpr")) { LOG(ERROR) << "Fetch element requires target or targetexpr"; return; } if (HAS_ATTR(node, "targetexpr") && !_interpreter->getDataModel()) { LOG(ERROR) << "Fetch element with targetexpr requires datamodel"; return; } _target = (HAS_ATTR(node, "target") ? ATTR(node, "target") : _interpreter->getDataModel().evalAsString(ATTR(node, "targetexpr"))); if (!HAS_ATTR(node, "callback") && !HAS_ATTR(node, "callbackexpr")) { LOG(ERROR) << "Fetch element requires callback or callbackexpr"; return; } if (HAS_ATTR(node, "callbackexpr") && !_interpreter->getDataModel()) { LOG(ERROR) << "Fetch element with callbackexpr requires datamodel"; return; } _callback = (HAS_ATTR(node, "callback") ? ATTR(node, "callback") : _interpreter->getDataModel().evalAsString(ATTR(node, "callbackexpr"))); _type = (HAS_ATTR(node, "type") ? ATTR(node, "type") : "text"); if (!iequals(_type, "text") && !iequals(_type, "url") && !iequals(_type, "json") && !iequals(_type, "xml")) { LOG(ERROR) << "Fetch element type attribute not one of text, url, json, xml."; return; } _targetUrl = URL(_target); if (!_targetUrl.isAbsolute()) { if (!_targetUrl.toAbsolute(_interpreter->getBaseURI())) { LOG(ERROR) << "Cannot transform " << _target << " into absolute URL"; return; } } _targetUrl.addMonitor(this); URLFetcher::fetchURL(_targetUrl); } void FetchElement::exitElement(const Arabica::DOM::Element& node) { } }