1
// =======================================================================
3
// Filename: scriptelement.cpp
8
// Created: 20.04.2010 00:56:49
12
// Author: Dominik 'domachine' Burgdörfer (-), dominik.burgdoerfer@googlemail.com
15
// =======================================================================
18
#include "../elementstack.hpp"
19
#include "../exceptions/processingerror.hpp"
20
#include "../types/string.hpp"
21
#include "../process/process.hpp"
23
#include <boost/foreach.hpp>
24
#define foreach BOOST_FOREACH
27
using namespace boost;
31
shared_ptr<ElementStack::VariableMap>
32
buildCompleteVariableMap(Element& object)
35
list<ElementStack*> path;
37
ElementStack* current = &object.parent();
40
path.push_front(current);
42
if(current->hasParent())
43
current = ¤t->parent();
48
shared_ptr<ElementStack::VariableMap> cMapPtr(
49
new ElementStack::VariableMap());
51
ElementStack::VariableMap::iterator staticVarMapIter;
52
for(staticVarMapIter =
53
ElementStack::STATIC_VARIABLE_MAP.begin();
55
ElementStack::STATIC_VARIABLE_MAP.end();
58
(*cMapPtr)[staticVarMapIter->first] =
59
staticVarMapIter->second;
62
foreach(ElementStack* es, path) {
63
ElementStack::VariableMap& m =
64
es->dynamicVariableMap();
66
ElementStack::VariableMap::iterator iter;
68
for(iter = m.begin(); iter != m.end(); ++iter)
70
(*cMapPtr)[iter->first] = iter->second;
77
Script::Script(ElementStack& parent)
85
Script::Script(ElementStack& parent,
87
: Text(parent), Resolvable(this),
97
string Script::specification() const
102
void Script::setSpecification(const string& spec)
107
void Script::print(ostream& stream) {
108
if(RULES[specification()].empty()) {
109
throw exceptions::ProcessingError(
110
"no rule defined for: " +
112
parent().sourcePath(),
116
shared_ptr<ElementStack::VariableMap> cMap =
117
buildCompleteVariableMap(*this);
118
ElementStack::VariableMap::iterator pageIter;
120
for(pageIter = cMap->begin();
121
pageIter != cMap->end();
124
string envVar("WP_");
125
envVar.append(pageIter->first);
127
setenv(envVar.c_str(),
128
pageIter->second->toString().c_str(), 1);
131
string scriptSpec = RULES[
134
process::Process process(scriptSpec);
135
pid_t ret = process.launch();
145
process.closeWriteChannel();
147
while(process >> ch) {
151
process.closeReadChannel();
154
for(pageIter = cMap->begin();
155
pageIter != cMap->end();
158
string envVar("WP_");
159
envVar.append(pageIter->first);
161
unsetenv(envVar.c_str());
166
types::ObjectPtr Script::resolve() {
171
types::StringPtr stringPtr(
172
new types::String(os.str()));
177
void Script::call() {
178
if(RULES[specification()].empty()) {
179
throw exceptions::ProcessingError(
180
"no rule defined for: " +
182
parent().sourcePath(),
186
shared_ptr<ElementStack::VariableMap> cMap =
187
buildCompleteVariableMap(*this);
188
ElementStack::VariableMap::iterator pageIter;
190
for(pageIter = cMap->begin();
191
pageIter != cMap->end();
194
string envVar("WP_");
195
envVar.append(pageIter->first);
197
setenv(envVar.c_str(),
198
pageIter->second->toString().c_str(), 1);
201
string scriptSpec = RULES[
204
process::Process process(scriptSpec);
205
pid_t ret = process.launch();
215
process.closeWriteChannel();
217
while(process >> ch) {
221
process.closeReadChannel();
224
for(pageIter = cMap->begin();
225
pageIter != cMap->end();
228
string envVar("WP_");
229
envVar.append(pageIter->first);
231
unsetenv(envVar.c_str());
236
map<string,string> Script::RULES =
237
map<string,string>();