source: nrEngine/src/IScript.cpp @ 1

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