Explorar o código

Add Lua File class. Make Lua file as resource.

Aster Jian %!s(int64=12) %!d(string=hai) anos
pai
achega
367a930a93

+ 121 - 0
Source/Extras/LuaScript/LuaFile.cpp

@@ -0,0 +1,121 @@
+//
+// Copyright (c) 2008-2013 the Urho3D project.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#include "Precompiled.h"
+#include "Context.h"
+#include "Deserializer.h"
+#include "LuaFile.h"
+#include "ProcessUtils.h"
+#include "Serializer.h"
+
+extern "C"
+{
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+}
+
+namespace Urho3D
+{
+
+LuaFile::LuaFile(Context* context) : 
+    Resource(context),
+    size_(0),
+    hasExecuted_(false)
+{
+
+}
+
+LuaFile::~LuaFile()
+{
+
+}
+
+void LuaFile::RegisterObject(Context* context)
+{
+    context->RegisterFactory<LuaFile>();
+}
+
+bool LuaFile::Load(Deserializer& source)
+{
+    size_ = source.GetSize();
+
+    if (size_ == 0)
+        return false;
+
+    // Read all data.
+    data_ = new char[size_];
+    if (source.Read(data_, size_) != size_)
+        return false;
+
+    SetMemoryUse(size_);
+
+    return true;
+}
+
+bool LuaFile::Save(Serializer& dest) const
+{
+    if (size_ == 0)
+        return false;
+
+    dest.Write(data_, size_);
+
+    return true;
+}
+
+bool LuaFile::Execute(lua_State* luaState)
+{
+    if (hasExecuted_)
+        return true;
+
+    if (size_ == 0)
+        return false;
+
+    if (!luaState)
+        return false;
+
+    int top = lua_gettop(luaState);
+
+    const char* name = GetName().CString();
+    int error = luaL_loadbuffer(luaState, data_, size_, name);
+    if (error)
+    {
+        const char* message = lua_tostring(luaState, -1);
+        ErrorDialog("Load Buffer Failed", message);
+        lua_settop(luaState, top);
+        return false;
+    }
+
+    if (lua_pcall(luaState, 0, 0, 0))
+    {
+        const char* message = lua_tostring(luaState, -1);
+        ErrorDialog("Lua Execute Failed", message);
+        lua_settop(luaState, top);
+        return false;
+    }
+
+    hasExecuted_ = true;
+
+    return true;
+}
+
+}

+ 65 - 0
Source/Extras/LuaScript/LuaFile.h

@@ -0,0 +1,65 @@
+//
+// Copyright (c) 2008-2013 the Urho3D project.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#pragma once
+
+#include "ArrayPtr.h"
+#include "Resource.h"
+
+struct lua_State;
+
+namespace Urho3D
+{
+
+/// Lua file.
+class URHO3D_API LuaFile : public Resource
+{
+    OBJECT(LuaFile);
+
+public:
+    /// Construct.
+    LuaFile(Context* context);
+    /// Destruct.
+    virtual ~LuaFile();
+    /// Register object factory.
+    static void RegisterObject(Context* context);
+
+    /// Load resource. Return true if successful.
+    virtual bool Load(Deserializer& source);
+    /// Save resource. Return true if successful.
+    virtual bool Save(Serializer& dest) const;
+
+    /// Execute.
+    bool Execute(lua_State* luaState);
+
+private:
+    /// File size.
+    unsigned size_;
+
+    /// File data.
+    SharedArrayPtr<char> data_;
+
+    /// Has executed.
+    bool hasExecuted_;
+};
+
+}

+ 11 - 27
Source/Extras/LuaScript/LuaScript.cpp

@@ -24,6 +24,7 @@
 #include "EngineEvents.h"
 #include "EngineEvents.h"
 #include "File.h"
 #include "File.h"
 #include "Log.h"
 #include "Log.h"
+#include "LuaFile.h"
 #include "LuaScript.h"
 #include "LuaScript.h"
 #include "ProcessUtils.h"
 #include "ProcessUtils.h"
 #include "Profiler.h"
 #include "Profiler.h"
@@ -67,6 +68,8 @@ LuaScript::LuaScript(Context* context) :
 {
 {
     currentContext_ = context_;
     currentContext_ = context_;
 
 
+    RegisterLuaScriptLibrary(context_);
+
     luaState_ = luaL_newstate();
     luaState_ = luaL_newstate();
     if (!luaState_)
     if (!luaState_)
     {
     {
@@ -112,35 +115,11 @@ bool LuaScript::ExecuteFile(const String& fileName)
     if (!cache)
     if (!cache)
         return false;
         return false;
 
 
-    SharedPtr<File> file = cache->GetFile(fileName);
-    if (!file)
+    LuaFile* luaFile = cache->GetResource<LuaFile>(fileName);
+    if (!luaFile)
         return false;
         return false;
 
 
-    unsigned size = file->GetSize();
-    char* buffer = new char[size];
-    file->Read(buffer, size);
-
-    int top = lua_gettop(luaState_);
-    int error = luaL_loadbuffer(luaState_, buffer, size, fileName.CString());
-    delete [] buffer;
-
-    if (error)
-    {
-        const char* message = lua_tostring(luaState_, -1);
-        ErrorDialog("Execute Lua File Failed", message);
-        lua_settop(luaState_, top);
-        return false;
-    }
-
-    if (lua_pcall(luaState_, 0, 0, 0))
-    {
-        const char* message = lua_tostring(luaState_, -1);
-        ErrorDialog("Execute Lua File Failed", message);
-        lua_settop(luaState_, top);
-        return false;
-    }
-
-    return true;
+    return luaFile->Execute(luaState_);
 }
 }
 
 
 bool LuaScript::ExecuteString(const String& string)
 bool LuaScript::ExecuteString(const String& string)
@@ -373,6 +352,11 @@ void LuaScript::CallEventHandler(const String& functionName, StringHash eventTyp
     }
     }
 }
 }
 
 
+void RegisterLuaScriptLibrary(Context* context)
+{
+    LuaFile::RegisterObject(context);
+}
+
 Context* GetContext()
 Context* GetContext()
 {
 {
     return currentContext_;
     return currentContext_;

+ 3 - 0
Source/Extras/LuaScript/LuaScript.h

@@ -99,6 +99,9 @@ private:
 
 
 };
 };
 
 
+/// Register Lua script library objects.
+void RegisterLuaScriptLibrary(Context* context);
+
 /// Return context.
 /// Return context.
 Context* GetContext();
 Context* GetContext();