summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins/element/file/FileElement.cpp
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-01-21 14:33:32 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-01-21 14:33:32 (GMT)
commit948fbc12c1b4e48a24b18a84878bd560cbaf91a7 (patch)
tree23976fb5eedfedaeadd8fed8da60aa1159f3d286 /src/uscxml/plugins/element/file/FileElement.cpp
parent08eff21dfbdbf7d20e1b96ff2f00882ec0a87b08 (diff)
downloaduscxml-948fbc12c1b4e48a24b18a84878bd560cbaf91a7.zip
uscxml-948fbc12c1b4e48a24b18a84878bd560cbaf91a7.tar.gz
uscxml-948fbc12c1b4e48a24b18a84878bd560cbaf91a7.tar.bz2
SMTP Invoker and "invoke.success.<INV_ID>" events when an invoker was started
Diffstat (limited to 'src/uscxml/plugins/element/file/FileElement.cpp')
-rw-r--r--src/uscxml/plugins/element/file/FileElement.cpp45
1 files changed, 29 insertions, 16 deletions
diff --git a/src/uscxml/plugins/element/file/FileElement.cpp b/src/uscxml/plugins/element/file/FileElement.cpp
index 3a8574d..d88a598 100644
--- a/src/uscxml/plugins/element/file/FileElement.cpp
+++ b/src/uscxml/plugins/element/file/FileElement.cpp
@@ -134,8 +134,9 @@ void FileElement::enterElement(const Arabica::DOM::Node<std::string>& node) {
if (_sandBoxed)
_actualUrl.toAbsolute(URL::getResourceDir());
- _filename = _actualUrl.path();
-
+ _filepath = _actualUrl.path();
+
+
std::string writeMode;
switch (_operation) {
case APPEND:
@@ -145,39 +146,43 @@ void FileElement::enterElement(const Arabica::DOM::Node<std::string>& node) {
writeMode = "w+";
FILE *fp;
- fp = fopen(_filename.c_str(), writeMode.c_str());
+ fp = fopen(_filepath.c_str(), writeMode.c_str());
if (fp == NULL) {
- LOG(ERROR) << "Error opening '" << _filename << "' for writing: " << strerror(errno);
+ LOG(ERROR) << "Error opening '" << _filepath << "' for writing: " << strerror(errno);
}
if (content && contentSize > 0) {
size_t written = fwrite(content, 1, contentSize, fp);
if (written != contentSize) {
- LOG(ERROR) << "Error writing to '" << _filename << "': " << strerror(errno);
+ LOG(ERROR) << "Error writing to '" << _filepath << "': " << strerror(errno);
return;
}
} else if (contentStr.length() > 0) {
size_t written = fwrite(contentStr.c_str(), contentStr.length(), 1, fp);
if (written < 1) {
- LOG(ERROR) << "Error writing to '" << _filename << "': " << strerror(errno);
+ LOG(ERROR) << "Error writing to '" << _filepath << "': " << strerror(errno);
}
} else {
- LOG(WARNING) << "Nothing to write to '" << _filename;
+ LOG(WARNING) << "Nothing to write to '" << _filepath;
}
fclose(fp);
break;
}
case READ: {
struct stat fileStat;
- int err = stat(_filename.c_str(), &fileStat);
+ int err = stat(_filepath.c_str(), &fileStat);
if (err < 0) {
- LOG(ERROR) << "Cannot stat file '" << _filename << "': " << strerror(errno);
+ LOG(ERROR) << "Cannot stat file '" << _filepath << "': " << strerror(errno);
return;
}
Event event;
event.name = callback;
- event.data.compound["file"].compound["name"] = Data(_filename, Data::VERBATIM);
+
+ std::string filename = _actualUrl.pathComponents()[_actualUrl.pathComponents().size() - 1];
+
+ event.data.compound["file"].compound["name"] = Data(filename, Data::VERBATIM);
+ event.data.compound["file"].compound["path"] = Data(_filepath, Data::VERBATIM);
event.data.compound["file"].compound["mtime"] = toStr(fileStat.st_mtime);
event.data.compound["file"].compound["ctime"] = toStr(fileStat.st_ctime);
event.data.compound["file"].compound["atime"] = toStr(fileStat.st_atime);
@@ -185,7 +190,7 @@ void FileElement::enterElement(const Arabica::DOM::Node<std::string>& node) {
FILE *fp;
- fp = fopen(_filename.c_str(), "r");
+ fp = fopen(_filepath.c_str(), "r");
fseek (fp, 0, SEEK_END);
size_t filesize = ftell(fp);
@@ -195,14 +200,22 @@ void FileElement::enterElement(const Arabica::DOM::Node<std::string>& node) {
size_t read = fread(fileContents, 1, filesize, fp);
fclose(fp);
if (read != filesize) {
- LOG(ERROR) << "Error reading from '" << _filename << "': " << strerror(errno);
+ LOG(ERROR) << "Error reading from '" << _filepath << "': " << strerror(errno);
return;
}
switch (_type) {
- case BINARY:
- event.data.compound["content"] = Data(fileContents, fileStat.st_size, "application/octet-stream", true);
+ case BINARY: {
+ std::string mimetype = "application/octet-stream";
+ if (HAS_ATTR(node, "mimetype")) {
+ mimetype = ATTR(node, "mimetype");
+ } else if(HAS_ATTR(node, "mimetypeexpr")) {
+ mimetype = _interpreter->getDataModel().evalAsString(ATTR(node, "mimetypeexpr"));
+ }
+
+ event.data.compound["content"] = Data(fileContents, fileStat.st_size, mimetype, true);
break;
+ }
case TEXT:
event.data.compound["content"] = Data(fileContents, Data::VERBATIM);
free(fileContents);
@@ -211,7 +224,7 @@ void FileElement::enterElement(const Arabica::DOM::Node<std::string>& node) {
Data json = Data::fromJSON(fileContents);
free(fileContents);
if (!json) {
- LOG(ERROR) << "Cannot parse contents of " << _filename << " as JSON";
+ LOG(ERROR) << "Cannot parse contents of " << _filepath << " as JSON";
return;
}
event.data.compound["content"] = json;
@@ -220,7 +233,7 @@ void FileElement::enterElement(const Arabica::DOM::Node<std::string>& node) {
case XML: {
NameSpacingParser parser = NameSpacingParser::fromXML(fileContents);
if (parser.errorsReported()) {
- LOG(ERROR) << "Cannot parse contents of " << _filename << " as XML";
+ LOG(ERROR) << "Cannot parse contents of " << _filepath << " as XML";
return;
}
event.dom = parser.getDocument().getDocumentElement();