Subversion Repositories HomeAutomation

Rev

Rev 1644 | Rev 1656 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 1644 Rev 1647
Line 76... Line 76...
76
{
76
{
77
    this->script_path_ = script_path;
77
    this->script_path_ = script_path;
78
    this->io_service_.post(boost::bind(&Manager::StartHandler, this));
78
    this->io_service_.post(boost::bind(&Manager::StartHandler, this));
79
}
79
}
80
 
80
 
81
void Manager::SendResponse(std::string plugin_name, unsigned int request_id, std::string response)
81
void Manager::CallOutput(std::string output)
82
{
82
{
83
    for (unsigned int n = 0; n < this->plugins_.size(); n++)
83
    if (this->current_plugin_name_ != "")
84
    {
84
    {
85
        if (this->plugins_[n]->GetName() == plugin_name)
85
        for (unsigned int n = 0; n < this->plugins_.size(); n++)
86
        {
86
        {
-
 
87
            if (this->plugins_[n]->GetName() == this->current_plugin_name_)
-
 
88
            {
87
            this->plugins_[n]->ExecutionResult(response, request_id);
89
                this->plugins_[n]->CallOutput(this->current_request_id_, output);
88
            return;
90
                return;
-
 
91
            }
89
        }
92
        }
90
    }
93
    }
-
 
94
    else
-
 
95
    {
-
 
96
        LOG.Info(output);
-
 
97
    }
-
 
98
}
-
 
99
 
-
 
100
Value Manager::Export_Log(const v8::Arguments& args)
-
 
101
{
-
 
102
    v8::Context::Scope context_scope(Manager::Instance()->GetContext());
-
 
103
   
-
 
104
    //LOG.Debug(std::string(__FUNCTION__) + " called!");
-
 
105
   
-
 
106
    if (args.Length() < 1)
-
 
107
    {
-
 
108
        Manager::instance_->LOG.Error(std::string(__FUNCTION__) + ": To few arguments to log.");
-
 
109
        return v8::Undefined();
-
 
110
    }
-
 
111
   
-
 
112
    v8::String::AsciiValue str(args[0]);
-
 
113
       
-
 
114
    Manager::instance_->CallOutput(*str);
-
 
115
   
-
 
116
    return v8::Undefined();
91
}
117
}
92
 
118
 
93
void Manager::Call(std::string plugin_name, unsigned int request_id, std::string name, ArgumentListPointer arguments)
119
void Manager::Call(std::string plugin_name, unsigned int request_id, std::string name, ArgumentListPointer arguments)
94
{
120
{
95
    this->io_service_.post(boost::bind(&Manager::CallHandler, this, plugin_name, request_id, name, arguments));
121
    this->io_service_.post(boost::bind(&Manager::CallHandler, this, plugin_name, request_id, name, arguments));
96
}
122
}
97
 
123
 
98
void Manager::Execute(std::string plugin_name, unsigned int request_id, std::string code)
124
void Manager::Execute(std::string plugin_name, unsigned int request_id, std::string code)
99
{
125
{
100
    this->io_service_.post(boost::bind(&Manager::ExecuteHandler, this, plugin_name, request_id, code));
126
    this->io_service_.post(boost::bind(&Manager::ExecuteHandler, this, plugin_name, request_id, code));
101
}
127
}
102
 
128
 
103
void Manager::CallHandler(std::string plugin_name, unsigned int request_id, std::string name, ArgumentListPointer arguments)
129
bool Manager::CallHandler(std::string plugin_name, unsigned int request_id, std::string name, ArgumentListPointer arguments)
104
{
130
{
105
    v8::Context::Scope context_scope(this->context_);
131
    v8::Context::Scope context_scope(this->context_);
106
    v8::TryCatch try_catch;
132
    v8::TryCatch try_catch;
-
 
133
   
-
 
134
    this->current_plugin_name_ = plugin_name;
-
 
135
    this->current_request_id_ = request_id;
107
   
136
   
108
    if (this->functions_.find(name) == this->functions_.end())
137
    if (this->functions_.find(name) == this->functions_.end())
109
    {
138
    {
110
        this->SendResponse(plugin_name, request_id, "No such function found, " + name);
139
        this->CallOutput("No such function found, " + name);
-
 
140
       
-
 
141
        this->current_plugin_name_ = "";
-
 
142
        this->current_request_id_ = 0;
111
        return;
143
        return false;
112
    }
144
    }
113
 
145
 
114
    //LOG.Debug("Call: " + name);
146
    //LOG.Debug("Call: " + name);
115
 
147
 
116
    Value result = this->functions_[name]->Call(this->context_->Global(), arguments->size(), arguments->data());
148
    Value result = this->functions_[name]->Call(this->context_->Global(), arguments->size(), arguments->data());
117
   
149
   
118
    if (result.IsEmpty())
150
    if (result.IsEmpty())
119
    {
151
    {
120
        this->SendResponse(plugin_name, request_id, this->FormatException(try_catch));
152
        this->CallOutput(this->FormatException(try_catch));
-
 
153
       
-
 
154
        this->current_plugin_name_ = "";
-
 
155
        this->current_request_id_ = 0;
121
        return;
156
        return false;
122
    }
157
    }
123
   
158
   
124
    v8::String::AsciiValue response(result->ToString());
159
    //v8::String::AsciiValue response(result->ToString());
-
 
160
    //this->CallOutput(plugin_name, request_id, std::string(*response));
125
   
161
   
126
    this->SendResponse(plugin_name, request_id, std::string(*response));
162
    this->current_plugin_name_ = "";
-
 
163
    this->current_request_id_ = 0;
-
 
164
    return true;
127
}
165
}
128
 
166
 
129
void Manager::StartHandler()
167
void Manager::StartHandler()
130
{
168
{
131
    v8::Handle<v8::ObjectTemplate> raw_template = v8::ObjectTemplate::New();
169
    v8::Handle<v8::ObjectTemplate> raw_template = v8::ObjectTemplate::New();
-
 
170
   
-
 
171
    raw_template->Set(v8::String::New("Log"), v8::FunctionTemplate::New(Manager::Export_Log));
132
   
172
   
133
    for (unsigned int c = 0; c < this->plugins_.size(); c++)
173
    for (unsigned int c = 0; c < this->plugins_.size(); c++)
134
    {
174
    {
135
        ExportFunctionList export_functions = this->plugins_[c]->GetExportFunctions();
175
        ExportFunctionList export_functions = this->plugins_[c]->GetExportFunctions();
136
       
176
       
137
        for (ExportFunctionList::iterator it = export_functions.begin(); it != export_functions.end(); it++)
177
        for (ExportFunctionList::iterator it = export_functions.begin(); it != export_functions.end(); it++)
138
        {
178
        {
139
            raw_template->Set(v8::String::New(it->first.data()), v8::FunctionTemplate::New(it->second));
179
            raw_template->Set(v8::String::New(it->first.data()), v8::FunctionTemplate::New(it->second));
140
        }
180
        }
141
    }
181
    }
142
   
182
   
143
    this->context_ = v8::Context::New(NULL, raw_template);
183
    this->context_ = v8::Context::New(NULL, raw_template);
144
   
184
   
145
    v8::Context::Scope context_scope(this->context_);
185
    v8::Context::Scope context_scope(this->context_);
146
   
186
   
147
    for (unsigned int c = 0; c < this->plugins_.size(); c++)
187
    for (unsigned int c = 0; c < this->plugins_.size(); c++)
148
    {
188
    {
149
        this->LoadScript("plugin/" + this->plugins_[c]->GetName() + ".js");
189
        this->LoadScript("plugin/" + this->plugins_[c]->GetName() + ".js");
150
    }
190
    }
151
   
191
   
152
    this->object_template_ = v8::Persistent<v8::ObjectTemplate>::New(raw_template);
192
    this->object_template_ = v8::Persistent<v8::ObjectTemplate>::New(raw_template);
153
   
193
   
154
    for (unsigned int c = 0; c < this->plugins_.size(); c++)
194
    for (unsigned int c = 0; c < this->plugins_.size(); c++)
155
    {
195
    {
156
        this->plugins_[c]->InitializeDone();
196
        this->plugins_[c]->InitializeDone();
Line 158... Line 198...
158
   
198
   
159
    LOG.Info("VM initialized.");
199
    LOG.Info("VM initialized.");
160
}
200
}
161
 
201
 
162
bool Manager::ImportFunction(std::string functionname)
202
bool Manager::ImportFunction(std::string functionname)
163
{
203
{
164
    v8::Context::Scope context_scope(this->context_);
204
    v8::Context::Scope context_scope(this->context_);
165
   
205
   
166
    v8::TryCatch try_catch;
206
    v8::TryCatch try_catch;
167
   
207
   
168
    v8::Handle<v8::String> process_name = v8::String::New(functionname.data());
208
    v8::Handle<v8::String> process_name = v8::String::New(functionname.data());
169
    v8::Handle<v8::Value> process_val = this->context_->Global()->Get(process_name);
209
    v8::Handle<v8::Value> process_val = this->context_->Global()->Get(process_name);
170
   
210
   
171
    if (!process_val->IsFunction())
211
    if (!process_val->IsFunction())
172
    {
212
    {
173
        LOG.Error(functionname + " was not found to be a function!");
213
        LOG.Error(functionname + " was not found to be a function!");
174
        return false;
214
        return false;
175
    }
215
    }
176
   
216
   
177
    v8::Handle<v8::Function> process_fun = v8::Handle<v8::Function>::Cast(process_val);
217
    v8::Handle<v8::Function> process_fun = v8::Handle<v8::Function>::Cast(process_val);
178
   
218
   
179
    this->functions_[functionname] = v8::Persistent<v8::Function>::New(process_fun);
219
    this->functions_[functionname] = v8::Persistent<v8::Function>::New(process_fun);
180
   
220
   
181
    return true;
221
    return true;
182
}
222
}
183
 
223
 
184
bool Manager::LoadScript(std::string scriptname)
224
bool Manager::LoadScript(std::string scriptname)
185
{
225
{
186
    for (unsigned int n = 0; n < this->loaded_scripts_.size(); n++)
226
    for (unsigned int n = 0; n < this->loaded_scripts_.size(); n++)
187
    {
227
    {
188
        if (this->loaded_scripts_[n] == scriptname)
228
        if (this->loaded_scripts_[n] == scriptname)
189
        {
229
        {
190
            LOG.Info(scriptname + " is already loaded.");
230
            LOG.Info(scriptname + " is already loaded.");
191
            return true;
231
            return true;
192
        }
232
        }
Line 218... Line 258...
218
    }
258
    }
219
   
259
   
220
    code += "\n";
260
    code += "\n";
221
   
261
   
222
    file.close();
262
    file.close();
223
   
263
   
224
    v8::Context::Scope context_scope(this->context_);
264
    v8::Context::Scope context_scope(this->context_);
225
   
265
   
226
    v8::TryCatch try_catch;
266
    v8::TryCatch try_catch;
227
   
267
   
228
    v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New(code.data(), code.length()),
268
    v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New(code.data(), code.length()),
229
                                                        v8::String::New(scriptname.data(), scriptname.length()));
269
                                                        v8::String::New(scriptname.data(), scriptname.length()));
230
   
270
   
231
    if (script.IsEmpty())
271
    if (script.IsEmpty())
232
    {
272
    {
233
        LOG.Error(this->FormatException(try_catch));
273
        LOG.Error(this->FormatException(try_catch));
234
        return false;
274
        return false;
235
    }
275
    }
236
    else
276
    else
237
    {
277
    {
Line 258... Line 298...
258
   
298
   
259
    v8::TryCatch try_catch;
299
    v8::TryCatch try_catch;
260
   
300
   
261
    v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New(code.data(), code.length()),
301
    v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New(code.data(), code.length()),
262
                                                        v8::String::New(scriptname.data(), scriptname.length()));
302
                                                        v8::String::New(scriptname.data(), scriptname.length()));
-
 
303
   
-
 
304
    this->current_plugin_name_ = plugin_name;
-
 
305
    this->current_request_id_ = request_id;
263
   
306
   
264
    if (script.IsEmpty())
307
    if (script.IsEmpty())
265
    {
308
    {
266
        this->SendResponse(plugin_name, request_id, this->FormatException(try_catch));
309
        this->CallOutput(this->FormatException(try_catch));
267
    }
310
    }
268
    else
311
    else
269
    {
312
    {
270
        Value result = script->Run();
313
        Value result = script->Run();
271
       
314
       
272
        if (result.IsEmpty())
315
        if (result.IsEmpty())
273
        {
316
        {
274
            this->SendResponse(plugin_name, request_id, this->FormatException(try_catch));
317
            this->CallOutput(this->FormatException(try_catch));
275
        }
318
        }
276
        else
319
        else
277
        {
320
        {
278
            v8::String::AsciiValue response(result->ToString());
321
            //v8::String::AsciiValue response(result->ToString());
279
           
-
 
280
            this->SendResponse(plugin_name, request_id, std::string(*response));
322
            //this->CallOutput(std::string(*response));
281
        }
323
        }
282
    }
324
    }
-
 
325
   
-
 
326
    this->current_plugin_name_ = "";
-
 
327
    this->current_request_id_ = 0;
283
}
328
}
284
 
329
 
285
std::string Manager::FormatException(v8::TryCatch& try_catch)
330
std::string Manager::FormatException(v8::TryCatch& try_catch)
286
{
331
{
287
    v8::Context::Scope context_scope(this->context_);
332
    v8::Context::Scope context_scope(this->context_);