source: nrEngine/src/IScript.cpp @ 24

Revision 24, 6.1 KB checked in by art, 12 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 "IScript.h"
18#include "Log.h"
19#include "Kernel.h"
20
21namespace nrEngine{
22
23
24        //--------------------------------------------------------------------
25        void IScript::notifyResReloaded()
26        {
27                // if we reload a resource, so we set the task name to the resource name
28                setTaskName(std::string("Script_") + getResName());
29        }
30
31        //--------------------------------------------------------------------
32        Result IScript::onStartTask()
33        {
34                // notice derived classes about starting
35                onStartScript();
36               
37                return OK;
38        }
39
40        //--------------------------------------------------------------------
41        Result IScript::execute(bool runOnce)
42        {
43                // set running counter parameter
44                mbRunOnce = runOnce;
45               
46                // add the task to the kernel
47                // also kernel is not allowed to remove this object, because
48                // we created it from this, so no reference counting is used
49                SharedPtr<ITask> task (this, null_deleter());
50                Engine::sKernel()->AddTask(task, ORDER_NORMAL);
51
52                return OK;
53        }
54
55        //--------------------------------------------------------------------
56        Result IScript::forceExecute(bool runOnce)
57        {
58                mbRunOnce = runOnce;
59               
60                // we only run the script nothing more
61                if (runOnce) return run();
62
63                // we add it to the kernel and run it first
64                return execute(runOnce);
65        }
66       
67        //--------------------------------------------------------------------
68        Result IScript::updateTask()
69        {
70                // run the script
71                Result ret = run();
72
73                // if script should run once, so check if it has still commands
74                if (shouldRunOnce())
75                {
76                        // check if script still have some commands
77                        if (!hasCommands())
78                        {
79                                Engine::sKernel()->RemoveTask(this->getTaskID());
80                        }
81                }
82
83                // return result
84                return ret;
85        }
86
87        //--------------------------------------------------------------------
88        IScript::~IScript()
89        {
90       
91        }
92
93        //--------------------------------------------------------------------
94        IScript::IScript(const std::string& name) : IResource(name)
95        {
96                mbRunOnce = true;
97        }
98
99        //--------------------------------------------------------------------
100        uint32 IScript::pushArgument(const std::string& funcName, const std::string& type, const std::string& value)
101        {
102                // store the new argument in the database
103                mArguments[funcName].push_back(std::pair<std::string,std::string>(type, value));
104
105                // get the number of arguments for the function
106                return mArguments[funcName].size();
107        }
108
109        //--------------------------------------------------------------------
110        uint32 IScript::setArguments(const std::string& funcName, const ArgumentList& args)
111        {
112                mArguments[funcName] = args;
113                return mArguments[funcName].size();
114        }
115
116        //--------------------------------------------------------------------
117        int32 IScript::popArgument(const std::string& funcName, std::string& type, std::string& value)
118        {
119                // first check if such a function does exists
120                ArgumentDatabase::iterator it = mArguments.find(funcName);
121                if (it == mArguments.end()) return -1;
122
123                // check the number of elements
124                if (it->second.size() == 0) return -1;
125
126                // pop the element and return the number of remaining elements
127                const std::pair<std::string, std::string>& first = it->second.front();
128                type = first.first;
129                value = first.second;
130
131                it->second.pop_front();
132
133                return it->second.size();
134        }
135
136        //----------------------------------------------------------------------------------
137        ScriptResult IScript::call(const std::string& funcName)
138        {
139                // call a certain function
140                ScriptResult res;
141                Result ret = callfunc(funcName, res);
142                if (ret == OK) return res;
143
144                // we got an error, so throw an error
145                NR_EXCEPT(ret, mErrorMsg.front(), "IScript::call()");
146        }
147
148        //----------------------------------------------------------------------------------
149        Result IScript::callfunc(const std::string& funcName, ScriptResult& result)
150        {
151                // remove all parameters from the stack
152                std::string type, value;
153                while (popArgument(funcName, type, value) > 0){}
154               
155                // return ok
156                return OK;
157        }
158
159        //----------------------------------------------------------------------------------
160        std::string IScript::popLastError()
161        {
162                if (mErrorMsg.size() == 0) return std::string();
163                std::string msg = mErrorMsg.front();
164                mErrorMsg.pop_front();
165                return msg;             
166        }
167       
168        //----------------------------------------------------------------------------------
169        void IScript::pushErrorMessage(const std::string& sh)
170        {
171                mErrorMsg.push_front(sh);
172                NR_Log(Log::LOG_CONSOLE, Log::LL_ERROR, "%s", sh.c_str());
173        }
174
175        //----------------------------------------------------------------------------------
176        // ----------------- Implementation of the empty script object ---------------------
177        //----------------------------------------------------------------------------------
178        //----------------------------------------------------------------------------------
179        EmptyScript::EmptyScript() : IScript("EmptyScript")
180        {
181
182        }
183
184        //----------------------------------------------------------------------------------
185        EmptyScript::~EmptyScript()
186        {
187
188        }
189
190        //----------------------------------------------------------------------------------
191        Result EmptyScript::loadFromString(const std::string& str)
192        {
193                return OK;
194        }
195
196        //----------------------------------------------------------------------------------
197        Result EmptyScript::run()
198        {
199                return OK;
200        }
201
202}; // end namespace
203
Note: See TracBrowser for help on using the repository browser.