#include "sequence.h" #include extern "C" { #include #include #include } /** * Lua ½ºÅ©¸³Æ®ÀÇ Æ¯Á¤ º¯¼ö °ªÀ» QList Çü½ÄÀÇ °´Ã¼·Î º¯È¯ ÇÑ´Ù. * @param state ¸®½ºÆ® °´Ã¼·Î º¯È¯ ÇÒ LuaÀÇ State. * @param name ¸®½ºÆ® °´Ã¼·Î º¯È¯ µÉ Àü¿ª º¯¼ö À̸§. * @param codec Lua ½ºÅ©¸³Æ®ÀÇ ¹®ÀÚ ÀÎÄÚµùÀ» QString·Î º¯È¯ ÇÒ ¶§ ¾²ÀÏ °´Ã¼. * @param strings Lua ½ºÅ©¸³Æ®¿¡¼­ »ÌÀº ¹è¿­ º¯¼ö°¡ ÀúÀå µÉ °´Ã¼. */ static void luaStringTableToList(lua_State *state, char *name, QTextCodec *codec, QStringList *strings) { // http://blog.naver.com/fantajeon/80005019590 lua_pushstring(state, name); lua_rawget(state, LUA_GLOBALSINDEX); lua_pushnil(state); while(lua_next(state, -2) != 0) { //lua_tointeger(state, -2); // index //lua_tostring(state, -1)); // value strings->push_back(codec->toUnicode(lua_tostring(state, -1))); lua_pop(state, 1); } lua_pop(state, 1); } /** * Lua ½ºÅ©¸³Æ®ÀÇ Æ¯Á¤ º­¼öÀÇ °ªÀ» QList Çü½ÄÀÇ °´Ã¼·Î º¯È¯ ÇÑ´Ù. * @param state ¸®½ºÆ® °´Ã¼·Î º¯È¯ ÇÒ LuaÀÇ Status. * @param name ¸®½ºÆ® °´Ã¼·Î º¯È¯ µÉ Àü¿ª º¯¼ö À̸§. * @param codec Lua ½ºÅ©¸³Æ®ÀÇ ¹®ÀÚ ÀÎÄÚµùÀ» QString·Î º¯È° ÇÒ ¶§ ¾²ÀÏ °´Ã¼. * @param arbeits Lua ½ºÅ©¸³Æ®¿¡¼­ »ÌÀº ¹è¿­ º¯¼ö°¡ ÀúÀß µÉ °´Ã¼. */ static void luaArbeitTableToList(lua_State *state, char *name, QTextCodec *codec, QList *arbeits) { Arbeit arbeit; lua_pushstring(state, name); lua_rawget(state, LUA_GLOBALSINDEX); lua_pushnil(state); while(lua_next(state, -2) != 0) { lua_pushstring(state, "n"); // after value is -2 lua_gettable(state, -2); arbeit.name = codec->toUnicode(lua_tostring(state, -1)); lua_pop(state, 1); lua_pushstring(state, "s"); lua_gettable(state, -2); arbeit.begin = (int)lua_tointeger(state, -1); lua_pop(state, 1); lua_pushstring(state, "e"); lua_gettable(state, -2); arbeit.end = (int)lua_tointeger(state, -1); lua_pop(state, 1); arbeits->push_back(arbeit); lua_pop(state, 1); } lua_pop(state, 1); } Sequence::Sequence(QObject *parent) : QObject(parent) { _ruaSequence = new QStringList; _moongateSequence = new QStringList; _arbeitSequence = new QList; _weekdayEffectsName = new QStringList; _weekdayEffectsContent = new QStringList; _weekdayEffectsAdvance = new QStringList; _priceSequence = new QStringList; } Sequence::~Sequence() { delete _ruaSequence; delete _moongateSequence; delete _arbeitSequence; delete _weekdayEffectsName; delete _weekdayEffectsContent; delete _weekdayEffectsAdvance; delete _priceSequence; } bool Sequence::initialize() { lua_State *state = luaL_newstate(); try { if(luaL_loadfile(state, "Sequence.lua") || lua_pcall(state, 0, 0, 0)) { throw L"¼³Á¤ÆÄÀÏ[Sequence.lua]ÀÌ À߸ø µÇ¾ú½À´Ï´Ù.\nÇÁ·Î±×·¥À» ½ÇÇà ÇÒ ¼ö ¾ø½À´Ï´Ù."; } else { QTextCodec *codec; lua_getglobal(state, "encoding"); codec = QTextCodec::codecForName(lua_tostring(state, -1)); lua_pop(state, 1); if(codec == NULL) { throw L"¼³Á¤ÆÄÀÏ[Sequence.lua]¿¡¼­ encoding¸¦ ãÀ» ¼ö ¾ø°Å³ª ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù."; } luaStringTableToList(state, "ruaSequence", codec, _ruaSequence); luaStringTableToList(state, "moongateSequence", codec, _moongateSequence); luaArbeitTableToList(state, "arbeitSequence", codec, _arbeitSequence); luaStringTableToList(state, "weekdayEffectsName", codec, _weekdayEffectsName); luaStringTableToList(state, "weekdayEffectsContent", codec, _weekdayEffectsContent); luaStringTableToList(state, "weekdayEffectsAdvance", codec, _weekdayEffectsAdvance); luaStringTableToList(state, "priceSequence", codec, _priceSequence); if( _ruaSequence->size() < 1 || _moongateSequence->size() < 1 || _arbeitSequence->size() < 1 || _weekdayEffectsName->size() < 1 || _weekdayEffectsContent->size() < 1 || _weekdayEffectsAdvance->size() < 1 || _priceSequence->size() < 1) { throw L"¼³Á¤ÆÄÀÏ[Sequence.lua]ÀÇ ³»¿ëÀÌ ´©¶ô µÇ¾ú½À´Ï´Ù.\nÇÁ·Î±×·¥À» ½ÇÇà ÇÒ ¼ö ¾ø½À´Ï´Ù."; } } lua_close(state); return true; } catch(wchar_t *message) { /* QMessageBox::critical( this, QString::fromWCharArray(L"¿À·ù"), QString::fromWCharArray(message), QMessageBox::Ok, QMessageBox::Ok); } */ _errorMessage = QString::fromWCharArray(message); lua_close(state); return false; } } QString Sequence::errorMessage() const { return _errorMessage; } QStringList *Sequence::ruaSequence() const { return _ruaSequence; } QStringList *Sequence::moongateSequence() const { return _moongateSequence; } QList *Sequence::arbeitSequence() const { return _arbeitSequence; } QStringList *Sequence::weekdayEffectsName() const { return _weekdayEffectsName; } QStringList *Sequence::weekdayEffectsContent() const { return _weekdayEffectsContent; } QStringList *Sequence::weekdayEffectsAdvance() const { return _weekdayEffectsAdvance; } QStringList *Sequence::priceSequence() const { return _priceSequence; }