123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- #include "stdafx.h"
- #include "luaReg.h"
- /************************************************************************/
- /* 函数:[1/15/2018 Jeff];
- /* 描述:;
- /* 参数:;
- /* [IN] :;
- /* [OUT] :;
- /* [IN/OUT] :;
- /* 返回:void;
- /* 注意:;
- /* 示例:;
- /*
- /* 修改:;
- /* 日期:;
- /* 内容:;
- /************************************************************************/
- int StackDump(lua_State* luaVM)
- {
- // 得到栈的元素个数,栈顶的位置;
- int nTop = lua_gettop(luaVM);
- // 输出栈顶位置;
- printf("当前栈的元素个数: %d\n", nTop);
- for (int i = 1; i <= nTop; ++i)
- {
- int t = lua_type(luaVM, i);
- // 这里的typename是把类型的枚举变成字符串,是类型名,不是栈中的位置;
- printf("%s:", lua_typename(luaVM, t));
- switch (t)
- {
- case LUA_TNUMBER:
- printf("%f\n", lua_tonumber(luaVM, i));
- break;
- case LUA_TSTRING:
- printf("%s\n", lua_tostring(luaVM, i));
- break;
- case LUA_TTABLE:
- printf("%s\n", lua_tostring(luaVM, i));
- break;
- case LUA_TFUNCTION:
- printf("%s\n", lua_tostring(luaVM, i));
- break;
- case LUA_TNIL:
- printf("Is NULL\n");
- break;
- case LUA_TBOOLEAN:
- printf("%s\n", lua_toboolean(luaVM, i) ? "true" : "false");
- break;
- case LUA_TUSERDATA:
- printf("用户数据\n");
- break;
- default:
- printf("什么都不是???\n");
- break;
- }
- }
- printf("\n");
- return 0;
- }
- int lua_create_aos(lua_State *luaVM)
- {
- if (luaVM == NULL)
- return 0;
- // 创建一个对象指针到栈里,返回给lua使用, userdata的位置为-1;
- CAosClient **aos = (CAosClient**)lua_newuserdata(luaVM, sizeof(CAosClient*));
- *aos = new CAosClient();
- // 得到全局元表位置-1, userdata位置-2;
- luaL_getmetatable(luaVM, "AosClient");
- // 将元表赋值给位置-2的userdata,并弹出-1的元表;
- lua_setmetatable(luaVM, -2);
- // 成功必须返回1,否则出错;
- return 1;
- }
- // 自动内存回收;
- int lua_auto_gc(lua_State *luaVM)
- {
- if (luaVM == NULL)
- return 0;
- CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
- luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
- if (aos)
- delete *aos;
- printf("gc执行成功\n");
- return 1;
- }
- //////////////////////////////////////////////////////////////////////////
- // 成员函数全局化,给lua脚本调用;
- int lua_InitClient(lua_State *luaVM)
- {
- if (luaVM == NULL)
- return 0;
- // 获取第一个传入的对象参数(在栈底);
- CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1/*第n个*/, "AosClient");
- luaL_argcheck(luaVM, aos != NULL, 1/*个数*/, "invalid user data");
- // 从lua中获取参数值;
- luaL_checktype(luaVM, -1, LUA_TSTRING);
- std::string key_secret = lua_tostring(luaVM, -1);
- luaL_checktype(luaVM, -2, LUA_TSTRING);
- std::string access_key = lua_tostring(luaVM, -2);
- luaL_checktype(luaVM, -3, LUA_TSTRING);
- std::string endpoint = lua_tostring(luaVM, -3);
- // 清空栈;
- lua_settop(luaVM, 0);
- // 执行函数并将函数结果放入栈中, 供lua调用 ;
- lua_pushboolean(luaVM, (*aos)->InitClient(endpoint, access_key, key_secret));
- printf("Aos初始化成功\n");
- return 1;
- }
- int lua_IsObjectUploaded(lua_State *luaVM)
- {
- if (luaVM == NULL)
- return 0;
- // 获取第一个传入的对象参数(在栈底);
- CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
- luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
- // 从lua中获取参数值;
- luaL_checktype(luaVM, -1, LUA_TSTRING);
- std::string key = lua_tostring(luaVM, -1);
- luaL_checktype(luaVM, -2, LUA_TSTRING);
- std::string bucket = lua_tostring(luaVM, -2);
- // 清空栈;
- lua_settop(luaVM, 2);
- // 执行函数并将函数结果放入栈中, 供lua调用 ;
- lua_pushboolean(luaVM, (*aos)->IsObjectUploaded(bucket, key));
- return 1;
- }
- int lua_PutObjectFromFile(lua_State *luaVM)
- {
- if (luaVM == NULL)
- return 0;
- // 获取第一个传入的对象参数(在栈底);
- CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
- luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
- // 从lua中获取参数值;
- luaL_checktype(luaVM, -1, LUA_TSTRING);
- std::string key = lua_tostring(luaVM, -1);
- luaL_checktype(luaVM, -2, LUA_TSTRING);
- std::string file = lua_tostring(luaVM, -2);
- luaL_checktype(luaVM, -3, LUA_TSTRING);
- std::string bucket = lua_tostring(luaVM, -3);
- // 清空栈;
- lua_settop(luaVM, 0);
- // 执行函数并将函数结果放入栈中, 供lua调用 ;
- lua_pushboolean(luaVM, (*aos)->PutObjectFromFile(bucket, file, key));
- return 1;
- }
- int lua_GetObject(lua_State *luaVM)
- {
- if (luaVM == NULL)
- return 0;
- // 获取第一个传入的对象参数(在栈底);
- CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
- luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
- // 从lua中获取参数值;
- luaL_checktype(luaVM, -1, LUA_TSTRING);
- std::string savepath = lua_tostring(luaVM, -1);
- luaL_checktype(luaVM, -2, LUA_TSTRING);
- std::string key = lua_tostring(luaVM, -2);
- luaL_checktype(luaVM, -3, LUA_TSTRING);
- std::string bucket = lua_tostring(luaVM, -3);
- // 清空栈;
- lua_settop(luaVM, 0);
- // 执行函数并将函数结果放入栈中, 供lua调用 ;
- lua_pushboolean(luaVM, (*aos)->GetObject(bucket, key, savepath));
- return 1;
- }
- int lua_DeleteObject(lua_State *luaVM)
- {
- if (luaVM == NULL)
- return 0;
- // 获取第一个传入的对象参数(在栈底);
- CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
- luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
- // 从lua中获取参数值;
- luaL_checktype(luaVM, -1, LUA_TSTRING);
- std::string key = lua_tostring(luaVM, -1);
- luaL_checktype(luaVM, -2, LUA_TSTRING);
- std::string bucket = lua_tostring(luaVM, -2);
- // 清空栈;
- lua_settop(luaVM, 0);
- // 执行函数并将函数结果放入栈中, 供lua调用 ;
- lua_pushboolean(luaVM, (*aos)->DeleteObject(bucket, key));
- return 1;
- }
- int lua_newArray()
- {
- return 1;
- }
- int lua_GetListAllObjects(lua_State *luaVM)
- {
- printf("lua_GetListAllObjects\n");
- if (luaVM == NULL)
- return 0;
- // 获取第一个传入的对象参数(在栈底);
- CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
- luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
- // 从lua中获取参数值;
- luaL_checktype(luaVM, -1, LUA_TSTRING);
- std::string end_date = lua_tostring(luaVM, -1);
- luaL_checktype(luaVM, -2, LUA_TSTRING);
- std::string start_date = lua_tostring(luaVM, -2);
- luaL_checktype(luaVM, -3, LUA_TSTRING);
- std::string prefix = lua_tostring(luaVM, -3);
- luaL_checktype(luaVM, -4, LUA_TSTRING);
- std::string bucket = lua_tostring(luaVM, -4);
- luaL_checktype(luaVM, -5, LUA_TNUMBER);
- INT64 nStopSize = lua_tointeger(luaVM, -5);
- vector<KeyContent> vtKeyContent;
- bool bRet = (*aos)->GetListAllObjects(nStopSize, bucket, prefix, vtKeyContent, start_date, end_date);
- size_t size = vtKeyContent.size() * sizeof(KeyContent);
- //KeyContent *a = (KeyContent*)lua_newuserdata(luaVM, size);
- // 清空栈;
- lua_settop(luaVM, 0);
- int nIndex = 0;
- // 向栈顶压入一个table;
- lua_newtable(luaVM);
- // 设置table下标(lua是从-1开始的);
- for (vector<KeyContent>::iterator it = vtKeyContent.begin(); it != vtKeyContent.end(); it++)
- {
- lua_pushstring(luaVM, it->strKey.c_str());// 当做key,压入key;
- lua_pushstring(luaVM, it->strDate.c_str());// 当做value,压入value;
- //lua_rawset(luaVM, -3);// 弹出key,value,并设置到table中;
- lua_settable(luaVM, -3); // 弹出key,value,并设置到table中;
- }
- StackDump(luaVM);
- Sleep(5000);
- return 1;
- }
- // 将函数注册到lua环境中;
- int lua_regFuns(lua_State *luaVM)
- {
- if (luaVM == NULL)
- return 0;
- // 创建全局元表,元表位置为-1(栈顶);
- luaL_newmetatable(luaVM, "AosClient");
- // 将元素作为一个副本压栈到位置-1(栈顶), 原元表位置-2;
- lua_pushvalue(luaVM, -1);
- // 设置-2位置元表的__index索引值为位置-1的元表, 并弹出位置-1的元素, 原元表的位置变成-1;
- lua_setfield(luaVM, -2, "__index");
- // 将类成员函数注册到元表中(此时,全局元表设置完成);
- luaL_setfuncs(luaVM, g_member_funs, 0);
- // 再注册构造函数到新表中,返回给lua;
- luaL_newlib(luaVM, g_constructor_funs);
- return 1;
- }
- // 将模块注册到lua环境中;
- void lua_regLibs(lua_State *luaVM)
- {
- const luaL_Reg *lib = g_libs;
- for (; lib->func != NULL; lib++)
- {
- //注意这里如果使用的不是requiref,则需要手动在Lua里面调用require "模块名"
- luaL_requiref(luaVM, lib->name, lib->func, 1);
- lua_settop(luaVM, 0);
- }
- }
- int lua_new()
- {
- if (Global::g_IsLuaRunning)
- {
- printf("脚本已在运行中\n");
- return 0;
- }
- else
- {
- printf("开始执行脚本\n");
- Sleep(5000);
- }
- Global::WriteTextLog(_T("执行脚本\r"));
- // 创建环境;
- lua_State *luaVM = luaL_newstate();
- if (luaVM == NULL)
- return 0;
- // 注册模块;
- lua_regLibs(luaVM);
- // 加载lua脚本文件;
- if (0 != luaL_dofile(luaVM, "config.lua"))
- {
- // 如果执行出错,栈顶(-1)则是错误字符串;
- std::string err = lua_tostring(luaVM, -1);
- printf("执行脚本出错:%s\n", err.c_str());
- // 将错误消息占用内存从栈中弹出;
- lua_pop(luaVM, 1);
- return -1;
- }
- // 获取lua脚本全局变量;
- lua_getglobal(luaVM, "Sleep");
- if (lua_isnumber(luaVM, -1))
- {
- Global::g_nSleep = lua_tonumber(luaVM, -1);
- if ( Global::g_nSleep < 1000 )
- Global::g_nSleep = 1000;
- }
- // 恢复lua的栈;
- lua_pop(luaVM, 1);
- // 关闭lua虚拟环境;
- lua_close(luaVM);
- Global::g_IsLuaRunning = false;
- return 1;
- }
|