Subversion Repositories HomeAutomation

Rev

Rev 1647 | Rev 1656 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
1601 runge 1
/*
2
 *
3
 *  Copyright (C) 2010  Mattias Runge
4
 *
5
 *  This program is free software; you can redistribute it and/or modify
6
 *  it under the terms of the GNU General Public License as published by
7
 *  the Free Software Foundation; either version 2 of the License, or
8
 *  (at your option) any later version.
9
 *
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU General Public License along
16
 *  with this program; if not, write to the Free Software Foundation, Inc.,
17
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
 *
19
 */
20
 
21
#include "System.h"
22
 
1604 runge 23
#include <v8-debug.h>
1601 runge 24
#include <stdio.h>
25
 
26
#include "vm/Manager.h"
27
 
28
namespace atom {
29
namespace vm {
30
namespace plugin {
31
 
32
logging::Logger System::LOG("vm::plugin::System");
33
 
1644 runge 34
System::System(boost::asio::io_service& io_service) : Plugin(io_service)
1601 runge 35
{
36
    this->name_ = "system";
1609 runge 37
 
1644 runge 38
    this->ExportFunction("Require",    System::Export_Require);
1601 runge 39
    this->ExportFunction("Execute",    System::Export_Execute);
40
}
41
 
42
System::~System()
43
{
44
 
45
}
46
 
47
void System::InitializeDone()
48
{
1625 runge 49
    v8::Context::Scope context_scope(vm::Manager::Instance()->GetContext());
50
 
1601 runge 51
    Plugin::InitializeDone();
52
 
1644 runge 53
    v8::Boolean::New(Manager::Instance()->LoadScript("user/autostart.js"));
1601 runge 54
}
55
 
1647 runge 56
void System::CallOutput(unsigned int request_id, std::string output)
1601 runge 57
{
1647 runge 58
    LOG.Info(output);
1601 runge 59
}
60
 
1644 runge 61
Value System::Export_Require(const v8::Arguments& args)
1601 runge 62
{
1625 runge 63
    v8::Context::Scope context_scope(vm::Manager::Instance()->GetContext());
1604 runge 64
 
1648 runge 65
    //LOG.Debug(std::string(__FUNCTION__) + " called!");
1625 runge 66
 
1604 runge 67
    if (args.Length() < 1)
68
    {
1644 runge 69
        LOG.Error(std::string(__FUNCTION__) + ": To few arguments.");
1647 runge 70
        return v8::Boolean::New(false);
1604 runge 71
    }
72
 
1601 runge 73
    v8::String::AsciiValue str(args[0]);
74
 
1608 runge 75
    return v8::Boolean::New(Manager::Instance()->LoadScript(*str));
1601 runge 76
}
77
 
78
Value System::Export_Execute(const v8::Arguments& args)
79
{
1625 runge 80
    v8::Context::Scope context_scope(vm::Manager::Instance()->GetContext());
1604 runge 81
 
1648 runge 82
    //LOG.Debug(std::string(__FUNCTION__) + " called!");
1625 runge 83
 
1604 runge 84
    if (args.Length() < 1)
85
    {
1644 runge 86
        LOG.Error(std::string(__FUNCTION__) + ": To few arguments.");
1647 runge 87
        return v8::Boolean::New(false);
1604 runge 88
    }
89
 
1601 runge 90
    v8::String::AsciiValue command(args[0]);
91
 
92
    std::string output_buffer;
93
    char output[128];
94
 
95
    FILE* pipe = popen(*command, "r" );
96
 
97
    if (pipe == NULL)
98
    {
99
        LOG.Info("Failed to execute \"" + std::string(*command) + "\".");
100
        return v8::Boolean::New(false);
101
    }
102
 
103
    while (!feof(pipe))
104
    {
105
        if (fgets(output, 128, pipe) != NULL)
106
        {
107
            output_buffer += output;
108
        }
109
    }
110
 
111
    pclose(pipe);
112
 
113
    return v8::String::New(output_buffer.data());
114
}
115
 
116
}; // namespace plugin
117
}; // namespace vm
118
}; // namespace atom