source: Plugins/luaScripting/ScriptConnector.cpp @ 19

Revision 19, 4.6 KB checked in by art, 13 years ago (diff)
Line 
1/***************************************************************************
2 *                                                                         *
3 *   (c) Art Tevs, MPI Informatik Saarbruecken                             *
4 *       mailto: <tevs@mpi-sb.mpg.de>                                      *
5 *                                                                         *
6 *   This program is free software; you can redistribute it and/or modify  *
7 *   it under the terms of the GNU General Public License as published by  *
8 *   the Free Software Foundation; either version 2 of the License, or     *
9 *   (at your option) any later version.                                   *
10 *                                                                         *
11 ***************************************************************************/
12
13
14//----------------------------------------------------------------------------------
15// Includes
16//----------------------------------------------------------------------------------
17#include "ScriptConnector.h"
18#include "Script.h"
19
20//----------------------------------------------------------------------------------
21LuaScriptConnector::LuaScriptConnector() : ScriptConnector("LuaScriptConnector")
22{
23        initialize();
24        initializeLuaEnvironment();
25}
26
27//----------------------------------------------------------------------------------
28void LuaScriptConnector::initializeLuaEnvironment()
29{
30        // add include function
31        lua_pushcfunction(LuaScript::State, includeFile);
32        lua_setglobal(LuaScript::State, "include");
33}
34
35       
36//----------------------------------------------------------------------------------
37void LuaScriptConnector::OnRegisterFunction(const std::string& name, const ScriptFunctor& func)
38{
39        // check if a function already registered
40        if (std::find(mRegistered.begin(), mRegistered.end(), name) != mRegistered.end()) return;
41       
42        // register the function by lua
43        lua_pushstring(LuaScript::State, name.c_str());
44        lua_pushcclosure(LuaScript::State, callFunc, 1);
45        lua_setglobal(LuaScript::State, name.c_str());
46
47        // take this function into the list
48        mRegistered.push_back(name);
49}
50
51//----------------------------------------------------------------------------------
52void LuaScriptConnector::OnRemoveFunction(const std::string& name)
53{
54        // check if a function already registered
55        if (std::find(mRegistered.begin(), mRegistered.end(), name) == mRegistered.end()) return;
56
57        // remove the function from the list
58        mRegistered.erase(std::find(mRegistered.begin(), mRegistered.end(), name));
59}
60
61
62//----------------------------------------------------------------------------------
63int LuaScriptConnector::includeFile(lua_State *L)
64{ 
65        int n=lua_gettop(L);
66        while (n)
67        {
68                // check if do not have  anil value
69                if (!lua_isnil(L, -n))
70                {
71                        // do we got a string
72                        if (lua_isstring(L, -n))
73                        {
74                                // read string parameter
75                                std::string filename = lua_tostring(L, -n);
76                               
77                                // open filestream and load it
78                                FileStream* fStream = new FileStream();
79                                Result ret = fStream->open(filename);
80                                if (ret == OK)
81                                {
82                                        // get the whole file content
83                                        std::string str = fStream->getAsString();
84                       
85                                        // now let lua do the string
86                                        luaL_dostring(L, str.c_str());
87                                }else{
88                                        printf("ScriptConnector: Cannot load luafile %s, no file found\n", filename.c_str());
89                                }
90                                delete fStream;
91                        }else{
92                                printf("ScriptConnector: Cannot include luafile. Filename(string) must be given. You gave me %s:%p\n",luaL_typename(L,-n),lua_topointer(L,-n));
93                                return 0;
94                        }
95                }
96                --n;
97        }
98       
99        // clear the stack
100        lua_pop(L, lua_gettop(L));
101       
102        return 0;
103}
104
105
106//----------------------------------------------------------------------------------
107int LuaScriptConnector::callFunc(lua_State* L)
108{
109
110        // THIS IS A HACK! I DO NOT KNOW HOW TO DO IT BETTER!
111        lua_getupvalue(L, -(lua_gettop(L) + 1), 1);
112       
113        // prepare the vector with argument for the registered function
114        std::vector<std::string> values;
115        std::vector<std::string> args;
116
117        // read out the whole stack
118        while (lua_gettop(L) > 0){
119                const char* str = lua_popstring(L);
120                values.push_back(std::string(str));
121        }
122
123        // check that the size is valid
124        if (values.size() == 0) return 0;
125
126        // get the function name and copy the arguments
127        std::string funcName = values[0];
128        args.push_back(funcName);       
129        for (int32 i = (int32)values.size() - 1; i > 0; i--){
130                args.push_back(values[i]);
131        }
132       
133        // call the function from the script engine
134        ScriptResult res = Engine::sScriptEngine()->call(funcName, args);
135
136        // push the result on the stack
137        if (res.size()){
138                lua_pushstring(L, (res.get<std::string>(0)).c_str());
139                lua_error(L);
140                return 1;
141        }
142
143        // clear the stack
144        lua_pop(L, lua_gettop(L));
145       
146        // return the number of results
147        return 0;       
148}
149
Note: See TracBrowser for help on using the repository browser.