source: nrEngine/src/IScript.cpp @ 23

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